Ein privates Guild-Management-System für das Browsergame Shakes & Fidget, das mehrere Gilden auf verschiedenen Servern verwaltet.
  • PHP 63.6%
  • JavaScript 16.4%
  • CSS 9.7%
  • Rust 6.7%
  • HTML 2.9%
  • Other 0.7%
Find a file
DasAoD 00b9602eac WEBHOOK-DEPLOY.md: correct live hostname to sfguilds.de
- the active vhost serves server_name/cert sfguilds.de (the install/nginx/ filename is historical)
- fix the smoke-test curls and the Forgejo webhook target URL

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-06 13:44:07 +02:00
.claude/agents agents/security-checker: add sfguildsv2-specific security review agent 2026-08-13 23:55:39 +02:00
.github/workflows fix: FORGEMO_OUTPUT typo -> FORGEJO_OUTPUT in docker tag-bump step 2026-07-28 20:48:10 +02:00
api auth.php, template.php, session_status.php, session_extend.php, session-timeout.js: inactivity logout with countdown + warning 2026-09-06 11:13:59 +02:00
cli cli/coa_render_test.php: standalone guild-crest render test tool 2026-09-05 12:45:40 +02:00
config fix: 3 findings from fifth ChatGPT audit 2026-02-23 21:43:51 +01:00
data guild_crest.php, member_sync.rs, members.php, battle_stats.php: auto-render guild crest from synced /coa code 2026-09-04 23:01:33 +02:00
docs chore: drop unneeded executable bit on doc/asset files 2026-07-28 21:50:26 +02:00
includes session-timeout.js: only reset the idle timer on genuine interactions 2026-09-06 12:58:00 +02:00
install WEBHOOK-DEPLOY.md: correct live hostname to sfguilds.de 2026-09-06 13:44:07 +02:00
public session-timeout.js: only reset the idle timer on genuine interactions 2026-09-06 12:58:00 +02:00
rust_examples guild_crest.php, member_sync.rs, members.php, battle_stats.php: auto-render guild crest from synced /coa code 2026-09-04 23:01:33 +02:00
storage Fix for stream_select. 2026-02-25 21:57:14 +01:00
.gitignore guild_crest.php, member_sync.rs, members.php, battle_stats.php: auto-render guild crest from synced /coa code 2026-09-04 23:01:33 +02:00
CLAUDE.md CLAUDE.md: add Claude Code project context and conventions 2026-08-13 22:48:53 +02:00
README.md docs: add GitHub mirror notice to README 2026-06-20 12:55:16 +02:00
ROADMAP_PUBLIC.md docs: sync ROADMAP_PUBLIC.md with actual repo state (Posteingang, API-Doku, UI) 2026-07-28 20:52:47 +02:00
TODO_PUBLIC.md docs: sync TODO_PUBLIC.md with actual repo state (Juli 2026) 2026-07-28 20:54:48 +02:00

S&F Guilds v2

📌 Mirror-Hinweis: Dieses Repository ist ein automatischer Spiegel. Die primäre Entwicklung findet auf git.uliana.de/DasAoD/sfguildsv2 statt. Issues und Pull Requests bitte dort öffnen.

Ein privates Guild-Management-System für das Browsergame Shakes & Fidget, das mehrere Gilden auf verschiedenen Servern verwaltet.

Features

  • 🏰 Multi-Gilden-Verwaltung – Verwaltung mehrerer Gilden auf verschiedenen S&F-Servern
  • 👥 Mitglieder-Tracking – Statistiken, Beitrittsdaten, Gold-Donationen, Tags und Notizen; intelligente Sortierung (aktive nach Rang/Level, lang-Offline als Block nach Offline-Tagen)
  • ⚔️ Kampfberichte – Import und Auswertung von Gildenkampf-Berichten inkl. Ergebnis (Gewonnen/Verloren)
  • 📊 Statistiken & Analysen – Mitglieder-Entwicklung, Kampf-Performance
  • 📅 Battle-Kalender – Übersicht über vergangene Gildenkämpfe
  • 🔱 Hellevator-Übersicht – Etagen-Anforderungen und Spieler-Empfehlungen
  • 📄 sf-api Member-Sync – Mitgliederdaten direkt via sf-api abrufen (CSV als Fallback)
  • ⏱️ Cron-System – Automatischer Fetch von Kampfberichten und Mitglieder-Sync
  • 📋 Import-Log – Letzter Import pro Gilde und Import-Aktivitäten im Admin-Bereich
  • 🛡️ Wappen-Upload – Gilden-Wappen hochladen und verwalten
  • 👤 Benutzerverwaltung – Login, Sessions, Passwort-Reset (inkl. CLI-Admin-Tool)

Technischer Stack

Komponente Version
PHP 8.4
Datenbank SQLite3
Webserver nginx
OS Ubuntu (Heimserver dns1)
CLI-Tools Rust (sf-api Integration)
Prozess-Management cron

Verzeichnisstruktur

/var/www/sfguildsv2/
├── api/                    # REST-API-Endpunkte
├── cli/                    # Kommandozeilen-Tools (PHP & Rust)
│   ├── cron_runner.php     # Cron Master-Runner
│   ├── cron_fetch_reports.php
│   └── cron_member_sync.php
├── config/
│   └── database.php        # Datenbank-Konfiguration
├── data/
│   ├── sfguilds.sqlite     # SQLite-Datenbank
│   └── uploads/            # Gilden-Wappen
├── includes/               # Shared PHP-Funktionen
├── install/                # Installations-Skripte & Schema
├── public/                 # Document Root (nginx)
│   ├── assets/
│   │   ├── css/            # Stylesheets (Dark Theme)
│   │   └── js/             # Vanilla JavaScript
│   └── ...
├── rust_examples/          # Rust-Quellcode für sf-api Binaries
│   ├── fetch_guild_reports.rs
│   ├── list_chars.rs
│   ├── member_sync.rs
│   ├── guild_battle_info.rs
│   └── README.md           # Build- und Deploy-Anleitung
└── storage/
    ├── import/             # CSV-Import-Ordner (Fallback)
    └── sf_reports/         # Temporäre Kampfbericht-Dateien

Installation

Voraussetzungen

  • PHP >= 8.4 mit SQLite3-Extension
  • nginx
  • Rust (für CLI-Tools – Binaries aus rust_examples/ bauen)

1. Dateien deployen

# Dateien nach /var/www/sfguildsv2/ kopieren

2. Berechtigungen setzen

chmod 755 /var/www/sfguildsv2
chown -R www-data:www-data /var/www/sfguildsv2
chmod 775 /var/www/sfguildsv2/data
chmod 775 /var/www/sfguildsv2/data/uploads

3. Nginx Virtual Host

server {
    listen 443 ssl;
    server_name sfguilds.example.com;

    root /var/www/sfguildsv2/public;
    index index.php;

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php8.4-fpm.sock;
    }

    location ~ /\. { deny all; }
    location ~ \.(db|sqlite|log|ini)$ { deny all; }
    location / { try_files $uri $uri/ $uri.php?$query_string; }
}

4. Datenbank initialisieren

php /var/www/sfguildsv2/install/setup.php

5. Ersten Admin-User anlegen

php /var/www/sfguildsv2/cli/reset_password.php

6. Cron einrichten

# Shell-Wrapper kopieren und Crontab-Eintrag setzen (als root)
cp install/sfguilds_cron.sh /usr/local/bin/sfguilds_cron.sh
chmod +x /usr/local/bin/sfguilds_cron.sh
# Crontab:
# * * * * * /usr/local/bin/sfguilds_cron.sh >> /var/log/sfguilds_cron.log 2>&1

Cron-Zeiten und aktivierte Jobs werden im Admin-Bereich (Tab: Cronjobs) konfiguriert.

7. Rust-Binaries bauen

Siehe rust_examples/README.md für Build- und Deploy-Anleitung.

Daten-Import

sf-api Member-Sync (primär)

Mitgliederdaten direkt via sf-api von The Marenga – manuell per Button auf der Gildenseite oder automatisch via Cron. Für den sf-api-Login werden ausschließlich Admin-Accounts verwendet (Compliance mit S&F-Spielregeln).

CSV-Import (Fallback)

SFTools CSV-Export → manueller Upload oder automatisierter Import via storage/import/. Bleibt als Fallback erhalten für den Fall, dass sf-api nach einem S&F-Spielupdate vorübergehend nicht funktioniert.

Kampfberichte

Automatisch via sf-api aus dem S&F-Postkasten (Cron: 07:25 + 19:10 Uhr). Der Cron verwendet ausschließlich Admin-Accounts. Der Import der abgeholten Berichte in den Kalender ist für Benutzer ab Moderator-Rolle möglich – beschränkt auf Gildenleiter und Offiziere, die im Spiel Zugang zu Kampfberichten haben. Erkanntes Kampfergebnis (Gewonnen/Verloren) wird automatisch aus dem Combat Log ermittelt und gespeichert.

guild_battle_info (CLI)

Zeigt geplante Gildenangriffe und Verteidigungen mit exaktem Zeitpunkt (sekundengenau) an. Nur für den manuellen Gebrauch per Kommandozeile. Binary: /opt/sf-api/guild_battle_info.

Sicherheit

  • Zentralisierte Fehlerbehandlung (jsonResponse() / jsonError())
  • JSON_THROW_ON_ERROR für alle User-Inputs
  • catch (Throwable) in kritischen Pfaden
  • Whitelist-basierte API-Antworten
  • Atomares flock()-Locking für konkurrierende Prozesse
  • CLI-Only-Guards für interne Skripte
  • Cron und sf-api-Sync verwenden ausschließlich Admin-Accounts (role='admin')

Notizen

  • Dieses System ist für den privaten Gebrauch konzipiert
  • guild_joined wird seit S&F v29.500 nicht mehr vom Server geliefert – "first seen"-Ansatz implementiert
  • Die öffentliche API gibt nur nicht-sensitive Felder zurück
  • last_online wird als ISO 8601 Timestamp gespeichert – Offline-Tage werden datums-basiert berechnet (ohne Uhrzeit)
  • Mitglieder-Sortierung: Aktive <7 Tage offline nach Rang/Level, dann alle ≥7 Tage offline als Block nach Tagen offline, dann Entlassene/Verlassene

Mitwirkende

Dieses Projekt wurde in Zusammenarbeit mit Claude (Sonnet 4.6) von Anthropic entwickelt und iterativ ausgebaut.
Der øberwiegende Teil des Codes, der Architektur und der Dokumentation wurde durch KI generiert und gemeinsam verfeinert.

Rolle Person / Tool
Projektidee, Anforderungen & Tests DasAoD
Code, Architektur, Dokumentation Claude (Anthropic)

Lizenz

Privates Projekt – keine öffentliche Lizenz.