# 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` | op | Mutet Chat und private Nachrichten (ohne Dauer permanent) |
| `/unmute` | `/unmute <spieler>` | `mod.unmute` | op | Hebt einen Mute auf |
| `/checkmute` | `/checkmute <spieler>` | `mod.mute` | op | Mute-Status, Restzeit, Grund, Aussteller |
| `/cban` | `/cban <spieler> [grund]` (Alias `/miraban`) | `mod.ban` | op | Permanenter Ban, kickt sofort |
| `/ctempban` | `/ctempban <spieler> <dauer> [grund]` (Alias `/miratempban`) | `mod.tempban` | op | Temporärer Ban, kickt sofort |
| `/cunban` | `/cunban <spieler>` (Alias `/miraunban`) | `mod.unban` | op | Entbannt (auch nie gejointe Spieler per Namenssuche) |
| `/checkban` | `/checkban <spieler>` | `mod.ban` | op | Ban-Typ, Restzeit, Grund, Aussteller |
| `/cbanip` | `/cbanip <ip\|spieler> [--force] [grund]` (Alias `/mirabanip`) | `mod.banip` | op | Bannt eine IPv4- oder IPv6-Adresse oder die Adresse eines Online-Spielers; kickt alle mit dieser IP, greift direkt beim Login. Zum Schutz vor Selbst-Aussperrung werden lokale Adressen (Loopback/Link-Local, z. B. alle Spieler hinter einem Proxy ohne IP-Forwarding) und Adressen, die gerade mehrere Online-Spieler teilen, ohne `--force` abgelehnt |
| `/cunbanip` | `/cunbanip <ip>` (Alias `/miraunbanip`) | `mod.unban` | op | Entbannt eine IP (bewusst ohne Tab-Completion) |
| `/warn` | `/warn <spieler> [grund]` | `mod.warn` | op | Verwarnung mit fortlaufender ID pro Spieler |
| `/warnings` | `/warnings <spieler>` (Alias `/warns`) | `mod.warn` | op | Aktive Verwarnungen auflisten |
| `/clearwarnings` | `/clearwarnings <spieler>` (Alias `/clearwarns`) | `mod.clearwarnings` | op | Löscht alle Verwarnungen |
| `/setjail` | `/setjail <name>` | `mod.setjail` | op | Jail-Punkt an aktueller Position (max. 32 Zeichen) |
| `/deljail` | `/deljail <name>` | `mod.setjail` | op | Löscht den Jail-Punkt und entlässt alle Insassen |
| `/jail` | `/jail <spieler> [jail] [dauer] [grund]` | `mod.jail` | op | Sperrt ein (ohne Dauer permanent) |
| `/unjail` | `/unjail <spieler>` | `mod.unjail` | op | Entlässt und teleportiert zum Spawn |
| `/socialspy` | `/socialspy` | `mod.socialspy` | op | Private Nachrichten anderer mitlesen (an/aus) |
| `/commandspy` | `/commandspy` | `mod.commandspy` | op | Commands anderer mitlesen (an/aus) |
| `/vanish` | `/vanish` (Alias `/v`) | `mod.vanish` | op | Unsichtbar: kein Mob-Aggro, keine Item-Aufnahme, keine Join/Leave-Meldung |

## Weitere Permissions

| Permission | Default | Beschreibung |
|---|---|---|
| `mod.vanish.see` | op | 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 |

> **Hinweis:** Vanish verbirgt einen Spieler auch in der Tab-Vervollständigung aller Spielernamen, in `/ping`, `/whois` und `/seen` (antwortet mit dem Zeitpunkt des Vanish als "zuletzt gesehen"), in `%online%` im Tab-Header und -Layout, in `<player_count>` bei Join/Leave sowie in AFK-, Todes- und Advancement-Meldungen. Spieler mit `mod.vanish.see` sehen weiterhin alles.

## 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; gleichzeitige Verwarnungen lösen die Schwelle genau einmal aus. Automatische Aktionen verlängern eine Strafe nur: Eine bereits aktive längere oder permanente Sanktion wird nie verkürzt, die Aktion wird dann übersprungen und dem Moderator gemeldet. 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. Befehle in Namespace-Schreibweise (`/mira:msg`, `/authme:login`) werden wie der einfache Befehl behandelt: Wortfilter, Mute-Sperre der PN-Befehle, Jail-Allowlist und CommandSpy-Blacklist greifen identisch.

## 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). Ein abgelaufener Zeit-Jail wird beim nächsten Kontakt (Bewegung, Befehl, Login) freigegeben und der Spieler benachrichtigt; bei einem Server-Stopp wird die abgesessene Zeit von Online-Only-Jails gutgeschrieben.

## 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; die
    # Namespace-Form wie /mira:msg zählt wie der einfache Befehl).
    # Gleiche Regel für die CommandSpy-Blacklist unten.
    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
```
