Ein privates Guild-Management-System für das Browsergame Shakes & Fidget, das mehrere Gilden auf verschiedenen Servern verwaltet.
  • PHP 64.6%
  • JavaScript 14.1%
  • CSS 10.8%
  • Rust 6.5%
  • HTML 3.4%
  • Other 0.6%
Find a file
2026-08-02 22:40:50 +02:00
.github/workflows fix: FORGEMO_OUTPUT typo -> FORGEJO_OUTPUT in docker tag-bump step 2026-07-28 20:48:10 +02:00
api feat: allow character_sync in admin_cron_run.php 2026-07-30 23:30:31 +02:00
cli fix: register character_sync in cron_runner_single's scriptMap too 2026-07-31 23:42:38 +02:00
config fix: 3 findings from fifth ChatGPT audit 2026-02-23 21:43:51 +01:00
data Updated .gitignore. 2026-02-25 21:58:36 +01:00
docs chore: drop unneeded executable bit on doc/asset files 2026-07-28 21:50:26 +02:00
includes feat: add findSfAccountForGuild() helper 2026-07-30 23:25:11 +02:00
install fix: add install/ to repo and update configs 2026-06-20 12:12:19 +02:00
public fix: correct outdated enchantment effect texts for Fuss-Stiefel and Raubritter-Ritual 2026-08-02 22:40:50 +02:00
rust_examples fix: sync own logged-in character too (was always skipped, affected all 5 guild sync chars) 2026-07-30 23:59:21 +02:00
storage Fix for stream_select. 2026-02-25 21:57:14 +01:00
.gitignore chore: ignore SQLite WAL-mode runtime files (-shm/-wal) 2026-07-28 21:58:57 +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.