Skip to content

Commit 70be37b

Browse files
committed
✨ updateSlashCommands
1 parent bb9b64f commit 70be37b

1 file changed

Lines changed: 69 additions & 21 deletions

File tree

src/classes/ModuleLoader.ts

Lines changed: 69 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
import debug from "debug";
2-
import { Collection } from "discord.js";
3-
import { existsSync } from "node:fs";
2+
import { ApplicationCommand, Collection } from "discord.js";
3+
import { existsSync, lstatSync } from "node:fs";
44
import { readdir } from "node:fs/promises";
5-
import { basename, dirname, resolve } from "node:path";
5+
import { basename, resolve } from "node:path";
66

77
import DiscordCommand from "./DiscordCommand";
88
import DiscordEvent from "./DiscordEvent";
@@ -42,22 +42,25 @@ export default class DiscordModuleLoader {
4242
this.commandCooldownMessage = options.commandCooldownMessage;
4343

4444
client.setMaxListeners(Infinity);
45-
client.on("interactionCreate", this.handleInteraction);
45+
client.on("interactionCreate", int => this.handleInteraction(int));
4646
}
4747

4848
async loadGuilds(dir = "guilds") {
4949
dir = resolve(dir);
5050
if (!existsSync(dir)) return [];
5151

52-
const guilds = (await readdir(dir)).filter(file => file.endsWith(".js")),
53-
log = this.log.extend(basename(dirname(dir)));
52+
const guilds = await readdir(dir),
53+
log = this.log.extend(basename(dir));
5454

55-
log("Loading %d guilds", guilds.length);
55+
log("Loading %d guilds modules", guilds.length);
5656

5757
const returnGuilds: [string, DiscordGuild][] = [];
5858
for (const folder of guilds) {
59+
if (!lstatSync(resolve(dir, folder)).isDirectory())
60+
throw new Error(`${folder} is not a directory.`);
61+
5962
if (!existsSync(resolve(dir, folder, "index.js")))
60-
throw new Error(`Couldn't find index.js in ${dir}`);
63+
throw new Error(`Couldn't find index.js in ${folder}`);
6164

6265
const guild = (await import(resolve(dir, folder, "index.js"))).default;
6366

@@ -90,7 +93,7 @@ export default class DiscordModuleLoader {
9093

9194
this.guilds.set(guild.id, guild);
9295
returnGuilds.push([guild.id, guild]);
93-
log("Loaded guild %s", guild.id);
96+
log("Loaded guild module for guild: %s", guild.id);
9497
}
9598
return returnGuilds;
9699
}
@@ -99,15 +102,18 @@ export default class DiscordModuleLoader {
99102
dir = resolve(dir);
100103
if (!existsSync(dir)) return [];
101104

102-
const modules = (await readdir(dir)).filter(file => file.endsWith(".js")),
103-
log = this.log.extend(basename(dirname(dir)));
105+
const modules = await readdir(dir),
106+
log = this.log.extend(basename(dir));
104107

105108
log("Loading %d modules", modules.length);
106109

107110
const returnModules: [string, DiscordModule][] = [];
108111
for (const folder of modules) {
112+
if (!lstatSync(resolve(dir, folder)).isDirectory())
113+
throw new Error(`${folder} is not a directory.`);
114+
109115
if (!existsSync(resolve(dir, folder, "index.js")))
110-
throw new Error(`Couldn't find index.js in ${dir}`);
116+
throw new Error(`Couldn't find index.js in ${folder}`);
111117

112118
const module = (await import(resolve(dir, folder, "index.js"))).default;
113119

@@ -151,7 +157,7 @@ export default class DiscordModuleLoader {
151157
if (!existsSync(dir)) return [];
152158

153159
const events = (await readdir(dir)).filter(file => file.endsWith(".js")),
154-
log = this.log.extend(basename(dirname(dir)));
160+
log = this.log.extend(basename(dir));
155161

156162
log("Loading %d events", events.length);
157163

@@ -174,7 +180,7 @@ export default class DiscordModuleLoader {
174180
if (!existsSync(dir)) return [];
175181

176182
const commands = (await readdir(dir)).filter(file => file.endsWith(".js")),
177-
log = this.log.extend(basename(dirname(dir)));
183+
log = this.log.extend(basename(dir));
178184

179185
log("Loading %d commands", commands.length);
180186

@@ -207,8 +213,8 @@ export default class DiscordModuleLoader {
207213
const localGlobalCommands = this.commands.filter(c => c.scope === "GLOBAL"),
208214
log = this.log.extend("SlashCommands");
209215

210-
//TODO add guild commands and permissions
211-
await this.client.application.commands.set(
216+
log("Setting %d global commands...", localGlobalCommands.size);
217+
const globalCommands = await this.client.application.commands.set(
212218
localGlobalCommands
213219
.map(c => {
214220
if (c.hasUserCommand)
@@ -221,10 +227,27 @@ export default class DiscordModuleLoader {
221227
.flat()
222228
);
223229

224-
for (const [id, guild] of this.guilds.entries()) {
225-
if (!guild.commands.size) return;
226-
await this.client.guilds.cache.get(id)!.commands.set(
227-
guild.commands
230+
for (const [id, guild] of this.client.guilds.cache) {
231+
const commands: [ApplicationCommand<{}>, DiscordCommand][] =
232+
globalCommands
233+
.map((c): [ApplicationCommand<{}>, DiscordCommand] => [
234+
c,
235+
localGlobalCommands.find(
236+
g => g.name.toLowerCase() === c.name.toLowerCase()
237+
)!
238+
])
239+
.filter(c => !!c[1].permissions),
240+
dGuild = this.guilds.get(id);
241+
242+
if (dGuild?.commands.size)
243+
log(
244+
"Setting %d commands for guild %s...",
245+
dGuild.commands.size,
246+
guild.name
247+
);
248+
249+
const gCommands = await guild.commands.set(
250+
dGuild?.commands
228251
.map(c => {
229252
if (c.hasUserCommand)
230253
return [
@@ -233,8 +256,33 @@ export default class DiscordModuleLoader {
233256
];
234257
return [this.convertToGlobalCommand(c)];
235258
})
236-
.flat()
259+
.flat() ?? []
260+
);
261+
262+
commands.push(
263+
...gCommands
264+
.map((c): [ApplicationCommand<{}>, DiscordCommand] => [
265+
c,
266+
dGuild?.commands.find(
267+
c => c.name.toLowerCase() === c.name.toLowerCase()
268+
)!
269+
])
270+
.filter(c => !!c[1].permissions)
237271
);
272+
273+
if (commands.length) {
274+
log(
275+
"Setting permissions for %d commands in guild %s...",
276+
commands.length,
277+
guild.name
278+
);
279+
await guild.commands.permissions.set({
280+
fullPermissions: commands.map(c => ({
281+
id: c[0].id,
282+
permissions: c[1].permissions!
283+
}))
284+
});
285+
}
238286
}
239287
}
240288

0 commit comments

Comments
 (0)