· 4 years ago · Aug 09, 2021, 06:44 PM
1from quart import Quart, redirect, url_for , request , render_template , session
2from quart_discord import DiscordOAuth2Session, requires_authorization, Unauthorized
3import requests
4from discord.ext import ipc
5import aiohttp
6import asyncio
7
8
9HOST = "public_ip_address"
10PORT = "9999"
11SECRET_KEY = "PASS"
12
13app = Quart(__name__)
14ipc_client = ipc.Client(host=HOST,port=PORT, secret_key=SECRET_KEY)
15
16app.config["SECRET_KEY"] = "test123"
17app.config["DISCORD_CLIENT_ID"] = 826791407406153738 # Discord client ID.
18app.config["DISCORD_CLIENT_SECRET"] = "secret" # Discord client secret.
19app.config["DISCORD_REDIRECT_URI"] = "http://127.0.0.1:8080/callback" # URL to your callback endpoint.
20
21discord_token_url = "https://discord.com/api/oauth2/token"
22discord_api_url = "https://discord.com/api"
23scope=['identify', 'email', 'guilds']
24discord = DiscordOAuth2Session(app)
25
26
27def get_access_token(code):
28 payload = {
29 "client_id": app.config["DISCORD_CLIENT_ID"],
30 "client_secret": app.config["DISCORD_CLIENT_SECRET"],
31 "grant_type": "authorization_code",
32 "code": code,
33 "redirect_uri": app.config["DISCORD_REDIRECT_URI"],
34 "scope": scope
35 }
36
37 access_token = requests.post(url = discord_token_url, data = payload).json()
38 return access_token.get("access_token")
39
40
41def get_user_json(access_token):
42 url = f"{discord_api_url}/users/@me"
43 headers = {"Authorization": f"Bearer {access_token}"}
44
45 user_object = requests.get(url = url, headers = headers).json()
46 return user_object
47
48@app.route("/login/")
49async def login():
50 return await discord.create_session(scope = scope)
51
52
53@app.route("/callback/")
54async def callback():
55 code = request.args.get("code")
56 token = get_access_token(code)
57 token = {"access_token": token}
58 session["DISCORD_OAUTH2_TOKEN"] = token
59
60 return redirect(url_for("dashboard"))
61
62@app.errorhandler(Unauthorized)
63async def redirect_unauthorized(e):
64 return redirect(url_for("login"))
65
66
67@app.route("/dashboard/")
68@requires_authorization
69async def dashboard():
70 user_guilds = await discord.fetch_guilds() #Fetching User Guilds
71 guild_count = await ipc_client.request("get_guild_count")
72 guild_ids = await ipc_client.request("get_guild_ids")
73
74 same_guilds = []
75
76 for guild in user_guilds:
77 if guild.id in guild_ids:
78 same_guilds.append(guild)
79
80 return same_guilds
81
82
83
84if __name__ == "__main__":
85 app.run(host="0.0.0.0", port=8080, debug=True) #DEBUG MODE
86