litecord/litecord/errors.py

155 lines
4.3 KiB
Python

"""
Litecord
Copyright (C) 2018-2019 Luna Mendes
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, version 3 of the License.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
"""
ERR_MSG_MAP = {
10001: 'Unknown account',
10002: 'Unknown application',
10003: 'Unknown channel',
10004: 'Unknown guild',
10005: 'Unknown integration',
10006: 'Unknown invite',
10007: 'Unknown member',
10008: 'Unknown message',
10009: 'Unknown overwrite',
10010: 'Unknown provider',
10011: 'Unknown role',
10012: 'Unknown token',
10013: 'Unknown user',
10014: 'Unknown Emoji',
10015: 'Unknown Webhook',
20001: 'Bots cannot use this endpoint',
20002: 'Only bots can use this endpoint',
30001: 'Maximum number of guilds reached (100)',
30002: 'Maximum number of friends reached (1000)',
30003: 'Maximum number of pins reached (50)',
30005: 'Maximum number of guild roles reached (250)',
30010: 'Maximum number of reactions reached (20)',
30013: 'Maximum number of guild channels reached (500)',
40001: 'Unauthorized',
50001: 'Missing access',
50002: 'Invalid account type',
50003: 'Cannot execute action on a DM channel',
50004: 'Widget Disabled',
50005: 'Cannot edit a message authored by another user',
50006: 'Cannot send an empty message',
50007: 'Cannot send messages to this user',
50008: 'Cannot send messages in a voice channel',
50009: 'Channel verification level is too high',
50010: 'OAuth2 application does not have a bot',
50011: 'OAuth2 application limit reached',
50012: 'Invalid OAuth state',
50013: 'Missing permissions',
50014: 'Invalid authentication token',
50015: 'Note is too long',
50016: ('Provided too few or too many messages to delete. Must provide at '
'least 2 and fewer than 100 messages to delete.'),
50019: 'A message can only be pinned to the channel it was sent in',
50020: 'Invite code is either invalid or taken.',
50021: 'Cannot execute action on a system message',
50025: 'Invalid OAuth2 access token',
50034: 'A message provided was too old to bulk delete',
50035: 'Invalid Form Body',
50036: 'An invite was accepted to a guild the application\'s bot is not in',
50041: 'Invalid API version',
90001: 'Reaction blocked',
}
class LitecordError(Exception):
"""Base class for litecord errors"""
status_code = 500
@property
def message(self) -> str:
"""Get an error's message string."""
try:
return self.args[0]
except IndexError:
err_code = getattr(self, 'error_code', None)
if err_code is not None:
return ERR_MSG_MAP.get(err_code) or self.args[0]
return repr(self)
@property
def json(self):
"""Get any specific extra JSON keys to insert
on the error response."""
return self.args[1]
class BadRequest(LitecordError):
status_code = 400
class Unauthorized(LitecordError):
status_code = 401
class Forbidden(LitecordError):
status_code = 403
class NotFound(LitecordError):
status_code = 404
class GuildNotFound(NotFound):
error_code = 10004
class ChannelNotFound(NotFound):
error_code = 10003
class MessageNotFound(NotFound):
error_code = 10008
class WebhookNotFound(NotFound):
error_code = 10015
class Ratelimited(LitecordError):
status_code = 429
class MissingPermissions(Forbidden):
error_code = 50013
class WebsocketClose(Exception):
@property
def code(self):
from_class = getattr(self, 'close_code', None)
if from_class:
return from_class
return self.args[0]
@property
def reason(self):
from_class = getattr(self, 'close_code', None)
if from_class:
return self.args[0]
return self.args[1]