generated from Baipyrus/DiscordJS-Template
82 lines
2.4 KiB
JavaScript
82 lines
2.4 KiB
JavaScript
import { Events } from 'discord.js';
|
|
import Module from 'module';
|
|
|
|
/**
|
|
* A more precise execution function specifically to call the main property of a module.
|
|
* @param {import('discord.js').Interaction} interaction
|
|
* @param {Module} command
|
|
*/
|
|
const executeCommand = async (interaction, command) => {
|
|
// Try executing command
|
|
try {
|
|
console.info(`[INFO] Command '${interaction.commandName}' was executed.`);
|
|
await command.execute(interaction);
|
|
} catch (error) {
|
|
console.error(error);
|
|
// Follow up/reply with error message
|
|
if (interaction.replied || interaction.deferred)
|
|
await interaction.followUp({
|
|
content: 'There was an error while executing this command!',
|
|
ephemeral: true
|
|
});
|
|
else
|
|
await interaction.reply({
|
|
content: 'There was an error while executing this command!',
|
|
ephemeral: true
|
|
});
|
|
}
|
|
};
|
|
|
|
/**
|
|
* A generic execution function to call command methods.
|
|
* @param {import('discord.js').Interaction} interaction
|
|
* @param {Module} command
|
|
* @param {string} name
|
|
* @param {string=} description
|
|
* @param {string=} cmdName
|
|
*/
|
|
const genericExecute = async (interaction, command, name, description, cmdName) => {
|
|
try {
|
|
console.info(
|
|
`[INFO] Command '${cmdName ?? interaction.commandName ?? 'anonymous'}' ${
|
|
description ?? `used "${name}"`
|
|
}.`
|
|
);
|
|
await command[name](interaction);
|
|
} catch (error) {
|
|
console.error(error);
|
|
}
|
|
};
|
|
|
|
export const name = Events.InteractionCreate;
|
|
/** @param {import('discord.js').Interaction} interaction */
|
|
export async function execute(interaction) {
|
|
/** @type {Module} */
|
|
let command = interaction.client.commands.get(interaction.commandName);
|
|
|
|
// Execute slash- and context-menu-commands
|
|
if (interaction.isChatInputCommand() || interaction.isMessageContextMenuCommand()) {
|
|
await executeCommand(interaction, command);
|
|
return;
|
|
}
|
|
// Autocomplete input
|
|
if (interaction.isAutocomplete() && 'autocomplete' in command) {
|
|
await genericExecute(interaction, command, 'autocomplete');
|
|
return;
|
|
}
|
|
// Modal submit event
|
|
if (interaction.isModalSubmit()) {
|
|
const name = interaction.customId.split('-')[0];
|
|
command = interaction.client.commands.get(name);
|
|
|
|
await genericExecute(interaction, command, 'modalSubmit', 'submitted a modal', name);
|
|
return;
|
|
}
|
|
|
|
// Check if command exists
|
|
if (interaction.commandName && !command) {
|
|
console.warn(`[WARNING] No command matching ${interaction.commandName} was found.`);
|
|
return;
|
|
}
|
|
}
|