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 "./actions"; export const closeTicketButton = kitten.button("b-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 thankButton = kitten.button("thank", { options: { ticketId: option.string({ required: true }), }, async run() {}, }); export const commentsButton = kitten.button("comments", { 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, thankButton, commentsButton, ]; 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), thank: (id: string) => new ButtonBuilder() .setCustomId(thankButton.id({ ticketId: id })) .setLabel("Thank your moderator") .setEmoji("💖") .setStyle(ButtonStyle.Success), comments: (id: string, quantity: number) => new ButtonBuilder() .setCustomId(commentsButton.id({ ticketId: id })) .setLabel(`View Comments (≥${quantity})`) .setStyle(ButtonStyle.Secondary), transcript: (id: string) => new ButtonBuilder() .setLabel("View on Web") .setURL(`https://tickets.vt3e.cat/tickets/${id}`) .setStyle(ButtonStyle.Link), create: () => new ButtonBuilder() .setLabel("Open a Ticket") .setStyle(ButtonStyle.Success) .setCustomId(newTicketButton.id()), upload: (id: string) => new ButtonBuilder() .setLabel("Upload a video") .setStyle(ButtonStyle.Link) .setURL(`https://tickets.vt3e.cat/upload/${id}`), }; export default TicketButtonPresets;