Refactor command register to make only one call

This commit is contained in:
Ethanell 2021-11-22 10:06:25 +01:00
parent bf177e6548
commit c25ce1c0c8
13 changed files with 66 additions and 68 deletions

View file

@ -9,12 +9,6 @@ const client = new AdministratorClient({ intents: [Intents.FLAGS.GUILDS, Intents
client.once("ready", async () => { client.once("ready", async () => {
client.application = await client.application?.fetch() ?? null; client.application = await client.application?.fetch() ?? null;
if ("DEV" in process.env && process.env["DEV"] == "true") {
console.log("Dev mod enable");
await client.application?.commands.set([]);
for (const name in await client.guilds.fetch())
await (await client.guilds.fetch(name)).commands.set([]);
}
await client.modules.loadAllModules(); await client.modules.loadAllModules();
console.log("Started !"); console.log("Started !");
}); });

View file

@ -1,15 +1,10 @@
import { import {ApplicationCommandData, CommandInteraction} from "discord.js";
ApplicationCommand, ApplicationCommandData,
CommandInteraction,
GuildResolvable,
} from "discord.js";
import {Module} from "./Module"; import {Module} from "./Module";
export abstract class Command { export abstract class Command {
module: Module; module: Module;
data: ApplicationCommandData; data: ApplicationCommandData;
scope: ApplicationCommand<{ guild: GuildResolvable }> | undefined;
constructor(module: Module) { constructor(module: Module) {
this.module = module; this.module = module;
@ -18,35 +13,11 @@ export abstract class Command {
abstract execute(interaction: CommandInteraction): void; abstract execute(interaction: CommandInteraction): void;
async register() { load(): any {
try {
if ("DEV" in process.env && process.env["DEV"] == "true") {
const devGuild = await this.module.modules.client?.guilds.fetch(process.env["DEVGUILD"] as any);
this.scope = await devGuild.commands.create(this.data); // ToDo: use only one call to avoid spamming the api
} else {
this.scope = await this.module.modules.client?.application?.commands.create(this.data);
}
console.log("Successfully registered commands " + this.scope?.name); };
} catch (error) {
console.error(error);
}
}
async isRegister(): Promise<boolean> { unload(): any {
if (this.scope)
return !! await this.module.modules.client?.application?.commands.fetch(this.scope.id); // ToDo: use only one call to avoid spamming the api
return false; };
}
async load() {
if (!await this.isRegister())
await this.register();
}
async unload() {
if (await this.isRegister())
await this.unload();
}
} }

View file

@ -2,6 +2,7 @@ import { readdirSync } from "fs";
import {Module} from "./Module"; import {Module} from "./Module";
import {Command} from "./Command"; import {Command} from "./Command";
import {AdministratorClient} from "./AdministratorClient"; import {AdministratorClient} from "./AdministratorClient";
import {ApplicationCommandData, ApplicationCommandManager} from "discord.js";
export class Modules { export class Modules {
modules: Map<string, Module> = new Map<string, Module>(); modules: Map<string, Module> = new Map<string, Module>();
@ -11,11 +12,15 @@ export class Modules {
this.client = client; this.client = client;
} }
async load(name: string) { async load(name: string, createCommand: boolean = true) {
try { try {
const module: Module = new (require(__dirname+`/../modules/${name}`)[name])(this); const module: Module = new (require(__dirname+`/../modules/${name}`)[name])(this);
await module.load(); await module.load();
this.modules.set(name, module); this.modules.set(name, module);
if (createCommand)
await this.registerCommand(module.commands.map(c => c.data));
console.info(`Module ${name} loaded`) console.info(`Module ${name} loaded`)
} catch (error) { } catch (error) {
console.error(`Fail to load module ${name}`); console.error(`Fail to load module ${name}`);
@ -56,7 +61,9 @@ export class Modules {
async loadAllModules() { async loadAllModules() {
for (const module of await this.allModules()) for (const module of await this.allModules())
await this.load(module.name); await this.load(module.name, false);
await this.registerCommand(this.allCommands().map(c => c.data), true);
} }
async unloadAllModules() { async unloadAllModules() {
@ -69,12 +76,40 @@ export class Modules {
await this.reload(module.name); await this.reload(module.name);
} }
async registerCommand(data: ApplicationCommandData | ApplicationCommandData[], set: boolean = false) {
if (!this.client.application) {
this.client.logger.err("Fail to register command, client application is undefined !");
return;
}
let commands: ApplicationCommandManager = this.client.application.commands;
if ("DEV" in process.env && process.env["DEV"] == "true") {
await commands.set([]);
commands = (await this.client?.guilds.fetch(process.env["DEVGUILD"] as any)).commands as any;
}
if (Array.isArray(data))
if (set)
await commands.set(data);
else
for (const d of data)
await commands.create(d);
else
if (set)
await commands.set([data]);
else
await commands.create(data);
}
allCommands() : Command[] {
return Array.from(this.modules.values()).map(m => m.commands).reduce((l, m) => l.concat(m));
}
getCommand(name: string): Command | null { getCommand(name: string): Command | null {
for (const module of Array.from(this.modules.values())) for (const command of this.allCommands())
for (const command of module.commands)
if (command.data.name == name) if (command.data.name == name)
return command; return command;
return null; return null;
} }
} }

View file

@ -1,7 +1,6 @@
import {Command} from "../../lib/Command"; import {Command} from "../../../lib/Command";
import {ChatInputApplicationCommandData, CommandInteraction, GuildMember} from "discord.js"; import {ChatInputApplicationCommandData, CommandInteraction, GuildMember} from "discord.js";
import {Music} from "./index"; import {Music} from "../index";
import {AudioPlayerStatus} from "@discordjs/voice";
export class DisconnectCommand extends Command { export class DisconnectCommand extends Command {

View file

@ -1,7 +1,6 @@
import {Command} from "../../lib/Command"; import {Command} from "../../../lib/Command";
import {ChatInputApplicationCommandData, CommandInteraction, GuildMember} from "discord.js"; import {ChatInputApplicationCommandData, CommandInteraction, GuildMember} from "discord.js";
import {Music} from "./index"; import {Music} from "../index";
import {AudioPlayerPausedState, AudioPlayerStatus} from "@discordjs/voice";
export class FlushCommand extends Command { export class FlushCommand extends Command {

View file

@ -1,7 +1,7 @@
import {Command} from "../../lib/Command"; import {Command} from "../../../lib/Command";
import {ChatInputApplicationCommandData, CommandInteraction, GuildMember} from "discord.js"; import {ChatInputApplicationCommandData, CommandInteraction, GuildMember} from "discord.js";
import {Music} from "./index"; import {Music} from "../index";
import {AudioPlayerPausedState, AudioPlayerStatus} from "@discordjs/voice"; import {AudioPlayerStatus} from "@discordjs/voice";
export class PauseCommand extends Command { export class PauseCommand extends Command {

View file

@ -1,8 +1,8 @@
import {Command} from "../../lib/Command"; import {Command} from "../../../lib/Command";
import {ChatInputApplicationCommandData, CommandInteraction, GuildMember, VoiceChannel} from "discord.js"; import {ChatInputApplicationCommandData, CommandInteraction, GuildMember, VoiceChannel} from "discord.js";
import {Music} from "./index"; import {Music} from "../index";
import {Player} from "./Player"; import {Player} from "../lib/Player";
import {Track} from "./Track"; import {Track} from "../lib/Track";
import {entersState, VoiceConnectionStatus} from "@discordjs/voice"; import {entersState, VoiceConnectionStatus} from "@discordjs/voice";
const {Constants: { ApplicationCommandOptionTypes }} = require("discord.js"); const {Constants: { ApplicationCommandOptionTypes }} = require("discord.js");

View file

@ -1,6 +1,6 @@
import {Command} from "../../lib/Command"; import {Command} from "../../../lib/Command";
import {ChatInputApplicationCommandData, CommandInteraction, GuildMember} from "discord.js"; import {ChatInputApplicationCommandData, CommandInteraction, GuildMember} from "discord.js";
import {Music} from "./index"; import {Music} from "../index";
import {AudioPlayerStatus} from "@discordjs/voice"; import {AudioPlayerStatus} from "@discordjs/voice";

View file

@ -1,6 +1,6 @@
import {Command} from "../../lib/Command"; import {Command} from "../../../lib/Command";
import {ChatInputApplicationCommandData, CommandInteraction, GuildMember} from "discord.js"; import {ChatInputApplicationCommandData, CommandInteraction, GuildMember} from "discord.js";
import {Music} from "./index"; import {Music} from "../index";
import {AudioPlayerStatus} from "@discordjs/voice"; import {AudioPlayerStatus} from "@discordjs/voice";

View file

@ -1,6 +1,6 @@
import {Command} from "../../lib/Command"; import {Command} from "../../../lib/Command";
import {ChatInputApplicationCommandData, CommandInteraction, GuildMember} from "discord.js"; import {ChatInputApplicationCommandData, CommandInteraction, GuildMember} from "discord.js";
import {Music} from "./index"; import {Music} from "../index";
import {AudioPlayerStatus} from "@discordjs/voice"; import {AudioPlayerStatus} from "@discordjs/voice";

View file

@ -1,6 +1,6 @@
import {Command} from "../../lib/Command"; import {Command} from "../../../lib/Command";
import {ChatInputApplicationCommandData, CommandInteraction, GuildMember} from "discord.js"; import {ChatInputApplicationCommandData, CommandInteraction, GuildMember} from "discord.js";
import {Music} from "./index"; import {Music} from "../index";
import {AudioPlayerStatus} from "@discordjs/voice"; import {AudioPlayerStatus} from "@discordjs/voice";