1 GrumpyTickets EN
darksoon edited this page 2026-05-13 21:03:08 +02:00
This file contains invisible Unicode characters

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

  1. User clicks 🎫 Create ticket in the panel channel (or selects a category from the select menu)
  2. If the category has a form: a Discord modal with up to 5 fields opens
  3. Bot creates a private channel under the configured Discord category (parentChannelId)
  4. Permissions: deny @everyone, allow owner + staff roles
  5. Welcome embed with form responses + Claim / Close buttons
  6. Roles from pingRoleIds are pinged
  7. 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 to channels.support from config.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: 15 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.


Ticket-Commands