2
0
mirror of https://github.com/pyrogram/pyrogram synced 2025-08-28 21:07:59 +00:00

Make parse_messages accept a list of messages

This commit is contained in:
Dan 2018-05-09 19:29:23 +02:00
parent 65c67aaf57
commit a1c3e40800
19 changed files with 510 additions and 507 deletions

View File

@ -138,14 +138,7 @@ class Dispatcher:
self.dispatch(update, users=users, chats=chats, is_raw=True) self.dispatch(update, users=users, chats=chats, is_raw=True)
if isinstance(update, Dispatcher.MESSAGE_UPDATES): if isinstance(update, Dispatcher.MESSAGE_UPDATES):
if isinstance(update.message, types.Message): message = utils.parse_messages(
parser = utils.parse_message
elif isinstance(update.message, types.MessageService):
parser = utils.parse_message_service
else:
continue
message = parser(
self.client, self.client,
update.message, update.message,
users, users,

View File

@ -218,437 +218,431 @@ def encode(s: bytes) -> str:
# TODO: Reorganize code, maybe split parts as well # TODO: Reorganize code, maybe split parts as well
def parse_message( def parse_messages(
client, client,
message: types.Message, messages: list or types.Message or types.MessageService or types.MessageEmpty,
users: dict, users: dict,
chats: dict, chats: dict,
replies: int = 1 replies: int = 1
) -> pyrogram_types.Message: ) -> 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 for message in messages:
forward_from_chat = None if isinstance(message, types.Message):
forward_from_message_id = None entities = parse_entities(message.entities, users)
forward_signature = None
forward_date = None
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_header = message.fwd_from # type: types.MessageFwdHeader
forward_date = forward_header.date
if forward_header.from_id: if forward_header:
forward_from = parse_user(users[forward_header.from_id]) forward_date = forward_header.date
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
photo = None if forward_header.from_id:
location = None forward_from = parse_user(users[forward_header.from_id])
contact = None else:
venue = None forward_from_chat = parse_channel_chat(chats[forward_header.channel_id])
audio = None forward_from_message_id = forward_header.channel_post
voice = None forward_signature = forward_header.post_author
video = None
video_note = None
sticker = None
document = None
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: media = message.media
if isinstance(media, types.MessageMediaPhoto):
photo = media.photo
if isinstance(photo, types.Photo): if media:
sizes = photo.sizes if isinstance(media, types.MessageMediaPhoto):
photo_sizes = [] photo = media.photo
for size in sizes: if isinstance(photo, types.Photo):
if isinstance(size, (types.PhotoSize, types.PhotoCachedSize)): sizes = photo.sizes
loc = size.location photo_sizes = []
if isinstance(size, types.PhotoSize): for size in sizes:
file_size = size.size if isinstance(size, (types.PhotoSize, types.PhotoCachedSize)):
else: loc = size.location
file_size = len(size.bytes)
if isinstance(loc, types.FileLocation): if isinstance(size, types.PhotoSize):
photo_size = pyrogram_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(
"<iiqqqqi",
2,
loc.dc_id,
photo.id,
photo.access_hash,
loc.volume_id,
loc.secret,
loc.local_id
)
),
width=size.w,
height=size.h,
file_size=file_size,
date=photo.date
)
photo_sizes.append(photo_size)
photo = photo_sizes
elif isinstance(media, types.MessageMediaGeo):
geo_point = media.geo
if isinstance(geo_point, types.GeoPoint):
location = pyrogram_types.Location(
longitude=geo_point.long,
latitude=geo_point.lat
)
elif isinstance(media, types.MessageMediaContact):
contact = pyrogram_types.Contact(
phone_number=media.phone_number,
first_name=media.first_name,
last_name=media.last_name or None,
user_id=media.user_id or None
)
elif isinstance(media, types.MessageMediaVenue):
venue = pyrogram_types.Venue(
location=pyrogram_types.Location(
longitude=media.geo.long,
latitude=media.geo.lat
),
title=media.title,
address=media.address,
foursquare_id=media.venue_id or None
)
elif isinstance(media, types.MessageMediaDocument):
doc = media.document
if isinstance(doc, types.Document):
attributes = {type(i): i for i in doc.attributes}
file_name = getattr(
attributes.get(
types.DocumentAttributeFilename, None
), "file_name", None
)
if types.DocumentAttributeAudio in attributes:
audio_attributes = attributes[types.DocumentAttributeAudio]
if audio_attributes.voice:
voice = pyrogram_types.Voice(
file_id=encode(
pack(
"<iiqq",
3,
doc.dc_id,
doc.id,
doc.access_hash
)
),
duration=audio_attributes.duration,
mime_type=doc.mime_type,
file_size=doc.size,
thumb=parse_thumb(doc.thumb),
file_name=file_name,
date=doc.date
)
else:
audio = pyrogram_types.Audio(
file_id=encode(
pack(
"<iiqq",
9,
doc.dc_id,
doc.id,
doc.access_hash
)
),
duration=audio_attributes.duration,
performer=audio_attributes.performer,
title=audio_attributes.title,
mime_type=doc.mime_type,
file_size=doc.size,
thumb=parse_thumb(doc.thumb),
file_name=file_name,
date=doc.date
)
elif types.DocumentAttributeAnimated in attributes:
document = pyrogram_types.Document(
file_id=encode( file_id=encode(
pack( pack(
"<iiqqqqi", "<iiqq",
2, 10,
loc.dc_id, doc.dc_id,
photo.id, doc.id,
photo.access_hash, doc.access_hash
loc.volume_id,
loc.secret,
loc.local_id
) )
), ),
width=size.w, thumb=parse_thumb(doc.thumb),
height=size.h, file_name=file_name,
file_size=file_size, mime_type=doc.mime_type,
date=photo.date file_size=doc.size,
date=doc.date
) )
elif types.DocumentAttributeVideo in attributes:
video_attributes = attributes[types.DocumentAttributeVideo]
photo_sizes.append(photo_size) if video_attributes.round_message:
video_note = pyrogram_types.VideoNote(
photo = photo_sizes file_id=encode(
elif isinstance(media, types.MessageMediaGeo): pack(
geo_point = media.geo "<iiqq",
13,
if isinstance(geo_point, types.GeoPoint): doc.dc_id,
location = pyrogram_types.Location( doc.id,
longitude=geo_point.long, doc.access_hash
latitude=geo_point.lat )
) ),
elif isinstance(media, types.MessageMediaContact): length=video_attributes.w,
contact = pyrogram_types.Contact( duration=video_attributes.duration,
phone_number=media.phone_number, thumb=parse_thumb(doc.thumb),
first_name=media.first_name, file_size=doc.size,
last_name=media.last_name or None, file_name=file_name,
user_id=media.user_id or None mime_type=doc.mime_type,
) date=doc.date
elif isinstance(media, types.MessageMediaVenue):
venue = pyrogram_types.Venue(
location=pyrogram_types.Location(
longitude=media.geo.long,
latitude=media.geo.lat
),
title=media.title,
address=media.address,
foursquare_id=media.venue_id or None
)
elif isinstance(media, types.MessageMediaDocument):
doc = media.document
if isinstance(doc, types.Document):
attributes = {type(i): i for i in doc.attributes}
file_name = getattr(
attributes.get(
types.DocumentAttributeFilename, None
), "file_name", None
)
if types.DocumentAttributeAudio in attributes:
audio_attributes = attributes[types.DocumentAttributeAudio]
if audio_attributes.voice:
voice = pyrogram_types.Voice(
file_id=encode(
pack(
"<iiqq",
3,
doc.dc_id,
doc.id,
doc.access_hash
) )
), else:
duration=audio_attributes.duration, video = pyrogram_types.Video(
mime_type=doc.mime_type, file_id=encode(
file_size=doc.size, pack(
thumb=parse_thumb(doc.thumb), "<iiqq",
file_name=file_name, 4,
date=doc.date doc.dc_id,
) doc.id,
else: doc.access_hash
audio = pyrogram_types.Audio( )
file_id=encode( ),
pack( width=video_attributes.w,
"<iiqq", height=video_attributes.h,
9, duration=video_attributes.duration,
doc.dc_id, thumb=parse_thumb(doc.thumb),
doc.id, mime_type=doc.mime_type,
doc.access_hash file_size=doc.size,
file_name=file_name,
date=doc.date
) )
), elif types.DocumentAttributeSticker in attributes:
duration=audio_attributes.duration, image_size_attributes = attributes.get(types.DocumentAttributeImageSize, None)
performer=audio_attributes.performer, sticker_attribute = attributes[types.DocumentAttributeSticker]
title=audio_attributes.title,
mime_type=doc.mime_type, if isinstance(sticker_attribute.stickerset, types.InputStickerSetID):
file_size=doc.size, try:
thumb=parse_thumb(doc.thumb), set_name = client.send(
file_name=file_name, functions.messages.GetStickerSet(sticker_attribute.stickerset)
date=doc.date ).set.short_name
) except StickersetInvalid:
elif types.DocumentAttributeAnimated in attributes: set_name = None
document = pyrogram_types.Document( else:
file_id=encode( set_name = None
pack(
"<iiqq", sticker = pyrogram_types.Sticker(
10, file_id=encode(
doc.dc_id, pack(
doc.id, "<iiqq",
doc.access_hash 8,
doc.dc_id,
doc.id,
doc.access_hash
)
),
width=image_size_attributes.w if image_size_attributes else 0,
height=image_size_attributes.h if image_size_attributes else 0,
thumb=parse_thumb(doc.thumb),
# TODO: mask_position
set_name=set_name,
emoji=sticker_attribute.alt or None,
file_size=doc.size,
mime_type=doc.mime_type,
file_name=file_name,
date=doc.date
) )
), else:
thumb=parse_thumb(doc.thumb), document = pyrogram_types.Document(
file_name=file_name, file_id=encode(
mime_type=doc.mime_type, pack(
file_size=doc.size, "<iiqq",
date=doc.date 5,
) doc.dc_id,
elif types.DocumentAttributeVideo in attributes: doc.id,
video_attributes = attributes[types.DocumentAttributeVideo] doc.access_hash
)
if video_attributes.round_message: ),
video_note = pyrogram_types.VideoNote( thumb=parse_thumb(doc.thumb),
file_id=encode( file_name=file_name,
pack( mime_type=doc.mime_type,
"<iiqq", file_size=doc.size,
13, date=doc.date
doc.dc_id,
doc.id,
doc.access_hash
)
),
length=video_attributes.w,
duration=video_attributes.duration,
thumb=parse_thumb(doc.thumb),
file_size=doc.size,
file_name=file_name,
mime_type=doc.mime_type,
date=doc.date
)
else:
video = pyrogram_types.Video(
file_id=encode(
pack(
"<iiqq",
4,
doc.dc_id,
doc.id,
doc.access_hash
)
),
width=video_attributes.w,
height=video_attributes.h,
duration=video_attributes.duration,
thumb=parse_thumb(doc.thumb),
mime_type=doc.mime_type,
file_size=doc.size,
file_name=file_name,
date=doc.date
)
elif types.DocumentAttributeSticker in attributes:
image_size_attributes = attributes.get(types.DocumentAttributeImageSize, None)
sticker_attribute = attributes[types.DocumentAttributeSticker]
if isinstance(sticker_attribute.stickerset, types.InputStickerSetID):
try:
set_name = client.send(
functions.messages.GetStickerSet(sticker_attribute.stickerset)
).set.short_name
except StickersetInvalid:
set_name = None
else:
set_name = None
sticker = pyrogram_types.Sticker(
file_id=encode(
pack(
"<iiqq",
8,
doc.dc_id,
doc.id,
doc.access_hash
) )
),
width=image_size_attributes.w if image_size_attributes else 0,
height=image_size_attributes.h if image_size_attributes else 0,
thumb=parse_thumb(doc.thumb),
# TODO: mask_position
set_name=set_name,
emoji=sticker_attribute.alt or None,
file_size=doc.size,
mime_type=doc.mime_type,
file_name=file_name,
date=doc.date
)
else: else:
document = pyrogram_types.Document( media = None
file_id=encode(
pack(
"<iiqq",
5,
doc.dc_id,
doc.id,
doc.access_hash
)
),
thumb=parse_thumb(doc.thumb),
file_name=file_name,
mime_type=doc.mime_type,
file_size=doc.size,
date=doc.date
)
else:
media = None
reply_markup = message.reply_markup reply_markup = message.reply_markup
if reply_markup: if reply_markup:
if isinstance(reply_markup, types.ReplyKeyboardForceReply): if isinstance(reply_markup, types.ReplyKeyboardForceReply):
reply_markup = pyrogram_types.ForceReply.read(reply_markup) reply_markup = pyrogram_types.ForceReply.read(reply_markup)
elif isinstance(reply_markup, types.ReplyKeyboardMarkup): elif isinstance(reply_markup, types.ReplyKeyboardMarkup):
reply_markup = pyrogram_types.ReplyKeyboardMarkup.read(reply_markup) reply_markup = pyrogram_types.ReplyKeyboardMarkup.read(reply_markup)
elif isinstance(reply_markup, types.ReplyInlineMarkup): elif isinstance(reply_markup, types.ReplyInlineMarkup):
reply_markup = pyrogram_types.InlineKeyboardMarkup.read(reply_markup) reply_markup = pyrogram_types.InlineKeyboardMarkup.read(reply_markup)
elif isinstance(reply_markup, types.ReplyKeyboardHide): elif isinstance(reply_markup, types.ReplyKeyboardHide):
reply_markup = pyrogram_types.ReplyKeyboardRemove.read(reply_markup) reply_markup = pyrogram_types.ReplyKeyboardRemove.read(reply_markup)
else: else:
reply_markup = None reply_markup = None
m = pyrogram_types.Message( m = pyrogram_types.Message(
message_id=message.id, message_id=message.id,
date=message.date, date=message.date,
chat=parse_chat(message, users, chats), chat=parse_chat(message, users, chats),
from_user=parse_user(users.get(message.from_id, None)), from_user=parse_user(users.get(message.from_id, None)),
text=message.message or None if media is None else None, text=message.message or None if media is None else None,
caption=message.message or None if media is not None else None, caption=message.message or None if media is not None else None,
entities=entities or None if media is None else None, entities=entities or None if media is None else None,
caption_entities=entities or None if media is not None else None, caption_entities=entities or None if media is not None else None,
author_signature=message.post_author, author_signature=message.post_author,
forward_from=forward_from, forward_from=forward_from,
forward_from_chat=forward_from_chat, forward_from_chat=forward_from_chat,
forward_from_message_id=forward_from_message_id, forward_from_message_id=forward_from_message_id,
forward_signature=forward_signature, forward_signature=forward_signature,
forward_date=forward_date, forward_date=forward_date,
edit_date=message.edit_date, edit_date=message.edit_date,
media_group_id=message.grouped_id, media_group_id=message.grouped_id,
photo=photo, photo=photo,
location=location, location=location,
contact=contact, contact=contact,
venue=venue, venue=venue,
audio=audio, audio=audio,
voice=voice, voice=voice,
video=video, video=video,
video_note=video_note, video_note=video_note,
sticker=sticker, sticker=sticker,
document=document, document=document,
views=message.views, views=message.views,
via_bot=parse_user(users.get(message.via_bot_id, None)), via_bot=parse_user(users.get(message.via_bot_id, None)),
outgoing=message.out, outgoing=message.out,
client=proxy(client), client=proxy(client),
reply_markup=reply_markup reply_markup=reply_markup
) )
if message.reply_to_msg_id and replies: if message.reply_to_msg_id and replies:
m.reply_to_message = client.get_messages(m.chat.id, message.reply_to_msg_id, replies=replies - 1) m.reply_to_message = client.get_messages(m.chat.id, message.reply_to_msg_id, replies=replies - 1)
elif isinstance(message, types.MessageService):
action = message.action
return m 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
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
def parse_message_service( if isinstance(photo, types.Photo):
client, sizes = photo.sizes
message: types.MessageService, photo_sizes = []
users: dict,
chats: dict
) -> pyrogram_types.Message:
action = message.action
new_chat_members = None for size in sizes:
left_chat_member = None if isinstance(size, (types.PhotoSize, types.PhotoCachedSize)):
new_chat_title = None loc = size.location
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
if isinstance(action, types.MessageActionChatAddUser): if isinstance(size, types.PhotoSize):
new_chat_members = [parse_user(users[i]) for i in action.users] file_size = size.size
elif isinstance(action, types.MessageActionChatJoinedByLink): else:
new_chat_members = [parse_user(users[message.from_id])] file_size = len(size.bytes)
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(photo, types.Photo): if isinstance(loc, types.FileLocation):
sizes = photo.sizes photo_size = pyrogram_types.PhotoSize(
photo_sizes = [] file_id=encode(
pack(
for size in sizes: "<iiqqqqi",
if isinstance(size, (types.PhotoSize, types.PhotoCachedSize)): 2,
loc = size.location loc.dc_id,
photo.id,
if isinstance(size, types.PhotoSize): photo.access_hash,
file_size = size.size loc.volume_id,
else: loc.secret,
file_size = len(size.bytes) loc.local_id
)
if isinstance(loc, types.FileLocation): ),
photo_size = pyrogram_types.PhotoSize( width=size.w,
file_id=encode( height=size.h,
pack( file_size=file_size,
"<iiqqqqi", date=photo.date
2,
loc.dc_id,
photo.id,
photo.access_hash,
loc.volume_id,
loc.secret,
loc.local_id
) )
),
width=size.w,
height=size.h,
file_size=file_size,
date=photo.date
)
photo_sizes.append(photo_size) photo_sizes.append(photo_size)
new_chat_photo = photo_sizes new_chat_photo = photo_sizes
m = pyrogram_types.Message( m = pyrogram_types.Message(
message_id=message.id, message_id=message.id,
date=message.date, date=message.date,
chat=parse_chat(message, users, chats), chat=parse_chat(message, users, chats),
from_user=parse_user(users.get(message.from_id, None)), from_user=parse_user(users.get(message.from_id, None)),
new_chat_members=new_chat_members, new_chat_members=new_chat_members,
left_chat_member=left_chat_member, left_chat_member=left_chat_member,
new_chat_title=new_chat_title, new_chat_title=new_chat_title,
new_chat_photo=new_chat_photo, new_chat_photo=new_chat_photo,
delete_chat_photo=delete_chat_photo, delete_chat_photo=delete_chat_photo,
migrate_to_chat_id=int("-100" + str(migrate_to_chat_id)) if migrate_to_chat_id else None, migrate_to_chat_id=int("-100" + str(migrate_to_chat_id)) if migrate_to_chat_id else None,
migrate_from_chat_id=-migrate_from_chat_id if migrate_from_chat_id else None, migrate_from_chat_id=-migrate_from_chat_id if migrate_from_chat_id else None,
group_chat_created=group_chat_created, group_chat_created=group_chat_created,
channel_chat_created=channel_chat_created, channel_chat_created=channel_chat_created,
client=proxy(client) client=proxy(client)
# TODO: supergroup_chat_created # TODO: supergroup_chat_created
) )
if isinstance(action, types.MessageActionPinMessage): if isinstance(action, types.MessageActionPinMessage):
m.pinned_message = client.get_messages(m.chat.id, message.reply_to_msg_id, replies=0) m.pinned_message = client.get_messages(m.chat.id, message.reply_to_msg_id, replies=0)
else:
m = pyrogram_types.Message(message_id=message.id, client=proxy(client))
return m parsed_messages.append(m)
return parsed_messages if is_list else parsed_messages[0]
def parse_message_empty(
client,
message: types.MessageEmpty
) -> pyrogram_types.Message:
return pyrogram_types.Message(message_id=message.id, client=proxy(client))
def get_peer_id(input_peer) -> int: def get_peer_id(input_peer) -> int:

View File

@ -17,7 +17,7 @@
# along with Pyrogram. If not, see <http://www.gnu.org/licenses/>. # along with Pyrogram. If not, see <http://www.gnu.org/licenses/>.
from pyrogram.api import functions, types from pyrogram.api import functions, types
from ....ext import BaseClient, utils from ...ext import BaseClient, utils
class ForwardMessages(BaseClient): class ForwardMessages(BaseClient):
@ -79,7 +79,10 @@ class ForwardMessages(BaseClient):
for i in r.updates: for i in r.updates:
if isinstance(i, (types.UpdateNewMessage, types.UpdateNewChannelMessage)): if isinstance(i, (types.UpdateNewMessage, types.UpdateNewChannelMessage)):
messages.append( 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] return messages if is_iterable else messages[0]

View File

@ -23,13 +23,35 @@ from ...ext import BaseClient, utils
class GetHistory(BaseClient): class GetHistory(BaseClient):
def get_history(self, def get_history(self,
chat_id: int or str, chat_id: int or str,
offset: int, offset: int = 0,
limit: int, limit: int = 100,
offset_id: int = 0, offset_id: int = 0,
offset_date: int = 0, offset_date: int = 0):
max_id: int = 0, """Use this method to retrieve the history of a chat.
min_id: int = 0):
# TODO: Documentation 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( r = self.send(
functions.messages.GetHistory( functions.messages.GetHistory(
@ -38,8 +60,8 @@ class GetHistory(BaseClient):
offset_date=offset_date, offset_date=offset_date,
add_offset=offset, add_offset=offset,
limit=limit, limit=limit,
max_id=max_id, max_id=0,
min_id=min_id, min_id=0,
hash=0 hash=0
) )
) )
@ -47,26 +69,22 @@ class GetHistory(BaseClient):
users = {i.id: i for i in r.users} users = {i.id: i for i in r.users}
chats = {i.id: i for i in r.chats} 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 reply_to_messages:
if isinstance(i, types.Message): temp = self.get_messages(chat_id, reply_to_messages.keys(), replies=0)
messages.append(
utils.parse_message( assert len(temp) == len(reply_to_messages)
self, i, users, chats
) for i in range(len(temp)):
) reply_to_messages[temp[i].message_id] = temp[i]
elif isinstance(i, types.MessageService):
messages.append( messages = utils.parse_messages(self, r.messages, users, chats, replies=0)
utils.parse_message_service(
self, i, users, chats assert len(messages) == len(r.messages)
)
) for i in range(len(messages)):
else: if r.messages[i].reply_to_msg_id:
messages.append( messages[i].reply_to_message = reply_to_messages[r.messages[i].reply_to_msg_id]
utils.parse_message_empty(
self, i
)
)
return messages return messages

View File

@ -68,30 +68,11 @@ class GetMessages(BaseClient):
r = self.send(rpc) r = self.send(rpc)
users = {i.id: i for i in r.users} messages = utils.parse_messages(
chats = {i.id: i for i in r.chats} self, r.messages,
{i.id: i for i in r.users},
messages = [] {i.id: i for i in r.chats},
replies=replies
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
)
)
return messages if is_iterable else messages[0] return messages if is_iterable else messages[0]

View File

@ -176,7 +176,8 @@ class SendAudio(BaseClient):
else: else:
for i in r.updates: for i in r.updates:
if isinstance(i, (types.UpdateNewMessage, types.UpdateNewChannelMessage)): if isinstance(i, (types.UpdateNewMessage, types.UpdateNewChannelMessage)):
users = {i.id: i for i in r.users} return utils.parse_messages(
chats = {i.id: i for i in r.chats} self, i.message,
{i.id: i for i in r.users},
return utils.parse_message(self, i.message, users, chats) {i.id: i for i in r.chats}
)

View File

@ -82,7 +82,8 @@ class SendContact(BaseClient):
for i in r.updates: for i in r.updates:
if isinstance(i, (types.UpdateNewMessage, types.UpdateNewChannelMessage)): if isinstance(i, (types.UpdateNewMessage, types.UpdateNewChannelMessage)):
users = {i.id: i for i in r.users} return utils.parse_messages(
chats = {i.id: i for i in r.chats} self, i.message,
{i.id: i for i in r.users},
return utils.parse_message(self, i.message, users, chats) {i.id: i for i in r.chats}
)

View File

@ -157,7 +157,8 @@ class SendDocument(BaseClient):
else: else:
for i in r.updates: for i in r.updates:
if isinstance(i, (types.UpdateNewMessage, types.UpdateNewChannelMessage)): if isinstance(i, (types.UpdateNewMessage, types.UpdateNewChannelMessage)):
users = {i.id: i for i in r.users} return utils.parse_messages(
chats = {i.id: i for i in r.chats} self, i.message,
{i.id: i for i in r.users},
return utils.parse_message(self, i.message, users, chats) {i.id: i for i in r.chats}
)

View File

@ -79,7 +79,8 @@ class SendLocation(BaseClient):
for i in r.updates: for i in r.updates:
if isinstance(i, (types.UpdateNewMessage, types.UpdateNewChannelMessage)): if isinstance(i, (types.UpdateNewMessage, types.UpdateNewChannelMessage)):
users = {i.id: i for i in r.users} return utils.parse_messages(
chats = {i.id: i for i in r.chats} self, i.message,
{i.id: i for i in r.users},
return utils.parse_message(self, i.message, users, chats) {i.id: i for i in r.chats}
)

View File

@ -161,7 +161,8 @@ class SendPhoto(BaseClient):
else: else:
for i in r.updates: for i in r.updates:
if isinstance(i, (types.UpdateNewMessage, types.UpdateNewChannelMessage)): if isinstance(i, (types.UpdateNewMessage, types.UpdateNewChannelMessage)):
users = {i.id: i for i in r.users} return utils.parse_messages(
chats = {i.id: i for i in r.chats} self, i.message,
{i.id: i for i in r.users},
return utils.parse_message(self, i.message, users, chats) {i.id: i for i in r.chats}
)

View File

@ -145,7 +145,8 @@ class SendSticker(BaseClient):
else: else:
for i in r.updates: for i in r.updates:
if isinstance(i, (types.UpdateNewMessage, types.UpdateNewChannelMessage)): if isinstance(i, (types.UpdateNewMessage, types.UpdateNewChannelMessage)):
users = {i.id: i for i in r.users} return utils.parse_messages(
chats = {i.id: i for i in r.chats} self, i.message,
{i.id: i for i in r.users},
return utils.parse_message(self, i.message, users, chats) {i.id: i for i in r.chats}
)

View File

@ -96,7 +96,8 @@ class SendVenue(BaseClient):
for i in r.updates: for i in r.updates:
if isinstance(i, (types.UpdateNewMessage, types.UpdateNewChannelMessage)): if isinstance(i, (types.UpdateNewMessage, types.UpdateNewChannelMessage)):
users = {i.id: i for i in r.users} return utils.parse_messages(
chats = {i.id: i for i in r.chats} self, i.message,
{i.id: i for i in r.users},
return utils.parse_message(self, i.message, users, chats) {i.id: i for i in r.chats}
)

View File

@ -187,7 +187,8 @@ class SendVideo(BaseClient):
else: else:
for i in r.updates: for i in r.updates:
if isinstance(i, (types.UpdateNewMessage, types.UpdateNewChannelMessage)): if isinstance(i, (types.UpdateNewMessage, types.UpdateNewChannelMessage)):
users = {i.id: i for i in r.users} return utils.parse_messages(
chats = {i.id: i for i in r.chats} self, i.message,
{i.id: i for i in r.users},
return utils.parse_message(self, i.message, users, chats) {i.id: i for i in r.chats}
)

View File

@ -155,7 +155,8 @@ class SendVideoNote(BaseClient):
else: else:
for i in r.updates: for i in r.updates:
if isinstance(i, (types.UpdateNewMessage, types.UpdateNewChannelMessage)): if isinstance(i, (types.UpdateNewMessage, types.UpdateNewChannelMessage)):
users = {i.id: i for i in r.users} return utils.parse_messages(
chats = {i.id: i for i in r.chats} self, i.message,
{i.id: i for i in r.users},
return utils.parse_message(self, i.message, users, chats) {i.id: i for i in r.chats}
)

View File

@ -164,7 +164,8 @@ class SendVoice(BaseClient):
else: else:
for i in r.updates: for i in r.updates:
if isinstance(i, (types.UpdateNewMessage, types.UpdateNewChannelMessage)): if isinstance(i, (types.UpdateNewMessage, types.UpdateNewChannelMessage)):
users = {i.id: i for i in r.users} return utils.parse_messages(
chats = {i.id: i for i in r.chats} self, i.message,
{i.id: i for i in r.users},
return utils.parse_message(self, i.message, users, chats) {i.id: i for i in r.chats}
)

View File

@ -18,7 +18,7 @@
from pyrogram.api import functions, types from pyrogram.api import functions, types
from pyrogram.client import types as pyrogram_types from pyrogram.client import types as pyrogram_types
from ....ext import utils, BaseClient from ...ext import utils, BaseClient
class SendMessage(BaseClient): class SendMessage(BaseClient):
@ -91,7 +91,8 @@ class SendMessage(BaseClient):
for i in r.updates: for i in r.updates:
if isinstance(i, (types.UpdateNewMessage, types.UpdateNewChannelMessage)): if isinstance(i, (types.UpdateNewMessage, types.UpdateNewChannelMessage)):
users = {i.id: i for i in r.users} return utils.parse_messages(
chats = {i.id: i for i in r.chats} self, i.message,
{i.id: i for i in r.users},
return utils.parse_message(self, i.message, users, chats) {i.id: i for i in r.chats}
)

View File

@ -69,7 +69,8 @@ class EditMessageCaption(BaseClient):
for i in r.updates: for i in r.updates:
if isinstance(i, (types.UpdateEditMessage, types.UpdateEditChannelMessage)): if isinstance(i, (types.UpdateEditMessage, types.UpdateEditChannelMessage)):
users = {i.id: i for i in r.users} return utils.parse_messages(
chats = {i.id: i for i in r.chats} self, i.message,
{i.id: i for i in r.users},
return utils.parse_message(self, i.message, users, chats) {i.id: i for i in r.chats}
)

View File

@ -58,7 +58,8 @@ class EditMessageReplyMarkup(BaseClient):
for i in r.updates: for i in r.updates:
if isinstance(i, (types.UpdateEditMessage, types.UpdateEditChannelMessage)): if isinstance(i, (types.UpdateEditMessage, types.UpdateEditChannelMessage)):
users = {i.id: i for i in r.users} return utils.parse_messages(
chats = {i.id: i for i in r.chats} self, i.message,
{i.id: i for i in r.users},
return utils.parse_message(self, i.message, users, chats) {i.id: i for i in r.chats}
)

View File

@ -74,7 +74,8 @@ class EditMessageText(BaseClient):
for i in r.updates: for i in r.updates:
if isinstance(i, (types.UpdateEditMessage, types.UpdateEditChannelMessage)): if isinstance(i, (types.UpdateEditMessage, types.UpdateEditChannelMessage)):
users = {i.id: i for i in r.users} return utils.parse_messages(
chats = {i.id: i for i in r.chats} self, i.message,
{i.id: i for i in r.users},
return utils.parse_message(self, i.message, users, chats) {i.id: i for i in r.chats}
)