From 7601a448f8c5bffa08b13857021daf7aef77b05f Mon Sep 17 00:00:00 2001 From: SimolZimol <70102430+SimolZimol@users.noreply.github.com> Date: Thu, 24 Oct 2024 12:57:07 +0200 Subject: [PATCH] modified: app.py --- app.py | 121 +++++++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 100 insertions(+), 21 deletions(-) diff --git a/app.py b/app.py index 29e3c06..35e1f96 100644 --- a/app.py +++ b/app.py @@ -140,24 +140,19 @@ def login(): def callback(): """Verarbeitet den OAuth2-Rückruf von Discord.""" try: - # Discord OAuth2-Session initialisieren discord = make_discord_session(state=session.get("oauth_state")) - - # Token abrufen token = discord.fetch_token( DISCORD_TOKEN_URL, client_secret=DISCORD_CLIENT_SECRET, authorization_response=request.url, ) + session['oauth_token'] = token # Abrufen der Benutzerinformationen von Discord user_info = discord.get(DISCORD_API_URL).json() 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 guilds_response = discord.get('https://discord.com/api/users/@me/guilds') @@ -167,35 +162,118 @@ def callback(): guilds = guilds_response.json() - # Debugging: Gib die Gildeninformationen aus - print(f"Guilds: {guilds}") + # Verbindung zur Datenbank herstellen + 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 - + # Weiterleitung zur Server-Auswahl return redirect(url_for("server_selection")) except Exception as e: - # Fehlerbehandlung mit detaillierter Fehlermeldung print(f"Error in OAuth2 callback: {e}") flash("Ein Fehler ist beim Authentifizierungsprozess aufgetreten.", "danger") 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") def server_selection(): - """Zeigt dem Benutzer eine Liste aller Server an, auf denen er sich befindet.""" - if "discord_user" in session and "discord_guilds" in session: - print("Session contains user and guilds data") # Debugging - guilds = session['discord_guilds'] + """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: + user_info = session["discord_user"] + 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) - else: - print("Session is missing user or guilds data") # Debugging - - # 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")) + + return redirect(url_for("login")) @app.route("/admin_dashboard") @@ -258,4 +336,5 @@ def stop(): return redirect(url_for("landing_page")) if __name__ == "__main__": + initialize_guilds() app.run(host="0.0.0.0", port=5000, debug=True)