diff --git a/src/buttons/claim-ticket.ts b/src/buttons/claim-ticket.ts new file mode 100644 index 0000000..4092620 --- /dev/null +++ b/src/buttons/claim-ticket.ts @@ -0,0 +1,48 @@ +import { ActionRowBuilder, ButtonInteraction, Client, ModalBuilder, TextInputBuilder, TextInputStyle, MessageFlags, ChannelType, PermissionFlagsBits, ButtonBuilder, ButtonStyle } from 'discord.js'; +import { ticketCooldownMap } from '../shared/ticket-cooldown'; +import { Database } from '../shared/Database'; + +export default { + name: 'claim-ticket', + handler: async function (client: Client, interaction: ButtonInteraction) { + const channel = await interaction.channel?.fetch(); + + if (!channel || !channel.isThread() || !channel.isSendable() || channel.type != ChannelType.PrivateThread) + return interaction.reply({ flags: [MessageFlags.Ephemeral], content: 'Oops. Something went wrong. Please report this to a staff member.' }); + + if (!interaction.memberPermissions) return interaction.reply({ flags: [MessageFlags.Ephemeral], content: 'An error has occurred.' }); + + if (!interaction.memberPermissions.has(PermissionFlagsBits.ManageMessages)) return interaction.reply({ flags: [MessageFlags.Ephemeral], content: 'You do not have permission to claim tickets.' }); + + const guild = await client.guilds.fetch(interaction.guildId!); + + const guildSettings = await Database.getGuildSettings(guild.id); + + if (!guildSettings || !guildSettings.private_help_role_id) + return interaction.reply({ flags: [MessageFlags.Ephemeral], content: 'Failed to create ticket. Please report this to a staff member.' }); + + const closeButton = new ButtonBuilder() + .setCustomId('close-ticket') + .setLabel('Click here if you no longer need help') + .setStyle(ButtonStyle.Danger); + + const claimButton = new ButtonBuilder() + .setCustomId('claim-ticket') + .setLabel('Claim ticket') + .setDisabled(true) + .setStyle(ButtonStyle.Primary); + + const row = new ActionRowBuilder().addComponents(closeButton, claimButton); + + await interaction.message.edit({ + content: `${interaction.message.content}\n\nClaimed by: ${interaction.user}`, + components: [row], + allowedMentions: { + users: [interaction.user.id], + roles: [guildSettings.private_help_role_id] + } + }); + + await interaction.reply({ content: `Ticket claimed by ${interaction.user}.` }); + } +}; \ No newline at end of file diff --git a/src/modals/open-ticket-modal.ts b/src/modals/open-ticket-modal.ts index f6c0c22..df177a7 100644 --- a/src/modals/open-ticket-modal.ts +++ b/src/modals/open-ticket-modal.ts @@ -26,12 +26,17 @@ export default { type: ChannelType.PrivateThread }); - const button = new ButtonBuilder() + const closeButton = new ButtonBuilder() .setCustomId('close-ticket') .setLabel('Click here if you no longer need help') .setStyle(ButtonStyle.Danger); - const row = new ActionRowBuilder().addComponents(button); + const claimButton = new ButtonBuilder() + .setCustomId('claim-ticket') + .setLabel('Claim ticket') + .setStyle(ButtonStyle.Primary); + + const row = new ActionRowBuilder().addComponents(closeButton, claimButton); await thread.send({ content: `${interaction.user} feel free to direct your questions at any <@&${guildSettings.private_help_role_id}>. Only you and staff members can see this channel.\n\n**Reason for contact:**\n${reason}`,