From ffb53a059470623e478b46895c09e473648fd270 Mon Sep 17 00:00:00 2001 From: Bloodcloak <59000966+bloodcloak@users.noreply.github.com> Date: Fri, 7 Jun 2024 22:22:30 -0400 Subject: [PATCH] add close button and fix stale ticket bug --- events/modalInteraction.js | 13 ++++- events/onReady.js | 4 +- helpers/closeRequestEmbed.js | 52 ++++++++++++++++++ .../buttons/operation/closeRequest.js | 8 +++ interactions/slash/operation/close.js | 53 ++----------------- 5 files changed, 78 insertions(+), 52 deletions(-) create mode 100644 helpers/closeRequestEmbed.js create mode 100644 interactions/buttons/operation/closeRequest.js diff --git a/events/modalInteraction.js b/events/modalInteraction.js index 6eff983..9b55965 100644 --- a/events/modalInteraction.js +++ b/events/modalInteraction.js @@ -1,4 +1,4 @@ -const { ChannelType, EmbedBuilder } = require("discord.js"); +const { ActionRowBuilder, ButtonBuilder, ButtonStyle, ChannelType, EmbedBuilder } = require("discord.js"); const db = require("../connectDb"); module.exports = { @@ -78,7 +78,16 @@ module.exports = { .setAuthor({ name: interaction.user.tag, iconURL: interaction.user.displayAvatarURL() }) .setTimestamp(); - channel.send({ embeds: [ticketEmbed] }); + const row = new ActionRowBuilder() + .addComponents( + new ButtonBuilder() + .setCustomId("close_request") + .setLabel("Close Ticket") + .setStyle(ButtonStyle.Danger) + .setEmoji("✖️") + ) + + channel.send({ embeds: [ticketEmbed], components: [row] }); const logEmbed = new EmbedBuilder() .setTitle(`Ticket #${ticketNumber} created`) diff --git a/events/onReady.js b/events/onReady.js index 43e7f27..1b9260a 100644 --- a/events/onReady.js +++ b/events/onReady.js @@ -13,7 +13,9 @@ module.exports = { .where("status", "open") .andWhere("close_requested_at", "!=", null); - tickets.forEach(async ticket => { + const ticketArray = Array.from(tickets); + + ticketArray.forEach(async ticket => { const closeRequestedAt = new Date(ticket.close_requested_at); const timeout = ticket.timeout * 24 * 60 * 60 * 1000; diff --git a/helpers/closeRequestEmbed.js b/helpers/closeRequestEmbed.js new file mode 100644 index 0000000..cf3028a --- /dev/null +++ b/helpers/closeRequestEmbed.js @@ -0,0 +1,52 @@ +const { ButtonBuilder, ButtonStyle, EmbedBuilder, ActionRowBuilder } = require("discord.js"); +const db = require("../../../connectDb"); + +export async function closeRequest(interaction) { + const channel = interaction.channel; + + if (!channel.name.startsWith("ticket-")) { + return interaction.reply({ content: "This is not a ticket channel.", ephemeral: true }) + } + + let embed = new EmbedBuilder() + .setDescription(`${interaction.user} wants to close the ticket.`) + .setColor("Random") + + const ticket = await db("tickets") + .select("*") + .where("channel_id", channel.id) + .first(); + + if (interaction.user.id === ticket.user_id) { + embed.setFooter({ text: "Wait for a staff member to close the ticket." }) + } + + else { + embed.setFooter({ text: `${ticket.user_id} | ${interaction.user.id}` }) + } + + const row = new ActionRowBuilder() + .addComponents( + new ButtonBuilder() + .setCustomId("confirm_close") + .setLabel("Confirm") + .setStyle(ButtonStyle.Success) + .setEmoji("✅") + ) + .addComponents( + new ButtonBuilder() + .setCustomId("cancel_close") + .setLabel("Cancel") + .setStyle(ButtonStyle.Danger) + .setEmoji("✖️") + ) + + await db("tickets") + .where("channel_id", channel.id) + .update({ close_requested_at: new Date() }) + + await interaction.reply({ embeds: [embed], components: [row] }); + if (interaction.user.id !== ticket.user_id) { + await interaction.channel.send({ content: `<@${ticket.user_id}>, Please confirm the closing of this ticket.` }) + } +} \ No newline at end of file diff --git a/interactions/buttons/operation/closeRequest.js b/interactions/buttons/operation/closeRequest.js new file mode 100644 index 0000000..7883c36 --- /dev/null +++ b/interactions/buttons/operation/closeRequest.js @@ -0,0 +1,8 @@ +import { closeRequest } from "../../../helpers/closeRequestEmbed"; + +module.exports = { + id: "close_request", + async execute(interaction) { + closeRequest(interaction); + } +} \ No newline at end of file diff --git a/interactions/slash/operation/close.js b/interactions/slash/operation/close.js index e5a9a6a..ee9bdfc 100644 --- a/interactions/slash/operation/close.js +++ b/interactions/slash/operation/close.js @@ -1,57 +1,12 @@ -const { SlashCommandBuilder, ButtonBuilder, ButtonStyle, EmbedBuilder, ActionRowBuilder } = require("discord.js"); -const db = require("../../../connectDb"); +const { SlashCommandBuilder } = require("discord.js"); + +import { closeRequest } from "../../../helpers/closeRequestEmbed"; module.exports = { data: new SlashCommandBuilder() .setName('close') .setDescription('Close a ticket.'), async execute(interaction) { - const channel = interaction.channel; - - if (!channel.name.startsWith("ticket-")) { - return interaction.reply({ content: "This is not a ticket channel.", ephemeral: true }) - } - - let embed = new EmbedBuilder() - .setDescription(`${interaction.user} wants to close the ticket.`) - .setColor("Random") - - const ticket = await db("tickets") - .select("*") - .where("channel_id", channel.id) - .first(); - - if (interaction.user.id === ticket.user_id) { - embed.setFooter({ text: "Wait for a staff member to close the ticket." }) - } - - else { - embed.setFooter({ text: `${ticket.user_id} | ${interaction.user.id}` }) - } - - const row = new ActionRowBuilder() - .addComponents( - new ButtonBuilder() - .setCustomId("confirm_close") - .setLabel("Confirm") - .setStyle(ButtonStyle.Success) - .setEmoji("✅") - ) - .addComponents( - new ButtonBuilder() - .setCustomId("cancel_close") - .setLabel("Cancel") - .setStyle(ButtonStyle.Danger) - .setEmoji("✖️") - ) - - await db("tickets") - .where("channel_id", channel.id) - .update({ close_requested_at: new Date() }) - - await interaction.reply({ embeds: [embed], components: [row] }); - if (interaction.user.id !== ticket.user_id) { - await interaction.channel.send({ content: `<@${ticket.user_id}>, Please confirm the closing of this ticket.` }) - } + closeRequest(interaction); } } \ No newline at end of file