2022-07-29 13:16:43 +02:00
import { OptionType } from "../interfaces/CommandOption" ;
2022-07-28 21:06:11 +02:00
import { ICommand , CommandDefinition } from "../interfaces/Command" ;
import SubcommandOption from "./SubcommandOption" ;
import SubcommandGroupOption from "./SubcommandGroupOption" ;
2022-07-29 13:16:43 +02:00
import CommandOption from "./CommandOption" ;
2022-07-29 19:37:34 +02:00
import { ArgsResult } from "../Parser" ;
2022-07-28 21:06:11 +02:00
2022-07-29 19:37:34 +02:00
abstract class Command implements ICommand {
2022-07-28 21:06:11 +02:00
name : string ;
aliases : string [ ] ;
2022-07-29 13:16:43 +02:00
options : CommandOption [ ] ;
2022-07-28 21:06:11 +02:00
constructor ( def : CommandDefinition ) {
2023-02-12 17:08:52 +01:00
if ( typeof def !== 'object' ) throw new Error ( 'Missing command definition' ) ;
if ( ! def . name ) throw new Error ( 'Missing name for command' ) ;
2022-07-28 21:06:11 +02:00
this . name = def . name ;
this . aliases = def . aliases || [ ] ;
2022-07-29 17:47:45 +02:00
this . options = [ ] ;
for ( const opt of def . options || [ ] ) {
if ( opt instanceof CommandOption ) this . options . push ( opt ) ;
else this . options . push ( new CommandOption ( opt ) ) ;
}
2023-02-12 17:08:52 +01:00
if ( this . options . some ( opt = > [ OptionType . SUB_COMMAND , OptionType . SUB_COMMAND_GROUP ] . includes ( opt . type ) )
&& this . options . some ( opt = > ! [ OptionType . SUB_COMMAND , OptionType . SUB_COMMAND_GROUP ] . includes ( opt . type ) ) ) throw new Error ( 'Cannot have subcommand(group)s on the same level as an option' )
2022-07-28 21:06:11 +02:00
}
2022-07-29 19:37:34 +02:00
abstract execute ( message : unknown , args : ArgsResult ) : Promise < unknown > ;
2022-07-28 21:06:11 +02:00
get subcommands ( ) : SubcommandOption [ ] {
return this . _subcommands ( this . options ) ;
}
get subcommandGroups ( ) : SubcommandGroupOption [ ] {
return this . options . filter ( ( opt ) = > opt . type === OptionType . SUB_COMMAND_GROUP ) ;
}
subcommand ( name : string ) : SubcommandOption | null {
name = name . toLowerCase ( ) ;
2023-02-12 15:30:54 +01:00
return this . subcommands . find ( ( cmd ) = > cmd . name === name || cmd . aliases . includes ( name ) ) || null ;
2022-07-28 21:06:11 +02:00
}
subcommandGroup ( name : string ) : SubcommandGroupOption | null {
name = name . toLowerCase ( ) ;
2023-02-12 15:30:54 +01:00
return this . subcommandGroups . find ( ( grp ) = > grp . name === name || grp . aliases . includes ( name ) ) || null ;
2022-07-28 21:06:11 +02:00
}
2022-07-29 13:16:43 +02:00
private _subcommands ( options : CommandOption [ ] ) : SubcommandOption [ ] {
2022-07-28 21:06:11 +02:00
const subcommands : SubcommandOption [ ] = [ ] ;
for ( const opt of options ) {
if ( opt . type === OptionType . SUB_COMMAND ) subcommands . push ( opt ) ;
else if ( opt . type === OptionType . SUB_COMMAND_GROUP ) subcommands . push ( . . . this . _subcommands ( opt . options ) ) ;
}
return subcommands ;
}
}
export { Command } ;
export default Command ;