Neue Funktion: Gilden-Angriffszeit-Check #28

Merged
DasAoD merged 1 commit from feature-guild-attack-time into main 2026-08-11 22:40:16 +02:00
Owner

Was

Neue Seite „Angriffszeit" (Hauptnavigation, für alle eingeloggten Nutzer sichtbar), die live beim Spiel abfragt, wann eine beliebige Gilde angegriffen wird — server-, account- und gildenübergreifend, nicht nur für die von sfguildsv2 verwalteten Gilden.

Basiert auf guild_battle_time.rs, das schon fertig als Konsolen-Tool unter /root/sf-api/examples/guild_battle_time.rs auf dns1 lag. Eingebaut statt separat gehalten, weil sfguildsv2 alles Nötige schon mitbringt: verschlüsselte SSO-Zugangsdaten pro Nutzer (sf_accounts) und das etablierte Muster PHP→Rust-Binary (proc_open + Env-Vars), das cron_character_sync.php/sf_member_sync.php schon nutzen. Separates Halten hätte bedeutet, Zugangsdaten ein zweites Mal irgendwo abzulegen — ohne Vorteil.

Änderungen

  • rust_examples/guild_battle_time.rs: Konsolen-println!-Ausgabe durch JSON auf stdout ersetzt (analog character_sync.rs) — bei jedem Fehler trotzdem ein {success:false, error:...}-Objekt statt nacktem Exit-Code, damit PHP immer sauber parsen kann. Gibt bewusst nur das eine Zeitstempel/Namen-Paar aus, das im ursprünglichen Skript tatsächlich angezeigt und getestet wurde ("wird angegriffen von"/Index 367) — ein zweites Paar wurde zwar geparst, aber nie angezeigt, dessen Bedeutung ist ungeklärt und wurde daher nicht geraten/mit ausgegeben.
    • Deployed: auf dns1 gebaut (cargo build --release --example guild_battle_time), nach /opt/sf-api/guild_battle_time kopiert, chown root:www-data + chmod 750 (wie die anderen PHP-aufgerufenen Binaries). End-to-end gegen den echten Spiele-Server getestet, bevor überhaupt PHP-Code geschrieben wurde.
  • includes/sf_helpers.php: zwei neue Helper neben findSfAccountForGuild():
    • findAnySfAccountForServer() — findet irgendeinen nutzbaren Account+Charakter auf einem Server, unabhängig von der Gilde (bevorzugt eigene Accounts, sonst Fallback auf alle — gleiches Vertrauensmodell wie der bestehende $userId=null-Cron-Pfad).
    • listKnownServers() — Liste aller Server mit mindestens einem nutzbaren Charakter, fürs Dropdown.
    • Beide gegen die echten Live-Daten getestet (inkl. Fallback-Pfad) vor dem Commit.
  • api/guild_attack_time.php: POST-Endpunkt, für jeden eingeloggten Nutzer (checkAuthAPI(), nicht die Moderator/Admin-Schranke anderer sf-api-Endpunkte). 10s Cooldown pro Session, da jeder Aufruf ein echter Login+Request gegen den Spiele-Server ist.
  • public/guild_attack_check.php: neue Seite, Server-Dropdown + Gildenname-Feld, Ergebnis darunter. Folgt bestehenden Konventionen (checkAuth(), Card/Form-Group-Markup, fetchJSON/showAlert/showOverlay).
  • Nav-Link „Angriffszeit" in includes/template.php ergänzt.
  • rust_examples/README.md Deployment-Anleitung um guild_battle_time ergänzt (für künftige Rebuilds nach S&F-Updates).

Getestet

  • Binary direkt mit echten (entschlüsselten) Zugangsdaten aus der DB gegen den Live-Spiele-Server: liefert korrektes JSON mit plausiblem Zeitstempel.
  • Beide neuen PHP-Helper gegen die echte sfguilds.sqlite (inkl. Server-Liste, Fallback bei fremdem/nicht-existentem User).
  • php -l auf allen geänderten/neuen PHP-Dateien.

Bitte nach dem Deploy (git pull auf dns1 — die Binary selbst liegt schon unter /opt/sf-api/guild_battle_time, kein extra Build-Schritt nötig) im echten Frontend gegenchecken.

🤖 Generated with Claude Code

## Was Neue Seite **„Angriffszeit"** (Hauptnavigation, für alle eingeloggten Nutzer sichtbar), die live beim Spiel abfragt, wann eine beliebige Gilde angegriffen wird — server-, account- und gildenübergreifend, nicht nur für die von sfguildsv2 verwalteten Gilden. Basiert auf `guild_battle_time.rs`, das schon fertig als Konsolen-Tool unter `/root/sf-api/examples/guild_battle_time.rs` auf dns1 lag. Eingebaut statt separat gehalten, weil sfguildsv2 alles Nötige schon mitbringt: verschlüsselte SSO-Zugangsdaten pro Nutzer (`sf_accounts`) und das etablierte Muster PHP→Rust-Binary (`proc_open` + Env-Vars), das `cron_character_sync.php`/`sf_member_sync.php` schon nutzen. Separates Halten hätte bedeutet, Zugangsdaten ein zweites Mal irgendwo abzulegen — ohne Vorteil. ## Änderungen - **`rust_examples/guild_battle_time.rs`**: Konsolen-`println!`-Ausgabe durch JSON auf stdout ersetzt (analog `character_sync.rs`) — bei jedem Fehler trotzdem ein `{success:false, error:...}`-Objekt statt nacktem Exit-Code, damit PHP immer sauber parsen kann. Gibt bewusst nur das eine Zeitstempel/Namen-Paar aus, das im ursprünglichen Skript tatsächlich angezeigt und getestet wurde ("wird angegriffen von"/Index 367) — ein zweites Paar wurde zwar geparst, aber nie angezeigt, dessen Bedeutung ist ungeklärt und wurde daher nicht geraten/mit ausgegeben. - **Deployed:** auf dns1 gebaut (`cargo build --release --example guild_battle_time`), nach `/opt/sf-api/guild_battle_time` kopiert, `chown root:www-data` + `chmod 750` (wie die anderen PHP-aufgerufenen Binaries). End-to-end gegen den echten Spiele-Server getestet, bevor überhaupt PHP-Code geschrieben wurde. - **`includes/sf_helpers.php`**: zwei neue Helper neben `findSfAccountForGuild()`: - `findAnySfAccountForServer()` — findet irgendeinen nutzbaren Account+Charakter auf einem Server, unabhängig von der Gilde (bevorzugt eigene Accounts, sonst Fallback auf alle — gleiches Vertrauensmodell wie der bestehende `$userId=null`-Cron-Pfad). - `listKnownServers()` — Liste aller Server mit mindestens einem nutzbaren Charakter, fürs Dropdown. - Beide gegen die echten Live-Daten getestet (inkl. Fallback-Pfad) vor dem Commit. - **`api/guild_attack_time.php`**: POST-Endpunkt, für jeden eingeloggten Nutzer (`checkAuthAPI()`, nicht die Moderator/Admin-Schranke anderer sf-api-Endpunkte). 10s Cooldown pro Session, da jeder Aufruf ein echter Login+Request gegen den Spiele-Server ist. - **`public/guild_attack_check.php`**: neue Seite, Server-Dropdown + Gildenname-Feld, Ergebnis darunter. Folgt bestehenden Konventionen (`checkAuth()`, Card/Form-Group-Markup, `fetchJSON`/`showAlert`/`showOverlay`). - Nav-Link „Angriffszeit" in `includes/template.php` ergänzt. - `rust_examples/README.md` Deployment-Anleitung um `guild_battle_time` ergänzt (für künftige Rebuilds nach S&F-Updates). ## Getestet - Binary direkt mit echten (entschlüsselten) Zugangsdaten aus der DB gegen den Live-Spiele-Server: liefert korrektes JSON mit plausiblem Zeitstempel. - Beide neuen PHP-Helper gegen die echte `sfguilds.sqlite` (inkl. Server-Liste, Fallback bei fremdem/nicht-existentem User). - `php -l` auf allen geänderten/neuen PHP-Dateien. Bitte nach dem Deploy (`git pull` auf dns1 — die Binary selbst liegt schon unter `/opt/sf-api/guild_battle_time`, kein extra Build-Schritt nötig) im echten Frontend gegenchecken. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
New page (Angriffszeit-Check, in the main nav for all logged-in users)
that queries the game live for when a given guild is scheduled to be
attacked - across any server/guild, not just the ones sfguildsv2
manages. Based on a working guild_battle_time.rs the user had already
built and tested standalone (console-only, source at
/root/sf-api/examples/guild_battle_time.rs on dns1) - integrated here
rather than kept separate since sfguildsv2 already has everything this
needs: encrypted per-user SSO credential storage (sf_accounts) and the
established PHP-invokes-Rust-binary pattern (proc_open + env vars) used
by cron_character_sync.php/sf_member_sync.php.

- rust_examples/guild_battle_time.rs: rewrote the original script's
  println!-based console output as JSON on stdout (success/error
  fields, never a bare non-zero exit), matching character_sync.rs's
  idiom so PHP can always cleanly json_decode() the result. Only
  exposes the one timestamp/name pair the original script actually
  displayed and verified (index 367 / "othergroupdefense" -> "wird
  angegriffen") - a second pair existed in the raw response but was
  parsed and never shown by the working version, so its meaning was
  never actually confirmed; left out rather than guessed at.
  Deployed: built on dns1 (cargo build --release --example
  guild_battle_time), copied to /opt/sf-api/guild_battle_time,
  chown root:www-data + chmod 750 to match the other PHP-invoked
  binaries. Smoke-tested end to end against the live game server
  through the real DB-stored credentials before writing any PHP.

- includes/sf_helpers.php: two new helpers alongside the existing
  findSfAccountForGuild(). findAnySfAccountForServer() finds any
  usable sf_account+character on a given server hostname regardless
  of guild (prefers the requesting user's own accounts, falls back to
  any other user's - same trust model findSfAccountForGuild() already
  uses for its userId=null cron path, since every sf_account belongs
  to a member of this same private installation). listKnownServers()
  returns the distinct server hostnames with at least one usable
  character, for the page's server dropdown. Verified both against
  the live sfguilds.sqlite data (including the fallback path) before
  committing.

- api/guild_attack_time.php: POST endpoint, any logged-in user
  (checkAuthAPI(), not the moderator/admin gate other sf-api endpoints
  use, per the intended audience). Takes server + target_guild, looks
  up a session via findAnySfAccountForServer(), runs the binary the
  same way sf_member_sync.php does, and passes its JSON straight
  through. Simple 10s per-session cooldown since every call is a live
  login+request against the actual game server - not something to
  let a user fire off repeatedly by accident.

- public/guild_attack_check.php: new page, linked from the main nav
  as "Angriffszeit". Server dropdown + guild name field, live result
  underneath. Matches existing conventions (checkAuth(), card/form-group
  markup, fetchJSON/showAlert/showOverlay from main.js/overlay.js).

🤖 Generated with [Claude Code](https://claude.com/claude-code)
DasAoD merged commit eefd8c5025 into main 2026-08-11 22:40:16 +02:00
Sign in to join this conversation.
No description provided.