diff --git a/docs/source/api/types.rst b/docs/source/api/types.rst index 0aab7b5e..957cfa52 100644 --- a/docs/source/api/types.rst +++ b/docs/source/api/types.rst @@ -32,7 +32,6 @@ Users & Chats - :class:`ChatMember` - :class:`ChatPermissions` - :class:`Dialog` - - :class:`Dialogs` Messages & Media ^^^^^^^^^^^^^^^^ @@ -124,7 +123,6 @@ Details .. autoclass:: ChatMember() .. autoclass:: ChatPermissions() .. autoclass:: Dialog() -.. autoclass:: Dialogs() .. Messages & Media .. autoclass:: Message() diff --git a/pyrogram/client/methods/chats/get_dialogs.py b/pyrogram/client/methods/chats/get_dialogs.py index 8d5baa15..8c374a44 100644 --- a/pyrogram/client/methods/chats/get_dialogs.py +++ b/pyrogram/client/methods/chats/get_dialogs.py @@ -18,6 +18,7 @@ import logging import time +from typing import List import pyrogram from pyrogram.api import functions, types @@ -33,7 +34,7 @@ class GetDialogs(BaseClient): offset_date: int = 0, limit: int = 100, pinned_only: bool = False - ) -> "pyrogram.Dialogs": + ) -> List["pyrogram.Dialog"]: """Get a chunk of the user's dialogs. You can get up to 100 dialogs at once. @@ -53,7 +54,7 @@ class GetDialogs(BaseClient): Defaults to False. Returns: - :obj:`Dialogs`: On success, an object containing a list of dialogs is returned. + List of :obj:`Dialog`: On success, a list of dialogs is returned. Raises: RPCError: In case of a Telegram RPC error. @@ -80,4 +81,32 @@ class GetDialogs(BaseClient): else: break - return pyrogram.Dialogs._parse(self, r) + users = {i.id: i for i in r.users} + chats = {i.id: i for i in r.chats} + + messages = {} + + for message in r.messages: + to_id = message.to_id + + if isinstance(to_id, types.PeerUser): + if message.out: + chat_id = to_id.user_id + else: + chat_id = message.from_id + elif isinstance(to_id, types.PeerChat): + chat_id = -to_id.chat_id + else: + chat_id = int("-100" + str(to_id.channel_id)) + + messages[chat_id] = pyrogram.Message._parse(self, message, users, chats) + + parsed_dialogs = [] + + for dialog in r.dialogs: + if not isinstance(dialog, types.Dialog): + continue + + parsed_dialogs.append(pyrogram.Dialog._parse(self, dialog, messages, users, chats)) + + return pyrogram.List(parsed_dialogs) diff --git a/pyrogram/client/methods/chats/iter_dialogs.py b/pyrogram/client/methods/chats/iter_dialogs.py index e7fb7330..fce9fb99 100644 --- a/pyrogram/client/methods/chats/iter_dialogs.py +++ b/pyrogram/client/methods/chats/iter_dialogs.py @@ -55,7 +55,7 @@ class IterDialogs(BaseClient): pinned_dialogs = self.get_dialogs( pinned_only=True - ).dialogs + ) for dialog in pinned_dialogs: yield dialog @@ -69,7 +69,7 @@ class IterDialogs(BaseClient): dialogs = self.get_dialogs( offset_date=offset_date, limit=limit - ).dialogs + ) if not dialogs: return diff --git a/pyrogram/client/types/user_and_chats/__init__.py b/pyrogram/client/types/user_and_chats/__init__.py index cf032850..922ac86a 100644 --- a/pyrogram/client/types/user_and_chats/__init__.py +++ b/pyrogram/client/types/user_and_chats/__init__.py @@ -22,10 +22,9 @@ from .chat_permissions import ChatPermissions from .chat_photo import ChatPhoto from .chat_preview import ChatPreview from .dialog import Dialog -from .dialogs import Dialogs from .user import User from .user_status import UserStatus __all__ = [ - "Chat", "ChatMember", "ChatPermissions", "ChatPhoto", "ChatPreview", "Dialog", "Dialogs", "User", "UserStatus" + "Chat", "ChatMember", "ChatPermissions", "ChatPhoto", "ChatPreview", "Dialog", "User", "UserStatus" ] diff --git a/pyrogram/client/types/user_and_chats/dialogs.py b/pyrogram/client/types/user_and_chats/dialogs.py deleted file mode 100644 index 56cdfc72..00000000 --- a/pyrogram/client/types/user_and_chats/dialogs.py +++ /dev/null @@ -1,87 +0,0 @@ -# Pyrogram - Telegram MTProto API Client Library for Python -# Copyright (C) 2017-2019 Dan Tès -# -# This file is part of Pyrogram. -# -# Pyrogram is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License as published -# by the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Pyrogram is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with Pyrogram. If not, see . - -from typing import List - -import pyrogram -from pyrogram.api import types -from .dialog import Dialog -from ..messages_and_media import Message -from ..object import Object - - -class Dialogs(Object): - """Contains a user's dialogs chunk. - - Parameters: - total_count (``int``): - Total number of dialogs the user has. - - dialogs (List of :obj:`Dialog`): - Requested dialogs. - """ - - __slots__ = ["total_count", "dialogs"] - - def __init__( - self, - *, - client: "pyrogram.BaseClient" = None, - total_count: int, - dialogs: List[Dialog] - ): - super().__init__(client) - - self.total_count = total_count - self.dialogs = dialogs - - @staticmethod - def _parse(client, dialogs: types.messages.Dialogs) -> "Dialogs": - users = {i.id: i for i in dialogs.users} - chats = {i.id: i for i in dialogs.chats} - - messages = {} - - for message in dialogs.messages: - to_id = message.to_id - - if isinstance(to_id, types.PeerUser): - if message.out: - chat_id = to_id.user_id - else: - chat_id = message.from_id - elif isinstance(to_id, types.PeerChat): - chat_id = -to_id.chat_id - else: - chat_id = int("-100" + str(to_id.channel_id)) - - messages[chat_id] = Message._parse(client, message, users, chats) - - parsed_dialogs = [] - - for dialog in dialogs.dialogs: - if not isinstance(dialog, types.Dialog): - continue - - parsed_dialogs.append(Dialog._parse(client, dialog, messages, users, chats)) - - return Dialogs( - total_count=getattr(dialogs, "count", len(dialogs.dialogs)), - dialogs=parsed_dialogs, - client=client - )