diff --git a/aiogram/dispatcher/webhook.py b/aiogram/dispatcher/webhook.py index 32987899..f875817e 100644 --- a/aiogram/dispatcher/webhook.py +++ b/aiogram/dispatcher/webhook.py @@ -1450,7 +1450,7 @@ class PromoteChatMember(BaseResponse): __slots__ = ('chat_id', 'user_id', 'can_change_info', 'can_post_messages', 'can_edit_messages', 'can_delete_messages', 'can_invite_users', 'can_restrict_members', 'can_pin_messages', - 'can_promote_members') + 'can_manage_topics', 'can_promote_members') method = api.Methods.PROMOTE_CHAT_MEMBER @@ -1463,6 +1463,7 @@ class PromoteChatMember(BaseResponse): can_invite_users: Optional[Boolean] = None, can_restrict_members: Optional[Boolean] = None, can_pin_messages: Optional[Boolean] = None, + can_manage_topics: Optional[Boolean] = None, can_promote_members: Optional[Boolean] = None): """ :param chat_id: Union[Integer, String] - Unique identifier for the target chat @@ -1477,6 +1478,8 @@ class PromoteChatMember(BaseResponse): :param can_invite_users: Boolean - Pass True, if the administrator can invite new users to the chat :param can_restrict_members: Boolean - Pass True, if the administrator can restrict, ban or unban chat members :param can_pin_messages: Boolean - Pass True, if the administrator can pin messages, supergroups only + :param can_manage_topics: Boolean - Pass True if the user is allowed to create, rename, close, and reopen forum + topics, supergroups only :param can_promote_members: Boolean - Pass True, if the administrator can add new administrators with a subset of his own privileges or demote administrators that he has promoted, directly or indirectly (promoted by administrators that were appointed by him) @@ -1490,6 +1493,7 @@ class PromoteChatMember(BaseResponse): self.can_invite_users = can_invite_users self.can_restrict_members = can_restrict_members self.can_pin_messages = can_pin_messages + self.can_manage_topics = can_manage_topics self.can_promote_members = can_promote_members def prepare(self): @@ -1503,6 +1507,7 @@ class PromoteChatMember(BaseResponse): 'can_invite_users': self.can_invite_users, 'can_restrict_members': self.can_restrict_members, 'can_pin_messages': self.can_pin_messages, + 'can_manage_topics': self.can_manage_topics, 'can_promote_members': self.can_promote_members } diff --git a/aiogram/types/chat_administrator_rights.py b/aiogram/types/chat_administrator_rights.py index 4e909db8..d55ea057 100644 --- a/aiogram/types/chat_administrator_rights.py +++ b/aiogram/types/chat_administrator_rights.py @@ -19,6 +19,7 @@ class ChatAdministratorRights(base.TelegramObject): can_post_messages: base.Boolean = fields.Field() can_edit_messages: base.Boolean = fields.Field() can_pin_messages: base.Boolean = fields.Field() + can_manage_topics: base.Boolean = fields.Field() def __init__(self, is_anonymous: base.Boolean = None, @@ -31,7 +32,8 @@ class ChatAdministratorRights(base.TelegramObject): can_invite_users: base.Boolean = None, can_post_messages: base.Boolean = None, can_edit_messages: base.Boolean = None, - can_pin_messages: base.Boolean = None): + can_pin_messages: base.Boolean = None, + can_manage_topics: base.Boolean = None): super(ChatAdministratorRights, self).__init__( is_anonymous=is_anonymous, can_manage_chat=can_manage_chat, @@ -43,4 +45,5 @@ class ChatAdministratorRights(base.TelegramObject): can_invite_users=can_invite_users, can_post_messages=can_post_messages, can_edit_messages=can_edit_messages, - can_pin_messages=can_pin_messages) + can_pin_messages=can_pin_messages, + can_manage_topics=can_manage_topics) diff --git a/aiogram/types/chat_member.py b/aiogram/types/chat_member.py index 9a78bca2..6424025f 100644 --- a/aiogram/types/chat_member.py +++ b/aiogram/types/chat_member.py @@ -135,6 +135,7 @@ class ChatMemberOwner(ChatMember): can_change_info: base.Boolean = fields.ConstField(True) can_invite_users: base.Boolean = fields.ConstField(True) can_pin_messages: base.Boolean = fields.ConstField(True) + can_manage_topics: base.Boolean = fields.ConstField(True) class ChatMemberAdministrator(ChatMember): @@ -159,6 +160,7 @@ class ChatMemberAdministrator(ChatMember): can_change_info: base.Boolean = fields.Field() can_invite_users: base.Boolean = fields.Field() can_pin_messages: base.Boolean = fields.Field() + can_manage_topics: base.Boolean = fields.Field() class ChatMemberMember(ChatMember): @@ -185,6 +187,7 @@ class ChatMemberRestricted(ChatMember): can_change_info: base.Boolean = fields.Field() can_invite_users: base.Boolean = fields.Field() can_pin_messages: base.Boolean = fields.Field() + can_manage_topics: base.Boolean = fields.Field() can_send_messages: base.Boolean = fields.Field() can_send_media_messages: base.Boolean = fields.Field() can_send_polls: base.Boolean = fields.Field() diff --git a/aiogram/types/chat_permissions.py b/aiogram/types/chat_permissions.py index 9d44653e..4a404688 100644 --- a/aiogram/types/chat_permissions.py +++ b/aiogram/types/chat_permissions.py @@ -16,6 +16,7 @@ class ChatPermissions(base.TelegramObject): can_change_info: base.Boolean = fields.Field() can_invite_users: base.Boolean = fields.Field() can_pin_messages: base.Boolean = fields.Field() + can_manage_topics: base.Boolean = fields.Field() def __init__(self, can_send_messages: base.Boolean = None, @@ -26,6 +27,7 @@ class ChatPermissions(base.TelegramObject): can_change_info: base.Boolean = None, can_invite_users: base.Boolean = None, can_pin_messages: base.Boolean = None, + can_manage_topics: base.Boolean = None, **kwargs): super(ChatPermissions, self).__init__( can_send_messages=can_send_messages, @@ -36,4 +38,5 @@ class ChatPermissions(base.TelegramObject): can_change_info=can_change_info, can_invite_users=can_invite_users, can_pin_messages=can_pin_messages, + can_manage_topics=can_manage_topics, ) diff --git a/aiogram/types/message.py b/aiogram/types/message.py index f8562872..c7b32661 100644 --- a/aiogram/types/message.py +++ b/aiogram/types/message.py @@ -64,6 +64,7 @@ class Message(base.TelegramObject): forward_from_message_id: base.Integer = fields.Field() forward_signature: base.String = fields.Field() forward_date: datetime.datetime = fields.DateTimeField() + is_topic_message: base.Boolean = fields.Field() is_automatic_forward: base.Boolean = fields.Field() reply_to_message: Message = fields.Field(base="Message") via_bot: User = fields.Field(base=User) diff --git a/tests/types/dataset.py b/tests/types/dataset.py index 41ec0fc9..72db1420 100644 --- a/tests/types/dataset.py +++ b/tests/types/dataset.py @@ -61,6 +61,7 @@ CHAT_MEMBER = { "can_promote_members": False, "can_manage_voice_chats": True, # Deprecated "can_manage_video_chats": True, + "can_manage_topics": True, "is_anonymous": False, } diff --git a/tests/types/test_chat_member.py b/tests/types/test_chat_member.py index 2fe3e677..b45a4bcf 100644 --- a/tests/types/test_chat_member.py +++ b/tests/types/test_chat_member.py @@ -41,6 +41,9 @@ def test_privileges(): assert isinstance(chat_member.can_promote_members, bool) assert chat_member.can_promote_members == CHAT_MEMBER['can_promote_members'] + assert isinstance(chat_member.can_manage_topics, bool) + assert chat_member.can_manage_topics == CHAT_MEMBER['can_manage_topics'] + def test_int(): assert int(chat_member) == chat_member.user.id