Configuration
The central config file is configs/config.yml. Token, guildId, module toggles, channels, and roles are all defined here — everything else comes from the per-module YAMLs under configs/modules/.
Note: A
.envfile is no longer needed.DATABASE_URLfalls back tofile:./grumpy.db(SQLite).
config.yml — Full Overview
# Bot credentials
token: "YOUR_BOT_TOKEN"
guildId: "YOUR_SERVER_ID"
# Language for user-facing messages: "de" or "en"
language: "en"
# Optional: user IDs with full bot control
ownerIds: []
# Optional: Discord webhook for crash reports
errorWebhook: ""
# Bot presence — rotating custom activities instead of Discord's auto "In Voice"
presence:
enabled: true
status: "online" # online | idle | dnd | invisible
rotateSeconds: 60 # min 15 s (clamped). Single activity = static.
activities:
- "Watching Minetechworld.de"
- "Listening to TechnoBase.FM"
- "Playing /help"
# Modules — true = active, false = disabled
addons:
welcome: true # Welcome messages, verification, leave messages
mod: true # Moderation, Auto-Mod, Anti-Nuke, Reports, Audit Logger
tickets: true # Ticket system with panels and forms
news: true # News posts via DM
voice: true # Join-to-Create voice channels
music: true # Internet radio (TechnoBase.FM etc.)
help: true # Auto-deployed help hub
customcmd: true # /cc add ... — admin-defined /cmd commands
# Channel IDs — fill in all of these
channels:
welcome: "ID" # Welcome & leave messages
verify: "ID" # Verify panel (auto-posted)
mod-log: "ID" # Mod log + server audit logger
alert: "ID" # Anti-Nuke emergencies
staff: "ID" # Manual mod actions & reports
support: "ID" # Ticket panel fallback
ticket-log: "ID" # Ticket transcripts & summaries
news: "ID" # News posts
voice-lobby: "ID" # Join-to-Create lobby — user joins here, gets their own channel
radio: "ID" # Voice channel for Music passive mode (bot lives here)
help: "ID" # Help hub channel (embed auto-posted)
suggestions: "ID" # Suggestion board (/suggestion submit posts here)
starboard: "ID" # ⭐ Starboard output channel
levelup: "" # Level-up cards ("" = same channel, "dm" = DM, or channel ID)
# Role IDs — fill in all of these
roles:
unverified: "ID" # New members until verified
member: "ID" # After successful verification
support: # Who can manage tickets (multiple allowed)
- "ID" # e.g. Supporter
- "ID" # e.g. Moderator
alert-ping: "" # Role pinged during Anti-Nuke (optional)
⚠️ The
message-ids:section from older versions is no longer used. Panel message IDs are managed in the database (WelcomeState,TicketPanelMessage).
Config Auto-Heal
On startup the bot checks configs/config.yml and adjusts the schema automatically:
- Missing addon toggles (e.g. new modules like
voice,help,customcmd) are added with their defaults. - Missing channel fields (e.g.
voice-lobby,radio,help) are added as empty strings. - Missing
presence:block is filled with default activities — existingconfig.ymlfiles get the block added automatically on the next start. - Deprecated sections like
message-ids:are removed. - Existing values and YAML comments are preserved — the bot uses yaml's
parseDocumentAPI and only merges the schema, not the data.
When the file is updated the console shows a short summary of the changes. This means after a bot update you don't need to manually edit any YAML to enable new modules — just start the bot and fill in the new fields afterwards.
Bot Presence
The presence: block in config.yml replaces Discord's auto-status (e.g. "In Voice Chat") with a custom rotating activity list.
presence:
enabled: true
status: "online" # online | idle | dnd | invisible
rotateSeconds: 60 # min 15 s (clamped)
activities:
- "Watching Minetechworld.de"
- "Listening to TechnoBase.FM"
- "Playing /help"
Activity Format
The verb at the beginning determines the activity type:
| Prefix | Discord Type |
|---|---|
Watching X |
Watching |
Playing X |
Playing |
Listening to X |
Listening (the to is stripped) |
Streaming X |
Streaming |
Competing in X |
Competing (the in is stripped) |
| anything else | Custom Status |
Behaviour
rotateSecondsminimum 15 s (clamped upward if lower). With only one activity the display stays static.enabled: falseor an emptyactivitieslist → the bot lets Discord's default apply (e.g. "In Voice Chat").- Auto-Heal: Existing
config.ymlfiles get thepresence:block added automatically on the next start — comments and values are preserved.
Module Toggles
The addons: section controls which modules are active:
| Key | Module | Function |
|---|---|---|
welcome |
Welcome | Welcome messages, verification, raid protection, leave |
mod |
Moderation | Auto-Mod, Anti-Nuke, Reports, Warns, Audit Logger |
tickets |
Tickets | Multi-panels, forms, ticket management |
news |
News | News posts via admin DM |
voice |
Voice | Join-to-Create voice channels |
music |
Music | Internet radio in voice channel (Interactive + Passive) |
help |
Help | Help hub channel with module dropdown |
customcmd |
CustomCmd | Admin-defined /cmd commands |
reactionroles |
ReactionRoles | Self-service role panels via button/dropdown |
leveling |
Leveling | XP, rank cards, leaderboard, role rewards |
suggestions |
Suggestions | Suggestion system with 👍/👎 and status management |
polls |
Polls | Live polls with buttons |
starboard |
Starboard | ⭐ Highlight the best messages |
Copying IDs
Enable Developer Mode: Discord → Settings → Advanced → Developer Mode ✓
| What | How |
|---|---|
| Channel ID | Right-click a channel → Copy ID |
| Role ID | Server Settings → Roles → right-click a role → Copy ID |
| Server ID | Right-click the server icon → Copy ID |
| User ID | Right-click a user → Copy ID |
Auto-Deployment of Panels
On startup the bot checks:
- Verify panel — is there a message ID in the DB? Is it still in the channel? If not: re-post.
- Ticket panels — same logic for each panel entry in
tickets.yml. If a panel haschannelId: "0"it falls back tochannels.supportfromconfig.yml.
Manual re-deploy is still available:
/welcome setup-verify/tickets setup-panel <panel-id>
Module Configs
Each module has its own YAML file for feature-specific settings:
| File | Contents |
|---|---|
configs/modules/welcome.yml |
Welcome/leave modes (banner / embed / text), banner colours, CAPTCHA, raid protection, verify embed |
configs/modules/mod.yml |
Auto-Mod (spam, caps, ads, …), Anti-Nuke, escalation, report cooldown |
configs/modules/tickets.yml |
Panels, categories, forms, auto-close, rating |
configs/modules/news.yml |
Admin IDs, reactions, session timeout |
configs/modules/voice.yml |
Lobby/category IDs, name template, auto-delete timer, channel limits |
configs/modules/music.yml |
Radio stations (presets), volume, auto-leave, passive mode |
configs/modules/help.yml |
Help embed content, quick-action buttons, optional module descriptions |
configs/modules/reactionroles.yml |
Default colour for new panels |
configs/modules/leveling.yml |
XP range, cooldown, voice XP/min, level-up channel, role rewards, accent colour |
configs/modules/suggestions.yml |
Channel, cooldown, min/max length, vote emojis, staff roles |
configs/modules/polls.yml |
Maximum duration in hours |
configs/modules/starboard.yml |
Emoji, threshold, excluded channels, self-star |
CustomCmd has no YAML — commands are managed entirely via
/cc addin the database.
All YAMLs are created automatically with defaults on first start.
Module channel fallback chain: If
channelIdin a module YAML is empty, the bot falls back to the corresponding entry inconfig.yml:
suggestions.yml: channelId→channels.suggestionsstarboard.yml: channelId→channels.starboardleveling.yml: levelUp.channel→channels.levelup
Setup Status on Startup
When booting the bot displays an overview:
═══════════════════════════════════════════════════════
GrumpyCore — Setup Status
═══════════════════════════════════════════════════════
✅ Connected to: Minetechworld.de (13 members)
Modules: welcome 🟢 mod 🟢 tickets 🟢 news 🟢
Channels: ✅ welcome ✅ verify ✅ mod-log ✅ alert
✅ staff ✅ ticket-log ✅ news
Roles: ✅ unverified ✅ member ✅ support
Panels deployed:
✅ verify-panel msg 1234...
✅ support msg 5678...
═══════════════════════════════════════════════════════
Missing channels/roles are marked with ❌ — add them to config.yml and restart the bot.
GrumpyCore Wiki
⚙️ Setup
🔧 Core-Module
🆕 Neue Module
💬 Commands
👥 Staff
GrumpyCore Wiki (English)
⚙️ Setup
🔧 Core Modules
🆕 New Modules
💬 Commands
👥 Staff