From f3b1f97362458f94b214d58a2a23306877d821ad Mon Sep 17 00:00:00 2001 From: Badiboy Date: Sun, 3 Jul 2022 23:33:55 +0300 Subject: [PATCH 1/4] ChatMember is now typed https://core.telegram.org/bots/api#chatmember --- telebot/async_telebot.py | 2 +- telebot/types.py | 18 +++++++++++++++++- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/telebot/async_telebot.py b/telebot/async_telebot.py index dce9dec..a69f34b 100644 --- a/telebot/async_telebot.py +++ b/telebot/async_telebot.py @@ -108,7 +108,6 @@ class AsyncTeleBot: self.current_states = state_storage - self.middlewares = [] async def close_session(self): @@ -117,6 +116,7 @@ class AsyncTeleBot: Use this function if you stop polling. """ await asyncio_helper.session_manager.session.close() + async def get_updates(self, offset: Optional[int]=None, limit: Optional[int]=None, timeout: Optional[int]=None, allowed_updates: Optional[List]=None, request_timeout: Optional[int]=None) -> List[types.Update]: json_updates = await asyncio_helper.get_updates(self.token, offset, limit, timeout, allowed_updates, request_timeout) diff --git a/telebot/types.py b/telebot/types.py index ee67cb9..e49e86a 100644 --- a/telebot/types.py +++ b/telebot/types.py @@ -1280,7 +1280,22 @@ class ChatMember(JsonDeserializable): if json_string is None: return None obj = cls.check_json(json_string) obj['user'] = User.de_json(obj['user']) - return cls(**obj) + member_type = obj['status'] + if member_type == "creator": + return ChatMemberOwner(**obj) + elif member_type == "administrator": + return ChatMemberAdministrator(**obj) + elif member_type == "member": + return ChatMemberMember(**obj) + elif member_type == "restricted": + return ChatMemberRestricted(**obj) + elif member_type == "left": + return ChatMemberLeft(**obj) + elif member_type == "kicked": + return ChatMemberBanned(**obj) + else: + # Should not be here + return cls(**obj) def __init__(self, user, status, custom_title=None, is_anonymous=None, can_be_edited=None, can_post_messages=None, can_edit_messages=None, can_delete_messages=None, @@ -1318,6 +1333,7 @@ class ChatMember(JsonDeserializable): class ChatMemberOwner(ChatMember): pass + class ChatMemberAdministrator(ChatMember): pass From 0aa9f0fb42ad5e4c79fa49b7c42db31c5f84bd96 Mon Sep 17 00:00:00 2001 From: Badiboy Date: Mon, 4 Jul 2022 22:26:24 +0300 Subject: [PATCH 2/4] Update type fix --- telebot/util.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/telebot/util.py b/telebot/util.py index 2561c21..62ebe7f 100644 --- a/telebot/util.py +++ b/telebot/util.py @@ -49,7 +49,7 @@ content_type_service = [ ] update_types = [ - "update_id", "message", "edited_message", "channel_post", "edited_channel_post", "inline_query", + "message", "edited_message", "channel_post", "edited_channel_post", "inline_query", "chosen_inline_result", "callback_query", "shipping_query", "pre_checkout_query", "poll", "poll_answer", "my_chat_member", "chat_member", "chat_join_request" ] From 81cbddb8cd67368666ba0e708b60d3e9eefb6b13 Mon Sep 17 00:00:00 2001 From: Badiboy Date: Mon, 4 Jul 2022 22:36:42 +0300 Subject: [PATCH 3/4] Added source data (json_string) to CallbackQuery --- telebot/types.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/telebot/types.py b/telebot/types.py index e49e86a..5a8fcf2 100644 --- a/telebot/types.py +++ b/telebot/types.py @@ -1248,9 +1248,10 @@ class CallbackQuery(JsonDeserializable): obj['from_user'] = User.de_json(obj.pop('from')) if 'message' in obj: obj['message'] = Message.de_json(obj.get('message')) + obj['json_string'] = json_string return cls(**obj) - def __init__(self, id, from_user, data, chat_instance, message=None, inline_message_id=None, game_short_name=None, **kwargs): + def __init__(self, id, from_user, data, chat_instance, json_string, message=None, inline_message_id=None, game_short_name=None, **kwargs): self.id: int = id self.from_user: User = from_user self.message: Message = message @@ -1258,6 +1259,7 @@ class CallbackQuery(JsonDeserializable): self.chat_instance: str = chat_instance self.data: str = data self.game_short_name: str = game_short_name + self.json = json_string class ChatPhoto(JsonDeserializable): From 78251cdf43941a6dea5ce34d31a12433b63be542 Mon Sep 17 00:00:00 2001 From: Badiboy Date: Mon, 4 Jul 2022 22:41:01 +0300 Subject: [PATCH 4/4] ChatMember type checking reordered --- telebot/types.py | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/telebot/types.py b/telebot/types.py index 5a8fcf2..5bab9c4 100644 --- a/telebot/types.py +++ b/telebot/types.py @@ -1283,20 +1283,21 @@ class ChatMember(JsonDeserializable): obj = cls.check_json(json_string) obj['user'] = User.de_json(obj['user']) member_type = obj['status'] - if member_type == "creator": - return ChatMemberOwner(**obj) - elif member_type == "administrator": - return ChatMemberAdministrator(**obj) - elif member_type == "member": + # Ordered according to estimated appearance frequency. + if member_type == "member": return ChatMemberMember(**obj) - elif member_type == "restricted": - return ChatMemberRestricted(**obj) elif member_type == "left": return ChatMemberLeft(**obj) elif member_type == "kicked": return ChatMemberBanned(**obj) + elif member_type == "restricted": + return ChatMemberRestricted(**obj) + elif member_type == "administrator": + return ChatMemberAdministrator(**obj) + elif member_type == "creator": + return ChatMemberOwner(**obj) else: - # Should not be here + # Should not be here. For "if something happen" compatibility return cls(**obj) def __init__(self, user, status, custom_title=None, is_anonymous=None, can_be_edited=None,