> For the complete documentation index, see [llms.txt](https://docs.drakodevelopment.net/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.drakodevelopment.net/core-features/ticket-system.md).

# Ticket System

The ticket system is a complete support solution, offering:

* Multiple ticket types
* Thread mode support
* Role-based priorities
* Working hours
* Claiming, auto-claim & auto-unclaim
* Close requests
* Watchers (DM notifications)
* Staff mention alerts
* Blacklisting (permanent & temporary)
* Bulk operations
* Transcripts (TXT & Web)
* Closure messages & reviews
* Ticket statistics & staff performance
* Detailed logging
* Multi-guild support
* Components V2 (rich message layouts)

## Core Settings

### General Setup

```yaml
TicketSettings:
  Enabled: false
  LogsChannelID: ["CHANNEL_ID"]
  MaxTickets: 1
  DeletionTime: "3s"
  useSelectMenu: true
  overFlow: ["CATEGORY_ID", "CATEGORY_ID"]
  UseThreads: false
  ThreadChannelID: ["CHANNEL_ID"]
```

| Option            | Description                                                   |
| ----------------- | ------------------------------------------------------------- |
| `Enabled`         | Master switch for the ticket system                           |
| `LogsChannelID`   | Channel(s) where all ticket events are logged (one per guild) |
| `MaxTickets`      | Limit how many tickets a single user can have at once         |
| `DeletionTime`    | Delay before a ticket is fully deleted after closure          |
| `useSelectMenu`   | `true` = dropdown menus, `false` = buttons                    |
| `overFlow`        | Backup categories if the main one reaches 50 channels         |
| `UseThreads`      | Create tickets as private threads instead of channels         |
| `ThreadChannelID` | Text/forum channel where threads are created (one per guild)  |

### Multi-Guild Support

Arrays like `LogsChannelID: ["id1", "id2"]` allow the bot to work in multiple guilds. Add one channel/category ID per guild — the bot automatically finds and uses the one that exists in the current guild.

### Thread Mode

When `UseThreads` is enabled, tickets are created as private threads instead of channels. `CategoryID`, `overFlow`, and `ArchiveCategory` per ticket type are ignored in this mode.

## Delayed Response System

Warns users when many tickets are open.

```yaml
DelayedResponse:
  Enabled: false
  TicketThreshold: 25
  Components:
    - Type: container
      AccentColor: "#FFA500"
      Components:
        - Type: section
          Text:
            Content:
              - "# 🎫 High Support Volume Notice"
              - "⚠️ We are currently experiencing higher than usual ticket volume."
              - "## Current Status"
              - "> 📊 **Active Tickets:** {openTickets}"
              - "> ⏱️ **Est. Response Time:** 24-48 hours"
```

| Option            | Description                                                                      |
| ----------------- | -------------------------------------------------------------------------------- |
| `TicketThreshold` | When this many open tickets exist, the warning is shown                          |
| `Components`      | Fully customizable Components V2 layout (placeholders like `{openTickets}` work) |

## Close Reasons

```yaml
CloseReasons:
  Enabled: true
  DefaultReason: "No reason provided"
  AllowCustomReason: true
  Reasons:
    - name: "Issue Resolved"
      emoji: "✅"
      value: "resolved"
    - name: "User Request"
      emoji: "👋"
      value: "user_request"
    - name: "Inactive"
      emoji: "⏰"
      value: "inactive"
    - name: "Invalid"
      emoji: "❌"
      value: "invalid"
```

Adds preset closure reasons staff can pick from a menu. `AllowCustomReason` lets staff write their own reason via the `custom_reason` option.

## Close Request System

Allows staff to request the ticket creator to close the ticket. The user can accept or decline.

```yaml
CloseRequest:
  Enabled: true
  DefaultReason: "Issue has been resolved"
  AutoCloseOnAccept: true

  Components:
    - Type: container
      AccentColor: "#FFA500"
      Components:
        - Type: text_display
          Content:
            - "# 📩 Close Request"
            - "Hey {user}!"
            - "**{staff}** has requested to close this ticket."
            - "**Reason:** {reason}"

  Buttons:
    Accept:
      Label: "Accept & Close"
      Emoji: "✅"
      Style: "Success"
    Decline:
      Label: "Decline"
      Emoji: "❌"
      Style: "Secondary"

  Messages:
    Accepted: "Close request accepted by {user}. Closing ticket..."
    Declined: "Close request declined by {user}. Staff will continue to assist."
    DeclinedStaff: "{user} has declined the close request. Please continue assisting them."
```

| Option              | Description                                                    |
| ------------------- | -------------------------------------------------------------- |
| `AutoCloseOnAccept` | Automatically close the ticket when the user accepts           |
| `Buttons`           | Customize the accept/decline button labels, emojis, and styles |
| `Messages`          | Customize the confirmation messages                            |

### Placeholders

| Placeholder | Description                           |
| ----------- | ------------------------------------- |
| `{user}`    | The ticket creator                    |
| `{staff}`   | The staff member who sent the request |
| `{reason}`  | The close request reason              |

## Staff Mention Alert

Alerts users when they mention a staff member who is offline, idle, or in DND.

```yaml
StaffMentionAlert:
  Enabled: true
  AlertStatuses: ["offline", "idle", "dnd"]
  EmbedColor: "#FFA500"
  ShowAlternatives: true
  AlternativesTitle: "🟢 Available Staff"
  Messages:
    Offline: "⚠️ {staff} is currently **offline** and may not see your message right away."
    Idle: "⚠️ {staff} is currently **away** and may take longer to respond."
    DND: "⚠️ {staff} has **Do Not Disturb** enabled and may not respond immediately."
```

| Option             | Description                                      |
| ------------------ | ------------------------------------------------ |
| `AlertStatuses`    | Which statuses trigger the alert                 |
| `ShowAlternatives` | Show a list of currently available staff members |
| `Messages`         | Customizable messages per status type            |

## Priority System

```yaml
Priority:
  Enabled: true
  DefaultPriority: "Low"

  Levels:
    Low:
      Roles: ["ROLE_ID"]
      Tag: ["ROLE_ID"]
      MoveTop: false
    Medium:
      Roles: ["ROLE_ID"]
      Tag: ["ROLE_ID"]
      MoveTop: true
    High:
      Roles: ["ROLE_ID"]
      Tag: ["ROLE_ID"]
      MoveTop: true
```

| Option    | Description                                       |
| --------- | ------------------------------------------------- |
| `Levels`  | Low / Medium / High (add more if needed)          |
| `Roles`   | Who gets assigned this priority                   |
| `Tag`     | Roles to ping when tickets open                   |
| `MoveTop` | Moves priority tickets to the top of the category |

## Working Hours

```yaml
WorkingHours:
  Enabled: false
  Timezone: Europe/London
  NonWorkingDays: ["Saturday", "Sunday"]
  Schedule:
    Monday: "16:00-22:00"
    Tuesday: "16:00-22:00"
  allowOpenTickets: true
```

| Option             | Description                                                                    |
| ------------------ | ------------------------------------------------------------------------------ |
| `Timezone`         | Must be IANA format (e.g. `America/New_York`)                                  |
| `Schedule`         | Define start/end times per day in 24h format                                   |
| `NonWorkingDays`   | Days with no support                                                           |
| `allowOpenTickets` | Allow tickets outside hours? If yes, a warning embed (`WorkingEmbed`) is shown |

### Working Hours Placeholders

These can be used in panel components:

| Placeholder                        | Description                       |
| ---------------------------------- | --------------------------------- |
| `{workinghours_start}`             | Today's start time                |
| `{workinghours_end}`               | Today's end time                  |
| `{workinghours_start_monday}`      | Monday's start time               |
| `{workinghours_end_monday}`        | Monday's end time                 |
| `{workinghours_start_tuesday}` ... | Per-day placeholders for all days |

## Ticket Panels

Panels are what users see when opening tickets.

```yaml
TicketPanelSettings:
  Panel1:
    Components:
      - Type: container
        AccentColor: "#1769FF"
        Components:
          - Type: text_display
            Content:
              - "# 📩 Support Tickets"
              - "Please select a category below for assistance."
```

You can create multiple panels (`Panel1`, `Panel2`...). Each panel controls how ticket buttons/menus look.

### Inline Ticket Components

You can embed ticket buttons or select menus directly inside containers using placeholders:

* `{button_TicketType1}` or `{button_TicketType1,TicketType2}` — Embeds ticket buttons
* `{selectmenu_TicketType1}` or `{selectmenu_TicketType1,TicketType2}` — Embeds a select menu

When using these placeholders, the default select menu / buttons below the container will NOT be added.

## Ticket Transcripts

```yaml
TicketTranscript:
  Type: TXT
  Save: true
  MinMessages: "1"
  SavePath: ./transcripts/
```

| Option        | Description                                                |
| ------------- | ---------------------------------------------------------- |
| `Type`        | `TXT` (file attachment) or `WEB` (web dashboard link)      |
| `Save`        | Save transcripts to disk                                   |
| `MinMessages` | Minimum messages required before a transcript is generated |
| `SavePath`    | Directory to save transcript files                         |

## Ticket Creation Templates

````yaml
TicketCreation:
  Default:
    Followup:
      Message: "Thank you {user} for reaching out! Please describe your issue in detail."
    Components:
      - Type: container
        AccentColor: "#1769FF"
        Components:
          - Type: section
            Text:
              Content:
                - "# 🎫 New Support Ticket"
                - "Welcome to our Support System, {user}!"
                - "**Ticket Type:** {ticketType}"
                - "**Claimed By:** {claimer}"
                - "{questions}"
            Accessory:
              Type: thumbnail
              Media:
                URL: "{userIcon}"
    QuestionFormat:
      - "**{question}**"
      - "```{answer}```"
````

Defines the first message inside the ticket. You can make ticket-type-specific templates (`TicketType1`, `TicketType2`).

### Features

* **Followup** — Sends an additional message after the ticket creation embed
* **Components** — Rich Components V2 layout
* **QuestionFormat** — Defines how questions/answers are formatted in the ticket

### Placeholders

| Placeholder    | Description                                                  |
| -------------- | ------------------------------------------------------------ |
| `{user}`       | Mentions the ticket creator                                  |
| `{ticketType}` | Name of the ticket type                                      |
| `{claimer}`    | Staff member who claimed the ticket                          |
| `{questions}`  | Displays answered questions (formatted via `QuestionFormat`) |
| `{userIcon}`   | The user's avatar URL                                        |
| `{guild}`      | The server name                                              |
| `{guildIcon}`  | The server icon URL                                          |

## Ticket Types

Each type is its own config block.

```yaml
TicketTypes:
  TicketType1:
    Enabled: true
    Panel: "Panel1"
    Name: "General Support"
    ChannelName: "{ticket-id}-General-{user}-{priority}"
    ChannelTopic: "Category: {ticketType} | User: {userid} | Priority: {priority}"
    CategoryID: ["CATEGORY_ID"]
    AutoAlert: "12h"
    ArchiveCategory: ["CATEGORY_ID"]
    SupportRole: ["ROLE_ID"]
    UserRole: ["ROLE_ID"]
    TagSupport: false
    TagCreator: true
    RestrictDeletion: false
    Claiming:
      Enabled: true
      AutoClaim: true
      Button:
        Name: "Claim Ticket"
        Emoji: "🎫"
        Style: "Secondary"
      RestrictResponse: true
      RestrictView: true
      AnnounceClaim: true
      AutoUnclaim:
        Enabled: true
        InactiveTime: "2h"
        NotifyChannel: true
    Button:
      Name: "General Support"
      Emoji: "🔍"
      Style: "Danger"
      Description: "Open to receive general support"
```

| Option             | Description                                                |
| ------------------ | ---------------------------------------------------------- |
| `Panel`            | Which panel it belongs to                                  |
| `ChannelName`      | Ticket channel name (supports placeholders)                |
| `ChannelTopic`     | Channel topic (supports placeholders)                      |
| `CategoryID`       | Category for ticket channels (one per guild)               |
| `AutoAlert`        | Automatically send an inactivity alert after this duration |
| `ArchiveCategory`  | Category to move tickets to when archived                  |
| `SupportRole`      | Roles that can access and manage tickets                   |
| `UserRole`         | Roles that can open this ticket type                       |
| `TagSupport`       | Ping support roles when ticket opens                       |
| `TagCreator`       | Ping the ticket creator in the ticket                      |
| `RestrictDeletion` | Only support roles can close (users cannot)                |

### ChannelName Placeholders

| Placeholder   | Description          |
| ------------- | -------------------- |
| `{ticket-id}` | Unique ticket number |
| `{user}`      | Username             |
| `{priority}`  | Priority level       |

### ChannelTopic Placeholders

| Placeholder    | Description      |
| -------------- | ---------------- |
| `{ticketType}` | Ticket type name |
| `{userid}`     | User mention     |
| `{priority}`   | Priority level   |
| `{ticket-id}`  | Ticket ID        |
| `{created-at}` | Creation date    |
| `{category}`   | Category name    |

### Claiming System

| Option                      | Description                                                        |
| --------------------------- | ------------------------------------------------------------------ |
| `Enabled`                   | Enable/disable claiming for this type                              |
| `AutoClaim`                 | First staff member to type automatically claims                    |
| `RestrictResponse`          | Only the claimer can respond until unclaimed                       |
| `RestrictView`              | Only the ticket owner and claimer can view the ticket when claimed |
| `AnnounceClaim`             | Post a message in the channel when claimed/unclaimed               |
| `AutoUnclaim.Enabled`       | Auto-unclaim if staff hasn't responded                             |
| `AutoUnclaim.InactiveTime`  | How long until ticket is auto-unclaimed                            |
| `AutoUnclaim.NotifyChannel` | Send a message when auto-unclaiming                                |

## Questions

You can add questions to any ticket type. Questions can be text inputs or select menus.

### Text Input

```yaml
Questions:
  - PurchaseID:
      Question: "Do you have a transaction ID?"
      Placeholder: "TBX-wdUGVApxKSMXham"
      Style: "Short"
      Required: false
      maxLength: 1000
```

| Option        | Description                                      |
| ------------- | ------------------------------------------------ |
| `Question`    | The question text                                |
| `Placeholder` | Example text shown in the input                  |
| `Style`       | `"Short"` (1 line) or `"Paragraph"` (multi-line) |
| `Required`    | `true` / `false`                                 |
| `maxLength`   | Character limit                                  |

### Select Menu

```yaml
Questions:
  - IssueType:
      Type: "StringSelect"
      Question: "What type of issue are you experiencing?"
      Description: "Please select the category that best describes your issue"
      Placeholder: "Choose an issue type..."
      Required: true
      Options:
        - Label: "Bug Report"
          Value: "bug"
          Description: "Something isn't working as expected"
          Emoji: "🐛"
        - Label: "Other"
          Value: "other"
          Description: "Something else not listed above"
          Emoji: "❓"
```

| Option        | Description                                        |
| ------------- | -------------------------------------------------- |
| `Type`        | `"StringSelect"`                                   |
| `Question`    | Text shown above dropdown                          |
| `Description` | Helper text (optional)                             |
| `Placeholder` | Text when no option is selected                    |
| `Required`    | `true` / `false`                                   |
| `Options`     | List of choices (Label, Value, Description, Emoji) |

## Alerts

```yaml
Alert:
  Enabled: true
  Time: "12h"
  DM:
    Enabled: true
    LogFailures: false
    Components:
      - Type: container
        AccentColor: "#FF0000"
        Components:
          - Type: text_display
            Content:
              - "# ⚠️ Ticket Alert"
              - "Hello {user}"
              - "> **Time Until Close:** {time}"
              - "> **Reason:** {reason}"
    Button:
      Label: "Go to Ticket"
      Emoji: "🎫"
  Embed:
    Title: "Support Ticket Notice"
    Description:
      - "> **User:** {user}"
      - "> **Time Until Close:** {time}"
      - "> **Reason:** {reason}"
    Button:
      Label: "Close Ticket"
      Emoji: "🔒"
      Style: "Danger"
```

| Option           | Description                                        |
| ---------------- | -------------------------------------------------- |
| `Time`           | Duration before the ticket auto-closes after alert |
| `DM.Enabled`     | Send alert via DM                                  |
| `DM.LogFailures` | Log in the ticket channel when DM fails            |
| `DM.Components`  | Components V2 layout for DM alerts                 |
| `Embed`          | Fallback embed layout for in-channel alert         |
| `Embed.Button`   | Close button displayed under the alert             |

Alerts can be sent manually via `/tickets alert` or automatically via `AutoAlert` on ticket types. The alert auto-cancels when the ticket creator responds.

## Ticket Closure DM

```yaml
TicketClosureDM:
  Enabled: true
  Transcript: true
  Components:
    - Type: container
      AccentColor: "#1769FF"
      Components:
        - Type: section
          Text:
            Content:
              - "# Ticket Closure Notification"
              - "{userTag}, your ticket in {guild} has been closed."
              - "**Ticket Summary**"
              - "> **Messages:** {messageCount}"
              - "> **Priority:** {priority}"
              - "> **Handled By:** {claimer}"
              - "> **Close Reason:** {reason}"
```

Sends users a DM when their ticket closes. Includes a summary, optional transcript attachment, and review button.

### Placeholders

| Placeholder      | Description                         |
| ---------------- | ----------------------------------- |
| `{userTag}`      | The user's mention                  |
| `{guild}`        | Server name                         |
| `{messageCount}` | Total messages in the ticket        |
| `{priority}`     | Ticket priority level               |
| `{claimer}`      | Staff member who handled the ticket |
| `{reason}`       | Closure reason                      |

## Watchers

Staff members can watch tickets to receive DM notifications on all activity.

### Commands

| Command             | Description                       |
| ------------------- | --------------------------------- |
| `/tickets watch`    | Start watching the current ticket |
| `/tickets unwatch`  | Stop watching                     |
| `/tickets watchers` | View all watchers                 |

### Events Watched

Watchers are notified via DM for:

* New messages
* Ticket claimed/unclaimed
* Priority changes
* Users added/removed
* Alerts sent
* Ticket closing
* Close requests

### Configuration

```yaml
WatcherNotifications:
  Message:
    Components:
      - Type: container
        AccentColor: "#5865F2"
        Components:
          - Type: text_display
            Content:
              - "## 💬 New Message"
              - "**Author:** <@{authorId}>"
              - "**Message:** {content}"
          - Type: text_display
            Content: "-# Ticket #{ticketId} • {guildName}"
  Claimed:
    # ...
  Unclaimed:
    # ...
  Priority:
    # ...
  UserAdded:
    # ...
  UserRemoved:
    # ...
  Alert:
    # ...
  Closing:
    # ...
  CloseRequest:
    # ...
```

Each event type has its own customizable Components V2 template with relevant placeholders.

## Blacklist System

Prevent specific users from opening tickets.

### Commands

| Command                                                        | Description                            |
| -------------------------------------------------------------- | -------------------------------------- |
| `/tickets blacklist add <user> [reason]`                       | Permanently blacklist a user           |
| `/tickets blacklist addtemp <user> <duration> <unit> [reason]` | Temporarily blacklist                  |
| `/tickets blacklist remove <user>`                             | Remove from blacklist                  |
| `/tickets blacklist view <user>`                               | View blacklist info                    |
| `/tickets blacklist list`                                      | View all blacklisted users (paginated) |

### Temporary Blacklists

Temporary blacklists support units: Minutes, Hours, Days, Weeks. They expire automatically.

### Configuration

All blacklist notifications are customizable via `TicketNotifications.Blacklist`:

```yaml
TicketNotifications:
  Blacklist:
    Added:
      Components: [...]
    View:
      Components: [...]
    Removed:
      Components: [...]
    TempAdded:
      Components: [...]
```

## Archive Design

When a ticket is closed, it can be moved to an archive category with action buttons.

```yaml
ArchiveDesign:
  Buttons:
    "1":
      Name: "Reopen"
      Emoji: "🟩"
      Style: "Primary"
      Type: "REOPEN"
    "2":
      Name: "Transcript"
      Emoji: "📜"
      Style: "Secondary"
      Type: "TRANSCRIPT"
    "3":
      Name: "Delete"
      Emoji: "🗑️"
      Style: "Danger"
      Type: "DELETE"
  Components:
    - Type: container
      AccentColor: "#2B2D31"
      Components:
        - Type: section
          Text:
            Content:
              - "# Ticket Archived"
              - "> **Creator:** {userTag}"
              - "> **Reason:** {reason}"
```

## User Left Design

Displayed when the ticket creator leaves the server.

```yaml
UserLeftDesign:
  Components:
    - Type: container
      AccentColor: "#1769FF"
      Components:
        - Type: section
          Text:
            Content:
              - "# User Alert"
              - "The creator of this ticket, **{user}** has left the server."
          Accessory:
            Type: thumbnail
            Media:
              URL: "{userIcon}"
  Button:
    Name: "Delete Ticket"
    Emoji: "⛔"
    Style: Secondary
```

## Ticket Notifications

All in-ticket notifications are customizable via Components V2:

```yaml
TicketNotifications:
  UserAdded:
    Components: [...]
  UserRemoved:
    Components: [...]
  Renamed:
    Components: [...]
  Transferred:
    Components: [...]
  PriorityChanged:
    Components: [...]
  AlertCancelled:
    Components: [...]
  Watch:
    Components: [...]
  CloseRequestSent:
    Components: [...]
  Blacklist:
    Added: [...]
    View: [...]
    Removed: [...]
    TempAdded: [...]
```

## Reviews

The review system lets users rate their support experience after a ticket is closed. They receive a DM with a **Leave a Review** button, which opens a modal with rating questions.

````yaml
Reviews:
  Enabled: false
  ChannelID: ["CHANNEL_ID"]
  Placeholder: "Rate us!"
  ButtonEmoji: "⭐"
  ButtonStyle: "Secondary"

  Questions:
    1:
      ID: "support_quality"
      Label: "Support Quality (1-5)"
      Description: "Rate the quality of support you received"
      Required: true
      Options:
        - Label: "Very Poor"
          Value: "1"
          Emoji: "😞"
        - Label: "Excellent"
          Value: "5"
          Emoji: "😍"

  FeedbackInput:
    Enabled: true
    Label: "Additional Feedback"
    Placeholder: "Please share any additional thoughts or suggestions..."
    Style: "Paragraph"
    Required: false
    MaxLength: 1000

  Components:
    - Type: container
      AccentColor: "#FFD700"
      Components:
        - Type: section
          Text:
            Content:
              - "# ⭐ Ticket Review"
              - "**Ticket Information**"
              - "> **Creator:** {ticketCreator}"
              - "> **Ticket:** {channelName}"
              - "> **Handled By:** {claimer}"
              - "**Ratings**"
              - "{ratings}"
              - "**Additional Feedback**"
              - "```{feedback}```"
````

| Option        | Description                                        |
| ------------- | -------------------------------------------------- |
| `ChannelID`   | Channel to post review summaries (one per guild)   |
| `Placeholder` | Button text in closure DMs                         |
| `ButtonEmoji` | Emoji on the review button                         |
| `ButtonStyle` | Button color (Primary, Secondary, Success, Danger) |
| `Components`  | Review summary posted to the reviews channel       |

### Questions

You can add up to **4 questions** (Discord's modal limit). Each question has:

| Option        | Description                         |
| ------------- | ----------------------------------- |
| `ID`          | Unique name (used in logs/database) |
| `Label`       | The question text                   |
| `Description` | Helper text shown under the label   |
| `Options`     | The ratings (Label, Value, Emoji)   |

### Feedback Input

Optional text box where users can write suggestions or comments.

### How It Works

1. User closes a ticket → receives a DM with the **Leave a Review** button
2. Clicking opens a modal with rating questions (and optional feedback)
3. Ratings + comments are saved
4. Review data is posted to the reviews channel and added to ticket logs

## Bulk Operations

Staff can perform mass actions on tickets.

| Command                        | Description                                      |
| ------------------------------ | ------------------------------------------------ |
| `/tickets bulk close [reason]` | Close all open tickets in the server             |
| `/tickets bulk delete`         | Delete all closed/archived tickets in the server |

Requires Administrator permission or any ticket support role. Operations are throttled (1.5s between each) to avoid rate limits.

## Ticket Statistics

`/tickets stats` provides detailed analytics:

* **Current Status** — Total, open, closed, deleted, claimed, unclaimed counts
* **Recent Activity** — Tickets created/closed in last 24h, 7d, 30d
* **Priority Distribution** — Breakdown by priority level
* **Ticket Type Distribution** — Breakdown by type
* **Rating Statistics** — Average rating, distribution
* **Response Metrics** — Average/fastest/slowest first response and resolution times
* **Staff Performance** — Top 5 staff by tickets claimed and resolution rate
* **Peak Activity Hours** — Busiest hours for ticket creation

## Commands Reference

| Command                                                        | Description                        |
| -------------------------------------------------------------- | ---------------------------------- |
| `/tickets panel <panel>`                                       | Send a ticket panel                |
| `/tickets close [reason] [custom_reason] [silent]`             | Close the current ticket           |
| `/tickets add <user>`                                          | Add a user to the ticket           |
| `/tickets remove <user>`                                       | Remove a user from the ticket      |
| `/tickets rename <name>`                                       | Rename the ticket channel          |
| `/tickets transfer <type>`                                     | Transfer ticket to another type    |
| `/tickets priority <level>`                                    | Change ticket priority             |
| `/tickets alert [reason]`                                      | Send an inactivity alert           |
| `/tickets cancel-alert`                                        | Cancel an active alert             |
| `/tickets closerequest [reason]`                               | Request the creator to close       |
| `/tickets watch`                                               | Watch for DM notifications         |
| `/tickets unwatch`                                             | Stop watching                      |
| `/tickets watchers`                                            | View all watchers                  |
| `/tickets stats`                                               | View ticket statistics             |
| `/tickets blacklist add <user> [reason]`                       | Blacklist a user                   |
| `/tickets blacklist addtemp <user> <duration> <unit> [reason]` | Temp blacklist                     |
| `/tickets blacklist remove <user>`                             | Remove from blacklist              |
| `/tickets blacklist view <user>`                               | View blacklist info                |
| `/tickets blacklist list`                                      | View all blacklisted users         |
| `/tickets bulk close [reason]`                                 | Close all open tickets             |
| `/tickets bulk delete`                                         | Delete all closed/archived tickets |

## Logs

```yaml
Logs:
  Close:
    Embed:
      Title: "**Ticket Closure**"
      Description:
        - "> Ticket has been closed by {userTag}."
        - "> **Reason:** {reason}"
        - "> **Creator:** {ticketCreator}"
        - "> **Messages:** {messageCount}"
        - "> **Priority:** {priority}"
        - "> **Claimed By:** {claimer}"
        - "> {channelName}"
    ReviewFormat:
      AverageRating: "Average Rating"
      Rating: "Rating"
      Review: "Review"
      AdditionalFeedback: "Additional Feedback"
      NoRating: "No Rating Yet"
      CloseReason: "Close Reason"
```

Logs support both Components V2 (`Logs.Close.Components`) and traditional embeds (`Logs.Close.Embed`).

## Components V2

All message templates in the ticket system support Discord's Components V2 layout format. This allows rich layouts with:

* `container` — Colored accent containers
* `text_display` — Text blocks (supports markdown)
* `section` + `Accessory` — Text with thumbnail images
* `separator` — Visual dividers
* `media_gallery` — Image galleries
* `action_row` — Button rows

{% hint style="success" %}
Use <https://builder.drako.gg/> to generate containers
{% endhint %}
