From 46e1e73bba47603dcb8b3fd1a9bbf779b044c3fd Mon Sep 17 00:00:00 2001 From: Danial Raza Date: Sat, 3 May 2025 18:18:24 +0200 Subject: [PATCH 1/3] refactor: remove `registerEvents` function --- .../Deno/src/events/interactionCreate.ts | 20 +++++++++++++ .../template/Deno/src/index.ts | 8 ++--- .../template/Deno/src/util/registerEvents.ts | 25 ---------------- .../template/JavaScript/src/events/index.js | 2 +- .../src/events/interactionCreate.js | 20 +++++++++++++ .../template/JavaScript/src/index.js | 8 ++--- .../JavaScript/src/util/registerEvents.js | 29 ------------------- .../src/events/interactionCreate.ts | 21 ++++++++++++++ .../template/TypeScript/src/index.ts | 8 ++--- .../TypeScript/src/util/registerEvents.ts | 25 ---------------- 10 files changed, 74 insertions(+), 92 deletions(-) create mode 100644 packages/create-discord-bot/template/Deno/src/events/interactionCreate.ts delete mode 100644 packages/create-discord-bot/template/Deno/src/util/registerEvents.ts create mode 100644 packages/create-discord-bot/template/JavaScript/src/events/interactionCreate.js delete mode 100644 packages/create-discord-bot/template/JavaScript/src/util/registerEvents.js create mode 100644 packages/create-discord-bot/template/TypeScript/src/events/interactionCreate.ts delete mode 100644 packages/create-discord-bot/template/TypeScript/src/util/registerEvents.ts diff --git a/packages/create-discord-bot/template/Deno/src/events/interactionCreate.ts b/packages/create-discord-bot/template/Deno/src/events/interactionCreate.ts new file mode 100644 index 000000000000..cf32b7fe64d4 --- /dev/null +++ b/packages/create-discord-bot/template/Deno/src/events/interactionCreate.ts @@ -0,0 +1,20 @@ +import { Events } from 'npm:discord.js@^14.19.3'; +import type { Event } from './index.ts'; +import { loadCommands } from '../util/loaders.ts'; + +const commands = await loadCommands(new URL('../commands/', import.meta.url)); + +export default { + name: Events.InteractionCreate, + async execute(interaction) { + if (interaction.isCommand()) { + const command = commands.get(interaction.commandName); + + if (!command) { + throw new Error(`Command '${interaction.commandName}' not found.`); + } + + await command.execute(interaction); + } + }, +} satisfies Event; diff --git a/packages/create-discord-bot/template/Deno/src/index.ts b/packages/create-discord-bot/template/Deno/src/index.ts index 400d937c34aa..21a464ffd90c 100644 --- a/packages/create-discord-bot/template/Deno/src/index.ts +++ b/packages/create-discord-bot/template/Deno/src/index.ts @@ -1,18 +1,18 @@ import 'https://deno.land/std@0.223.0/dotenv/load.ts'; import { URL } from 'node:url'; import { Client, GatewayIntentBits } from 'npm:discord.js@^14.19.3'; -import { loadCommands, loadEvents } from './util/loaders.ts'; -import { registerEvents } from './util/registerEvents.ts'; +import { loadEvents } from './util/loaders.ts'; // Initialize the client const client = new Client({ intents: [GatewayIntentBits.Guilds] }); // Load the events and commands const events = await loadEvents(new URL('events/', import.meta.url)); -const commands = await loadCommands(new URL('commands/', import.meta.url)); // Register the event handlers -registerEvents(commands, events, client); +for (const event of events) { + client[event.once ? 'once' : 'on'](event.name, async (...args) => event.execute(...args)); +} // Login to the client void client.login(Deno.env.get('DISCORD_TOKEN')); diff --git a/packages/create-discord-bot/template/Deno/src/util/registerEvents.ts b/packages/create-discord-bot/template/Deno/src/util/registerEvents.ts deleted file mode 100644 index df79d0830724..000000000000 --- a/packages/create-discord-bot/template/Deno/src/util/registerEvents.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { Events, type Client } from 'npm:discord.js@^14.19.3'; -import type { Command } from '../commands/index.ts'; -import type { Event } from '../events/index.ts'; - -export function registerEvents(commands: Map, events: Event[], client: Client): void { - // Create an event to handle command interactions - const interactionCreateEvent: Event = { - name: Events.InteractionCreate, - async execute(interaction) { - if (interaction.isCommand()) { - const command = commands.get(interaction.commandName); - - if (!command) { - throw new Error(`Command '${interaction.commandName}' not found.`); - } - - await command.execute(interaction); - } - }, - }; - - for (const event of [...events, interactionCreateEvent]) { - client[event.once ? 'once' : 'on'](event.name, async (...args) => event.execute(...args)); - } -} diff --git a/packages/create-discord-bot/template/JavaScript/src/events/index.js b/packages/create-discord-bot/template/JavaScript/src/events/index.js index 52365eefc0a7..dcac11a80621 100644 --- a/packages/create-discord-bot/template/JavaScript/src/events/index.js +++ b/packages/create-discord-bot/template/JavaScript/src/events/index.js @@ -23,7 +23,7 @@ export const schema = z.object({ /** * Defines the predicate to check if an object is a valid Event type. * - * @type {import('../util/loaders').StructurePredicate} + * @type {import('../util/loaders.js').StructurePredicate} * @returns {structure is Event} */ export const predicate = (structure) => schema.safeParse(structure).success; diff --git a/packages/create-discord-bot/template/JavaScript/src/events/interactionCreate.js b/packages/create-discord-bot/template/JavaScript/src/events/interactionCreate.js new file mode 100644 index 000000000000..eb2fed7c64e7 --- /dev/null +++ b/packages/create-discord-bot/template/JavaScript/src/events/interactionCreate.js @@ -0,0 +1,20 @@ +import { Events } from 'discord.js'; +import { loadCommands } from '../util/loaders.js'; + +const commands = await loadCommands(new URL('../commands/', import.meta.url)); + +/** @type {import('../events/index.js').Event} */ +export default { + name: Events.InteractionCreate, + async execute(interaction) { + if (interaction.isCommand()) { + const command = commands.get(interaction.commandName); + + if (!command) { + throw new Error(`Command '${interaction.commandName}' not found.`); + } + + await command.execute(interaction); + } + }, +}; diff --git a/packages/create-discord-bot/template/JavaScript/src/index.js b/packages/create-discord-bot/template/JavaScript/src/index.js index 20d768829992..9c1e9fe87ae3 100644 --- a/packages/create-discord-bot/template/JavaScript/src/index.js +++ b/packages/create-discord-bot/template/JavaScript/src/index.js @@ -1,18 +1,18 @@ import process from 'node:process'; import { URL } from 'node:url'; import { Client, GatewayIntentBits } from 'discord.js'; -import { loadCommands, loadEvents } from './util/loaders.js'; -import { registerEvents } from './util/registerEvents.js'; +import { loadEvents } from './util/loaders.js'; // Initialize the client const client = new Client({ intents: [GatewayIntentBits.Guilds] }); // Load the events and commands const events = await loadEvents(new URL('events/', import.meta.url)); -const commands = await loadCommands(new URL('commands/', import.meta.url)); // Register the event handlers -registerEvents(commands, events, client); +for (const event of events) { + client[event.once ? 'once' : 'on'](event.name, async (...args) => event.execute(...args)); +} // Login to the client void client.login(process.env.DISCORD_TOKEN); diff --git a/packages/create-discord-bot/template/JavaScript/src/util/registerEvents.js b/packages/create-discord-bot/template/JavaScript/src/util/registerEvents.js deleted file mode 100644 index b63059679575..000000000000 --- a/packages/create-discord-bot/template/JavaScript/src/util/registerEvents.js +++ /dev/null @@ -1,29 +0,0 @@ -import { Events } from 'discord.js'; - -/** - * @param {Map} commands - * @param {import('../events/index.js').Event[]} events - * @param {import('discord.js').Client} client - */ -export function registerEvents(commands, events, client) { - // Create an event to handle command interactions - /** @type {import('../events/index.js').Event} */ - const interactionCreateEvent = { - name: Events.InteractionCreate, - async execute(interaction) { - if (interaction.isCommand()) { - const command = commands.get(interaction.commandName); - - if (!command) { - throw new Error(`Command '${interaction.commandName}' not found.`); - } - - await command.execute(interaction); - } - }, - }; - - for (const event of [...events, interactionCreateEvent]) { - client[event.once ? 'once' : 'on'](event.name, async (...args) => event.execute(...args)); - } -} diff --git a/packages/create-discord-bot/template/TypeScript/src/events/interactionCreate.ts b/packages/create-discord-bot/template/TypeScript/src/events/interactionCreate.ts new file mode 100644 index 000000000000..4e0f0a90034d --- /dev/null +++ b/packages/create-discord-bot/template/TypeScript/src/events/interactionCreate.ts @@ -0,0 +1,21 @@ +import { URL } from 'node:url'; +import { Events } from 'discord.js'; +import { loadCommands } from '../util/loaders.[REPLACE_IMPORT_EXT]'; +import type { Event } from './index.[REPLACE_IMPORT_EXT]'; + +const commands = await loadCommands(new URL('../commands/', import.meta.url)); + +export default { + name: Events.InteractionCreate, + async execute(interaction) { + if (interaction.isCommand()) { + const command = commands.get(interaction.commandName); + + if (!command) { + throw new Error(`Command '${interaction.commandName}' not found.`); + } + + await command.execute(interaction); + } + }, +} satisfies Event; diff --git a/packages/create-discord-bot/template/TypeScript/src/index.ts b/packages/create-discord-bot/template/TypeScript/src/index.ts index f0cb8afcb5f7..7081678612c8 100644 --- a/packages/create-discord-bot/template/TypeScript/src/index.ts +++ b/packages/create-discord-bot/template/TypeScript/src/index.ts @@ -1,18 +1,18 @@ import process from 'node:process'; import { URL } from 'node:url'; import { Client, GatewayIntentBits } from 'discord.js'; -import { loadCommands, loadEvents } from './util/loaders.[REPLACE_IMPORT_EXT]'; -import { registerEvents } from './util/registerEvents.[REPLACE_IMPORT_EXT]'; +import { loadEvents } from './util/loaders.[REPLACE_IMPORT_EXT]'; // Initialize the client const client = new Client({ intents: [GatewayIntentBits.Guilds] }); // Load the events and commands const events = await loadEvents(new URL('events/', import.meta.url)); -const commands = await loadCommands(new URL('commands/', import.meta.url)); // Register the event handlers -registerEvents(commands, events, client); +for (const event of events) { + client[event.once ? 'once' : 'on'](event.name, async (...args) => event.execute(...args)); +} // Login to the client void client.login(process.env.DISCORD_TOKEN); diff --git a/packages/create-discord-bot/template/TypeScript/src/util/registerEvents.ts b/packages/create-discord-bot/template/TypeScript/src/util/registerEvents.ts deleted file mode 100644 index 8613fdb1503e..000000000000 --- a/packages/create-discord-bot/template/TypeScript/src/util/registerEvents.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { Events, type Client } from 'discord.js'; -import type { Command } from '../commands/index.[REPLACE_IMPORT_EXT]'; -import type { Event } from '../events/index.[REPLACE_IMPORT_EXT]'; - -export function registerEvents(commands: Map, events: Event[], client: Client): void { - // Create an event to handle command interactions - const interactionCreateEvent: Event = { - name: Events.InteractionCreate, - async execute(interaction) { - if (interaction.isCommand()) { - const command = commands.get(interaction.commandName); - - if (!command) { - throw new Error(`Command '${interaction.commandName}' not found.`); - } - - await command.execute(interaction); - } - }, - }; - - for (const event of [...events, interactionCreateEvent]) { - client[event.once ? 'once' : 'on'](event.name, async (...args) => event.execute(...args)); - } -} From 1961e3ed7f555aa25e940a08637ef5074fd60631 Mon Sep 17 00:00:00 2001 From: Danial Raza Date: Sat, 10 May 2025 22:30:02 +0200 Subject: [PATCH 2/3] refactor: use try-catch --- packages/create-discord-bot/template/Deno/src/index.ts | 8 +++++++- .../create-discord-bot/template/JavaScript/src/index.js | 8 +++++++- .../create-discord-bot/template/TypeScript/src/index.ts | 8 +++++++- 3 files changed, 21 insertions(+), 3 deletions(-) diff --git a/packages/create-discord-bot/template/Deno/src/index.ts b/packages/create-discord-bot/template/Deno/src/index.ts index 21a464ffd90c..beae3824e701 100644 --- a/packages/create-discord-bot/template/Deno/src/index.ts +++ b/packages/create-discord-bot/template/Deno/src/index.ts @@ -11,7 +11,13 @@ const events = await loadEvents(new URL('events/', import.meta.url)); // Register the event handlers for (const event of events) { - client[event.once ? 'once' : 'on'](event.name, async (...args) => event.execute(...args)); + client[event.once ? 'once' : 'on'](event.name, async (...args) => { + try { + event.execute(...args); + } catch (error) { + console.error(`Error executing event ${String(event.name)}:`, error); + } + }); } // Login to the client diff --git a/packages/create-discord-bot/template/JavaScript/src/index.js b/packages/create-discord-bot/template/JavaScript/src/index.js index 9c1e9fe87ae3..11508086bb17 100644 --- a/packages/create-discord-bot/template/JavaScript/src/index.js +++ b/packages/create-discord-bot/template/JavaScript/src/index.js @@ -11,7 +11,13 @@ const events = await loadEvents(new URL('events/', import.meta.url)); // Register the event handlers for (const event of events) { - client[event.once ? 'once' : 'on'](event.name, async (...args) => event.execute(...args)); + client[event.once ? 'once' : 'on'](event.name, async (...args) => { + try { + event.execute(...args); + } catch (error) { + console.error(`Error executing event ${String(event.name)}:`, error); + } + }); } // Login to the client diff --git a/packages/create-discord-bot/template/TypeScript/src/index.ts b/packages/create-discord-bot/template/TypeScript/src/index.ts index 7081678612c8..9eadb685aeef 100644 --- a/packages/create-discord-bot/template/TypeScript/src/index.ts +++ b/packages/create-discord-bot/template/TypeScript/src/index.ts @@ -11,7 +11,13 @@ const events = await loadEvents(new URL('events/', import.meta.url)); // Register the event handlers for (const event of events) { - client[event.once ? 'once' : 'on'](event.name, async (...args) => event.execute(...args)); + client[event.once ? 'once' : 'on'](event.name, async (...args) => { + try { + event.execute(...args); + } catch (error) { + console.error(`Error executing event ${String(event.name)}:`, error); + } + }); } // Login to the client From acd6bd27f03d41a27c3bd56b2489f7ef8c2f856c Mon Sep 17 00:00:00 2001 From: Danial Raza Date: Sun, 11 May 2025 13:56:06 +0200 Subject: [PATCH 3/3] fix: missing `await` --- packages/create-discord-bot/template/Deno/src/index.ts | 2 +- packages/create-discord-bot/template/JavaScript/src/index.js | 2 +- packages/create-discord-bot/template/TypeScript/src/index.ts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/create-discord-bot/template/Deno/src/index.ts b/packages/create-discord-bot/template/Deno/src/index.ts index beae3824e701..41b6ff61e993 100644 --- a/packages/create-discord-bot/template/Deno/src/index.ts +++ b/packages/create-discord-bot/template/Deno/src/index.ts @@ -13,7 +13,7 @@ const events = await loadEvents(new URL('events/', import.meta.url)); for (const event of events) { client[event.once ? 'once' : 'on'](event.name, async (...args) => { try { - event.execute(...args); + await event.execute(...args); } catch (error) { console.error(`Error executing event ${String(event.name)}:`, error); } diff --git a/packages/create-discord-bot/template/JavaScript/src/index.js b/packages/create-discord-bot/template/JavaScript/src/index.js index 11508086bb17..73e4ae0cbed0 100644 --- a/packages/create-discord-bot/template/JavaScript/src/index.js +++ b/packages/create-discord-bot/template/JavaScript/src/index.js @@ -13,7 +13,7 @@ const events = await loadEvents(new URL('events/', import.meta.url)); for (const event of events) { client[event.once ? 'once' : 'on'](event.name, async (...args) => { try { - event.execute(...args); + await event.execute(...args); } catch (error) { console.error(`Error executing event ${String(event.name)}:`, error); } diff --git a/packages/create-discord-bot/template/TypeScript/src/index.ts b/packages/create-discord-bot/template/TypeScript/src/index.ts index 9eadb685aeef..5c6001733ddc 100644 --- a/packages/create-discord-bot/template/TypeScript/src/index.ts +++ b/packages/create-discord-bot/template/TypeScript/src/index.ts @@ -13,7 +13,7 @@ const events = await loadEvents(new URL('events/', import.meta.url)); for (const event of events) { client[event.once ? 'once' : 'on'](event.name, async (...args) => { try { - event.execute(...args); + await event.execute(...args); } catch (error) { console.error(`Error executing event ${String(event.name)}:`, error); }