TravBot-v3/src/commands/system/help.ts

89 lines
3.7 KiB
TypeScript
Raw Normal View History

import {Command, NamedCommand, loadableCommands, categories, getPermissionName} from "../../core";
import {toTitleCase} from "../../lib";
export default new NamedCommand({
2020-12-15 07:56:09 +00:00
description: "Lists all commands. If a command is specified, their arguments are listed as well.",
2020-12-15 01:44:28 +00:00
usage: "([command, [subcommand/type], ...])",
aliases: ["h"],
async run({message, channel, guild, author, member, client, args}) {
const commands = await loadableCommands;
2020-12-15 01:44:28 +00:00
let output = `Legend: \`<type>\`, \`[list/of/stuff]\`, \`(optional)\`, \`(<optional type>)\`, \`([optional/list/...])\``;
2020-10-15 09:23:24 +00:00
2020-12-15 01:44:28 +00:00
for (const [category, headers] of categories) {
output += `\n\n===[ ${toTitleCase(category)} ]===`;
2020-10-15 09:23:24 +00:00
2020-12-15 01:44:28 +00:00
for (const header of headers) {
if (header !== "test") {
const command = commands.get(header)!;
2020-12-15 01:44:28 +00:00
output += `\n- \`${header}\`: ${command.description}`;
}
}
2020-10-15 09:23:24 +00:00
}
channel.send(output, {split: true});
2020-12-15 01:44:28 +00:00
},
any: new Command({
async run({message, channel, guild, author, member, client, args}) {
// Setup the root command
const commands = await loadableCommands;
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 instanceof NamedCommand))
return channel.send(`Command is not a proper instance of NamedCommand.`);
if (command.name) header = command.name;
// Search categories
let category = "Unknown";
for (const [referenceCategory, headers] of categories) {
if (headers.includes(header)) {
category = toTitleCase(referenceCategory);
break;
}
}
// Gather info
const result = await command.resolveInfo(args);
if (result.type === "error") return channel.send(result.message);
2020-12-15 01:44:28 +00:00
let append = "";
command = result.command;
2020-12-15 01:44:28 +00:00
if (command.usage === "") {
2020-12-15 01:44:28 +00:00
const list: string[] = [];
for (const [tag, subcommand] of result.keyedSubcommandInfo) {
const customUsage = subcommand.usage ? ` ${subcommand.usage}` : "";
list.push(`- \`${header} ${tag}${customUsage}\` - ${subcommand.description}`);
}
2020-12-15 01:44:28 +00:00
for (const [type, subcommand] of result.subcommandInfo) {
const customUsage = subcommand.usage ? ` ${subcommand.usage}` : "";
list.push(`- \`${header} ${type}${customUsage}\` - ${subcommand.description}`);
}
2020-12-15 01:44:28 +00:00
2020-12-15 07:56:09 +00:00
append = "Usages:" + (list.length > 0 ? `\n${list.join("\n")}` : " None.");
} else {
append = `Usage: \`${header} ${command.usage}\``;
}
let aliases = "N/A";
2020-12-15 01:44:28 +00:00
if (command instanceof NamedCommand) {
const formattedAliases: string[] = [];
for (const alias of command.aliases) formattedAliases.push(`\`${alias}\``);
// Short circuit an empty string, in this case, if there are no aliases.
aliases = formattedAliases.join(", ") || "None";
}
2020-12-15 01:44:28 +00:00
return channel.send(
`Command: \`${header}\`\nAliases: ${aliases}\nCategory: \`${category}\`\nPermission Required: \`${getPermissionName(
result.permission
)}\` (${result.permission})\nDescription: ${command.description}\n${append}`,
2020-12-15 01:44:28 +00:00
{split: true}
2020-10-15 09:23:24 +00:00
);
}
2020-12-15 01:44:28 +00:00
})
2020-10-15 09:23:24 +00:00
});