1
0
mirror of https://github.com/eternnoir/pyTelegramBotAPI.git synced 2023-08-10 21:12:57 +03:00

Merge pull request #1501 from coder2020official/master

Prepare for Bot API 6.0
This commit is contained in:
Badiboy 2022-04-23 14:10:26 +03:00 committed by GitHub
commit cfbbfe84ad
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 483 additions and 30 deletions

View File

@ -11,7 +11,7 @@
<p align="center">A simple, but extensible Python implementation for the <a href="https://core.telegram.org/bots/api">Telegram Bot API</a>.</p>
<p align="center">Both synchronous and asynchronous.</p>
## <p align="center">Supported Bot API version: <a href="https://core.telegram.org/bots/api#january-31-2022">5.7</a>!
## <p align="center">Supported Bot API version: <a href="https://core.telegram.org/bots/api#april-16-2022">6.0</a>!
<h2><a href='https://pytba.readthedocs.io/en/latest/index.html'>Official documentation</a></h2>
@ -699,7 +699,7 @@ Result will be:
## API conformance
* ✔ [Bot API 6.0](https://core.telegram.org/bots/api#april-16-2022)
* ✔ [Bot API 5.7](https://core.telegram.org/bots/api#january-31-2022)
* ✔ [Bot API 5.6](https://core.telegram.org/bots/api#december-30-2021)
* ✔ [Bot API 5.5](https://core.telegram.org/bots/api#december-7-2021)

View File

@ -1772,6 +1772,7 @@ class TeleBot:
can_promote_members: Optional[bool]=None,
is_anonymous: Optional[bool]=None,
can_manage_chat: Optional[bool]=None,
can_manage_video_chats: Optional[bool]=None,
can_manage_voice_chats: Optional[bool]=None) -> bool:
"""
Use this method to promote or demote a user in a supergroup or a channel. The bot must be an administrator
@ -1798,15 +1799,20 @@ class TeleBot:
message statistics in channels, see channel members,
see anonymous administrators in supergroups and ignore slow mode.
Implied by any other administrator privilege
:param can_manage_voice_chats: Bool: Pass True, if the administrator can manage voice chats
:param can_manage_video_chats: Bool: Pass True, if the administrator can manage voice chats
For now, bots can use this privilege only for passing to other administrators.
:param can_manage_voice_chats: Deprecated, use can_manage_video_chats.
:return: True on success.
"""
if can_manage_voice_chats and not can_manage_video_chats is None:
can_manage_video_chats = can_manage_voice_chats
return apihelper.promote_chat_member(
self.token, 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,
is_anonymous, can_manage_chat, can_manage_voice_chats)
is_anonymous, can_manage_chat, can_manage_video_chats)
def set_chat_administrator_custom_title(
self, chat_id: Union[int, str], user_id: int, custom_title: str) -> bool:
@ -2033,6 +2039,71 @@ class TeleBot:
result = apihelper.get_my_commands(self.token, scope, language_code)
return [types.BotCommand.de_json(cmd) for cmd in result]
def set_chat_menu_button(self, chat_id: Union[int, str]=None,
menu_button: types.MenuButton=None) -> bool:
"""
Use this method to change the bot's menu button in a private chat,
or the default menu button.
Returns True on success.
Telegram documentation: https://core.telegram.org/bots/api#setchatmenubutton
:param chat_id: Unique identifier for the target private chat.
If not specified, default bot's menu button will be changed.
:param menu_button: A JSON-serialized object for the new bot's menu button. Defaults to MenuButtonDefault
"""
return apihelper.set_chat_menu_button(self.token, chat_id, menu_button)
def get_chat_menu_button(self, chat_id: Union[int, str]=None) -> types.MenuButton:
"""
Use this method to get the current value of the bot's menu button
in a private chat, or the default menu button.
Returns MenuButton on success.
Telegram Documentation: https://core.telegram.org/bots/api#getchatmenubutton
:param chat_id: Unique identifier for the target private chat.
If not specified, default bot's menu button will be returned.
:return: types.MenuButton
"""
return types.MenuButton.de_json(apihelper.get_chat_menu_button(self.token, chat_id))
def set_my_default_administrator_rights(self, rights: types.ChatAdministratorRights=None,
for_channels: bool=None) -> bool:
"""
Use this method to change the default administrator rights requested by the bot
when it's added as an administrator to groups or channels.
These rights will be suggested to users, but they are are free to modify
the list before adding the bot.
Returns True on success.
Telegram documentation: https://core.telegram.org/bots/api#setmydefaultadministratorrights
:param rights: A JSON-serialized object describing new default administrator rights. If not specified, the default administrator rights will be cleared.
:param for_channels: Pass True to change the default administrator rights of the bot in channels. Otherwise, the default administrator rights of the bot for groups and supergroups will be changed.
"""
return apihelper.set_my_default_administrator_rights(self.token, rights, for_channels)
def get_my_default_administrator_rights(self, for_channels: bool=None) -> types.ChatAdministratorRights:
"""
Use this method to get the current default administrator rights of the bot.
Returns ChatAdministratorRights on success.
Telegram documentation: https://core.telegram.org/bots/api#getmydefaultadministratorrights
:param for_channels: Pass True to get the default administrator rights of the bot in channels. Otherwise, the default administrator rights of the bot for groups and supergroups will be returned.
:return: types.ChatAdministratorRights
"""
return types.ChatAdministratorRights.de_json(apihelper.get_my_default_administrator_rights(self.token, for_channels))
def set_my_commands(self, commands: List[types.BotCommand],
scope: Optional[types.BotCommandScope]=None,
language_code: Optional[str]=None) -> bool:
@ -2684,6 +2755,22 @@ class TeleBot:
"""
return apihelper.delete_sticker_from_set(self.token, sticker)
def answer_web_app_query(self, web_app_query_id: str, result: types.InlineQueryResultBase) -> types.SentWebAppMessage:
"""
Use this method to set the result of an interaction with a Web App and
send a corresponding message on behalf of the user to the chat from which
the query originated.
On success, a SentWebAppMessage object is returned.
Telegram Documentation: https://core.telegram.org/bots/api#answerwebappquery
:param web_app_query_id: Unique identifier for the query to be answered
:param result: A JSON-serialized object describing the message to be sent
:return:
"""
return apihelper.answer_web_app_query(self.token, web_app_query_id, result)
def register_for_reply(
self, message: types.Message, callback: Callable, *args, **kwargs) -> None:
"""

View File

@ -971,7 +971,7 @@ def promote_chat_member(
token, chat_id, user_id, can_change_info=None, can_post_messages=None,
can_edit_messages=None, can_delete_messages=None, can_invite_users=None,
can_restrict_members=None, can_pin_messages=None, can_promote_members=None,
is_anonymous=None, can_manage_chat=None, can_manage_voice_chats=None):
is_anonymous=None, can_manage_chat=None, can_manage_video_chats=None):
method_url = 'promoteChatMember'
payload = {'chat_id': chat_id, 'user_id': user_id}
if can_change_info is not None:
@ -994,8 +994,8 @@ def promote_chat_member(
payload['is_anonymous'] = is_anonymous
if can_manage_chat is not None:
payload['can_manage_chat'] = can_manage_chat
if can_manage_voice_chats is not None:
payload['can_manage_voice_chats'] = can_manage_voice_chats
if can_manage_video_chats is not None:
payload['can_manage_video_chats'] = can_manage_video_chats
return _make_request(token, method_url, params=payload, method='post')
@ -1139,6 +1139,43 @@ def get_my_commands(token, scope=None, language_code=None):
payload['language_code'] = language_code
return _make_request(token, method_url, params=payload)
def set_chat_menu_button(token, chat_id=None, menu_button=None):
method_url = r'setChatMenuButton'
payload = {}
if chat_id:
payload['chat_id'] = chat_id
if menu_button:
payload['menu_button'] = menu_button.to_json()
return _make_request(token, method_url, params=payload, method='post')
def get_chat_menu_button(token, chat_id=None):
method_url = r'getChatMenuButton'
payload = {}
if chat_id:
payload['chat_id'] = chat_id
return _make_request(token, method_url, params=payload, method='post')
def set_my_default_administrator_rights(token, rights=None, for_channels=None):
method_url = r'setMyDefaultAdministratorRights'
payload = {}
if rights:
payload['rights'] = rights.to_json()
if for_channels:
payload['for_channels'] = for_channels
return _make_request(token, method_url, params=payload, method='post')
def get_my_default_administrator_rights(token, for_channels=None):
method_url = r'getMyDefaultAdministratorRights'
payload = {}
if for_channels:
payload['for_channels'] = for_channels
return _make_request(token, method_url, params=payload, method='post')
def set_my_commands(token, commands, scope=None, language_code=None):
method_url = r'setMyCommands'
@ -1590,6 +1627,11 @@ def delete_sticker_from_set(token, sticker):
payload = {'sticker': sticker}
return _make_request(token, method_url, params=payload, method='post')
def answer_web_app_query(token, web_app_query_id, result: types.InlineQueryResultBase):
method_url = 'answerWebAppQuery'
result = result.to_json()
payload = {'query_id': web_app_query_id, 'result': result}
return _make_request(token, method_url, params=payload, method='post')
# noinspection PyShadowingBuiltins
def send_poll(
@ -1663,6 +1705,7 @@ def _convert_list_json_serializable(results):
return '[' + ret + ']'
def _convert_markup(markup):
if isinstance(markup, types.JsonSerializable):
return markup.to_json()

View File

@ -1550,6 +1550,22 @@ class AsyncTeleBot:
result = await asyncio_helper.delete_chat_sticker_set(self.token, chat_id)
return result
async def answer_web_app_query(self, web_app_query_id: str, result: types.InlineQueryResultBase) -> types.SentWebAppMessage:
"""
Use this method to set the result of an interaction with a Web App and
send a corresponding message on behalf of the user to the chat from which
the query originated.
On success, a SentWebAppMessage object is returned.
Telegram Documentation: https://core.telegram.org/bots/api#answerwebappquery
:param web_app_query_id: Unique identifier for the query to be answered
:param result: A JSON-serialized object describing the message to be sent
:return:
"""
return await asyncio_helper.answer_web_app_query(self.token, web_app_query_id, result)
async def get_chat_member(self, chat_id: Union[int, str], user_id: int) -> types.ChatMember:
"""
Use this method to get information about a member of a chat. Returns a ChatMember object on success.
@ -2374,6 +2390,7 @@ class AsyncTeleBot:
can_promote_members: Optional[bool]=None,
is_anonymous: Optional[bool]=None,
can_manage_chat: Optional[bool]=None,
can_manage_video_chats: Optional[bool]=None,
can_manage_voice_chats: Optional[bool]=None) -> bool:
"""
Use this method to promote or demote a user in a supergroup or a channel. The bot must be an administrator
@ -2400,15 +2417,20 @@ class AsyncTeleBot:
message statistics in channels, see channel members,
see anonymous administrators in supergroups and ignore slow mode.
Implied by any other administrator privilege
:param can_manage_voice_chats: Bool: Pass True, if the administrator can manage voice chats
:param can_manage_video_chats: Bool: Pass True, if the administrator can manage voice chats
For now, bots can use this privilege only for passing to other administrators.
:param can_manage_voice_chats: Deprecated, use can_manage_video_chats
:return: True on success.
"""
if can_manage_voice_chats and not can_manage_video_chats is None:
can_manage_video_chats = can_manage_voice_chats
return await asyncio_helper.promote_chat_member(
self.token, 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,
is_anonymous, can_manage_chat, can_manage_voice_chats)
is_anonymous, can_manage_chat, can_manage_video_chats)
async def set_chat_administrator_custom_title(
self, chat_id: Union[int, str], user_id: int, custom_title: str) -> bool:
@ -2635,6 +2657,70 @@ class AsyncTeleBot:
result = await asyncio_helper.get_my_commands(self.token, scope, language_code)
return [types.BotCommand.de_json(cmd) for cmd in result]
async def set_chat_menu_button(self, chat_id: Union[int, str]=None,
menu_button: types.MenuButton=None) -> bool:
"""
Use this method to change the bot's menu button in a private chat,
or the default menu button.
Returns True on success.
Telegram documentation: https://core.telegram.org/bots/api#setchatmenubutton
:param chat_id: Unique identifier for the target private chat.
If not specified, default bot's menu button will be changed.
:param menu_button: A JSON-serialized object for the new bot's menu button. Defaults to MenuButtonDefault
"""
return await asyncio_helper.set_chat_menu_button(self.token, chat_id, menu_button)
async def get_chat_menu_button(self, chat_id: Union[int, str]=None) -> types.MenuButton:
"""
Use this method to get the current value of the bot's menu button
in a private chat, or the default menu button.
Returns MenuButton on success.
Telegram Documentation: https://core.telegram.org/bots/api#getchatmenubutton
:param chat_id: Unique identifier for the target private chat.
If not specified, default bot's menu button will be returned.
:return: types.MenuButton
"""
return types.MenuButton.de_json(await asyncio_helper.get_chat_menu_button(self.token, chat_id))
async def set_my_default_administrator_rights(self, rights: types.ChatAdministratorRights=None,
for_channels: bool=None) -> bool:
"""
Use this method to change the default administrator rights requested by the bot
when it's added as an administrator to groups or channels.
These rights will be suggested to users, but they are are free to modify
the list before adding the bot.
Returns True on success.
Telegram documentation: https://core.telegram.org/bots/api#setmydefaultadministratorrights
:param rights: A JSON-serialized object describing new default administrator rights. If not specified, the default administrator rights will be cleared.
:param for_channels: Pass True to change the default administrator rights of the bot in channels. Otherwise, the default administrator rights of the bot for groups and supergroups will be changed.
"""
return await asyncio_helper.set_my_default_administrator_rights(self.token, rights, for_channels)
async def get_my_default_administrator_rights(self, for_channels: bool=None) -> types.ChatAdministratorRights:
"""
Use this method to get the current default administrator rights of the bot.
Returns ChatAdministratorRights on success.
Telegram documentation: https://core.telegram.org/bots/api#getmydefaultadministratorrights
:param for_channels: Pass True to get the default administrator rights of the bot in channels. Otherwise, the default administrator rights of the bot for groups and supergroups will be returned.
:return: types.ChatAdministratorRights
"""
return types.ChatAdministratorRights.de_json(await asyncio_helper.get_my_default_administrator_rights(self.token, for_channels))
async def set_my_commands(self, commands: List[types.BotCommand],
scope: Optional[types.BotCommandScope]=None,
language_code: Optional[str]=None) -> bool:

View File

@ -356,6 +356,12 @@ async def delete_chat_sticker_set(token, chat_id):
payload = {'chat_id': chat_id}
return await _process_request(token, method_url, params=payload)
async def answer_web_app_query(token, web_app_query_id, result: types.InlineQueryResultBase):
method_url = 'answerWebAppQuery'
result = result.to_json()
payload = {'query_id': web_app_query_id, 'result': result}
return await _process_request(token, method_url, params=payload, method='post')
async def get_chat_member(token, chat_id, user_id):
method_url = r'getChatMember'
@ -941,7 +947,7 @@ async def promote_chat_member(
token, chat_id, user_id, can_change_info=None, can_post_messages=None,
can_edit_messages=None, can_delete_messages=None, can_invite_users=None,
can_restrict_members=None, can_pin_messages=None, can_promote_members=None,
is_anonymous=None, can_manage_chat=None, can_manage_voice_chats=None):
is_anonymous=None, can_manage_chat=None, can_manage_video_chats=None):
method_url = 'promoteChatMember'
payload = {'chat_id': chat_id, 'user_id': user_id}
if can_change_info is not None:
@ -964,8 +970,8 @@ async def promote_chat_member(
payload['is_anonymous'] = is_anonymous
if can_manage_chat is not None:
payload['can_manage_chat'] = can_manage_chat
if can_manage_voice_chats is not None:
payload['can_manage_voice_chats'] = can_manage_voice_chats
if can_manage_video_chats is not None:
payload['can_manage_video_chats'] = can_manage_video_chats
return await _process_request(token, method_url, params=payload, method='post')
@ -1106,6 +1112,42 @@ async def get_my_commands(token, scope=None, language_code=None):
payload['language_code'] = language_code
return await _process_request(token, method_url, params=payload)
async def set_chat_menu_button(token, chat_id=None, menu_button=None):
method_url = r'setChatMenuButton'
payload = {}
if chat_id:
payload['chat_id'] = chat_id
if menu_button:
payload['menu_button'] = menu_button.to_json()
return await _process_request(token, method_url, params=payload, method='post')
async def get_chat_menu_button(token, chat_id=None):
method_url = r'getChatMenuButton'
payload = {}
if chat_id:
payload['chat_id'] = chat_id
return await _process_request(token, method_url, params=payload, method='post')
async def set_my_default_administrator_rights(token, rights=None, for_channels=None):
method_url = r'setMyDefaultAdministratorRights'
payload = {}
if rights:
payload['rights'] = rights.to_json()
if for_channels:
payload['for_channels'] = for_channels
return await _process_request(token, method_url, params=payload, method='post')
async def get_my_default_administrator_rights(token, for_channels=None):
method_url = r'getMyDefaultAdministratorRights'
payload = {}
if for_channels:
payload['for_channels'] = for_channels
return await _process_request(token, method_url, params=payload, method='post')
async def set_my_commands(token, commands, scope=None, language_code=None):
method_url = r'setMyCommands'

View File

@ -194,14 +194,15 @@ class WebhookInfo(JsonDeserializable):
return cls(**obj)
def __init__(self, url, has_custom_certificate, pending_update_count, ip_address=None,
last_error_date=None, last_error_message=None, max_connections=None,
allowed_updates=None, **kwargs):
last_error_date=None, last_error_message=None, last_synchronization_error_date=None,
max_connections=None, allowed_updates=None, **kwargs):
self.url = url
self.has_custom_certificate = has_custom_certificate
self.pending_update_count = pending_update_count
self.ip_address = ip_address
self.last_error_date = last_error_date
self.last_error_message = last_error_message
self.last_synchronization_error_date = last_synchronization_error_date
self.max_connections = max_connections
self.allowed_updates = allowed_updates
@ -313,6 +314,20 @@ class MessageID(JsonDeserializable):
self.message_id = message_id
class WebAppData(JsonDeserializable):
def __init__(self, data, button_text):
self.data = data
self.button_text = button_text
def to_dict(self):
return {'data': self.data, 'button_text': self.button_text}
@classmethod
def de_json(cls, json_string):
if json_string is None: return None
obj = cls.check_json(json_string)
return cls(**obj)
class Message(JsonDeserializable):
@classmethod
def de_json(cls, json_string):
@ -457,18 +472,25 @@ class Message(JsonDeserializable):
opts['proximity_alert_triggered'] = ProximityAlertTriggered.de_json(obj[
'proximity_alert_triggered'])
content_type = 'proximity_alert_triggered'
if 'voice_chat_scheduled' in obj:
opts['voice_chat_scheduled'] = VoiceChatScheduled.de_json(obj['voice_chat_scheduled'])
content_type = 'voice_chat_scheduled'
if 'voice_chat_started' in obj:
opts['voice_chat_started'] = VoiceChatStarted.de_json(obj['voice_chat_started'])
content_type = 'voice_chat_started'
if 'voice_chat_ended' in obj:
opts['voice_chat_ended'] = VoiceChatEnded.de_json(obj['voice_chat_ended'])
content_type = 'voice_chat_ended'
if 'voice_chat_participants_invited' in obj:
opts['voice_chat_participants_invited'] = VoiceChatParticipantsInvited.de_json(obj['voice_chat_participants_invited'])
content_type = 'voice_chat_participants_invited'
if 'video_chat_scheduled' in obj:
opts['video_chat_scheduled'] = VoiceChatScheduled.de_json(obj['video_chat_scheduled'])
opts['voice_chat_scheduled'] = opts['video_chat_scheduled']
content_type = 'video_chat_scheduled'
if 'video_chat_started' in obj:
opts['video_chat_started'] = VoiceChatStarted.de_json(obj['video_chat_started'])
opts['voice_chat_started'] = opts['video_chat_started']
content_type = 'video_chat_started'
if 'video_chat_ended' in obj:
opts['video_chat_ended'] = VoiceChatEnded.de_json(obj['video_chat_ended'])
opts['voice_chat_ended'] = opts['video_chat_ended']
content_type = 'video_chat_ended'
if 'video_chat_participants_invited' in obj:
opts['video_chat_participants_invited'] = VoiceChatParticipantsInvited.de_json(obj['video_chat_participants_invited'])
opts['voice_chat_participants_invited'] = opts['video_chat_participants_invited']
content_type = 'video_chat_participants_invited'
if 'web_app_data' in obj:
opts['web_app_data'] = WebAppData.de_json(obj['web_app_data'])
content_type = 'web_app_data'
if 'message_auto_delete_timer_changed' in obj:
opts['message_auto_delete_timer_changed'] = MessageAutoDeleteTimerChanged.de_json(obj['message_auto_delete_timer_changed'])
content_type = 'message_auto_delete_timer_changed'
@ -919,6 +941,20 @@ class ReplyKeyboardRemove(JsonSerializable):
return json.dumps(json_dict)
class WebAppInfo(JsonDeserializable):
@classmethod
def de_json(cls, json_string):
if json_string is None: return None
obj = cls.check_json(json_string)
return cls(**obj)
def __init__(self, url, **kwargs):
self.url: str = url
def to_dict(self):
return {'url': self.url}
class ReplyKeyboardMarkup(JsonSerializable):
max_row_keys = 12
@ -1011,11 +1047,13 @@ class KeyboardButtonPollType(Dictionaryable):
class KeyboardButton(Dictionaryable, JsonSerializable):
def __init__(self, text: str, request_contact: Optional[bool]=None,
request_location: Optional[bool]=None, request_poll: Optional[KeyboardButtonPollType]=None):
request_location: Optional[bool]=None, request_poll: Optional[KeyboardButtonPollType]=None,
web_app: WebAppInfo=None):
self.text: str = text
self.request_contact: bool = request_contact
self.request_location: bool = request_location
self.request_poll: KeyboardButtonPollType = request_poll
self.web_app: WebAppInfo = web_app
def to_json(self):
return json.dumps(self.to_dict())
@ -1028,6 +1066,8 @@ class KeyboardButton(Dictionaryable, JsonSerializable):
json_dict['request_location'] = self.request_location
if self.request_poll is not None:
json_dict['request_poll'] = self.request_poll.to_dict()
if self.web_app is not None:
json_dict['web_app'] = self.web_app.to_dict()
return json_dict
@ -1122,13 +1162,17 @@ class InlineKeyboardButton(Dictionaryable, JsonSerializable, JsonDeserializable)
obj = cls.check_json(json_string)
if 'login_url' in obj:
obj['login_url'] = LoginUrl.de_json(obj.get('login_url'))
if 'web_app' in obj:
obj['web_app'] = WebAppInfo.de_json(obj.get('web_app'))
return cls(**obj)
def __init__(self, text, url=None, callback_data=None, switch_inline_query=None,
def __init__(self, text, url=None, callback_data=None, web_app=None, switch_inline_query=None,
switch_inline_query_current_chat=None, callback_game=None, pay=None, login_url=None, **kwargs):
self.text: str = text
self.url: str = url
self.callback_data: str = callback_data
self.web_app: WebAppInfo = web_app
self.switch_inline_query: str = switch_inline_query
self.switch_inline_query_current_chat: str = switch_inline_query_current_chat
self.callback_game = callback_game # Not Implemented
@ -1144,6 +1188,8 @@ class InlineKeyboardButton(Dictionaryable, JsonSerializable, JsonDeserializable)
json_dict['url'] = self.url
if self.callback_data:
json_dict['callback_data'] = self.callback_data
if self.web_app:
json_dict['web_app'] = self.web_app.to_dict()
if self.switch_inline_query is not None:
json_dict['switch_inline_query'] = self.switch_inline_query
if self.switch_inline_query_current_chat is not None:
@ -1235,7 +1281,7 @@ class ChatMember(JsonDeserializable):
can_invite_users=None, can_pin_messages=None, is_member=None,
can_send_messages=None, can_send_media_messages=None, can_send_polls=None,
can_send_other_messages=None, can_add_web_page_previews=None,
can_manage_chat=None, can_manage_voice_chats=None,
can_manage_chat=None, can_manage_video_chats=None,
until_date=None, **kwargs):
self.user: User = user
self.status: str = status
@ -1257,7 +1303,8 @@ class ChatMember(JsonDeserializable):
self.can_send_other_messages: bool = can_send_other_messages
self.can_add_web_page_previews: bool = can_add_web_page_previews
self.can_manage_chat: bool = can_manage_chat
self.can_manage_voice_chats: bool = can_manage_voice_chats
self.can_manage_video_chats: bool = can_manage_video_chats
self.can_manage_voice_chats: bool = self.can_manage_video_chats
self.until_date: int = until_date
@ -1689,6 +1736,23 @@ class InlineQueryResultBase(ABC, Dictionaryable, JsonSerializable):
return json_dict
class SentWebAppMessage(JsonDeserializable):
@classmethod
def de_json(cls, json_string):
if json_string is None: return None
obj = cls.check_json(json_string)
return cls(**obj)
def __init__(self, inline_message_id):
self.inline_message_id = inline_message_id
def to_dict(self):
return {'inline_message_id': self.inline_message_id}
class InlineQueryResultArticle(InlineQueryResultBase):
def __init__(self, id, title, input_message_content, reply_markup=None,
url=None, hide_url=None, description=None, thumb_url=None, thumb_width=None, thumb_height=None):
@ -2890,3 +2954,111 @@ class MessageAutoDeleteTimerChanged(JsonDeserializable):
def __init__(self, message_auto_delete_time, **kwargs):
self.message_auto_delete_time = message_auto_delete_time
class MenuButton(JsonDeserializable, JsonSerializable):
"""
Base class for MenuButtons.
"""
@classmethod
def de_json(cls, json_string):
if json_string is None: return None
obj = cls.check_json(json_string)
map = {
'commands': MenuButtonCommands,
'web_app': MenuButtonWebApp,
'default': MenuButtonDefault
}
return map[obj['type']](**obj)
def to_json(self):
raise NotImplementedError
class MenuButtonCommands(MenuButton):
def __init__(self, type):
self.type = type
def to_dict(self):
return {'type': self.type}
def to_json(self):
return json.dumps(self.to_dict())
class MenuButtonWebApp(MenuButton):
def __init__(self, type, text, web_app):
self.type: str = type
self.text: str = text
self.web_app: WebAppInfo = web_app
def to_dict(self):
return {'type': self.type, 'text': self.text, 'web_app': self.web_app.to_dict()}
def to_json(self):
return json.dumps(self.to_dict())
class MenuButtonDefault(MenuButton):
def __init__(self, type):
self.type: str = type
def to_dict(self):
return {'type': self.type}
def to_json(self):
return json.dumps(self.to_dict())
class ChatAdministratorRights(JsonDeserializable, JsonSerializable):
"""
Class representation of:
https://core.telegram.org/bots/api#chatadministratorrights
"""
@classmethod
def de_json(cls, json_string):
if json_string is None: return None
obj = cls.check_json(json_string)
return cls(**obj)
def __init__(self, is_anonymous: bool, can_manage_chat: bool,
can_delete_messages: bool, can_manage_video_chats: bool, can_restrict_members: bool,
can_promote_members: bool, can_change_info: bool, can_invite_users: bool,
can_post_messages: bool=None, can_edit_messages: bool=None,
can_pin_messages: bool=None) -> None:
self.is_anonymous: bool = is_anonymous
self.can_manage_chat: bool = can_manage_chat
self.can_delete_messages: bool = can_delete_messages
self.can_manage_video_chats: bool = can_manage_video_chats
self.can_restrict_members: bool = can_restrict_members
self.can_promote_members: bool = can_promote_members
self.can_change_info: bool = can_change_info
self.can_invite_users: bool = can_invite_users
self.can_post_messages: bool = can_post_messages
self.can_edit_messages: bool = can_edit_messages
self.can_pin_messages: bool = can_pin_messages
def to_dict(self):
data = {
'is_anonymous': self.is_anonymous,
'can_manage_chat': self.can_manage_chat,
'can_delete_messages': self.can_delete_messages,
'can_manage_video_chats': self.can_manage_video_chats,
'can_restrict_members': self.can_restrict_members,
'can_promote_members': self.can_promote_members,
'can_change_info': self.can_change_info,
'can_invite_users': self.can_invite_users,
'can_post_messages': self.can_post_messages,
'can_edit_messages': self.can_edit_messages,
'can_pin_messages': self.can_pin_messages
}
return data
def to_json(self):
return json.dumps(self.to_dict())

View File

@ -245,3 +245,26 @@ def test_chat_member_updated():
assert cm_updated.old_chat_member.status == "member"
assert cm_updated.new_chat_member.status == "administrator"
def test_webhook_info():
json_string = r'{"url": "https://example.com/webhook", "has_custom_certificate": true, "pending_update_count": 1, "last_error_date": 0, "last_error_message": "", "last_synchronization_error_date": 489309, "max_connections": 40, "allowed_updates": ["message"]}'
webhook_info = types.WebhookInfo.de_json(json_string)
print(webhook_info)
assert webhook_info.url == 'https://example.com/webhook'
assert webhook_info.has_custom_certificate is True
assert webhook_info.pending_update_count == 1
assert webhook_info.last_error_date == 0
assert webhook_info.last_error_message == ''
assert webhook_info.max_connections == 40
assert webhook_info.last_synchronization_error_date == 489309
assert webhook_info.allowed_updates == ['message']
def test_sent_web_app_message():
json_string = r'{"inline_message_id": "29430"}'
sent_web_app_message = types.SentWebAppMessage.de_json(json_string)
assert sent_web_app_message.inline_message_id == '29430'