apps/bot/src/commands/ticket.ts (view raw)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 |
import { Subcommand } from "@sapphire/plugin-subcommands";
import { ApplyOptions } from "@sapphire/decorators";
import { container } from "@sapphire/framework";
@ApplyOptions<Subcommand.Options>({
description: "ticket-related commands",
})
export class TicketCommand extends Subcommand {
public constructor(context: Subcommand.LoaderContext, options: Subcommand.Options) {
super(context, {
...options,
name: "ticket",
subcommands: [
{ name: "new", chatInputRun: "createTicket" },
{ name: "for", chatInputRun: "createTicketFor" },
{
name: "actions",
type: "group",
entries: [
{ name: "open", chatInputRun: "openTicket" },
{ name: "close", chatInputRun: "closeTicket" },
{ name: "add", chatInputRun: "addToTicket" },
{ name: "claim", chatInputRun: "claimTicket" },
{ name: "unclaim", chatInputRun: "unclaimTicket" },
{ name: "delete", chatInputRun: "deleteTicket" },
],
},
{
name: "view",
type: "group",
entries: [
{ name: "info", chatInputRun: "viewTicketInfo" },
{ name: "transcript", chatInputRun: "viewTicketTranscript" },
{ name: "list", chatInputRun: "listTickets" },
{ name: "export", chatInputRun: "exportTickets" },
],
},
],
});
}
public override registerApplicationCommands(registry: Subcommand.Registry) {
registry.registerChatInputCommand((builder) =>
builder
.setName("ticket")
.setDescription("root ticket command")
.addSubcommand((command) => command.setName("new").setDescription("Open a new ticket"))
.addSubcommandGroup((group) =>
group
.setName("action")
.setDescription("ticket actions")
.addSubcommand((command) =>
command.setName("open").setDescription("Reopen the ticket in the current channel"),
)
.addSubcommand((command) =>
command
.setName("close")
.setDescription("Close the ticket in the current channel")
.addStringOption((option) =>
option
.setName("reason")
.setDescription("Public reason for closing the ticket")
.setRequired(true),
)
.addStringOption((option) =>
option
.setName("private")
.setDescription(
"Private reason for closing the ticket, only visible to moderators",
)
.setRequired(false),
)
.addBooleanOption((option) =>
option.setName("delete-channel").setDescription("Delete the channel immediately"),
),
),
),
);
}
public async createTicket(interaction: Subcommand.ChatInputCommandInteraction) {
interaction.reply({ content: "Ticket created!" });
}
public async openTicket(interaction: Subcommand.ChatInputCommandInteraction) {
interaction.reply({ content: "Ticket opened!" });
}
public async closeTicket(interaction: Subcommand.ChatInputCommandInteraction) {
interaction.reply({ content: "Ticket closed!" });
}
}
container.stores.loadPiece({
piece: TicketCommand,
name: "ticket",
store: "commands",
});
|