3 GrumpyTickets
darksoon edited this page 2026-05-05 21:24:01 +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-Ticketsystem mit Modal-Forms, Kategorien, Claim-Flow, HTML-/Text-Transcripts, Auto-Close, Rating, History, Transfer und Reopen.


Ablauf

  1. User klickt im Panel-Channel 🎫 Ticket erstellen (oder wählt eine Kategorie aus dem Select-Menu)
  2. Hat die Kategorie ein Form: ein Discord-Modal mit bis zu 5 Eingaben öffnet sich
  3. Bot erstellt einen privaten Channel unter der konfigurierten Discord-Kategorie (parentChannelId)
  4. Permissions: deny @everyone, allow Owner + Staff-Rollen
  5. Welcome-Embed mit Form-Antworten + Claim / Close-Buttons
  6. Roles aus pingRoleIds werden gepingt
  7. Open-Event geht in logChannelId

Mehrere Panels

Es können beliebig viele Panels in unterschiedlichen Channels eingerichtet werden, jeweils mit eigenen Kategorien:

# configs/modules/tickets.yml
panels:
  support:
    channelId: "0"             # "0" → fällt auf channels.support aus config.yml zurück
    layout: "select"           # select | buttons
    embed:
      title: "Support"
      description: "Wähle eine Kategorie"
      color: "#5865F2"
    categories:
      help:
        label: "Allgemeine Hilfe"
        emoji: "🔧"
        parentChannelId: "CATEGORY_ID"
        staffRoleIds: ["ROLE_ID"]
        pingRoleIds: ["ROLE_ID"]
        claimable: true
        autoCloseAfterHours: 48
        form:
          enabled: true
          fields:
            - label: "Worum geht es?"
              style: "short"
              required: true
            - label: "Beschreibung"
              style: "paragraph"
              required: true

  bewerbung:
    channelId: "OTHER_CHANNEL_ID"
    ...

Auto-Deployment der Panels

Beim Bot-Start werden alle aktivierten Panels automatisch in ihre Channels gepostet (DB-tracked via TicketPanelMessage). Wird ein Panel manuell gelöscht, postet der Bot beim nächsten Start neu. Manuelles Re-Deploy: /tickets setup-panel <panel-id>.

Hat ein Panel channelId: "0", wird auf channels.support aus der config.yml zurückgegriffen — praktisch für „nur ein Panel ohne extra Config".


Forms (Modals)

Pro Kategorie kann ein Modal mit bis zu 5 Feldern konfiguriert werden (short oder paragraph). Die Antworten erscheinen als Form-Block im Welcome-Embed des Tickets.


Max Tickets pro User

Standardmäßig kann ein User nur ein offenes Ticket gleichzeitig haben. Konfigurierbar via:

maxOpenTicketsPerUser: 1

In-Ticket Buttons

Button Wer Funktion
Claim / Unclaim Category-Staff (wenn claimable: true) Ticket übernehmen / freigeben
Close Owner oder Category-Staff Modal mit optionalem Grund → schließt das Ticket

Der Close-Button prüft die Berechtigung — nur Owner und Category-Staff (laut staffRoleIds) können schließen.


Auto-Close

autoClose:
  enabled: true
  checkIntervalMinutes: 30
  • Pro Kategorie: autoCloseAfterHours: 48 (Stunden seit letzter Nachricht). 0 = deaktiviert.
  • Activity-Tracking: jede Nachricht im Ticket-Channel updatet lastActivityAt (in-memory Cache spart DB-Hits auf Nicht-Ticket-Channels).
  • Runner läuft alle checkIntervalMinutes Minuten — und einmal beim Bot-Start (catch-up nach Restarts).
  • Auto-Close benutzt denselben Close-Flow wie ein manueller Close: Transcript, Log-Embed, Channel-Delete, Rating-Prompt.

Transfer

/ticket transfer <category-id>

Verschiebt das aktuelle Ticket in eine andere Kategorie desselben Panels. Channel wird re-parented unter den parentChannelId der neuen Kategorie. lastActivityAt wird dabei aktualisiert.

Berechtigung: Category-Staff


Reopen

/tickets reopen <id>

Recreated einen Channel für ein bereits geschlossenes Ticket. Owner, Kategorie, Permissions und Form-Antworten werden übernommen — das Ticket gilt wieder als offen, ein Notice geht in den Log-Channel.

Berechtigung: Manager (oder Category-Staff)


Force-Close

/tickets force-close <id> [reason]

Schließt ein Ticket von außerhalb (man muss nicht im Ticket-Channel sein). Funktioniert auch wenn der Channel zwischenzeitlich gelöscht wurde — der DB-Eintrag wird sauber finalisiert.


Transcript & Rating

Beim Schließen:

  • HTML- und Text-Transcript wird in transcriptChannelId (Fallback: logChannelId) hochgeladen
  • Owner bekommt eine Zusammenfassung (DM oder im Channel, konfigurierbar)
  • 5-Sterne-Rating-Prompt: 15 Buttons, ein Rating pro Ticket
rating:
  enabled: true
  dmOwner: true
  promptTitle: "Wie zufrieden warst du?"
  thanksMessage: "Danke für dein Feedback!"

Das Rating wird im Log-Channel als ⭐ Ticket rated-Embed gepostet und in den HTML-Transcript-Header übernommen (sofern vor Channel-Delete abgegeben — sonst sichtbar in /tickets history).


History

/tickets history <user>

Zeigt alle Tickets eines Users (neueste zuerst, 🟢 offen / geschlossen) mit Kategorie, Datum und Rating.


Ticket-Commands