feat(game-commands): add generic argument parser and integrate for mina, pelear, pescar

This commit is contained in:
2025-10-05 19:34:45 -05:00
parent 1b1aa40358
commit 66a984d74e
4 changed files with 61 additions and 26 deletions

View File

@@ -30,3 +30,38 @@ export async function findBestToolKey(userId: string, guildId: string, toolType:
return best?.key ?? null;
}
export interface ParsedGameArgs {
areaKey: string;
levelArg: number | null;
providedTool: string | null;
}
const AREA_OVERRIDE_PREFIX = 'area:';
export function parseGameArgs(args: string[], defaultAreaKey: string): ParsedGameArgs {
const tokens = args.filter((arg): arg is string => typeof arg === 'string' && arg.trim().length > 0);
let areaKey = defaultAreaKey;
let levelArg: number | null = null;
let providedTool: string | null = null;
for (const token of tokens) {
if (token.startsWith(AREA_OVERRIDE_PREFIX)) {
const override = token.slice(AREA_OVERRIDE_PREFIX.length).trim();
if (override) areaKey = override;
continue;
}
if (levelArg === null && /^\d+$/.test(token)) {
levelArg = parseInt(token, 10);
continue;
}
if (!providedTool) {
providedTool = token;
}
}
return { areaKey, levelArg, providedTool };
}

View File

@@ -1,7 +1,7 @@
import type { CommandMessage } from '../../../core/types/commands';
import type Amayo from '../../../core/client';
import { runMinigame } from '../../../game/minigames/service';
import { resolveArea, getDefaultLevel, findBestToolKey } from './_helpers';
import { resolveArea, getDefaultLevel, findBestToolKey, parseGameArgs } from './_helpers';
import { updateStats } from '../../../game/stats/service';
import { updateQuestProgress } from '../../../game/quests/service';
import { checkAchievements } from '../../../game/achievements/service';
@@ -12,29 +12,29 @@ export const command: CommandMessage = {
aliases: ['minar'],
cooldown: 5,
description: 'Ir a la mina (usa pico si está disponible) y obtener recompensas según el nivel.',
usage: 'mina [nivel] [toolKey] (ej: mina 2 tool.pickaxe.basic)',
usage: 'mina [nivel] [toolKey] [area:clave] (ej: mina 2 tool.pickaxe.basic)',
run: async (message, args, _client: Amayo) => {
const userId = message.author.id;
const guildId = message.guild!.id;
const areaKey = args[0] === 'mine.cavern' ? args[0] : 'mine.cavern'; // Forzar key de área de mina
const { areaKey, levelArg, providedTool } = parseGameArgs(args, 'mine.cavern');
const area = await resolveArea(guildId, areaKey);
if (!area) { await message.reply('⚠️ Área de mina no configurada. Pide a un admin crear `gameArea` con key `mine.cavern`.'); return; }
const levelArg = args[0] && /^\d+$/.test(args[0]) ? parseInt(args[0], 10) : null;
const providedTool = args.find((a) => a && !/^\d+$/.test(a));
if (!area) {
await message.reply(`⚠️ Área de mina no configurada. Pide a un admin crear \`gameArea\` con key \`${areaKey}\`.`);
return;
}
const level = levelArg ?? await getDefaultLevel(userId, guildId, area.id);
const toolKey = providedTool ?? await findBestToolKey(userId, guildId, 'pickaxe');
try {
const result = await runMinigame(userId, guildId, areaKey, level, { toolKey: toolKey ?? undefined });
const result = await runMinigame(userId, guildId, area.key, level, { toolKey: toolKey ?? undefined });
// Actualizar stats
await updateStats(userId, guildId, { minesCompleted: 1 });
// Actualizar progreso de misiones
await updateQuestProgress(userId, guildId, 'mine_count', 1);
// Actualizar progreso de misiones
await updateQuestProgress(userId, guildId, 'mine_count', 1);
// Verificar logros
const newAchievements = await checkAchievements(userId, guildId, 'mine_count');

View File

@@ -1,7 +1,7 @@
import type { CommandMessage } from '../../../core/types/commands';
import type Amayo from '../../../core/client';
import { runMinigame } from '../../../game/minigames/service';
import { resolveArea, getDefaultLevel, findBestToolKey } from './_helpers';
import { resolveArea, getDefaultLevel, findBestToolKey, parseGameArgs } from './_helpers';
import { updateStats } from '../../../game/stats/service';
import { updateQuestProgress } from '../../../game/quests/service';
import { checkAchievements } from '../../../game/achievements/service';
@@ -12,23 +12,23 @@ export const command: CommandMessage = {
aliases: ['fight','arena'],
cooldown: 8,
description: 'Entra a la arena y pelea (usa espada si está disponible).',
usage: 'pelear [nivel] [toolKey] (ej: pelear 1 weapon.sword.iron)',
usage: 'pelear [nivel] [toolKey] [area:clave] (ej: pelear 1 weapon.sword.iron)',
run: async (message, args, _client: Amayo) => {
const userId = message.author.id;
const guildId = message.guild!.id;
const areaKey = args[0] === 'fight.arena' ? args[0] : 'fight.arena'; // Forzar key de área de arena
const { areaKey, levelArg, providedTool } = parseGameArgs(args, 'fight.arena');
const area = await resolveArea(guildId, areaKey);
if (!area) { await message.reply('⚠️ Área de arena no configurada. Crea `gameArea` con key `fight.arena`.'); return; }
const levelArg = args[0] && /^\d+$/.test(args[0]) ? parseInt(args[0], 10) : null;
const providedTool = args.find((a) => a && !/^\d+$/.test(a));
if (!area) {
await message.reply(`⚠️ Área de arena no configurada. Crea \`gameArea\` con key \`${areaKey}\`.`);
return;
}
const level = levelArg ?? await getDefaultLevel(userId, guildId, area.id);
const toolKey = providedTool ?? await findBestToolKey(userId, guildId, 'sword');
try {
const result = await runMinigame(userId, guildId, areaKey, level, { toolKey: toolKey ?? undefined });
const result = await runMinigame(userId, guildId, area.key, level, { toolKey: toolKey ?? undefined });
// Actualizar stats y misiones
await updateStats(userId, guildId, { fightsCompleted: 1 });

View File

@@ -1,7 +1,7 @@
import type { CommandMessage } from '../../../core/types/commands';
import type Amayo from '../../../core/client';
import { runMinigame } from '../../../game/minigames/service';
import { resolveArea, getDefaultLevel, findBestToolKey } from './_helpers';
import { resolveArea, getDefaultLevel, findBestToolKey, parseGameArgs } from './_helpers';
import { updateStats } from '../../../game/stats/service';
import { updateQuestProgress } from '../../../game/quests/service';
import { checkAchievements } from '../../../game/achievements/service';
@@ -12,23 +12,23 @@ export const command: CommandMessage = {
aliases: ['fish'],
cooldown: 5,
description: 'Pesca en la laguna (usa caña si está disponible) y obtén recompensas.',
usage: 'pescar [nivel] [toolKey] (ej: pescar 1 tool.rod.basic)',
usage: 'pescar [nivel] [toolKey] [area:clave] (ej: pescar 1 tool.rod.basic)',
run: async (message, args, _client: Amayo) => {
const userId = message.author.id;
const guildId = message.guild!.id;
const areaKey = args[0] === 'lagoon.shore' ? args[0] : 'lagoon.shore'; // Forzar key de área de laguna
const { areaKey, levelArg, providedTool } = parseGameArgs(args, 'lagoon.shore');
const area = await resolveArea(guildId, areaKey);
if (!area) { await message.reply('⚠️ Área de laguna no configurada. Crea `gameArea` con key `lagoon.shore`.'); return; }
const levelArg = args[0] && /^\d+$/.test(args[0]) ? parseInt(args[0], 10) : null;
const providedTool = args.find((a) => a && !/^\d+$/.test(a));
if (!area) {
await message.reply(`⚠️ Área de laguna no configurada. Crea \`gameArea\` con key \`${areaKey}\`.`);
return;
}
const level = levelArg ?? await getDefaultLevel(userId, guildId, area.id);
const toolKey = providedTool ?? await findBestToolKey(userId, guildId, 'rod');
try {
const result = await runMinigame(userId, guildId, areaKey, level, { toolKey: toolKey ?? undefined });
const result = await runMinigame(userId, guildId, area.key, level, { toolKey: toolKey ?? undefined });
// Actualizar stats y misiones
await updateStats(userId, guildId, { fishingCompleted: 1 });