From 49cef06d3593eb483b95465149aa20d1f077d546 Mon Sep 17 00:00:00 2001 From: KurimuzonAkuma Date: Thu, 2 Jan 2025 21:27:14 +0300 Subject: [PATCH] pyrofork: update StarGift type to new layer Signed-off-by: Yasir Aris --- compiler/docs/compiler.py | 3 + pyrogram/dispatcher.py | 2 +- pyrogram/enums/__init__.py | 2 + pyrogram/enums/star_gift_attribute_type.py | 33 ++ pyrogram/methods/messages/search_global.py | 15 + .../methods/messages/search_global_count.py | 17 + pyrogram/methods/payments/__init__.py | 6 +- .../methods/payments/convert_star_gift.py | 14 +- pyrogram/methods/payments/hide_star_gift.py | 17 +- pyrogram/methods/payments/show_star_gift.py | 17 +- .../methods/payments/transfer_star_gift.py | 65 +++ .../methods/payments/upgrade_star_gift.py | 55 +++ pyrogram/types/messages_and_media/__init__.py | 7 + pyrogram/types/messages_and_media/message.py | 2 +- .../types/messages_and_media/star_gift.py | 443 ++++++++++++++++++ .../messages_and_media/star_gift_attribute.py | 80 ++++ 16 files changed, 730 insertions(+), 48 deletions(-) create mode 100644 pyrogram/enums/star_gift_attribute_type.py create mode 100644 pyrogram/methods/payments/transfer_star_gift.py create mode 100644 pyrogram/methods/payments/upgrade_star_gift.py create mode 100644 pyrogram/types/messages_and_media/star_gift.py create mode 100644 pyrogram/types/messages_and_media/star_gift_attribute.py diff --git a/compiler/docs/compiler.py b/compiler/docs/compiler.py index 6a1994437..4c81fcb03 100644 --- a/compiler/docs/compiler.py +++ b/compiler/docs/compiler.py @@ -365,6 +365,8 @@ def get_title_list(s: str) -> list: send_payment_form send_star_gift show_star_gift + transfer_star_gift + upgrade_star_gift """, password=""" Password @@ -562,6 +564,7 @@ def get_title_list(s: str) -> list: ScreenshotTaken Wallpaper WallpaperSettings + StarGiftAttribute """, stories=""" Stories diff --git a/pyrogram/dispatcher.py b/pyrogram/dispatcher.py index c16ef9e30..920d515d9 100644 --- a/pyrogram/dispatcher.py +++ b/pyrogram/dispatcher.py @@ -408,4 +408,4 @@ async def _execute_callback(self, handler: Handler, *args): else: await self.client.loop.run_in_executor( self.client.executor, handler.callback, self.client, *args - ) + ) \ No newline at end of file diff --git a/pyrogram/enums/__init__.py b/pyrogram/enums/__init__.py index 9368e68b1..ea176035e 100644 --- a/pyrogram/enums/__init__.py +++ b/pyrogram/enums/__init__.py @@ -38,6 +38,7 @@ from .reaction_type import ReactionType from .reply_color import ReplyColor from .sent_code_type import SentCodeType +from .star_gift_attribute_type import StarGiftAttributeType from .stories_privacy_rules import StoriesPrivacyRules from .story_privacy import StoryPrivacy from .user_status import UserStatus @@ -64,6 +65,7 @@ 'ReactionType', 'ReplyColor', 'SentCodeType', + 'StarGiftAttributeType', "StoriesPrivacyRules", "StoryPrivacy", 'UserStatus' diff --git a/pyrogram/enums/star_gift_attribute_type.py b/pyrogram/enums/star_gift_attribute_type.py new file mode 100644 index 000000000..a75b9473c --- /dev/null +++ b/pyrogram/enums/star_gift_attribute_type.py @@ -0,0 +1,33 @@ +# Pyrogram - Telegram MTProto API Client Library for Python +# Copyright (C) 2017-present Dan +# +# This file is part of Pyrogram. +# +# Pyrogram is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Pyrogram is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with Pyrogram. If not, see . + +from pyrogram import raw +from .auto_name import AutoName + + +class StarGiftAttributeType(AutoName): + """Star gift attribute type enumeration used in :obj:`~pyrogram.types.StarGiftAttribute`.""" + + MODEL = raw.types.StarGiftAttributeModel + "Model attribute" + + SYMBOL = raw.types.StarGiftAttributePattern + "Symbol attribute" + + BACKDROP = raw.types.StarGiftAttributeBackdrop + "Backdrop attribute" diff --git a/pyrogram/methods/messages/search_global.py b/pyrogram/methods/messages/search_global.py index 7cf686d00..b7a4ede9f 100644 --- a/pyrogram/methods/messages/search_global.py +++ b/pyrogram/methods/messages/search_global.py @@ -30,6 +30,9 @@ async def search_global( self: "pyrogram.Client", query: str = "", filter: "enums.MessagesFilter" = enums.MessagesFilter.EMPTY, + channels_only: Optional[bool] = None, + groups_only: Optional[bool] = None, + users_only: Optional[bool] = None, limit: int = 0, ) -> Optional[AsyncGenerator["types.Message", None]]: """Search messages globally from all of your chats. @@ -56,6 +59,15 @@ async def search_global( Limits the number of messages to be retrieved. By default, no limit is applied and all messages are returned. + channels_only (``bool``, *optional*): + Pass True to search only in channels. + + groups_only (``bool``, *optional*): + Pass True to search only in groups. + + users_only (``bool``, *optional*): + Pass True to search only in users. + Returns: ``Generator``: A generator yielding :obj:`~pyrogram.types.Message` objects. @@ -93,6 +105,9 @@ async def search_global( offset_rate=offset_date, offset_peer=offset_peer, offset_id=offset_id, + broadcasts_only=channels_only, + groups_only=groups_only, + users_only=users_only, limit=limit ), sleep_threshold=60 diff --git a/pyrogram/methods/messages/search_global_count.py b/pyrogram/methods/messages/search_global_count.py index 1b35d78ed..3ee416b8e 100644 --- a/pyrogram/methods/messages/search_global_count.py +++ b/pyrogram/methods/messages/search_global_count.py @@ -17,6 +17,8 @@ # You should have received a copy of the GNU Lesser General Public License # along with Pyrofork. If not, see . +from typing import Optional + import pyrogram from pyrogram import raw, enums @@ -26,6 +28,9 @@ async def search_global_count( self: "pyrogram.Client", query: str = "", filter: "enums.MessagesFilter" = enums.MessagesFilter.EMPTY, + channels_only: Optional[bool] = None, + groups_only: Optional[bool] = None, + users_only: Optional[bool] = None, ) -> int: """Get the count of messages resulting from a global search. @@ -41,6 +46,15 @@ async def search_global_count( filter (:obj:`~pyrogram.enums.MessagesFilter`, *optional*): Pass a filter in order to search for specific kind of messages only: + channels_only (``bool``, *optional*): + Pass True to search only in channels. + + groups_only (``bool``, *optional*): + Pass True to search only in groups. + + users_only (``bool``, *optional*): + Pass True to search only in users. + Returns: ``int``: On success, the messages count is returned. """ @@ -53,6 +67,9 @@ async def search_global_count( offset_rate=0, offset_peer=raw.types.InputPeerEmpty(), offset_id=0, + broadcasts_only=channels_only, + groups_only=groups_only, + users_only=users_only, limit=1 ) ) diff --git a/pyrogram/methods/payments/__init__.py b/pyrogram/methods/payments/__init__.py index 690424e4c..6c18ebd72 100644 --- a/pyrogram/methods/payments/__init__.py +++ b/pyrogram/methods/payments/__init__.py @@ -35,6 +35,8 @@ from .send_payment_form import SendPaymentForm from .send_star_gift import SendStarGift from .show_star_gift import ShowStarGift +from .transfer_star_gift import TransferStarGift +from .upgrade_star_gift import UpgradeStarGift class Payments( ApplyGiftCode, @@ -54,6 +56,8 @@ class Payments( SendInvoice, SendPaymentForm, SendStarGift, - ShowStarGift + ShowStarGift, + TransferStarGift, + UpgradeStarGift ): pass diff --git a/pyrogram/methods/payments/convert_star_gift.py b/pyrogram/methods/payments/convert_star_gift.py index 03cc78f4e..06ce9e8db 100644 --- a/pyrogram/methods/payments/convert_star_gift.py +++ b/pyrogram/methods/payments/convert_star_gift.py @@ -27,7 +27,6 @@ class ConvertStarGift: async def convert_star_gift( self: "pyrogram.Client", - chat_id: Union[int, str], message_id: int ) -> bool: """Convert star gift to stars. @@ -35,11 +34,6 @@ async def convert_star_gift( .. include:: /_includes/usable-by/users.rst Parameters: - 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). - message_id (``int``): Unique message identifier of star gift. @@ -50,16 +44,10 @@ async def convert_star_gift( .. code-block:: python # Convert gift - app.convert_star_gift(chat_id=chat_id, message_id=123) + app.convert_star_gift(message_id=123) """ - peer = await self.resolve_peer(chat_id) - - if not isinstance(peer, (raw.types.InputPeerUser, raw.types.InputPeerSelf)): - raise ValueError("chat_id must belong to a user.") - r = await self.invoke( raw.functions.payments.ConvertStarGift( - user_id=peer, msg_id=message_id ) ) diff --git a/pyrogram/methods/payments/hide_star_gift.py b/pyrogram/methods/payments/hide_star_gift.py index 2b4d5025c..8fe6f7881 100644 --- a/pyrogram/methods/payments/hide_star_gift.py +++ b/pyrogram/methods/payments/hide_star_gift.py @@ -17,9 +17,6 @@ # You should have received a copy of the GNU Lesser General Public License # along with Pyrofork. If not, see . - -from typing import Union - import pyrogram from pyrogram import raw @@ -27,7 +24,6 @@ class HideStarGift: async def hide_star_gift( self: "pyrogram.Client", - chat_id: Union[int, str], message_id: int ) -> bool: """Hide the star gift from your profile. @@ -35,11 +31,6 @@ async def hide_star_gift( .. include:: /_includes/usable-by/users.rst Parameters: - 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). - message_id (``int``): Unique message identifier of star gift. @@ -50,16 +41,10 @@ async def hide_star_gift( .. code-block:: python # Hide gift - app.hide_star_gift(chat_id=chat_id, message_id=123) + app.hide_star_gift(message_id=123) """ - peer = await self.resolve_peer(chat_id) - - if not isinstance(peer, (raw.types.InputPeerUser, raw.types.InputPeerSelf)): - raise ValueError("chat_id must belong to a user.") - r = await self.invoke( raw.functions.payments.SaveStarGift( - user_id=peer, msg_id=message_id, unsave=True ) diff --git a/pyrogram/methods/payments/show_star_gift.py b/pyrogram/methods/payments/show_star_gift.py index 764148dfb..e3590e3c3 100644 --- a/pyrogram/methods/payments/show_star_gift.py +++ b/pyrogram/methods/payments/show_star_gift.py @@ -16,9 +16,6 @@ # You should have received a copy of the GNU Lesser General Public License # along with Pyrogram. If not, see . - -from typing import Union - import pyrogram from pyrogram import raw @@ -26,7 +23,6 @@ class ShowStarGift: async def show_star_gift( self: "pyrogram.Client", - chat_id: Union[int, str], message_id: int ) -> bool: """Display the star gift in your profile. @@ -34,11 +30,6 @@ async def show_star_gift( .. include:: /_includes/usable-by/users.rst Parameters: - 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). - message_id (``int``): Unique message identifier of star gift. @@ -49,16 +40,10 @@ async def show_star_gift( .. code-block:: python # Show gift - app.show_star_gift(chat_id=chat_id, message_id=123) + app.show_star_gift(message_id=123) """ - peer = await self.resolve_peer(chat_id) - - if not isinstance(peer, (raw.types.InputPeerUser, raw.types.InputPeerSelf)): - raise ValueError("chat_id must belong to a user.") - r = await self.invoke( raw.functions.payments.SaveStarGift( - user_id=peer, msg_id=message_id, unsave=False ) diff --git a/pyrogram/methods/payments/transfer_star_gift.py b/pyrogram/methods/payments/transfer_star_gift.py new file mode 100644 index 000000000..85ca49ff7 --- /dev/null +++ b/pyrogram/methods/payments/transfer_star_gift.py @@ -0,0 +1,65 @@ +# Pyrogram - Telegram MTProto API Client Library for Python +# Copyright (C) 2017-present Dan +# +# This file is part of Pyrogram. +# +# Pyrogram is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Pyrogram is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with Pyrogram. If not, see . + +from typing import Union + +import pyrogram +from pyrogram import raw + + +class TransferStarGift: + async def transfer_star_gift( + self: "pyrogram.Client", + chat_id: Union[int, str], + message_id: int, + ) -> bool: + """Transfer star gift to another user. + + .. include:: /_includes/usable-by/users.rst + + Parameters: + chat_id (``int`` | ``str``): + Unique identifier (int) or username (str) of the target chat you want to transfer the star gift to. + 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). + + message_id (``int``): + Unique message identifier of star gift. + + Returns: + ``bool``: On success, True is returned. + + Example: + .. code-block:: python + + # Show gift + app.transfer_star_gift(chat_id=123, message_id=123) + """ + peer = await self.resolve_peer(chat_id) + + if not isinstance(peer, (raw.types.InputPeerUser, raw.types.InputPeerSelf)): + raise ValueError("chat_id must belong to a user.") + + await self.invoke( + raw.functions.payments.TransferStarGift( + msg_id=message_id, + keep_original_details=keep_details + ) + ) + + return True # TODO: diff --git a/pyrogram/methods/payments/upgrade_star_gift.py b/pyrogram/methods/payments/upgrade_star_gift.py new file mode 100644 index 000000000..312c5cef2 --- /dev/null +++ b/pyrogram/methods/payments/upgrade_star_gift.py @@ -0,0 +1,55 @@ +# Pyrogram - Telegram MTProto API Client Library for Python +# Copyright (C) 2017-present Dan +# +# This file is part of Pyrogram. +# +# Pyrogram is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Pyrogram is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with Pyrogram. If not, see . + +from typing import Optional + +import pyrogram +from pyrogram import raw + + +class UpgradeStarGift: + async def upgrade_star_gift( + self: "pyrogram.Client", + message_id: int, + keep_details: Optional[bool] = None + ) -> bool: + """Upgrade star gift to unique. + + .. include:: /_includes/usable-by/users.rst + + Parameters: + message_id (``int``): + Unique message identifier of star gift. + + Returns: + ``bool``: On success, True is returned. + + Example: + .. code-block:: python + + # Show gift + app.upgrade_star_gift(message_id=123) + """ + await self.invoke( + raw.functions.payments.UpgradeStarGift( + msg_id=message_id, + keep_original_details=keep_details + ) + ) + + return True # TODO: diff --git a/pyrogram/types/messages_and_media/__init__.py b/pyrogram/types/messages_and_media/__init__.py index 1acf6d5a6..629219058 100644 --- a/pyrogram/types/messages_and_media/__init__.py +++ b/pyrogram/types/messages_and_media/__init__.py @@ -43,6 +43,8 @@ from .reaction import Reaction from .read_participant import ReadParticipant from .screenshot_taken import ScreenshotTaken +from .star_gift_attribute import StarGiftAttribute +from .star_gift import StarGift from .sticker import Sticker from .stickerset import StickerSet from .stories_privacy_rules import StoriesPrivacyRules @@ -96,6 +98,11 @@ "StrippedThumbnail", "Poll", "PollOption", + "Reaction", + "RefundedPayment", + "ScreenshotTaken", + "StarGiftAttribute", + "StarGift", "Sticker", "StickerSet", "Venue", diff --git a/pyrogram/types/messages_and_media/message.py b/pyrogram/types/messages_and_media/message.py index d8a352b2b..14820c453 100644 --- a/pyrogram/types/messages_and_media/message.py +++ b/pyrogram/types/messages_and_media/message.py @@ -909,7 +909,7 @@ async def _parse( elif isinstance(action, raw.types.MessageActionStarGift): user_gift = await types.UserGift._parse_action(client, message, users) service_type = enums.MessageServiceType.USER_GIFT - elif isinstance(action, raw.types.MessageActionStarGift): + elif isinstance(action, (raw.types.MessageActionStarGift, raw.types.MessageActionStarGiftUnique)): star_gift = await types.StarGift._parse_action(client, message, users) service_type = enums.MessageServiceType.STAR_GIFT elif isinstance(action, raw.types.MessageActionScreenshotTaken): diff --git a/pyrogram/types/messages_and_media/star_gift.py b/pyrogram/types/messages_and_media/star_gift.py new file mode 100644 index 000000000..8093391d0 --- /dev/null +++ b/pyrogram/types/messages_and_media/star_gift.py @@ -0,0 +1,443 @@ +# Pyrofork - Telegram MTProto API Client Library for Python +# Copyright (C) 2017-present Dan +# Copyright (C) 2022-present Mayuri-Chan +# +# This file is part of Pyrofork. +# +# Pyrofork is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Pyrofork is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with Pyrofork. If not, see . + +from datetime import datetime +from typing import Optional, List + +import pyrogram +from pyrogram import raw +from pyrogram import types +from pyrogram import utils +from ..object import Object + + +class StarGift(Object): + """A star gift. + + Parameters: + id (``int``): + Unique star gift identifier. + + sticker (:obj:`~pyrogram.types.Sticker`, *optional*): + Information about the star gift sticker. + + caption (``str``, *optional*): + Text message. + + caption_entities (List of :obj:`~pyrogram.types.MessageEntity`, *optional*): + For text messages, special entities like usernames, URLs, bot commands, etc. that appear in the text. + + message_id (``int``, *optional*): + Unique message identifier. + + upgrade_message_id (``int``, *optional*): + Unique message identifier. + For unique gifts only. + + title (``str``, *optional*): + Title of the star gift. + For unique gifts only. + + number (``int``, *optional*): + Collectible number of the star gift. + For unique gifts only. + + model (:obj:`~pyrogram.types.StarGiftAttribute`, *optional*): + Information about the star gift model. + For unique gifts only. + + backdrop (:obj:`~pyrogram.types.StarGiftAttribute`, *optional*): + Information about the star gift backdrop. + For unique gifts only. + + symbol (:obj:`~pyrogram.types.StarGiftAttribute`, *optional*): + Information about the star gift symbol. + For unique gifts only. + + date (``datetime``, *optional*): + Date when the star gift was received. + + first_sale_date (``datetime``, *optional*): + Date when the star gift was first purchased. + + last_sale_date (``datetime``, *optional*): + Date when the star gift was last purchased. + + from_user (:obj:`~pyrogram.types.User`, *optional*): + User who sent the star gift. + + price (``int``, *optional*): + Price of this gift in stars. + + convert_price (``int``, *optional*): + The number of stars you get if you convert this gift. + + upgrade_price (``int``, *optional*): + The number of stars you need to upgrade this gift. + + transfer_price (``int``, *optional*): + The number of stars you need to transfer this gift. + + available_amount (``int``, *optional*): + The number of gifts available for purchase. + Returned only if is_limited is True. + + total_amount (``int``, *optional*): + Total amount of gifts. + Returned only if is_limited is True. + + can_upgrade (``bool``, *optional*): + True, if the gift can be upgraded. + + can_export_at (``datetime``, *optional*): + Date when the gift can be exported via blockchain. + + is_limited (``bool``, *optional*): + True, if the number of gifts is limited. + + is_name_hidden (``bool``, *optional*): + True, if the sender's name is hidden. + + is_saved (``bool``, *optional*): + True, if the star gift is saved in profile. + + is_sold_out (``bool``, *optional*): + True, if the star gift is sold out. + + is_converted (``bool``, *optional*): + True, if the gift was converted to Telegram Stars. + Only for the receiver of the gift. + + is_upgraded (``bool``, *optional*): + True, if the gift was upgraded. + + is_refunded (``bool``, *optional*): + True, if the gift was refunded. + + is_transferred (``bool``, *optional*): + True, if the gift was transferred. + + is_unique (``bool``, *optional*): + True, if the gift is unique. + """ + + def __init__( + self, + *, + client: "pyrogram.Client" = None, + id: int, + sticker: "types.Sticker" = None, + caption: Optional[str] = None, + caption_entities: List["types.MessageEntity"] = None, + message_id: Optional[int] = None, + date: Optional[datetime] = None, + first_sale_date: Optional[datetime] = None, + last_sale_date: Optional[datetime] = None, + from_user: Optional["types.User"] = None, + price: Optional[int] = None, + convert_price: Optional[int] = None, + upgrade_price: Optional[int] = None, + transfer_price: Optional[int] = None, + upgrade_message_id: Optional[int] = None, + title: Optional[str] = None, + number: Optional[int] = None, + model: Optional["types.StarGiftAttribute"] = None, + backdrop: Optional["types.StarGiftAttribute"] = None, + symbol: Optional["types.StarGiftAttribute"] = None, + available_amount: Optional[int] = None, + total_amount: Optional[int] = None, + can_upgrade: Optional[bool] = None, + can_export_at: Optional[datetime] = None, + is_limited: Optional[bool] = None, + is_name_hidden: Optional[bool] = None, + is_saved: Optional[bool] = None, + is_sold_out: Optional[bool] = None, + is_converted: Optional[bool] = None, + is_upgraded: Optional[bool] = None, + is_refunded: Optional[bool] = None, + is_transferred: Optional[bool] = None, + is_unique: Optional[bool] = None + ): + super().__init__(client) + + self.id = id + self.sticker = sticker + self.caption = caption + self.caption_entities = caption_entities + self.message_id = message_id + self.date = date + self.first_sale_date = first_sale_date + self.last_sale_date = last_sale_date + self.from_user = from_user + self.price = price + self.convert_price = convert_price + self.upgrade_price = upgrade_price + self.transfer_price = transfer_price + self.upgrade_message_id = upgrade_message_id + self.title = title + self.number = number + self.model = model + self.backdrop = backdrop + self.symbol = symbol + self.available_amount = available_amount + self.total_amount = total_amount + self.can_upgrade = can_upgrade + self.can_export_at = can_export_at + self.is_limited = is_limited + self.is_name_hidden = is_name_hidden + self.is_saved = is_saved + self.is_sold_out = is_sold_out + self.is_converted = is_converted + self.is_upgraded = is_upgraded + self.is_refunded = is_refunded + self.is_transferred = is_transferred + self.is_unique = is_unique + + @staticmethod + async def _parse( + client, + star_gift: "raw.types.StarGift", + ) -> "StarGift": + doc = star_gift.sticker + attributes = {type(i): i for i in doc.attributes} + + return StarGift( + id=star_gift.id, + sticker=await types.Sticker._parse(client, doc, attributes), + price=star_gift.stars, + convert_price=star_gift.convert_stars, + available_amount=getattr(star_gift, "availability_remains", None), + total_amount=getattr(star_gift, "availability_total", None), + is_limited=getattr(star_gift, "limited", None), + first_sale_date=utils.timestamp_to_datetime(getattr(star_gift, "first_sale_date", None)), + last_sale_date=utils.timestamp_to_datetime(getattr(star_gift, "last_sale_date", None)), + is_sold_out=getattr(star_gift, "sold_out", None), + client=client + ) + + @staticmethod + async def _parse_user_star_gift( + client, + user_star_gift: "raw.types.UserStarGift", + users: dict + ) -> "StarGift": + caption, caption_entities = ( + utils.parse_text_with_entities( + client, getattr(user_star_gift, "message", None), users + ) + ).values() + + + if isinstance(user_star_gift.gift, raw.types.StarGift): + doc = user_star_gift.gift.sticker + attributes = {type(i): i for i in doc.attributes} + + return StarGift( + id=user_star_gift.gift.id, + sticker=await types.Sticker._parse(client, doc, attributes), + price=user_star_gift.gift.stars, + convert_price=user_star_gift.gift.convert_stars, + available_amount=getattr(user_star_gift.gift, "availability_remains", None), + total_amount=getattr(user_star_gift.gift, "availability_total", None), + date=utils.timestamp_to_datetime(user_star_gift.date), + is_limited=getattr(user_star_gift.gift, "limited", None), + is_name_hidden=getattr(user_star_gift, "name_hidden", None), + is_saved=not user_star_gift.unsaved if getattr(user_star_gift, "unsaved", None) else None, + is_refunded=getattr(user_star_gift, "refunded", None), + can_upgrade=getattr(user_star_gift, "can_upgrade", None), + can_export_at=utils.timestamp_to_datetime(getattr(user_star_gift, "can_export_at", None)), + upgrade_price=getattr(user_star_gift, "upgrade_stars", None), + transfer_price=getattr(user_star_gift, "transfer_stars", None), + from_user=types.User._parse(client, users.get(user_star_gift.from_id)) if getattr(user_star_gift, "from_id", None) else None, + message_id=getattr(user_star_gift, "msg_id", None), + caption=caption, + caption_entities=caption_entities, + client=client + ) + elif isinstance(user_star_gift.gift, raw.types.StarGiftUnique): + gift = user_star_gift.gift + attributes = {type(i): i for i in gift.attributes} + + model = None + backdrop = None + symbol = None + + for key, value in attributes.items(): + if isinstance(key, raw.types.StarGiftAttributeModel): + model = await types.StarGiftAttribute._parse(client, value) + elif isinstance(key, raw.types.StarGiftAttributeBackdrop): + backdrop = await types.StarGiftAttribute._parse(client, value) + elif isinstance(key, raw.types.StarGiftAttributePattern): + symbol = await types.StarGiftAttribute._parse(client, value) + + return StarGift( + id=user_star_gift.gift.id, + available_amount=getattr(user_star_gift.gift, "availability_issued", None), + total_amount=getattr(user_star_gift.gift, "availability_total", None), + date=utils.timestamp_to_datetime(user_star_gift.date), + model=model, + backdrop=backdrop, + symbol=symbol, + title=gift.title, + number=gift.num, + is_unique=True, + is_name_hidden=getattr(user_star_gift, "name_hidden", None), + is_saved=not user_star_gift.unsaved if getattr(user_star_gift, "unsaved", None) else None, + is_refunded=getattr(user_star_gift, "refunded", None), + can_upgrade=getattr(user_star_gift, "can_upgrade", None), + can_export_at=utils.timestamp_to_datetime(getattr(user_star_gift, "can_export_at", None)), + upgrade_price=getattr(user_star_gift, "upgrade_stars", None), + transfer_price=getattr(user_star_gift, "transfer_stars", None), + from_user=types.User._parse(client, users.get(user_star_gift.from_id)) if getattr(user_star_gift, "from_id", None) else None, + message_id=getattr(user_star_gift, "msg_id", None), + caption=caption, + caption_entities=caption_entities, + client=client + ) + + @staticmethod + async def _parse_action( + client, + message: "raw.base.Message", + users: dict + ) -> "StarGift": + action = message.action # type: raw.types.MessageActionStarGift + + caption, caption_entities = ( + utils.parse_text_with_entities( + client, getattr(action, "message", None), users + ) + ).values() + + if isinstance(action, raw.types.MessageActionStarGift): + doc = action.gift.sticker + attributes = {type(i): i for i in doc.attributes} + + return StarGift( + id=action.gift.id, + sticker=await types.Sticker._parse(client, doc, attributes), + price=action.gift.stars, + convert_price=action.gift.convert_stars, + available_amount=getattr(action.gift, "availability_remains", None), + total_amount=getattr(action.gift, "availability_total", None), + date=utils.timestamp_to_datetime(message.date), + can_upgrade=getattr(action, "can_upgrade", None), + is_limited=getattr(action.gift, "limited", None), + is_name_hidden=getattr(action, "name_hidden", None), + is_saved=getattr(action, "saved", None), + is_converted=getattr(action, "converted", None), + is_upgraded=getattr(action, "upgraded", None), + is_refunded=getattr(action, "refunded", None), + from_user=types.User._parse(client, users.get(utils.get_raw_peer_id(message.peer_id))), + message_id=message.id, + upgrade_message_id=getattr(action, "upgrade_msg_id", None), + upgrade_price=getattr(action, "upgrade_stars", None), + caption=caption, + caption_entities=caption_entities, + client=client + ) + elif isinstance(action, raw.types.MessageActionStarGiftUnique): + gift = action.gift + attributes = {type(i): i for i in gift.attributes} + + model = None + backdrop = None + symbol = None + + for key, value in attributes.items(): + if isinstance(key, raw.types.StarGiftAttributeModel): + model = await types.StarGiftAttribute._parse(client, value) + elif isinstance(key, raw.types.StarGiftAttributeBackdrop): + backdrop = await types.StarGiftAttribute._parse(client, value) + elif isinstance(key, raw.types.StarGiftAttributePattern): + symbol = await types.StarGiftAttribute._parse(client, value) + + return StarGift( + id=action.gift.id, + available_amount=getattr(action.gift, "availability_issued", None), + total_amount=getattr(action.gift, "availability_total", None), + date=utils.timestamp_to_datetime(message.date), + is_unique=True, + from_user=types.User._parse(client, users.get(utils.get_raw_peer_id(message.peer_id))), + message_id=message.id, + caption=caption, + caption_entities=caption_entities, + title=gift.title, + number=gift.num, + model=model, + backdrop=backdrop, + symbol=symbol, + is_upgraded=getattr(action, "upgrade", None), + is_transferred=getattr(action, "transferred", None), + is_saved=getattr(action, "saved", None), + is_refunded=getattr(action, "refunded", None), + can_export_at=utils.timestamp_to_datetime(getattr(action, "can_export_at", None)), + transfer_price=getattr(action, "transfer_stars", None), + client=client + ) + + async def show(self) -> bool: + """Bound method *show* of :obj:`~pyrogram.types.StarGift`. + + Use as a shortcut for: + + .. code-block:: python + + await client.show_star_gift( + chat_id=message.chat.id, + message_id=message_id + ) + + Example: + .. code-block:: python + + await star_gift.show() + + Returns: + ``bool``: On success, True is returned. + """ + return await self._client.show_star_gift( + chat_id=self.from_user.id, + message_id=self.message_id + ) + + async def hide(self) -> bool: + """Bound method *hide* of :obj:`~pyrogram.types.StarGift`. + + Use as a shortcut for: + + .. code-block:: python + + await client.hide_star_gift( + chat_id=message.chat.id, + message_id=message_id + ) + + Example: + .. code-block:: python + + await star_gift.hide() + + Returns: + ``bool``: On success, True is returned. + """ + return await self._client.hide_star_gift( + chat_id=self.from_user.id, + message_id=self.message_id + ) \ No newline at end of file diff --git a/pyrogram/types/messages_and_media/star_gift_attribute.py b/pyrogram/types/messages_and_media/star_gift_attribute.py new file mode 100644 index 000000000..99972b7e4 --- /dev/null +++ b/pyrogram/types/messages_and_media/star_gift_attribute.py @@ -0,0 +1,80 @@ +# Pyrofork - Telegram MTProto API Client Library for Python +# Copyright (C) 2017-present Dan +# Copyright (C) 2022-present Mayuri-Chan +# +# This file is part of Pyrofork. +# +# Pyrofork is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Pyrofork is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with Pyrofork. If not, see . + +from datetime import datetime +from typing import Optional, List + +import pyrogram +from pyrogram import raw +from pyrogram import types +from pyrogram import enums +from pyrogram import utils +from ..object import Object + + +class StarGiftAttribute(Object): + """Contains information about a star gift attribute. + + Parameters: + name (``str``): + Name of the attribute. + + type (:obj:`~pyrogram.enums.StarGiftAttributeType`): + Type of the attribute. + + rarity (``int``): + Rarity of the attribute in permilles. + For example, 15 means 1.5%. So only 1.5% of such collectibles have this attribute. + + sticker (:obj:`~pyrogram.types.Sticker`): + Information about the sticker. + """ + + def __init__( + self, + *, + client: "pyrogram.Client" = None, + name: str, + type: "enums.StarGiftAttributeType", + rarity: int, + sticker: "types.Sticker", + ): + super().__init__(client) + + self.name = name + self.type = type + self.rarity = rarity + self.sticker = sticker + # TODO: Add support for raw.types.StarGiftAttributeOriginalDetails + + @staticmethod + async def _parse( + client, + attr: "raw.base.StarGiftAttribute", + ) -> "StarGiftAttribute": + doc = attr.document + attributes = {type(i): i for i in doc.attributes} + + return StarGiftAttribute( + name=attr.name, + type=enums.StarGiftAttributeType(type(attr)), + sticker=await types.Sticker._parse(client, doc, attributes), + rarity=attr.rarity_permille, + client=client + )