# Web-Interface (/cweb)

Eingebautes Web-Panel ohne externe Abhängigkeiten: `/cweb` erzeugt einen persönlichen Einmal-Link, im Browser verwaltet der Spieler Homes, Claims, Jobs, Teams, Warps und Economy. Kein Login, kein Passwort; der Spieler muss während der Session online bleiben.

## Commands & Permissions

| Command | Syntax | Permission | Default | Beschreibung |
|---|---|---|---|---|
| `/cweb` | `/cweb` | `core.web.use` | `true` | Erzeugt/erneuert den persönlichen Einmal-Link |

| Weitere Permissions | Default | Beschreibung |
|---|---|---|
| `core.web.category.homes` / `claims` / `jobs` / `teams` / `warps` / `economy` | `true` | Blendet die jeweilige Kategorie ein |
| `core.web.cooldown.bypass` | `false` | Link-Cooldown umgehen |

## So funktioniert es

Der Link ist einmalig und läuft nach `link-expiry-seconds` ab; eine neue `/cweb`-Nutzung beendet die alte Session. Alles im Browser ist nur Anzeige: Erst beim Klick auf **Apply** prüft der Server jede Änderung live gegen Permissions, Team-Ränge, Kontostand und Cooldowns und speichert nur bei Erfolg (mehrere Änderungen werden einzeln geprüft, ein Fehlschlag verwirft die anderen nicht). Die Session endet nach `session-timeout-minutes` Inaktivität oder beim Verlassen des Servers. Der Webserver ist mit Rate-Limiting gegen Anfrage-Fluten abgesichert.

**Kategorien:** Homes (ansehen/löschen; setzen nur ingame), Claims (ansehen/aufgeben, braucht [CoreEngineClaim](../claim/index.html)), Jobs (Level, Verdienst, Quests, Toplisten), Teams (Mitglieder, Ränge, Bank, Container und die Team-Warps inklusive der Team-internen: umbenennen, Icon per Item-ID, Beschreibung, Sichtbarkeit umschalten, löschen; alles nach Team-Rang, inklusive Team-Erstellung zu denselben Regeln wie ingame), Warps (öffentliche Liste verwalten: umbenennen, Icon per Item-ID wie `cobblestone`, Beschreibung, Kategorie, löschen; anlegen und verschieben passiert bewusst nur ingame, weil die Position vom Spieler kommt), Economy (Kontostand, letzte 50 Transaktionen, `/pay`).

## Einrichtung auf öffentlichen Servern

Lokal funktioniert `/cweb` sofort auf `http://localhost:8196`. Öffentlich muss einmalig die `public-url` gesetzt werden:

1. `plugins/CoreEngine/modules/websession.yml` öffnen und `public-url` auf deine IP/Domain setzen (ohne `http://`).
2. Port 8196 (TCP) in Firewall/Hoster-Panel freigeben.
3. Neustarten oder `/ce reload`; im Log muss `[WebSession] /cweb links will use: http://...` deine Adresse zeigen.

Für HTTPS: Reverse Proxy (nginx/Caddy) auf 443, `bind-address: "127.0.0.1"`, `public-url: "https://panel.deinserver.de"`, `behind-proxy: true`. Erlaubt dein Hoster keine Zusatzports, setze `websession.enabled: false`, damit Spieler keine toten Links bekommen.

## Konfiguration (modules/websession.yml)

```yaml
# Schaltet das Web-Interface-Modul ein oder aus.
enabled: true

websession:
  # Web-Interface einzeln abschaltbar.
  enabled: true
  # Port des eingebauten HTTP-Servers.
  port: 8196
  # Bind-Adresse. 127.0.0.1 für Reverse-Proxy-Setups.
  bind-address: "0.0.0.0"
  # Adresse in den Links. IP/Domain reicht (http:// und Port werden
  # ergänzt), volle URLs wie https://... werden unverändert benutzt.
  # Auf öffentlichen Servern Pflicht, sonst zeigen Links auf localhost.
  public-url: ""
  # X-Forwarded-Header vertrauen (NUR hinter einem Reverse Proxy).
  behind-proxy: false
  # Sekunden, die ein unbenutzter Link gültig bleibt.
  link-expiry-seconds: 300
  # Cooldown für NEUE Links; ein noch gültiger Link wird wiederverwendet.
  # Bypass: core.web.cooldown.bypass.
  command-cooldown-seconds: 10
  # Session endet nach N Minuten Inaktivität im Browser.
  session-timeout-minutes: 20
  # Optionaler Website-Link im Footer des Panels.
  website-url: ""
```

## Troubleshooting

| Problem | Ursache | Lösung |
|---|---|---|
| Link zeigt `localhost` | `public-url` leer oder in der falschen Datei | In `modules/websession.yml` setzen (nicht `config.yml`), reload, Log prüfen |
| Link lädt ewig | Port nicht erreichbar | Port 8196 (TCP) freigeben |
| „Web-Interface nicht verfügbar" | Modul aus oder Port belegt | `websession.enabled: true`; Log auf `Could not start web server` prüfen |
| „Link abgelaufen" | Älter als 5 Minuten oder schon benutzt | `/cweb` erneut tippen |
| Session endet plötzlich | Spieler offline oder Inaktivität | Verbinden und `/cweb` neu ausführen |
| Kategorie fehlt | Permission fehlt oder Modul deaktiviert | `core.web.category.<name>` vergeben, Modul aktivieren |
| „CSRF failure" | Cookie-/Browser-Problem | Cache leeren, neuen Link öffnen |
| Rate-Limit blockiert | Zu viele Anfragen/Fehlversuche | 10 Minuten warten |

## Komplette Beispiel-Config

```yaml
enabled: true

websession:
  enabled: true
  port: 8196
  bind-address: "127.0.0.1"
  public-url: "https://panel.meinserver.de"
  behind-proxy: true
  link-expiry-seconds: 180
  command-cooldown-seconds: 30
  session-timeout-minutes: 15
  website-url: "https://meinserver.de"
```
