From d70927e5a22b5b4a83989f696d3f57b2d3a596f2 Mon Sep 17 00:00:00 2001 From: KurimuzonAkuma Date: Fri, 6 Sep 2024 18:30:57 +0300 Subject: [PATCH] Add on_purchased_paid_media decorator Signed-off-by: wulan17 --- compiler/docs/compiler.py | 1 + pyrogram/dispatcher.py | 13 +++- pyrogram/handlers/__init__.py | 1 + .../handlers/purchased_paid_media_handler.py | 49 +++++++++++++++ pyrogram/methods/decorators/__init__.py | 4 +- .../decorators/on_purchased_paid_media.py | 62 +++++++++++++++++++ pyrogram/types/bots_and_keyboards/__init__.py | 4 +- .../purchased_paid_media.py | 50 +++++++++++++++ pyrogram/types/business/shipping_query.py | 2 +- 9 files changed, 181 insertions(+), 5 deletions(-) create mode 100644 pyrogram/handlers/purchased_paid_media_handler.py create mode 100644 pyrogram/methods/decorators/on_purchased_paid_media.py create mode 100644 pyrogram/types/bots_and_keyboards/purchased_paid_media.py diff --git a/compiler/docs/compiler.py b/compiler/docs/compiler.py index b70f180e..3c1f3c6d 100644 --- a/compiler/docs/compiler.py +++ b/compiler/docs/compiler.py @@ -593,6 +593,7 @@ def pyrogram_api(): MenuButtonDefault SentWebAppMessage PreCheckoutQuery + PurchasedPaidMedia """, bot_commands=""" Bot commands diff --git a/pyrogram/dispatcher.py b/pyrogram/dispatcher.py index d312cb9c..0f8a6456 100644 --- a/pyrogram/dispatcher.py +++ b/pyrogram/dispatcher.py @@ -62,7 +62,8 @@ from pyrogram.raw.types import ( UpdateBotMessageReaction, UpdateBotMessageReactions, UpdateBotShippingQuery, - UpdateBusinessBotCallbackQuery + UpdateBusinessBotCallbackQuery, + UpdateBotPurchasedPaidMedia ) log = logging.getLogger(__name__) @@ -88,6 +89,7 @@ class Dispatcher: BOT_BUSSINESS_CONNECT_UPDATES = (UpdateBotBusinessConnect,) PRE_CHECKOUT_QUERY_UPDATES = (UpdateBotPrecheckoutQuery,) SHIPPING_QUERY_UPDATES = (UpdateBotShippingQuery,) + PURCHASED_PAID_MEDIA_UPDATES = (UpdateBotPurchasedPaidMedia,) def __init__(self, client: "pyrogram.Client"): self.client = client @@ -229,6 +231,12 @@ class Dispatcher: BotBusinessConnectHandler ) + async def purchased_paid_media_parser(update, users, chats): + return ( + pyrogram.types.PurchasedPaidMedia._parse(self.client, update, users), + ChatBoostHandler + ) + self.update_parsers = { Dispatcher.NEW_MESSAGE_UPDATES: message_parser, Dispatcher.NEW_BOT_BUSINESS_MESSAGE_UPDATES: bot_business_message_parser, @@ -248,7 +256,8 @@ class Dispatcher: Dispatcher.PRE_CHECKOUT_QUERY_UPDATES: pre_checkout_query_parser, Dispatcher.MESSAGE_BOT_NA_REACTION_UPDATES: message_bot_na_reaction_parser, Dispatcher.MESSAGE_BOT_A_REACTION_UPDATES: message_bot_a_reaction_parser, - Dispatcher.BOT_BUSSINESS_CONNECT_UPDATES: bot_business_connect_parser + Dispatcher.BOT_BUSSINESS_CONNECT_UPDATES: bot_business_connect_parser, + Dispatcher.PURCHASED_PAID_MEDIA_UPDATES: purchased_paid_media_parser } self.update_parsers = {key: value for key_tuple, value in self.update_parsers.items() for key in key_tuple} diff --git a/pyrogram/handlers/__init__.py b/pyrogram/handlers/__init__.py index 29f798ab..eb879a4d 100644 --- a/pyrogram/handlers/__init__.py +++ b/pyrogram/handlers/__init__.py @@ -33,6 +33,7 @@ from .inline_query_handler import InlineQueryHandler from .message_handler import MessageHandler from .poll_handler import PollHandler from .pre_checkout_query_handler import PreCheckoutQueryHandler +from .purchased_paid_media_handler import PurchasedPaidMediaHandler from .raw_update_handler import RawUpdateHandler from .user_status_handler import UserStatusHandler from .story_handler import StoryHandler diff --git a/pyrogram/handlers/purchased_paid_media_handler.py b/pyrogram/handlers/purchased_paid_media_handler.py new file mode 100644 index 00000000..bca3c182 --- /dev/null +++ b/pyrogram/handlers/purchased_paid_media_handler.py @@ -0,0 +1,49 @@ +# 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 Callable + +from .handler import Handler + + +class PurchasedPaidMediaHandler(Handler): + """The PurchasedPaidMedia handler class. Used to handle purchased paid medias. + It is intended to be used with :meth:`~pyrogram.Client.add_handler` + + For a nicer way to register this handler, have a look at the + :meth:`~pyrogram.Client.on_purchased_paid_media` decorator. + + Parameters: + callback (``Callable``): + Pass a function that will be called when a paid media purchased. It takes *(client, update)* + as positional arguments (look at the section below for a detailed description). + + filters (:obj:`Filters`): + Pass one or more filters to allow only a subset of updates to be passed + in your callback function. + + Other parameters: + client (:obj:`~pyrogram.Client`): + The Client itself, useful when you want to call other API methods inside the handler. + + update (:obj:`~pyrogram.types.PurchasedPaidMedia`): + Information about who bought paid media. + """ + + def __init__(self, callback: Callable, filters=None): + super().__init__(callback, filters) diff --git a/pyrogram/methods/decorators/__init__.py b/pyrogram/methods/decorators/__init__.py index 8a1818dc..402b7e26 100644 --- a/pyrogram/methods/decorators/__init__.py +++ b/pyrogram/methods/decorators/__init__.py @@ -32,6 +32,7 @@ from .on_inline_query import OnInlineQuery from .on_message import OnMessage from .on_poll import OnPoll from .on_pre_checkout_query import OnPreCheckoutQuery +from .on_purchased_paid_media import OnPurchasedPaidMedia from .on_raw_update import OnRawUpdate from .on_user_status import OnUserStatus from .on_story import OnStory @@ -61,6 +62,7 @@ class Decorators( OnChatJoinRequest, OnStory, OnMessageReactionUpdated, - OnMessageReactionCountUpdated + OnMessageReactionCountUpdated, + OnPurchasedPaidMedia ): pass diff --git a/pyrogram/methods/decorators/on_purchased_paid_media.py b/pyrogram/methods/decorators/on_purchased_paid_media.py new file mode 100644 index 00000000..63673efc --- /dev/null +++ b/pyrogram/methods/decorators/on_purchased_paid_media.py @@ -0,0 +1,62 @@ +# 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 Callable + +import pyrogram +from pyrogram.filters import Filter + + +class OnPurchasedPaidMedia: + def on_purchased_paid_media( + self=None, + filters=None, + group: int = 0 + ) -> Callable: + """Decorator for handling purchased paid media. + + This does the same thing as :meth:`~pyrogram.Client.add_handler` using the + :obj:`~pyrogram.handlers.PurchasedPaidMediaHandler`. + + .. include:: /_includes/usable-by/bots.rst + + Parameters: + filters (:obj:`~pyrogram.filters`, *optional*): + Pass one or more filters to allow only a subset of updates to be passed in your function. + + group (``int``, *optional*): + The group identifier, defaults to 0. + """ + + def decorator(func: Callable) -> Callable: + if isinstance(self, pyrogram.Client): + self.add_handler(pyrogram.handlers.MessageReactionHandler(func, filters), group) + elif isinstance(self, Filter) or self is None: + if not hasattr(func, "handlers"): + func.handlers = [] + + func.handlers.append( + ( + pyrogram.handlers.MessageReactionHandler(func, self), + group if filters is None else filters + ) + ) + + return func + + return decorator diff --git a/pyrogram/types/bots_and_keyboards/__init__.py b/pyrogram/types/bots_and_keyboards/__init__.py index c8228b58..964d8b1f 100644 --- a/pyrogram/types/bots_and_keyboards/__init__.py +++ b/pyrogram/types/bots_and_keyboards/__init__.py @@ -54,6 +54,7 @@ from .requested_chats import RequestedChats from .requested_user import RequestedUser from .sent_web_app_message import SentWebAppMessage from .web_app_info import WebAppInfo +from .purchased_paid_media import PurchasedPaidMedia __all__ = [ "BotAllowed", @@ -92,5 +93,6 @@ __all__ = [ "MenuButtonCommands", "MenuButtonWebApp", "MenuButtonDefault", - "SentWebAppMessage" + "SentWebAppMessage", + "PurchasedPaidMedia" ] diff --git a/pyrogram/types/bots_and_keyboards/purchased_paid_media.py b/pyrogram/types/bots_and_keyboards/purchased_paid_media.py new file mode 100644 index 00000000..75755106 --- /dev/null +++ b/pyrogram/types/bots_and_keyboards/purchased_paid_media.py @@ -0,0 +1,50 @@ +# 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, types + +from ..object import Object + + +class PurchasedPaidMedia(Object): + """This object represents information about purchased paid media. + + Parameters: + from_user (:obj:`~pyrogram.types.User`): + User who bought the paid media. + + payload (``str``): + Bot-defined invoice payload, 1-128 bytes. This will not be displayed to the user, use for your internal processes. + """ + + def __init__( + self, + from_user: "types.User", + payload: str + ): + super().__init__() + + self.from_user = from_user + self.payload = payload + + @staticmethod + def _parse(client, purchased_media: "raw.types.UpdateBotPurchasedPaidMedia", users) -> "PurchasedPaidMedia": + return PurchasedPaidMedia( + from_user=types.User._parse(client, users.get(purchased_media.user_id)), + payload=purchased_media.payload + ) diff --git a/pyrogram/types/business/shipping_query.py b/pyrogram/types/business/shipping_query.py index 89114491..e11ba93d 100644 --- a/pyrogram/types/business/shipping_query.py +++ b/pyrogram/types/business/shipping_query.py @@ -36,7 +36,7 @@ class ShippingQuery(Object, Update): User who sent the query. invoice_payload (``str``): - Bot specified invoice payload. Only available to the bot that received the payment. + Bot-defined invoice payload, 1-128 bytes. This will not be displayed to the user, use for your internal processes. shipping_address (:obj:`~pyrogram.types.ShippingAddress`): User specified shipping address. Only available to the bot that received the payment.