mirror of
https://github.com/yawaflua/Flask-Discord.git
synced 2025-12-09 20:09:30 +02:00
✔ Implement method for lazy initialization supporting flask factory patterns.
This commit is contained in:
@@ -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 <http://flask.pocoo.org/docs/1.0/api/#flask.Flask>`_.
|
||||
|
||||
"""
|
||||
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:
|
||||
|
||||
22
tests/__init__.py
Normal file
22
tests/__init__.py
Normal file
@@ -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
|
||||
118
tests/test_factory_app.py
Normal file
118
tests/test_factory_app.py
Normal file
@@ -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 = '<a href="{}">{}</a>'
|
||||
|
||||
|
||||
@app.route("/")
|
||||
def index():
|
||||
if not discord.authorized:
|
||||
return f"""
|
||||
{HYPERLINK.format(url_for(".login"), "Login")} <br />
|
||||
{HYPERLINK.format(url_for(".login_with_data"), "Login with custom data")} <br />
|
||||
{HYPERLINK.format(url_for(".invite_bot"), "Invite Bot with permissions 8")} <br />
|
||||
{HYPERLINK.format(url_for(".invite_oauth"), "Authorize with oauth and bot invite")}
|
||||
"""
|
||||
|
||||
return f"""
|
||||
{HYPERLINK.format(url_for(".me"), "@ME")}<br />
|
||||
{HYPERLINK.format(url_for(".logout"), "Logout")}<br />
|
||||
{HYPERLINK.format(url_for(".user_guilds"), "My Servers")}<br />
|
||||
{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"""
|
||||
<html>
|
||||
<head>
|
||||
<title>{user.name}</title>
|
||||
</head>
|
||||
<body><img src='{user.avatar_url or user.default_avatar_url}' />
|
||||
<p>Is avatar animated: {str(user.is_avatar_animated)}</p>
|
||||
<a href={url_for("my_connections")}>Connections</a>
|
||||
<br />
|
||||
</body>
|
||||
</html>
|
||||
|
||||
"""
|
||||
|
||||
|
||||
@app.route("/me/guilds/")
|
||||
def user_guilds():
|
||||
guilds = discord.fetch_guilds()
|
||||
return "<br />".join([f"[ADMIN] {g.name}" if g.permissions.administrator else g.name for g in guilds])
|
||||
|
||||
|
||||
@app.route("/add_to/<int:guild_id>/")
|
||||
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"""
|
||||
<html>
|
||||
<head>
|
||||
<title>{user.name}</title>
|
||||
</head>
|
||||
<body>
|
||||
{str([f"{connection.name} - {connection.type}" for connection in connections])}
|
||||
</body>
|
||||
</html>
|
||||
|
||||
"""
|
||||
|
||||
|
||||
@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)
|
||||
Reference in New Issue
Block a user