11import 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" ;
44import { readdir } from "node:fs/promises" ;
5- import { basename , dirname , resolve } from "node:path" ;
5+ import { basename , resolve } from "node:path" ;
66
77import DiscordCommand from "./DiscordCommand" ;
88import 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