From db9a1e6c5478eea5ff97793c6dde524bb5c10103 Mon Sep 17 00:00:00 2001 From: Taken Date: Tue, 12 Dec 2023 17:42:40 +0100 Subject: [PATCH 1/2] Revamped event handlers --- src/events/autocomplete/unban.js | 1 - src/events/modals/denyreasonbox.js | 6 +---- src/events/modals/staffdenyreasonbox.js | 6 +---- src/events/modals/verifyModal.js | 2 -- src/index.js | 3 ++- src/utils/eventHandlers/autocomplete.js | 35 ++++++++++++++++--------- src/utils/eventHandlers/button.js | 16 +++++------ src/utils/eventHandlers/modal.js | 24 ++++++++++++++++- 8 files changed, 57 insertions(+), 36 deletions(-) diff --git a/src/events/autocomplete/unban.js b/src/events/autocomplete/unban.js index 91db9c4..d3037ae 100644 --- a/src/events/autocomplete/unban.js +++ b/src/events/autocomplete/unban.js @@ -6,7 +6,6 @@ module.exports = { /** @param { import("discord.js").AutocompleteInteraction } interaction */ async execute(interaction) { - if (interaction.commandName !== "unban") return const focusedOption = interaction.options.getFocused(true) if (focusedOption.name !== "user") return diff --git a/src/events/modals/denyreasonbox.js b/src/events/modals/denyreasonbox.js index 1f5cbd4..24beaf2 100644 --- a/src/events/modals/denyreasonbox.js +++ b/src/events/modals/denyreasonbox.js @@ -1,4 +1,4 @@ -const { InteractionType, EmbedBuilder, ActionRowBuilder, ButtonBuilder, ButtonStyle } = require("discord.js") +const { EmbedBuilder, ActionRowBuilder, ButtonBuilder, ButtonStyle } = require("discord.js") const { color } = require("../../../config/options.json") const guildapp = require("../../schemas/guildAppSchema.js") @@ -10,10 +10,6 @@ module.exports = { /** @param { import('discord.js').ModalSubmitInteraction } interaction */ async execute(interaction) { - - if (interaction.type !== InteractionType.ModalSubmit) return - if (interaction.customId !== "denyreasonbox") return - interaction.deferReply() const guild = interaction.guild diff --git a/src/events/modals/staffdenyreasonbox.js b/src/events/modals/staffdenyreasonbox.js index 45cb0f7..c5747b1 100644 --- a/src/events/modals/staffdenyreasonbox.js +++ b/src/events/modals/staffdenyreasonbox.js @@ -1,4 +1,4 @@ -const { InteractionType, EmbedBuilder, ActionRowBuilder, ButtonBuilder, ButtonStyle } = require("discord.js") +const { EmbedBuilder, ActionRowBuilder, ButtonBuilder, ButtonStyle } = require("discord.js") const { color } = require("../../../config/options.json") const staffapp = require("../../schemas/staffAppSchema.js") @@ -10,10 +10,6 @@ module.exports = { /** @param { import('discord.js').ModalSubmitInteraction } interaction */ async execute(interaction) { - - if (interaction.type !== InteractionType.ModalSubmit) return - if (interaction.customId !== "staffdenyreasonbox") return - interaction.deferReply() const guild = interaction.guild diff --git a/src/events/modals/verifyModal.js b/src/events/modals/verifyModal.js index 9289865..6173e8b 100644 --- a/src/events/modals/verifyModal.js +++ b/src/events/modals/verifyModal.js @@ -1,4 +1,3 @@ -const { InteractionType } = require("discord.js") const { getUUID, getPlayer, getGuild, getHeadURL } = require("../../utils/utils.js") const { color, hypixelGuildID, devMessage } = require("../../../config/options.json") const verify = require("../../schemas/verifySchema.js") @@ -12,7 +11,6 @@ module.exports = { /** @param { import('discord.js').ModalSubmitInteraction } interaction */ async execute(interaction) { - if (interaction.type !== InteractionType.ModalSubmit) return await interaction.deferReply({ ephemeral: true }) const user1 = interaction.user diff --git a/src/index.js b/src/index.js index b1d4e20..50019d3 100644 --- a/src/index.js +++ b/src/index.js @@ -24,8 +24,9 @@ const client = new Client({ }) client.commands = new Collection() -client.events = new Collection() +client.buttons = new Collection() client.modals = new Collection() +client.autocomplete = new Collection() init() loadSlashCommandsEvents(client) diff --git a/src/utils/eventHandlers/autocomplete.js b/src/utils/eventHandlers/autocomplete.js index 16daad2..21bb8f9 100644 --- a/src/utils/eventHandlers/autocomplete.js +++ b/src/utils/eventHandlers/autocomplete.js @@ -14,22 +14,31 @@ function loadAutocompleteEvents(client) { const autocomplete = require(filePath) if ("name" in autocomplete && "execute" in autocomplete && autocomplete.type === "autocomplete") { - client.on(Events.InteractionCreate, async interaction => { - if (!interaction.isAutocomplete()) return - - try { - await autocomplete.execute(interaction) - } catch (error) { - console.error(error) - await interaction.respond({ - content: "There was an error while executing this command!", - ephemeral: true - }) - } - }) + client.autocomplete.set(autocomplete.name, autocomplete) } else { console.log(`[WARNING] The autocomplete at ${filePath} is missing a required "name", "execute" or "type" property.`) } + + client.on(Events.InteractionCreate, async interaction => { + if (!interaction.isAutocomplete()) return + + const autocomplete = interaction.client.autocomplete.get(interaction.commandName) + + if (!autocomplete) { + console.error(`No autocomplete matching ${interaction.commandName} was found.`) + return + } + + try { + await autocomplete.execute(interaction, client) + } catch (error) { + console.error(error) + await interaction.respond({ + content: "There was an error while executing this autocomplete!", + ephemeral: true + }) + } + }) } } diff --git a/src/utils/eventHandlers/button.js b/src/utils/eventHandlers/button.js index 3e7fbf3..960726b 100644 --- a/src/utils/eventHandlers/button.js +++ b/src/utils/eventHandlers/button.js @@ -14,28 +14,28 @@ function loadButtonEvents(client) { const btn = require(filePath) if ("name" in btn && "execute" in btn && btn.type === "button") { - client.events.set(btn.name, btn) + client.buttons.set(btn.name, btn) } else { console.log(`[WARNING] The button at ${filePath} is missing a required "name", "execute" or "type" property.`) } } - client.on(Events.InteractionCreate, async event => { - if (!event.isButton()) + client.on(Events.InteractionCreate, async interaction => { + if (!interaction.isButton()) return - const event2 = event.client.events.get(event.customId) + const button = interaction.client.buttons.get(interaction.customId) - if (!event2) { - console.error(`No event matching ${event.customId} was found.`) + if (!button) { + console.error(`No event matching ${interaction.customId} was found.`) return } try { - await event2.execute(event) + await button.execute(interaction) } catch (error) { console.error(error) - await event.reply({ + await interaction.reply({ content: "There was an error while executing this event!", ephemeral: true }) diff --git a/src/utils/eventHandlers/modal.js b/src/utils/eventHandlers/modal.js index 9575e2a..f7b9d67 100644 --- a/src/utils/eventHandlers/modal.js +++ b/src/utils/eventHandlers/modal.js @@ -14,11 +14,33 @@ function loadModalEvents(client) { const modal = require(filePath) if ("name" in modal && "execute" in modal && modal.type === "modal") { - client.on(Events.InteractionCreate, modal.execute) + client.modals.set(modal.name, modal) } else { console.log(`[WARNING] The modal at ${filePath} is missing a required "name", "execute" or "type" property.`) } } + + client.on(Events.InteractionCreate, async interaction => { + if (!interaction.isModalSubmit()) + return + + const modal = interaction.client.modals.get(interaction.customId) + + if (!modal) { + console.error(`No modal matching ${interaction.customId} was found.`) + return + } + + try { + await modal.execute(interaction) + } catch (error) { + console.error(error) + await interaction.reply({ + content: "There was an error while executing this modal!", + ephemeral: true + }) + } + }) } module.exports = { loadModalEvents } From 803e93a4a7e015b8f6797d70542a7d82609ecbac Mon Sep 17 00:00:00 2001 From: Taken Date: Tue, 12 Dec 2023 17:51:04 +0100 Subject: [PATCH 2/2] Updated file structure Signed-off-by: Taken --- src/index.js | 19 +++++-------------- src/utils/eventHandlers/autocomplete.js | 4 +++- src/utils/eventHandlers/button.js | 4 +++- src/utils/eventHandlers/command.js | 4 +++- src/utils/eventHandlers/modal.js | 4 +++- src/utils/loadEvents.js | 12 ++++++++++++ 6 files changed, 29 insertions(+), 18 deletions(-) create mode 100644 src/utils/loadEvents.js diff --git a/src/index.js b/src/index.js index 50019d3..bc82728 100644 --- a/src/index.js +++ b/src/index.js @@ -1,11 +1,13 @@ -const { Client, GatewayIntentBits, Partials, Collection } = require("discord.js") -const { loadSlashCommandsEvents, loadContextMenuEvents, loadModalEvents, loadButtonEvents, loadEvents, loadAutocompleteEvents } = require("./utils/eventHandler.js") +const { Client, GatewayIntentBits, Partials } = require("discord.js") const { autoDeployCommands } = require("./utils/autodeploy.js") +const { loadAllEvents } = require("./utils/loadEvents.js") const { init } = require("./utils/init.js") require("dotenv").config() const mongoURI = process.env.MONGOURI const { connect } = require("mongoose") +init() + const client = new Client({ intents: [ GatewayIntentBits.Guilds, @@ -23,18 +25,7 @@ const client = new Client({ ] }) -client.commands = new Collection() -client.buttons = new Collection() -client.modals = new Collection() -client.autocomplete = new Collection() - -init() -loadSlashCommandsEvents(client) -loadAutocompleteEvents(client) -loadContextMenuEvents(client) -loadButtonEvents(client) -loadModalEvents(client) -loadEvents(client) +loadAllEvents(client) let token = "" if (process.env.NODE_ENV === "dev") { diff --git a/src/utils/eventHandlers/autocomplete.js b/src/utils/eventHandlers/autocomplete.js index 21bb8f9..c6fc701 100644 --- a/src/utils/eventHandlers/autocomplete.js +++ b/src/utils/eventHandlers/autocomplete.js @@ -1,10 +1,12 @@ -const { Events } = require("discord.js") +const { Events, Collection } = require("discord.js") const path = require("path") const fs = require("fs") /** @param { import('discord.js').Client } client */ function loadAutocompleteEvents(client) { + client.autocomplete = new Collection() + const autocompletePath = path.join(__dirname, "..", "..", "events", "autocomplete") const autocompleteFiles = fs.readdirSync(autocompletePath).filter(file => file.endsWith(".js")) diff --git a/src/utils/eventHandlers/button.js b/src/utils/eventHandlers/button.js index 960726b..a4c6143 100644 --- a/src/utils/eventHandlers/button.js +++ b/src/utils/eventHandlers/button.js @@ -1,10 +1,12 @@ -const { Events } = require("discord.js") +const { Events, Collection } = require("discord.js") const path = require("path") const fs = require("fs") /** @param { import('discord.js').Client } client */ function loadButtonEvents(client) { + client.buttons = new Collection() + const btnPath = path.join(__dirname, "..", "..", "events", "buttons") const btnFiles = fs.readdirSync(btnPath).filter(file => file.endsWith(".js")) diff --git a/src/utils/eventHandlers/command.js b/src/utils/eventHandlers/command.js index fa8f859..588414c 100644 --- a/src/utils/eventHandlers/command.js +++ b/src/utils/eventHandlers/command.js @@ -1,10 +1,12 @@ -const { Events } = require("discord.js") +const { Events, Collection } = require("discord.js") const path = require("path") const fs = require("fs") /** @param { import('discord.js').Client } client */ function loadSlashCommandsEvents(client) { + client.commands = new Collection() + const cmdPath = path.join(__dirname, "..", "..", "commands") const cmdFiles = fs.readdirSync(cmdPath).filter(file => file.endsWith(".js")) diff --git a/src/utils/eventHandlers/modal.js b/src/utils/eventHandlers/modal.js index f7b9d67..b714409 100644 --- a/src/utils/eventHandlers/modal.js +++ b/src/utils/eventHandlers/modal.js @@ -1,10 +1,12 @@ -const { Events } = require("discord.js") +const { Events, Collection } = require("discord.js") const path = require("path") const fs = require("fs") /** @param { import('discord.js').Client } client */ function loadModalEvents(client) { + client.modals = new Collection() + const modalPath = path.join(__dirname, "..", "..", "events", "modals") const modalFiles = fs.readdirSync(modalPath).filter(file => file.endsWith(".js")) diff --git a/src/utils/loadEvents.js b/src/utils/loadEvents.js new file mode 100644 index 0000000..5729acb --- /dev/null +++ b/src/utils/loadEvents.js @@ -0,0 +1,12 @@ +const { loadSlashCommandsEvents, loadContextMenuEvents, loadModalEvents, loadButtonEvents, loadEvents, loadAutocompleteEvents } = require("./eventHandler.js") + +function loadAllEvents(client) { + loadSlashCommandsEvents(client) + loadAutocompleteEvents(client) + loadContextMenuEvents(client) + loadButtonEvents(client) + loadModalEvents(client) + loadEvents(client) +} + +module.exports = { loadAllEvents }