diff --git a/docs/api.rst b/docs/api.rst index 089d721..7d5f840 100644 --- a/docs/api.rst +++ b/docs/api.rst @@ -53,5 +53,8 @@ Exceptions .. autoclass:: flask_discord.HttpException :members: +.. autoclass:: flask_discord.RateLimited + :members: + .. autoclass:: flask_discord.Unauthorized :members: diff --git a/flask_discord/__init__.py b/flask_discord/__init__.py index b6164b5..c1c15bb 100644 --- a/flask_discord/__init__.py +++ b/flask_discord/__init__.py @@ -9,6 +9,7 @@ __all__ = [ "requires_authorization", "HttpException", + "RateLimited", "Unauthorized", ] diff --git a/flask_discord/exceptions.py b/flask_discord/exceptions.py index ef47d38..51b0227 100644 --- a/flask_discord/exceptions.py +++ b/flask_discord/exceptions.py @@ -2,5 +2,34 @@ class HttpException(Exception): """Base Exception class representing a HTTP exception.""" +class RateLimited(HttpException): + """A HTTP Exception raised when the application is being rate limited. + It provides the ``response`` attribute which can be used to get more details of the actual response from + the Discord API with few more shorthands to ``response.json()``. + + Attributes + ---------- + response : requests.Response + The actual response object received from Discord API. + json : dict + The actual JSON data received. Shorthand to ``response.json()``. + message : str + A message saying you are being rate limited. + retry_after : int + The number of milliseconds to wait before submitting another request. + is_global : bool + A value indicating if you are being globally rate limited or not + + """ + + def __init__(self, response): + self.response = response + self.json = self.response.json() + self.message = self.json["message"] + self.is_global = self.json["global"] + self.retry_after = self.json["retry_after"] + super().__init__(self.json["message"]) + + class Unauthorized(HttpException): """A HTTP Exception raised when user is not authorized."""