diff --git a/flask_discord/_http.py b/flask_discord/_http.py index 891bb39..d433b9f 100644 --- a/flask_discord/_http.py +++ b/flask_discord/_http.py @@ -26,6 +26,10 @@ class DiscordOAuth2HttpClient(abc.ABC): The client secret of discord application provided. redirect_uri : str The default URL to use to redirect user to after authorization. + bot_token : str + The bot token of the application. This is required when you also need to access bot scope resources + beyond the normal resources provided by the OAuth. Can be also set to flask config with + key ``DISCORD_BOT_TOKEN``. users_cache : cachetools.LFUCache Any dict like mapping to internally cache the authorized users. Preferably an instance of cachetools.LFUCache or cachetools.TTLCache. If not specified, default cachetools.LFUCache is used. @@ -39,10 +43,11 @@ class DiscordOAuth2HttpClient(abc.ABC): "DISCORD_OAUTH2_TOKEN", ] - def __init__(self, app, users_cache=None): - self.client_id = app.config["DISCORD_CLIENT_ID"] - self.client_secret = app.config["DISCORD_CLIENT_SECRET"] - self.redirect_uri = app.config["DISCORD_REDIRECT_URI"] + def __init__(self, app, client_id=None, client_secret=None, redirect_uri=None, bot_token=None, users_cache=None): + self.client_id = client_id or app.config["DISCORD_CLIENT_ID"] + self.client_secret = client_secret or app.config["DISCORD_CLIENT_SECRET"] + self.redirect_uri = redirect_uri or app.config["DISCORD_REDIRECT_URI"] + self.bot_token = bot_token or app.config.get("DISCORD_BOT_TOKEN", str()) self.users_cache = cachetools.LFUCache( app.config.get("DISCORD_USERS_CACHE_MAX_LIMIT", configs.DISCORD_USERS_CACHE_DEFAULT_MAX_LIMIT) ) if users_cache is None else users_cache @@ -147,3 +152,30 @@ class DiscordOAuth2HttpClient(abc.ABC): return response.json() except json.JSONDecodeError: return response.text + + def bot_request(self, route: str, method="GET", **kwargs) -> typing.Union[dict, str]: + """Make HTTP request to specified endpoint with bot token as authorization headers. + + Parameters + ---------- + route : str + Route or endpoint URL to send HTTP request to. + method : str, optional + Specify the HTTP method to use to perform this request. + + Returns + ------- + dict, str + Dictionary containing received from sent HTTP GET request if content-type is ``application/json`` + otherwise returns raw text content of the response. + + Raises + ------ + flask_discord.Unauthorized + Raises :py:class:`flask_discord.Unauthorized` if current user is not authorized. + flask_discord.RateLimited + Raises an instance of :py:class:`flask_discord.RateLimited` if application is being rate limited by Discord. + + """ + headers = {"Authorization": f"Bot {self.bot_token}"} + return self.request(route, method=method, oauth=False, headers=headers, **kwargs) diff --git a/flask_discord/client.py b/flask_discord/client.py index 849168c..7eee9f1 100644 --- a/flask_discord/client.py +++ b/flask_discord/client.py @@ -14,6 +14,23 @@ class DiscordOAuth2Session(_http.DiscordOAuth2HttpClient): ---------- app : Flask An instance of your `flask application `_. + client_id : int, optional + The client ID of discord application provided. Can be also set to flask config + with key ``DISCORD_CLIENT_ID``. + client_secret : str, optional + The client secret of discord application provided. Can be also set to flask config + with key ``DISCORD_CLIENT_SECRET``. + redirect_uri : str, optional + The default URL to use to redirect user to after authorization. Can be also set to flask config + with key ``DISCORD_REDIRECT_URI``. + bot_token : str, optional + The bot token of the application. This is required when you also need to access bot scope resources + beyond the normal resources provided by the OAuth. Can be also set to flask config with + key ``DISCORD_BOT_TOKEN``. + users_cache : cachetools.LFUCache, optional + Any dict like mapping to internally cache the authorized users. Preferably an instance of + cachetools.LFUCache or cachetools.TTLCache. If not specified, default cachetools.LFUCache is used. + Uses the default max limit for cache if ``DISCORD_USERS_CACHE_MAX_LIMIT`` isn't specified in app config. """ diff --git a/flask_discord/models/base.py b/flask_discord/models/base.py index aaa43e6..f0247f5 100644 --- a/flask_discord/models/base.py +++ b/flask_discord/models/base.py @@ -28,6 +28,11 @@ class DiscordModelsBase(metaclass=DiscordModelsMeta): """ return current_app.discord.request(*args, **kwargs) + @staticmethod + def _bot_request(*args, **kwargs): + """A shorthand to :py:func:flask_discord.bot_request`.""" + return current_app.discord.bot_request(*args, **kwargs) + @classmethod def fetch_from_api(cls): """A class method which returns an instance or list of instances of this model by implicitly making an