Fixed logic error in option parsing
Allow commands command to run in dms
This commit is contained in:
Erik 2023-12-13 19:13:21 +02:00
parent 720738d7ab
commit 18fb92c3a0
6 changed files with 25 additions and 19 deletions

View File

@ -231,10 +231,10 @@ class DiscordClient extends Client
// Needs to load in after connecting to discord // Needs to load in after connecting to discord
await this.#moderationManager.initialise(); await this.#moderationManager.initialise();
this.#setActivity(); this.setActivity();
this.#activityInterval = setInterval(() => this.#activityInterval = setInterval(() =>
{ {
this.#setActivity(); this.setActivity();
}, Util.random(5, 10) * 60 * 60 * 1000); }, Util.random(5, 10) * 60 * 60 * 1000);
this.#built = true; this.#built = true;
@ -341,7 +341,7 @@ class DiscordClient extends Client
return this.#options.logger; return this.#options.logger;
} }
async #setActivity () async setActivity ()
{ {
if (!this.shard || !this.user) if (!this.shard || !this.user)
throw new Error('Missing shard or user'); throw new Error('Missing shard or user');

View File

@ -7,6 +7,7 @@ class ModerationModule extends SettingsCommand
{ {
super(client, { super(client, {
name: 'moderation', name: 'moderation',
aliases: [ 'mod' ],
description: 'Configure the moderation settings', description: 'Configure the moderation settings',
moduleName: 'administration' moduleName: 'administration'
}); });

View File

@ -23,20 +23,22 @@ class Commands extends SlashCommand
description: [ 'List commands from a specific module' ] description: [ 'List commands from a specific module' ]
}], }],
memberPermissions: [], memberPermissions: [],
guildOnly: true // guildOnly: true
}); });
} }
async execute (invoker: InvokerWrapper, { module }: CommandParams) async execute (invoker: InvokerWrapper, { module }: CommandParams)
{ {
const guild = invoker.guild!; const { guild } = invoker;
const settings = await guild.settings(); const settings = await guild?.settings();
const { commands: { disabled } } = settings; let disabled: string[] = [];
if (settings)
({ commands: { disabled } } = settings);
let commands: Collection<string, Command> | null = null; let commands: Collection<string, Command> | null = null;
if (module) if (module)
commands = module.asModule.components.filter<Command>((c): c is Command => c.type === 'command'); commands = module.asModule.components.filter<Command>((c): c is Command => c.type === 'command');
// eslint-disable-next-line prefer-destructuring
else else
({ commands } = this.client.registry); ({ commands } = this.client.registry);
const amt = commands.size; const amt = commands.size;
@ -49,12 +51,12 @@ class Commands extends SlashCommand
const _module = command.module.name; const _module = command.module.name;
if (!modules[_module]) if (!modules[_module])
modules[_module] = []; modules[_module] = [];
const emoji = disabled?.includes(command.resolveable) ? Emojis.failure : Emojis.success; const emoji = disabled?.includes(command.resolveable) || !guild && command.guildOnly ? Emojis.failure : Emojis.success;
modules[_module].push(`${emoji} ${Util.capitalise(command.name)}`); modules[_module].push(`${emoji} ${Util.capitalise(command.name)}`);
} }
const embed: APIEmbed = { const embed: APIEmbed = {
title: guild.format('COMMAND_COMMANDS_TITLE'), title: invoker.format('COMMAND_COMMANDS_TITLE'),
fields: [], fields: [],
footer: { text: `${amt} commands` } footer: { text: `${amt} commands` }
}; };

View File

@ -464,14 +464,13 @@ class CommandHandler extends Observer
// Clean up params for option parsing // Clean up params for option parsing
for (const flag of Object.values(args)) for (const flag of Object.values(args))
{ {
// console.log('flags loop', flag.name, flag._rawValue); // console.log('flags loop', flag.name, flag.rawValue);
const removed = await flag.parse(); const removed = await flag.parse();
// console.log(removed);
if (!(removed instanceof Array) && removed.error) if (!(removed instanceof Array) && removed.error)
{ {
if (flag.choices.length) if (flag.choices.length)
{
return { error: true, index: 'O_COMMANDHANDLER_INVALID_CHOICE', params: { option: flag.name, value: flag.rawValue as string, choices: flag.choices.map((c) => c.value).join('`, `') } }; return { error: true, index: 'O_COMMANDHANDLER_INVALID_CHOICE', params: { option: flag.name, value: flag.rawValue as string, choices: flag.choices.map((c) => c.value).join('`, `') } };
}
return { option: flag, ...removed }; return { option: flag, ...removed };
} }
for (const r of removed as string[]) for (const r of removed as string[])
@ -512,7 +511,8 @@ class CommandHandler extends Observer
} }
cloned.rawValue = params[index]; cloned.rawValue = params[index];
removed = await cloned.parse(); removed = await cloned.parse();
if (!(removed instanceof Array) && !removed.error) // Successfully parsed a value, move on to removing the raw value from the params
if ((removed instanceof Array))
break; break;
index++; index++;
} }
@ -529,7 +529,6 @@ class CommandHandler extends Observer
if (removed instanceof Array) if (removed instanceof Array)
for (const r of removed) for (const r of removed)
params.splice(params.indexOf(r), 1, null); params.splice(params.indexOf(r), 1, null);
} }
const strings = []; const strings = [];
@ -679,11 +678,8 @@ class CommandHandler extends Observer
}; };
} }
}; };
return invoker.reply({ ...messages[info.type](), edit: invoker.replied }); return invoker.reply({ ...messages[info.type](), edit: invoker.replied });
} }
} }
export default CommandHandler; export default CommandHandler;

View File

@ -87,10 +87,11 @@ abstract class ModerationCommand extends SlashCommand
if (opts.options?.some((opt) => opt.type === CommandOptionType.SUB_COMMAND)) if (opts.options?.some((opt) => opt.type === CommandOptionType.SUB_COMMAND))
baseOptions = []; baseOptions = [];
const sorted = [ ...baseOptions, ...opts.options || [] ].sort((a) => a.type === CommandOptionType.STRING ? 0 : -1);
super(client, { super(client, {
...opts, ...opts,
options: opts.overrideOptions options: opts.overrideOptions
? opts.options : [ ...baseOptions, ...opts.options || [] ] ? opts.options : sorted
}); });
} }
} }

View File

@ -59,9 +59,15 @@ The members must be exact matches for this option.
[O_COMMANDHANDLER_TYPETEXT_CHANNEL] [O_COMMANDHANDLER_TYPETEXT_CHANNEL]
The command option {option} requires a text channel. The command option {option} requires a text channel.
[O_COMMANDHANDLER_TYPETEXT_CHANNELS]
The command option {option} requires text channels.
[O_COMMANDHANDLER_TYPEVOICE_CHANNEL] [O_COMMANDHANDLER_TYPEVOICE_CHANNEL]
The command option {option} requires a voice channel. The command option {option} requires a voice channel.
[O_COMMANDHANDLER_TYPEVOICE_CHANNELS]
The command option {option} requires voice channels.
[O_COMMANDHANDLER_TYPECHANNELS] [O_COMMANDHANDLER_TYPECHANNELS]
The command option {option} requires channels. The command option {option} requires channels.