Pyrofork: Add GiveawayResult MessageService type

Signed-off-by: wulan17 <wulan17@nusantararom.org>
This commit is contained in:
wulan17 2023-12-28 19:22:56 +07:00
parent 992835b5a8
commit 16390c3eff
No known key found for this signature in database
GPG key ID: 318CD6CD3A6AC0A5
3 changed files with 58 additions and 33 deletions

View file

@ -99,3 +99,6 @@ class MessageServiceType(AutoName):
WEB_APP_DATA = auto() WEB_APP_DATA = auto()
"Web app data" "Web app data"
GIVEAWAY_RESULT = auto()
"Giveaway Result"

View file

@ -21,17 +21,17 @@ import pyrogram
from datetime import datetime from datetime import datetime
from pyrogram import raw, types, utils from pyrogram import raw, types, utils
from ..object import Object from ..object import Object
from typing import List from typing import List, Union
class GiveawayResult(Object): class GiveawayResult(Object):
"""A giveaway result. """A giveaway result.
Parameters: Parameters:
chat (:obj:`~pyrogram.types.Chat`): chat (:obj:`~pyrogram.types.Chat`, *optional*):
Channel which host the giveaway. Channel which host the giveaway.
giveaway_message (:obj:`~pyrogram.types.Message`): giveaway_message (:obj:`~pyrogram.types.Message`, *optional*):
The original giveaway message. The original giveaway message.
quantity (``int``): quantity (``int``):
@ -40,13 +40,13 @@ class GiveawayResult(Object):
unclaimed_quantity (``int``): unclaimed_quantity (``int``):
Quantity of unclaimed giveaway prize. Quantity of unclaimed giveaway prize.
winners (List of :obj:`~pyrogram.types.User`): winners (List of :obj:`~pyrogram.types.User`, *optional*):
The giveaway winners. The giveaway winners.
months (``int``): months (``int``, *optional*):
How long the telegram premium last (in month). 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. Date the giveaway winner(s) choosen.
new_subscribers (``bool``, *optional*): new_subscribers (``bool``, *optional*):
@ -54,21 +54,25 @@ class GiveawayResult(Object):
is_refunded (``bool``, *optional*): is_refunded (``bool``, *optional*):
True, if the giveaway was refunded. True, if the giveaway was refunded.
is_winners_hidden (``bool``):
True, if the giveaway winners are hidden.
""" """
def __init__( def __init__(
self, self,
*, *,
client: "pyrogram.Client" = None, client: "pyrogram.Client" = None,
chat: "types.Chat", chat: "types.Chat" = None,
giveaway_message: "types.Message", giveaway_message: "types.Message" = None,
quantity: int, quantity: int,
unclaimed_quantity: int, unclaimed_quantity: int,
winners: List["types.User"], winners: List["types.User"] = None,
months: int, months: int = None,
expire_date: datetime, expire_date: datetime = None,
new_subscribers : bool, new_subscribers : bool = None,
is_refunded: bool = None is_refunded: bool = None,
is_winners_hidden: bool
): ):
super().__init__(client) super().__init__(client)
@ -81,31 +85,45 @@ class GiveawayResult(Object):
self.expire_date = expire_date self.expire_date = expire_date
self.new_subscribers = new_subscribers self.new_subscribers = new_subscribers
self.is_refunded = is_refunded self.is_refunded = is_refunded
self.is_winners_hidden = is_winners_hidden
@staticmethod @staticmethod
async def _parse(client, message: "raw.types.Message") -> "GiveawayResult": async def _parse(
giveaway_result: "raw.types.MessageMediaGiveawayResults" = message.media client,
chat_id = utils.get_channel_id(giveaway_result.channel_id) giveaway_result: Union[
chat = await client.invoke( "raw.types.MessageActionGiveawayResults",
raw.functions.channels.GetChannels( "raw.types.MessageMediaGiveawayResults"
id=[await client.resolve_peer(chat_id)] ],
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])
chat = types.Chat._parse_chat(client, chat.chats[0]) giveaway_message = await client.get_messages(chat_id, giveaway_result.launch_msg_id)
giveaway_message = await client.get_messages(chat_id, giveaway_result.launch_msg_id) expired_date = utils.timestamp_to_datetime(giveaway_result.until_date)
winners = [] winners = []
for winner in giveaway_result.winners: for winner in giveaway_result.winners:
winners.append(await client.get_users(winner)) winners.append(await client.get_users(winner))
return GiveawayResult( return GiveawayResult(
chat=chat, chat=chat,
giveaway_message=giveaway_message, giveaway_message=giveaway_message,
quantity=giveaway_result.winners_count, quantity=getattr(giveaway_result, "winners_count", None),
unclaimed_quantity=giveaway_result.unclaimed_count, unclaimed_quantity=getattr(giveaway_result, "unclaimed_count", None),
winners=winners, winners=winners,
months=giveaway_result.months, months=getattr(giveaway_result, "months", None),
expire_date=utils.timestamp_to_datetime(giveaway_result.until_date), expire_date=expired_date,
new_subscribers=giveaway_result.only_new_subscribers, new_subscribers=getattr(giveaway_result, "only_new_subscribers", None),
is_refunded=giveaway_result.refunded, is_refunded=getattr(giveaway_result, "refunded", None),
is_winners_hidden=hide_winners,
client=client client=client
) )

View file

@ -655,6 +655,7 @@ class Message(Object, Update):
video_chat_ended = None video_chat_ended = None
video_chat_members_invited = None video_chat_members_invited = None
web_app_data = None web_app_data = None
giveaway_result = None
service_type = None service_type = None
@ -737,7 +738,9 @@ class Message(Object, Update):
elif isinstance(action, raw.types.MessageActionWebViewDataSentMe): elif isinstance(action, raw.types.MessageActionWebViewDataSentMe):
web_app_data = types.WebAppData._parse(action) web_app_data = types.WebAppData._parse(action)
service_type = enums.MessageServiceType.WEB_APP_DATA 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)) 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 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_ended=video_chat_ended,
video_chat_members_invited=video_chat_members_invited, video_chat_members_invited=video_chat_members_invited,
web_app_data=web_app_data, web_app_data=web_app_data,
giveaway_result=giveaway_result,
client=client client=client
# TODO: supergroup_chat_created # TODO: supergroup_chat_created
) )
@ -892,7 +896,7 @@ class Message(Object, Update):
giveaway = await types.Giveaway._parse(client, message) giveaway = await types.Giveaway._parse(client, message)
media_type = enums.MessageMediaType.GIVEAWAY media_type = enums.MessageMediaType.GIVEAWAY
elif isinstance(media, raw.types.MessageMediaGiveawayResults): 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 media_type = enums.MessageMediaType.GIVEAWAY_RESULT
elif isinstance(media, raw.types.MessageMediaStory): elif isinstance(media, raw.types.MessageMediaStory):
story = await types.MessageStory._parse(client, media) story = await types.MessageStory._parse(client, media)