Ein privates Guild-Management-System für das Browsergame Shakes & Fidget, das mehrere Gilden auf verschiedenen Servern verwaltet.
  • PHP 69.3%
  • JavaScript 12.8%
  • CSS 9.8%
  • Rust 4.5%
  • HTML 3.6%
Find a file
DanieleU a2ecf3791a README.md: sf-api Credit-Link ergänzt
- sf-api von the-marenga im Technischen Stack verlinkt

Co-authored-by: Claude <claude@anthropic.com>
2026-06-14 14:15:58 +02:00
api fix(members): use CEST consistently for last_online display and days_offline 2026-05-23 11:17:45 +02:00
cli fix(member-sync): use /opt/sf-api/member_sync instead of build path 2026-05-23 10:48:20 +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
includes feat: add embed mode for hellevator page 2026-05-20 19:59:00 +02:00
public fix: update Highway to Hell min level to 150 (de+en) 2026-05-25 11:29:32 +02:00
rust_examples docs(rust): update README with v0.4.3, member_sync, and Cargo.toml notes 2026-05-23 01:56:53 +02:00
storage Fix for stream_select. 2026-02-25 21:57:14 +01:00
.gitignore chore: ignore CLAUDE.md and .claude/worktrees/ in addition to .claude/ 2026-03-07 14:20:20 +01:00
README.md README.md: sf-api Credit-Link ergänzt 2026-06-14 14:15:58 +02:00
ROADMAP_PUBLIC.md docs: update ROADMAP and TODO for sf-api v0.4.3 and cron fixes 2026-05-23 01:57:41 +02:00
TODO_PUBLIC.md docs: add PHP 8.4 timezone fix to TODO 2026-05-23 11:18:05 +02:00

S&F Guilds v2

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
  • 📊 Statistiken & Analysen Mitglieder-Entwicklung, Kampf-Performance
  • 📅 Battle-Kalender Übersicht über vergangene und geplante 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 von the-marenga)
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
│   └── 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. Nur Admin-Accounts werden verwendet.

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).

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 verwendet 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.