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"
GIVEAWAY_RESULT = auto()
"Giveaway Result"

View file

@ -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
)

View file

@ -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)