Add on_purchased_paid_media decorator

Signed-off-by: wulan17 <wulan17@nusantararom.org>
This commit is contained in:
KurimuzonAkuma 2024-09-06 18:30:57 +03:00 committed by wulan17
parent f07d6563e3
commit d70927e5a2
No known key found for this signature in database
GPG key ID: 318CD6CD3A6AC0A5
9 changed files with 181 additions and 5 deletions

View file

@ -593,6 +593,7 @@ def pyrogram_api():
MenuButtonDefault
SentWebAppMessage
PreCheckoutQuery
PurchasedPaidMedia
""",
bot_commands="""
Bot commands

View file

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

View file

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

View file

@ -0,0 +1,49 @@
# Pyrogram - Telegram MTProto API Client Library for Python
# Copyright (C) 2017-present Dan <https://github.com/delivrance>
#
# 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 <http://www.gnu.org/licenses/>.
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)

View file

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

View file

@ -0,0 +1,62 @@
# Pyrogram - Telegram MTProto API Client Library for Python
# Copyright (C) 2017-present Dan <https://github.com/delivrance>
#
# 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 <http://www.gnu.org/licenses/>.
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

View file

@ -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"
]

View file

@ -0,0 +1,50 @@
# Pyrogram - Telegram MTProto API Client Library for Python
# Copyright (C) 2017-present Dan <https://github.com/delivrance>
#
# 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 <http://www.gnu.org/licenses/>.
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
)

View file

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