commands command lists commands, added instead admin setting for disabling

This commit is contained in:
Erik 2022-05-09 16:16:34 +03:00
parent cfd5a2f59a
commit f74aaad487
Signed by: Navy.gif
GPG Key ID: 811EC0CD80E7E5FB
3 changed files with 130 additions and 106 deletions

View File

@ -1,106 +0,0 @@
const { Emojis } = require("../../../../constants");
const { SlashCommand, CommandError } = require("../../../interfaces");
class Commands extends SlashCommand {
// Used to disable and enable commands, possibly list them?
constructor(client) {
super(client, {
name: 'commands',
module: 'administration',
description: 'Manage commands',
options: [{
name: ['disable', 'enable'],
type: 'SUB_COMMAND',
description: ['Disable commands', 'Enable commands'],
options: [{
name: 'commands',
type: 'STRING',
description: ''
} ]
}, {
name: ['list'],
type: 'SUB_COMMAND',
description: ['List disabled commands'],
options: []
}],
memberPermissions: ['MANAGE_GUILD'],
guildOnly: true
});
}
async execute(interaction, { commands }) {
const { subcommand, guild } = interaction;
const settings = await guild.settings();
const { disabledCommands = [] } = settings;
if (subcommand.name === 'list') return this._listDisabledCommands(interaction, disabledCommands);
if (!commands) throw new CommandError(interaction, { index: 'COMMAND_COMMANDS_MISSING_ARG' });
const resolved = [],
invalid = [],
alreadyDisabled = [];
let warning = false;
for (const _cmd of commands.value.split(' ')) {
const [cmd] = this.client.resolver.components(_cmd, 'command');
if (!cmd) {
invalid.push(_cmd);
continue;
}
if (resolved.includes(cmd.resolveable) || cmd.resolveable === 'command:commands') continue;
if (disabledCommands.includes(cmd.resolveable) && subcommand.name === 'disable') {
alreadyDisabled.push(cmd.resolveable);
continue;
}
if (cmd.module.name === 'administration' && subcommand.name === 'disable') warning = true;
resolved.push(cmd.resolveable);
}
if (!resolved.length) {
let response = null;
if (alreadyDisabled.length) response = interaction.format('COMMAND_COMMANDS_ALREADY_DISABLED', { alreadyDisabled: alreadyDisabled.join('`, `') });
else response = interaction.format('COMMAND_COMMANDS_NO_RESOLVED');
if (invalid.length) response += '\n\n' + interaction.format('COMMAND_COMMANDS_INVALID', { invalid: invalid.join('`, `') });
return { content: response, emoji: 'failure' };
}
if (subcommand.name === 'disable') {
disabledCommands.push(...resolved);
} else if (subcommand.name === 'enable') {
for (const disabled of resolved) {
const index = disabledCommands.indexOf(disabled);
if(index > -1) disabledCommands.splice(index, 1);
}
}
await guild.updateSettings({ disabledCommands });
let response = interaction.format(`COMMAND_COMMANDS_${subcommand.name.toUpperCase()}`, { resolved: resolved.join(`**, **`) });
if (alreadyDisabled.length) response += '\n\n' + interaction.format('COMMAND_COMMANDS_ALREADY_DISABLED', { alreadyDisabled: alreadyDisabled.join('`, `') });
if (invalid.length) response += '\n\n' + interaction.format('COMMAND_COMMANDS_INVALID', { invalid: invalid.join('`, `') });
return {
content: response, emoji: 'success', embeds: warning ? [{
title: `${Emojis.warning} WARNING`,
color: 0xffe15c,
description: interaction.format('COMMAND_COMMANDS_DISABLE_WARN')
}] : undefined };
}
async _listDisabledCommands(interaction, commands) {
if (!commands?.length) return { index: 'COMMAND_COMMANDS_NONE_DISABLED' };
return { content: interaction.format('COMMAND_COMMANDS_LIST', { commands: commands.join('`, `') }) };
}
}
module.exports = Commands;

View File

@ -0,0 +1,61 @@
const { Emojis } = require("../../../../constants");
const { SlashCommand } = require("../../../interfaces");
class Commands extends SlashCommand {
// Used to disable and enable commands, possibly list them?
constructor(client) {
super(client, {
name: 'commands',
module: 'information',
description: 'List commands',
options: [{
name: ['module'],
type: 'MODULE',
description: ['List commands from a specific module']
}],
memberPermissions: ['MANAGE_GUILD'],
guildOnly: true
});
}
async execute(invoker, { module }) {
const { guild } = invoker;
const settings = await guild.settings();
const { commands: { disabled } } = settings;
let commands = null;
if (module) commands = module.value.components.filter((c) => c._type === 'command');
// eslint-disable-next-line prefer-destructuring
else commands = this.client.registry.commands;
const modules = {};
for (const command of commands.values()) {
if (command.restricted) continue;
const _module = command.module.name;
if (!modules[_module]) modules[_module] = [];
const emoji = disabled.includes(command.resolveable) ? Emojis.failure : Emojis.success;
modules[_module].push(`${emoji} ${command.name}`);
}
const embed = {
title: guild.format('COMMAND_COMMANDS_TITLE'),
fields: []
};
for (const [module, commands] of Object.entries(modules).sort(([, a], [, b]) => a.length - b.length)) {
embed.fields.push({
name: module,
value: commands.join('\n'),
inline: true
});
}
return invoker.reply({ embed });
}
}
module.exports = Commands;

View File

@ -0,0 +1,69 @@
const { Setting } = require("../../../interfaces");
class CommandsSetting extends Setting {
constructor(client) {
super(client, {
name: 'commands',
module: 'administration',
description: 'Manage commands',
display: 'Commands',
default: {
disabled: [],
custom: {}
},
definitions: {
disabled: { ARRAY: 'COMMAND' },
custom: { OBJECT: 'CUSTOM_COMMAND' }
},
commandType: 'SUB_COMMAND_GROUP',
commandOptions: [{
name: ['enable', 'disable'],
description: ['Enable commands', 'Disable commands'],
type: 'SUB_COMMAND',
options: [{
name: 'commands',
description: 'The command to enable/disable',
type: 'COMMANDS',
required: true
}]
}, {
name: 'list',
description: 'List disabled commands',
type: 'SUB_COMMAND'
}]
});
}
async execute(invoker, { commands }, setting) {
const { subcommand, guild } = invoker;
let warning = null;
if (subcommand.name === 'enable') {
if (!setting.disabled.length) return { error: true, index: 'SETTING_COMMANDS_NONE' };
for (const command of commands.value) {
const index = setting.disabled.indexOf(command.resolveable);
if(index >= 0) setting.disabled.splice(index, 1);
}
} else if (subcommand.name === 'disable') {
for (const command of commands.value) {
if (command.module.name === 'administration') {
warning = guild.format('SETTING_COMMAND_WARNING');
continue;
}
if(!setting.disabled.includes(command.resolveable)) setting.disabled.push(command.resolveable);
}
if(warning) return { content: warning };
} else if (subcommand.name === 'list') {
let content = null;
if (setting.disabled.length) content = setting.disabled.join(', ');
else content = guild.format('SETTING_COMMANDS_NONE');
return { content };
}
return { index: 'SETTING_SUCCESS_ALT' };
}
}
module.exports = CommandsSetting;