127 lines
6.6 KiB
Python
127 lines
6.6 KiB
Python
from nicegui import ui, app
|
||
from gui import gui_style
|
||
from data import data_api
|
||
from gui.info_text import info_system
|
||
|
||
def setup_routes():
|
||
@ui.page('/statistic/{systemname}', dark=True)
|
||
def gamesystem_statistic_page(systemname: str):
|
||
|
||
if not app.storage.user.get('authenticated', False):
|
||
ui.navigate.to('/')
|
||
return
|
||
|
||
gui_style.apply_design()
|
||
|
||
player_id = app.storage.user.get('db_id')
|
||
all_stats = data_api.get_player_statistics(player_id)
|
||
|
||
# Passendes System anhand des Namens (case-insensitive) herausfiltern
|
||
system_stat = next(
|
||
(s for s in all_stats if s["gamesystem_name"].lower() == systemname.lower()),
|
||
None
|
||
)
|
||
|
||
if system_stat:
|
||
# None-Werte absichern
|
||
mmr = system_stat["mmr"] or 0
|
||
games = system_stat["games_in_system"] or 0
|
||
points = system_stat["points"] or 0
|
||
avv_points = system_stat.get("avv_points") or "-"
|
||
last_played_raw = system_stat.get("last_played")
|
||
last_played = str(last_played_raw)[:10] if last_played_raw else "-"
|
||
|
||
with ui.header().classes('items-center justify-between bg-zinc-900 p-4 shadow-lg'):
|
||
ui.button(icon="arrow_back", on_click=lambda: ui.navigate.to('/')).props("round")
|
||
ui.button("Spiel eintragen", on_click=lambda: ui.navigate.to(f'/add-match/{systemname}'))
|
||
|
||
with ui.column().classes('w-full items-center justify-center mt-10'):
|
||
ui.label(f'Deine Statistik in {systemname}').classes('text-3xl justify-center font-bold text-normaltext')
|
||
|
||
# --- BLOCK 1 (MMR & Rang | Rangliste) ---
|
||
leaderboard_data = data_api.get_leaderboard(systemname)
|
||
table_rows = []
|
||
my_rank = "-"
|
||
|
||
for index, player in enumerate(leaderboard_data):
|
||
current_rank = index + 1
|
||
if player['id'] == player_id:
|
||
my_rank = current_rank
|
||
table_rows.append({
|
||
'rank': current_rank,
|
||
'trend': '➖',
|
||
'name': f"{player['display_name']} 'aka' {player['discord_name']}",
|
||
'mmr': player['mmr']
|
||
})
|
||
|
||
table_columns = [
|
||
{'name': 'rank', 'label': '#', 'field': 'rank', 'align': 'left'},
|
||
{'name': 'trend', 'label': 'Trend', 'field': 'trend', 'align': 'center'},
|
||
{'name': 'name', 'label': 'Spieler', 'field': 'name', 'align': 'left'},
|
||
{'name': 'mmr', 'label': 'MMR', 'field': 'mmr', 'align': 'left'},
|
||
]
|
||
|
||
with ui.element('div').classes("w-full grid grid-cols-1 lg:grid-cols-3 gap-4 mt-4"):
|
||
with ui.column().classes("w-full gap-4"):
|
||
with ui.card().classes("w-full items-center justify-center text-center"):
|
||
with ui.row().classes("w-full items-center text-center"):
|
||
ui.label("MMR Punkte: ").classes('justify-center text-2xl font-bold text-normaltext')
|
||
ui.space()
|
||
info_system.create_info_button("mmr_info")
|
||
ui.label(str(mmr)).classes('text-4xl font-bold text-accent')
|
||
|
||
with ui.card().classes("w-full items-center justify-center text-center"):
|
||
with ui.row().classes("w-full items-center text-center"):
|
||
ui.label("Rang: ").classes('justify-center text-2xl font-bold text-normaltext')
|
||
ui.space()
|
||
info_system.create_info_button("rang_info")
|
||
ui.label(str(my_rank)).classes('text-4xl font-bold text-blue-100')
|
||
|
||
with ui.card().classes("w-full lg:col-span-2"):
|
||
ui.label("Liga Rangliste").classes("text-xl font-bold text-white mb-2")
|
||
ui.table(columns=table_columns, rows=table_rows, row_key='rank').classes('w-full bg-zinc-900 text-white')
|
||
|
||
# --- BLOCK 2 (5 Karten) ---
|
||
with ui.card().classes("w-full"):
|
||
with ui.element('div').classes("w-full grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4"):
|
||
|
||
with ui.card().classes("items-center justify-center text-center"):
|
||
ui.label("Spiele: ").classes('text-2xl font-bold')
|
||
ui.label(str(games)).classes('text-4xl font-bold text-blue-100')
|
||
|
||
with ui.card().classes("items-center justify-center text-center"):
|
||
ui.label("Ø Punkte pro Spiel: ").classes('text-2xl font-bold')
|
||
ui.label(str(avv_points)).classes('text-4xl font-bold text-blue-100')
|
||
|
||
with ui.card().classes("items-center justify-center text-center"):
|
||
ui.label("Win-Rate: ").classes('text-2xl font-bold')
|
||
ui.label("-").classes('text-4xl font-bold text-blue-100')
|
||
|
||
with ui.card().classes("items-center justify-center text-center"):
|
||
ui.label("Letztes Spiel am: ").classes('text-2xl font-bold')
|
||
ui.label(last_played).classes('text-4xl font-bold text-blue-100')
|
||
|
||
with ui.card().classes("items-center justify-center text-center"):
|
||
ui.label("Win-Streak: ").classes('text-2xl font-bold')
|
||
ui.label("-").classes('text-4xl font-bold text-blue-100')
|
||
|
||
# --- BLOCK 3 (3 Karten) ---
|
||
with ui.card().classes("w-full"):
|
||
with ui.element('div').classes("w-full grid grid-cols-1 md:grid-cols-3 lg:grid-cols-3 gap-4"):
|
||
|
||
with ui.card().classes("items-center justify-center text-center"):
|
||
ui.label("Dein Nemesis: ").classes('text-2xl font-bold')
|
||
ui.label("-").classes('text-4xl font-bold text-blue-100')
|
||
|
||
with ui.card().classes("items-center justify-center text-center"):
|
||
ui.label("Meisten Spiele mit: ").classes('text-2xl font-bold')
|
||
ui.label("-").classes('text-4xl font-bold text-blue-100')
|
||
|
||
with ui.card().classes("items-center justify-center text-center"):
|
||
ui.label("Dein 'Prügelknabe': ").classes('text-2xl font-bold')
|
||
ui.label("-").classes('text-4xl font-bold text-blue-100')
|
||
|
||
else:
|
||
with ui.column().classes('w-full items-center justify-center mt-10'):
|
||
ui.label(f'Keine Statistik für "{systemname}" gefunden.').classes('text-red-500 text-xl mt-4')
|