From 0a2323f38704d4ddf913eefc84be441e8a6b966e Mon Sep 17 00:00:00 2001 From: thec0sm0s Date: Fri, 11 Sep 2020 09:53:46 +0530 Subject: [PATCH] =?UTF-8?q?=E2=9C=94=20Implement=20method=20for=20lazy=20i?= =?UTF-8?q?nitialization=20supporting=20flask=20factory=20patterns.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- flask_discord/_http.py | 35 +++++++++-- tests/__init__.py | 22 +++++++ tests/test_factory_app.py | 118 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 169 insertions(+), 6 deletions(-) create mode 100644 tests/__init__.py create mode 100644 tests/test_factory_app.py diff --git a/flask_discord/_http.py b/flask_discord/_http.py index 7ae4715..0dc62b9 100644 --- a/flask_discord/_http.py +++ b/flask_discord/_http.py @@ -26,14 +26,37 @@ class DiscordOAuth2HttpClient(abc.ABC): "DISCORD_OAUTH2_TOKEN", ] - 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()) + def __init__( + self, app=None, + client_id=None, client_secret=None, redirect_uri=None, + bot_token=None, users_cache=None + ): + self.client_id = client_id + self.__client_secret = client_secret + self.redirect_uri = redirect_uri + self.__bot_token = bot_token + self.users_cache = users_cache + + if app is not None: + self.init_app(app) + + def init_app(self, app): + """A method to lazily initialize the application. + Use this when you're using flask factory pattern to create your instances of your flask application. + + Parameters + ---------- + app : Flask + An instance of your `flask application `_. + + """ + self.client_id = self.client_id or app.config["DISCORD_CLIENT_ID"] + self.__client_secret = self.__client_secret or app.config["DISCORD_CLIENT_SECRET"] + self.redirect_uri = self.redirect_uri or app.config["DISCORD_REDIRECT_URI"] + self.__bot_token = self.__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 + ) if self.users_cache is None else self.users_cache if not issubclass(self.users_cache.__class__, Mapping): raise ValueError("Instance users_cache must be a mapping like object.") if "http://" in self.redirect_uri: diff --git a/tests/__init__.py b/tests/__init__.py new file mode 100644 index 0000000..dc5fd7e --- /dev/null +++ b/tests/__init__.py @@ -0,0 +1,22 @@ +import os + +from flask import Flask +from flask_discord import DiscordOAuth2Session + + +discord = DiscordOAuth2Session(client_id=490732332240863233) + + +def get_app(): + app = Flask(__name__) + + app.secret_key = b"%\xe0'\x01\xdeH\x8e\x85m|\xb3\xffCN\xc9g" + + # app.config["DISCORD_CLIENT_ID"] = 490732332240863233 + app.config["DISCORD_CLIENT_SECRET"] = os.getenv("DISCORD_CLIENT_SECRET") + app.config["DISCORD_BOT_TOKEN"] = os.getenv("DISCORD_BOT_TOKEN") + app.config["DISCORD_REDIRECT_URI"] = "http://127.0.0.1:5000/callback" + + discord.init_app(app) + + return app diff --git a/tests/test_factory_app.py b/tests/test_factory_app.py new file mode 100644 index 0000000..15c7541 --- /dev/null +++ b/tests/test_factory_app.py @@ -0,0 +1,118 @@ +import os + +from tests import get_app, discord +from flask import redirect, url_for +from flask_discord import requires_authorization + + +app = get_app() + +HYPERLINK = '{}' + + +@app.route("/") +def index(): + if not discord.authorized: + return f""" + {HYPERLINK.format(url_for(".login"), "Login")}
+ {HYPERLINK.format(url_for(".login_with_data"), "Login with custom data")}
+ {HYPERLINK.format(url_for(".invite_bot"), "Invite Bot with permissions 8")}
+ {HYPERLINK.format(url_for(".invite_oauth"), "Authorize with oauth and bot invite")} + """ + + return f""" + {HYPERLINK.format(url_for(".me"), "@ME")}
+ {HYPERLINK.format(url_for(".logout"), "Logout")}
+ {HYPERLINK.format(url_for(".user_guilds"), "My Servers")}
+ {HYPERLINK.format(url_for(".add_to_guild", guild_id=475549041741135881), "Add me to 475549041741135881.")} + """ + + +@app.route("/login/") +def login(): + return discord.create_session() + + +@app.route("/login-data/") +def login_with_data(): + return discord.create_session(data=dict(redirect="/me/", coupon="15off", number=15, zero=0, status=False)) + + +@app.route("/invite-bot/") +def invite_bot(): + return discord.create_session(scope=["bot"], permissions=8, guild_id=464488012328468480, disable_guild_select=True) + + +@app.route("/invite-oauth/") +def invite_oauth(): + return discord.create_session(scope=["bot", "identify"], permissions=8) + + +@app.route("/callback/") +def callback(): + data = discord.callback() + redirect_to = data.get("redirect", "/") + return redirect(redirect_to) + + +@app.route("/me/") +def me(): + user = discord.fetch_user() + return f""" + + +{user.name} + + +

Is avatar animated: {str(user.is_avatar_animated)}

+Connections +
+ + + +""" + + +@app.route("/me/guilds/") +def user_guilds(): + guilds = discord.fetch_guilds() + return "
".join([f"[ADMIN] {g.name}" if g.permissions.administrator else g.name for g in guilds]) + + +@app.route("/add_to//") +def add_to_guild(guild_id): + user = discord.fetch_user() + return user.add_to_guild(guild_id) + + +@app.route("/me/connections/") +def my_connections(): + user = discord.fetch_user() + connections = discord.fetch_connections() + return f""" + + +{user.name} + + +{str([f"{connection.name} - {connection.type}" for connection in connections])} + + + +""" + + +@app.route("/logout/") +def logout(): + discord.revoke() + return redirect(url_for(".index")) + + +@app.route("/secret/") +@requires_authorization +def secret(): + return os.urandom(16) + + +if __name__ == "__main__": + app.run(debug=True)