diff --git a/src/buttons/claim-ticket.ts b/src/buttons/claim-ticket.ts index 0b0452f..4abb018 100644 --- a/src/buttons/claim-ticket.ts +++ b/src/buttons/claim-ticket.ts @@ -1,40 +1,51 @@ -import { ActionRowBuilder, ButtonBuilder, ButtonInteraction, ButtonStyle, ChannelType, Client, MessageFlags, PermissionFlagsBits } from 'discord.js'; +import { ActionRowBuilder, ButtonBuilder, ButtonInteraction, ButtonStyle, ChannelType, Client, MessageFlags } from 'discord.js'; import { Database } from '../shared/Database'; +import { Button } from '../types'; -export default { - name: 'claim-ticket', - handler: async function (client: Client, interaction: ButtonInteraction) { - const channel = await interaction.channel?.fetch(); +class ClaimTicketButton implements Button { + id = 'claim-ticket'; - if (!channel || !channel.isThread() || !channel.isSendable() || channel.type != ChannelType.PrivateThread) - return interaction.reply({ flags: [MessageFlags.Ephemeral], content: 'Oops. Something went wrong.' }); + async execute(context: Client, interaction: ButtonInteraction, ...args: any[]): Promise { + if (!interaction.inGuild()) return; - if (!interaction.memberPermissions) return interaction.reply({ flags: [MessageFlags.Ephemeral], content: 'An error has occurred.' }); + try { + const channel = await context.channels.fetch(interaction.channelId); + + if (!channel) throw new Error("The interaction channel couldn't be fetched."); + if (!channel.isThread() || channel.type != ChannelType.PrivateThread) throw new Error('This interaction was not run in a ticket thread.'); + if (!channel.isSendable()) throw new Error("I don't have permission to send messages in this channel."); - if (!interaction.memberPermissions.has(PermissionFlagsBits.ManageMessages)) return interaction.reply({ flags: [MessageFlags.Ephemeral], content: 'You do not have permission to claim tickets.' }); + const settings = await Database.getOrCreateSettings(interaction.guildId); + if (!settings.private_help_role_id) throw new Error("\`private_help_role_id\` hasn't been configured. Please report this error to staff."); + if (!(interaction.member.roles as string[]).includes(settings.private_help_role_id)) throw new Error("You don't have permission to claim tickets."); - const guild = await client.guilds.fetch(interaction.guildId!); + const closeButton = new ButtonBuilder() + .setCustomId('close-ticket') + .setLabel('Click here if you no longer need help') + .setStyle(ButtonStyle.Danger); - const settings = await Database.getOrCreateSettings(guild.id); - if (!settings.private_help_role_id) return interaction.reply({ flags: [MessageFlags.Ephemeral], content: 'Failed to claim ticket.' }); + const unclaimButton = new ButtonBuilder() + .setCustomId('unclaim-ticket') + .setLabel('Unclaim ticket') + .setStyle(ButtonStyle.Primary); - const closeButton = new ButtonBuilder() - .setCustomId('close-ticket') - .setLabel('Click here if you no longer need help') - .setStyle(ButtonStyle.Danger); + const row = new ActionRowBuilder().addComponents(closeButton, unclaimButton); - const unclaimButton = new ButtonBuilder() - .setCustomId('unclaim-ticket') - .setLabel('Unclaim ticket') - .setStyle(ButtonStyle.Primary); + await interaction.message.edit({ + content: `${interaction.message.content}\n\nClaimed by: ${interaction.user}`, + components: [row] + }); - const row = new ActionRowBuilder().addComponents(closeButton, unclaimButton); + await interaction.reply({ content: `Ticket claimed by ${interaction.user}.` }); + } catch (error: Error | any) { + await interaction.reply({ + content: error.message, + flags: MessageFlags.Ephemeral, + }).catch(() => {}); - await interaction.message.edit({ - content: `${interaction.message.content}\n\nClaimed by: ${interaction.user}`, - components: [row] - }); - - await interaction.reply({ content: `Ticket claimed by ${interaction.user}.` }); + return; + } } -}; \ No newline at end of file +} + +export default new ClaimTicketButton(); \ No newline at end of file