Context menus work!
diff --git a/src/utils/commandRegistration/register.ts b/src/utils/commandRegistration/register.ts
index d1b58f1..1f2241c 100644
--- a/src/utils/commandRegistration/register.ts
+++ b/src/utils/commandRegistration/register.ts
@@ -1,5 +1,4 @@
-import { typeSlashCommandSubcommandBuilder } from '@discordjs/builders';
-import { Interaction, SlashCommandBuilder, ApplicationCommandType } from 'discord.js';
+import Discord, { Interaction, SlashCommandBuilder, ApplicationCommandType } from 'discord.js';
// @ts-expect-error
import config from "../../config/main.json" assert { type: "json" };
import client from "../client.js";
@@ -16,7 +15,6 @@
}
async function registerCommands() {
- const developmentMode = config.enableDevelopment;
const commands = [];
const files = fs.readdirSync(config.commandsFolder, { withFileTypes: true }).filter(
@@ -49,17 +47,8 @@
}
}
- console.log(`Processed ${commands.length} commands, registering...`)
-
- const updateCommands = process.argv.includes("--update-commands");
- if (developmentMode) {
- const guild = await client.guilds.fetch(config.developmentGuildID);
- if (updateCommands) guild.commands.set(processed);
- console.log(`${colours.purple}Commands registered in ${guild.name}${colours.none}`)
- } else {
- if (updateCommands) client.application!.commands.set(processed);
- console.log(`${colours.blue}Commands registered globally${colours.none}`)
- }
+ console.log(`Processed ${processed.length} commands`)
+ return processed;
};
@@ -100,31 +89,35 @@
console.log(`Registering ${messageFiles.length} message context menus and ${userFiles.length} user context menus`)
let i = 0;
let errors = 0;
+ const commands: (Discord.ContextMenuCommandBuilder)[] = []
+ const totalFiles = messageFiles.length + userFiles.length;
for (const file of messageFiles) {
- const last = i === messageFiles.length - 1 ? "└" : "├";
+ const last = i === totalFiles - 1 ? "└" : "├";
i++;
try {
console.log(`${last}─ ${colours.yellow}Loading message context menu ${file.name}${colours.none}`)
const context = (await import(`../../../${config.messageContextFolder}/${file.name}`));
context.command.setType(ApplicationCommandType.Message);
+ commands.push(context.command);
- client.commands["contextCommands/message/" + file.name.replace(".js", "")] = context;
+ client.commands["contextCommands/message/" + context.command.name] = context;
- console.log(`${last.replace("└", " ").replace("├", "│")} └─ ${colours.green}Loaded ${file.name} [${i} / ${messageFiles.length}]${colours.none}`)
+ console.log(`${last.replace("└", " ").replace("├", "│")} └─ ${colours.green}Loaded ${file.name} [${i} / ${totalFiles}]${colours.none}`)
} catch (e) {
errors++;
- console.log(`${last.replace("└", " ").replace("├", "│")} └─ ${colours.red}Failed to load ${file.name} [${i} / ${messageFiles.length}]${colours.none}`)
+ console.log(`${last.replace("└", " ").replace("├", "│")} └─ ${colours.red}Failed to load ${file.name} [${i} / ${totalFiles}] | ${e}${colours.none}`)
}
}
for (const file of userFiles) {
- const last = i === userFiles.length - 1 ? "└" : "├";
+ const last = i === totalFiles - 1 ? "└" : "├";
i++;
try {
console.log(`${last}─ ${colours.yellow}Loading user context menu ${file.name}${colours.none}`)
const context = (await import(`../../../${config.userContextFolder}/${file.name}`));
context.command.setType(ApplicationCommandType.User);
+ commands.push(context.command);
- client.commands["contextCommands/user/" + file.name.replace(".js", "")] = context;
+ client.commands["contextCommands/user/" + context.command.name] = context;
console.log(`${last.replace("└", " ").replace("├", "│")} └─ ${colours.green}Loaded ${file.name} [${i} / ${userFiles.length}]${colours.none}`)
} catch (e) {
@@ -134,17 +127,18 @@
}
console.log(`Loaded ${messageFiles.length + userFiles.length - errors} context menus (${errors} failed)`)
+ return commands;
};
async function registerCommandHandler() {
client.on("interactionCreate", async (interaction: Interaction) => {
if (interaction.isUserContextMenuCommand()) {;
- const commandName = interaction.commandName;
- console.log(commandName);
+ const commandName = "contextCommands/user/" + interaction.commandName;
+ execute(client.commands[commandName]?.check, client.commands[commandName]?.callback, interaction)
return;
} else if (interaction.isMessageContextMenuCommand()) {
- const commandName = interaction.commandName;
- console.log(commandName);
+ const commandName = "contextCommands/message/" + interaction.commandName;
+ execute(client.commands[commandName]?.check, client.commands[commandName]?.callback, interaction)
return;
}
if (!interaction.isChatInputCommand()) return;
@@ -158,25 +152,39 @@
const command = client.commands[fullCommandName];
const callback = command?.callback;
const check = command?.check;
-
- if (!callback) return;
- if (check) {
- let result;
- try {
- result = await check(interaction);
- } catch (e) {
- console.log(e);
- result = false;
- }
- if (!result) return;
- }
- callback(interaction);
+ execute(check, callback, interaction);
});
}
+async function execute(check: Function | undefined, callback: Function | undefined, data: Interaction) {
+ if (!callback) return;
+ if (check) {
+ let result;
+ try {
+ result = await check(data);
+ } catch (e) {
+ console.log(e);
+ result = false;
+ }
+ if (!result) return;
+ }
+ callback(data);
+}
+
export default async function register() {
- let commandList: (SlashCommandBuilder | SlashCommandSubcommandBuilder)[] = []
- commandList.concat(await registerCommands());
+ let commandList: ( Discord.SlashCommandBuilder | Discord.ContextMenuCommandBuilder )[] = [];
+ commandList = commandList.concat(await registerCommands());
+ commandList = commandList.concat(await registerContextMenus());
+ if (process.argv.includes("--update-commands")) {
+ if (config.enableDevelopment) {
+ const guild = await client.guilds.fetch(config.developmentGuildID);
+ console.log(`${colours.purple}Registering commands in ${guild!.name}${colours.none}`)
+ await guild.commands.set(commandList);
+ } else {
+ console.log(`${colours.blue}Registering commands in production mode${colours.none}`)
+ await client.application?.commands.set(commandList);
+ }
+ }
await registerCommandHandler();
await registerEvents();
console.log(`${colours.green}Registered commands and events${colours.none}`)