import { ButtonBuilder, ButtonStyle } from "discord.js"; import { Result } from "@sapphire/framework"; import { option } from "@purrkit/router"; import { kitten } from "@/client"; import { errorMessage, PublicError } from "@/lib"; import * as actions from "@/commands/tickets/actions"; export const closeTicketButton = kitten.button("close-ticket", { options: { ticketId: option.string({ required: true }), }, async run(interaction) { if (!interaction.guild) return errorMessage(interaction, "You must run this command in a guild"); const modal = await actions.triggerCloseTicket( interaction.user, interaction.guild, interaction.channelId, ); await interaction.showModal(modal); }, }); export const deleteTicketButton = kitten.button("delete-ticket", { options: { ticketId: option.string({ required: true }), }, async run() {}, }); export const claimTicketButton = kitten.button("claim-ticket", { options: { ticketId: option.string({ required: true }), }, async run() {}, }); export const unclaimTicketButton = kitten.button("unclaim-ticket", { options: { ticketId: option.string({ required: true }), }, async run() {}, }); export const newTicketButton = kitten.button("open-ticket", { run: async (interaction) => { if (!interaction.guild) return errorMessage(interaction, "You must run this command in a guild"); const func = actions.createTicket(interaction.member ?? interaction.user, interaction.guild); const ticketResult = await Result.fromAsync(async () => func); if (ticketResult.isErr()) { const error = ticketResult.unwrapErr(); if (error instanceof PublicError) { return errorMessage(interaction, error.message); } else { console.error(error); return errorMessage(interaction, "An unexpected error occurred while creating the ticket."); } } const { channelId } = ticketResult.unwrap(); return interaction.reply({ content: `Opened ticket <#${channelId}>.`, flags: ["Ephemeral"], }); }, }); export const TicketButtons = [ newTicketButton, closeTicketButton, deleteTicketButton, claimTicketButton, ]; export const TicketButtonPresets = { close: (id: string) => new ButtonBuilder() .setCustomId(closeTicketButton.id({ ticketId: id })) .setLabel("Close Ticket") .setStyle(ButtonStyle.Danger), delete: (id: string) => new ButtonBuilder() .setCustomId(deleteTicketButton.id({ ticketId: id })) .setLabel("Delete Ticket") .setStyle(ButtonStyle.Danger), claim: (id: string) => new ButtonBuilder() .setCustomId(claimTicketButton.id({ ticketId: id })) .setLabel("Claim Ticket") .setStyle(ButtonStyle.Primary), create: () => new ButtonBuilder() .setLabel("Open a Ticket") .setStyle(ButtonStyle.Success) .setCustomId(newTicketButton.id()), }; export default TicketButtonPresets;