5 GrumpyMod
darksoon edited this page 2026-07-11 01:17:13 +02:00
This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

Moderation

Zuständig für Auto-Mod, Anti-Nuke, manuelle Moderation, Reports, Message-Log — und den Server-Audit-Logger.


Auto-Mod

Jede Nachricht wird gegen die konfigurierten Filter geprüft — in dieser festen Reihenfolge (nicht konfigurierbar), der erste Treffer wendet seine Aktion an: warn · delete · timeout · nothing.

Reihenfolge Check Was er macht Default-Aktion
1 antiPhishing Fake-Nitro/Steam-Links + externer Bedrohungsfeed (siehe unten) timeout 60 Min + delete
2 antiAd Discord-Invites blockieren; optional alle URLs (mit Allow-List) warn + delete
3 antiFlood Zu viele User-/Rollen-Mentions in einer Nachricht warn + delete
4 antiCaps Mehr als N% Großbuchstaben (ab Mindestlänge) delete
5 wordFilter Konfigurierte Wörter (exact / substring) aus (leer)
6 antiRepeat Gleiche Nachricht N-mal hintereinander warn + delete
7 antiSpam N+ Nachrichten in Y Sekunden warn + delete

antiPhishing steht bewusst ganz vorne — ein Phishing-Treffer soll nie von einem schwächeren Check (z.B. antiCaps) überdeckt werden.

Whitelisting: Rollen in whitelistRoleIds und Channels in whitelistChannelIds sind komplett ausgenommen — von ALLEN Checks.

Eskalation: Erreicht ein User einen escalation-Threshold an aktiven Warns, wird die zugehörige Aktion automatisch ausgelöst (höchster passender Threshold gewinnt, siehe Konfigurationsbeispiel unten).


Erkennt z.B. gefälschte "Kostenloses Discord Nitro"-Links (Muster: dlscord-nitro.com, steam-community-gg.tk). Zwei unabhängige Erkennungswege, beide gleichzeitig aktiv:

a) Eingebaute Heuristik (useBuiltinHeuristics, rein lokal):

  • Marken-Impersonation — erkennt discord/nitro/steam als eigenständigen Namensteil einer Domain, aber NICHT die echten Domains (discord.com, steamcommunity.com usw. sind immer sicher). Ein Link wie steamworks.dev löst NICHT aus, obwohl "steam" vorkommt — nur bei klar abgegrenztem Namensteil.
  • Verdächtige TLD + Köder-Wort.tk/.ml/.ga/.cf/.gq/.zip/.mov lösen NUR aus, wenn die Nachricht zusätzlich ein Köder-Wort enthält (free, gratis, nitro, gift, geschenk, airdrop, claim, giveaway) — ein normaler .tk-Link allein wird nicht blockiert.

b) URLhaus-Bedrohungsfeed (useUrlhaus) — externe, stündlich aktualisierte Liste bekannter Malware-/Phishing-URLs von abuse.ch (kostenlos, kein API-Key). Aktuell ca. 15.000 Einträge, lokal gecacht (cache/urlhaus-urls.txt) — der Check pro Nachricht ist dadurch ein reiner Speicher-Abgleich, kein Netzwerk-Aufruf während des Chattens. Erkennt bekannte, bereits gemeldete bösartige URLs weltweit — nicht nur Marken-Fakes, sondern jede Art von gemeldeter Malware-/Phishing-Seite.

c) Eigene Sperrliste (customBlocklist) — feste Domains, die IMMER blockiert werden (inkl. Subdomains).

Beispiel: Kostenloses Nitro: dlscord-glft.tk 🎁 → Marken-Impersonation greift sofort (erkennt "dlscord"). Eine URL ohne erkennbaren Markennamen, die aber schon in der URLhaus-Datenbank gemeldet ist, wird trotzdem erkannt — auch wenn Check (a) nichts findet.


Message-Log — Inhalt gelöschter/bearbeiteter Nachrichten

Discords eigenes Audit-Log (siehe Server-Audit-Logger unten) zeigt nie den Nachrichteninhalt und erfasst nur Löschungen durch Moderatoren an fremden Nachrichten — löscht ein User seine eigene Nachricht selbst, taucht das dort gar nicht auf. Bearbeitungen werden von Discord überhaupt nicht protokolliert.

Message-Log schließt diese Lücke: postet bei jeder Löschung/Bearbeitung (egal wer sie ausgelöst hat) eine Nachricht mit dem echten Inhalt in channels.mod-log:

  • Löschung: Autor, Kanal, kompletter Text, Anhänge
  • Bearbeitung: Autor, Kanal, Link zur Nachricht, Text vorher und nachher
  • Massenlöschung: Kanal, Anzahl, bis zu 10 Beispiel-Nachrichten mit Inhalt

Grenze: War eine Nachricht schon vor dem letzten Bot-Neustart da oder ist sie älter als die letzten ~200 Nachrichten im Kanal, kennt der Bot ihren Inhalt nicht — dann wird bewusst nichts gepostet (Discord hat den Inhalt dem Bot nie mitgeteilt, das ist keine Einschränkung von GrumpyCore).


Anti-Nuke

Erkennt koordinierte oder versehentliche Server-Zerstörung in Echtzeit. Fest im Code, nicht über YAML konfigurierbar — läuft automatisch mit, sobald addons.mod: true.

Auslöser (10-Sekunden-Fenster):

  • Massenhafte Channel-Löschungen (3)
  • Massenhafte Bans (5)
  • Massenhafte Rollen-Löschungen (3)

Reaktion:

  1. Dem Verursacher werden sofort alle Rollen entzogen (ein einziger API-Call, kein Rate-Limit-Risiko)
  2. Im alert-Channel erscheint eine Benachrichtigung (optional mit alert-ping-Rollen-Ping)
  3. 60-Sekunden-Cooldown verhindert doppeltes Neutralisieren desselben Verursachers
  4. Der Server-Owner ist von der Rollen-Entfernung ausgenommen

/mod nuke — Channel komplett zurücksetzen

/mod clear und /mod purge können keine Nachrichten löschen, die älter als 14 Tage sind — eine feste Grenze von Discords eigener API. /mod nuke umgeht das: der Channel wird geklont (identischer Name, Rechte, Position) und der alte danach komplett gelöscht — betrifft wirklich jede Nachricht, egal wie alt. Danach postet der Bot ein Embed im frischen Channel ("☢️ CHANNEL NUKED").

Nicht rückgängig zu machen. Braucht extra Manage Channels (nicht nur Manage Messages wie clear/purge), damit ein normaler Nachrichten-Mod das nicht versehentlich auslöst.

/mod nuke

Punishment-System

Jede Mod-Aktion bekommt eine eindeutige P-#-ID und wird in der Datenbank gespeichert. active steuert, ob der Eintrag zur Eskalation zählt bzw. noch läuft — Default-Aktiv-Status: warn/mute/ban → aktiv; kick/note/softban/unmute/unban/unwarn → inaktiv.

  • History anzeigen: /mod history @user (bis zu 25 Einträge, 🟢 aktiv / inaktiv, Moderator, Zeitstempel, ggf. Ablaufzeit)
  • Einzelne Warn deaktivieren: /mod unwarn <id>
  • Timeout aufheben: /mod unmute @user
  • Volle Befehlsliste: Mod-Commands

Punishment-Typen:

  • Note (/mod note) — Staff-Notiz ohne Strafe, taucht in /mod history auf
  • Softban (/mod softban) — Kick + Lösch-Cleanup (Ban+Unban) ohne permanenten Ban
  • Tempban (/mod tempban) — normaler Ban mit Ablaufzeit, wird automatisch vom Auto-Unban-Runner (60s-Takt) aufgehoben

Verlauf durchsuchen & exportieren:

Command Filter Beschreibung
/mod modlog-search user/moderator/type (warn/kick/ban/softban/mute/note)/days (13650), alle optional Zeigt bis zu 25 Treffer als Embed, Footer nennt Trefferzahl vs. Gesamtzahl
/mod modlog-export user/type/days, alle optional (kein moderator-Filter) CSV-Anhang (id,type,userId,moderatorId,reason,active,createdAt,expiresAt)

modlog-export ist gegen CSV-Formel-Injection abgesichert (=, +, -, @, Tab, CR am Zeilenanfang im Grund-Feld werden mit führendem ' entschärft).


Report-System

/report user:@Jemand reason:"Grund hier"
  • Cooldown: 60 Sek zwischen Reports pro Melder
  • Limit: 10 Reports pro Tag pro Melder
  • Selbst-Report und Bot-Report nicht möglich
  • Staff sieht den Report im konfigurierten Ziel-Kanal mit Buttons: Deny / Warn / Timeout / Kick / Ban
  • Klick-Berechtigung: Moderate Members oder Rolle aus roles.support (Basis), für Timeout/Kick/Ban zusätzlich die jeweils passende Discord-Permission

Konfiguration (configs/modules/mod.yml)

enabled: true
reportChannelId: "0"             # Fallback-Zielkanal für /report

whitelistRoleIds: []              # Rollen, die Auto-Mod komplett umgehen
whitelistChannelIds: []           # Kanäle, die Auto-Mod komplett umgehen

escalation:
  - threshold: 3                  # ab 3 aktiven Warns
    action: mute
    durationMinutes: 60
  - threshold: 5
    action: kick
  - threshold: 7
    action: ban

autoMod:
  antiPhishing:
    enabled: true
    useBuiltinHeuristics: true    # Marken-Impersonation + TLD-Heuristik
    useUrlhaus: true              # externer Bedrohungsfeed (abuse.ch)
    customBlocklist: []           # eigene, fest gesperrte Domains
    action: timeout
    timeoutMinutes: 60
    deleteMessages: true

  antiAd:
    enabled: true
    blockInvites: true
    blockAllLinks: false
    allowedDomains: []
    action: warn
    deleteMessages: true

  antiFlood:
    enabled: true
    maxMentions: 5
    action: warn
    timeoutMinutes: 10
    deleteMessages: true

  antiCaps:
    enabled: true
    threshold: 0.7                # 70% Großbuchstaben-Anteil
    minLength: 10
    action: delete
    deleteMessages: true

  wordFilter:
    enabled: false
    words: []
    substring: false
    action: warn
    deleteMessages: true

  antiRepeat:
    enabled: true
    repeats: 3
    windowSeconds: 60
    action: warn
    deleteMessages: true

  antiSpam:
    enabled: true
    messages: 5
    windowSeconds: 5
    action: warn
    timeoutMinutes: 5
    deleteMessages: true

report:
  enabled: true
  cooldownSeconds: 60
  dailyLimit: 10

messageLog:
  enabled: true
  logEdits: true
  logDeletes: true
  ignoreBots: true                # Bot-eigene Nachrichten nicht protokollieren

nuke:
  gifUrl: ""                      # optionales Bild/GIF für die Nuke-Nachricht, leer = nur Text

Fehlt nach einem Bot-Update ein neuer Schlüssel in einer bestehenden mod.yml, wird er beim nächsten Neustart automatisch mit seinem Default ergänzt — bestehende Einstellungen bleiben dabei unangetastet.


Server-Audit-Logger

Loggt automatisch eine breite Palette an Server-Events in den mod-log-Channel — strukturierte Embeds mit Kategorie-Badge, Executor (Von:), Target und Details. Deckt sich NICHT mit Message-Log oben (das zeigt Inhalt, das Audit-Log nicht).

Kategorie Events
Channels CHANNEL_CREATE · CHANNEL_DELETE · CHANNEL_UPDATE
Roles ROLE_CREATE · ROLE_DELETE · ROLE_UPDATE
Members ROLE_ADD · ROLE_REMOVE · MEMBER_UPDATE · MEMBER_KICK · MEMBER_BAN · MEMBER_UNBAN
Sonstige INVITE_CREATE/DELETE · WEBHOOK_CREATE/DELETE · EMOJI_CREATE/DELETE

Channel via channels.mod-log in configs/config.yml setzen — kein zusätzliches Setup.


Berechtigungen im Überblick

Command / Aktion Benötigte Discord-Permission
/mod (Basis) Moderate Members
/mod kick + Kick Members
/mod ban/tempban/softban/unban + Ban Members
/mod clear/purge + Manage Messages
/mod slowmode + Manage Channels
/mod nuke + Manage Channels
/mod reload Manage Guild
/report keine (außer Selbst-/Bot-/Mod-Ausschluss)

Volle Befehlsliste: Mod-Commands