From a1c3e408002f8f2ba2ce68ee7de8d3df733b23f4 Mon Sep 17 00:00:00 2001 From: Dan <14043624+delivrance@users.noreply.github.com> Date: Wed, 9 May 2018 19:29:23 +0200 Subject: [PATCH] Make parse_messages accept a list of messages --- pyrogram/client/dispatcher/dispatcher.py | 9 +- pyrogram/client/ext/utils.py | 768 +++++++++--------- .../methods/messages/forward_messages.py | 7 +- .../client/methods/messages/get_history.py | 74 +- .../client/methods/messages/get_messages.py | 31 +- .../methods/messages/media/send_audio.py | 9 +- .../methods/messages/media/send_contact.py | 9 +- .../methods/messages/media/send_document.py | 9 +- .../methods/messages/media/send_location.py | 9 +- .../methods/messages/media/send_photo.py | 9 +- .../methods/messages/media/send_sticker.py | 9 +- .../methods/messages/media/send_venue.py | 9 +- .../methods/messages/media/send_video.py | 9 +- .../methods/messages/media/send_video_note.py | 9 +- .../methods/messages/media/send_voice.py | 9 +- .../client/methods/messages/send_message.py | 11 +- .../messages/update/edit_message_caption.py | 9 +- .../update/edit_message_reply_markup.py | 9 +- .../messages/update/edit_message_text.py | 9 +- 19 files changed, 510 insertions(+), 507 deletions(-) diff --git a/pyrogram/client/dispatcher/dispatcher.py b/pyrogram/client/dispatcher/dispatcher.py index ce8a23c1..892a387d 100644 --- a/pyrogram/client/dispatcher/dispatcher.py +++ b/pyrogram/client/dispatcher/dispatcher.py @@ -138,14 +138,7 @@ class Dispatcher: self.dispatch(update, users=users, chats=chats, is_raw=True) if isinstance(update, Dispatcher.MESSAGE_UPDATES): - if isinstance(update.message, types.Message): - parser = utils.parse_message - elif isinstance(update.message, types.MessageService): - parser = utils.parse_message_service - else: - continue - - message = parser( + message = utils.parse_messages( self.client, update.message, users, diff --git a/pyrogram/client/ext/utils.py b/pyrogram/client/ext/utils.py index 09513fcb..90071afc 100644 --- a/pyrogram/client/ext/utils.py +++ b/pyrogram/client/ext/utils.py @@ -218,437 +218,431 @@ def encode(s: bytes) -> str: # TODO: Reorganize code, maybe split parts as well -def parse_message( +def parse_messages( client, - message: types.Message, + messages: list or types.Message or types.MessageService or types.MessageEmpty, users: dict, chats: dict, replies: int = 1 ) -> pyrogram_types.Message: - entities = parse_entities(message.entities, users) + is_list = isinstance(messages, list) + messages = messages if is_list else [messages] + parsed_messages = [] - forward_from = None - forward_from_chat = None - forward_from_message_id = None - forward_signature = None - forward_date = None + for message in messages: + if isinstance(message, types.Message): + entities = parse_entities(message.entities, users) - forward_header = message.fwd_from # type: types.MessageFwdHeader + forward_from = None + forward_from_chat = None + forward_from_message_id = None + forward_signature = None + forward_date = None - if forward_header: - forward_date = forward_header.date + forward_header = message.fwd_from # type: types.MessageFwdHeader - if forward_header.from_id: - forward_from = parse_user(users[forward_header.from_id]) - else: - forward_from_chat = parse_channel_chat(chats[forward_header.channel_id]) - forward_from_message_id = forward_header.channel_post - forward_signature = forward_header.post_author + if forward_header: + forward_date = forward_header.date - photo = None - location = None - contact = None - venue = None - audio = None - voice = None - video = None - video_note = None - sticker = None - document = None + if forward_header.from_id: + forward_from = parse_user(users[forward_header.from_id]) + else: + forward_from_chat = parse_channel_chat(chats[forward_header.channel_id]) + forward_from_message_id = forward_header.channel_post + forward_signature = forward_header.post_author - media = message.media + photo = None + location = None + contact = None + venue = None + audio = None + voice = None + video = None + video_note = None + sticker = None + document = None - if media: - if isinstance(media, types.MessageMediaPhoto): - photo = media.photo + media = message.media - if isinstance(photo, types.Photo): - sizes = photo.sizes - photo_sizes = [] + if media: + if isinstance(media, types.MessageMediaPhoto): + photo = media.photo - for size in sizes: - if isinstance(size, (types.PhotoSize, types.PhotoCachedSize)): - loc = size.location + if isinstance(photo, types.Photo): + sizes = photo.sizes + photo_sizes = [] - if isinstance(size, types.PhotoSize): - file_size = size.size - else: - file_size = len(size.bytes) + for size in sizes: + if isinstance(size, (types.PhotoSize, types.PhotoCachedSize)): + loc = size.location - if isinstance(loc, types.FileLocation): - photo_size = pyrogram_types.PhotoSize( + if isinstance(size, types.PhotoSize): + file_size = size.size + else: + file_size = len(size.bytes) + + if isinstance(loc, types.FileLocation): + photo_size = pyrogram_types.PhotoSize( + file_id=encode( + pack( + " pyrogram_types.Message: - action = message.action + if isinstance(photo, types.Photo): + sizes = photo.sizes + photo_sizes = [] - new_chat_members = None - left_chat_member = None - new_chat_title = None - delete_chat_photo = None - migrate_to_chat_id = None - migrate_from_chat_id = None - group_chat_created = None - channel_chat_created = None - new_chat_photo = None + for size in sizes: + if isinstance(size, (types.PhotoSize, types.PhotoCachedSize)): + loc = size.location - if isinstance(action, types.MessageActionChatAddUser): - new_chat_members = [parse_user(users[i]) for i in action.users] - elif isinstance(action, types.MessageActionChatJoinedByLink): - new_chat_members = [parse_user(users[message.from_id])] - elif isinstance(action, types.MessageActionChatDeleteUser): - left_chat_member = parse_user(users[action.user_id]) - elif isinstance(action, types.MessageActionChatEditTitle): - new_chat_title = action.title - elif isinstance(action, types.MessageActionChatDeletePhoto): - delete_chat_photo = True - elif isinstance(action, types.MessageActionChatMigrateTo): - migrate_to_chat_id = action.channel_id - elif isinstance(action, types.MessageActionChannelMigrateFrom): - migrate_from_chat_id = action.chat_id - elif isinstance(action, types.MessageActionChatCreate): - group_chat_created = True - elif isinstance(action, types.MessageActionChannelCreate): - channel_chat_created = True - elif isinstance(action, types.MessageActionChatEditPhoto): - photo = action.photo + if isinstance(size, types.PhotoSize): + file_size = size.size + else: + file_size = len(size.bytes) - if isinstance(photo, types.Photo): - sizes = photo.sizes - photo_sizes = [] - - for size in sizes: - if isinstance(size, (types.PhotoSize, types.PhotoCachedSize)): - loc = size.location - - if isinstance(size, types.PhotoSize): - file_size = size.size - else: - file_size = len(size.bytes) - - if isinstance(loc, types.FileLocation): - photo_size = pyrogram_types.PhotoSize( - file_id=encode( - pack( - " pyrogram_types.Message: - return pyrogram_types.Message(message_id=message.id, client=proxy(client)) + return parsed_messages if is_list else parsed_messages[0] def get_peer_id(input_peer) -> int: diff --git a/pyrogram/client/methods/messages/forward_messages.py b/pyrogram/client/methods/messages/forward_messages.py index 4cd22f9d..606e54b5 100644 --- a/pyrogram/client/methods/messages/forward_messages.py +++ b/pyrogram/client/methods/messages/forward_messages.py @@ -17,7 +17,7 @@ # along with Pyrogram. If not, see . from pyrogram.api import functions, types -from ....ext import BaseClient, utils +from ...ext import BaseClient, utils class ForwardMessages(BaseClient): @@ -79,7 +79,10 @@ class ForwardMessages(BaseClient): for i in r.updates: if isinstance(i, (types.UpdateNewMessage, types.UpdateNewChannelMessage)): messages.append( - utils.parse_message(self, i.message, users, chats) + utils.parse_messages( + self, i.message, + users, chats + ) ) return messages if is_iterable else messages[0] diff --git a/pyrogram/client/methods/messages/get_history.py b/pyrogram/client/methods/messages/get_history.py index 7c03f854..15dd3395 100644 --- a/pyrogram/client/methods/messages/get_history.py +++ b/pyrogram/client/methods/messages/get_history.py @@ -23,13 +23,35 @@ from ...ext import BaseClient, utils class GetHistory(BaseClient): def get_history(self, chat_id: int or str, - offset: int, - limit: int, + offset: int = 0, + limit: int = 100, offset_id: int = 0, - offset_date: int = 0, - max_id: int = 0, - min_id: int = 0): - # TODO: Documentation + offset_date: int = 0): + """Use this method to retrieve the history of a chat. + + You can get up to 100 messages at once. + + Args: + chat_id (``int`` | ``str``): + Unique identifier (int) or username (str) of the target chat. + For your personal cloud (Saved Messages) you can simply use "me" or "self". + For a contact that exists in your Telegram address book you can use his phone number (str). + For a private channel/supergroup you can use its *t.me/joinchat/* link. + + offset (``int``, *optional*) + Sequential number of the first message to be returned. + Defaults to 0 (most recent message). + + limit (``int``, *optional*): + Limits the number of messages to be retrieved. + By default, the first 100 messages are returned. + + offset_id (``int``, *optional*): + Pass a message identifier as offset to retrieve only older messages starting from that message. + + offset_date (``int``, *optional*): + Pass a date in Unix time as offset to retrieve only older messages starting from that date. + """ r = self.send( functions.messages.GetHistory( @@ -38,8 +60,8 @@ class GetHistory(BaseClient): offset_date=offset_date, add_offset=offset, limit=limit, - max_id=max_id, - min_id=min_id, + max_id=0, + min_id=0, hash=0 ) ) @@ -47,26 +69,22 @@ class GetHistory(BaseClient): users = {i.id: i for i in r.users} chats = {i.id: i for i in r.chats} - messages = [] + reply_to_messages = {i.reply_to_msg_id: None for i in r.messages if i.reply_to_msg_id} - for i in r.messages: - if isinstance(i, types.Message): - messages.append( - utils.parse_message( - self, i, users, chats - ) - ) - elif isinstance(i, types.MessageService): - messages.append( - utils.parse_message_service( - self, i, users, chats - ) - ) - else: - messages.append( - utils.parse_message_empty( - self, i - ) - ) + if reply_to_messages: + temp = self.get_messages(chat_id, reply_to_messages.keys(), replies=0) + + assert len(temp) == len(reply_to_messages) + + for i in range(len(temp)): + reply_to_messages[temp[i].message_id] = temp[i] + + messages = utils.parse_messages(self, r.messages, users, chats, replies=0) + + assert len(messages) == len(r.messages) + + for i in range(len(messages)): + if r.messages[i].reply_to_msg_id: + messages[i].reply_to_message = reply_to_messages[r.messages[i].reply_to_msg_id] return messages diff --git a/pyrogram/client/methods/messages/get_messages.py b/pyrogram/client/methods/messages/get_messages.py index cf972353..49535a40 100644 --- a/pyrogram/client/methods/messages/get_messages.py +++ b/pyrogram/client/methods/messages/get_messages.py @@ -68,30 +68,11 @@ class GetMessages(BaseClient): r = self.send(rpc) - users = {i.id: i for i in r.users} - chats = {i.id: i for i in r.chats} - - messages = [] - - for i in r.messages: - if isinstance(i, types.Message): - messages.append( - utils.parse_message( - self, i, users, chats, - replies=replies - ) - ) - elif isinstance(i, types.MessageService): - messages.append( - utils.parse_message_service( - self, i, users, chats - ) - ) - else: - messages.append( - utils.parse_message_empty( - self, i - ) - ) + messages = utils.parse_messages( + self, r.messages, + {i.id: i for i in r.users}, + {i.id: i for i in r.chats}, + replies=replies + ) return messages if is_iterable else messages[0] diff --git a/pyrogram/client/methods/messages/media/send_audio.py b/pyrogram/client/methods/messages/media/send_audio.py index 58154a4b..0d08211e 100644 --- a/pyrogram/client/methods/messages/media/send_audio.py +++ b/pyrogram/client/methods/messages/media/send_audio.py @@ -176,7 +176,8 @@ class SendAudio(BaseClient): else: for i in r.updates: if isinstance(i, (types.UpdateNewMessage, types.UpdateNewChannelMessage)): - users = {i.id: i for i in r.users} - chats = {i.id: i for i in r.chats} - - return utils.parse_message(self, i.message, users, chats) + return utils.parse_messages( + self, i.message, + {i.id: i for i in r.users}, + {i.id: i for i in r.chats} + ) diff --git a/pyrogram/client/methods/messages/media/send_contact.py b/pyrogram/client/methods/messages/media/send_contact.py index 974b06ac..eb1bb6c4 100644 --- a/pyrogram/client/methods/messages/media/send_contact.py +++ b/pyrogram/client/methods/messages/media/send_contact.py @@ -82,7 +82,8 @@ class SendContact(BaseClient): for i in r.updates: if isinstance(i, (types.UpdateNewMessage, types.UpdateNewChannelMessage)): - users = {i.id: i for i in r.users} - chats = {i.id: i for i in r.chats} - - return utils.parse_message(self, i.message, users, chats) + return utils.parse_messages( + self, i.message, + {i.id: i for i in r.users}, + {i.id: i for i in r.chats} + ) diff --git a/pyrogram/client/methods/messages/media/send_document.py b/pyrogram/client/methods/messages/media/send_document.py index 0e6e2a69..5cc5900d 100644 --- a/pyrogram/client/methods/messages/media/send_document.py +++ b/pyrogram/client/methods/messages/media/send_document.py @@ -157,7 +157,8 @@ class SendDocument(BaseClient): else: for i in r.updates: if isinstance(i, (types.UpdateNewMessage, types.UpdateNewChannelMessage)): - users = {i.id: i for i in r.users} - chats = {i.id: i for i in r.chats} - - return utils.parse_message(self, i.message, users, chats) + return utils.parse_messages( + self, i.message, + {i.id: i for i in r.users}, + {i.id: i for i in r.chats} + ) diff --git a/pyrogram/client/methods/messages/media/send_location.py b/pyrogram/client/methods/messages/media/send_location.py index 79d7011e..08dac02b 100644 --- a/pyrogram/client/methods/messages/media/send_location.py +++ b/pyrogram/client/methods/messages/media/send_location.py @@ -79,7 +79,8 @@ class SendLocation(BaseClient): for i in r.updates: if isinstance(i, (types.UpdateNewMessage, types.UpdateNewChannelMessage)): - users = {i.id: i for i in r.users} - chats = {i.id: i for i in r.chats} - - return utils.parse_message(self, i.message, users, chats) + return utils.parse_messages( + self, i.message, + {i.id: i for i in r.users}, + {i.id: i for i in r.chats} + ) diff --git a/pyrogram/client/methods/messages/media/send_photo.py b/pyrogram/client/methods/messages/media/send_photo.py index d91a727a..f4e11416 100644 --- a/pyrogram/client/methods/messages/media/send_photo.py +++ b/pyrogram/client/methods/messages/media/send_photo.py @@ -161,7 +161,8 @@ class SendPhoto(BaseClient): else: for i in r.updates: if isinstance(i, (types.UpdateNewMessage, types.UpdateNewChannelMessage)): - users = {i.id: i for i in r.users} - chats = {i.id: i for i in r.chats} - - return utils.parse_message(self, i.message, users, chats) + return utils.parse_messages( + self, i.message, + {i.id: i for i in r.users}, + {i.id: i for i in r.chats} + ) diff --git a/pyrogram/client/methods/messages/media/send_sticker.py b/pyrogram/client/methods/messages/media/send_sticker.py index 65175841..c7eb7b78 100644 --- a/pyrogram/client/methods/messages/media/send_sticker.py +++ b/pyrogram/client/methods/messages/media/send_sticker.py @@ -145,7 +145,8 @@ class SendSticker(BaseClient): else: for i in r.updates: if isinstance(i, (types.UpdateNewMessage, types.UpdateNewChannelMessage)): - users = {i.id: i for i in r.users} - chats = {i.id: i for i in r.chats} - - return utils.parse_message(self, i.message, users, chats) + return utils.parse_messages( + self, i.message, + {i.id: i for i in r.users}, + {i.id: i for i in r.chats} + ) diff --git a/pyrogram/client/methods/messages/media/send_venue.py b/pyrogram/client/methods/messages/media/send_venue.py index 5a32bfaf..d65ea43b 100644 --- a/pyrogram/client/methods/messages/media/send_venue.py +++ b/pyrogram/client/methods/messages/media/send_venue.py @@ -96,7 +96,8 @@ class SendVenue(BaseClient): for i in r.updates: if isinstance(i, (types.UpdateNewMessage, types.UpdateNewChannelMessage)): - users = {i.id: i for i in r.users} - chats = {i.id: i for i in r.chats} - - return utils.parse_message(self, i.message, users, chats) + return utils.parse_messages( + self, i.message, + {i.id: i for i in r.users}, + {i.id: i for i in r.chats} + ) diff --git a/pyrogram/client/methods/messages/media/send_video.py b/pyrogram/client/methods/messages/media/send_video.py index 627f2c16..c0eb4eec 100644 --- a/pyrogram/client/methods/messages/media/send_video.py +++ b/pyrogram/client/methods/messages/media/send_video.py @@ -187,7 +187,8 @@ class SendVideo(BaseClient): else: for i in r.updates: if isinstance(i, (types.UpdateNewMessage, types.UpdateNewChannelMessage)): - users = {i.id: i for i in r.users} - chats = {i.id: i for i in r.chats} - - return utils.parse_message(self, i.message, users, chats) + return utils.parse_messages( + self, i.message, + {i.id: i for i in r.users}, + {i.id: i for i in r.chats} + ) diff --git a/pyrogram/client/methods/messages/media/send_video_note.py b/pyrogram/client/methods/messages/media/send_video_note.py index bba0d990..1cf93d78 100644 --- a/pyrogram/client/methods/messages/media/send_video_note.py +++ b/pyrogram/client/methods/messages/media/send_video_note.py @@ -155,7 +155,8 @@ class SendVideoNote(BaseClient): else: for i in r.updates: if isinstance(i, (types.UpdateNewMessage, types.UpdateNewChannelMessage)): - users = {i.id: i for i in r.users} - chats = {i.id: i for i in r.chats} - - return utils.parse_message(self, i.message, users, chats) + return utils.parse_messages( + self, i.message, + {i.id: i for i in r.users}, + {i.id: i for i in r.chats} + ) diff --git a/pyrogram/client/methods/messages/media/send_voice.py b/pyrogram/client/methods/messages/media/send_voice.py index 83b10c20..7aa23a2c 100644 --- a/pyrogram/client/methods/messages/media/send_voice.py +++ b/pyrogram/client/methods/messages/media/send_voice.py @@ -164,7 +164,8 @@ class SendVoice(BaseClient): else: for i in r.updates: if isinstance(i, (types.UpdateNewMessage, types.UpdateNewChannelMessage)): - users = {i.id: i for i in r.users} - chats = {i.id: i for i in r.chats} - - return utils.parse_message(self, i.message, users, chats) + return utils.parse_messages( + self, i.message, + {i.id: i for i in r.users}, + {i.id: i for i in r.chats} + ) diff --git a/pyrogram/client/methods/messages/send_message.py b/pyrogram/client/methods/messages/send_message.py index d73e08be..44acaa2e 100644 --- a/pyrogram/client/methods/messages/send_message.py +++ b/pyrogram/client/methods/messages/send_message.py @@ -18,7 +18,7 @@ from pyrogram.api import functions, types from pyrogram.client import types as pyrogram_types -from ....ext import utils, BaseClient +from ...ext import utils, BaseClient class SendMessage(BaseClient): @@ -91,7 +91,8 @@ class SendMessage(BaseClient): for i in r.updates: if isinstance(i, (types.UpdateNewMessage, types.UpdateNewChannelMessage)): - users = {i.id: i for i in r.users} - chats = {i.id: i for i in r.chats} - - return utils.parse_message(self, i.message, users, chats) + return utils.parse_messages( + self, i.message, + {i.id: i for i in r.users}, + {i.id: i for i in r.chats} + ) diff --git a/pyrogram/client/methods/messages/update/edit_message_caption.py b/pyrogram/client/methods/messages/update/edit_message_caption.py index 7ac7a56d..90bf26f7 100644 --- a/pyrogram/client/methods/messages/update/edit_message_caption.py +++ b/pyrogram/client/methods/messages/update/edit_message_caption.py @@ -69,7 +69,8 @@ class EditMessageCaption(BaseClient): for i in r.updates: if isinstance(i, (types.UpdateEditMessage, types.UpdateEditChannelMessage)): - users = {i.id: i for i in r.users} - chats = {i.id: i for i in r.chats} - - return utils.parse_message(self, i.message, users, chats) + return utils.parse_messages( + self, i.message, + {i.id: i for i in r.users}, + {i.id: i for i in r.chats} + ) diff --git a/pyrogram/client/methods/messages/update/edit_message_reply_markup.py b/pyrogram/client/methods/messages/update/edit_message_reply_markup.py index 5f162ac5..295eb258 100644 --- a/pyrogram/client/methods/messages/update/edit_message_reply_markup.py +++ b/pyrogram/client/methods/messages/update/edit_message_reply_markup.py @@ -58,7 +58,8 @@ class EditMessageReplyMarkup(BaseClient): for i in r.updates: if isinstance(i, (types.UpdateEditMessage, types.UpdateEditChannelMessage)): - users = {i.id: i for i in r.users} - chats = {i.id: i for i in r.chats} - - return utils.parse_message(self, i.message, users, chats) + return utils.parse_messages( + self, i.message, + {i.id: i for i in r.users}, + {i.id: i for i in r.chats} + ) diff --git a/pyrogram/client/methods/messages/update/edit_message_text.py b/pyrogram/client/methods/messages/update/edit_message_text.py index 862f3ab3..be7b380c 100644 --- a/pyrogram/client/methods/messages/update/edit_message_text.py +++ b/pyrogram/client/methods/messages/update/edit_message_text.py @@ -74,7 +74,8 @@ class EditMessageText(BaseClient): for i in r.updates: if isinstance(i, (types.UpdateEditMessage, types.UpdateEditChannelMessage)): - users = {i.id: i for i in r.users} - chats = {i.id: i for i in r.chats} - - return utils.parse_message(self, i.message, users, chats) + return utils.parse_messages( + self, i.message, + {i.id: i for i in r.users}, + {i.id: i for i in r.chats} + )