This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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.
Tickets
Multi-panel ticket system with modal forms, categories, claim flow, HTML/text transcripts, auto-close, ratings, history, transfer, and reopen.
Flow
- User clicks 🎫 Create ticket in the panel channel (or selects a category from the select menu)
- If the category has a form: a Discord modal with up to 5 fields opens
- Bot creates a private channel under the configured Discord category (
parentChannelId) - Permissions: deny @everyone, allow owner + staff roles
- Welcome embed with form responses + Claim / Close buttons
- Roles from
pingRoleIdsare pinged - Open event is logged to
logChannelId
Multiple Panels
You can set up any number of panels in different channels, each with their own categories:
# configs/modules/tickets.yml
panels:
support:
channelId: "0" # "0" → falls back to channels.support from config.yml
layout: "select" # select | buttons
embed:
title: "Support"
description: "Choose a category"
color: "#5865F2"
categories:
help:
label: "General Help"
emoji: "🔧"
parentChannelId: "CATEGORY_ID"
staffRoleIds: ["ROLE_ID"]
pingRoleIds: ["ROLE_ID"]
claimable: true
autoCloseAfterHours: 48
form:
enabled: true
fields:
- label: "What is this about?"
style: "short"
required: true
- label: "Description"
style: "paragraph"
required: true
applications:
channelId: "OTHER_CHANNEL_ID"
...
Auto-Deployment of Panels
On bot start, all enabled panels are automatically posted to their channels (DB-tracked via TicketPanelMessage). If a panel is manually deleted, the bot re-posts it on the next start. Manual redeploy: /tickets setup-panel <panel-id>.
If a panel has
channelId: "0", it falls back tochannels.supportfromconfig.yml— convenient for "just one panel without extra config".
Forms (Modals)
Each category can have a modal with up to 5 fields (short or paragraph). The responses appear as a form block in the ticket's welcome embed.
Max Tickets per User
By default, a user can only have one open ticket at a time. Configurable via:
maxOpenTicketsPerUser: 1
In-Ticket Buttons
| Button | Who | Function |
|---|---|---|
| Claim / Unclaim | Category staff (when claimable: true) |
Claim or release a ticket |
| Close | Owner or category staff | Modal with optional reason → closes the ticket |
The close button checks permissions — only the owner and category staff (per staffRoleIds) can close.
Auto-Close
autoClose:
enabled: true
checkIntervalMinutes: 30
- Per category:
autoCloseAfterHours: 48(hours since last message).0= disabled. - Activity tracking: every message in the ticket channel updates
lastActivityAt(in-memory cache reduces DB hits on non-ticket channels). - Runner executes every
checkIntervalMinutes— and once on bot start (catches up after restarts). - Auto-close uses the same close flow as a manual close: transcript, log embed, channel deletion, rating prompt.
Transfer
/ticket transfer <category-id>
Moves the current ticket to a different category within the same panel. The channel is re-parented under the new category's parentChannelId. lastActivityAt is updated in the process.
Permission: Category staff
Reopen
/tickets reopen <id>
Recreates a channel for an already-closed ticket. The owner, category, permissions, and form responses are restored — the ticket is considered open again, and a notice is sent to the log channel.
Permission: Manager (or category staff)
Force-Close
/tickets force-close <id> [reason]
Closes a ticket from outside the ticket channel (you don't need to be in it). Also works if the channel was already deleted in the meantime — the database entry is cleanly finalized.
Transcript & Rating
On close:
- HTML and text transcript is uploaded to
transcriptChannelId(fallback:logChannelId) - Owner receives a summary (DM or in-channel, configurable)
- 5-star rating prompt: 1️⃣–5️⃣ buttons, one rating per ticket
rating:
enabled: true
dmOwner: true
promptTitle: "How satisfied were you?"
thanksMessage: "Thank you for your feedback!"
The rating is posted in the log channel as a ⭐ Ticket rated embed and included in the HTML transcript header (if submitted before channel deletion — otherwise visible in /tickets history).
History
/tickets history <user>
Shows all tickets for a user (newest first, 🟢 open / ⚫ closed) with category, date, and rating.
GrumpyCore Wiki
⚙️ Setup
🔧 Core-Module
🆕 Neue Module
💬 Commands
👥 Staff
GrumpyCore Wiki (English)
⚙️ Setup
🔧 Core Modules
🆕 New Modules
💬 Commands
👥 Staff