feat(game-commands): add generic argument parser and integrate for mina, pelear, pescar
This commit is contained in:
@@ -30,3 +30,38 @@ export async function findBestToolKey(userId: string, guildId: string, toolType:
|
|||||||
return best?.key ?? null;
|
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 };
|
||||||
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import type { CommandMessage } from '../../../core/types/commands';
|
import type { CommandMessage } from '../../../core/types/commands';
|
||||||
import type Amayo from '../../../core/client';
|
import type Amayo from '../../../core/client';
|
||||||
import { runMinigame } from '../../../game/minigames/service';
|
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 { updateStats } from '../../../game/stats/service';
|
||||||
import { updateQuestProgress } from '../../../game/quests/service';
|
import { updateQuestProgress } from '../../../game/quests/service';
|
||||||
import { checkAchievements } from '../../../game/achievements/service';
|
import { checkAchievements } from '../../../game/achievements/service';
|
||||||
@@ -12,29 +12,29 @@ export const command: CommandMessage = {
|
|||||||
aliases: ['minar'],
|
aliases: ['minar'],
|
||||||
cooldown: 5,
|
cooldown: 5,
|
||||||
description: 'Ir a la mina (usa pico si está disponible) y obtener recompensas según el nivel.',
|
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) => {
|
run: async (message, args, _client: Amayo) => {
|
||||||
const userId = message.author.id;
|
const userId = message.author.id;
|
||||||
const guildId = message.guild!.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);
|
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; }
|
if (!area) {
|
||||||
|
await message.reply(`⚠️ Área de mina no configurada. Pide a un admin crear \`gameArea\` con key \`${areaKey}\`.`);
|
||||||
const levelArg = args[0] && /^\d+$/.test(args[0]) ? parseInt(args[0], 10) : null;
|
return;
|
||||||
const providedTool = args.find((a) => a && !/^\d+$/.test(a));
|
}
|
||||||
|
|
||||||
const level = levelArg ?? await getDefaultLevel(userId, guildId, area.id);
|
const level = levelArg ?? await getDefaultLevel(userId, guildId, area.id);
|
||||||
const toolKey = providedTool ?? await findBestToolKey(userId, guildId, 'pickaxe');
|
const toolKey = providedTool ?? await findBestToolKey(userId, guildId, 'pickaxe');
|
||||||
|
|
||||||
try {
|
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
|
// Actualizar stats
|
||||||
await updateStats(userId, guildId, { minesCompleted: 1 });
|
await updateStats(userId, guildId, { minesCompleted: 1 });
|
||||||
|
|
||||||
// Actualizar progreso de misiones
|
// Actualizar progreso de misiones
|
||||||
await updateQuestProgress(userId, guildId, 'mine_count', 1);
|
await updateQuestProgress(userId, guildId, 'mine_count', 1);
|
||||||
|
|
||||||
// Verificar logros
|
// Verificar logros
|
||||||
const newAchievements = await checkAchievements(userId, guildId, 'mine_count');
|
const newAchievements = await checkAchievements(userId, guildId, 'mine_count');
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import type { CommandMessage } from '../../../core/types/commands';
|
import type { CommandMessage } from '../../../core/types/commands';
|
||||||
import type Amayo from '../../../core/client';
|
import type Amayo from '../../../core/client';
|
||||||
import { runMinigame } from '../../../game/minigames/service';
|
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 { updateStats } from '../../../game/stats/service';
|
||||||
import { updateQuestProgress } from '../../../game/quests/service';
|
import { updateQuestProgress } from '../../../game/quests/service';
|
||||||
import { checkAchievements } from '../../../game/achievements/service';
|
import { checkAchievements } from '../../../game/achievements/service';
|
||||||
@@ -12,23 +12,23 @@ export const command: CommandMessage = {
|
|||||||
aliases: ['fight','arena'],
|
aliases: ['fight','arena'],
|
||||||
cooldown: 8,
|
cooldown: 8,
|
||||||
description: 'Entra a la arena y pelea (usa espada si está disponible).',
|
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) => {
|
run: async (message, args, _client: Amayo) => {
|
||||||
const userId = message.author.id;
|
const userId = message.author.id;
|
||||||
const guildId = message.guild!.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);
|
const area = await resolveArea(guildId, areaKey);
|
||||||
if (!area) { await message.reply('⚠️ Área de arena no configurada. Crea `gameArea` con key `fight.arena`.'); return; }
|
if (!area) {
|
||||||
|
await message.reply(`⚠️ Área de arena no configurada. Crea \`gameArea\` con key \`${areaKey}\`.`);
|
||||||
const levelArg = args[0] && /^\d+$/.test(args[0]) ? parseInt(args[0], 10) : null;
|
return;
|
||||||
const providedTool = args.find((a) => a && !/^\d+$/.test(a));
|
}
|
||||||
|
|
||||||
const level = levelArg ?? await getDefaultLevel(userId, guildId, area.id);
|
const level = levelArg ?? await getDefaultLevel(userId, guildId, area.id);
|
||||||
const toolKey = providedTool ?? await findBestToolKey(userId, guildId, 'sword');
|
const toolKey = providedTool ?? await findBestToolKey(userId, guildId, 'sword');
|
||||||
|
|
||||||
try {
|
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
|
// Actualizar stats y misiones
|
||||||
await updateStats(userId, guildId, { fightsCompleted: 1 });
|
await updateStats(userId, guildId, { fightsCompleted: 1 });
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import type { CommandMessage } from '../../../core/types/commands';
|
import type { CommandMessage } from '../../../core/types/commands';
|
||||||
import type Amayo from '../../../core/client';
|
import type Amayo from '../../../core/client';
|
||||||
import { runMinigame } from '../../../game/minigames/service';
|
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 { updateStats } from '../../../game/stats/service';
|
||||||
import { updateQuestProgress } from '../../../game/quests/service';
|
import { updateQuestProgress } from '../../../game/quests/service';
|
||||||
import { checkAchievements } from '../../../game/achievements/service';
|
import { checkAchievements } from '../../../game/achievements/service';
|
||||||
@@ -12,23 +12,23 @@ export const command: CommandMessage = {
|
|||||||
aliases: ['fish'],
|
aliases: ['fish'],
|
||||||
cooldown: 5,
|
cooldown: 5,
|
||||||
description: 'Pesca en la laguna (usa caña si está disponible) y obtén recompensas.',
|
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) => {
|
run: async (message, args, _client: Amayo) => {
|
||||||
const userId = message.author.id;
|
const userId = message.author.id;
|
||||||
const guildId = message.guild!.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);
|
const area = await resolveArea(guildId, areaKey);
|
||||||
if (!area) { await message.reply('⚠️ Área de laguna no configurada. Crea `gameArea` con key `lagoon.shore`.'); return; }
|
if (!area) {
|
||||||
|
await message.reply(`⚠️ Área de laguna no configurada. Crea \`gameArea\` con key \`${areaKey}\`.`);
|
||||||
const levelArg = args[0] && /^\d+$/.test(args[0]) ? parseInt(args[0], 10) : null;
|
return;
|
||||||
const providedTool = args.find((a) => a && !/^\d+$/.test(a));
|
}
|
||||||
|
|
||||||
const level = levelArg ?? await getDefaultLevel(userId, guildId, area.id);
|
const level = levelArg ?? await getDefaultLevel(userId, guildId, area.id);
|
||||||
const toolKey = providedTool ?? await findBestToolKey(userId, guildId, 'rod');
|
const toolKey = providedTool ?? await findBestToolKey(userId, guildId, 'rod');
|
||||||
|
|
||||||
try {
|
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
|
// Actualizar stats y misiones
|
||||||
await updateStats(userId, guildId, { fishingCompleted: 1 });
|
await updateStats(userId, guildId, { fishingCompleted: 1 });
|
||||||
|
|||||||
Reference in New Issue
Block a user