diff --git a/pyrogram/client/methods/messages/__init__.py b/pyrogram/client/methods/messages/__init__.py index e2c2462e..94279ffd 100644 --- a/pyrogram/client/methods/messages/__init__.py +++ b/pyrogram/client/methods/messages/__init__.py @@ -21,6 +21,7 @@ from .edit_message_caption import EditMessageCaption from .edit_message_reply_markup import EditMessageReplyMarkup from .edit_message_text import EditMessageText from .forward_messages import ForwardMessages +from .get_dialogs import GetDialogs from .get_history import GetHistory from .get_messages import GetMessages from .send_audio import SendAudio @@ -47,6 +48,7 @@ class Messages( ForwardMessages, GetHistory, GetMessages, + GetDialogs, SendAudio, SendChatAction, SendContact, diff --git a/pyrogram/client/methods/messages/get_dialogs.py b/pyrogram/client/methods/messages/get_dialogs.py new file mode 100644 index 00000000..d0ef032b --- /dev/null +++ b/pyrogram/client/methods/messages/get_dialogs.py @@ -0,0 +1,100 @@ +# Pyrogram - Telegram MTProto API Client Library for Python +# Copyright (C) 2017-2018 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 . + +import pyrogram +from pyrogram.api import functions, types +from ...ext import BaseClient, utils + + +class GetDialogs(BaseClient): + # TODO docstrings + + def get_dialogs(self, + last_chunk=None, + limit: int = 100): + offset_date = 0 + offset_id = 0 + offset_peer = types.InputPeerEmpty() + + if last_chunk: + for dialog in reversed(last_chunk.dialogs): + top_message = dialog.top_message + + if top_message: + message_date = top_message.date + + if message_date: + offset_id = top_message.message_id + offset_date = message_date + offset_peer = self.resolve_peer(dialog.id) + break + + r = self.send( + functions.messages.GetDialogs( + offset_date=offset_date, + offset_id=offset_id, + offset_peer=offset_peer, + limit=limit, + hash=0, + exclude_pinned=True + ) + ) + + users = {i.id: i for i in r.users} + chats = {i.id: i for i in r.chats} + messages = {} + + for message in r.messages: + if isinstance(message, (types.Message, types.MessageService)): + chat_id = message.to_id + + if isinstance(chat_id, types.PeerUser): + chat_id = chat_id.user_id + elif isinstance(chat_id, types.PeerChat): + chat_id = -chat_id.chat_id + else: + chat_id = int("-100" + str(chat_id.channel_id)) + + messages[chat_id] = utils.parse_messages( + self, message, + users, chats + ) + + dialogs = [] + + for dialog in r.dialogs: + chat_id = dialog.peer + + if isinstance(chat_id, types.PeerUser): + chat_id = chat_id.user_id + elif isinstance(chat_id, types.PeerChat): + chat_id = -chat_id.chat_id + else: + chat_id = int("-100" + str(chat_id.channel_id)) + + dialogs.append( + pyrogram.Dialog( + id=chat_id, + top_message=messages.get(chat_id) + ) + ) + + return pyrogram.Dialogs( + total_count=getattr(r, "count", len(r.dialogs)), + dialogs=dialogs + )