feat: Charakter-Modal in Mitgliederliste (Phase 1) #12

Merged
DasAoD merged 12 commits from feature/character-modal into main 2026-07-31 23:39:33 +02:00
Owner

Zusammenfassung

Klick auf einen Mitgliedsnamen in der Gilden-Mitgliederliste öffnet ein Modal mit Charakterdaten (Attribute + Ausrüstung + Tränke) aus S&F. Phase 1: reine Textansicht, keine Icons/Portrait (folgt ggf. später).

Wichtig: Die Daten werden nicht live beim Klick abgerufen, sondern von einem neuen, unabhängig planbaren Cronjob (character_sync) periodisch in die DB geschrieben. Das Modal liest nur aus der DB. Damit werden laufende Spielsitzungen nicht durch parallele Logins gestört.

Neue Komponenten

  • rust_examples/character_sync.rs — neues sf-api-Binary: loggt sich einmal ein, ruft pro Gildenmitglied ViewPlayer ab (gleiche Session), gibt Rohdaten als JSON aus. Bereits auf dns1 gebaut, deployt (/opt/sf-api/character_sync) und gegen alle 5 Gilden getestet (~40s Gesamtlaufzeit, weit unter dem 2-Minuten-Session-Timeout).
  • cli/cron_character_sync.php — neuer Cronjob, verarbeitet die Rohdaten (Attribut-Formel: basis + additions, laut Screenshot-Abgleich verifiziert) und schreibt sie in members.char_data_json / members.char_fetched_at.
  • api/player_character.php — liest die gespeicherten Charakterdaten für das Modal (reiner DB-Read).
  • includes/sf_helpers.php — neue Helper-Funktion findSfAccountForGuild(), extrahiert aus der bisher inline in sf_member_sync.php liegenden Logik; unterstützt sowohl den Cron-Kontext (alle Admin-Accounts) als auch den User-Kontext (manueller Sync-Button).
  • Modal-Markup/Styles/JS in public/guild.php, public/assets/css/guild.css, public/assets/js/guild.js.

Konfiguration

  • Der neue Cronjob ist eigenständig (nicht in member_sync integriert) und standardmäßig deaktiviert mit leerem Zeitplan — die Häufigkeit ist bewusst nicht vorgegeben, sondern frei über die bestehende Admin-Cronjobs-UI konfigurierbar.
  • DB-Migration bereits auf Produktion angewendet: members.char_data_json, members.char_fetched_at (Spalten), neuer cron_jobs-Eintrag character_sync (disabled, times: []).

Test plan

  • character_sync Rust-Binary gegen alle 5 Gilden getestet (reale Produktionsdaten)
  • Attribut-Formel gegen zwei reale Screenshots verifiziert (Stärke, Ausdauer)
  • php -l für alle geänderten/neuen PHP-Dateien
  • node --check für guild.js
  • Cronjob in der Admin-UI aktivieren und einmal laufen lassen, dann Modal im Browser gegen echte Daten prüfen
  • Review der Attribut-/Ausrüstungs-Darstellung im Modal

Nicht enthalten (bewusst verschoben)

  • Phase 2: Item-Icons im Modal
  • Phase 3: Charakter-Portrait-Rendering
  • Automatisiertes Skript zur monatlichen Neuextraktion der S&F-Grafik-Assets
## Zusammenfassung Klick auf einen Mitgliedsnamen in der Gilden-Mitgliederliste öffnet ein Modal mit Charakterdaten (Attribute + Ausrüstung + Tränke) aus S&F. Phase 1: reine Textansicht, keine Icons/Portrait (folgt ggf. später). **Wichtig:** Die Daten werden **nicht live beim Klick** abgerufen, sondern von einem neuen, unabhängig planbaren Cronjob (`character_sync`) periodisch in die DB geschrieben. Das Modal liest nur aus der DB. Damit werden laufende Spielsitzungen nicht durch parallele Logins gestört. ## Neue Komponenten - **`rust_examples/character_sync.rs`** — neues sf-api-Binary: loggt sich einmal ein, ruft pro Gildenmitglied `ViewPlayer` ab (gleiche Session), gibt Rohdaten als JSON aus. Bereits auf dns1 gebaut, deployt (`/opt/sf-api/character_sync`) und gegen alle 5 Gilden getestet (~40s Gesamtlaufzeit, weit unter dem 2-Minuten-Session-Timeout). - **`cli/cron_character_sync.php`** — neuer Cronjob, verarbeitet die Rohdaten (Attribut-Formel: `basis + additions`, laut Screenshot-Abgleich verifiziert) und schreibt sie in `members.char_data_json` / `members.char_fetched_at`. - **`api/player_character.php`** — liest die gespeicherten Charakterdaten für das Modal (reiner DB-Read). - **`includes/sf_helpers.php`** — neue Helper-Funktion `findSfAccountForGuild()`, extrahiert aus der bisher inline in `sf_member_sync.php` liegenden Logik; unterstützt sowohl den Cron-Kontext (alle Admin-Accounts) als auch den User-Kontext (manueller Sync-Button). - Modal-Markup/Styles/JS in `public/guild.php`, `public/assets/css/guild.css`, `public/assets/js/guild.js`. ## Konfiguration - Der neue Cronjob ist **eigenständig** (nicht in `member_sync` integriert) und **standardmäßig deaktiviert mit leerem Zeitplan** — die Häufigkeit ist bewusst nicht vorgegeben, sondern frei über die bestehende Admin-Cronjobs-UI konfigurierbar. - DB-Migration bereits auf Produktion angewendet: `members.char_data_json`, `members.char_fetched_at` (Spalten), neuer `cron_jobs`-Eintrag `character_sync` (disabled, `times: []`). ## Test plan - [x] `character_sync` Rust-Binary gegen alle 5 Gilden getestet (reale Produktionsdaten) - [x] Attribut-Formel gegen zwei reale Screenshots verifiziert (Stärke, Ausdauer) - [x] `php -l` für alle geänderten/neuen PHP-Dateien - [x] `node --check` für `guild.js` - [ ] Cronjob in der Admin-UI aktivieren und einmal laufen lassen, dann Modal im Browser gegen echte Daten prüfen - [ ] Review der Attribut-/Ausrüstungs-Darstellung im Modal ## Nicht enthalten (bewusst verschoben) - Phase 2: Item-Icons im Modal - Phase 3: Charakter-Portrait-Rendering - Automatisiertes Skript zur monatlichen Neuextraktion der S&F-Grafik-Assets
Ersetzt die inline Gilde-zu-Account-Matching-Logik durch den neuen
gemeinsamen Helper aus sf_helpers.php. Verhalten unverändert.
Liest members.char_data_json fürs Charakter-Modal. Reiner
DB-Read, kein Live-Aufruf ans Spiel — Daten kommen vom
character_sync-Cronjob.
Loggt einmal ein und ruft pro Gildenmitglied per ViewPlayer
Attribute + Ausrüstung ab (gleiche Session, kein Login pro Mitglied).
Gemeinsame Gilde-zu-Account-Matching-Logik für Cron- und
User-Kontext, extrahiert aus sf_member_sync.php.
Ruft pro Gilde character_sync auf, schreibt Attribute + Ausrüstung
als JSON in members.char_data_json. Eigener, frei planbarer Job.
Author
Owner

Nachtrag: Bug gefunden und gefixt — der Charakter, mit dem character_sync sich einloggt, landete bisher immer in skipped statt in den Ergebnissen. Betraf alle 5 Gilden-Login-Charaktere (Beedle the Bard, Gweneth, Haui Kaputti, Medea, Xyra Fieberkuss), da gs.lookup (befüllt über ViewPlayer) den eigenen Charakter nie enthält.

Fix in rust_examples/character_sync.rs: Die eigenen Daten werden jetzt direkt aus GameState.character entnommen statt über lookup versucht zu werden. Character (eigener Charakter) und OtherPlayer (andere Spieler) teilen sich exakt dieselben relevanten Feldnamen (level, class, race, honor, rank, armor, min_damage, max_damage, attribute_basis, attribute_additions, equipment, active_potions) und denselben Equipment-Typ — daher keine Änderung auf PHP-Seite nötig. Auf dns1 neu gebaut, deployt und der Fehlerfall (fehlende Env-Vars) erneut verifiziert.

**Nachtrag:** Bug gefunden und gefixt — der Charakter, mit dem `character_sync` sich einloggt, landete bisher immer in `skipped` statt in den Ergebnissen. Betraf alle 5 Gilden-Login-Charaktere (Beedle the Bard, Gweneth, Haui Kaputti, Medea, Xyra Fieberkuss), da `gs.lookup` (befüllt über `ViewPlayer`) den eigenen Charakter nie enthält. Fix in `rust_examples/character_sync.rs`: Die eigenen Daten werden jetzt direkt aus `GameState.character` entnommen statt über `lookup` versucht zu werden. `Character` (eigener Charakter) und `OtherPlayer` (andere Spieler) teilen sich exakt dieselben relevanten Feldnamen (`level`, `class`, `race`, `honor`, `rank`, `armor`, `min_damage`, `max_damage`, `attribute_basis`, `attribute_additions`, `equipment`, `active_potions`) und denselben `Equipment`-Typ — daher keine Änderung auf PHP-Seite nötig. Auf dns1 neu gebaut, deployt und der Fehlerfall (fehlende Env-Vars) erneut verifiziert.
DasAoD merged commit 7e4b9e1f8f into main 2026-07-31 23:39:33 +02:00
Sign in to join this conversation.
No description provided.