# 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` | `mira.web.use` | `true` | Erzeugt/erneuert den persönlichen Einmal-Link |

| Weitere Permissions | Default | Beschreibung |
|---|---|---|
| `mira.web.category.homes` / `claims` / `jobs` / `teams` / `warps` / `economy` / `inventory` / `profile` / `shops` | `true` | Blendet die jeweilige Kategorie ein |
| `mira.web.category.moderation` / `admin` | op | Team-Kategorien Moderation und Admin (bewusst nicht Teil von `mira.web.*`) |
| `mira.web.cooldown.bypass` | op | Link-Cooldown umgehen |

## Aufbau

Links steht die Kategorie-Leiste, rechts die gewählte Seite. Auf dem Handy liegt die Leiste unten; sie zeigt die ersten Kategorien direkt und öffnet über **Mehr** eine Liste aller Bereiche, in denselben Gruppen wie die Sidebar. Die Kategorien sind in dieselben Gruppen gegliedert wie diese Wiki: Teleportation (Homes, Warps), Wirtschaft & Jobs (Konto, Shops, Jobs), Claims, Teams & Chat (Teams, Profil), Welt & Utility (Inventar) und der Team-Bereich (Moderation, Admin, nur mit Rechten sichtbar). Jede Gruppe hat ihre Wiki-Farbe, die das ganze Panel einfärbt, damit auf einen Blick klar ist, wo man gerade ist. Umfangreiche Kategorien sind in Abschnitte geteilt, die als Reiter über dem Inhalt sitzen; auf dem Handy stehen sie als Raster untereinander. Die gewählte Seite steht in der Adresse (`#teams/members`), also führen Zurück-Taste und Neuladen an dieselbe Stelle; die Zurück-Taste wandert durch die zuletzt besuchten Kategorien. Meldungen (Erfolg, Fehler, Hinweise) erscheinen als schließbare Benachrichtigungen unten rechts und blockieren die Seite nicht; nur das Ende der Sitzung ist eine feste Meldung. Das Panel folgt der Browsersprache: Englisch und Deutsch sind eingebaut, andere Sprachen fallen auf Englisch zurück.

**Teams** ist in vier Abschnitte geteilt, statt alles in eine lange Liste zu packen:

| Abschnitt | Inhalt |
|---|---|
| Übersicht | Team-Bank (ein- und auszahlen), Level-Fortschritt mit Balken und Aufstieg, Mitglieder-Vorschau, Verbündete |
| Mitglieder | Einladen, Rang zuweisen, befördern, degradieren, kicken, bannen; Bann-Liste; komplette Rang-Verwaltung mit Rechte-Raster |
| Assets | Land-Claims mit Block-Vorrat und Zukauf, Container, Shops, Team-Warps |
| Einstellungen | Name, Tag, Farbe, Beschreibung, offenes Team, Friendly Fire und die Gefahrenzone (Besitz übertragen, Team verlassen) |

Über dem Ganzen steht eine Team-Karte mit Name, Tag, Level, deinem Rang und den wichtigsten Zahlen, eingefärbt in der Team-Farbe.

## 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). Vorgemerkte Änderungen bleiben beim Wechsel zwischen Kategorien erhalten, bis sie angewendet oder verworfen werden; pro Anwenden gilt je Änderungsart eine Obergrenze (zum Beispiel 10 Moderations-Aktionen), die das Panel beim Vormerken anzeigt. Antwortet der Server nicht rechtzeitig, bleibt alles vorgemerkt und ein erneutes Anwenden wiederholt nichts, was bereits durchgeführt wurde. 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, umbenennen, löschen, gesperrte Welten sehen; setzen nur ingame), Claims (ansehen, aufgeben, Vertrauen verwalten für Spieler, public oder [Gruppe], Claim-Blöcke kaufen und verkaufen, Claim-Flags wie Explosionen oder öffentlichen Zugang schalten, Subclaims ansehen und einschränken, eigene Claims dem Team übergeben, Admin-Plots für das Team kaufen oder mieten, Rückgabe-Anfragen des Team-Inhabers annehmen oder ablehnen; Haustiere übergeben bleibt ingame (/givepet), weil das Tier dafür angeklickt werden muss; braucht das eingeschaltete [Claim-Modul](claim-overview.md)), Jobs (Level, Verdienst, Quests, Toplisten mit Job-Filter, aktive Boosts, Punkteshop: Käufe landen beim Anwenden im Inventar), Teams (siehe Aufbau oben; Team-Warps lassen sich umbenennen, mit Icon per Item-ID und Beschreibung versehen, in der Sichtbarkeit umschalten und löschen, alles nach Team-Rang, inklusive Team-Erstellung zu denselben Regeln wie ingame; ohne Team lassen sich Einladungen annehmen oder ablehnen und offene Teams beitreten, mit Team Allianzen anfragen, annehmen und auflösen, das Team-Home entfernen und als Inhaber das Team nach Eintippen des Teamnamens auflösen), Warps (öffentliche Liste verwalten: umbenennen, Icon per Item-ID wie `cobblestone`, Beschreibung, Kategorie, löschen, Sponsor-Slots für die eigenen Warps kaufen; anlegen und verschieben passiert bewusst nur ingame, weil die Position vom Spieler kommt), Economy (Kontostand, Kontostand anderer Spieler nachschlagen, Topliste mit Seiten, `/pay`), Inventar (Cosmetics anwenden und entfernen, Übersicht der noch gesperrten Cosmetics), Profil (Nickname setzen und entfernen, eigene Join- und Leave-Nachricht, Teleport-Anfragen und Mobs-mitnehmen an- oder ausschalten, ignorierte Spieler verwalten), Shops (eigene Kistenshops und die Shops des Teams: Preis ändern, zwischen Verkauf und Ankauf wechseln, Shop entfernen; anlegen nur ingame per Schild an der Kiste).

**Team-Bereich:** Mit der Berechtigung `mira.web.category.moderation` (Standard: nur OP, bewusst nicht Teil von `mira.web.*`) erscheint die Kategorie Moderation: Online-Liste mit Serverlast, Spieler-Details und Verwarnungshistorie, aktive Bans, IP-Bans, Mutes und Jail-Einträge mit Formularen zum Setzen und Aufheben. Jede Aktion braucht zusätzlich den passenden `mod.*`-Knoten und greift erst beim Anwenden; Online-Spieler werden wie beim Befehl gekickt oder teleportiert. Jail-Positionen und Vanish bleiben ingame. Mit `mira.web.category.admin` (ebenfalls Standard OP) kommt die Kategorie Admin dazu: Serverstatus mit Modulübersicht und Reload, Broadcast, Kontostände anderer Spieler nachschlagen und ändern (`economy.admin`), Nicknames setzen und zurücksetzen (`nick.admin`), Gruppenspawns entfernen (`spawn.admin`) sowie Zeit, Wetter und Gamerules je Welt (`world.time`, `world.weather`, `world.gamerules`), Team-Verwaltung wie /teama (Mitglieder, Ränge, Inhaber, Name, Beschreibung, Tag, Farbe, Score, Kasse, Auflösen nach Eintippen des Namens; `team.admin.*`) und Jobs-Verwaltung wie /jobsa (Beitritt, Level, XP, Punkte, Verdienstlimit, Quests, Admin-Boosts; `jobs.admin.*`), Claim-Verwaltung (globale Claim-Liste mit Besitzer-Filter, Löschen, Übertragen, Blockkonten anpassen; `mira.claim.deleteclaims`, `mira.claim.transferclaim`, `mira.claim.adjustclaimblocks`) und Hologramme (Zeilen bearbeiten, hinzufügen und entfernen, Hologramm löschen; `holo.edit`, `holo.delete`; anlegen und verschieben nur ingame).

## Einrichtung auf öffentlichen Servern

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

1. `plugins/Mira/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 `/mira 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: mira.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 | `mira.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"
```
