modified: app.py

This commit is contained in:
SimolZimol
2024-10-24 12:57:07 +02:00
parent 0186ed582e
commit 7601a448f8

121
app.py
View File

@@ -140,24 +140,19 @@ def login():
def callback(): def callback():
"""Verarbeitet den OAuth2-Rückruf von Discord.""" """Verarbeitet den OAuth2-Rückruf von Discord."""
try: try:
# Discord OAuth2-Session initialisieren
discord = make_discord_session(state=session.get("oauth_state")) discord = make_discord_session(state=session.get("oauth_state"))
# Token abrufen
token = discord.fetch_token( token = discord.fetch_token(
DISCORD_TOKEN_URL, DISCORD_TOKEN_URL,
client_secret=DISCORD_CLIENT_SECRET, client_secret=DISCORD_CLIENT_SECRET,
authorization_response=request.url, authorization_response=request.url,
) )
session['oauth_token'] = token session['oauth_token'] = token
# Abrufen der Benutzerinformationen von Discord # Abrufen der Benutzerinformationen von Discord
user_info = discord.get(DISCORD_API_URL).json() user_info = discord.get(DISCORD_API_URL).json()
session['discord_user'] = user_info session['discord_user'] = user_info
# Debugging: Prüfe, ob Benutzerinformationen erfolgreich abgerufen wurden
print(f"User info: {user_info}")
# Hole die Gilden (Server), auf denen der Benutzer ist # Hole die Gilden (Server), auf denen der Benutzer ist
guilds_response = discord.get('https://discord.com/api/users/@me/guilds') guilds_response = discord.get('https://discord.com/api/users/@me/guilds')
@@ -167,35 +162,118 @@ def callback():
guilds = guilds_response.json() guilds = guilds_response.json()
# Debugging: Gib die Gildeninformationen aus # Verbindung zur Datenbank herstellen
print(f"Guilds: {guilds}") connection = get_db_connection()
cursor = connection.cursor()
# Speichern oder Aktualisieren der Gildeninformationen in der Datenbank
for guild in guilds:
guild_id = guild['id']
guild_name = guild['name']
guild_icon = guild.get('icon', None) # Manche Gilden haben kein Icon
owner_id = guild['owner_id']
# Prüfen, ob die Gilde bereits existiert
cursor.execute("SELECT COUNT(*) FROM guilds WHERE guild_id = %s", (guild_id,))
exists = cursor.fetchone()[0]
if exists:
# Gilde aktualisieren
cursor.execute("""
UPDATE guilds
SET name = %s, icon = %s, owner_id = %s
WHERE guild_id = %s
""", (guild_name, guild_icon, owner_id, guild_id))
else:
# Neue Gilde einfügen
cursor.execute("""
INSERT INTO guilds (guild_id, name, icon, owner_id)
VALUES (%s, %s, %s, %s)
""", (guild_id, guild_name, guild_icon, owner_id))
connection.commit()
cursor.close()
connection.close()
# Stelle sicher, dass Gildeninformationen in der Session gespeichert werden
session['discord_guilds'] = guilds # Speichere die Gilden in der Session session['discord_guilds'] = guilds # Speichere die Gilden in der Session
# Weiterleitung zur Server-Auswahl # Weiterleitung zur Server-Auswahl
return redirect(url_for("server_selection")) return redirect(url_for("server_selection"))
except Exception as e: except Exception as e:
# Fehlerbehandlung mit detaillierter Fehlermeldung
print(f"Error in OAuth2 callback: {e}") print(f"Error in OAuth2 callback: {e}")
flash("Ein Fehler ist beim Authentifizierungsprozess aufgetreten.", "danger") flash("Ein Fehler ist beim Authentifizierungsprozess aufgetreten.", "danger")
return redirect(url_for("landing_page")) return redirect(url_for("landing_page"))
def initialize_guilds():
"""Überprüft alle Gilden in user_data und stellt sicher, dass sie in der guilds-Tabelle vorhanden sind."""
try:
# Verbindung zur Datenbank herstellen
connection = get_db_connection()
cursor = connection.cursor(dictionary=True)
# Alle Gilden-IDs aus user_data abrufen
cursor.execute("SELECT DISTINCT guild_id FROM user_data")
user_guilds = cursor.fetchall()
# Liste aller Gilden-IDs, die von Discord aktualisiert werden müssen
guilds_to_update = []
# Überprüfen, ob jede Gilde aus user_data in guilds vorhanden ist
for guild in user_guilds:
guild_id = guild['guild_id']
cursor.execute("SELECT COUNT(*) AS count FROM guilds WHERE guild_id = %s", (guild_id,))
result = cursor.fetchone()
if result['count'] == 0:
# Gilde existiert nicht in der guilds-Tabelle, muss also aktualisiert werden
guilds_to_update.append(guild_id)
# Wenn Gilden aktualisiert werden müssen, verwende die Discord-API
if guilds_to_update:
discord = make_discord_session()
for guild_id in guilds_to_update:
guild_info = discord.get(f'https://discord.com/api/guilds/{guild_id}').json()
if 'id' in guild_info:
# Gildeninformationen in die guilds-Tabelle einfügen
cursor.execute("""
INSERT INTO guilds (guild_id, name, icon, owner_id)
VALUES (%s, %s, %s, %s)
""", (guild_info['id'], guild_info['name'], guild_info.get('icon', None), guild_info['owner_id']))
connection.commit()
print(f"Gilde {guild_info['name']} erfolgreich hinzugefügt.")
cursor.close()
connection.close()
except Exception as e:
print(f"Fehler beim Initialisieren der Gilden: {e}")
@app.route("/server_selection") @app.route("/server_selection")
def server_selection(): def server_selection():
"""Zeigt dem Benutzer eine Liste aller Server an, auf denen er sich befindet.""" """Zeigt dem Benutzer eine Liste aller Server an, auf denen er sich befindet und die in der Datenbank vorhanden sind."""
if "discord_user" in session and "discord_guilds" in session: if "discord_user" in session:
print("Session contains user and guilds data") # Debugging user_info = session["discord_user"]
guilds = session['discord_guilds'] user_id = user_info["id"]
connection = get_db_connection()
cursor = connection.cursor(dictionary=True)
# Abfrage der Gilden, auf denen der Benutzer in der Datenbank Einträge hat
cursor.execute("""
SELECT DISTINCT user_data.guild_id, guilds.name, guilds.icon
FROM user_data
JOIN guilds ON user_data.guild_id = guilds.guild_id
WHERE user_data.user_id = %s
""", (user_id,))
guilds = cursor.fetchall()
cursor.close()
connection.close()
return render_template("server_selection.html", guilds=guilds) return render_template("server_selection.html", guilds=guilds)
else:
print("Session is missing user or guilds data") # Debugging return redirect(url_for("login"))
# Falls die Session keine Gildeninformationen enthält, leite zurück zur Startseite
flash("Keine Gilden gefunden. Bitte erneut einloggen.", "danger")
return redirect(url_for("landing_page"))
@app.route("/admin_dashboard") @app.route("/admin_dashboard")
@@ -258,4 +336,5 @@ def stop():
return redirect(url_for("landing_page")) return redirect(url_for("landing_page"))
if __name__ == "__main__": if __name__ == "__main__":
initialize_guilds()
app.run(host="0.0.0.0", port=5000, debug=True) app.run(host="0.0.0.0", port=5000, debug=True)