diff --git a/telethon/errors/__init__.py b/telethon/errors/__init__.py index d74b4687..0df08b31 100644 --- a/telethon/errors/__init__.py +++ b/telethon/errors/__init__.py @@ -7,7 +7,7 @@ import re from .common import ( ReadCancelledError, TypeNotFoundError, InvalidChecksumError, InvalidBufferError, SecurityError, CdnFileTamperedError, - AlreadyInConversationError, MultiError + AlreadyInConversationError, BadMessageError, MultiError ) # This imports the base errors too, as they're imported there diff --git a/telethon/errors/common.py b/telethon/errors/common.py index c9f22b41..de7d95f8 100644 --- a/telethon/errors/common.py +++ b/telethon/errors/common.py @@ -90,6 +90,53 @@ class AlreadyInConversationError(Exception): ) +class BadMessageError(Exception): + """Occurs when handling a bad_message_notification.""" + ErrorMessages = { + 16: + 'msg_id too low (most likely, client time is wrong it would be ' + 'worthwhile to synchronize it using msg_id notifications and re-send ' + 'the original message with the "correct" msg_id or wrap it in a ' + 'container with a new msg_id if the original message had waited too ' + 'long on the client to be transmitted).', + 17: + 'msg_id too high (similar to the previous case, the client time has ' + 'to be synchronized, and the message re-sent with the correct msg_id).', + 18: + 'Incorrect two lower order msg_id bits (the server expects client ' + 'message msg_id to be divisible by 4).', + 19: + 'Container msg_id is the same as msg_id of a previously received ' + 'message (this must never happen).', + 20: + 'Message too old, and it cannot be verified whether the server has ' + 'received a message with this msg_id or not.', + 32: + 'msg_seqno too low (the server has already received a message with a ' + 'lower msg_id but with either a higher or an equal and odd seqno).', + 33: + 'msg_seqno too high (similarly, there is a message with a higher ' + 'msg_id but with either a lower or an equal and odd seqno).', + 34: + 'An even msg_seqno expected (irrelevant message), but odd received.', + 35: + 'Odd msg_seqno expected (relevant message), but even received.', + 48: + 'Incorrect server salt (in this case, the bad_server_salt response ' + 'is received with the correct salt, and the message is to be re-sent ' + 'with it).', + 64: + 'Invalid container.' + } + + def __init__(self, request, code): + super().__init__(request, self.ErrorMessages.get( + code, + 'Unknown error code (this should not happen): {}.'.format(code))) + + self.code = code + + class MultiError(Exception): """Exception container for multiple `TLRequest`'s.""" diff --git a/telethon/errors/rpcbaseerrors.py b/telethon/errors/rpcbaseerrors.py index 8d8a0a66..34401f7c 100644 --- a/telethon/errors/rpcbaseerrors.py +++ b/telethon/errors/rpcbaseerrors.py @@ -53,10 +53,6 @@ class ForbiddenError(RPCError): code = 403 message = 'FORBIDDEN' - def __init__(self, request, message): - super().__init__(request, message) - self.message = message - class NotFoundError(RPCError): """ @@ -65,10 +61,6 @@ class NotFoundError(RPCError): code = 404 message = 'NOT_FOUND' - def __init__(self, request, message): - super().__init__(request, message) - self.message = message - class AuthKeyError(RPCError): """ @@ -78,10 +70,6 @@ class AuthKeyError(RPCError): code = 406 message = 'AUTH_KEY' - def __init__(self, request, message): - super().__init__(request, message) - self.message = message - class FloodError(RPCError): """ @@ -103,10 +91,6 @@ class ServerError(RPCError): code = 500 # Also witnessed as -500 message = 'INTERNAL' - def __init__(self, request, message): - super().__init__(request, message) - self.message = message - class TimedOutError(RPCError): """ @@ -116,62 +100,11 @@ class TimedOutError(RPCError): code = 503 # Only witnessed as -503 message = 'Timeout' - def __init__(self, request, message): - super().__init__(request, message) - self.message = message - BotTimeout = TimedOutError -class BadMessageError(Exception): - """Occurs when handling a bad_message_notification.""" - ErrorMessages = { - 16: - 'msg_id too low (most likely, client time is wrong it would be ' - 'worthwhile to synchronize it using msg_id notifications and re-send ' - 'the original message with the "correct" msg_id or wrap it in a ' - 'container with a new msg_id if the original message had waited too ' - 'long on the client to be transmitted).', - 17: - 'msg_id too high (similar to the previous case, the client time has ' - 'to be synchronized, and the message re-sent with the correct msg_id).', - 18: - 'Incorrect two lower order msg_id bits (the server expects client ' - 'message msg_id to be divisible by 4).', - 19: - 'Container msg_id is the same as msg_id of a previously received ' - 'message (this must never happen).', - 20: - 'Message too old, and it cannot be verified whether the server has ' - 'received a message with this msg_id or not.', - 32: - 'msg_seqno too low (the server has already received a message with a ' - 'lower msg_id but with either a higher or an equal and odd seqno).', - 33: - 'msg_seqno too high (similarly, there is a message with a higher ' - 'msg_id but with either a lower or an equal and odd seqno).', - 34: - 'An even msg_seqno expected (irrelevant message), but odd received.', - 35: - 'Odd msg_seqno expected (relevant message), but even received.', - 48: - 'Incorrect server salt (in this case, the bad_server_salt response ' - 'is received with the correct salt, and the message is to be re-sent ' - 'with it).', - 64: - 'Invalid container.' - } - - def __init__(self, request, code): - super().__init__(request, self.ErrorMessages.get( - code, - '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 + NotFoundError, AuthKeyError, FloodError, ServerError, TimedOutError )}