feat: ajouter la gestion des erreurs pour trop d'arguments et mise à jour des commandes

This commit is contained in:
Puechberty Arthur
2026-04-12 13:36:58 +02:00
parent b5e9793578
commit d2eadc7f03
6 changed files with 42 additions and 18 deletions
+2 -1
View File
@@ -5,7 +5,8 @@
"invalidInt": "Argument must be an integer. Received: {{value}}", "invalidInt": "Argument must be an integer. Received: {{value}}",
"invalidNumber": "Argument must be a number. Received: {{value}}", "invalidNumber": "Argument must be a number. Received: {{value}}",
"invalidBoolean": "Argument must be a boolean value. Received: {{value}}", "invalidBoolean": "Argument must be a boolean value. Received: {{value}}",
"invalidUser": "Could not resolve a user from {{value}}" "invalidUser": "Could not resolve a user from {{value}}",
"tooMany": "Too many arguments detected ({{count}}): {{extras}}. Usage: {{usage}}"
}, },
"permissions": { "permissions": {
"user": "You are missing permissions: {{permissions}}" "user": "You are missing permissions: {{permissions}}"
+2 -1
View File
@@ -5,7 +5,8 @@
"invalidInt": "El argumento debe ser un entero. Recibido: {{value}}", "invalidInt": "El argumento debe ser un entero. Recibido: {{value}}",
"invalidNumber": "El argumento debe ser un numero. Recibido: {{value}}", "invalidNumber": "El argumento debe ser un numero. Recibido: {{value}}",
"invalidBoolean": "El argumento debe ser un valor booleano. Recibido: {{value}}", "invalidBoolean": "El argumento debe ser un valor booleano. Recibido: {{value}}",
"invalidUser": "No se pudo resolver un usuario desde {{value}}" "invalidUser": "No se pudo resolver un usuario desde {{value}}",
"tooMany": "Se detectaron demasiados argumentos ({{count}}): {{extras}}. Uso: {{usage}}"
}, },
"permissions": { "permissions": {
"user": "Te faltan permisos: {{permissions}}" "user": "Te faltan permisos: {{permissions}}"
+2 -1
View File
@@ -5,7 +5,8 @@
"invalidInt": "L argument doit etre un entier. Recu: {{value}}", "invalidInt": "L argument doit etre un entier. Recu: {{value}}",
"invalidNumber": "L argument doit etre un nombre. Recu: {{value}}", "invalidNumber": "L argument doit etre un nombre. Recu: {{value}}",
"invalidBoolean": "L argument doit etre un booleen. Recu: {{value}}", "invalidBoolean": "L argument doit etre un booleen. Recu: {{value}}",
"invalidUser": "Impossible de trouver un utilisateur depuis {{value}}" "invalidUser": "Impossible de trouver un utilisateur depuis {{value}}",
"tooMany": "Trop d arguments ({{count}}) detectes: {{extras}}. Usage: {{usage}}"
}, },
"permissions": { "permissions": {
"user": "Tu n as pas les permissions: {{permissions}}" "user": "Tu n as pas les permissions: {{permissions}}"
+7 -7
View File
@@ -43,6 +43,12 @@ export const advancedCommand = defineCommand({
required: true, required: true,
descriptionKey: "args.count", descriptionKey: "args.count",
}, },
{
name: "user",
type: "user",
required: true,
descriptionKey: "args.user",
},
{ {
name: "ratio", name: "ratio",
type: "number", type: "number",
@@ -55,12 +61,6 @@ export const advancedCommand = defineCommand({
required: false, required: false,
descriptionKey: "args.enabled", descriptionKey: "args.enabled",
}, },
{
name: "user",
type: "user",
required: true,
descriptionKey: "args.user",
},
{ {
name: "channel", name: "channel",
type: "channel", type: "channel",
@@ -76,7 +76,7 @@ export const advancedCommand = defineCommand({
], ],
examples: [ examples: [
{ {
args: '"hello world" 5 1.5 true @Arthur #general @Moderators', args: '"hello world" 5 @Arthur 1.5 true #general @Moderators',
descriptionKey: "examples.full", descriptionKey: "examples.full",
}, },
{ {
+10
View File
@@ -59,6 +59,16 @@ export const parsePrefixArgs = async (
errors.push(parsed.error); errors.push(parsed.error);
} }
if (tokens.length > 0) {
errors.push({
key: "errors.args.tooMany",
vars: {
count: tokens.length,
extras: tokens.join(" "),
},
});
}
return { values, errors }; return { values, errors };
}; };
+19 -8
View File
@@ -1,18 +1,29 @@
import type { BotCommand, BotCommandInput } from "../types/command.js"; import type { BotCommand, BotCommandInput } from "../types/command.js";
export const defineCommand = (input: BotCommandInput): BotCommand => { const assertRequiredArgsBeforeOptional = (input: BotCommandInput): void => {
// Discord requires all required slash options before any optional ones. const args = input.args ?? [];
const normalizedArgs = [...(input.args ?? [])].sort((a, b) => { let firstOptionalArgName: string | null = null;
if (a.required === b.required) {
return 0; for (const arg of args) {
if (!arg.required) {
firstOptionalArgName ??= arg.name;
continue;
} }
return a.required ? -1 : 1; if (firstOptionalArgName) {
}); throw new Error(
`Invalid argument order for command "${input.meta.name}": required argument "${arg.name}" cannot appear after optional argument "${firstOptionalArgName}". Declare all required arguments before optional ones.`,
);
}
}
};
export const defineCommand = (input: BotCommandInput): BotCommand => {
assertRequiredArgsBeforeOptional(input);
return { return {
meta: input.meta, meta: input.meta,
args: normalizedArgs, args: [...(input.args ?? [])],
permissions: input.permissions ?? [], permissions: input.permissions ?? [],
examples: input.examples ?? [], examples: input.examples ?? [],
execute: input.execute, execute: input.execute,