From ea33dc43a4e1669225bdcedac862df895c6a2f18 Mon Sep 17 00:00:00 2001 From: wulan17 Date: Thu, 10 Nov 2022 23:34:18 +0700 Subject: [PATCH] Pyrofork: Add Forum Topic Support Signed-off-by: wulan17 Pyrofork: Add ForumTopicCreated, ForumTopicClosed, ForumTopicReopened, ForumTopicEdited service message types Signed-off-by: wulan17 Pyrofork: Add can_manage_topics fields to ChatPrivileges and ChatPermissions class Signed-off-by: wulan17 Pyrofork: Add manage_topics parameter to promote_chat_member, restrict_chat_member, and set_chat_permissions methods Signed-off-by: wulan17 Pyrofork: Add message_thread_id parameter to send_{animation,audio,cached_media,contact,dice,document,location,media_group,message,photo,poll,sticker,venue,video,video_note,voice} methods Signed-off-by: wulan17 Pyrogram: Add message_thread_id parameter to forward_message() method and forward() bound method Signed-off-by: wulan17 Pyrofork: Add message_thread_id parameter to send_game() method and copy() bound method Signed-off-by: wulan17 Pyrogram: Add ForumTopic and some cleanup Signed-off-by: wulan17 Pyrofork: Add {create,close,reopen,edit,delete}_forum_topic methods Signed-off-by: wulan17 Pyrofork: Add message_thread_id parameter to copy_message method Signed-off-by: wulan17 Pyrofork: Add {CREATED,EDITED,DELETED}_FORUM_TOPIC ChatEvent Signed-off-by: wulan17 Pyrofork: utils: Check if messages has topics atribut Signed-off-by: wulan17 Pyrogram: types: Message: Add error handling and is_topic_message Signed-off-by: wulan17 Pyrofork: Add message_thread_id parameter to send_inline_bot_result() Signed-off-by: wulan17 Pyrofork: add GeneralTopicHidden and GeneralTopicUnhidden service messages types Signed-off-by: wulan17 Pyrofork: add message_thread_id parameter to send_chat_action Signed-off-by: wulan17 PyroFork: Add CloseGeneralTopic, EditGeneralTopic, ReopenGeneralTopic, HideGeneralTopic. UnhideGeneralTopic, and some cleanup Signed-off-by: wulan17 PyroFork: Add get_forum_topic and get_forum_topic_by_id methods Signed-off-by: wulan17 Pyrofork: Update some methods to layer 160 Signed-off-by: wulan17 pyrofork: Add InputReplyToMessage Signed-off-by: wulan17 PyroFork: docs: Add missing PeerUser and PeerChannel and some cleanup Signed-off-by: wulan17 --- compiler/docs/compiler.py | 22 +++ pyrogram/enums/chat_event_action.py | 20 ++- pyrogram/enums/message_service_type.py | 18 ++ pyrogram/methods/bots/send_game.py | 22 ++- .../methods/bots/send_inline_bot_result.py | 23 ++- pyrogram/methods/chats/__init__.py | 35 +++- pyrogram/methods/chats/close_forum_topic.py | 56 +++++++ pyrogram/methods/chats/close_general_topic.py | 52 ++++++ pyrogram/methods/chats/create_forum_topic.py | 67 ++++++++ pyrogram/methods/chats/delete_forum_topic.py | 59 +++++++ pyrogram/methods/chats/edit_forum_topic.py | 65 ++++++++ pyrogram/methods/chats/edit_general_topic.py | 56 +++++++ pyrogram/methods/chats/get_forum_topics.py | 69 ++++++++ .../methods/chats/get_forum_topics_by_id.py | 91 ++++++++++ pyrogram/methods/chats/hide_general_topic.py | 52 ++++++ pyrogram/methods/chats/promote_chat_member.py | 12 +- pyrogram/methods/chats/reopen_forum_topic.py | 56 +++++++ .../methods/chats/reopen_general_topic.py | 52 ++++++ .../methods/chats/restrict_chat_member.py | 12 +- .../methods/chats/set_chat_permissions.py | 12 +- .../methods/chats/unhide_general_topic.py | 52 ++++++ pyrogram/methods/messages/copy_media_group.py | 23 ++- pyrogram/methods/messages/copy_message.py | 17 +- pyrogram/methods/messages/forward_messages.py | 6 + pyrogram/methods/messages/send_animation.py | 22 ++- pyrogram/methods/messages/send_audio.py | 22 ++- .../methods/messages/send_cached_media.py | 22 ++- pyrogram/methods/messages/send_chat_action.py | 21 ++- pyrogram/methods/messages/send_contact.py | 23 ++- pyrogram/methods/messages/send_dice.py | 22 ++- pyrogram/methods/messages/send_document.py | 22 ++- pyrogram/methods/messages/send_location.py | 23 ++- pyrogram/methods/messages/send_media_group.py | 22 ++- pyrogram/methods/messages/send_message.py | 22 ++- pyrogram/methods/messages/send_photo.py | 22 ++- pyrogram/methods/messages/send_poll.py | 22 ++- pyrogram/methods/messages/send_sticker.py | 22 ++- pyrogram/methods/messages/send_venue.py | 23 ++- pyrogram/methods/messages/send_video.py | 22 ++- pyrogram/methods/messages/send_video_note.py | 22 ++- pyrogram/methods/messages/send_voice.py | 22 ++- .../types/input_message_content/__init__.py | 14 +- .../input_reply_to_message.py | 62 +++++++ pyrogram/types/messages_and_media/message.py | 157 +++++++++++++++++- pyrogram/types/user_and_chats/__init__.py | 18 ++ pyrogram/types/user_and_chats/chat.py | 6 + pyrogram/types/user_and_chats/chat_event.py | 59 ++++++- .../types/user_and_chats/chat_permissions.py | 22 ++- .../types/user_and_chats/chat_privileges.py | 18 +- pyrogram/types/user_and_chats/forum_topic.py | 152 +++++++++++++++++ .../user_and_chats/forum_topic_closed.py | 29 ++++ .../user_and_chats/forum_topic_created.py | 58 +++++++ .../user_and_chats/forum_topic_edited.py | 58 +++++++ .../user_and_chats/forum_topic_reopened.py | 29 ++++ .../general_forum_topic_hidden.py | 29 ++++ .../general_forum_topic_unhidden.py | 29 ++++ pyrogram/types/user_and_chats/peer_channel.py | 46 +++++ pyrogram/types/user_and_chats/peer_user.py | 46 +++++ pyrogram/utils.py | 21 ++- 59 files changed, 1986 insertions(+), 192 deletions(-) create mode 100644 pyrogram/methods/chats/close_forum_topic.py create mode 100644 pyrogram/methods/chats/close_general_topic.py create mode 100644 pyrogram/methods/chats/create_forum_topic.py create mode 100644 pyrogram/methods/chats/delete_forum_topic.py create mode 100644 pyrogram/methods/chats/edit_forum_topic.py create mode 100644 pyrogram/methods/chats/edit_general_topic.py create mode 100644 pyrogram/methods/chats/get_forum_topics.py create mode 100644 pyrogram/methods/chats/get_forum_topics_by_id.py create mode 100644 pyrogram/methods/chats/hide_general_topic.py create mode 100644 pyrogram/methods/chats/reopen_forum_topic.py create mode 100644 pyrogram/methods/chats/reopen_general_topic.py create mode 100644 pyrogram/methods/chats/unhide_general_topic.py create mode 100644 pyrogram/types/input_message_content/input_reply_to_message.py create mode 100644 pyrogram/types/user_and_chats/forum_topic.py create mode 100644 pyrogram/types/user_and_chats/forum_topic_closed.py create mode 100644 pyrogram/types/user_and_chats/forum_topic_created.py create mode 100644 pyrogram/types/user_and_chats/forum_topic_edited.py create mode 100644 pyrogram/types/user_and_chats/forum_topic_reopened.py create mode 100644 pyrogram/types/user_and_chats/general_forum_topic_hidden.py create mode 100644 pyrogram/types/user_and_chats/general_forum_topic_unhidden.py create mode 100644 pyrogram/types/user_and_chats/peer_channel.py create mode 100644 pyrogram/types/user_and_chats/peer_user.py diff --git a/compiler/docs/compiler.py b/compiler/docs/compiler.py index f1bc0b1a..4a311aa0 100644 --- a/compiler/docs/compiler.py +++ b/compiler/docs/compiler.py @@ -220,6 +220,8 @@ def pyrogram_api(): get_chat_members_count get_dialogs get_dialogs_count + get_forum_topics + get_forum_topics_by_id set_chat_username get_nearby_chats archive_chats @@ -238,6 +240,16 @@ def pyrogram_api(): get_send_as_chats set_send_as_chat set_chat_protected_content + close_forum_topic + close_general_topic + create_forum_topic + delete_forum_topic + edit_forum_topic + edit_general_topic + hide_general_topic + reopen_forum_topic + reopen_general_topic + unhide_general_topic """, users=""" Users @@ -390,6 +402,9 @@ def pyrogram_api(): Dialog Restriction EmojiStatus + ForumTopic + PeerUser + PeerChannel """, messages_media=""" Messages & Media @@ -420,6 +435,12 @@ def pyrogram_api(): WebAppData MessageReactions ChatReactions + ForumTopicCreated + ForumTopicEdited + ForumTopicClosed + ForumTopicReopened + GeneralTopicHidden + GeneralTopicUnhidden """, bot_keyboards=""" Bot keyboards @@ -488,6 +509,7 @@ def pyrogram_api(): input_message_content=""" InputMessageContent InputMessageContent + InputReplyToMessage InputTextMessageContent """, authorization=""" diff --git a/pyrogram/enums/chat_event_action.py b/pyrogram/enums/chat_event_action.py index 7a595472..12355b66 100644 --- a/pyrogram/enums/chat_event_action.py +++ b/pyrogram/enums/chat_event_action.py @@ -1,20 +1,21 @@ -# Pyrogram - Telegram MTProto API Client Library for Python +# Pyrofork - Telegram MTProto API Client Library for Python # Copyright (C) 2017-present Dan +# Copyright (C) 2022-present Mayuri-Chan # -# This file is part of Pyrogram. +# This file is part of Pyrofork. # -# Pyrogram is free software: you can redistribute it and/or modify +# 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. # -# Pyrogram is distributed in the hope that it will be useful, +# 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 Pyrogram. If not, see . +# along with Pyrofork. If not, see . from enum import auto @@ -123,5 +124,14 @@ class ChatEventAction(AutoName): MESSAGE_UNPINNED = auto() "a message has been unpinned (see ``unpinned_message``)" + CREATED_FORUM_TOPIC = auto() + "a new forum topic has been created (see `created_forum_topic`)" + + EDITED_FORUM_TOPIC = auto() + "a forum topic has been edited (see `old_forum_topic` and `new_forum_topic`)" + + DELETED_FORUM_TOPIC = auto() + "a forum topic has been deleted (see `deleted_forum_topic`)" + UNKNOWN = auto() "Unknown chat event action" diff --git a/pyrogram/enums/message_service_type.py b/pyrogram/enums/message_service_type.py index 18e8688e..2b75ad58 100644 --- a/pyrogram/enums/message_service_type.py +++ b/pyrogram/enums/message_service_type.py @@ -61,6 +61,24 @@ class MessageServiceType(AutoName): GAME_HIGH_SCORE = auto() "Game high score" + FORUM_TOPIC_CREATED = auto() + "a new forum topic created in the chat" + + FORUM_TOPIC_CLOSED = auto() + "a new forum topic closed in the chat" + + FORUM_TOPIC_REOPENED = auto() + "a new forum topic reopened in the chat" + + FORUM_TOPIC_EDITED = auto() + "a new forum topic renamed in the chat" + + GENERAL_TOPIC_HIDDEN = auto() + "a forum general topic hidden in the chat" + + GENERAL_TOPIC_UNHIDDEN = auto() + "a forum general topic unhidden in the chat" + VIDEO_CHAT_STARTED = auto() "Video chat started" diff --git a/pyrogram/methods/bots/send_game.py b/pyrogram/methods/bots/send_game.py index 60155a6f..81509f33 100644 --- a/pyrogram/methods/bots/send_game.py +++ b/pyrogram/methods/bots/send_game.py @@ -1,20 +1,21 @@ -# Pyrogram - Telegram MTProto API Client Library for Python +# Pyrofork - Telegram MTProto API Client Library for Python # Copyright (C) 2017-present Dan +# Copyright (C) 2022-present Mayuri-Chan # -# This file is part of Pyrogram. +# This file is part of Pyrofork. # -# Pyrogram is free software: you can redistribute it and/or modify +# 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. # -# Pyrogram is distributed in the hope that it will be useful, +# 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 Pyrogram. If not, see . +# along with Pyrofork. If not, see . from typing import Union @@ -29,6 +30,7 @@ class SendGame: chat_id: Union[int, str], game_short_name: str, disable_notification: bool = None, + message_thread_id: int = None, reply_to_message_id: int = None, protect_content: bool = None, reply_markup: Union[ @@ -55,6 +57,10 @@ class SendGame: Sends the message silently. Users will receive a notification with no sound. + message_thread_id (``int``, *optional*): + Unique identifier of a message thread to which the message belongs. + for supergroups only + reply_to_message_id (``int``, *optional*): If the message is a reply, ID of the original message. @@ -73,6 +79,10 @@ class SendGame: await app.send_game(chat_id, "gamename") """ + reply_to = None + if reply_to_message_id or message_thread_id: + reply_to = types.InputReplyToMessage(reply_to_message_id=reply_to_message_id, message_thread_id=message_thread_id) + r = await self.invoke( raw.functions.messages.SendMedia( peer=await self.resolve_peer(chat_id), @@ -84,7 +94,7 @@ class SendGame: ), message="", silent=disable_notification or None, - reply_to_msg_id=reply_to_message_id, + reply_to=reply_to, random_id=self.rnd_id(), noforwards=protect_content, reply_markup=await reply_markup.write(self) if reply_markup else None diff --git a/pyrogram/methods/bots/send_inline_bot_result.py b/pyrogram/methods/bots/send_inline_bot_result.py index f29d8eb9..534449a7 100644 --- a/pyrogram/methods/bots/send_inline_bot_result.py +++ b/pyrogram/methods/bots/send_inline_bot_result.py @@ -1,20 +1,21 @@ -# Pyrogram - Telegram MTProto API Client Library for Python +# Pyrofork - Telegram MTProto API Client Library for Python # Copyright (C) 2017-present Dan +# Copyright (C) 2022-present Mayuri-Chan # -# This file is part of Pyrogram. +# This file is part of Pyrofork. # -# Pyrogram is free software: you can redistribute it and/or modify +# 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. # -# Pyrogram is distributed in the hope that it will be useful, +# 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 Pyrogram. If not, see . +# along with Pyrofork. If not, see . from typing import Union @@ -29,6 +30,7 @@ class SendInlineBotResult: query_id: int, result_id: str, disable_notification: bool = None, + message_thread_id: int = None, reply_to_message_id: int = None ) -> "raw.base.Updates": """Send an inline bot result. @@ -52,6 +54,10 @@ class SendInlineBotResult: Sends the message silently. Users will receive a notification with no sound. + message_thread_id (``int``, *optional*): + Unique identifier of a message thread to which the message belongs. + for supergroups only + reply_to_message_id (``bool``, *optional*): If the message is a reply, ID of the original message. @@ -63,6 +69,11 @@ class SendInlineBotResult: await app.send_inline_bot_result(chat_id, query_id, result_id) """ + + reply_to = None + if reply_to_message_id or message_thread_id: + reply_to = types.InputReplyToMessage(reply_to_message_id=reply_to_message_id, message_thread_id=message_thread_id) + return await self.invoke( raw.functions.messages.SendInlineBotResult( peer=await self.resolve_peer(chat_id), @@ -70,6 +81,6 @@ class SendInlineBotResult: id=result_id, random_id=self.rnd_id(), silent=disable_notification or None, - reply_to_msg_id=reply_to_message_id + reply_to=reply_to ) ) diff --git a/pyrogram/methods/chats/__init__.py b/pyrogram/methods/chats/__init__.py index a2bdde08..2cc30b9e 100644 --- a/pyrogram/methods/chats/__init__.py +++ b/pyrogram/methods/chats/__init__.py @@ -1,31 +1,42 @@ -# Pyrogram - Telegram MTProto API Client Library for Python +# Pyrofork - Telegram MTProto API Client Library for Python # Copyright (C) 2017-present Dan +# Copyright (C) 2022-present Mayuri-Chan # -# This file is part of Pyrogram. +# This file is part of Pyrofork. # -# Pyrogram is free software: you can redistribute it and/or modify +# 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. # -# Pyrogram is distributed in the hope that it will be useful, +# 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 Pyrogram. If not, see . +# along with Pyrofork. If not, see . from .add_chat_members import AddChatMembers from .archive_chats import ArchiveChats from .ban_chat_member import BanChatMember from .create_channel import CreateChannel +from .create_forum_topic import CreateForumTopic from .create_group import CreateGroup from .create_supergroup import CreateSupergroup +from .close_forum_topic import CloseForumTopic +from .close_general_topic import CloseGeneralTopic from .delete_channel import DeleteChannel from .delete_chat_photo import DeleteChatPhoto +from .delete_forum_topic import DeleteForumTopic from .delete_supergroup import DeleteSupergroup from .delete_user_history import DeleteUserHistory +from .edit_forum_topic import EditForumTopic +from .edit_general_topic import EditGeneralTopic +from .reopen_forum_topic import ReopenForumTopic +from .reopen_general_topic import ReopenGeneralTopic +from .hide_general_topic import HideGeneralTopic +from .unhide_general_topic import UnhideGeneralTopic from .get_chat import GetChat from .get_chat_event_log import GetChatEventLog from .get_chat_member import GetChatMember @@ -34,6 +45,8 @@ from .get_chat_members_count import GetChatMembersCount from .get_chat_online_count import GetChatOnlineCount from .get_dialogs import GetDialogs from .get_dialogs_count import GetDialogsCount +from .get_forum_topics import GetForumTopics +from .get_forum_topics_by_id import GetForumTopicsByID from .get_nearby_chats import GetNearbyChats from .get_send_as_chats import GetSendAsChats from .join_chat import JoinChat @@ -78,14 +91,26 @@ class Chats( SetChatUsername, SetChatPermissions, GetDialogsCount, + GetForumTopics, + GetForumTopicsByID, ArchiveChats, UnarchiveChats, CreateGroup, CreateSupergroup, CreateChannel, + CreateForumTopic, + CloseForumTopic, + CloseGeneralTopic, AddChatMembers, DeleteChannel, + DeleteForumTopic, DeleteSupergroup, + EditForumTopic, + EditGeneralTopic, + ReopenForumTopic, + ReopenGeneralTopic, + HideGeneralTopic, + UnhideGeneralTopic, GetNearbyChats, SetAdministratorTitle, SetSlowMode, diff --git a/pyrogram/methods/chats/close_forum_topic.py b/pyrogram/methods/chats/close_forum_topic.py new file mode 100644 index 00000000..06bd42bb --- /dev/null +++ b/pyrogram/methods/chats/close_forum_topic.py @@ -0,0 +1,56 @@ +# 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 pyrogram import raw +from pyrogram import types +from typing import Union + + +class CloseForumTopic: + async def close_forum_topic( + self: "pyrogram.Client", + chat_id: Union[int, str], + topic_id: int + ) -> bool: + """Close a forum topic. + + .. include:: /_includes/usable-by/users-bots.rst + + Parameters: + chat_id (``int`` | ``str``): + Unique identifier (int) or username (str) of the target chat. + + topic_id (``int``): + Unique identifier (int) of the target forum topic. + + Returns: + `bool`: On success, a Boolean is returned. + + Example: + .. code-block:: python + + await app.close_forum_topic(chat_id, topic_id) + """ + await self.invoke( + raw.functions.channels.EditForumTopic( + channel=await self.resolve_peer(chat_id), + topic_id=topic_id, + closed=True + ) + ) + return True diff --git a/pyrogram/methods/chats/close_general_topic.py b/pyrogram/methods/chats/close_general_topic.py new file mode 100644 index 00000000..0e8286dd --- /dev/null +++ b/pyrogram/methods/chats/close_general_topic.py @@ -0,0 +1,52 @@ +# 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 pyrogram import raw +from pyrogram import types +from typing import Union + + +class CloseGeneralTopic: + async def close_general_topic( + self: "pyrogram.Client", + chat_id: Union[int, str] + ) -> bool: + """Close a forum topic. + + .. include:: /_includes/usable-by/users-bots.rst + + Parameters: + chat_id (``int`` | ``str``): + Unique identifier (int) or username (str) of the target chat. + + Returns: + `bool`: On success, a True is returned. + + Example: + .. code-block:: python + + await app.close_general_topic(chat_id) + """ + await self.invoke( + raw.functions.channels.EditForumTopic( + channel=await self.resolve_peer(chat_id), + topic_id=1, + closed=True + ) + ) + return True diff --git a/pyrogram/methods/chats/create_forum_topic.py b/pyrogram/methods/chats/create_forum_topic.py new file mode 100644 index 00000000..4e9bb95c --- /dev/null +++ b/pyrogram/methods/chats/create_forum_topic.py @@ -0,0 +1,67 @@ +# 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 pyrogram import raw +from pyrogram import types +from typing import Union + + +class CreateForumTopic: + async def create_forum_topic( + self: "pyrogram.Client", + chat_id: Union[int, str], + title: str, + icon_color: int = None, + icon_emoji_id: int = None + ) -> "types.ForumTopicCreated": + """Create a new forum topic. + + .. include:: /_includes/usable-by/users-bots.rst + + Parameters: + chat_id (``int`` | ``str``): + Unique identifier (int) or username (str) of the target chat. + + title (``str``): + The forum topic title. + + icon_color (``int``, *optional*): + The color of forum topic icon. + + icon_emoji_id (``int``, *optional*): + Unique identifier of the custom emoji shown as the topic icon + + Returns: + :obj:`~pyrogram.types.ForumTopicCreated`: On success, a forum_topic_created object is returned. + + Example: + .. code-block:: python + + await app.create_forum_topic("Topic Title") + """ + r = await self.invoke( + raw.functions.channels.CreateForumTopic( + channel=await self.resolve_peer(chat_id), + title=title, + random_id=self.rnd_id(), + icon_color=icon_color, + icon_emoji_id=icon_emoji_id + ) + ) + + return types.ForumTopicCreated._parse(r.updates[1].message.action) diff --git a/pyrogram/methods/chats/delete_forum_topic.py b/pyrogram/methods/chats/delete_forum_topic.py new file mode 100644 index 00000000..5f1c36a5 --- /dev/null +++ b/pyrogram/methods/chats/delete_forum_topic.py @@ -0,0 +1,59 @@ +# 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 pyrogram import raw +from pyrogram import types +from typing import Union + + +class DeleteForumTopic: + async def delete_forum_topic( + self: "pyrogram.Client", + chat_id: Union[int, str], + topic_id: int + ) -> bool: + """Delete a forum topic. + + .. include:: /_includes/usable-by/users-bots.rst + + Parameters: + chat_id (``int`` | ``str``): + Unique identifier (int) or username (str) of the target chat. + + topic_id (``int``): + Unique identifier (int) of the target forum topic. + + Returns: + `bool`: On success, a Boolean is returned. + + Example: + .. code-block:: python + + await app.delete_forum_topic(chat_id, topic_id) + """ + try: + await self.invoke( + raw.functions.channels.DeleteTopicHistory( + channel=await self.resolve_peer(chat_id), + top_msg_id=topic_id + ) + ) + except Exception as e: + print(e) + return False + return True diff --git a/pyrogram/methods/chats/edit_forum_topic.py b/pyrogram/methods/chats/edit_forum_topic.py new file mode 100644 index 00000000..41f1bd05 --- /dev/null +++ b/pyrogram/methods/chats/edit_forum_topic.py @@ -0,0 +1,65 @@ +# 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 pyrogram import raw +from pyrogram import types +from typing import Union + + +class EditForumTopic: + async def edit_forum_topic( + self: "pyrogram.Client", + chat_id: Union[int, str], + topic_id: int, + title: str = None, + icon_emoji_id: int = None + ) -> bool: + """Edit a forum topic. + + .. include:: /_includes/usable-by/users-bots.rst + + Parameters: + chat_id (``int`` | ``str``): + Unique identifier (int) or username (str) of the target chat. + + topic_id (``int``): + Unique identifier (int) of the target forum topic. + + title (``str``, *optional*): + The forum topic title. + + icon_emoji_id (``int``, *optional*): + Unique identifier of the custom emoji shown as the topic icon + + Returns: + `bool`: On success, a Boolean is returned. + + Example: + .. code-block:: python + + await app.edit_forum_topic(chat_id,topic_id,"New Topic Title") + """ + await self.invoke( + raw.functions.channels.EditForumTopic( + channel=await self.resolve_peer(chat_id), + topic_id=topic_id, + title=title, + icon_emoji_id=icon_emoji_id + ) + ) + return True diff --git a/pyrogram/methods/chats/edit_general_topic.py b/pyrogram/methods/chats/edit_general_topic.py new file mode 100644 index 00000000..a828ac23 --- /dev/null +++ b/pyrogram/methods/chats/edit_general_topic.py @@ -0,0 +1,56 @@ +# 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 pyrogram import raw +from pyrogram import types +from typing import Union + + +class EditGeneralTopic: + async def edit_general_topic( + self: "pyrogram.Client", + chat_id: Union[int, str], + title: str + ) -> bool: + """Edit a general forum topic. + + .. include:: /_includes/usable-by/users-bots.rst + + Parameters: + chat_id (``int`` | ``str``): + Unique identifier (int) or username (str) of the target chat. + + title (``str``): + The general forum topic title. + + Returns: + `bool`: On success, a True is returned. + + Example: + .. code-block:: python + + await app.edit_general_topic(chat_id,"New Topic Title") + """ + await self.invoke( + raw.functions.channels.EditForumTopic( + channel=await self.resolve_peer(chat_id), + topic_id=1, + title=title + ) + ) + return True diff --git a/pyrogram/methods/chats/get_forum_topics.py b/pyrogram/methods/chats/get_forum_topics.py new file mode 100644 index 00000000..5b516b16 --- /dev/null +++ b/pyrogram/methods/chats/get_forum_topics.py @@ -0,0 +1,69 @@ +# 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 . + +import logging +from typing import Union, Optional, AsyncGenerator + +import pyrogram +from pyrogram import raw +from pyrogram import types +from pyrogram import utils + +log = logging.getLogger(__name__) + + +class GetForumTopics: + async def get_forum_topics( + self: "pyrogram.Client", + chat_id: Union[int, str], + limit: int = 0 + ) -> Optional[AsyncGenerator["types.ForumTopic", None]]: + """Get one or more topic from a chat. + + .. include:: /_includes/usable-by/users.rst + + Parameters: + chat_id (``int`` | ``str``): + Unique identifier (int) or username (str) of the target chat. + + limit (``int``, *optional*): + Limits the number of topics to be retrieved. + + Returns: + ``Generator``: On success, a generator yielding :obj:`~pyrogram.types.ForumTopic` objects is returned. + + Example: + .. code-block:: python + + # get all forum topics + async for topic in app.get_forum_topics(chat_id): + print(topic) + + Raises: + ValueError: In case of invalid arguments. + """ + + peer = await self.resolve_peer(chat_id) + + rpc = raw.functions.channels.GetForumTopics(channel=peer, offset_date=0, offset_id=0, offset_topic=0, limit=limit) + + r = await self.invoke(rpc, sleep_threshold=-1) + + for _topic in r.topics: + yield types.ForumTopic._parse(_topic) diff --git a/pyrogram/methods/chats/get_forum_topics_by_id.py b/pyrogram/methods/chats/get_forum_topics_by_id.py new file mode 100644 index 00000000..deae1006 --- /dev/null +++ b/pyrogram/methods/chats/get_forum_topics_by_id.py @@ -0,0 +1,91 @@ +# 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 . + +import logging +from typing import Union, List, Iterable + +import pyrogram +from pyrogram import raw +from pyrogram import types +from pyrogram import utils + +log = logging.getLogger(__name__) + + +class GetForumTopicsByID: + async def get_forum_topics_by_id( + self: "pyrogram.Client", + chat_id: Union[int, str], + topic_ids: Union[int, Iterable[int]] + ) -> Union["types.ForumTopic", List["types.ForumTopic"]]: + """Get one or more topic from a chat by using topic identifiers. + + .. include:: /_includes/usable-by/users.rst + + Parameters: + chat_id (``int`` | ``str``): + Unique identifier (int) or username (str) of the target chat. + + topic_ids (``int`` | Iterable of ``int``, *optional*): + Pass a single topic identifier or an iterable of topic ids (as integers) to get the information of the + topic themselves. + + Returns: + :obj:`~pyrogram.types.ForumTopic` | List of :obj:`~pyrogram.types.ForumTopic`: In case *topic_ids* was not + a list, a single topic is returned, otherwise a list of topics is returned. + + Example: + .. code-block:: python + + # Get one topic + await app.get_forum_topics_by_id(chat_id, 12345) + + # Get more than one topic (list of topics) + await app.get_forum_topics_by_id(chat_id, [12345, 12346]) + + Raises: + ValueError: In case of invalid arguments. + """ + ids, ids_type = ( + (topic_ids, int) if topic_ids + else (None, None) + ) + + if ids is None: + raise ValueError("No argument supplied. Either pass topic_ids") + + peer = await self.resolve_peer(chat_id) + + is_iterable = not isinstance(ids, int) + ids = list(ids) if is_iterable else [ids] + ids = [i for i in ids] + + rpc = raw.functions.channels.GetForumTopicsByID(channel=peer, topics=ids) + + r = await self.invoke(rpc, sleep_threshold=-1) + + if is_iterable: + topic_list = [] + for topic in r.topics: + topic_list.append(types.ForumTopic._parse(topic)) + topics = types.List(topic_list) + else: + topics = types.ForumTopic._parse(r.topics[0]) + + return topics diff --git a/pyrogram/methods/chats/hide_general_topic.py b/pyrogram/methods/chats/hide_general_topic.py new file mode 100644 index 00000000..8c42f6cc --- /dev/null +++ b/pyrogram/methods/chats/hide_general_topic.py @@ -0,0 +1,52 @@ +# 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 pyrogram import raw +from pyrogram import types +from typing import Union + + +class HideGeneralTopic: + async def hide_general_topic( + self: "pyrogram.Client", + chat_id: Union[int, str] + ) -> bool: + """hide a general forum topic. + + .. include:: /_includes/usable-by/users-bots.rst + + Parameters: + chat_id (``int`` | ``str``): + Unique identifier (int) or username (str) of the target chat. + + Returns: + `bool`: On success, a True is returned. + + Example: + .. code-block:: python + + await app.hide_general_topic(chat_id) + """ + await self.invoke( + raw.functions.channels.EditForumTopic( + channel=await self.resolve_peer(chat_id), + topic_id=1, + hidden=True + ) + ) + return True diff --git a/pyrogram/methods/chats/promote_chat_member.py b/pyrogram/methods/chats/promote_chat_member.py index e4539037..5848abaa 100644 --- a/pyrogram/methods/chats/promote_chat_member.py +++ b/pyrogram/methods/chats/promote_chat_member.py @@ -1,20 +1,21 @@ -# Pyrogram - Telegram MTProto API Client Library for Python +# Pyrofork - Telegram MTProto API Client Library for Python # Copyright (C) 2017-present Dan +# Copyright (C) 2022-present Mayuri-Chan # -# This file is part of Pyrogram. +# This file is part of Pyrofork. # -# Pyrogram is free software: you can redistribute it and/or modify +# 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. # -# Pyrogram is distributed in the hope that it will be useful, +# 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 Pyrogram. If not, see . +# along with Pyrofork. If not, see . from typing import Union @@ -92,6 +93,7 @@ class PromoteChatMember: pin_messages=privileges.can_pin_messages, add_admins=privileges.can_promote_members, manage_call=privileges.can_manage_video_chats, + manage_topics=privileges.can_manage_topics, other=privileges.can_manage_chat ), rank=rank or "" diff --git a/pyrogram/methods/chats/reopen_forum_topic.py b/pyrogram/methods/chats/reopen_forum_topic.py new file mode 100644 index 00000000..f491fbb5 --- /dev/null +++ b/pyrogram/methods/chats/reopen_forum_topic.py @@ -0,0 +1,56 @@ +# 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 pyrogram import raw +from pyrogram import types +from typing import Union + + +class ReopenForumTopic: + async def reopen_forum_topic( + self: "pyrogram.Client", + chat_id: Union[int, str], + topic_id: int + ) -> bool: + """Reopen a forum topic. + + .. include:: /_includes/usable-by/users-bots.rst + + Parameters: + chat_id (``int`` | ``str``): + Unique identifier (int) or username (str) of the target chat. + + topic_id (``int``): + Unique identifier (int) of the target forum topic. + + Returns: + `bool`: On success, a Boolean is returned. + + Example: + .. code-block:: python + + await app.reopen_forum_topic(chat_id, topic_id) + """ + await self.invoke( + raw.functions.channels.EditForumTopic( + channel=await self.resolve_peer(chat_id), + topic_id=topic_id, + closed=False + ) + ) + return True diff --git a/pyrogram/methods/chats/reopen_general_topic.py b/pyrogram/methods/chats/reopen_general_topic.py new file mode 100644 index 00000000..25381085 --- /dev/null +++ b/pyrogram/methods/chats/reopen_general_topic.py @@ -0,0 +1,52 @@ +# 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 pyrogram import raw +from pyrogram import types +from typing import Union + + +class ReopenGeneralTopic: + async def reopen_general_topic( + self: "pyrogram.Client", + chat_id: Union[int, str] + ) -> bool: + """Reopen a general forum topic. + + .. include:: /_includes/usable-by/users-bots.rst + + Parameters: + chat_id (``int`` | ``str``): + Unique identifier (int) or username (str) of the target chat. + + Returns: + `bool`: On success, a True is returned. + + Example: + .. code-block:: python + + await app.reopen_general_topic(chat_id, topic_id) + """ + await self.invoke( + raw.functions.channels.EditForumTopic( + channel=await self.resolve_peer(chat_id), + topic_id=1, + closed=False + ) + ) + return True diff --git a/pyrogram/methods/chats/restrict_chat_member.py b/pyrogram/methods/chats/restrict_chat_member.py index 6e42b364..a2d9561d 100644 --- a/pyrogram/methods/chats/restrict_chat_member.py +++ b/pyrogram/methods/chats/restrict_chat_member.py @@ -1,20 +1,21 @@ -# Pyrogram - Telegram MTProto API Client Library for Python +# Pyrofork - Telegram MTProto API Client Library for Python # Copyright (C) 2017-present Dan +# Copyright (C) 2022-present Mayuri-Chan # -# This file is part of Pyrogram. +# This file is part of Pyrofork. # -# Pyrogram is free software: you can redistribute it and/or modify +# 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. # -# Pyrogram is distributed in the hope that it will be useful, +# 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 Pyrogram. If not, see . +# along with Pyrofork. If not, see . from datetime import datetime from typing import Union @@ -92,6 +93,7 @@ class RestrictChatMember: change_info=not permissions.can_change_info, invite_users=not permissions.can_invite_users, pin_messages=not permissions.can_pin_messages, + manage_topics=not permissions.can_manage_topics, ) ) ) diff --git a/pyrogram/methods/chats/set_chat_permissions.py b/pyrogram/methods/chats/set_chat_permissions.py index d8ec0cf0..6d0b2c70 100644 --- a/pyrogram/methods/chats/set_chat_permissions.py +++ b/pyrogram/methods/chats/set_chat_permissions.py @@ -1,20 +1,21 @@ -# Pyrogram - Telegram MTProto API Client Library for Python +# Pyrofork - Telegram MTProto API Client Library for Python # Copyright (C) 2017-present Dan +# Copyright (C) 2022-present Mayuri-Chan # -# This file is part of Pyrogram. +# This file is part of Pyrofork. # -# Pyrogram is free software: you can redistribute it and/or modify +# 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. # -# Pyrogram is distributed in the hope that it will be useful, +# 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 Pyrogram. If not, see . +# along with Pyrofork. If not, see . from typing import Union @@ -80,6 +81,7 @@ class SetChatPermissions: change_info=not permissions.can_change_info, invite_users=not permissions.can_invite_users, pin_messages=not permissions.can_pin_messages, + manage_topics=not permissions.can_manage_topics, ) ) ) diff --git a/pyrogram/methods/chats/unhide_general_topic.py b/pyrogram/methods/chats/unhide_general_topic.py new file mode 100644 index 00000000..0f3213aa --- /dev/null +++ b/pyrogram/methods/chats/unhide_general_topic.py @@ -0,0 +1,52 @@ +# 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 pyrogram import raw +from pyrogram import types +from typing import Union + + +class UnhideGeneralTopic: + async def unhide_general_topic( + self: "pyrogram.Client", + chat_id: Union[int, str] + ) -> bool: + """unhide a general forum topic. + + .. include:: /_includes/usable-by/users-bots.rst + + Parameters: + chat_id (``int`` | ``str``): + Unique identifier (int) or username (str) of the target chat. + + Returns: + `bool`: On success, a True is returned. + + Example: + .. code-block:: python + + await app.unhide_general_topic(chat_id) + """ + await self.invoke( + raw.functions.channels.EditForumTopic( + channel=await self.resolve_peer(chat_id), + topic_id=1, + hidden=False + ) + ) + return True diff --git a/pyrogram/methods/messages/copy_media_group.py b/pyrogram/methods/messages/copy_media_group.py index 52911ea0..5312d812 100644 --- a/pyrogram/methods/messages/copy_media_group.py +++ b/pyrogram/methods/messages/copy_media_group.py @@ -1,20 +1,24 @@ # Pyrogram - Telegram MTProto API Client Library for Python # Copyright (C) 2017-present Dan # -# This file is part of Pyrogram. +# Pyrofork - Telegram MTProto API Client Library for Python +# Copyright (C) 2017-present Dan +# Copyright (C) 2022-present Mayuri-Chan # -# Pyrogram is free software: you can redistribute it and/or modify +# 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. # -# Pyrogram is distributed in the hope that it will be useful, +# 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 Pyrogram. If not, see . +# along with Pyrofork. If not, see . from datetime import datetime from typing import Union, List @@ -31,6 +35,7 @@ class CopyMediaGroup: message_id: int, captions: Union[List[str], str] = None, disable_notification: bool = None, + message_thread_id: int = None, reply_to_message_id: int = None, schedule_date: datetime = None, ) -> List["types.Message"]: @@ -65,6 +70,10 @@ class CopyMediaGroup: Sends the message silently. Users will receive a notification with no sound. + message_thread_id (``int``, *optional*): + Unique identifier for the target message thread (topic) of the forum. + for forum supergroups only. + reply_to_message_id (``int``, *optional*): If the message is a reply, ID of the original message. @@ -89,6 +98,10 @@ class CopyMediaGroup: media_group = await self.get_media_group(from_chat_id, message_id) multi_media = [] + reply_to = None + if reply_to_message_id or message_thread_id: + reply_to = types.InputReplyToMessage(reply_to_message_id=reply_to_message_id, message_thread_id=message_thread_id) + for i, message in enumerate(media_group): if message.photo: file_id = message.photo.file_id @@ -119,7 +132,7 @@ class CopyMediaGroup: peer=await self.resolve_peer(chat_id), multi_media=multi_media, silent=disable_notification or None, - reply_to_msg_id=reply_to_message_id, + reply_to=reply_to, schedule_date=utils.datetime_to_timestamp(schedule_date) ), sleep_threshold=60 diff --git a/pyrogram/methods/messages/copy_message.py b/pyrogram/methods/messages/copy_message.py index 0b6624b2..b74b5a99 100644 --- a/pyrogram/methods/messages/copy_message.py +++ b/pyrogram/methods/messages/copy_message.py @@ -1,20 +1,21 @@ -# Pyrogram - Telegram MTProto API Client Library for Python +# Pyrofork - Telegram MTProto API Client Library for Python # Copyright (C) 2017-present Dan +# Copyright (C) 2022-present Mayuri-Chan # -# This file is part of Pyrogram. +# This file is part of Pyrofork. # -# Pyrogram is free software: you can redistribute it and/or modify +# 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. # -# Pyrogram is distributed in the hope that it will be useful, +# 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 Pyrogram. If not, see . +# along with Pyrofork. If not, see . import logging from datetime import datetime @@ -36,6 +37,7 @@ class CopyMessage: parse_mode: Optional["enums.ParseMode"] = None, caption_entities: List["types.MessageEntity"] = None, disable_notification: bool = None, + message_thread_id: int = None, reply_to_message_id: int = None, schedule_date: datetime = None, protect_content: bool = None, @@ -83,6 +85,10 @@ class CopyMessage: Sends the message silently. Users will receive a notification with no sound. + message_thread_id (``int``, *optional*): + Unique identifier for the target message thread (topic) of the forum. + for forum supergroups only. + reply_to_message_id (``int``, *optional*): If the message is a reply, ID of the original message. @@ -114,6 +120,7 @@ class CopyMessage: parse_mode=parse_mode, caption_entities=caption_entities, disable_notification=disable_notification, + message_thread_id=message_thread_id, reply_to_message_id=reply_to_message_id, schedule_date=schedule_date, protect_content=protect_content, diff --git a/pyrogram/methods/messages/forward_messages.py b/pyrogram/methods/messages/forward_messages.py index d54563a6..cdf6b95f 100644 --- a/pyrogram/methods/messages/forward_messages.py +++ b/pyrogram/methods/messages/forward_messages.py @@ -31,6 +31,7 @@ class ForwardMessages: chat_id: Union[int, str], from_chat_id: Union[int, str], message_ids: Union[int, Iterable[int]], + message_thread_id: int = None, disable_notification: bool = None, schedule_date: datetime = None, protect_content: bool = None, @@ -54,6 +55,10 @@ class ForwardMessages: message_ids (``int`` | Iterable of ``int``): An iterable of message identifiers in the chat specified in *from_chat_id* or a single message id. + message_thread_id (``int``, *optional*): + Unique identifier of a message thread to which the message belongs. + for supergroups only + disable_notification (``bool``, *optional*): Sends the message silently. Users will receive a notification with no sound. @@ -89,6 +94,7 @@ class ForwardMessages: to_peer=await self.resolve_peer(chat_id), from_peer=await self.resolve_peer(from_chat_id), id=message_ids, + top_msg_id=message_thread_id, silent=disable_notification or None, random_id=[self.rnd_id() for _ in message_ids], schedule_date=utils.datetime_to_timestamp(schedule_date), diff --git a/pyrogram/methods/messages/send_animation.py b/pyrogram/methods/messages/send_animation.py index bac16bac..1eb304c7 100644 --- a/pyrogram/methods/messages/send_animation.py +++ b/pyrogram/methods/messages/send_animation.py @@ -1,20 +1,21 @@ -# Pyrogram - Telegram MTProto API Client Library for Python +# Pyrofork - Telegram MTProto API Client Library for Python # Copyright (C) 2017-present Dan +# Copyright (C) 2022-present Mayuri-Chan # -# This file is part of Pyrogram. +# This file is part of Pyrofork. # -# Pyrogram is free software: you can redistribute it and/or modify +# 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. # -# Pyrogram is distributed in the hope that it will be useful, +# 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 Pyrogram. If not, see . +# along with Pyrofork. If not, see . import os import re @@ -46,6 +47,7 @@ class SendAnimation: thumb: Union[str, BinaryIO] = None, file_name: str = None, disable_notification: bool = None, + message_thread_id: int = None, reply_to_message_id: int = None, schedule_date: datetime = None, protect_content: bool = None, @@ -115,6 +117,10 @@ class SendAnimation: Sends the message silently. Users will receive a notification with no sound. + message_thread_id (``int``, *optional*): + Unique identifier for the target message thread (topic) of the forum. + for forum supergroups only. + reply_to_message_id (``int``, *optional*): If the message is a reply, ID of the original message. @@ -175,6 +181,10 @@ class SendAnimation: """ file = None + reply_to = None + if reply_to_message_id or message_thread_id: + reply_to = types.InputReplyToMessage(reply_to_message_id=reply_to_message_id, message_thread_id=message_thread_id) + try: if isinstance(animation, str): if os.path.isfile(animation): @@ -230,7 +240,7 @@ class SendAnimation: peer=await self.resolve_peer(chat_id), media=media, silent=disable_notification or None, - reply_to_msg_id=reply_to_message_id, + reply_to=reply_to, random_id=self.rnd_id(), schedule_date=utils.datetime_to_timestamp(schedule_date), noforwards=protect_content, diff --git a/pyrogram/methods/messages/send_audio.py b/pyrogram/methods/messages/send_audio.py index 7a81df01..197967e6 100644 --- a/pyrogram/methods/messages/send_audio.py +++ b/pyrogram/methods/messages/send_audio.py @@ -1,20 +1,21 @@ -# Pyrogram - Telegram MTProto API Client Library for Python +# Pyrofork - Telegram MTProto API Client Library for Python # Copyright (C) 2017-present Dan +# Copyright (C) 2022-present Mayuri-Chan # -# This file is part of Pyrogram. +# This file is part of Pyrofork. # -# Pyrogram is free software: you can redistribute it and/or modify +# 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. # -# Pyrogram is distributed in the hope that it will be useful, +# 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 Pyrogram. If not, see . +# along with Pyrofork. If not, see . import os import re @@ -44,6 +45,7 @@ class SendAudio: thumb: Union[str, BinaryIO] = None, file_name: str = None, disable_notification: bool = None, + message_thread_id: int = None, reply_to_message_id: int = None, schedule_date: datetime = None, protect_content: bool = None, @@ -108,6 +110,10 @@ class SendAudio: Sends the message silently. Users will receive a notification with no sound. + message_thread_id (``int``, *optional*): + Unique identifier for the target message thread (topic) of the forum. + for forum supergroups only. + reply_to_message_id (``int``, *optional*): If the message is a reply, ID of the original message. @@ -169,6 +175,10 @@ class SendAudio: """ file = None + reply_to = None + if reply_to_message_id or message_thread_id: + reply_to = types.InputReplyToMessage(reply_to_message_id=reply_to_message_id, message_thread_id=message_thread_id) + try: if isinstance(audio, str): if os.path.isfile(audio): @@ -217,7 +227,7 @@ class SendAudio: peer=await self.resolve_peer(chat_id), media=media, silent=disable_notification or None, - reply_to_msg_id=reply_to_message_id, + reply_to=reply_to, random_id=self.rnd_id(), schedule_date=utils.datetime_to_timestamp(schedule_date), noforwards=protect_content, diff --git a/pyrogram/methods/messages/send_cached_media.py b/pyrogram/methods/messages/send_cached_media.py index 5a9e2e1f..0e41bf37 100644 --- a/pyrogram/methods/messages/send_cached_media.py +++ b/pyrogram/methods/messages/send_cached_media.py @@ -1,20 +1,21 @@ -# Pyrogram - Telegram MTProto API Client Library for Python +# Pyrofork - Telegram MTProto API Client Library for Python # Copyright (C) 2017-present Dan +# Copyright (C) 2022-present Mayuri-Chan # -# This file is part of Pyrogram. +# This file is part of Pyrofork. # -# Pyrogram is free software: you can redistribute it and/or modify +# 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. # -# Pyrogram is distributed in the hope that it will be useful, +# 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 Pyrogram. If not, see . +# along with Pyrofork. If not, see . from datetime import datetime from typing import Union, List, Optional @@ -34,6 +35,7 @@ class SendCachedMedia: parse_mode: Optional["enums.ParseMode"] = None, caption_entities: List["types.MessageEntity"] = None, disable_notification: bool = None, + message_thread_id: int = None, reply_to_message_id: int = None, schedule_date: datetime = None, protect_content: bool = None, @@ -76,6 +78,10 @@ class SendCachedMedia: Sends the message silently. Users will receive a notification with no sound. + message_thread_id (``int``, *optional*): + Unique identifier for the target message thread (topic) of the forum. + for forum supergroups only. + reply_to_message_id (``int``, *optional*): If the message is a reply, ID of the original message. @@ -98,12 +104,16 @@ class SendCachedMedia: await app.send_cached_media("me", file_id) """ + reply_to = None + if reply_to_message_id or message_thread_id: + reply_to = types.InputReplyToMessage(reply_to_message_id=reply_to_message_id, message_thread_id=message_thread_id) + r = await self.invoke( raw.functions.messages.SendMedia( peer=await self.resolve_peer(chat_id), media=utils.get_input_media_from_file_id(file_id), silent=disable_notification or None, - reply_to_msg_id=reply_to_message_id, + reply_to=reply_to, random_id=self.rnd_id(), schedule_date=utils.datetime_to_timestamp(schedule_date), noforwards=protect_content, diff --git a/pyrogram/methods/messages/send_chat_action.py b/pyrogram/methods/messages/send_chat_action.py index 44b16628..58f9616b 100644 --- a/pyrogram/methods/messages/send_chat_action.py +++ b/pyrogram/methods/messages/send_chat_action.py @@ -1,20 +1,21 @@ -# Pyrogram - Telegram MTProto API Client Library for Python +# Pyrofork - Telegram MTProto API Client Library for Python # Copyright (C) 2017-present Dan +# Copyright (C) 2022-present Mayuri-Chan # -# This file is part of Pyrogram. +# This file is part of Pyrofork. # -# Pyrogram is free software: you can redistribute it and/or modify +# 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. # -# Pyrogram is distributed in the hope that it will be useful, +# 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 Pyrogram. If not, see . +# along with Pyrofork. If not, see . from typing import Union @@ -26,7 +27,8 @@ class SendChatAction: async def send_chat_action( self: "pyrogram.Client", chat_id: Union[int, str], - action: "enums.ChatAction" + action: "enums.ChatAction", + message_thread_id: int = None ) -> bool: """Tell the other party that something is happening on your side. @@ -41,6 +43,10 @@ class SendChatAction: action (:obj:`~pyrogram.enums.ChatAction`): Type of action to broadcast. + message_thread_id (```int```): + Unique identifier for the target message thread (topic) of the forum. + for forum supergroups only. + Returns: ``bool``: On success, True is returned. @@ -75,6 +81,7 @@ class SendChatAction: return await self.invoke( raw.functions.messages.SetTyping( peer=await self.resolve_peer(chat_id), - action=action + action=action, + top_msg_id=message_thread_id ) ) diff --git a/pyrogram/methods/messages/send_contact.py b/pyrogram/methods/messages/send_contact.py index 30f7abd3..83263f17 100644 --- a/pyrogram/methods/messages/send_contact.py +++ b/pyrogram/methods/messages/send_contact.py @@ -1,20 +1,21 @@ -# Pyrogram - Telegram MTProto API Client Library for Python +# Pyrofork - Telegram MTProto API Client Library for Python # Copyright (C) 2017-present Dan +# Copyright (C) 2022-present Mayuri-Chan # -# This file is part of Pyrogram. +# This file is part of Pyrofork. # -# Pyrogram is free software: you can redistribute it and/or modify +# 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. # -# Pyrogram is distributed in the hope that it will be useful, +# 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 Pyrogram. If not, see . +# along with Pyrofork. If not, see . from datetime import datetime from typing import Union @@ -33,6 +34,7 @@ class SendContact: last_name: str = None, vcard: str = None, disable_notification: bool = None, + message_thread_id: int = None, reply_to_message_id: int = None, schedule_date: datetime = None, protect_content: bool = None, @@ -69,6 +71,10 @@ class SendContact: Sends the message silently. Users will receive a notification with no sound. + message_thread_id (``int``, *optional*): + Unique identifier for the target message thread (topic) of the forum. + for forum supergroups only. + reply_to_message_id (``int``, *optional*): If the message is a reply, ID of the original message. @@ -90,6 +96,11 @@ class SendContact: await app.send_contact("me", "+1-123-456-7890", "Name") """ + + reply_to = None + if reply_to_message_id or message_thread_id: + reply_to = types.InputReplyToMessage(reply_to_message_id=reply_to_message_id, message_thread_id=message_thread_id) + r = await self.invoke( raw.functions.messages.SendMedia( peer=await self.resolve_peer(chat_id), @@ -101,7 +112,7 @@ class SendContact: ), message="", silent=disable_notification or None, - reply_to_msg_id=reply_to_message_id, + reply_to=reply_to, random_id=self.rnd_id(), schedule_date=utils.datetime_to_timestamp(schedule_date), noforwards=protect_content, diff --git a/pyrogram/methods/messages/send_dice.py b/pyrogram/methods/messages/send_dice.py index c657d85d..5f14cd5d 100644 --- a/pyrogram/methods/messages/send_dice.py +++ b/pyrogram/methods/messages/send_dice.py @@ -1,20 +1,21 @@ -# Pyrogram - Telegram MTProto API Client Library for Python +# Pyrofork - Telegram MTProto API Client Library for Python # Copyright (C) 2017-present Dan +# Copyright (C) 2022-present Mayuri-Chan # -# This file is part of Pyrogram. +# This file is part of Pyrofork. # -# Pyrogram is free software: you can redistribute it and/or modify +# 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. # -# Pyrogram is distributed in the hope that it will be useful, +# 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 Pyrogram. If not, see . +# along with Pyrofork. If not, see . from datetime import datetime from typing import Union, Optional @@ -30,6 +31,7 @@ class SendDice: chat_id: Union[int, str], emoji: str = "🎲", disable_notification: bool = None, + message_thread_id: int = None, reply_to_message_id: int = None, schedule_date: datetime = None, protect_content: bool = None, @@ -61,6 +63,10 @@ class SendDice: Sends the message silently. Users will receive a notification with no sound. + message_thread_id (``int``, *optional*): + Unique identifier for the target message thread (topic) of the forum. + for forum supergroups only. + reply_to_message_id (``int``, *optional*): If the message is a reply, ID of the original message. @@ -90,12 +96,16 @@ class SendDice: await app.send_dice(chat_id, "🏀") """ + reply_to = None + if reply_to_message_id or message_thread_id: + reply_to = types.InputReplyToMessage(reply_to_message_id=reply_to_message_id, message_thread_id=message_thread_id) + r = await self.invoke( raw.functions.messages.SendMedia( peer=await self.resolve_peer(chat_id), media=raw.types.InputMediaDice(emoticon=emoji), silent=disable_notification or None, - reply_to_msg_id=reply_to_message_id, + reply_to=reply_to, random_id=self.rnd_id(), schedule_date=utils.datetime_to_timestamp(schedule_date), noforwards=protect_content, diff --git a/pyrogram/methods/messages/send_document.py b/pyrogram/methods/messages/send_document.py index b0a4a531..fcf17da8 100644 --- a/pyrogram/methods/messages/send_document.py +++ b/pyrogram/methods/messages/send_document.py @@ -1,20 +1,21 @@ -# Pyrogram - Telegram MTProto API Client Library for Python +# Pyrofork - Telegram MTProto API Client Library for Python # Copyright (C) 2017-present Dan +# Copyright (C) 2022-present Mayuri-Chan # -# This file is part of Pyrogram. +# This file is part of Pyrofork. # -# Pyrogram is free software: you can redistribute it and/or modify +# 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. # -# Pyrogram is distributed in the hope that it will be useful, +# 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 Pyrogram. If not, see . +# along with Pyrofork. If not, see . import os import re @@ -42,6 +43,7 @@ class SendDocument: file_name: str = None, force_document: bool = None, disable_notification: bool = None, + message_thread_id: int = None, reply_to_message_id: int = None, schedule_date: datetime = None, protect_content: bool = None, @@ -100,6 +102,10 @@ class SendDocument: Sends the message silently. Users will receive a notification with no sound. + message_thread_id (``int``, *optional*): + Unique identifier for the target message thread (topic) of the forum. + for forum supergroups only. + reply_to_message_id (``int``, *optional*): If the message is a reply, ID of the original message. @@ -156,6 +162,10 @@ class SendDocument: """ file = None + reply_to = None + if reply_to_message_id or message_thread_id: + reply_to = types.InputReplyToMessage(reply_to_message_id=reply_to_message_id, message_thread_id=message_thread_id) + try: if isinstance(document, str): if os.path.isfile(document): @@ -195,7 +205,7 @@ class SendDocument: peer=await self.resolve_peer(chat_id), media=media, silent=disable_notification or None, - reply_to_msg_id=reply_to_message_id, + reply_to=reply_to, random_id=self.rnd_id(), schedule_date=utils.datetime_to_timestamp(schedule_date), noforwards=protect_content, diff --git a/pyrogram/methods/messages/send_location.py b/pyrogram/methods/messages/send_location.py index 2bd17681..972cd869 100644 --- a/pyrogram/methods/messages/send_location.py +++ b/pyrogram/methods/messages/send_location.py @@ -1,20 +1,21 @@ -# Pyrogram - Telegram MTProto API Client Library for Python +# Pyrofork - Telegram MTProto API Client Library for Python # Copyright (C) 2017-present Dan +# Copyright (C) 2022-present Mayuri-Chan # -# This file is part of Pyrogram. +# This file is part of Pyrofork. # -# Pyrogram is free software: you can redistribute it and/or modify +# 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. # -# Pyrogram is distributed in the hope that it will be useful, +# 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 Pyrogram. If not, see . +# along with Pyrofork. If not, see . from datetime import datetime from typing import Union @@ -31,6 +32,7 @@ class SendLocation: latitude: float, longitude: float, disable_notification: bool = None, + message_thread_id: int = None, reply_to_message_id: int = None, schedule_date: datetime = None, protect_content: bool = None, @@ -61,6 +63,10 @@ class SendLocation: Sends the message silently. Users will receive a notification with no sound. + message_thread_id (``int``, *optional*): + Unique identifier for the target message thread (topic) of the forum. + for forum supergroups only. + reply_to_message_id (``int``, *optional*): If the message is a reply, ID of the original message @@ -82,6 +88,11 @@ class SendLocation: app.send_location("me", latitude, longitude) """ + + reply_to = None + if reply_to_message_id or message_thread_id: + reply_to = types.InputReplyToMessage(reply_to_message_id=reply_to_message_id, message_thread_id=message_thread_id) + r = await self.invoke( raw.functions.messages.SendMedia( peer=await self.resolve_peer(chat_id), @@ -93,7 +104,7 @@ class SendLocation: ), message="", silent=disable_notification or None, - reply_to_msg_id=reply_to_message_id, + reply_to=reply_to, random_id=self.rnd_id(), schedule_date=utils.datetime_to_timestamp(schedule_date), noforwards=protect_content, diff --git a/pyrogram/methods/messages/send_media_group.py b/pyrogram/methods/messages/send_media_group.py index a8b905de..49eb7721 100644 --- a/pyrogram/methods/messages/send_media_group.py +++ b/pyrogram/methods/messages/send_media_group.py @@ -1,20 +1,21 @@ -# Pyrogram - Telegram MTProto API Client Library for Python +# Pyrofork - Telegram MTProto API Client Library for Python # Copyright (C) 2017-present Dan +# Copyright (C) 2022-present Mayuri-Chan # -# This file is part of Pyrogram. +# This file is part of Pyrofork. # -# Pyrogram is free software: you can redistribute it and/or modify +# 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. # -# Pyrogram is distributed in the hope that it will be useful, +# 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 Pyrogram. If not, see . +# along with Pyrofork. If not, see . import logging import os @@ -43,6 +44,7 @@ class SendMediaGroup: "types.InputMediaDocument" ]], disable_notification: bool = None, + message_thread_id: int = None, reply_to_message_id: int = None, schedule_date: datetime = None, protect_content: bool = None, @@ -64,6 +66,10 @@ class SendMediaGroup: Sends the message silently. Users will receive a notification with no sound. + message_thread_id (``int``, *optional*): + Unique identifier for the target message thread (topic) of the forum. + for forum supergroups only. + reply_to_message_id (``int``, *optional*): If the message is a reply, ID of the original message. @@ -92,6 +98,10 @@ class SendMediaGroup: """ multi_media = [] + reply_to = None + if reply_to_message_id or message_thread_id: + reply_to = types.InputReplyToMessage(reply_to_message_id=reply_to_message_id, message_thread_id=message_thread_id) + for i in media: if isinstance(i, types.InputMediaPhoto): if isinstance(i.media, str): @@ -395,7 +405,7 @@ class SendMediaGroup: peer=await self.resolve_peer(chat_id), multi_media=multi_media, silent=disable_notification or None, - reply_to_msg_id=reply_to_message_id, + reply_to=reply_to, schedule_date=utils.datetime_to_timestamp(schedule_date), noforwards=protect_content ), diff --git a/pyrogram/methods/messages/send_message.py b/pyrogram/methods/messages/send_message.py index 09a5e4d9..ab068078 100644 --- a/pyrogram/methods/messages/send_message.py +++ b/pyrogram/methods/messages/send_message.py @@ -1,20 +1,21 @@ -# Pyrogram - Telegram MTProto API Client Library for Python +# Pyrofork - Telegram MTProto API Client Library for Python # Copyright (C) 2017-present Dan +# Copyright (C) 2022-present Mayuri-Chan # -# This file is part of Pyrogram. +# This file is part of Pyrofork. # -# Pyrogram is free software: you can redistribute it and/or modify +# 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. # -# Pyrogram is distributed in the hope that it will be useful, +# 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 Pyrogram. If not, see . +# along with Pyrofork. If not, see . from datetime import datetime from typing import Union, List, Optional @@ -33,6 +34,7 @@ class SendMessage: entities: List["types.MessageEntity"] = None, disable_web_page_preview: bool = None, disable_notification: bool = None, + message_thread_id: int = None, reply_to_message_id: int = None, schedule_date: datetime = None, protect_content: bool = None, @@ -70,6 +72,10 @@ class SendMessage: Sends the message silently. Users will receive a notification with no sound. + message_thread_id (``int``, *optional*): + Unique identifier for the target message thread (topic) of the forum. + for forum supergroups only. + reply_to_message_id (``int``, *optional*): If the message is a reply, ID of the original message. @@ -123,12 +129,16 @@ class SendMessage: message, entities = (await utils.parse_text_entities(self, text, parse_mode, entities)).values() + reply_to = None + if reply_to_message_id or message_thread_id: + reply_to = types.InputReplyToMessage(reply_to_message_id=reply_to_message_id, message_thread_id=message_thread_id) + r = await self.invoke( raw.functions.messages.SendMessage( peer=await self.resolve_peer(chat_id), no_webpage=disable_web_page_preview or None, silent=disable_notification or None, - reply_to_msg_id=reply_to_message_id, + reply_to=reply_to, random_id=self.rnd_id(), schedule_date=utils.datetime_to_timestamp(schedule_date), reply_markup=await reply_markup.write(self) if reply_markup else None, diff --git a/pyrogram/methods/messages/send_photo.py b/pyrogram/methods/messages/send_photo.py index 61298a5c..909cfa56 100644 --- a/pyrogram/methods/messages/send_photo.py +++ b/pyrogram/methods/messages/send_photo.py @@ -1,20 +1,21 @@ -# Pyrogram - Telegram MTProto API Client Library for Python +# Pyrofork - Telegram MTProto API Client Library for Python # Copyright (C) 2017-present Dan +# Copyright (C) 2022-present Mayuri-Chan # -# This file is part of Pyrogram. +# This file is part of Pyrofork. # -# Pyrogram is free software: you can redistribute it and/or modify +# 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. # -# Pyrogram is distributed in the hope that it will be useful, +# 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 Pyrogram. If not, see . +# along with Pyrofork. If not, see . import os import re @@ -40,6 +41,7 @@ class SendPhoto: has_spoiler: bool = None, ttl_seconds: int = None, disable_notification: bool = None, + message_thread_id: int = None, reply_to_message_id: int = None, schedule_date: datetime = None, protect_content: bool = None, @@ -91,6 +93,10 @@ class SendPhoto: Sends the message silently. Users will receive a notification with no sound. + message_thread_id (``int``, *optional*): + Unique identifier for the target message thread (topic) of the forum. + for forum supergroups only. + reply_to_message_id (``int``, *optional*): If the message is a reply, ID of the original message. @@ -147,6 +153,10 @@ class SendPhoto: """ file = None + reply_to = None + if reply_to_message_id or message_thread_id: + reply_to = types.InputReplyToMessage(reply_to_message_id=reply_to_message_id, message_thread_id=message_thread_id) + try: if isinstance(photo, str): if os.path.isfile(photo): @@ -179,7 +189,7 @@ class SendPhoto: peer=await self.resolve_peer(chat_id), media=media, silent=disable_notification or None, - reply_to_msg_id=reply_to_message_id, + reply_to=reply_to, random_id=self.rnd_id(), schedule_date=utils.datetime_to_timestamp(schedule_date), noforwards=protect_content, diff --git a/pyrogram/methods/messages/send_poll.py b/pyrogram/methods/messages/send_poll.py index 267dcb6d..d58c0c69 100644 --- a/pyrogram/methods/messages/send_poll.py +++ b/pyrogram/methods/messages/send_poll.py @@ -1,20 +1,21 @@ -# Pyrogram - Telegram MTProto API Client Library for Python +# Pyrofork - Telegram MTProto API Client Library for Python # Copyright (C) 2017-present Dan +# Copyright (C) 2022-present Mayuri-Chan # -# This file is part of Pyrogram. +# This file is part of Pyrofork. # -# Pyrogram is free software: you can redistribute it and/or modify +# 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. # -# Pyrogram is distributed in the hope that it will be useful, +# 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 Pyrogram. If not, see . +# along with Pyrofork. If not, see . from datetime import datetime from typing import Union, List @@ -42,6 +43,7 @@ class SendPoll: is_closed: bool = None, disable_notification: bool = None, protect_content: bool = None, + message_thread_id: int = None, reply_to_message_id: int = None, schedule_date: datetime = None, reply_markup: Union[ @@ -114,6 +116,10 @@ class SendPoll: protect_content (``bool``, *optional*): Protects the contents of the sent message from forwarding and saving. + message_thread_id (``int``, *optional*): + Unique identifier for the target message thread (topic) of the forum. + for forum supergroups only. + reply_to_message_id (``int``, *optional*): If the message is a reply, ID of the original message. @@ -133,6 +139,10 @@ class SendPoll: await app.send_poll(chat_id, "Is this a poll question?", ["Yes", "No", "Maybe"]) """ + reply_to = None + if reply_to_message_id or message_thread_id: + reply_to = types.InputReplyToMessage(reply_to_message_id=reply_to_message_id, message_thread_id=message_thread_id) + solution, solution_entities = (await utils.parse_text_entities( self, explanation, explanation_parse_mode, explanation_entities )).values() @@ -161,7 +171,7 @@ class SendPoll: ), message="", silent=disable_notification, - reply_to_msg_id=reply_to_message_id, + reply_to=reply_to, random_id=self.rnd_id(), schedule_date=utils.datetime_to_timestamp(schedule_date), noforwards=protect_content, diff --git a/pyrogram/methods/messages/send_sticker.py b/pyrogram/methods/messages/send_sticker.py index ccfaada5..04d67965 100644 --- a/pyrogram/methods/messages/send_sticker.py +++ b/pyrogram/methods/messages/send_sticker.py @@ -1,20 +1,21 @@ -# Pyrogram - Telegram MTProto API Client Library for Python +# Pyrofork - Telegram MTProto API Client Library for Python # Copyright (C) 2017-present Dan +# Copyright (C) 2022-present Mayuri-Chan # -# This file is part of Pyrogram. +# This file is part of Pyrofork. # -# Pyrogram is free software: you can redistribute it and/or modify +# 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. # -# Pyrogram is distributed in the hope that it will be useful, +# 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 Pyrogram. If not, see . +# along with Pyrofork. If not, see . import os import re @@ -36,6 +37,7 @@ class SendSticker: chat_id: Union[int, str], sticker: Union[str, BinaryIO], disable_notification: bool = None, + message_thread_id: int = None, reply_to_message_id: int = None, schedule_date: datetime = None, protect_content: bool = None, @@ -69,6 +71,10 @@ class SendSticker: Sends the message silently. Users will receive a notification with no sound. + message_thread_id (``int``, *optional*): + Unique identifier for the target message thread (topic) of the forum. + for forum supergroups only. + reply_to_message_id (``int``, *optional*): If the message is a reply, ID of the original message. @@ -120,6 +126,10 @@ class SendSticker: """ file = None + reply_to = None + if reply_to_message_id or message_thread_id: + reply_to = types.InputReplyToMessage(reply_to_message_id=reply_to_message_id, message_thread_id=message_thread_id) + try: if isinstance(sticker, str): if os.path.isfile(sticker): @@ -154,7 +164,7 @@ class SendSticker: peer=await self.resolve_peer(chat_id), media=media, silent=disable_notification or None, - reply_to_msg_id=reply_to_message_id, + reply_to=reply_to, random_id=self.rnd_id(), schedule_date=utils.datetime_to_timestamp(schedule_date), noforwards=protect_content, diff --git a/pyrogram/methods/messages/send_venue.py b/pyrogram/methods/messages/send_venue.py index 4d3167bf..4013796f 100644 --- a/pyrogram/methods/messages/send_venue.py +++ b/pyrogram/methods/messages/send_venue.py @@ -1,20 +1,21 @@ -# Pyrogram - Telegram MTProto API Client Library for Python +# Pyrofork - Telegram MTProto API Client Library for Python # Copyright (C) 2017-present Dan +# Copyright (C) 2022-present Mayuri-Chan # -# This file is part of Pyrogram. +# This file is part of Pyrofork. # -# Pyrogram is free software: you can redistribute it and/or modify +# 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. # -# Pyrogram is distributed in the hope that it will be useful, +# 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 Pyrogram. If not, see . +# along with Pyrofork. If not, see . from datetime import datetime from typing import Union @@ -35,6 +36,7 @@ class SendVenue: foursquare_id: str = "", foursquare_type: str = "", disable_notification: bool = None, + message_thread_id: int = None, reply_to_message_id: int = None, schedule_date: datetime = None, protect_content: bool = None, @@ -78,6 +80,10 @@ class SendVenue: Sends the message silently. Users will receive a notification with no sound. + message_thread_id (``int``, *optional*): + Unique identifier for the target message thread (topic) of the forum. + for forum supergroups only. + reply_to_message_id (``int``, *optional*): If the message is a reply, ID of the original message @@ -101,6 +107,11 @@ class SendVenue: "me", latitude, longitude, "Venue title", "Venue address") """ + + reply_to = None + if reply_to_message_id or message_thread_id: + reply_to = types.InputReplyToMessage(reply_to_message_id=reply_to_message_id, message_thread_id=message_thread_id) + r = await self.invoke( raw.functions.messages.SendMedia( peer=await self.resolve_peer(chat_id), @@ -117,7 +128,7 @@ class SendVenue: ), message="", silent=disable_notification or None, - reply_to_msg_id=reply_to_message_id, + reply_to=reply_to, random_id=self.rnd_id(), schedule_date=utils.datetime_to_timestamp(schedule_date), noforwards=protect_content, diff --git a/pyrogram/methods/messages/send_video.py b/pyrogram/methods/messages/send_video.py index e869dd17..fb44db28 100644 --- a/pyrogram/methods/messages/send_video.py +++ b/pyrogram/methods/messages/send_video.py @@ -1,20 +1,21 @@ -# Pyrogram - Telegram MTProto API Client Library for Python +# Pyrofork - Telegram MTProto API Client Library for Python # Copyright (C) 2017-present Dan +# Copyright (C) 2022-present Mayuri-Chan # -# This file is part of Pyrogram. +# This file is part of Pyrofork. # -# Pyrogram is free software: you can redistribute it and/or modify +# 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. # -# Pyrogram is distributed in the hope that it will be useful, +# 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 Pyrogram. If not, see . +# along with Pyrofork. If not, see . import os import re @@ -47,6 +48,7 @@ class SendVideo: file_name: str = None, supports_streaming: bool = True, disable_notification: bool = None, + message_thread_id: int = None, reply_to_message_id: int = None, schedule_date: datetime = None, protect_content: bool = None, @@ -121,6 +123,10 @@ class SendVideo: Sends the message silently. Users will receive a notification with no sound. + message_thread_id (``int``, *optional*): + Unique identifier for the target message thread (topic) of the forum. + for forum supergroups only. + reply_to_message_id (``int``, *optional*): If the message is a reply, ID of the original message. @@ -180,6 +186,10 @@ class SendVideo: """ file = None + reply_to = None + if reply_to_message_id or message_thread_id: + reply_to = types.InputReplyToMessage(reply_to_message_id=reply_to_message_id, message_thread_id=message_thread_id) + try: if isinstance(video, str): if os.path.isfile(video): @@ -236,7 +246,7 @@ class SendVideo: peer=await self.resolve_peer(chat_id), media=media, silent=disable_notification or None, - reply_to_msg_id=reply_to_message_id, + reply_to=reply_to, random_id=self.rnd_id(), schedule_date=utils.datetime_to_timestamp(schedule_date), noforwards=protect_content, diff --git a/pyrogram/methods/messages/send_video_note.py b/pyrogram/methods/messages/send_video_note.py index 9c615d31..43ecb791 100644 --- a/pyrogram/methods/messages/send_video_note.py +++ b/pyrogram/methods/messages/send_video_note.py @@ -1,20 +1,21 @@ -# Pyrogram - Telegram MTProto API Client Library for Python +# Pyrofork - Telegram MTProto API Client Library for Python # Copyright (C) 2017-present Dan +# Copyright (C) 2022-present Mayuri-Chan # -# This file is part of Pyrogram. +# This file is part of Pyrofork. # -# Pyrogram is free software: you can redistribute it and/or modify +# 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. # -# Pyrogram is distributed in the hope that it will be useful, +# 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 Pyrogram. If not, see . +# along with Pyrofork. If not, see . import os from datetime import datetime @@ -38,6 +39,7 @@ class SendVideoNote: length: int = 1, thumb: Union[str, BinaryIO] = None, disable_notification: bool = None, + message_thread_id: int = None, reply_to_message_id: int = None, schedule_date: datetime = None, protect_content: bool = None, @@ -83,6 +85,10 @@ class SendVideoNote: Sends the message silently. Users will receive a notification with no sound. + message_thread_id (``int``, *optional*): + Unique identifier for the target message thread (topic) of the forum. + for forum supergroups only. + reply_to_message_id (``int``, *optional*): If the message is a reply, ID of the original message @@ -134,6 +140,10 @@ class SendVideoNote: """ file = None + reply_to = None + if reply_to_message_id or message_thread_id: + reply_to = types.InputReplyToMessage(reply_to_message_id=reply_to_message_id, message_thread_id=message_thread_id) + try: if isinstance(video_note, str): if os.path.isfile(video_note): @@ -178,7 +188,7 @@ class SendVideoNote: peer=await self.resolve_peer(chat_id), media=media, silent=disable_notification or None, - reply_to_msg_id=reply_to_message_id, + reply_to=reply_to, random_id=self.rnd_id(), schedule_date=utils.datetime_to_timestamp(schedule_date), noforwards=protect_content, diff --git a/pyrogram/methods/messages/send_voice.py b/pyrogram/methods/messages/send_voice.py index 266702fd..2cfa5c5a 100644 --- a/pyrogram/methods/messages/send_voice.py +++ b/pyrogram/methods/messages/send_voice.py @@ -1,20 +1,21 @@ -# Pyrogram - Telegram MTProto API Client Library for Python +# Pyrofork - Telegram MTProto API Client Library for Python # Copyright (C) 2017-present Dan +# Copyright (C) 2022-present Mayuri-Chan # -# This file is part of Pyrogram. +# This file is part of Pyrofork. # -# Pyrogram is free software: you can redistribute it and/or modify +# 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. # -# Pyrogram is distributed in the hope that it will be useful, +# 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 Pyrogram. If not, see . +# along with Pyrofork. If not, see . import os import re @@ -40,6 +41,7 @@ class SendVoice: caption_entities: List["types.MessageEntity"] = None, duration: int = 0, disable_notification: bool = None, + message_thread_id: int = None, reply_to_message_id: int = None, schedule_date: datetime = None, protect_content: bool = None, @@ -86,6 +88,10 @@ class SendVoice: Sends the message silently. Users will receive a notification with no sound. + message_thread_id (``int``, *optional*): + Unique identifier for the target message thread (topic) of the forum. + for forum supergroups only. + reply_to_message_id (``int``, *optional*): If the message is a reply, ID of the original message @@ -139,6 +145,10 @@ class SendVoice: """ file = None + reply_to = None + if reply_to_message_id or message_thread_id: + reply_to = types.InputReplyToMessage(reply_to_message_id=reply_to_message_id, message_thread_id=message_thread_id) + try: if isinstance(voice, str): if os.path.isfile(voice): @@ -179,7 +189,7 @@ class SendVoice: peer=await self.resolve_peer(chat_id), media=media, silent=disable_notification or None, - reply_to_msg_id=reply_to_message_id, + reply_to=reply_to, random_id=self.rnd_id(), schedule_date=utils.datetime_to_timestamp(schedule_date), noforwards=protect_content, diff --git a/pyrogram/types/input_message_content/__init__.py b/pyrogram/types/input_message_content/__init__.py index b445f3ba..8312cfd4 100644 --- a/pyrogram/types/input_message_content/__init__.py +++ b/pyrogram/types/input_message_content/__init__.py @@ -1,24 +1,26 @@ -# Pyrogram - Telegram MTProto API Client Library for Python +# Pyrofork - Telegram MTProto API Client Library for Python # Copyright (C) 2017-present Dan +# Copyright (C) 2022-present Mayuri-Chan # -# This file is part of Pyrogram. +# This file is part of Pyrofork. # -# Pyrogram is free software: you can redistribute it and/or modify +# 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. # -# Pyrogram is distributed in the hope that it will be useful, +# 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 Pyrogram. If not, see . +# along with Pyrofork. If not, see . from .input_message_content import InputMessageContent +from .input_reply_to_message import InputReplyToMessage from .input_text_message_content import InputTextMessageContent __all__ = [ - "InputMessageContent", "InputTextMessageContent" + "InputMessageContent", "InputReplyToMessage", "InputTextMessageContent" ] diff --git a/pyrogram/types/input_message_content/input_reply_to_message.py b/pyrogram/types/input_message_content/input_reply_to_message.py new file mode 100644 index 00000000..c86d6e1d --- /dev/null +++ b/pyrogram/types/input_message_content/input_reply_to_message.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 pyrogram import raw +from ..object import Object + + +class InputReplyToMessage(Object): + """Contains information about a target replied message. + + + Parameters: + reply_to_message_id (``int``, *optional*): + ID of the original message you want to reply. + + message_thread_id (``int``, *optional*): + Unique identifier for the target message thread (topic) of the forum. + for forum supergroups only. + """ + + def __init__( + self, *, + reply_to_message_id: int = None, + message_thread_id: int = None + ): + super().__init__() + + self.reply_to_message_id = reply_to_message_id + self.message_thread_id = message_thread_id + + def write(self): + reply_to_msg_id = None + top_msg_id = None + if self.reply_to_message_id or self.message_thread_id: + if self.message_thread_id: + if not self.reply_to_message_id: + reply_to_msg_id = self.message_thread_id + else: + reply_to_msg_id = self.reply_to_message_id + top_msg_id = self.message_thread_id + else: + reply_to_msg_id = self.reply_to_message_id + return raw.types.InputReplyToMessage( + reply_to_msg_id=reply_to_msg_id, + top_msg_id=top_msg_id + ).write() + return None diff --git a/pyrogram/types/messages_and_media/message.py b/pyrogram/types/messages_and_media/message.py index 3e393b2c..1a796b2d 100644 --- a/pyrogram/types/messages_and_media/message.py +++ b/pyrogram/types/messages_and_media/message.py @@ -64,6 +64,10 @@ class Message(Object, Update): id (``int``): Unique message identifier inside this chat. + message_thread_id (``int``, *optional*): + Unique identifier of a message thread to which the message belongs. + for supergroups only + from_user (:obj:`~pyrogram.types.User`, *optional*): Sender, empty for messages sent to channels. @@ -79,6 +83,10 @@ class Message(Object, Update): chat (:obj:`~pyrogram.types.Chat`, *optional*): Conversation the message belongs to. + topics (:obj:`~pyrogram.types.ForumTopic`, *optional*): + Topic the message belongs to. + only returned using when client.get_messages. + forward_from (:obj:`~pyrogram.types.User`, *optional*): For forwarded messages, sender of the original message. @@ -97,6 +105,9 @@ class Message(Object, Update): forward_date (:py:obj:`~datetime.datetime`, *optional*): For forwarded messages, date the original message was sent. + is_topic_message (``bool``, *optional*): + True, if the message is sent to a forum topic + reply_to_message_id (``int``, *optional*): The id of the message which this message directly replied to. @@ -261,8 +272,8 @@ class Message(Object, Update): views (``int``, *optional*): Channel post views. - - forwards (``int``, *optional*): + + forwards (``int``, *optional*): Channel post forwards. via_bot (:obj:`~pyrogram.types.User`): @@ -283,6 +294,24 @@ class Message(Object, Update): E.g.: "/start 1 2 3" would produce ["start", "1", "2", "3"]. Only applicable when using :obj:`~pyrogram.filters.command`. + forum_topic_created (:obj:`~pyrogram.types.ForumTopicCreated`, *optional*): + Service message: forum topic created + + forum_topic_closed (:obj:`~pyrogram.types.ForumTopicClosed`, *optional*): + Service message: forum topic closed + + forum_topic_reopened (:obj:`~pyrogram.types.ForumTopicReopened`, *optional*): + Service message: forum topic reopened + + forum_topic_edited (:obj:`~pyrogram.types.ForumTopicEdited`, *optional*): + Service message: forum topic edited + + general_topic_hidden (:obj:`~pyrogram.types.GeneralTopicHidden`, *optional*): + Service message: forum general topic hidden + + general_topic_unhidden (:obj:`~pyrogram.types.GeneralTopicUnhidden`, *optional*): + Service message: forum general topic unhidden + video_chat_scheduled (:obj:`~pyrogram.types.VideoChatScheduled`, *optional*): Service message: voice chat scheduled. @@ -316,16 +345,19 @@ class Message(Object, Update): *, client: "pyrogram.Client" = None, id: int, + message_thread_id: int = None, from_user: "types.User" = None, sender_chat: "types.Chat" = None, date: datetime = None, chat: "types.Chat" = None, + topics: "types.ForumTopic" = None, forward_from: "types.User" = None, forward_sender_name: str = None, forward_from_chat: "types.Chat" = None, forward_from_message_id: int = None, forward_signature: str = None, forward_date: datetime = None, + is_topic_message: bool = None, reply_to_message_id: int = None, reply_to_top_message_id: int = None, reply_to_message: "Message" = None, @@ -378,6 +410,12 @@ class Message(Object, Update): outgoing: bool = None, matches: List[Match] = None, command: List[str] = None, + forum_topic_created: "types.ForumTopicCreated" = None, + forum_topic_closed: "types.ForumTopicClosed" = None, + forum_topic_reopened: "types.ForumTopicReopened" = None, + forum_topic_edited: "types.ForumTopicEdited" = None, + general_topic_hidden: "types.GeneralTopicHidden" = None, + general_topic_unhidden: "types.GeneralTopicUnhidden" = None, video_chat_scheduled: "types.VideoChatScheduled" = None, video_chat_started: "types.VideoChatStarted" = None, video_chat_ended: "types.VideoChatEnded" = None, @@ -394,16 +432,19 @@ class Message(Object, Update): super().__init__(client) self.id = id + self.message_thread_id = message_thread_id self.from_user = from_user self.sender_chat = sender_chat self.date = date self.chat = chat + self.topics = topics self.forward_from = forward_from self.forward_sender_name = forward_sender_name self.forward_from_chat = forward_from_chat self.forward_from_message_id = forward_from_message_id self.forward_signature = forward_signature self.forward_date = forward_date + self.is_topic_message = is_topic_message self.reply_to_message_id = reply_to_message_id self.reply_to_top_message_id = reply_to_top_message_id self.reply_to_message = reply_to_message @@ -457,6 +498,12 @@ class Message(Object, Update): self.matches = matches self.command = command self.reply_markup = reply_markup + self.forum_topic_created = forum_topic_created + self.forum_topic_closed = forum_topic_closed + self.forum_topic_reopened = forum_topic_reopened + self.forum_topic_edited = forum_topic_edited + self.general_topic_hidden = general_topic_hidden + self.general_topic_unhidden = general_topic_unhidden self.video_chat_scheduled = video_chat_scheduled self.video_chat_started = video_chat_started self.video_chat_ended = video_chat_ended @@ -470,6 +517,7 @@ class Message(Object, Update): message: raw.base.Message, users: dict, chats: dict, + topics: dict = None, is_scheduled: bool = False, replies: int = 1 ): @@ -497,6 +545,7 @@ class Message(Object, Update): users.update({i.id: i for i in r}) if isinstance(message, raw.types.MessageService): + message_thread_id = None action = message.action new_chat_members = None @@ -509,6 +558,13 @@ class Message(Object, Update): group_chat_created = None channel_chat_created = None new_chat_photo = None + is_topic_message = None + forum_topic_created = None + forum_topic_closed = None + forum_topic_reopened = None + forum_topic_edited = None + general_topic_hidden = None + general_topic_unhidden = None video_chat_scheduled = None video_chat_started = None video_chat_ended = None @@ -550,6 +606,26 @@ 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.MessageActionTopicCreate): + forum_topic_created = types.ForumTopicCreated._parse(action) + service_type = enums.MessageServiceType.FORUM_TOPIC_CREATED + elif isinstance(action, raw.types.MessageActionTopicEdit): + if action.title: + forum_topic_edited = types.ForumTopicEdited._parse(action) + service_type = enums.MessageServiceType.FORUM_TOPIC_EDITED + elif action.hidden: + general_topic_hidden = types.GeneralTopicHidden() + service_type = enums.MessageServiceType.GENERAL_TOPIC_HIDDEN + elif action.closed: + forum_topic_closed = types.ForumTopicClosed() + service_type = enums.MessageServiceType.FORUM_TOPIC_CLOSED + else: + if hasattr(action, "hidden"): + general_topic_unhidden = types.GeneralTopicUnhidden() + service_type = enums.MessageServiceType.GENERAL_TOPIC_UNHIDDEN + else: + forum_topic_reopened = types.ForumTopicReopened() + service_type = enums.MessageServiceType.FORUM_TOPIC_REOPENED elif isinstance(action, raw.types.MessageActionGroupCallScheduled): video_chat_scheduled = types.VideoChatScheduled._parse(action) service_type = enums.MessageServiceType.VIDEO_CHAT_SCHEDULED @@ -572,8 +648,10 @@ class Message(Object, Update): parsed_message = Message( id=message.id, + message_thread_id=message_thread_id, date=utils.timestamp_to_datetime(message.date), chat=types.Chat._parse(client, message, users, chats, is_chat=True), + topics=None, from_user=from_user, sender_chat=sender_chat, service=service_type, @@ -587,6 +665,13 @@ class Message(Object, Update): migrate_from_chat_id=-migrate_from_chat_id if migrate_from_chat_id else None, group_chat_created=group_chat_created, channel_chat_created=channel_chat_created, + is_topic_message=is_topic_message, + forum_topic_created=forum_topic_created, + forum_topic_closed=forum_topic_closed, + forum_topic_reopened=forum_topic_reopened, + forum_topic_edited=forum_topic_edited, + general_topic_hidden=general_topic_hidden, + general_topic_unhidden=general_topic_unhidden, video_chat_scheduled=video_chat_scheduled, video_chat_started=video_chat_started, video_chat_ended=video_chat_ended, @@ -625,9 +710,18 @@ class Message(Object, Update): client.message_cache[(parsed_message.chat.id, parsed_message.id)] = parsed_message + if message.reply_to: + if message.reply_to.forum_topic: + if message.reply_to.reply_to_top_id: + parsed_message.message_thread_id = message.reply_to.reply_to_top_id + else: + parsed_message.message_thread_id = message.reply_to.reply_to_msg_id + parsed_message.is_topic_message = True + return parsed_message if isinstance(message, raw.types.Message): + message_thread_id = None entities = [types.MessageEntity._parse(client, entity, users) for entity in message.entities] entities = types.List(filter(lambda x: x is not None, entities)) @@ -637,6 +731,7 @@ class Message(Object, Update): forward_from_message_id = None forward_signature = None forward_date = None + is_topic_message = None forward_header = message.fwd_from # type: raw.types.MessageFwdHeader @@ -771,8 +866,10 @@ class Message(Object, Update): parsed_message = Message( id=message.id, + message_thread_id=message_thread_id, date=utils.timestamp_to_datetime(message.date), chat=types.Chat._parse(client, message, users, chats, is_chat=True), + topics=None, from_user=from_user, sender_chat=sender_chat, text=( @@ -804,6 +901,7 @@ class Message(Object, Update): forward_from_message_id=forward_from_message_id, forward_signature=forward_signature, forward_date=forward_date, + is_topic_message=is_topic_message, mentioned=message.mentioned, scheduled=is_scheduled, from_scheduled=message.from_scheduled, @@ -835,8 +933,26 @@ class Message(Object, Update): ) if message.reply_to: - parsed_message.reply_to_message_id = message.reply_to.reply_to_msg_id - parsed_message.reply_to_top_message_id = message.reply_to.reply_to_top_id + if message.reply_to.forum_topic: + if message.reply_to.reply_to_top_id: + thread_id = message.reply_to.reply_to_top_id + parsed_message.reply_to_message_id = message.reply_to.reply_to_msg_id + else: + thread_id = message.reply_to.reply_to_msg_id + parsed_message.message_thread_id = thread_id + parsed_message.is_topic_message = True + if topics: + parsed_message.topics = types.ForumTopic._parse(topics[thread_id]) + else: + try: + msg = await client.get_messages(parsed_message.chat.id,message.id) + if getattr(msg, "topics"): + parsed_message.topics = msg.topics + except Exception: + pass + else: + parsed_message.reply_to_message_id = message.reply_to.reply_to_msg_id + parsed_message.reply_to_top_message_id = message.reply_to.reply_to_top_id if replies: try: @@ -849,8 +965,8 @@ class Message(Object, Update): reply_to_message_ids=message.id, replies=replies - 1 ) - - parsed_message.reply_to_message = reply_to_message + if reply_to_message and not reply_to_message.forum_topic_created: + parsed_message.reply_to_message = reply_to_message except MessageIdsEmpty: pass @@ -1713,6 +1829,7 @@ class Message(Object, Update): result_id: str, quote: bool = None, disable_notification: bool = None, + message_thread_id: bool = None, reply_to_message_id: int = None ) -> "Message": """Bound method *reply_inline_bot_result* of :obj:`~pyrogram.types.Message`. @@ -1768,6 +1885,7 @@ class Message(Object, Update): query_id=query_id, result_id=result_id, disable_notification=disable_notification, + message_thread_id=message_thread_id, reply_to_message_id=reply_to_message_id ) @@ -2979,6 +3097,7 @@ class Message(Object, Update): async def forward( self, chat_id: Union[int, str], + message_thread_id: int = None, disable_notification: bool = None, schedule_date: datetime = None ) -> Union["types.Message", List["types.Message"]]: @@ -3005,6 +3124,9 @@ class Message(Object, Update): 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_thread_id (``int``, *optional*): + Unique identifier of a message thread to which the message belongs; for supergroups only + disable_notification (``bool``, *optional*): Sends the message silently. Users will receive a notification with no sound. @@ -3022,6 +3144,7 @@ class Message(Object, Update): chat_id=chat_id, from_chat_id=self.chat.id, message_ids=self.id, + message_thread_id=message_thread_id, disable_notification=disable_notification, schedule_date=schedule_date ) @@ -3033,6 +3156,7 @@ class Message(Object, Update): parse_mode: Optional["enums.ParseMode"] = None, caption_entities: List["types.MessageEntity"] = None, disable_notification: bool = None, + message_thread_id: int = None, reply_to_message_id: int = None, schedule_date: datetime = None, protect_content: bool = None, @@ -3082,6 +3206,10 @@ class Message(Object, Update): Sends the message silently. Users will receive a notification with no sound. + message_thread_id (``int``, *optional*): + Unique identifier for the target message thread (topic) of the forum. + for forum supergroups only. + reply_to_message_id (``int``, *optional*): If the message is a reply, ID of the original message. @@ -3119,6 +3247,7 @@ class Message(Object, Update): parse_mode=enums.ParseMode.DISABLED, disable_web_page_preview=not self.web_page, disable_notification=disable_notification, + message_thread_id=message_thread_id, reply_to_message_id=reply_to_message_id, schedule_date=schedule_date, protect_content=protect_content, @@ -3129,6 +3258,7 @@ class Message(Object, Update): self._client.send_cached_media, chat_id=chat_id, disable_notification=disable_notification, + message_thread_id=message_thread_id, reply_to_message_id=reply_to_message_id, schedule_date=schedule_date, protect_content=protect_content, @@ -3159,6 +3289,7 @@ class Message(Object, Update): last_name=self.contact.last_name, vcard=self.contact.vcard, disable_notification=disable_notification, + message_thread_id=message_thread_id, schedule_date=schedule_date ) elif self.location: @@ -3167,6 +3298,7 @@ class Message(Object, Update): latitude=self.location.latitude, longitude=self.location.longitude, disable_notification=disable_notification, + message_thread_id=message_thread_id, schedule_date=schedule_date ) elif self.venue: @@ -3179,6 +3311,7 @@ class Message(Object, Update): foursquare_id=self.venue.foursquare_id, foursquare_type=self.venue.foursquare_type, disable_notification=disable_notification, + message_thread_id=message_thread_id, schedule_date=schedule_date ) elif self.poll: @@ -3187,19 +3320,24 @@ class Message(Object, Update): question=self.poll.question, options=[opt.text for opt in self.poll.options], disable_notification=disable_notification, + message_thread_id=message_thread_id, schedule_date=schedule_date ) elif self.game: return await self._client.send_game( chat_id, game_short_name=self.game.short_name, - disable_notification=disable_notification + disable_notification=disable_notification, + message_thread_id=message_thread_id ) else: raise ValueError("Unknown media type") if self.sticker or self.video_note: # Sticker and VideoNote should have no caption - return await send_media(file_id=file_id) + return await send_media( + file_id=file_id, + message_thread_id=message_thread_id + ) else: if caption is None: caption = self.caption or "" @@ -3209,7 +3347,8 @@ class Message(Object, Update): file_id=file_id, caption=caption, parse_mode=parse_mode, - caption_entities=caption_entities + caption_entities=caption_entities, + message_thread_id=message_thread_id ) else: raise ValueError("Can't copy this message") diff --git a/pyrogram/types/user_and_chats/__init__.py b/pyrogram/types/user_and_chats/__init__.py index f0112112..24c69d7b 100644 --- a/pyrogram/types/user_and_chats/__init__.py +++ b/pyrogram/types/user_and_chats/__init__.py @@ -38,6 +38,15 @@ from .invite_link_importer import InviteLinkImporter from .restriction import Restriction from .user import User from .username import Username +from .forum_topic import ForumTopic +from .forum_topic_created import ForumTopicCreated +from .forum_topic_closed import ForumTopicClosed +from .forum_topic_reopened import ForumTopicReopened +from .forum_topic_edited import ForumTopicEdited +from .general_forum_topic_hidden import GeneralTopicHidden +from .general_forum_topic_unhidden import GeneralTopicUnhidden +from .peer_channel import PeerChannel +from .peer_user import PeerUser from .video_chat_ended import VideoChatEnded from .video_chat_members_invited import VideoChatMembersInvited from .video_chat_scheduled import VideoChatScheduled @@ -58,6 +67,15 @@ __all__ = [ "ChatInviteLink", "InviteLinkImporter", "ChatAdminWithInviteLinks", + "ForumTopic", + "ForumTopicCreated", + "ForumTopicClosed", + "ForumTopicReopened", + "ForumTopicEdited", + "GeneralTopicHidden", + "GeneralTopicUnhidden", + "PeerChannel", + "PeerUser", "VideoChatStarted", "VideoChatEnded", "VideoChatMembersInvited", diff --git a/pyrogram/types/user_and_chats/chat.py b/pyrogram/types/user_and_chats/chat.py index c8287cf9..76d37f6b 100644 --- a/pyrogram/types/user_and_chats/chat.py +++ b/pyrogram/types/user_and_chats/chat.py @@ -56,6 +56,9 @@ class Chat(Object): is_support (``bool``): True, if this chat is part of the Telegram support team. Users and bots only. + is_forum (``bool``, *optional*): + True, if the supergroup chat is a forum + title (``str``, *optional*): Title, for supergroups, channels and basic group chats. @@ -151,6 +154,7 @@ class Chat(Object): is_scam: bool = None, is_fake: bool = None, is_support: bool = None, + is_forum: bool = None, title: str = None, username: str = None, first_name: str = None, @@ -183,6 +187,7 @@ class Chat(Object): self.is_scam = is_scam self.is_fake = is_fake self.is_support = is_support + self.is_forum = is_forum self.title = title self.username = username self.first_name = first_name @@ -273,6 +278,7 @@ class Chat(Object): is_creator=getattr(channel, "creator", None), is_scam=getattr(channel, "scam", None), is_fake=getattr(channel, "fake", None), + is_forum=getattr(channel, "forum", None), title=channel.title, username=getattr(channel, "username", None), usernames=usernames, diff --git a/pyrogram/types/user_and_chats/chat_event.py b/pyrogram/types/user_and_chats/chat_event.py index 88ff42f3..987e76bd 100644 --- a/pyrogram/types/user_and_chats/chat_event.py +++ b/pyrogram/types/user_and_chats/chat_event.py @@ -1,20 +1,21 @@ -# Pyrogram - Telegram MTProto API Client Library for Python +# Pyrofork - Telegram MTProto API Client Library for Python # Copyright (C) 2017-present Dan +# Copyright (C) 2022-present Mayuri-Chan # -# This file is part of Pyrogram. +# This file is part of Pyrofork. # -# Pyrogram is free software: you can redistribute it and/or modify +# 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. # -# Pyrogram is distributed in the hope that it will be useful, +# 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 Pyrogram. If not, see . +# along with Pyrofork. If not, see . from datetime import datetime from typing import List, Optional @@ -130,6 +131,18 @@ class ChatEvent(Object): deleted_invite_link (:obj:`~pyrogram.types.ChatInviteLink`, *optional*): Deleted invite link. For :obj:`~pyrogram.enums.ChatEventAction.INVITE_LINK_DELETED` action only. + + created_forum_topic (:obj:`~pyrogram.types.ForumTopic`, *optional*): + New forum topic. + For :obj:`~pyrogram.enums.ChatEvenAction.CREATED_FORUM_TOPIC` action only. + + old_forum_topic, new_forum_topic (:obj:`~pyrogram.types.ForumTopic`, *optional*): + Edited forum topic. + For :obj:`~pyrogram.enums.ChatEvenAction.EDITED_FORUM_TOPIC` action only. + + deleted_forum_topic (:obj:`~pyrogram.types.ForumTopic`, *optional*): + Deleted forum topic. + For :obj:`~pyrogram.enums.ChatEvenAction.DELETED_FORUM_TOPIC` action only. """ def __init__( @@ -190,7 +203,12 @@ class ChatEvent(Object): old_invite_link: "types.ChatInviteLink" = None, new_invite_link: "types.ChatInviteLink" = None, revoked_invite_link: "types.ChatInviteLink" = None, - deleted_invite_link: "types.ChatInviteLink" = None + deleted_invite_link: "types.ChatInviteLink" = None, + + created_forum_topic: "types.ForumTopic" = None, + old_forum_topic: "types.ForumTopic" = None, + new_forum_topic: "types.ForumTopic" = None, + deleted_forum_topic: "types.ForumTopic" = None ): super().__init__() @@ -252,6 +270,11 @@ class ChatEvent(Object): self.revoked_invite_link = revoked_invite_link self.deleted_invite_link = deleted_invite_link + self.created_forum_topic = created_forum_topic + self.old_forum_topic = old_forum_topic + self.new_forum_topic = new_forum_topic + self.deleted_forum_topic = deleted_forum_topic + @staticmethod async def _parse( client: "pyrogram.Client", @@ -318,6 +341,11 @@ class ChatEvent(Object): revoked_invite_link: Optional[types.ChatInviteLink] = None deleted_invite_link: Optional[types.ChatInviteLink] = None + created_forum_topic: Optional[types.ForumTopic] = None + old_forum_topic: Optional[types.ForumTopic] = None + new_forum_topic: Optional[types.ForumTopic] = None + deleted_forum_topic: Optional[types.ForumTopic] = None + if isinstance(action, raw.types.ChannelAdminLogEventActionChangeAbout): old_description = action.prev_value new_description = action.new_value @@ -426,6 +454,19 @@ class ChatEvent(Object): deleted_invite_link = types.ChatInviteLink._parse(client, action.invite, users) action = enums.ChatEventAction.INVITE_LINK_DELETED + elif isinstance(action, raw.types.ChannelAdminLogEventActionCreateTopic): + created_forum_topic = types.ForumTopic._parse(action.topic) + action = enums.ChatEventAction.CREATED_FORUM_TOPIC + + elif isinstance(action, raw.types.ChannelAdminLogEventActionEditTopic): + old_forum_topic = types.ForumTopic._parse(action.prev_topic) + new_forum_topic = types.ForumTopic._parse(action.new_topic) + action = enums.ChatEventAction.EDITED_FORUM_TOPIC + + elif isinstance(action, raw.types.ChannelAdminLogEventActionDeleteTopic): + created_forum_topic = types.ForumTopic._parse(action.topic) + action = enums.ChatEventAction.DELETED_FORUM_TOPIC + else: action = f"{enums.ChatEventAction.UNKNOWN}-{action.QUALNAME}" @@ -485,5 +526,9 @@ class ChatEvent(Object): old_invite_link=old_invite_link, new_invite_link=new_invite_link, revoked_invite_link=revoked_invite_link, - deleted_invite_link=deleted_invite_link + deleted_invite_link=deleted_invite_link, + created_forum_topic=created_forum_topic, + old_forum_topic=old_forum_topic, + new_forum_topic=new_forum_topic, + deleted_forum_topic=deleted_forum_topic ) diff --git a/pyrogram/types/user_and_chats/chat_permissions.py b/pyrogram/types/user_and_chats/chat_permissions.py index d920394c..6e1e3405 100644 --- a/pyrogram/types/user_and_chats/chat_permissions.py +++ b/pyrogram/types/user_and_chats/chat_permissions.py @@ -1,20 +1,21 @@ -# Pyrogram - Telegram MTProto API Client Library for Python +# Pyrofork - Telegram MTProto API Client Library for Python # Copyright (C) 2017-present Dan +# Copyright (C) 2022-present Mayuri-Chan # -# This file is part of Pyrogram. +# This file is part of Pyrofork. # -# Pyrogram is free software: you can redistribute it and/or modify +# 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. # -# Pyrogram is distributed in the hope that it will be useful, +# 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 Pyrogram. If not, see . +# along with Pyrofork. If not, see . from pyrogram import raw from ..object import Object @@ -53,6 +54,10 @@ class ChatPermissions(Object): can_pin_messages (``bool``, *optional*): True, if the user is allowed to pin messages. Ignored in public supergroups. + + can_manage_topics (``bool``, *optional*): + True, if the user is allowed to create, rename, close, and reopen forum topics. + supergroups only. """ def __init__( @@ -65,7 +70,8 @@ class ChatPermissions(Object): can_add_web_page_previews: bool = None, can_change_info: bool = None, can_invite_users: bool = None, - can_pin_messages: bool = None + can_pin_messages: bool = None, + can_manage_topics: bool = None ): super().__init__(None) @@ -77,6 +83,7 @@ class ChatPermissions(Object): self.can_change_info = can_change_info self.can_invite_users = can_invite_users self.can_pin_messages = can_pin_messages + self.can_manage_topics = can_manage_topics @staticmethod def _parse(denied_permissions: "raw.base.ChatBannedRights") -> "ChatPermissions": @@ -94,5 +101,6 @@ class ChatPermissions(Object): can_send_polls=not denied_permissions.send_polls, can_change_info=not denied_permissions.change_info, can_invite_users=not denied_permissions.invite_users, - can_pin_messages=not denied_permissions.pin_messages + can_pin_messages=not denied_permissions.pin_messages, + can_manage_topics=not denied_permissions.manage_topics ) diff --git a/pyrogram/types/user_and_chats/chat_privileges.py b/pyrogram/types/user_and_chats/chat_privileges.py index 09bb341d..03bf9f14 100644 --- a/pyrogram/types/user_and_chats/chat_privileges.py +++ b/pyrogram/types/user_and_chats/chat_privileges.py @@ -1,20 +1,21 @@ -# Pyrogram - Telegram MTProto API Client Library for Python +# Pyrofork - Telegram MTProto API Client Library for Python # Copyright (C) 2017-present Dan +# Copyright (C) 2022-present Mayuri-Chan # -# This file is part of Pyrogram. +# This file is part of Pyrofork. # -# Pyrogram is free software: you can redistribute it and/or modify +# 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. # -# Pyrogram is distributed in the hope that it will be useful, +# 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 Pyrogram. If not, see . +# along with Pyrofork. If not, see . from pyrogram import raw from ..object import Object @@ -62,6 +63,10 @@ class ChatPrivileges(Object): Groups and supergroups only. True, if the user is allowed to pin messages. + can_manage_topics (``bool``, *optional*): + supergroups only. + True, if the user is allowed to create, rename, close, and reopen forum topics. + is_anonymous (``bool``, *optional*): True, if the user's presence in the chat is hidden. """ @@ -79,6 +84,7 @@ class ChatPrivileges(Object): can_edit_messages: bool = False, # Channels only can_invite_users: bool = False, can_pin_messages: bool = False, # Groups and supergroups only + can_manage_topics: bool = False, # supergroups only. is_anonymous: bool = False ): super().__init__(None) @@ -93,6 +99,7 @@ class ChatPrivileges(Object): self.can_edit_messages: bool = can_edit_messages self.can_invite_users: bool = can_invite_users self.can_pin_messages: bool = can_pin_messages + self.can_manage_topics: bool = can_manage_topics self.is_anonymous: bool = is_anonymous @staticmethod @@ -108,5 +115,6 @@ class ChatPrivileges(Object): can_edit_messages=admin_rights.edit_messages, can_invite_users=admin_rights.invite_users, can_pin_messages=admin_rights.pin_messages, + can_manage_topics=admin_rights.manage_topics, is_anonymous=admin_rights.anonymous ) diff --git a/pyrogram/types/user_and_chats/forum_topic.py b/pyrogram/types/user_and_chats/forum_topic.py new file mode 100644 index 00000000..e8f01958 --- /dev/null +++ b/pyrogram/types/user_and_chats/forum_topic.py @@ -0,0 +1,152 @@ +# 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 pyrogram import raw, types +from typing import Union +from ..object import Object + + +class ForumTopic(Object): + # todo + # notify_settings: `~pyrogram.types.PeerNotifySettings` + # draft: `~pyrogram.types.DraftMessage` + """A forum topic. + + + Parameters: + id (``Integer``): + Id of the topic + + date (``Integer``): + Date topic created + + title (``String``): + Name of the topic + + icon_color (``Integer``): + Color of the topic icon in RGB format + + top_message (``Integer``): + N/A + + read_inbox_max_id (``Integer``): + N/A + + read_outbox_max_id (``Integer``): + N/A + + unread_count (``Integer``): + N/A + + unread_mentions_count (``Integer``): + N/A + + unread_reactions_count (``Integer``): + N/A + + from_id (:obj:`~pyrogram.types.PeerChannel` | :obj:`~pyrogram.types.PeerUser`): + Topic creator. + + my (``Boolean``, *optional*): + N/A + + closed (``Boolean``, *optional*): + N/A + + pinned (``Boolean``, *optional*): + N/A + + short (``Boolean``, *optional*): + N/A + + icon_emoji_id (``Integer``, *optional*): + Unique identifier of the custom emoji shown as the topic icon + + """ + + def __init__( + self, + *, + id: int, + date: int, + title: str, + icon_color: int, + top_message: int, + read_inbox_max_id: int, + read_outbox_max_id: int, + unread_count: int, + unread_mentions_count: int, + unread_reactions_count: int, + from_id: Union["types.PeerChannel", "types.PeerUser"], + #notify_settings: "types.PeerNotifySettings", //todo + my: bool = None, + closed: bool = None, + pinned: bool = None, + short: bool = None, + icon_emoji_id: int = None, + #draft: "types.DraftMessage" = None //todo + ): + super().__init__() + + self.id = id + self.date = date + self.title = title + self.icon_color = icon_color + self.top_message = top_message + self.read_inbox_max_id = read_inbox_max_id + self.read_outbox_max_id = read_outbox_max_id + self.unread_count = unread_count + self.unread_mentions_count = unread_mentions_count + self.unread_reactions_count = unread_reactions_count + self.from_id = from_id + #self.notify_settings = notify_settings //todo + self.my = my + self.closed = closed + self.pinned = pinned + self.short = short + self.icon_emoji_id = icon_emoji_id + #self.draft = draft //todo + + @staticmethod + def _parse(forum_topic: "raw.types.forum_topic") -> "ForumTopic": + from_id = forum_topic.from_id + if isinstance(from_id, raw.types.PeerChannel): + peer = types.PeerChannel._parse(from_id) + if isinstance(from_id, raw.types.PeerUser): + peer = types.PeerUser._parse(from_id) + + return ForumTopic( + id=getattr(forum_topic,"id", None), + date=getattr(forum_topic,"date", None), + title=getattr(forum_topic,"title", None), + icon_color=getattr(forum_topic,"icon_color", None), + top_message=getattr(forum_topic,"top_message", None), + read_inbox_max_id=getattr(forum_topic,"read_inbox_max_id", None), + read_outbox_max_id=getattr(forum_topic,"read_outbox_max_id", None), + unread_count=getattr(forum_topic,"unread_count", None), + unread_mentions_count=getattr(forum_topic,"unread_mentions_count", None), + unread_reactions_count=getattr(forum_topic,"unread_reactions_count", None), + from_id=peer, + #notify_settings=None, //todo + my=getattr(forum_topic,"my", None), + closed=getattr(forum_topic,"closed", None), + pinned=getattr(forum_topic,"pinned", None), + short=getattr(forum_topic,"short", None), + icon_emoji_id=getattr(forum_topic,"icon_emoji_id", None), + #draft=None //todo + ) diff --git a/pyrogram/types/user_and_chats/forum_topic_closed.py b/pyrogram/types/user_and_chats/forum_topic_closed.py new file mode 100644 index 00000000..d13dff87 --- /dev/null +++ b/pyrogram/types/user_and_chats/forum_topic_closed.py @@ -0,0 +1,29 @@ +# 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 ..object import Object + + +class ForumTopicClosed(Object): + """A service message about a forum topic closed in the chat. + + Currently holds no information. + """ + + def __init__(self): + super().__init__() diff --git a/pyrogram/types/user_and_chats/forum_topic_created.py b/pyrogram/types/user_and_chats/forum_topic_created.py new file mode 100644 index 00000000..ed058760 --- /dev/null +++ b/pyrogram/types/user_and_chats/forum_topic_created.py @@ -0,0 +1,58 @@ +# 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 pyrogram import raw +from ..object import Object + + +class ForumTopicCreated(Object): + """A service message about a new forum topic created in the chat. + + + Parameters: + title (``String``): + Name of the topic. + + icon_color (``Integer``): + Color of the topic icon in RGB format + + icon_emoji_id (``Integer``, *optional*): + Unique identifier of the custom emoji shown as the topic icon + """ + + def __init__( + self, *, + title: str, + icon_color: int, + icon_emoji_id: int = None + ): + super().__init__() + + self.title = title + self.icon_color = icon_color + self.icon_emoji_id = icon_emoji_id + + @staticmethod + def _parse(action: "raw.types.MessageActionTopicCreate") -> "ForumTopicCreated": + + + return ForumTopicCreated( + title=getattr(action,"title", None), + icon_color=getattr(action,"icon_color", None), + icon_emoji_id=getattr(action,"icon_emoji_id", None) + ) diff --git a/pyrogram/types/user_and_chats/forum_topic_edited.py b/pyrogram/types/user_and_chats/forum_topic_edited.py new file mode 100644 index 00000000..b5505670 --- /dev/null +++ b/pyrogram/types/user_and_chats/forum_topic_edited.py @@ -0,0 +1,58 @@ +# 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 pyrogram import raw +from ..object import Object + + +class ForumTopicEdited(Object): + """A service message about a forum topic renamed in the chat. + + + Parameters: + title (``String``): + Name of the topic. + + icon_color (``Integer``): + Color of the topic icon in RGB format + + icon_custom_emoji_id (``String``, *optional*): + Unique identifier of the custom emoji shown as the topic icon + """ + + def __init__( + self, *, + title: str = None, + icon_color: int = None, + icon_emoji_id: str = None + ): + super().__init__() + + self.title = title + self.icon_color = icon_color + self.icon_emoji_id = icon_emoji_id + + @staticmethod + def _parse(action: "raw.types.MessageActionTopicEdit") -> "ForumTopicEdited": + + + return ForumTopicEdited( + title=getattr(action,"title", None), + icon_color=getattr(action,"icon_color", None), + icon_emoji_id=getattr(action,"icon_emoji_id", None) + ) diff --git a/pyrogram/types/user_and_chats/forum_topic_reopened.py b/pyrogram/types/user_and_chats/forum_topic_reopened.py new file mode 100644 index 00000000..8993823b --- /dev/null +++ b/pyrogram/types/user_and_chats/forum_topic_reopened.py @@ -0,0 +1,29 @@ +# 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 ..object import Object + + +class ForumTopicReopened(Object): + """A service message about a forum topic reopened in the chat. + + Currently holds no information. + """ + + def __init__(self): + super().__init__() diff --git a/pyrogram/types/user_and_chats/general_forum_topic_hidden.py b/pyrogram/types/user_and_chats/general_forum_topic_hidden.py new file mode 100644 index 00000000..4854ddb5 --- /dev/null +++ b/pyrogram/types/user_and_chats/general_forum_topic_hidden.py @@ -0,0 +1,29 @@ +# 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 ..object import Object + + +class GeneralTopicHidden(Object): + """A service message about a general topic hidden in the chat. + + Currently holds no information. + """ + + def __init__(self): + super().__init__() diff --git a/pyrogram/types/user_and_chats/general_forum_topic_unhidden.py b/pyrogram/types/user_and_chats/general_forum_topic_unhidden.py new file mode 100644 index 00000000..7a9a13e8 --- /dev/null +++ b/pyrogram/types/user_and_chats/general_forum_topic_unhidden.py @@ -0,0 +1,29 @@ +# 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 ..object import Object + + +class GeneralTopicUnhidden(Object): + """A service message about a general topic unhidden in the chat. + + Currently holds no information. + """ + + def __init__(self): + super().__init__() diff --git a/pyrogram/types/user_and_chats/peer_channel.py b/pyrogram/types/user_and_chats/peer_channel.py new file mode 100644 index 00000000..a0f79078 --- /dev/null +++ b/pyrogram/types/user_and_chats/peer_channel.py @@ -0,0 +1,46 @@ +# 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 pyrogram import raw +from ..object import Object + + +class PeerChannel(Object): + """A PeerChannel. + + + Parameters: + channel_id (``Integer``): + Id of the channel. + """ + + def __init__( + self, *, + channel_id: int + ): + super().__init__() + + self.channel_id = channel_id + + @staticmethod + def _parse(action: "raw.types.PeerChannel") -> "PeerChannel": + + + return PeerChannel( + channel_id=getattr(action,"channel_id", None) + ) diff --git a/pyrogram/types/user_and_chats/peer_user.py b/pyrogram/types/user_and_chats/peer_user.py new file mode 100644 index 00000000..48a88b49 --- /dev/null +++ b/pyrogram/types/user_and_chats/peer_user.py @@ -0,0 +1,46 @@ +# 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 pyrogram import raw +from ..object import Object + + +class PeerUser(Object): + """A PeerUser. + + + Parameters: + user_id (``Integer``): + Id of the user. + """ + + def __init__( + self, *, + user_id: int + ): + super().__init__() + + self.user_id = user_id + + @staticmethod + def _parse(action: "raw.types.PeerUser") -> "PeerUser": + + + return PeerUser( + user_id=getattr(action,"user_id", None) + ) diff --git a/pyrogram/utils.py b/pyrogram/utils.py index f7fe5970..3918e559 100644 --- a/pyrogram/utils.py +++ b/pyrogram/utils.py @@ -1,20 +1,21 @@ -# Pyrogram - Telegram MTProto API Client Library for Python +# Pyrofork - Telegram MTProto API Client Library for Python # Copyright (C) 2017-present Dan +# Copyright (C) 2022-present Mayuri-Chan # -# This file is part of Pyrogram. +# This file is part of Pyrofork. # -# Pyrogram is free software: you can redistribute it and/or modify +# 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. # -# Pyrogram is distributed in the hope that it will be useful, +# 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 Pyrogram. If not, see . +# along with Pyrofork. If not, see . import asyncio import base64 @@ -91,14 +92,17 @@ async def parse_messages( ) -> List["types.Message"]: users = {i.id: i for i in messages.users} chats = {i.id: i for i in messages.chats} - + if hasattr(messages, "topics"): + topics = {i.id: i for i in messages.topics} + else: + topics = None if not messages.messages: return types.List() parsed_messages = [] for message in messages.messages: - parsed_messages.append(await types.Message._parse(client, message, users, chats, replies=0)) + parsed_messages.append(await types.Message._parse(client, message, users, chats, topics, replies=0)) if replies: messages_with_replies = { @@ -128,7 +132,8 @@ async def parse_messages( for reply in reply_messages: if reply.id == reply_id: - message.reply_to_message = reply + if not reply.forum_topic_created: + message.reply_to_message = reply return types.List(parsed_messages)