2 GrumpyCommands
darksoon edited this page 2026-05-07 22:13:47 +02:00

Custom Commands (CustomCmd)

Admins können eigene Slash-Commands per /cc add definieren. User rufen sie mit /cmd <name> auf — Autocomplete listet alle verfügbaren Commands.


Aktivierung

In configs/config.yml:

addons:
  customcmd: true

Keine YAML — Custom-Commands liegen in der Datenbank (CustomCommand-Tabelle). /cc add/edit/delete sind die einzige Schnittstelle.


Drei Command-Typen

text

Plain-Text-Antwort mit Placeholder-Support.

/cc add name: rules type: text response: "%user_mention%, lies bitte die Regeln in #regeln!"
Placeholder Wird ersetzt durch
%user_mention% <@USER_ID>
%user_name% Display-Name des Users
%user_id% User-ID
%guild_name% Server-Name

embed

JSON-definiertes Embed. Aus dem JSON werden ausschließlich title, description und color übernommen — alle anderen Felder werden ignoriert (Sicherheits-Constraint).

/cc add name: discord type: embed response: '{"title":"Discord","description":"Wir sind hier!","color":"#5865F2"}'

role-toggle

Toggelt eine Rolle auf dem aufrufenden User. response ist die Rollen-ID.

/cc add name: notify type: role-toggle response: "1234567890123456" description: "Toggle Notify-Pings"

User ohne die Rolle → bekommt sie. User mit der Rolle → verliert sie.


Commands

Für User

Command Funktion
/cmd <name> Command ausführen. Autocomplete schlägt Namen + Description vor — Commands mit allowed-role, für die der User die Rolle nicht hat, werden im Autocomplete ausgeblendet.
/cc list Alle Custom-Commands anzeigen (lange Listen werden zeilenweise abgeschnitten und mit …und N weitere ergänzt)
/cc info <name> Details (Type, Response, Description, Allowed-Role)

Für Admins (Manage Guild)

Command Funktion
/cc add <name> <type> <response> [description] [allowed-role] Neuen Command erstellen
/cc edit <name> [response] [description] [allowed-role] [clear-permissions] Bestehenden Command ändern
/cc delete <name> Command löschen

Name-Validierung

  • Erlaubt: Lowercase a-z, Ziffern 0-9, _, -
  • Max 32 Zeichen
  • Eindeutig pro Server (Duplicate → P2002-Fehler mit freundlicher Meldung)
  • Anti-Spoofing-Sanitization: name und description werden automatisch von RTL-Override- und Zero-Width-Zeichen befreit, bevor sie gespeichert werden — verhindert Spoofing-Tricks (z.B. admin rückwärts gerendert)

Sicherheit

Role-Toggle ist eine direkte Privilege-Eskalations-Vektor — der Bot nimmt das ernst.

Blockierte Rollen-Permissions

Eine Rolle kann nicht als Role-Toggle eingerichtet werden, wenn sie eine der folgenden Permissions hat:

Administrator
ManageGuild
ManageRoles
ManageChannels
ManageWebhooks
BanMembers
KickMembers
ModerateMembers
ManageMessages
MentionEveryone

Hierarchie-Check

Beim /cc add muss die Ziel-Rolle unter der höchsten Rolle des Erstellers liegen. Sonst könnten Admins mit nicht-Owner-Rollen Commands erstellen, die User über sie selbst hinaus erhöhen.

role.managed blockiert

Bot- und Integration-Rollen (von Discord verwaltet) können nicht getoggelt werden.

Defense-in-Depth

Die Permission-Prüfung läuft doppelt:

  1. Beim /cc add — Command wird abgelehnt, falls die Rolle dangerous ist.
  2. Beim /cmd <name> — bei jedem Aufruf nochmal. Falls jemand der Rolle nachträglich Manager-Rechte gibt, weigert sich der Toggle trotzdem.

Mention-Safety

Alle Replies nutzen allowedMentions: { parse: [] } — kein @everyone/@here möglich, selbst wenn ein Admin sie in den Response geschrieben hat.

Code-Block-Sanitization

/cc info zeigt den Response. Backticks darin werden mit Zero-Width-Spaces neutralisiert, sodass Code-Blöcke nicht aus dem Display-Format ausbrechen können.


Per-Command-Restriction

Mit allowed-role lässt sich ein Command auf User mit einer bestimmten Rolle beschränken:

/cc add name: vipchat type: text response: "Welcome to VIP!" allowed-role: @VIP

Aufruf durch User ohne @VIP → ephemerale Ablehnung.

/cc edit name: vipchat clear-permissions: true entfernt die Restriction wieder.

⚠️ clear-permissions: true zusammen mit allowed-role in einem /cc edit wird mit klarer Fehlermeldung abgelehnt — die beiden Optionen widersprechen sich, der Bot fragt nach genau einer.


Rate-Limit / Race-Conditions

  • Doppelter Name → friendly P2002-Meldung
  • Alle Schreib-Commands sind transactional — kein halb-erstellter State

Beispiele

Server-FAQ

/cc add name: ip type: text response: "Server-IP: play.example.com (1.21.x)"
/cc add name: discord type: text response: "https://discord.gg/example"
/cc add name: shop type: text response: "https://shop.example.com"

Self-Assign-Rolle

/cc add name: announcements type: role-toggle response: "ANNOUNCEMENT_ROLE_ID" description: "Pings für Updates"

User ruft /cmd announcements auf → Rolle wird hinzugefügt/entfernt.

Embed mit Farb-Code

/cc add name: regeln type: embed response: '{"title":"📜 Regeln","description":"1. Sei nett\n2. Kein Spam\n3. Rest siehe #regeln","color":"#FFA500"}'