Table of Contents
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, Ziffern0-9,_,- - Max 32 Zeichen
- Eindeutig pro Server (Duplicate → P2002-Fehler mit freundlicher Meldung)
- Anti-Spoofing-Sanitization:
nameunddescriptionwerden automatisch von RTL-Override- und Zero-Width-Zeichen befreit, bevor sie gespeichert werden — verhindert Spoofing-Tricks (z.B.adminrü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:
- Beim
/cc add— Command wird abgelehnt, falls die Rolle dangerous ist. - 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: truezusammen mitallowed-rolein einem/cc editwird 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"}'
GrumpyCore Wiki
⚙️ Setup
🔧 Core-Module
🆕 Neue Module
💬 Commands
👥 Staff
GrumpyCore Wiki (English)
⚙️ Setup
🔧 Core Modules
🆕 New Modules
💬 Commands
👥 Staff