2017-06-10 12:47:51 +03:00
|
|
|
class RPCError(Exception):
|
2017-11-26 19:06:09 +03:00
|
|
|
"""Base class for all Remote Procedure Call errors."""
|
2017-06-10 12:47:51 +03:00
|
|
|
code = None
|
|
|
|
message = None
|
|
|
|
|
2018-08-04 01:43:53 +03:00
|
|
|
def __init__(self, message, code=None):
|
|
|
|
super().__init__('RPCError {}: {}'.format(code or self.code, message))
|
2018-07-29 13:40:40 +03:00
|
|
|
self.code = code
|
|
|
|
self.message = message
|
|
|
|
|
2018-04-08 17:48:55 +03:00
|
|
|
def __reduce__(self):
|
2018-07-29 13:40:40 +03:00
|
|
|
return type(self), (self.code, self.message)
|
2018-04-08 17:48:55 +03:00
|
|
|
|
2017-06-10 12:47:51 +03:00
|
|
|
|
|
|
|
class InvalidDCError(RPCError):
|
|
|
|
"""
|
2017-11-26 19:06:09 +03:00
|
|
|
The request must be repeated, but directed to a different data center.
|
2017-06-10 12:47:51 +03:00
|
|
|
"""
|
|
|
|
code = 303
|
|
|
|
message = 'ERROR_SEE_OTHER'
|
|
|
|
|
|
|
|
|
|
|
|
class BadRequestError(RPCError):
|
|
|
|
"""
|
2017-11-26 19:06:09 +03:00
|
|
|
The query contains errors. In the event that a request was created
|
|
|
|
using a form and contains user generated data, the user should be
|
|
|
|
notified that the data must be corrected before the query is repeated.
|
2017-06-10 12:47:51 +03:00
|
|
|
"""
|
|
|
|
code = 400
|
|
|
|
message = 'BAD_REQUEST'
|
|
|
|
|
|
|
|
|
|
|
|
class UnauthorizedError(RPCError):
|
|
|
|
"""
|
2017-11-26 19:06:09 +03:00
|
|
|
There was an unauthorized attempt to use functionality available only
|
|
|
|
to authorized users.
|
2017-06-10 12:47:51 +03:00
|
|
|
"""
|
|
|
|
code = 401
|
|
|
|
message = 'UNAUTHORIZED'
|
|
|
|
|
|
|
|
|
|
|
|
class ForbiddenError(RPCError):
|
|
|
|
"""
|
2017-11-26 19:06:09 +03:00
|
|
|
Privacy violation. For example, an attempt to write a message to
|
|
|
|
someone who has blacklisted the current user.
|
2017-06-10 12:47:51 +03:00
|
|
|
"""
|
|
|
|
code = 403
|
|
|
|
message = 'FORBIDDEN'
|
|
|
|
|
2017-06-15 16:25:05 +03:00
|
|
|
def __init__(self, message):
|
2018-02-14 10:09:22 +03:00
|
|
|
super().__init__(message)
|
2017-06-15 16:25:05 +03:00
|
|
|
self.message = message
|
|
|
|
|
2017-06-10 12:47:51 +03:00
|
|
|
|
|
|
|
class NotFoundError(RPCError):
|
|
|
|
"""
|
2017-11-26 19:06:09 +03:00
|
|
|
An attempt to invoke a non-existent object, such as a method.
|
2017-06-10 12:47:51 +03:00
|
|
|
"""
|
|
|
|
code = 404
|
|
|
|
message = 'NOT_FOUND'
|
|
|
|
|
2017-06-15 16:25:05 +03:00
|
|
|
def __init__(self, message):
|
2018-02-14 10:09:22 +03:00
|
|
|
super().__init__(message)
|
2017-06-15 16:25:05 +03:00
|
|
|
self.message = message
|
|
|
|
|
2017-06-10 12:47:51 +03:00
|
|
|
|
2018-03-30 13:18:18 +03:00
|
|
|
class AuthKeyError(RPCError):
|
|
|
|
"""
|
|
|
|
Errors related to invalid authorization key, like
|
|
|
|
AUTH_KEY_DUPLICATED which can cause the connection to fail.
|
|
|
|
"""
|
|
|
|
code = 406
|
|
|
|
message = 'AUTH_KEY'
|
|
|
|
|
|
|
|
def __init__(self, message):
|
|
|
|
super().__init__(message)
|
|
|
|
self.message = message
|
|
|
|
|
|
|
|
|
2017-06-10 12:47:51 +03:00
|
|
|
class FloodError(RPCError):
|
|
|
|
"""
|
2017-11-26 19:06:09 +03:00
|
|
|
The maximum allowed number of attempts to invoke the given method
|
|
|
|
with the given input parameters has been exceeded. For example, in an
|
|
|
|
attempt to request a large number of text messages (SMS) for the same
|
|
|
|
phone number.
|
2017-06-10 12:47:51 +03:00
|
|
|
"""
|
|
|
|
code = 420
|
|
|
|
message = 'FLOOD'
|
|
|
|
|
|
|
|
|
|
|
|
class ServerError(RPCError):
|
|
|
|
"""
|
2017-11-26 19:06:09 +03:00
|
|
|
An internal server error occurred while a request was being processed
|
|
|
|
for example, there was a disruption while accessing a database or file
|
|
|
|
storage.
|
2017-06-10 12:47:51 +03:00
|
|
|
"""
|
|
|
|
code = 500
|
|
|
|
message = 'INTERNAL'
|
|
|
|
|
2017-06-15 16:25:05 +03:00
|
|
|
def __init__(self, message):
|
2018-02-14 10:09:22 +03:00
|
|
|
super().__init__(message)
|
2017-06-15 16:25:05 +03:00
|
|
|
self.message = message
|
|
|
|
|
2017-06-10 12:47:51 +03:00
|
|
|
|
2018-06-11 11:20:22 +03:00
|
|
|
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
|
|
|
|
|
|
|
|
|
2017-06-10 12:47:51 +03:00
|
|
|
class BadMessageError(Exception):
|
2017-11-26 19:06:09 +03:00
|
|
|
"""Occurs when handling a bad_message_notification."""
|
2017-06-10 12:47:51 +03:00
|
|
|
ErrorMessages = {
|
|
|
|
16:
|
2017-11-26 19:06:09 +03:00
|
|
|
'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).',
|
2017-06-10 12:47:51 +03:00
|
|
|
17:
|
2017-11-26 19:06:09 +03:00
|
|
|
'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).',
|
2017-06-10 12:47:51 +03:00
|
|
|
18:
|
2017-11-26 19:06:09 +03:00
|
|
|
'Incorrect two lower order msg_id bits (the server expects client '
|
|
|
|
'message msg_id to be divisible by 4).',
|
2017-06-10 12:47:51 +03:00
|
|
|
19:
|
2017-11-26 19:06:09 +03:00
|
|
|
'Container msg_id is the same as msg_id of a previously received '
|
|
|
|
'message (this must never happen).',
|
2017-06-10 12:47:51 +03:00
|
|
|
20:
|
2017-11-26 19:06:09 +03:00
|
|
|
'Message too old, and it cannot be verified whether the server has '
|
|
|
|
'received a message with this msg_id or not.',
|
2017-06-10 12:47:51 +03:00
|
|
|
32:
|
2017-11-26 19:06:09 +03:00
|
|
|
'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).',
|
2017-06-10 12:47:51 +03:00
|
|
|
33:
|
2017-11-26 19:06:09 +03:00
|
|
|
'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).',
|
2017-06-10 12:47:51 +03:00
|
|
|
34:
|
|
|
|
'An even msg_seqno expected (irrelevant message), but odd received.',
|
2017-11-26 19:06:09 +03:00
|
|
|
35:
|
|
|
|
'Odd msg_seqno expected (relevant message), but even received.',
|
2017-06-10 12:47:51 +03:00
|
|
|
48:
|
2017-11-26 19:06:09 +03:00
|
|
|
'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.'
|
2017-06-10 12:47:51 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
def __init__(self, code):
|
2018-02-14 10:09:22 +03:00
|
|
|
super().__init__(self.ErrorMessages.get(
|
2017-06-10 12:47:51 +03:00
|
|
|
code,
|
|
|
|
'Unknown error code (this should not happen): {}.'.format(code)))
|
|
|
|
|
|
|
|
self.code = code
|
2018-06-11 11:20:22 +03:00
|
|
|
|
|
|
|
|
|
|
|
base_errors = {x.code: x for x in (
|
|
|
|
InvalidDCError, BadRequestError, UnauthorizedError, ForbiddenError,
|
|
|
|
NotFoundError, AuthKeyError, FloodError, ServerError, BotTimeout
|
|
|
|
)}
|