diff --git a/telethon/errors/__init__.py b/telethon/errors/__init__.py index ca050de9..2704fed7 100644 --- a/telethon/errors/__init__.py +++ b/telethon/errors/__init__.py @@ -66,23 +66,5 @@ def rpc_message_to_error(rpc_error, report_method=None): capture = int(m.group(1)) if m.groups() else None return cls(capture=capture) - if rpc_error.error_code == 400: - return BadRequestError(rpc_error.error_message) - - if rpc_error.error_code == 401: - return UnauthorizedError(rpc_error.error_message) - - if rpc_error.error_code == 403: - return ForbiddenError(rpc_error.error_message) - - if rpc_error.error_code == 404: - return NotFoundError(rpc_error.error_message) - - if rpc_error.error_code == 406: - return AuthKeyError(rpc_error.error_message) - - if rpc_error.error_code == 500: - return ServerError(rpc_error.error_message) - - return RPCError('{} (code {})'.format( - rpc_error.error_message, rpc_error.error_code)) + cls = base_errors.get(rpc_error.error_code, RPCError) + return cls(rpc_error.error_message) diff --git a/telethon/errors/rpc_base_errors.py b/telethon/errors/rpc_base_errors.py index 3ec6cc7e..061740d8 100644 --- a/telethon/errors/rpc_base_errors.py +++ b/telethon/errors/rpc_base_errors.py @@ -97,6 +97,19 @@ class ServerError(RPCError): self.message = message +class BotTimeout(RPCError): + """ + Clicking the inline buttons of bots that never (or take to long to) + call ``answerCallbackQuery`` will result in this "special" RPCError. + """ + code = -503 + message = 'Timeout' + + def __init__(self, message): + super().__init__(message) + self.message = message + + class BadMessageError(Exception): """Occurs when handling a bad_message_notification.""" ErrorMessages = { @@ -142,3 +155,9 @@ class BadMessageError(Exception): 'Unknown error code (this should not happen): {}.'.format(code))) self.code = code + + +base_errors = {x.code: x for x in ( + InvalidDCError, BadRequestError, UnauthorizedError, ForbiddenError, + NotFoundError, AuthKeyError, FloodError, ServerError, BotTimeout +)} diff --git a/telethon/tl/custom/message.py b/telethon/tl/custom/message.py index 2124249f..50af0bd4 100644 --- a/telethon/tl/custom/message.py +++ b/telethon/tl/custom/message.py @@ -556,7 +556,7 @@ class Message: if sum(int(x is not None) for x in (i, text, filter)) >= 2: raise ValueError('You can only set either of i, text or filter') - if not self.buttons: + if not await self.buttons: return # Accessing the property sets self._buttons[_flat] if text is not None: diff --git a/telethon/tl/custom/messagebutton.py b/telethon/tl/custom/messagebutton.py index cf970c39..80525218 100644 --- a/telethon/tl/custom/messagebutton.py +++ b/telethon/tl/custom/messagebutton.py @@ -1,4 +1,5 @@ from .. import types, functions +from ...errors import BotTimeout import webbrowser @@ -65,11 +66,13 @@ class MessageButton: req = functions.messages.GetBotCallbackAnswerRequest( peer=self._chat, msg_id=self._msg_id, data=self.button.data ) - return await self._client(req, retries=1) + try: + return await self._client(req) + except BotTimeout: + return None elif isinstance(self.button, types.KeyboardButtonSwitchInline): - req = functions.messages.StartBotRequest( + return await self._client(functions.messages.StartBotRequest( bot=self._from, peer=self._chat, start_param=self.button.query - ) - return await self._client(req, retries=1) + )) elif isinstance(self.button, types.KeyboardButtonUrl): return webbrowser.open(self.button.url)