diff --git a/docs/source/api/decorators.rst b/docs/source/api/decorators.rst index c145c3d1d..7551c3219 100644 --- a/docs/source/api/decorators.rst +++ b/docs/source/api/decorators.rst @@ -35,6 +35,7 @@ Index .. hlist:: :columns: 3 + - :meth:`~Client.on_bot_business_connect` - :meth:`~Client.on_message` - :meth:`~Client.on_bot_business_message` - :meth:`~Client.on_edited_message` @@ -60,6 +61,7 @@ Details ------- .. Decorators +.. autodecorator:: pyrogram.Client.on_bot_business_connect() .. autodecorator:: pyrogram.Client.on_message() .. autodecorator:: pyrogram.Client.on_bot_business_message() .. autodecorator:: pyrogram.Client.on_edited_message() diff --git a/docs/source/api/handlers.rst b/docs/source/api/handlers.rst index 127fd9fe9..ea6b30a01 100644 --- a/docs/source/api/handlers.rst +++ b/docs/source/api/handlers.rst @@ -35,6 +35,7 @@ Index .. hlist:: :columns: 3 + - :class:`BotBusinessConnectHandler` - :class:`MessageHandler` - :class:`BotBusinessMessageHandler` - :class:`EditedMessageHandler` @@ -59,6 +60,7 @@ Details ------- .. Handlers +.. autoclass:: BotBusinessConnectHandler() .. autoclass:: MessageHandler() .. autoclass:: BotBusinessMessageHandler() .. autoclass:: EditedMessageHandler() diff --git a/pyrogram/dispatcher.py b/pyrogram/dispatcher.py index 1f32147b9..770993996 100644 --- a/pyrogram/dispatcher.py +++ b/pyrogram/dispatcher.py @@ -25,6 +25,7 @@ import pyrogram from pyrogram import utils from pyrogram.handlers import ( + BotBusinessConnectHandler, BotBusinessMessageHandler, CallbackQueryHandler, MessageHandler, @@ -46,6 +47,7 @@ ) from pyrogram.raw.types import ( UpdateNewMessage, UpdateNewChannelMessage, UpdateNewScheduledMessage, + UpdateBotBusinessConnect, UpdateBotNewBusinessMessage, UpdateBotDeleteBusinessMessage, UpdateBotEditBusinessMessage, UpdateEditMessage, UpdateEditChannelMessage, UpdateDeleteMessages, UpdateDeleteChannelMessages, @@ -77,6 +79,7 @@ class Dispatcher: NEW_STORY_UPDATES = (UpdateStory,) MESSAGE_BOT_NA_REACTION_UPDATES = (UpdateBotMessageReaction,) MESSAGE_BOT_A_REACTION_UPDATES = (UpdateBotMessageReactions,) + BOT_BUSSINESS_CONNECT_UPDATES = (UpdateBotBusinessConnect,) def __init__(self, client: "pyrogram.Client"): self.client = client @@ -200,6 +203,12 @@ async def message_bot_a_reaction_parser(update, users, chats): MessageReactionCountUpdatedHandler ) + async def bot_business_connect_parser(update, users, chats): + return ( + await pyrogram.types.BotBusinessConnection._parse(self.client, update), + BotBusinessConnectHandler + ) + self.update_parsers = { Dispatcher.NEW_MESSAGE_UPDATES: message_parser, Dispatcher.NEW_BOT_BUSINESS_MESSAGE_UPDATES: bot_business_message_parser, @@ -216,7 +225,8 @@ async def message_bot_a_reaction_parser(update, users, chats): Dispatcher.CHAT_JOIN_REQUEST_UPDATES: chat_join_request_parser, Dispatcher.NEW_STORY_UPDATES: story_parser, Dispatcher.MESSAGE_BOT_NA_REACTION_UPDATES: message_bot_na_reaction_parser, - Dispatcher.MESSAGE_BOT_A_REACTION_UPDATES: message_bot_a_reaction_parser + Dispatcher.MESSAGE_BOT_A_REACTION_UPDATES: message_bot_a_reaction_parser, + Dispatcher.BOT_BUSSINESS_CONNECT_UPDATES: bot_business_connect_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 a5d269924..e55ae028e 100644 --- a/pyrogram/handlers/__init__.py +++ b/pyrogram/handlers/__init__.py @@ -17,6 +17,7 @@ # You should have received a copy of the GNU Lesser General Public License # along with Pyrofork. If not, see . +from .bot_business_connect_handler import BotBusinessConnectHandler from .bot_business_message_handler import BotBusinessMessageHandler from .callback_query_handler import CallbackQueryHandler from .chat_join_request_handler import ChatJoinRequestHandler diff --git a/pyrogram/handlers/bot_business_connect_handler.py b/pyrogram/handlers/bot_business_connect_handler.py new file mode 100644 index 000000000..9fdeecd24 --- /dev/null +++ b/pyrogram/handlers/bot_business_connect_handler.py @@ -0,0 +1,49 @@ +# Pyrofork - Telegram MTProto API Client Library for Python +# 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 typing import Callable + +from .handler import Handler + + +class BotBusinessConnectHandler(Handler): + """The Bot Business Connection handler class. Used to handle new bot business connection. + 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_bot_business_connect` decorator. + + Parameters: + callback (``Callable``): + Pass a function that will be called when a new Stories arrives. It takes *(client, story)* + 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 stories 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 story handler. + + story (:obj:`~pyrogram.types.BotBusinessConnection`): + Information about the received Bot Business Connection. + """ + + 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 1cd79b126..8b978eeae 100644 --- a/pyrogram/methods/decorators/__init__.py +++ b/pyrogram/methods/decorators/__init__.py @@ -17,6 +17,7 @@ # You should have received a copy of the GNU Lesser General Public License # along with Pyrofork. If not, see . +from .on_bot_business_connect import OnBotBusinessConnect from .on_bot_business_message import OnBotBusinessMessage from .on_callback_query import OnCallbackQuery from .on_chat_join_request import OnChatJoinRequest @@ -38,6 +39,7 @@ class Decorators( + OnBotBusinessConnect, OnMessage, OnBotBusinessMessage, OnEditedMessage, diff --git a/pyrogram/methods/decorators/on_bot_business_connect.py b/pyrogram/methods/decorators/on_bot_business_connect.py new file mode 100644 index 000000000..59e5c4849 --- /dev/null +++ b/pyrogram/methods/decorators/on_bot_business_connect.py @@ -0,0 +1,62 @@ +# Pyrofork - Telegram MTProto API Client Library for Python +# 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 typing import Callable + +import pyrogram +from pyrogram.filters import Filter + + +class OnBotBusinessConnect: + def on_bot_business_connect( + self=None, + filters=None, + group: int = 0 + ) -> Callable: + """Decorator for handling bot business connection. + + This does the same thing as :meth:`~pyrogram.Client.add_handler` using the + :obj:`~pyrogram.handlers.BotBusinessConnectHandler`. + + Parameters: + filters (:obj:`~pyrogram.filters`, *optional*): + Pass one or more filters to allow only a subset of stories 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.BotBusinessConnectHandler(func, filters), group) + elif isinstance(self, Filter) or self is None: + if not hasattr(func, "handlers"): + func.handlers = [] + + func.handlers.append( + ( + pyrogram.handlers.BotBusinessConnectHandler(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 eefcf779a..78132892b 100644 --- a/pyrogram/types/bots_and_keyboards/__init__.py +++ b/pyrogram/types/bots_and_keyboards/__init__.py @@ -17,6 +17,7 @@ # You should have received a copy of the GNU Lesser General Public License # along with Pyrofork. If not, see . +from .bot_business_connection import BotBusinessConnection from .bot_command import BotCommand from .bot_command_scope import BotCommandScope from .bot_command_scope_all_chat_administrators import BotCommandScopeAllChatAdministrators @@ -48,6 +49,7 @@ from .web_app_info import WebAppInfo __all__ = [ + "BotBusinessConnection", "CallbackGame", "CallbackQuery", "ForceReply", diff --git a/pyrogram/types/bots_and_keyboards/bot_business_connection.py b/pyrogram/types/bots_and_keyboards/bot_business_connection.py new file mode 100644 index 000000000..aba4866d6 --- /dev/null +++ b/pyrogram/types/bots_and_keyboards/bot_business_connection.py @@ -0,0 +1,81 @@ +# Pyrofork - Telegram MTProto API Client Library for Python +# 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 . + +import datetime +import pyrogram +from pyrogram import raw, utils + +from ..object import Object + + +class BotBusinessConnection(Object): + """A bot business connection Information. + + Parameters: + bot_connection_id (``str``): + The business connection identifier. + + user (:obj:`~pyrogram.types.User`): + The user that connected to the bot. + + dc_id (``int``): + The user datacenter. + + date (:py:obj:`~datetime.datetime`): + Date the connection was established in Unix time. + + can_reply (``bool``, *optional*): + Whether the bot can reply. + + is_disabled (``bool``, *optional*): + Whether the connection is disabled. + """ + def __init__( + self, + *, + client: "pyrogram.Client" = None, + bot_connection_id: str, + user: "pyrogram.types.User", + dc_id: int, + date: "datetime.datetime", + can_reply: bool = None, + is_disabled: bool = None + ): + super().__init__(client) + + self.bot_connection_id = bot_connection_id + self.user = user + self.dc_id = dc_id + self.date = date + self.can_reply = can_reply + self.is_disabled = is_disabled + + @staticmethod + async def _parse( + client: "pyrogram.Client", + bot_connection: "raw.types.BotBusinessConnection" + ) -> "BotBusinessConnection": + return BotBusinessConnection( + bot_connection_id = bot_connection.connection_id, + user = await client.get_users(bot_connection.user_id), + dc_id = bot_connection.dc_id, + date = utils.timestamp_to_datetime(bot_connection.date), + can_reply = bot_connection.can_reply, + is_disabled = bot_connection.disabled, + client=client + )