import Command from '../core/command'; import { CommonLibrary } from '../core/lib'; import { loadCommands, categories } from '../core/command'; import { PermissionNames } from '../core/permissions'; export default new Command({ description: 'Lists all commands. If a command is specified, their arguments are listed as well.', usage: '([command, [subcommand/type], ...])', aliases: ['h'], async run($: CommonLibrary): Promise { const commands = await loadCommands(); let output = `Legend: \`\`, \`[list/of/stuff]\`, \`(optional)\`, \`()\`, \`([optional/list/...])\``; 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}`; } } } $.channel.send(output, { split: true }); }, any: new Command({ async run($: CommonLibrary): Promise { const commands = await loadCommands(); let header = $.args.shift() as string; let command = commands.get(header); if (!command || header === 'test') return $.channel.send(`No command found by the name \`${header}\`!`); if (command.originalCommandName) header = command.originalCommandName; else $.warn(`originalCommandName isn't defined for ${header}?!`); let permLevel = command.permission ?? Command.PERMISSIONS.NONE; let usage = command.usage; let invalid = false; 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; } } for (const param of $.args) { const type = command.resolve(param); command = command.get(param); permLevel = command.permission ?? permLevel; switch (type) { case Command.TYPES.SUBCOMMAND: header += ` ${command.originalCommandName}`; break; case Command.TYPES.USER: header += ' '; break; case Command.TYPES.NUMBER: header += ' '; break; case Command.TYPES.ANY: header += ' '; break; default: header += ` ${param}`; break; } 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[] = []; 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}`, ); } }); const addDynamicType = (cmd: Command | null, type: string) => { if (cmd) { const customUsage = cmd.usage ? ` ${cmd.usage}` : ''; list.push( `- \`${header} <${type}>${customUsage}\` - ${cmd.description}`, ); } }; addDynamicType(command.user, 'user'); addDynamicType(command.number, 'number'); addDynamicType(command.any, 'any'); append = 'Usages:' + (list.length > 0 ? `\n${list.join('\n')}` : ' None.'); } else append = `Usage: \`${header} ${usage}\``; 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 }, ); }, }), });