Spielsystem Logos abgelegt.
|
|
@ -477,6 +477,26 @@ def get_leaderboard(system_name):
|
||||||
return result
|
return result
|
||||||
|
|
||||||
|
|
||||||
|
def update_match_mmr_change(match_id, p1_change, p2_change):
|
||||||
|
"""Speichert die tatsächliche MMR-Änderung für das Log fest im Match ab."""
|
||||||
|
connection = sqlite3.connect(DB_PATH)
|
||||||
|
cursor = connection.cursor()
|
||||||
|
|
||||||
|
cursor.execute("""
|
||||||
|
UPDATE matches
|
||||||
|
SET player1_mmr_change = ?, player2_mmr_change = ?
|
||||||
|
WHERE id = ?
|
||||||
|
""", (p1_change, p2_change, match_id))
|
||||||
|
|
||||||
|
connection.commit()
|
||||||
|
connection.close()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# -----------------------------------------------------
|
||||||
|
# Matches Bestätigen, Löschen, Berechnen, ...
|
||||||
|
# -----------------------------------------------------
|
||||||
|
|
||||||
def get_unconfirmed_matches(player_id):
|
def get_unconfirmed_matches(player_id):
|
||||||
"""Holt alle offenen Matches, die der Spieler noch bestätigen muss."""
|
"""Holt alle offenen Matches, die der Spieler noch bestätigen muss."""
|
||||||
connection = sqlite3.connect(DB_PATH)
|
connection = sqlite3.connect(DB_PATH)
|
||||||
|
|
@ -537,7 +557,6 @@ def set_match_counted(match_id):
|
||||||
connection.close()
|
connection.close()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def get_submitted_matches(player_id):
|
def get_submitted_matches(player_id):
|
||||||
"""Holt alle offenen Matches, die der Spieler selbst eingetragen hat, aber vom Gegner noch nicht bestätigt wurden."""
|
"""Holt alle offenen Matches, die der Spieler selbst eingetragen hat, aber vom Gegner noch nicht bestätigt wurden."""
|
||||||
connection = sqlite3.connect(DB_PATH)
|
connection = sqlite3.connect(DB_PATH)
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,9 @@
|
||||||
import sqlite3
|
import sqlite3
|
||||||
import os
|
import os
|
||||||
import json
|
import json
|
||||||
|
from main import url
|
||||||
|
|
||||||
|
|
||||||
dummy_is_in = False
|
|
||||||
|
|
||||||
# 1. Sucht den exakten, absoluten Pfad zu diesem Skript (z.B. /srv/Diceghost-Liga-System/data/)
|
# 1. Sucht den exakten, absoluten Pfad zu diesem Skript (z.B. /srv/Diceghost-Liga-System/data/)
|
||||||
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
|
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
|
||||||
|
|
@ -10,6 +11,12 @@ BASE_DIR = os.path.dirname(os.path.abspath(__file__))
|
||||||
DB_PATH = os.path.join(BASE_DIR, "league_database.db")
|
DB_PATH = os.path.join(BASE_DIR, "league_database.db")
|
||||||
|
|
||||||
def init_db():
|
def init_db():
|
||||||
|
|
||||||
|
if url == "https://liga.au-fab.eu":
|
||||||
|
dummy_is_in = False
|
||||||
|
else:
|
||||||
|
dummy_is_in = True
|
||||||
|
|
||||||
connection = sqlite3.connect(DB_PATH)
|
connection = sqlite3.connect(DB_PATH)
|
||||||
cursor = connection.cursor()
|
cursor = connection.cursor()
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -44,7 +44,7 @@ def setup_routes():
|
||||||
table_rows.append({
|
table_rows.append({
|
||||||
'rank': current_rank,
|
'rank': current_rank,
|
||||||
'trend': '➖', # Platzhalter für später
|
'trend': '➖', # Platzhalter für später
|
||||||
'name': f"{player['display_name']} aka {player['discord_name']}",
|
'name': f"{player['display_name']} 'aka' {player['discord_name']}",
|
||||||
'mmr': player['mmr']
|
'mmr': player['mmr']
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -224,28 +224,23 @@ def setup_routes(admin_discord_id):
|
||||||
# ---------------------------
|
# ---------------------------
|
||||||
# Match Historie
|
# Match Historie
|
||||||
# ---------------------------
|
# ---------------------------
|
||||||
|
|
||||||
with ui.card().classes("w-full"):
|
with ui.card().classes("w-full"):
|
||||||
ui.label(text= "Meine letzten Spiele").classes("font-bold text-white text-xl")
|
ui.label(text= "Meine letzten Spiele").classes("font-bold text-white text-xl")
|
||||||
# 1. Daten aus der DB holen
|
# 1. Daten aus der DB holen ABER per [:5] hart auf die neuesten 5 Listen-Einträge abschneiden!
|
||||||
raw_matches = data_api.get_recent_matches_for_player(player_id)
|
raw_matches = data_api.get_recent_matches_for_player(player_id)[:5]
|
||||||
|
|
||||||
# 2. Daten für die Tabelle aufbereiten
|
# 2. Daten für die Tabelle aufbereiten (Bleibt exakt gleich wie bei dir)
|
||||||
table_rows = []
|
table_rows = []
|
||||||
for match in raw_matches:
|
for match in raw_matches:
|
||||||
# Bin ich Spieler 1 oder Spieler 2?
|
|
||||||
if match['player1_id'] == player_id:
|
if match['player1_id'] == player_id:
|
||||||
# Ich bin Spieler 1, also ist Spieler 2 der Gegner
|
|
||||||
opponent_name = f"{match['p2_display']} aka {match['p2_discord']}"
|
opponent_name = f"{match['p2_display']} aka {match['p2_discord']}"
|
||||||
my_score = match['score_player1']
|
my_score = match['score_player1']
|
||||||
opp_score = match['score_player2']
|
opp_score = match['score_player2']
|
||||||
else:
|
else:
|
||||||
# Ich bin Spieler 2, also ist Spieler 1 der Gegner
|
|
||||||
opponent_name = f"{match['p1_display']} aka {match['p1_discord']}"
|
opponent_name = f"{match['p1_display']} aka {match['p1_discord']}"
|
||||||
my_score = match['score_player2']
|
my_score = match['score_player2']
|
||||||
opp_score = match['score_player1']
|
opp_score = match['score_player1']
|
||||||
|
|
||||||
# Gewonnen oder Verloren?
|
|
||||||
if my_score > opp_score:
|
if my_score > opp_score:
|
||||||
result_text = "Gewonnen"
|
result_text = "Gewonnen"
|
||||||
elif my_score < opp_score:
|
elif my_score < opp_score:
|
||||||
|
|
@ -253,10 +248,8 @@ def setup_routes(admin_discord_id):
|
||||||
else:
|
else:
|
||||||
result_text = "Unentschieden"
|
result_text = "Unentschieden"
|
||||||
|
|
||||||
# Datum hübsch machen (schneidet die Millisekunden weg)
|
|
||||||
date_clean = str(match['played_at'])[:10]
|
date_clean = str(match['played_at'])[:10]
|
||||||
|
|
||||||
# Eine fertige Zeile für unsere Tabelle bauen
|
|
||||||
table_rows.append({
|
table_rows.append({
|
||||||
'date': date_clean,
|
'date': date_clean,
|
||||||
'system': match['gamesystem_name'],
|
'system': match['gamesystem_name'],
|
||||||
|
|
@ -264,7 +257,6 @@ def setup_routes(admin_discord_id):
|
||||||
'result': f"{result_text} ({my_score} : {opp_score})"
|
'result': f"{result_text} ({my_score} : {opp_score})"
|
||||||
})
|
})
|
||||||
|
|
||||||
# 3. Das Layout (Die Spalten) der Tabelle definieren
|
|
||||||
table_columns = [
|
table_columns = [
|
||||||
{'name': 'date', 'label': 'Gespielt am', 'field': 'date', 'align': 'left'},
|
{'name': 'date', 'label': 'Gespielt am', 'field': 'date', 'align': 'left'},
|
||||||
{'name': 'system', 'label': 'System', 'field': 'system', 'align': 'left'},
|
{'name': 'system', 'label': 'System', 'field': 'system', 'align': 'left'},
|
||||||
|
|
@ -272,15 +264,12 @@ def setup_routes(admin_discord_id):
|
||||||
{'name': 'result', 'label': 'Ergebnis', 'field': 'result', 'align': 'left'}
|
{'name': 'result', 'label': 'Ergebnis', 'field': 'result', 'align': 'left'}
|
||||||
]
|
]
|
||||||
|
|
||||||
# 4. Die Tabelle zeichnen!
|
# 4. Die Tabelle zeichnen und den NEUEN BUTTON hinzufügen
|
||||||
if len(table_rows) > 0:
|
if len(table_rows) > 0:
|
||||||
ui.table(columns=table_columns, rows=table_rows, row_key='date').classes('w-full bg-zinc-900 text-white')
|
ui.table(columns=table_columns, rows=table_rows, row_key='date').classes('w-full bg-zinc-900 text-white')
|
||||||
|
|
||||||
|
# NEU: Der Button, der zur großen Log-Seite führt
|
||||||
|
ui.button("Komplette Historie & Log anzeigen", icon="history", on_click=lambda: ui.navigate.to('/matchhistory')).classes('w-full mt-4 bg-zinc-700 text-white hover:bg-zinc-600')
|
||||||
else:
|
else:
|
||||||
ui.label("Noch keine Spiele absolviert.").classes("text-gray-500 italic")
|
ui.label("Noch keine Spiele absolviert.").classes("text-gray-500 italic")
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -37,7 +37,7 @@ def setup_routes():
|
||||||
for p in raw_players:
|
for p in raw_players:
|
||||||
if p['player_id'] == my_id:
|
if p['player_id'] == my_id:
|
||||||
continue
|
continue
|
||||||
dropdown_options[p['player_id']] = f"{p['display_name']} aka {p['discord_name']}"
|
dropdown_options[p['player_id']] = f"{p['display_name']} 'aka' {p['discord_name']}"
|
||||||
|
|
||||||
# ÄNDERUNG: .classes('w-full') hinzugefügt, damit der Slider sich anpasst
|
# ÄNDERUNG: .classes('w-full') hinzugefügt, damit der Slider sich anpasst
|
||||||
p1_points = ui.slider(min=0, max=100, value=10).props("label-always").classes('w-full')
|
p1_points = ui.slider(min=0, max=100, value=10).props("label-always").classes('w-full')
|
||||||
|
|
|
||||||
BIN
gui/pictures/40k_Logo_Colour_1.png
Normal file
|
After Width: | Height: | Size: 18 KiB |
BIN
gui/pictures/KT_Logo.png
Normal file
|
After Width: | Height: | Size: 55 KiB |
BIN
gui/pictures/Middle_Earth_SBG_Logo_1.png
Normal file
|
After Width: | Height: | Size: 15 KiB |
BIN
gui/pictures/Necromunda_Logo.png
Normal file
|
After Width: | Height: | Size: 57 KiB |
BIN
gui/pictures/Universe_Horus_Heresy__Type_BW.png
Normal file
|
After Width: | Height: | Size: 5.9 KiB |
BIN
gui/pictures/WHAOS_logo_shadow_colour_1.png
Normal file
|
After Width: | Height: | Size: 21 KiB |
BIN
gui/pictures/WHAOS_logo_shadow_colour_2.png
Normal file
|
After Width: | Height: | Size: 23 KiB |
BIN
gui/pictures/Warcry_Logo.png
Normal file
|
After Width: | Height: | Size: 31 KiB |
BIN
gui/pictures/blood_bowl_1.png
Normal file
|
After Width: | Height: | Size: 15 KiB |
2
main.py
|
|
@ -3,7 +3,6 @@ from dotenv import load_dotenv
|
||||||
from nicegui import ui
|
from nicegui import ui
|
||||||
|
|
||||||
from gui import main_gui, match_gui, discord_login, league_statistic, admin_gui
|
from gui import main_gui, match_gui, discord_login, league_statistic, admin_gui
|
||||||
|
|
||||||
from data import database
|
from data import database
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -14,6 +13,7 @@ load_dotenv()
|
||||||
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")
|
||||||
admin_discord_id = os.getenv("ADMIN")
|
admin_discord_id = os.getenv("ADMIN")
|
||||||
|
url = os.getenv("APP_URL")
|
||||||
|
|
||||||
database.check_db()
|
database.check_db()
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -64,6 +64,20 @@ def calculate_match (match_id):
|
||||||
|
|
||||||
data_api.apply_match_to_player_statistic (winner_id, sys_id, mmr_change_winner, winner_score)
|
data_api.apply_match_to_player_statistic (winner_id, sys_id, mmr_change_winner, winner_score)
|
||||||
data_api.apply_match_to_player_statistic (looser_id, sys_id, mmr_change_looser, looser_score)
|
data_api.apply_match_to_player_statistic (looser_id, sys_id, mmr_change_looser, looser_score)
|
||||||
|
|
||||||
|
# Zuordnen: Welcher Change gehört zu P1 und welcher zu P2?
|
||||||
|
if winner_id == p1_id:
|
||||||
|
p1_change = mmr_change_winner
|
||||||
|
p2_change = mmr_change_looser
|
||||||
|
else:
|
||||||
|
# Wenn der Sieger nicht P1 ist, muss P1 der Verlierer sein (oder Draw, da ist es egal)
|
||||||
|
p1_change = mmr_change_looser
|
||||||
|
p2_change = mmr_change_winner
|
||||||
|
|
||||||
|
# Die Änderungen für das Log ins Match eintragen!
|
||||||
|
data_api.update_match_mmr_change(match_id, p1_change, p2_change)
|
||||||
|
|
||||||
|
# Das Match als Berechnet markieren
|
||||||
data_api.set_match_counted(match_id)
|
data_api.set_match_counted(match_id)
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||