# Moderation

Mutes, permanente/temporäre Bans, IP-Bans, Verwarnungen mit automatischen Eskalations-Aktionen, ein Jail-System mit Bewegungs- und Befehlssperre, SocialSpy/CommandSpy und Vanish. Alle aktiven Strafen bleiben über Neustarts erhalten; abgelaufene werden beim Start aussortiert.

## Commands

| Command | Syntax | Permission | Default | Beschreibung |
|---|---|---|---|---|
| `/mute` | `/mute <spieler> [dauer] [grund]` | `mod.mute` | `false` | Mutet Chat und private Nachrichten (ohne Dauer permanent) |
| `/unmute` | `/unmute <spieler>` | `mod.unmute` | `false` | Hebt einen Mute auf |
| `/checkmute` | `/checkmute <spieler>` | `mod.mute` | `false` | Mute-Status, Restzeit, Grund, Aussteller |
| `/cban` | `/cban <spieler> [grund]` (Alias `/coreban`) | `mod.ban` | `false` | Permanenter Ban, kickt sofort |
| `/ctempban` | `/ctempban <spieler> <dauer> [grund]` (Alias `/coretempban`) | `mod.tempban` | `false` | Temporärer Ban, kickt sofort |
| `/cunban` | `/cunban <spieler>` (Alias `/coreunban`) | `mod.unban` | `false` | Entbannt (auch nie gejointe Spieler per Namenssuche) |
| `/checkban` | `/checkban <spieler>` | `mod.ban` | `false` | Ban-Typ, Restzeit, Grund, Aussteller |
| `/cbanip` | `/cbanip <ip\|spieler> [grund]` (Alias `/corebanip`) | `mod.banip` | `false` | Bannt eine IP (Spieler muss dafür online sein); kickt alle mit dieser IP |
| `/cunbanip` | `/cunbanip <ip>` (Alias `/coreunbanip`) | `mod.unban` | `false` | Entbannt eine IP (bewusst ohne Tab-Completion) |
| `/warn` | `/warn <spieler> [grund]` | `mod.warn` | `false` | Verwarnung mit fortlaufender ID pro Spieler |
| `/warnings` | `/warnings <spieler>` (Alias `/warns`) | `mod.warn` | `false` | Aktive Verwarnungen auflisten |
| `/clearwarnings` | `/clearwarnings <spieler>` (Alias `/clearwarns`) | `mod.clearwarnings` | `false` | Löscht alle Verwarnungen |
| `/setjail` | `/setjail <name>` | `mod.setjail` | `false` | Jail-Punkt an aktueller Position (max. 32 Zeichen) |
| `/deljail` | `/deljail <name>` | `mod.setjail` | `false` | Löscht den Jail-Punkt und entlässt alle Insassen |
| `/jail` | `/jail <spieler> [jail] [dauer] [grund]` | `mod.jail` | `false` | Sperrt ein (ohne Dauer permanent) |
| `/unjail` | `/unjail <spieler>` | `mod.unjail` | `false` | Entlässt und teleportiert zum Spawn |
| `/socialspy` | `/socialspy` | `mod.socialspy` | `false` | Private Nachrichten anderer mitlesen (an/aus) |
| `/commandspy` | `/commandspy` | `mod.commandspy` | `false` | Commands anderer mitlesen (an/aus) |
| `/vanish` | `/vanish` (Alias `/v`) | `mod.vanish` | `false` | Unsichtbar: kein Mob-Aggro, keine Item-Aufnahme, keine Join/Leave-Meldung |

## Weitere Permissions

| Permission | Default | Beschreibung |
|---|---|---|
| `mod.vanish.see` | `false` | Sieht vanishte Spieler weiterhin (auch in `/msg`-Tab-Completion) |
| `mod.bypass.mute` | `false` | Schreibt trotz Mute (für private Nachrichten zusätzlich `msg.bypass.mute` nötig) |
| `mod.bypass.jail` | `false` | Bewegt sich und nutzt Commands trotz Jail |

## Dauer-Format

Für `/mute`, `/ctempban`, `/jail` und Warn-Aktionen: Einheiten `s`, `m`, `h`, `d`, `w`, frei kombinierbar (`2h30m`, `1w2d`). Eine reine Zahl zählt als **Minuten**. Maximal 10 Jahre; ungültige Eingaben wie `5m abc` werden komplett abgelehnt.

> **Achtung:** Ein aktiver Mute/Ban muss erst entfernt werden, bevor ein neuer mit anderem Grund oder anderer Dauer gesetzt werden kann. IP-Bans sind von Account-Bans getrennt: `/cunban` hebt einen IP-Ban nicht auf.

> **Hinweis:** Warn-Aktionen feuern genau beim Erreichen des Schwellenwerts (nicht bei jeder weiteren Verwarnung) und laufen über die Konsole. Bei `tempban`-Aktionen MUSS eine gültige `duration` gesetzt sein, sonst wird die Aktion stillschweigend übersprungen.

> **Hinweis:** Beide Spy-Modi überleben keinen Relog/Neustart und schließen die eigenen Nachrichten aus. Durch Mute blockierte Nachrichten erscheinen nicht im SocialSpy. Ein Mute wirkt nur auf Chat und PM-Commands, nicht auf Schilder oder Bücher.

## Jail-Verhalten

Bewegung ist auf `radius` Blöcke um den Jail-Punkt begrenzt (Weltwechsel und Teleports nach draußen werden zurückteleportiert, Respawn landet im Jail). Erlaubt sind nur Commands aus `allowed-commands`; Chat ist bei `block-chat` gesperrt. Bei Online-Only-Jails zählt nur die online verbrachte Zeit, sonst läuft die Uhr auch offline weiter; beim Login wird ein aktiver Insasse zurück ins Jail teleportiert (Re-Jail).

## Konfiguration (modules/moderation.yml)

```yaml
# Schaltet das Moderations-Modul mit allen Commands ein oder aus.
enabled: true

moderation:
  warnings:
    # Tage bis eine Verwarnung automatisch verfällt. 0 = nie.
    expiry-days: 0
    # Automatische Aktionen bei exakt erreichtem Schwellenwert, beliebig
    # viele Einträge, werden nach threshold sortiert.
    actions:
      action1:
        threshold: 3
        # mute, tempban oder ban.
        action: mute
        # Dauer-Format. Bei tempban Pflicht, bei mute/ban leer = permanent.
        duration: "1h"
        reason: "Too many warnings (auto-mute)"
      action2:
        threshold: 5
        action: tempban
        duration: "1d"
        reason: "Too many warnings (auto-tempban)"
      action3:
        threshold: 7
        action: ban
        duration: ""
        reason: "Too many warnings (auto-permban)"
  jail:
    # Bewegungsradius in Blöcken um den Jail-Punkt.
    radius: 5.0
    # true = neue Jails zählen nur online verbrachte Zeit.
    online-only-default: false
    # Sperrt den Chat für Insassen.
    block-chat: true
    # Erlaubte Commands im Jail (Vergleich auf das erste Wort).
    allowed-commands:
      - "/msg"
      - "/tell"
      - "/r"
      - "/reply"
  commandspy:
    # Commands, die nie an CommandSpy gemeldet werden (Login/Passwort).
    blacklist:
      - "/login"
      - "/register"
      - "/changepassword"
      - "/l"
      - "/reg"
  vanish:
    # true = Vanish-Status übersteht Neustarts und Relogs.
    persist: false
    # Dauerhafte Nachtsicht (ohne Partikel) während Vanish.
    night-vision: true
```

## Komplette Beispiel-Config

```yaml
enabled: true

moderation:
  warnings:
    expiry-days: 30
    actions:
      action1:
        threshold: 3
        action: mute
        duration: "6h"
        reason: "Zu viele Verwarnungen"
      action2:
        threshold: 5
        action: tempban
        duration: "3d"
        reason: "Zu viele Verwarnungen"
      action3:
        threshold: 8
        action: ban
        duration: ""
        reason: "Dauerhaft zu viele Verwarnungen"
  jail:
    radius: 10.0
    online-only-default: true
    block-chat: false
    allowed-commands:
      - "/msg"
      - "/r"
      - "/rules"
  commandspy:
    blacklist:
      - "/login"
      - "/register"
  vanish:
    persist: true
    night-vision: true
```
