Bans & Mutes
Das Modul punishments liefert netzwerkweite Banns und Mutes mit festen Gründen aus reasons.yml, Eskalationsstufen, Admin-Banns, Rang-Schutz, Spieler-Steckbrief (/lookup), Historie und Entbannungsanträge im Dashboard.
Lizenz: punishments gehört standardmäßig zur kostenlosen Base (zusammen mit core, reports, lobby). Welche Module frei sind, kann sich ändern – gesperrte Module zeigt das Dashboard ausgegraut.
Einschalten
- Modul-Schlüssel:
punishments(keine Abhängigkeiten). Siehe Module & Presets. - Im Netzwerk auf dem Proxy einschalten: Der Proxy registriert
/ban,/unban,/mute,/unmute,/lookup,/playerinfo,/history,/modifyund/resethistoryund führt sie zentral aus. Die Spigot-Varianten sind nur der Fallback für Einzelserver. - Die Bann-Prüfung beim Join läuft auf jedem Server, auch ohne das Modul.
reasons.yml
Alle Bann- und Mute-Gründe stehen in einer Liste. Maßgeblich ist die reasons.yml auf dem Proxy: Er legt sie beim Start und bei /eternal reload in der Datenbank ab. API/Dashboard (innerhalb von 30 s) und alle Spigot-Server (innerhalb einer Minute) übernehmen genau diese Liste. Die Datei auf den Spigots gilt nur, wenn kein Proxy da ist.
reasons:
- id: 1
type: ban
label: "Hacking / Cheating"
duration: permanent
- id: 5
type: ban
label: "Schwere Beleidigung"
duration: 7d
escalation:
- 7d # 1. Mal
- 30d # 2. Mal
- permanent # 3. Mal und jedes weitere
- id: 10
type: ban
label: "Strafbare Inhalte"
duration: permanent
permission: eternal.reason.extreme
- id: 20
type: mute
label: "Chat-Spam"
duration: 1h
- id: 90
type: ban
label: "Server-Sabotage"
duration: permanent
admin: true
| Feld | Pflicht | Bedeutung |
|---|---|---|
id | ja | Eindeutige Nummer ab 1. Lücken sind erlaubt. |
type | ja | ban (kickt, sperrt den Join) oder mute (blockt den Chat). Entscheidet allein über die Art der Strafe – /ban <Spieler> 20 verhängt also einen Mute. |
label | ja | Text im Bann-Screen, im Broadcast und in der Historie. |
duration | ja | permanent oder <n>s, <n>m, <n>h, <n>d, <n>w, <n>y. |
permission | nein | Recht, das der Ausführende braucht. Standard: eternal.ban bzw. eternal.ban.admin bei admin: true. |
groupid | nein | Mindest-Rangstufe. Wer das Recht nicht hat, darf trotzdem, wenn seine Stufe ≥ diesem Wert ist. 0 = aus. |
admin | nein | true = Admin-Bann: nur eternal.ban.admin darf ihn verhängen, nur eternal.unban.admin aufheben. Im Dashboard für normale Mods nur lesbar. |
escalation | nein | Dauer je Vergehen. Gezählt werden frühere, abgelaufene oder aufgehobene Strafen mit demselben Grund. Gibt es mehr Vergehen als Stufen, wiederholt sich die letzte. Ohne escalation gilt immer duration. |
Außerdem enthält reasons.yml die Report-Gründe (report-reasons, siehe Reports) und die Verkürzungs-Vorlagen für Entbannungsanträge (appeal-shorten-templates, siehe unten).
Grund-Rechte im Dashboard (eternal.ban.reason.<id>)
Für jeden Grund registriert Eternal automatisch das Recht eternal.ban.reason.<id> (Kategorie „reasons“ im Rechte-Editor). Es steuert den Web-Report-Flow: Im Dialog „Bannen/Muten aus Report“ erscheinen nur Gründe, die der Teamler verwenden darf, und die API lehnt einen Grund ohne passendes Recht mit 403 ab.
Ein Grund ist im Dashboard nutzbar, wenn alle drei Punkte erfüllt sind:
- Basis-Recht:
eternal.mute(Mute-Grund) bzw.eternal.banodereternal.ban.admin(je nachadmin:). eternal.ban.reason.<id>– Standard-Stufe Team, also Opt-out: Jeder mit Basis-Recht darf jeden Grund, bis ein Admin den Grund für einen Rang auf Aus stellt.- Ein in
reasons.ymlgesetztespermission:muss zusätzlich gehalten werden.
Die Option Sonstiges im Dialog (freies Label + Dauer) sendet keinen Grund und braucht nur das Basis-Recht.
Ingame zählen die Grund-Rechte nicht. /ban und /mute prüfen dort nur permission: (bzw. den Standard) und groupid.
Befehle
Alle Befehle laufen im Netzwerk auf dem Proxy. Spielernamen werden auch für Offline-Spieler aufgelöst.
| Befehl | Recht | Beschreibung |
|---|---|---|
/ban <Spieler> [Grund-Nr] | eternal.ban | Ohne Nummer: Liste aller Gründe, die du verwenden darfst. Mit Nummer: Strafe nach type des Grundes. |
/mute <Spieler> [Grund-Nr] | eternal.mute | Wie /ban – der Typ kommt aus dem Grund. |
/unban <Spieler> [Grund] | eternal.unban | Hebt den aktiven Bann auf. Admin-Banns brauchen eternal.unban.admin. |
/unmute <Spieler> [Grund] | eternal.unmute | Hebt den aktiven Mute auf. |
/lookup <Spieler> | eternal.lookup | Steckbrief: UUID, Rang, aktive Strafen, letzte Einträge. |
/playerinfo <Spieler> (/pinfo, /whois) | eternal.lookup | Kompakte Spielerinfo (nur Proxy): Rang, online, letzte IP, aktiver Bann/Mute, Nick. |
/history <Spieler> (/banhistory) | eternal.lookup | Bann-, Mute- und Report-Historie als Karten. |
/modify <Bann-ID> setduration <Dauer> | eternal.modify.duration | Neue Dauer, gerechnet ab jetzt (permanent erlaubt). |
/modify <Bann-ID> setreason <Grund-ID oder Text> | eternal.modify.reason | Neuer Grund; eine Zahl übernimmt Label und ID aus reasons.yml, sonst freier Text. |
/resethistory <Spieler> | eternal.history.reset | Löscht die Historie (siehe history.reset-mode). |
Benachrichtigungen über neue Banns und Mutes bekommen alle mit eternal.notify.
config.yml
# Verhalten von /resethistory
history:
reset-mode: hard # hard = Einträge physisch löschen
# soft = Einträge mit hidden=1 behalten (per SQL wiederherstellbar),
# zählen nicht mehr für die Eskalation, nicht in /history
Wer darf wen bestrafen (Stufen)
Bannen und Muten ist rang-geschützt: Der Ausführende braucht eine echt höhere Stufe als das Ziel. Gleiche Ränge können sich also nicht gegenseitig bestrafen.
- Stufe = Maximum aus dem höchsten gehaltenen Recht
eternal.tier.0…eternal.tier.100und der Priorität der höchsten Gruppe (Eternal Perms, früher CloudNet-sortId). - Ist das Ziel offline, zählt die zuletzt gespeicherte Stufe aus seinem Profil.
eternal.bypasshebt den Schutz komplett auf. Die Konsole darf immer.groupideines Grundes nutzt dieselbe Stufe: Stufe ≥groupidersetzt das fehlende Grund-Recht.- Im Dashboard sind
/lookup-Ansicht und Historie zusätzlich rang-geschützt (eigene Stufe muss höher sein,eternal.bypassumgeht das). Ingame sind/lookupund/historynicht rang-geschützt.
Ohne Ränge mit Priorität und ohne eternal.tier.*-Rechte haben alle Stufe 0 – dann kann niemand jemanden bannen. Entweder Prioritäten in den Rängen pflegen oder dem Team z. B. eternal.tier.50 geben.
Altbestand: Mit cloudnet.legacy-mapping: true werden die unter cloudnet.groups eingetragenen Gruppen per Name auf Rechte und tier abgebildet. Mit Eternal Perms ist das nicht nötig (Standard false).
Bann-Screen
Der Kick-Text beim Bann und beim Join-Versuch kommt aus translations/<sprache>.yml, Schlüssel ban-kick-screen:
ban-kick-screen: |-
&dEternal &8»
&7Du wurdest vom Netzwerk &cgebannt&7.
&dGrund&8: &b{reason}
&dDauer&8: &7{duration}
&dBann-ID&8: &c#{id}{appealBlock}
&8Beschwerde: &f/appeal
| Platzhalter | Inhalt |
|---|---|
{reason} | Label des Grundes |
{duration} | Restdauer bzw. „permanent“ |
{id} | Bann-ID (braucht der Spieler für den Antrag) |
{appealBlock} | Hinweiszeile nach einem abgelehnten Antrag, sonst leer |
Die Zeile „Beschwerde: /appeal“ meint die Antrags-Seite im Dashboard (<Dashboard-URL>/appeal). Passe sie an deine Domain an. Weitere Texte: ban-broadcast, mute-blocked-chat, ban-perm-denied, unban-admin-only, tier-blocked-action.
Entbannungsanträge
Gebannte Spieler stellen Anträge auf zwei Wegen:
- Ohne Login: Seite
/appealim Dashboard – Spielername, Bann-ID und Begründung (mindestens 10 Zeichen). Name und ID müssen zum aktiven Bann passen. - Mit Login: Mein Konto → Entbannungsantrag stellen. Gebannte Spieler kommen per Passwort-Login ins Dashboard (siehe Dashboard: Login & Konten). Dort sehen sie auch frühere Anträge und, falls vorhanden, das Replay zu ihrem Bann.
Pro Bann ist nur ein offener Antrag möglich.
Bearbeiten (Moderation → Entbannungsanträge)
| Aktion | Recht | Wirkung |
|---|---|---|
| Liste ansehen | eternal.web.dashboard | Offene Anträge, Filter nach Status |
| Genehmigen | eternal.web.appeals.decide | Bann wird aufgehoben |
| Ablehnen | eternal.web.appeals.decide | Bann bleibt; die Notiz erscheint im Bann-Screen ({appealBlock}) |
| Verkürzen | eternal.web.dashboard | Restdauer per Vorlage oder eigener Dauer kürzen |
Die Vorlagen kommen aus reasons.yml:
appeal-shorten-templates:
- id: immediate
label: "Sofort entbannen"
duration: 0s
- id: 1d
label: "Auf 1 Tag verkuerzen"
duration: 1d
- id: 7d
label: "Auf 1 Woche verkuerzen"
duration: 7d
Die Dauer lässt sich im Dialog überschreiben (1d, 6h, 30m, permanent).
Dashboard-Seiten
| Seite | Recht | Inhalt |
|---|---|---|
| Moderation → Aktive Strafen | eternal.web.dashboard | Aktive Banns und Mutes; Aufheben mit eternal.unban bzw. eternal.unban.admin |
| Moderation → Entbannungsanträge | eternal.web.dashboard | siehe oben |
| Spieler → Profil | eternal.web.player.view | Historie, Sessions, Anträge, Chat-Verlauf |
| Moderation → Reports | eternal.report.handle | Bannen/Muten direkt aus dem Report mit eternal.ban / eternal.mute |
Ein Web-Bann kickt den Spieler sofort.
Typische Stolperfallen
- „Für diesen Grund fehlt dir die nötige Permission“ – Grund hat ein eigenes
permission:(z. B. Grund 10 brauchteternal.reason.extreme) oder ist ein Admin-Grund. - „Du hast nicht den Rang, um … zu bestrafen“ – Ziel hat dieselbe oder eine höhere Stufe. Prioritäten der Ränge prüfen.
- Grund-Änderung kommt nicht an –
reasons.ymlauf dem Proxy bearbeiten und dort/eternal reloadausführen. Änderungen auf den Spigots werden im Netzwerk ignoriert. /modify setdurationverlängert ungewollt – die neue Dauer zählt ab dem Zeitpunkt des Befehls, nicht ab Bann-Beginn.- IDs wiederverwenden – eine geänderte Bedeutung einer bestehenden
idverfälscht Eskalation und Historie. Neue Gründe besser mit neueridanlegen. - Ingame-Entbannung und Replays – Replays zu einem Bann werden beim Aufheben über das Dashboard gelöscht. Siehe Replays.
- Die Rechte
eternal.reportsystemundeternal.lookup.bypass(inplugin.ymlund im Beispiel untercloudnet.groups) stammen aus älteren Versionen und werden im Code nicht mehr geprüft. Reports bearbeitet man miteternal.report.handle, den Rang-Schutz umgehteternal.bypass.