diff --git a/pyrogram/dispatcher.py b/pyrogram/dispatcher.py index f6e522c2..d312cb9c 100644 --- a/pyrogram/dispatcher.py +++ b/pyrogram/dispatcher.py @@ -171,7 +171,7 @@ async def inline_query_parser(update, users, chats): async def poll_parser(update, users, chats): return ( - pyrogram.types.Poll._parse_update(self.client, update), + await pyrogram.types.Poll._parse_update(self.client, update, users), PollHandler ) diff --git a/pyrogram/methods/messages/retract_vote.py b/pyrogram/methods/messages/retract_vote.py index c81c176c..09c4efe0 100644 --- a/pyrogram/methods/messages/retract_vote.py +++ b/pyrogram/methods/messages/retract_vote.py @@ -60,4 +60,4 @@ async def retract_vote( ) ) - return types.Poll._parse(self, r.updates[0]) + return await types.Poll._parse(self, r.updates[0], r.users) diff --git a/pyrogram/methods/messages/stop_poll.py b/pyrogram/methods/messages/stop_poll.py index 8a20c8ab..9c7bfd78 100644 --- a/pyrogram/methods/messages/stop_poll.py +++ b/pyrogram/methods/messages/stop_poll.py @@ -87,4 +87,4 @@ async def stop_poll( else: r = await self.invoke(rpc) - return types.Poll._parse(self, r.updates[0]) + return await types.Poll._parse(self, r.updates[0], r.users) diff --git a/pyrogram/methods/messages/vote_poll.py b/pyrogram/methods/messages/vote_poll.py index 042fd45b..659f2220 100644 --- a/pyrogram/methods/messages/vote_poll.py +++ b/pyrogram/methods/messages/vote_poll.py @@ -68,4 +68,4 @@ async def vote_poll( ) ) - return types.Poll._parse(self, r.updates[0]) + return await types.Poll._parse(self, r.updates[0], r.users) diff --git a/pyrogram/types/messages_and_media/message.py b/pyrogram/types/messages_and_media/message.py index d88a78bc..78584a95 100644 --- a/pyrogram/types/messages_and_media/message.py +++ b/pyrogram/types/messages_and_media/message.py @@ -1086,7 +1086,7 @@ async def _parse( else: media = None elif isinstance(media, raw.types.MessageMediaPoll): - poll = types.Poll._parse(client, media) + poll = await types.Poll._parse(client, media, users) media_type = enums.MessageMediaType.POLL elif isinstance(media, raw.types.MessageMediaDice): dice = types.Dice._parse(client, media) diff --git a/pyrogram/types/messages_and_media/poll.py b/pyrogram/types/messages_and_media/poll.py index c423e8b3..e8c988eb 100644 --- a/pyrogram/types/messages_and_media/poll.py +++ b/pyrogram/types/messages_and_media/poll.py @@ -78,6 +78,9 @@ class Poll(Object, Update): close_date (:py:obj:`~datetime.datetime`, *optional*): Point in time when the poll will be automatically closed. + + recent_voters (List of :obj:`~pyrogram.types.User`, *optional*): + List of user whos recently vote. """ def __init__( @@ -98,7 +101,8 @@ def __init__( explanation: Optional[str] = None, explanation_entities: Optional[List["types.MessageEntity"]] = None, open_period: Optional[int] = None, - close_date: Optional[datetime] = None + close_date: Optional[datetime] = None, + recent_voters: List["types.User"] = None ): super().__init__(client) @@ -117,9 +121,14 @@ def __init__( self.explanation_entities = explanation_entities self.open_period = open_period self.close_date = close_date + self.recent_voters = recent_voters @staticmethod - def _parse(client, media_poll: Union["raw.types.MessageMediaPoll", "raw.types.UpdateMessagePoll"]) -> "Poll": + async def _parse( + client, + media_poll: Union["raw.types.MessageMediaPoll", "raw.types.UpdateMessagePoll"], + users: List["raw.base.User"] + ) -> "Poll": poll: raw.types.Poll = media_poll.poll poll_results: raw.types.PollResults = media_poll.results results: List[raw.types.PollAnswerVoters] = poll_results.results @@ -176,13 +185,21 @@ def _parse(client, media_poll: Union["raw.types.MessageMediaPoll", "raw.types.Up ] if poll_results.solution_entities else None, open_period=poll.close_period, close_date=utils.timestamp_to_datetime(poll.close_date), + recent_voters=[ + await client.get_users(user.user_id) + for user in poll_results.recent_voters + ] if poll_results.recent_voters else None, client=client ) @staticmethod - def _parse_update(client, update: "raw.types.UpdateMessagePoll"): + async def _parse_update( + client, + update: "raw.types.UpdateMessagePoll", + users: List["raw.base.User"] + ) -> "Poll": if update.poll is not None: - return Poll._parse(client, update) + return await Poll._parse(client, update, users) results = update.results.results chosen_option_id = None @@ -213,6 +230,10 @@ def _parse_update(client, update: "raw.types.UpdateMessagePoll"): is_closed=False, chosen_option_id=chosen_option_id, correct_option_id=correct_option_id, + recent_voters=[ + types.User._parse(client, users.get(user.user_id, None)) + for user in update.results.recent_voters + ] if update.results.recent_voters else None, client=client )