2020-07-25 08:15:26 +00:00
import Command from "../core/command" ;
import { CommonLibrary } from "../core/lib" ;
2020-07-26 01:14:11 +00:00
import { loadCommands , categories } from "../core/command" ;
2020-07-26 10:02:35 +00:00
import { PermissionNames } from "../core/permissions" ;
2020-07-25 08:15:26 +00:00
export default new Command ( {
description : "Lists all commands. If a command is specified, their arguments are listed as well." ,
usage : "([command, [subcommand/type], ...])" ,
2020-08-14 16:35:53 +00:00
aliases : [ "h" ] ,
2020-07-25 08:15:26 +00:00
async run ( $ : CommonLibrary ) : Promise < any >
{
2020-07-25 23:32:49 +00:00
const commands = await loadCommands ( ) ;
2020-08-14 16:35:53 +00:00
let output = ` Legend: \` <type> \` , \` [list/of/stuff] \` , \` (optional) \` , \` (<optional type>) \` , \` ([optional/list/...]) \` ` ;
2020-07-25 08:15:26 +00:00
2020-07-26 01:14:11 +00:00
for ( const [ category , headers ] of categories )
{
output += ` \ n \ n===[ ${ category } ]=== ` ;
for ( const header of headers )
{
if ( header !== "test" )
{
const command = commands . get ( header ) ;
if ( ! command )
return $ . warn ( ` Command " ${ header } " of category " ${ category } " unexpectedly doesn't exist! ` ) ;
output += ` \ n- \` ${ header } \` : ${ command . description } ` ;
}
}
}
2020-07-25 08:15:26 +00:00
2020-07-26 01:14:11 +00:00
$ . channel . send ( output , { split : true } ) ;
2020-07-25 08:15:26 +00:00
} ,
any : new Command ( {
async run ( $ : CommonLibrary ) : Promise < any >
{
2020-07-25 23:32:49 +00:00
const commands = await loadCommands ( ) ;
2020-08-14 16:35:53 +00:00
let header = $ . args . shift ( ) as string ;
2020-07-25 08:15:26 +00:00
let command = commands . get ( header ) ;
if ( ! command || header === "test" )
2020-07-26 02:35:53 +00:00
return $ . channel . send ( ` No command found by the name \` ${ header } \` ! ` ) ;
2020-08-14 16:35:53 +00:00
if ( command . originalCommandName )
header = command . originalCommandName ;
else
$ . warn ( ` originalCommandName isn't defined for ${ header } ?! ` ) ;
2020-07-26 02:35:53 +00:00
2020-07-26 10:02:35 +00:00
let permLevel = command . permission ? ? Command . PERMISSIONS . NONE ;
2020-07-26 02:35:53 +00:00
let usage = command . usage ;
let invalid = false ;
2020-08-14 16:35:53 +00:00
let selectedCategory = "Unknown" ;
for ( const [ category , headers ] of categories )
{
if ( headers . includes ( header ) )
{
if ( selectedCategory !== "Unknown" )
$ . warn ( ` Command " ${ header } " is somehow in multiple categories. This means that the command loading stage probably failed in properly adding categories. ` ) ;
else
selectedCategory = category ;
}
}
2020-07-26 02:35:53 +00:00
for ( const param of $ . args )
2020-07-25 08:15:26 +00:00
{
2020-07-26 02:35:53 +00:00
const type = command . resolve ( param ) ;
2020-08-14 16:35:53 +00:00
command = command . get ( param ) ;
permLevel = command . permission ? ? permLevel ;
2020-07-25 08:15:26 +00:00
2020-07-26 02:35:53 +00:00
switch ( type )
2020-07-25 08:15:26 +00:00
{
2020-08-14 16:35:53 +00:00
case Command.TYPES.SUBCOMMAND : header += ` ${ command . originalCommandName } ` ; break ;
2020-07-26 02:35:53 +00:00
case Command.TYPES.USER : header += " <user>" ; break ;
case Command.TYPES.NUMBER : header += " <number>" ; break ;
case Command.TYPES.ANY : header += " <any>" ; break ;
default : header += ` ${ param } ` ; break ;
2020-07-25 08:15:26 +00:00
}
2020-07-26 02:35:53 +00:00
if ( type === Command . TYPES . NONE )
{
invalid = true ;
break ;
}
}
if ( invalid )
return $ . channel . send ( ` No command found by the name \` ${ header } \` ! ` ) ;
let append = "" ;
if ( usage === "" )
{
const list : string [ ] = [ ] ;
2020-07-25 08:15:26 +00:00
2020-08-14 16:35:53 +00:00
command . subcommands . forEach ( ( subcmd , subtag ) = > {
// Don't capture duplicates generated from aliases.
if ( subcmd . originalCommandName === subtag ) {
const customUsage = subcmd . usage ? ` ${ subcmd . usage } ` : "" ;
list . push ( ` - \` ${ header } ${ subtag } ${ customUsage } \` - ${ subcmd . description } ` ) ;
}
} ) ;
2020-07-26 02:35:53 +00:00
2020-08-14 16:35:53 +00:00
const addDynamicType = ( cmd : Command | null , type : string ) = > {
if ( cmd ) {
2020-07-26 02:35:53 +00:00
const customUsage = cmd . usage ? ` ${ cmd . usage } ` : "" ;
list . push ( ` - \` ${ header } < ${ type } > ${ customUsage } \` - ${ cmd . description } ` ) ;
2020-07-25 08:15:26 +00:00
}
2020-08-14 16:35:53 +00:00
} ;
addDynamicType ( command . user , "user" ) ;
addDynamicType ( command . number , "number" ) ;
addDynamicType ( command . any , "any" ) ;
2020-07-25 08:15:26 +00:00
2020-07-26 02:35:53 +00:00
append = "Usages:" + ( list . length > 0 ? ` \ n ${ list . join ( '\n' ) } ` : " None." ) ;
2020-07-25 08:15:26 +00:00
}
2020-07-26 02:35:53 +00:00
else
append = ` Usage: \` ${ header } ${ usage } \` ` ;
2020-08-14 16:35:53 +00:00
let aliases = "None" ;
if ( command . aliases . length > 0 )
{
aliases = "" ;
for ( let i = 0 ; i < command . aliases . length ; i ++ )
{
const alias = command . aliases [ i ] ;
aliases += ` \` ${ alias } \` ` ;
if ( i !== command . aliases . length - 1 )
aliases += ", " ;
}
}
$ . channel . send ( ` Command: \` ${ header } \` \ nAliases: ${ aliases } \ nCategory: \` ${ selectedCategory } \` \ nPermission Required: \` ${ PermissionNames [ permLevel ] } \` ( ${ permLevel } ) \ nDescription: ${ command . description } \ n ${ append } ` , { split : true } ) ;
2020-07-25 08:15:26 +00:00
}
} )
} ) ;