data Ordner angelegt. InitDB in einem eigenen Script. DB verbindungen in einem eigenen Script.
This commit is contained in:
parent
5774138ecb
commit
df608709a7
|
|
@ -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
64
data/data_api.py
Normal 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
34
data/database.py
Normal 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...")
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -1,18 +1,16 @@
|
||||||
import sqlite3
|
import sqlite3
|
||||||
import random
|
import os
|
||||||
|
|
||||||
|
DB_PATH = "data/warhammer_league.db"
|
||||||
if __name__ == "__main__":
|
|
||||||
init_db()
|
|
||||||
|
|
||||||
def init_db():
|
def init_db():
|
||||||
connection = sqlite3.connect("warhammer_league.db")
|
connection = sqlite3.connect(DB_PATH)
|
||||||
cursor = connection.cursor()
|
cursor = connection.cursor()
|
||||||
|
|
||||||
# Fremdschlüssel (Foreign Keys) in SQLite aktivieren
|
# Fremdschlüssel (Foreign Keys) in SQLite aktivieren
|
||||||
cursor.execute('PRAGMA foreign_keys = ON;')
|
cursor.execute('PRAGMA foreign_keys = ON;')
|
||||||
|
|
||||||
# 1. Tabelle: players (Stammdaten)
|
# 1. Tabelle: players (Stammdaten)
|
||||||
cursor.execute('''
|
cursor.execute('''
|
||||||
CREATE TABLE IF NOT EXISTS players (
|
CREATE TABLE IF NOT EXISTS players (
|
||||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
|
|
@ -91,13 +89,17 @@ def init_db():
|
||||||
|
|
||||||
connection.commit()
|
connection.commit()
|
||||||
connection.close()
|
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.
|
# --- Start Setup der DB Daten. Damit sie nicht GANZ leer sind.
|
||||||
# --------------------
|
# --------------------
|
||||||
def seed_gamesystems():
|
def seed_gamesystems():
|
||||||
connection = sqlite3.connect("warhammer_league.db")
|
connection = sqlite3.connect(DB_PATH)
|
||||||
cursor = connection.cursor()
|
cursor = connection.cursor()
|
||||||
systems = [
|
systems = [
|
||||||
("Warhammer 40k", 0, 100),
|
("Warhammer 40k", 0, 100),
|
||||||
|
|
@ -110,10 +112,13 @@ def seed_gamesystems():
|
||||||
|
|
||||||
connection.commit()
|
connection.commit()
|
||||||
connection.close()
|
connection.close()
|
||||||
print("Spielsysteme wurden angelegt!")
|
print("Spielsysteme angelegt!")
|
||||||
|
|
||||||
|
#Nächster Schritt: Standard Achievments eintragen.
|
||||||
|
seed_achievements()
|
||||||
|
|
||||||
def seed_achievements():
|
def seed_achievements():
|
||||||
connection = sqlite3.connect("warhammer_league.db")
|
connection = sqlite3.connect(DB_PATH)
|
||||||
cursor = connection.cursor()
|
cursor = connection.cursor()
|
||||||
|
|
||||||
# Unsere Start-Stückliste an Erfolgen (Name, Beschreibung, Icon)
|
# Unsere Start-Stückliste an Erfolgen (Name, Beschreibung, Icon)
|
||||||
|
|
@ -127,80 +132,6 @@ def seed_achievements():
|
||||||
|
|
||||||
connection.commit()
|
connection.commit()
|
||||||
connection.close()
|
connection.close()
|
||||||
print("Achievements wurden in den Katalog geladen!")
|
print("Achievements angelegt.")
|
||||||
|
|
||||||
|
|
||||||
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}"
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -3,7 +3,7 @@ import os
|
||||||
import urllib.parse
|
import urllib.parse
|
||||||
import requests
|
import requests
|
||||||
from nicegui import ui, app
|
from nicegui import ui, app
|
||||||
import database
|
from data import data_api
|
||||||
|
|
||||||
def get_auth_url():
|
def get_auth_url():
|
||||||
client_id = os.getenv("DISCORD_CLIENT_ID")
|
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"
|
avatar_url = "https://cdn.discordapp.com/embed/avatars/0.png"
|
||||||
|
|
||||||
# In die Datenbank eintragen
|
# 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
|
# Session updaten
|
||||||
app.storage.user['authenticated'] = True
|
app.storage.user['authenticated'] = True
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
from nicegui import ui, app
|
from nicegui import ui, app
|
||||||
import database
|
from data import database, data_api
|
||||||
from gui import discord_login, gui_style
|
from gui import discord_login, gui_style
|
||||||
|
|
||||||
def setup_routes():
|
def setup_routes():
|
||||||
|
|
@ -45,8 +45,7 @@ def setup_routes():
|
||||||
new_name = name_input.value
|
new_name = name_input.value
|
||||||
# Nur speichern, wenn ein Name drinsteht und er anders ist als vorher
|
# Nur speichern, wenn ein Name drinsteht und er anders ist als vorher
|
||||||
if new_name and new_name != display_name:
|
if new_name and new_name != display_name:
|
||||||
import database
|
data_api.change_display_name(db_id, new_name) # Deine DB Funktion
|
||||||
database.change_display_name(db_id, new_name) # Deine DB Funktion
|
|
||||||
app.storage.user['display_name'] = new_name
|
app.storage.user['display_name'] = new_name
|
||||||
ui.notify('Name gespeichert!', color='positive')
|
ui.notify('Name gespeichert!', color='positive')
|
||||||
ui.navigate.reload()
|
ui.navigate.reload()
|
||||||
|
|
|
||||||
|
|
@ -3,10 +3,9 @@ from gui import gui_style
|
||||||
|
|
||||||
def setup_match_routes():
|
def setup_match_routes():
|
||||||
|
|
||||||
# Unsere neue Unterseite für das Eintragen der Spiele
|
# 1. Die {}-Klammern definieren eine dynamische Variable in der URL
|
||||||
@ui.page('/add-match')
|
@ui.page('/add-match/{systemname}')
|
||||||
def add_match_page():
|
def match_form_page(systemname: str): # <--- WICHTIG: Hier fangen wir das Wort aus der URL auf!
|
||||||
|
|
||||||
gui_style.apply_design()
|
gui_style.apply_design()
|
||||||
|
|
||||||
with ui.card().classes('w-full items-center mt-10'):
|
with ui.card().classes('w-full items-center mt-10'):
|
||||||
|
|
|
||||||
21
main.py
21
main.py
|
|
@ -4,28 +4,13 @@ from nicegui import ui
|
||||||
|
|
||||||
from gui import main_gui, match_gui, discord_login, league_statistic
|
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
|
# 1. Lade die geheimen Variablen aus der .env Datei in den Speicher
|
||||||
load_dotenv()
|
load_dotenv()
|
||||||
|
|
||||||
# --- DATENBANK CHECK ---
|
database.check_db()
|
||||||
# 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...")
|
|
||||||
# -----------------------
|
# -----------------------
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -33,7 +18,7 @@ else:
|
||||||
client_id = os.getenv("DISCORD_CLIENT_ID")
|
client_id = os.getenv("DISCORD_CLIENT_ID")
|
||||||
client_secret = os.getenv("DISCORD_CLIENT_SECRET")
|
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()
|
main_gui.setup_routes()
|
||||||
match_gui.setup_match_routes()
|
match_gui.setup_match_routes()
|
||||||
discord_login.setup_login_routes()
|
discord_login.setup_login_routes()
|
||||||
|
|
|
||||||
1
mmr calculations/calc_match.py
Normal file
1
mmr calculations/calc_match.py
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
from data import database
|
||||||
Loading…
Reference in New Issue
Block a user