diff --git a/compiler/docs/compiler.py b/compiler/docs/compiler.py index e9a81a08..12073d40 100644 --- a/compiler/docs/compiler.py +++ b/compiler/docs/compiler.py @@ -510,7 +510,6 @@ def pyrogram_api(): ReactionType MessageReactionUpdated MessageReactionCountUpdated - SuccessfulPayment """, stories=""" Stories @@ -531,9 +530,17 @@ def pyrogram_api(): Identifier Listener """, + bot=""" + Bot + BotAllowed + BotApp + BotBusinessConnection + PaymentInfo + ShippingAddress + SuccessfulPayment + """, bot_keyboards=""" Bot keyboards - BotBusinessConnection ReplyKeyboardMarkup KeyboardButton ReplyKeyboardRemove @@ -554,9 +561,7 @@ def pyrogram_api(): MenuButtonWebApp MenuButtonDefault SentWebAppMessage - PaymentInfo PreCheckoutQuery - ShippingAddress """, bot_commands=""" Bot commands diff --git a/pyrogram/enums/message_service_type.py b/pyrogram/enums/message_service_type.py index b53b7f50..d89cedde 100644 --- a/pyrogram/enums/message_service_type.py +++ b/pyrogram/enums/message_service_type.py @@ -114,3 +114,6 @@ class MessageServiceType(AutoName): SUCCESSFUL_PAYMENT = auto() "Successful payment" + + BOT_ALLOWED = auto() + "Bot allowed" \ No newline at end of file diff --git a/pyrogram/types/bots_and_keyboards/__init__.py b/pyrogram/types/bots_and_keyboards/__init__.py index bbe957ed..d23b000c 100644 --- a/pyrogram/types/bots_and_keyboards/__init__.py +++ b/pyrogram/types/bots_and_keyboards/__init__.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 .bot_allowed import BotAllowed +from .bot_app import BotApp from .bot_business_connection import BotBusinessConnection from .bot_command import BotCommand from .bot_command_scope import BotCommandScope @@ -55,6 +57,8 @@ from .successful_payment import SuccessfulPayment from .web_app_info import WebAppInfo __all__ = [ + "BotAllowed", + "BotApp", "BotBusinessConnection", "CallbackGame", "CallbackQuery", diff --git a/pyrogram/types/bots_and_keyboards/bot_allowed.py b/pyrogram/types/bots_and_keyboards/bot_allowed.py new file mode 100644 index 00000000..d41d687d --- /dev/null +++ b/pyrogram/types/bots_and_keyboards/bot_allowed.py @@ -0,0 +1,68 @@ +# 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 pyrogram + +from typing import Optional + +from pyrogram import raw, types +from ..object import Object + + +class BotAllowed(Object): + + """Contains information about a allowed bot. + + Parameters: + attach_menu (``bool``, *optional*): + True, if the bot can attach to menu. + + from_request (``bool``, *optional*): + True, if the bot is allowed from request. + + domain (``str``, *optional*): + The domain of the bot. + + app (:obj:`types.BotApp`, *optional*): + The app of the bot. + """ + + def __init__( + self, + *, + attach_menu: Optional[bool] = None, + from_request: Optional[bool] = None, + domain: Optional[str] = None, + app: Optional["types.BotApp"] = None + ): + super().__init__() + + self.attach_menu = attach_menu + self.from_request = from_request + self.domain = domain + self.app = app + + @staticmethod + def _parse(client: "pyrogram.Client", bot_allowed: "raw.types.BotAllowed") -> "BotAllowed": + bot_app = getattr(bot_allowed, "app", None) + return BotAllowed( + attach_menu=getattr(bot_allowed, "attach_menu", None), + from_request=getattr(bot_allowed, "from_request", None), + domain=getattr(bot_allowed, "domain", None), + app=types.BotApp._parse(client, bot_app) if bot_app is not None else None + ) diff --git a/pyrogram/types/bots_and_keyboards/bot_app.py b/pyrogram/types/bots_and_keyboards/bot_app.py new file mode 100644 index 00000000..6e41ee1f --- /dev/null +++ b/pyrogram/types/bots_and_keyboards/bot_app.py @@ -0,0 +1,87 @@ +# 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 pyrogram + +from typing import Optional + +from pyrogram import raw, types +from ..object import Object + + +class BotApp(Object): + + """Contains information about a bot app. + + Parameters: + id (``int``): + The id of the app. + + short_name (``str``): + The short name of the app. + + title (``str``): + The title of the app. + + description (``str``): + The description of the app. + + photo (``types.Photo``): + The photo of the app. + + document (``types.Document``, *optional*): + The document of the app. + """ + + def __init__( + self, + id: int, + short_name: str, + title: str, + description: str, + photo: "types.Photo", + document: Optional["types.Document"] = None + ): + super().__init__() + + self.id = id + self.short_name = short_name + self.title = title + self.description = description + self.photo = photo + self.document = document + + @staticmethod + def _parse(client: "pyrogram.Client", bot_app: "raw.types.BotApp") -> "BotApp": + document = None + if isinstance(bot_app.document, raw.types.Document): + attributes = {type(i): i for i in bot_app.document.attributes} + file_name = getattr( + attributes.get( + raw.types.DocumentAttributeFilename, None + ), "file_name", None + ) + document = types.Document._parse(client, bot_app.document, file_name) + return BotApp( + id=bot_app.id, + short_name=bot_app.short_name, + title=bot_app.title, + description=bot_app.description, + photo=types.Photo._parse(client, bot_app.photo), + document=document + ) diff --git a/pyrogram/types/messages_and_media/message.py b/pyrogram/types/messages_and_media/message.py index 2dda435c..b455530f 100644 --- a/pyrogram/types/messages_and_media/message.py +++ b/pyrogram/types/messages_and_media/message.py @@ -341,6 +341,9 @@ class Message(Object, Update): E.g.: "/start 1 2 3" would produce ["start", "1", "2", "3"]. Only applicable when using :obj:`~pyrogram.filters.command`. + bot_allowed (:obj:`~pyrogram.types.BotAllowed`, *optional*): + Contains information about a allowed bot. + chat_shared (List of ``int``, *optional*): Service message: chat/channel shared @@ -506,6 +509,7 @@ class Message(Object, Update): outgoing: bool = None, matches: List[Match] = None, command: List[str] = None, + bot_allowed: "types.BotAllowed" = None, chat_shared: List[int] = None, user_shared: List[int] = None, forum_topic_created: "types.ForumTopicCreated" = None, @@ -617,6 +621,7 @@ class Message(Object, Update): self.matches = matches self.command = command self.reply_markup = reply_markup + self.bot_allowed = bot_allowed self.chat_shared = chat_shared self.user_shared = user_shared self.forum_topic_created = forum_topic_created @@ -720,6 +725,7 @@ class Message(Object, Update): group_chat_created = None channel_chat_created = None new_chat_photo = None + bot_allowed = None chat_shared = None user_shared = None is_topic_message = None @@ -778,6 +784,9 @@ class Message(Object, Update): elif isinstance(action, raw.types.MessageActionChatEditPhoto): new_chat_photo = types.Photo._parse(client, action.photo) service_type = enums.MessageServiceType.NEW_CHAT_PHOTO + elif isinstance(action, raw.types.MessageActionBotAllowed): + bot_allowed = types.BotAllowed._parse(client, action) + service_type = enums.MessageServiceType.BOT_ALLOWED elif isinstance(action, raw.types.MessageActionRequestedPeer): chat_shared = [] user_shared = [] @@ -861,6 +870,7 @@ class Message(Object, Update): migrate_to_chat_id=utils.get_channel_id(migrate_to_chat_id) if migrate_to_chat_id else None, migrate_from_chat_id=-migrate_from_chat_id if migrate_from_chat_id else None, group_chat_created=group_chat_created, + bot_allowed=bot_allowed, channel_chat_created=channel_chat_created, chat_shared=chat_shared if chat_shared is not None and len(chat_shared) > 0 else None, user_shared=user_shared if user_shared is not None and len(user_shared) > 0 else None,