feat(settings): support toggling disabled commands and auto-reload bot on save

This commit is contained in:
syntaxbullet
2026-01-08 22:44:48 +01:00
parent c6fd23b5fa
commit 9caa95a0d8
4 changed files with 15 additions and 3 deletions

View File

@@ -8,6 +8,7 @@ import { EventLoader } from "@lib/loaders/EventLoader";
export class Client extends DiscordClient {
commands: Collection<string, Command>;
knownCommands: Set<string>;
lastCommandTimestamp: number | null = null;
maintenanceMode: boolean = false;
private commandLoader: CommandLoader;
@@ -16,6 +17,7 @@ export class Client extends DiscordClient {
constructor({ intents }: { intents: number[] }) {
super({ intents });
this.commands = new Collection<string, Command>();
this.knownCommands = new Set<string>();
this.commandLoader = new CommandLoader(this);
this.eventLoader = new EventLoader(this);
}
@@ -77,6 +79,7 @@ export class Client extends DiscordClient {
async loadCommands(reload: boolean = false) {
if (reload) {
this.commands.clear();
this.knownCommands.clear();
console.log("♻️ Reloading commands...");
}

View File

@@ -4,7 +4,7 @@ import type { Command } from "@shared/lib/types";
import { config } from "@shared/lib/config";
import type { LoadResult, LoadError } from "./types";
import type { Client } from "../BotClient";
/**
* Handles loading commands from the file system
@@ -71,6 +71,9 @@ export class CommandLoader {
if (this.isValidCommand(command)) {
command.category = category;
// Track all known commands regardless of enabled status
this.client.knownCommands.add(command.data.name);
const isEnabled = config.commands[command.data.name] !== false;
if (!isEnabled) {

View File

@@ -61,7 +61,8 @@ mock.module("../../bot/lib/BotClient", () => ({
},
commands: [
{ data: { name: "ping" } }
]
],
knownCommands: new Set(["ping", "help", "disabled-cmd"])
}
}));

View File

@@ -186,8 +186,13 @@ export async function createWebServer(config: WebServerConfig = {}): Promise<Web
// Merge partial update into current config
const mergedConfig = deepMerge(currentConfig, partialConfig);
// saveConfig throws if validation fails
saveConfig(mergedConfig);
const { systemEvents, EVENTS } = await import("@shared/lib/events");
systemEvents.emit(EVENTS.ACTIONS.RELOAD_COMMANDS);
return Response.json({ success: true });
}
} catch (error) {
@@ -221,7 +226,7 @@ export async function createWebServer(config: WebServerConfig = {}): Promise<Web
const channels = guild.channels.cache
.map(c => ({ id: c.id, name: c.name, type: c.type }));
const commands = AuroraClient.commands.map(c => c.data.name);
const commands = Array.from(AuroraClient.knownCommands).sort();
return Response.json({ roles, channels, commands });
} catch (error) {