From df608709a7cb2e2a9e1303a6e0a02550325e0b7d Mon Sep 17 00:00:00 2001 From: Daniel Nagel Date: Mon, 2 Mar 2026 09:16:30 +0000 Subject: [PATCH] data Ordner angelegt. InitDB in einem eigenen Script. DB verbindungen in einem eigenen Script. --- ...-83ffc178-0f94-4ada-8ca6-1c51b99b4b9c.json | 2 +- data/data_api.py | 64 +++++++++++ data/database.py | 34 ++++++ database.py => data/setup_database.py | 101 +++--------------- gui/discord_login.py | 4 +- gui/main_gui.py | 5 +- gui/match_gui.py | 7 +- main.py | 21 +--- mmr calculations/calc_match.py | 1 + 9 files changed, 126 insertions(+), 113 deletions(-) create mode 100644 data/data_api.py create mode 100644 data/database.py rename database.py => data/setup_database.py (57%) create mode 100644 mmr calculations/calc_match.py diff --git a/.nicegui/storage-user-83ffc178-0f94-4ada-8ca6-1c51b99b4b9c.json b/.nicegui/storage-user-83ffc178-0f94-4ada-8ca6-1c51b99b4b9c.json index e0bc8fd..b3fb00d 100644 --- a/.nicegui/storage-user-83ffc178-0f94-4ada-8ca6-1c51b99b4b9c.json +++ b/.nicegui/storage-user-83ffc178-0f94-4ada-8ca6-1c51b99b4b9c.json @@ -1 +1 @@ -{"authenticated":true,"discord_id":"277898241750859776","discord_name":"mrteels","db_id":1,"avatar_url":"https://cdn.discordapp.com/avatars/277898241750859776/7c3446bb51fafd72b1b4c21124b4994f.png"} \ No newline at end of file +{"authenticated":true,"discord_id":"277898241750859776","discord_name":"mrteels","db_id":1,"display_name":"Daniel Nagel","discord_avatar_url":"https://cdn.discordapp.com/avatars/277898241750859776/7c3446bb51fafd72b1b4c21124b4994f.png"} \ No newline at end of file diff --git a/data/data_api.py b/data/data_api.py new file mode 100644 index 0000000..901752b --- /dev/null +++ b/data/data_api.py @@ -0,0 +1,64 @@ +import sqlite3 +import random +from data.setup_database import DB_PATH + +def change_display_name(player_id, new_name): + connection = sqlite3.connect(DB_PATH) + cursor = connection.cursor() + + cursor.execute("UPDATE players SET display_name = ? WHERE id = ?", (new_name, player_id)) + + connection.commit() + connection.close() + + +def get_or_create_player(discord_id, discord_name, avatar_url): + connection = sqlite3.connect(DB_PATH) + cursor = connection.cursor() + + # REPARIERT: Wir fragen 4 Dinge ab (id, discord_name, display_name, discord_avatar_url) + cursor.execute("SELECT id, discord_name, display_name, discord_avatar_url FROM players WHERE discord_id = ?", (discord_id,)) + player = cursor.fetchone() + + if player is None: + + # Random Silly Name Generator für neue Spieler. Damit sie angeregt werden ihren richtigen Namen einzutragen. + def generate_silly_name(): + adjectives = ["Verwirrter", "Blinder", "Heulender", "Zorniger", "Chaos", "Verzweifelter", "Schreiender", "Stolpernder", "Schwitzender"] + nouns = ["Grot", "Kultist", "Servitor", "Snotling", "Guardmen", "Würfellecker", "Regelvergesser", "Meta-Chaser", "Klebschnüffler"] + adj = random.choice(adjectives) + noun = random.choice(nouns) + return f"{adj} {noun}" + + silly_name = generate_silly_name() + cursor.execute("INSERT INTO players (discord_id, discord_name, display_name, discord_avatar_url) VALUES (?, ?, ?, ?)", (discord_id, discord_name, silly_name, avatar_url)) + connection.commit() + + cursor.execute("SELECT id, discord_name, display_name, discord_avatar_url FROM players WHERE discord_id = ?", (discord_id,)) + player = cursor.fetchone() + else: + # Falls sich Name oder Bild auf Discord geändert haben, machen wir ein Update + cursor.execute("UPDATE players SET discord_name = ?, discord_avatar_url = ? WHERE discord_id = ?", (discord_name, avatar_url, discord_id)) + connection.commit() + + cursor.execute("SELECT id, discord_name, display_name, discord_avatar_url FROM players WHERE discord_id = ?", (discord_id,)) + player = cursor.fetchone() + + connection.close() + return player + + +def get_all_players(): + connection = sqlite3.connect(DB_PATH) + cursor = connection.cursor() + + # Alle Spieler laden, absteigend sortiert nach MMR + cursor.execute("SELECT id, name, mmr, points, games FROM players ORDER BY mmr DESC") + players = cursor.fetchall() + + connection.close() + + # Die Daten für das Web-GUI in eine lesbare Form umwandeln (Liste von Dictionaries) + result = [] + + return result \ No newline at end of file diff --git a/data/database.py b/data/database.py new file mode 100644 index 0000000..b1fae1d --- /dev/null +++ b/data/database.py @@ -0,0 +1,34 @@ +import sqlite3 +import os +from data import setup_database, data_api +from data.setup_database import DB_PATH + + +if __name__ == "__main__": + setup_database.init_db() + +def check_db(): + # --- DATENBANK CHECK --- + # Prüfen, ob die Datei im aktuellen Ordner existiert + db_file = DB_PATH + + if not os.path.exists(db_file): + print(f"WARNUNG: '{db_file}' nicht gefunden!") + print("Starte Datenbank-Einrichtung...") + + # 1. Erstellt die leere Datei und alle Tabellen-Strukturen + setup_database.init_db() + + print("Datenbank aufgebaut!") + else: + print(f"OK: Datenbank '{db_file}' gefunden. Lade System...") + + + + + + + + + + diff --git a/database.py b/data/setup_database.py similarity index 57% rename from database.py rename to data/setup_database.py index 6ff4c39..e0834e4 100644 --- a/database.py +++ b/data/setup_database.py @@ -1,18 +1,16 @@ import sqlite3 -import random +import os - -if __name__ == "__main__": - init_db() +DB_PATH = "data/warhammer_league.db" def init_db(): - connection = sqlite3.connect("warhammer_league.db") + connection = sqlite3.connect(DB_PATH) cursor = connection.cursor() # Fremdschlüssel (Foreign Keys) in SQLite aktivieren cursor.execute('PRAGMA foreign_keys = ON;') - # 1. Tabelle: players (Stammdaten) + # 1. Tabelle: players (Stammdaten) cursor.execute(''' CREATE TABLE IF NOT EXISTS players ( id INTEGER PRIMARY KEY AUTOINCREMENT, @@ -91,13 +89,17 @@ def init_db(): connection.commit() connection.close() - print("Standard Daten in die DB Geschrieben.") + print("Datenbank Struktur aufgebaut") + + #nächster Schritt: Standard Spielsysteme eintragen + seed_gamesystems() + # -------------------- # --- Start Setup der DB Daten. Damit sie nicht GANZ leer sind. # -------------------- def seed_gamesystems(): - connection = sqlite3.connect("warhammer_league.db") + connection = sqlite3.connect(DB_PATH) cursor = connection.cursor() systems = [ ("Warhammer 40k", 0, 100), @@ -110,10 +112,13 @@ def seed_gamesystems(): connection.commit() connection.close() - print("Spielsysteme wurden angelegt!") + print("Spielsysteme angelegt!") + + #Nächster Schritt: Standard Achievments eintragen. + seed_achievements() def seed_achievements(): - connection = sqlite3.connect("warhammer_league.db") + connection = sqlite3.connect(DB_PATH) cursor = connection.cursor() # Unsere Start-Stückliste an Erfolgen (Name, Beschreibung, Icon) @@ -127,80 +132,6 @@ def seed_achievements(): connection.commit() connection.close() - print("Achievements wurden in den Katalog geladen!") - - -def change_display_name(player_id, new_name): - connection = sqlite3.connect("warhammer_league.db") - cursor = connection.cursor() - - cursor.execute("UPDATE players SET display_name = ? WHERE id = ?", (new_name, player_id)) - - connection.commit() - connection.close() - - -def get_or_create_player(discord_id, discord_name, avatar_url): - connection = sqlite3.connect("warhammer_league.db") - cursor = connection.cursor() - - # REPARIERT: Wir fragen 4 Dinge ab (id, discord_name, display_name, discord_avatar_url) - cursor.execute("SELECT id, discord_name, display_name, discord_avatar_url FROM players WHERE discord_id = ?", (discord_id,)) - player = cursor.fetchone() - - if player is None: - - silly_name = generate_silly_name() - cursor.execute("INSERT INTO players (discord_id, discord_name, display_name, discord_avatar_url) VALUES (?, ?, ?, ?)", (discord_id, discord_name, silly_name, avatar_url)) - connection.commit() - - cursor.execute("SELECT id, discord_name, display_name, discord_avatar_url FROM players WHERE discord_id = ?", (discord_id,)) - player = cursor.fetchone() - else: - # Falls sich Name oder Bild auf Discord geändert haben, machen wir ein Update - cursor.execute("UPDATE players SET discord_name = ?, discord_avatar_url = ? WHERE discord_id = ?", (discord_name, avatar_url, discord_id)) - connection.commit() - - cursor.execute("SELECT id, discord_name, display_name, discord_avatar_url FROM players WHERE discord_id = ?", (discord_id,)) - player = cursor.fetchone() - - connection.close() - return player - - -def get_all_players(): - connection = sqlite3.connect("warhammer_league.db") - cursor = connection.cursor() - - # Alle Spieler laden, absteigend sortiert nach MMR - cursor.execute("SELECT id, name, mmr, points, games FROM players ORDER BY mmr DESC") - players = cursor.fetchall() - - connection.close() - - # Die Daten für das Web-GUI in eine lesbare Form umwandeln (Liste von Dictionaries) - result = [] - - return result - - -def generate_silly_name(): - adjectives = [ - "Verwirrter", "Blinder", "Heulender", "Zorniger", "Chaos", "" - "Verzweifelter", "Schreiender", "Stolpernder", "Schwitzender" - ] - nouns = [ - "Grot", "Kultist", "Servitor", "Snotling", - "Guardmen", "Würfellecker", "Regelvergesser", "Meta-Chaser", "Klebschnüffler" - ] - - # random.choice() nimmt zufällig ein Element aus der Liste - adj = random.choice(adjectives) - noun = random.choice(nouns) - - # Verbindet beide Wörter mit einem Leerzeichen (z.B. "Verwirrter Grot") - return f"{adj} {noun}" - - + print("Achievements angelegt.") diff --git a/gui/discord_login.py b/gui/discord_login.py index d1aad2a..2ca768f 100644 --- a/gui/discord_login.py +++ b/gui/discord_login.py @@ -3,7 +3,7 @@ import os import urllib.parse import requests from nicegui import ui, app -import database +from data import data_api def get_auth_url(): client_id = os.getenv("DISCORD_CLIENT_ID") @@ -55,7 +55,7 @@ def setup_login_routes(): avatar_url = "https://cdn.discordapp.com/embed/avatars/0.png" # In die Datenbank eintragen - player = database.get_or_create_player(discord_id, discord_name, avatar_url) + player = data_api.get_or_create_player(discord_id, discord_name, avatar_url) # Session updaten app.storage.user['authenticated'] = True diff --git a/gui/main_gui.py b/gui/main_gui.py index dec04c0..5c27bf7 100644 --- a/gui/main_gui.py +++ b/gui/main_gui.py @@ -1,5 +1,5 @@ from nicegui import ui, app -import database +from data import database, data_api from gui import discord_login, gui_style def setup_routes(): @@ -45,8 +45,7 @@ def setup_routes(): new_name = name_input.value # Nur speichern, wenn ein Name drinsteht und er anders ist als vorher if new_name and new_name != display_name: - import database - database.change_display_name(db_id, new_name) # Deine DB Funktion + data_api.change_display_name(db_id, new_name) # Deine DB Funktion app.storage.user['display_name'] = new_name ui.notify('Name gespeichert!', color='positive') ui.navigate.reload() diff --git a/gui/match_gui.py b/gui/match_gui.py index ebf1e23..760c18a 100644 --- a/gui/match_gui.py +++ b/gui/match_gui.py @@ -3,10 +3,9 @@ from gui import gui_style def setup_match_routes(): - # Unsere neue Unterseite für das Eintragen der Spiele - @ui.page('/add-match') - def add_match_page(): - + # 1. Die {}-Klammern definieren eine dynamische Variable in der URL + @ui.page('/add-match/{systemname}') + def match_form_page(systemname: str): # <--- WICHTIG: Hier fangen wir das Wort aus der URL auf! gui_style.apply_design() with ui.card().classes('w-full items-center mt-10'): diff --git a/main.py b/main.py index 624e0a2..e88be88 100644 --- a/main.py +++ b/main.py @@ -4,28 +4,13 @@ from nicegui import ui from gui import main_gui, match_gui, discord_login, league_statistic -import database +from data import database # 1. Lade die geheimen Variablen aus der .env Datei in den Speicher load_dotenv() -# --- DATENBANK CHECK --- -# Prüfen, ob die Datei im aktuellen Ordner existiert -db_file = "warhammer_league.db" - -if not os.path.exists(db_file): - print(f"WARNUNG: '{db_file}' nicht gefunden!") - print("Starte Datenbank-Einrichtung...") - - # 1. Erstellt die leere Datei und alle Tabellen-Strukturen - database.init_db() - database.seed_gamesystems() - database.seed_achievements() - - print("Datenbank erfolgreich aufgebaut!") -else: - print(f"OK: Datenbank '{db_file}' gefunden. Lade System...") +database.check_db() # ----------------------- @@ -33,7 +18,7 @@ else: client_id = os.getenv("DISCORD_CLIENT_ID") client_secret = os.getenv("DISCORD_CLIENT_SECRET") -# 3. Wir rufen unsere Funktion aus der main_gui.py auf +# 3. Seitenrouten aufbauen main_gui.setup_routes() match_gui.setup_match_routes() discord_login.setup_login_routes() diff --git a/mmr calculations/calc_match.py b/mmr calculations/calc_match.py new file mode 100644 index 0000000..c791851 --- /dev/null +++ b/mmr calculations/calc_match.py @@ -0,0 +1 @@ +from data import database \ No newline at end of file