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}}",
"invalidNumber": "Argument must be a number. 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": {
"user": "You are missing permissions: {{permissions}}"
+2 -1
View File
@@ -5,7 +5,8 @@
"invalidInt": "El argumento debe ser un entero. Recibido: {{value}}",
"invalidNumber": "El argumento debe ser un numero. 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": {
"user": "Te faltan permisos: {{permissions}}"
+2 -1
View File
@@ -5,7 +5,8 @@
"invalidInt": "L argument doit etre un entier. Recu: {{value}}",
"invalidNumber": "L argument doit etre un nombre. 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": {
"user": "Tu n as pas les permissions: {{permissions}}"
+7 -7
View File
@@ -43,6 +43,12 @@ export const advancedCommand = defineCommand({
required: true,
descriptionKey: "args.count",
},
{
name: "user",
type: "user",
required: true,
descriptionKey: "args.user",
},
{
name: "ratio",
type: "number",
@@ -55,12 +61,6 @@ export const advancedCommand = defineCommand({
required: false,
descriptionKey: "args.enabled",
},
{
name: "user",
type: "user",
required: true,
descriptionKey: "args.user",
},
{
name: "channel",
type: "channel",
@@ -76,7 +76,7 @@ export const advancedCommand = defineCommand({
],
examples: [
{
args: '"hello world" 5 1.5 true @Arthur #general @Moderators',
args: '"hello world" 5 @Arthur 1.5 true #general @Moderators',
descriptionKey: "examples.full",
},
{
+10
View File
@@ -59,6 +59,16 @@ export const parsePrefixArgs = async (
errors.push(parsed.error);
}
if (tokens.length > 0) {
errors.push({
key: "errors.args.tooMany",
vars: {
count: tokens.length,
extras: tokens.join(" "),
},
});
}
return { values, errors };
};
+19 -8
View File
@@ -1,18 +1,29 @@
import type { BotCommand, BotCommandInput } from "../types/command.js";
export const defineCommand = (input: BotCommandInput): BotCommand => {
// Discord requires all required slash options before any optional ones.
const normalizedArgs = [...(input.args ?? [])].sort((a, b) => {
if (a.required === b.required) {
return 0;
const assertRequiredArgsBeforeOptional = (input: BotCommandInput): void => {
const args = input.args ?? [];
let firstOptionalArgName: string | null = null;
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 {
meta: input.meta,
args: normalizedArgs,
args: [...(input.args ?? [])],
permissions: input.permissions ?? [],
examples: input.examples ?? [],
execute: input.execute,