diff --git a/pyrogram/enums/message_service_type.py b/pyrogram/enums/message_service_type.py index 5a63ecc6..a61edeb9 100644 --- a/pyrogram/enums/message_service_type.py +++ b/pyrogram/enums/message_service_type.py @@ -99,3 +99,6 @@ class MessageServiceType(AutoName): WEB_APP_DATA = auto() "Web app data" + + GIVEAWAY_RESULT = auto() + "Giveaway Result" diff --git a/pyrogram/types/messages_and_media/giveaway_result.py b/pyrogram/types/messages_and_media/giveaway_result.py index 5b1aeb8a..3e36539f 100644 --- a/pyrogram/types/messages_and_media/giveaway_result.py +++ b/pyrogram/types/messages_and_media/giveaway_result.py @@ -21,17 +21,17 @@ import pyrogram from datetime import datetime from pyrogram import raw, types, utils from ..object import Object -from typing import List +from typing import List, Union class GiveawayResult(Object): """A giveaway result. Parameters: - chat (:obj:`~pyrogram.types.Chat`): + chat (:obj:`~pyrogram.types.Chat`, *optional*): Channel which host the giveaway. - giveaway_message (:obj:`~pyrogram.types.Message`): + giveaway_message (:obj:`~pyrogram.types.Message`, *optional*): The original giveaway message. quantity (``int``): @@ -40,13 +40,13 @@ class GiveawayResult(Object): unclaimed_quantity (``int``): Quantity of unclaimed giveaway prize. - winners (List of :obj:`~pyrogram.types.User`): + winners (List of :obj:`~pyrogram.types.User`, *optional*): The giveaway winners. - months (``int``): + months (``int``, *optional*): How long the telegram premium last (in month). - expire_date (:py:obj:`~datetime.datetime`): + expire_date (:py:obj:`~datetime.datetime`, *optional*): Date the giveaway winner(s) choosen. new_subscribers (``bool``, *optional*): @@ -54,21 +54,25 @@ class GiveawayResult(Object): is_refunded (``bool``, *optional*): True, if the giveaway was refunded. + + is_winners_hidden (``bool``): + True, if the giveaway winners are hidden. """ def __init__( self, *, client: "pyrogram.Client" = None, - chat: "types.Chat", - giveaway_message: "types.Message", + chat: "types.Chat" = None, + giveaway_message: "types.Message" = None, quantity: int, unclaimed_quantity: int, - winners: List["types.User"], - months: int, - expire_date: datetime, - new_subscribers : bool, - is_refunded: bool = None + winners: List["types.User"] = None, + months: int = None, + expire_date: datetime = None, + new_subscribers : bool = None, + is_refunded: bool = None, + is_winners_hidden: bool ): super().__init__(client) @@ -81,31 +85,45 @@ class GiveawayResult(Object): self.expire_date = expire_date self.new_subscribers = new_subscribers self.is_refunded = is_refunded + self.is_winners_hidden = is_winners_hidden @staticmethod - async def _parse(client, message: "raw.types.Message") -> "GiveawayResult": - giveaway_result: "raw.types.MessageMediaGiveawayResults" = message.media - chat_id = utils.get_channel_id(giveaway_result.channel_id) - chat = await client.invoke( - raw.functions.channels.GetChannels( - id=[await client.resolve_peer(chat_id)] + async def _parse( + client, + giveaway_result: Union[ + "raw.types.MessageActionGiveawayResults", + "raw.types.MessageMediaGiveawayResults" + ], + hide_winners: bool = False + ) -> "GiveawayResult": + chat = None + giveaway_message = None + expired_date = None + winners = None + if not hide_winners: + chat_id = utils.get_channel_id(giveaway_result.channel_id) + chat = await client.invoke( + raw.functions.channels.GetChannels( + id=[await client.resolve_peer(chat_id)] + ) ) - ) - chat = types.Chat._parse_chat(client, chat.chats[0]) - giveaway_message = await client.get_messages(chat_id, giveaway_result.launch_msg_id) - winners = [] - for winner in giveaway_result.winners: - winners.append(await client.get_users(winner)) + chat = types.Chat._parse_chat(client, chat.chats[0]) + giveaway_message = await client.get_messages(chat_id, giveaway_result.launch_msg_id) + expired_date = utils.timestamp_to_datetime(giveaway_result.until_date) + winners = [] + for winner in giveaway_result.winners: + winners.append(await client.get_users(winner)) return GiveawayResult( chat=chat, giveaway_message=giveaway_message, - quantity=giveaway_result.winners_count, - unclaimed_quantity=giveaway_result.unclaimed_count, + quantity=getattr(giveaway_result, "winners_count", None), + unclaimed_quantity=getattr(giveaway_result, "unclaimed_count", None), winners=winners, - months=giveaway_result.months, - expire_date=utils.timestamp_to_datetime(giveaway_result.until_date), - new_subscribers=giveaway_result.only_new_subscribers, - is_refunded=giveaway_result.refunded, + months=getattr(giveaway_result, "months", None), + expire_date=expired_date, + new_subscribers=getattr(giveaway_result, "only_new_subscribers", None), + is_refunded=getattr(giveaway_result, "refunded", None), + is_winners_hidden=hide_winners, client=client ) diff --git a/pyrogram/types/messages_and_media/message.py b/pyrogram/types/messages_and_media/message.py index a0b4344e..64c62bf4 100644 --- a/pyrogram/types/messages_and_media/message.py +++ b/pyrogram/types/messages_and_media/message.py @@ -655,6 +655,7 @@ class Message(Object, Update): video_chat_ended = None video_chat_members_invited = None web_app_data = None + giveaway_result = None service_type = None @@ -737,7 +738,9 @@ class Message(Object, Update): elif isinstance(action, raw.types.MessageActionWebViewDataSentMe): web_app_data = types.WebAppData._parse(action) service_type = enums.MessageServiceType.WEB_APP_DATA - + elif isinstance(action, raw.types.MessageActionGiveawayResults): + giveaway_result = await types.GiveawayResult._parse(client, action, True) + service_type = enums.MessageServiceType.GIVEAWAY_RESULT from_user = types.User._parse(client, users.get(user_id, None)) sender_chat = types.Chat._parse(client, message, users, chats, is_chat=False) if not from_user else None @@ -774,6 +777,7 @@ class Message(Object, Update): video_chat_ended=video_chat_ended, video_chat_members_invited=video_chat_members_invited, web_app_data=web_app_data, + giveaway_result=giveaway_result, client=client # TODO: supergroup_chat_created ) @@ -892,7 +896,7 @@ class Message(Object, Update): giveaway = await types.Giveaway._parse(client, message) media_type = enums.MessageMediaType.GIVEAWAY elif isinstance(media, raw.types.MessageMediaGiveawayResults): - giveaway_result = await types.GiveawayResult._parse(client, message) + giveaway_result = await types.GiveawayResult._parse(client, message.media) media_type = enums.MessageMediaType.GIVEAWAY_RESULT elif isinstance(media, raw.types.MessageMediaStory): story = await types.MessageStory._parse(client, media)