muskytape
Version:
Framework não oficial do Discord.js
106 lines (97 loc) • 4.23 kB
JavaScript
const { stripIndents, oneLine } = require('common-tags');
const Command = require('../base');
const { disambiguation } = require('../../util');
module.exports = class HelpCommand extends Command {
constructor(client) {
super(client, {
name: 'help',
group: 'util',
memberName: 'help',
aliases: ['commands'],
description: 'Exibe uma lista de comandos disponíveis ou informações detalhadas para um comando especificado.',
details: oneLine`
O comando pode ser parte de um nome de comando ou um nome de comando completo.
Se não for especificado, todos os comandos disponíveis serão listados.
`,
examples: ['help', 'help prefix'],
guarded: true,
args: [
{
key: 'command',
prompt: 'Para qual comando você gostaria de ver a ajuda?',
type: 'string',
default: ''
}
]
});
}
async run(msg, args) { // eslint-disable-line complexity
const groups = this.client.registry.groups;
const commands = this.client.registry.findCommands(args.command, false, msg);
const showAll = args.command && args.command.toLowerCase() === 'all';
if(args.command && !showAll) {
if(commands.length === 1) {
let help = stripIndents`
${oneLine`
__Command **${commands[0].name}**:__ ${commands[0].description}
${commands[0].guildOnly ? ' (Pode ser usado apenas em servidores)' : ''}
${commands[0].nsfw ? ' (NSFW)' : ''}
`}
**Formato:** ${msg.anyUsage(`${commands[0].name}${commands[0].format ? ` ${commands[0].format}` : ''}`)}
`;
if(commands[0].aliases.length > 0) help += `\n**Aliases:** ${commands[0].aliases.join(', ')}`;
help += `\n${oneLine`
**Grupo:** ${commands[0].group.name}
(\`${commands[0].groupID}:${commands[0].memberName}\`)
`}`;
if(commands[0].details) help += `\n**Detalhes:** ${commands[0].details}`;
if(commands[0].examples) help += `\n**Exemplos:**\n${commands[0].examples.join('\n')}`;
const messages = [];
try {
messages.push(await msg.direct(help));
if(msg.channel.type !== 'dm') messages.push(await msg.reply('Enviou a você um DM com informações.'));
} catch(err) {
messages.push(await msg.reply('Incapaz de enviar o DM de ajuda. Você provavelmente tem DMs desativados.'));
}
return messages;
} else if(commands.length > 15) {
return msg.reply('Vários comandos encontrados. Por favor seja mais específico.');
} else if(commands.length > 1) {
return msg.reply(disambiguation(commands, 'comandos'));
} else {
return msg.reply(
`Incapaz de identificar o comando. Use ${msg.usage(
null, msg.channel.type === 'dm' ? null : undefined, msg.channel.type === 'dm' ? null : undefined
)} para ver a lista de todos os comandos.`
);
}
} else {
const messages = [];
try {
messages.push(await msg.direct(stripIndents`
${oneLine`
Para executar um comando em ${msg.guild ? msg.guild.name : 'qualquer servidor'},
Use ${Command.usage('comando', msg.guild ? msg.guild.commandPrefix : null, this.client.user)}.
Por exemplo, ${Command.usage('ping', msg.guild ? msg.guild.commandPing : null, this.client.user)}.
`}
Para executar um comando neste DM, basta usar ${Command.usage('comando', null, null)} sem prefixo.
Use ${this.usage('<comando>', null, null)} para ver informações detalhadas sobre um comando específico.
Use ${this.usage('all', null, null)} para ver uma lista de *todos* os comandos, não apenas os disponíveis.
__**${showAll ? 'Todos os comandos' : `Comandos disponíveis em ${msg.guild || 'neste DM'}`}**__
${groups.filter(grp => grp.commands.some(cmd => !cmd.hidden && (showAll || cmd.isUsable(msg))))
.map(grp => stripIndents`
__${grp.name}__
${grp.commands.filter(cmd => !cmd.hidden && (showAll || cmd.isUsable(msg)))
.map(cmd => `**${cmd.name}:** ${cmd.description}${cmd.nsfw ? ' (NSFW)' : ''}`).join('\n')
}
`).join('\n\n')
}
`, { split: true }));
if(msg.channel.type !== 'dm') messages.push(await msg.react('⚡'));
} catch(err) {
messages.push(await msg.reply('Eu não tenho permissões para enviar DM para você 😥'));
}
return messages;
}
}
};