data Ordner angelegt. InitDB in einem eigenen Script. DB verbindungen in einem eigenen Script.

This commit is contained in:
Daniel Nagel 2026-03-02 09:16:30 +00:00
parent 5774138ecb
commit df608709a7
9 changed files with 126 additions and 113 deletions

View File

@ -1 +1 @@
{"authenticated":true,"discord_id":"277898241750859776","discord_name":"mrteels","db_id":1,"avatar_url":"https://cdn.discordapp.com/avatars/277898241750859776/7c3446bb51fafd72b1b4c21124b4994f.png"}
{"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"}

64
data/data_api.py Normal file
View File

@ -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

34
data/database.py Normal file
View File

@ -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...")

View File

@ -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.")

View File

@ -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

View File

@ -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()

View File

@ -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'):

21
main.py
View File

@ -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()

View File

@ -0,0 +1 @@
from data import database