feat: agregar categoría a varios comandos y mejorar la presentación de mensajes

This commit is contained in:
2025-10-08 23:06:16 -05:00
parent d842a4ebd5
commit de39e7e487
6 changed files with 112 additions and 75 deletions

View File

@@ -1,38 +1,45 @@
import type { CommandMessage } from '../../../core/types/commands';
import type Amayo from '../../../core/client';
import { getOrCreateWallet } from '../../../game/economy/service';
import type { TextBasedChannel } from 'discord.js';
import type { CommandMessage } from "../../../core/types/commands";
import type Amayo from "../../../core/client";
import { getOrCreateWallet } from "../../../game/economy/service";
import type { TextBasedChannel } from "discord.js";
export const command: CommandMessage = {
name: 'monedas',
type: 'message',
aliases: ['coins','saldo'],
name: "monedas",
type: "message",
aliases: ["coins", "saldo"],
cooldown: 2,
description: 'Muestra tu saldo de monedas en este servidor.',
usage: 'monedas',
description: "Muestra tu saldo de monedas en este servidor.",
category: "Economía",
usage: "monedas",
run: async (message, _args, _client: Amayo) => {
const wallet = await getOrCreateWallet(message.author.id, message.guild!.id);
const wallet = await getOrCreateWallet(
message.author.id,
message.guild!.id
);
const display = {
type: 17,
accent_color: 0xFFD700,
accent_color: 0xffd700,
components: [
{
type: 9,
components: [{
components: [
{
type: 10,
content: `**💰 Monedas de ${message.author.username}**\n\nSaldo: **${wallet.coins.toLocaleString()}** monedas`
}]
}
]
content: `**<:coin:1425667511013081169> Monedas de ${
message.author.username
}**\n\nSaldo: **${wallet.coins.toLocaleString()}** monedas`,
},
],
},
],
};
const channel = message.channel as TextBasedChannel & { send: Function };
await (channel.send as any)({
display,
flags: 32768,
reply: { messageReference: message.id }
reply: { messageReference: message.id },
});
}
},
};

View File

@@ -28,6 +28,7 @@ export const command: CommandMessage = {
type: "message",
aliases: ["fight", "arena"],
cooldown: 8,
category: "Minijuegos",
description: "Entra a la arena y pelea (usa espada si está disponible).",
usage:
"pelear [nivel] [toolKey] [area:clave] (ej: pelear 1 weapon.sword.iron)",

View File

@@ -1,19 +1,24 @@
import type { CommandMessage } from '../../../core/types/commands';
import type Amayo from '../../../core/client';
import { prisma } from '../../../core/database/prisma';
import { getOrCreateWallet } from '../../../game/economy/service';
import { getEquipment, getEffectiveStats } from '../../../game/combat/equipmentService';
import { getPlayerStatsFormatted } from '../../../game/stats/service';
import type { TextBasedChannel } from 'discord.js';
import { formatItemLabel } from './_helpers';
import type { CommandMessage } from "../../../core/types/commands";
import type Amayo from "../../../core/client";
import { prisma } from "../../../core/database/prisma";
import { getOrCreateWallet } from "../../../game/economy/service";
import {
getEquipment,
getEffectiveStats,
} from "../../../game/combat/equipmentService";
import { getPlayerStatsFormatted } from "../../../game/stats/service";
import type { TextBasedChannel } from "discord.js";
import { formatItemLabel } from "./_helpers";
export const command: CommandMessage = {
name: 'player',
type: 'message',
aliases: ['perfil', 'profile', 'yo', 'me'],
name: "player",
type: "message",
aliases: ["perfil", "profile", "yo", "me"],
cooldown: 5,
description: 'Muestra toda tu información de jugador con vista visual mejorada',
usage: 'player [@usuario]',
category: "Economía",
description:
"Muestra toda tu información de jugador con vista visual mejorada",
usage: "player [@usuario]",
run: async (message, args, _client: Amayo) => {
const targetUser = message.mentions.users.first() || message.author;
const userId = targetUser.id;
@@ -29,7 +34,7 @@ export const command: CommandMessage = {
const progress = await prisma.playerProgress.findMany({
where: { userId, guildId },
include: { area: true },
orderBy: { updatedAt: 'desc' },
orderBy: { updatedAt: "desc" },
take: 5,
});
@@ -46,54 +51,67 @@ export const command: CommandMessage = {
// Cooldowns activos
const activeCooldowns = await prisma.actionCooldown.findMany({
where: { userId, guildId, until: { gt: new Date() } },
orderBy: { until: 'asc' },
orderBy: { until: "asc" },
take: 3,
});
const weaponLine = weapon
? `⚔️ Arma: ${formatItemLabel(weapon, { fallbackIcon: '🗡️', bold: true })}`
: '⚔️ Arma: *Ninguna*';
? `⚔️ Arma: ${formatItemLabel(weapon, {
fallbackIcon: "🗡️",
bold: true,
})}`
: "⚔️ Arma: *Ninguna*";
const armorLine = armor
? `🛡️ Armadura: ${formatItemLabel(armor, { fallbackIcon: '🛡️', bold: true })}`
: '🛡️ Armadura: *Ninguna*';
? `🛡️ Armadura: ${formatItemLabel(armor, {
fallbackIcon: "🛡️",
bold: true,
})}`
: "🛡️ Armadura: *Ninguna*";
const capeLine = cape
? `🧥 Capa: ${formatItemLabel(cape, { fallbackIcon: '🧥', bold: true })}`
: '🧥 Capa: *Ninguna*';
? `🧥 Capa: ${formatItemLabel(cape, { fallbackIcon: "🧥", bold: true })}`
: "🧥 Capa: *Ninguna*";
// Crear DisplayComponent
const display = {
type: 17,
accent_color: 0x5865F2,
accent_color: 0x5865f2,
components: [
{
type: 10,
content: `👤 **${targetUser.username}**\n${targetUser.bot ? '🤖 Bot' : '👨 Usuario'}`
content: `👤 **${targetUser.username}**\n${
targetUser.bot ? "🤖 Bot" : "👨 Usuario"
}`,
},
{ type: 14, divider: true },
{
type: 10,
content: `**📊 ESTADÍSTICAS**\n` +
`❤️ HP: **${stats.hp}/${stats.maxHp}**\n` +
`⚔️ ATK: **${stats.damage}**\n` +
`🛡️ DEF: **${stats.defense}**\n` +
`💰 Monedas: **${wallet.coins.toLocaleString()}**`
content:
`**<:stats:1425689271788113991> ESTADÍSTICAS**\n` +
`<:healbonus:1425671499792121877> HP: **${stats.hp}/${stats.maxHp}**\n` +
`<:damage:1425670476449189998> ATK: **${stats.damage}**\n` +
`<:defens:1425670433910427862> DEF: **${stats.defense}**\n` +
`<a:9470coin:1425694135607885906> Monedas: **${wallet.coins.toLocaleString()}**`,
},
{ type: 14, divider: true },
{
type: 10,
content: `**⚔️ EQUIPO**\n` +
content:
`**<:damage:1425670476449189998> EQUIPO**\n` +
`${weaponLine}\n` +
`${armorLine}\n` +
`${capeLine}`
`${capeLine}`,
},
{ type: 14, divider: true },
{
type: 10,
content: `**🎒 INVENTARIO**\n` +
`📦 Items únicos: **${inventoryCount}**\n` +
`🔢 Total items: **${inventorySum._sum.quantity ?? 0}**`
}
]
content:
`**🎒 INVENTARIO**\n` +
`<:emptybox:1425678700753588305> Items únicos: **${inventoryCount}**\n` +
`<:table:1425673712312782879> Total items: **${
inventorySum._sum.quantity ?? 0
}**`,
},
],
};
// Añadir stats de actividades si existen
@@ -101,13 +119,13 @@ export const command: CommandMessage = {
const activitiesText = Object.entries(playerStats.activities)
.filter(([_, value]) => value > 0)
.map(([key, value]) => `${key}: **${value}**`)
.join('\n');
.join("\n");
if (activitiesText) {
display.components.push({ type: 14, divider: true });
display.components.push({
type: 10,
content: `**🎮 ACTIVIDADES**\n${activitiesText}`
content: `**🎮 ACTIVIDADES**\n${activitiesText}`,
});
}
}
@@ -117,25 +135,33 @@ export const command: CommandMessage = {
display.components.push({ type: 14, divider: true });
display.components.push({
type: 10,
content: `**🗺️ PROGRESO EN ÁREAS**\n` +
progress.map(p => `${p.area.name || p.area.key}: Nivel **${p.highestLevel}**`).join('\n')
content:
`**🗺️ PROGRESO EN ÁREAS**\n` +
progress
.map(
(p) =>
`${p.area.name || p.area.key}: Nivel **${p.highestLevel}**`
)
.join("\n"),
});
}
// Añadir cooldowns activos
if (activeCooldowns.length > 0) {
const now = Date.now();
const cooldownsText = activeCooldowns.map(cd => {
const cooldownsText = activeCooldowns
.map((cd) => {
const remaining = Math.ceil((cd.until.getTime() - now) / 1000);
const mins = Math.floor(remaining / 60);
const secs = remaining % 60;
return `${cd.key}: **${mins}m ${secs}s**`;
}).join('\n');
})
.join("\n");
display.components.push({ type: 14, divider: true });
display.components.push({
type: 10,
content: `** COOLDOWNS ACTIVOS**\n${cooldownsText}`
content: `**<:swordcooldown:1425695375028912168> COOLDOWNS ACTIVOS**\n${cooldownsText}`,
});
}
@@ -144,7 +170,7 @@ export const command: CommandMessage = {
content: null,
components: [display],
flags: 32768, // MessageFlags.IS_COMPONENTS_V2
reply: { messageReference: message.id }
reply: { messageReference: message.id },
});
}
},
};

View File

@@ -13,6 +13,7 @@ export const command: CommandMessage = {
name: "racha",
type: "message",
aliases: ["streak", "daily"],
category: "Economía",
cooldown: 10,
description: "Ver tu racha diaria y reclamar recompensa",
usage: "racha",
@@ -80,7 +81,7 @@ export const command: CommandMessage = {
});
}
blocks.push(dividerBlock({ spacing: 1 }));
blocks.push(dividerBlock({ spacing: 1, divider: false }));
blocks.push(textBlock(rewardsText));
}
} else {
@@ -97,7 +98,7 @@ export const command: CommandMessage = {
if (nextMilestone) {
const remaining = nextMilestone - streak.currentStreak;
blocks.push(dividerBlock({ spacing: 1 }));
blocks.push(dividerBlock({ spacing: 1, divider: false }));
blocks.push(
textBlock(
`**🎯 PRÓXIMO HITO**\nFaltan **${remaining}** días para alcanzar el día **${nextMilestone}**`

View File

@@ -8,6 +8,7 @@ export const command: CommandMessage = {
type: "message",
aliases: ["estadisticas", "est"],
cooldown: 5,
category: "Economía",
description: "Ver estadísticas detalladas de un jugador",
usage: "stats [@usuario]",
run: async (message, args, client: Amayo) => {

View File

@@ -78,6 +78,7 @@ export const command: CommandMessage = {
type: "message",
aliases: ["shop", "store"],
cooldown: 5,
category: "Economía",
description:
"Abre la tienda y navega por las ofertas disponibles con un panel interactivo.",
usage: "tienda [categoria]",
@@ -279,7 +280,7 @@ async function buildShopPanel(
container.components.push({
type: 10,
content: `${label}\n\n${
item.description || null
item.description || ""
}${statsInfo}\n\nPrecio: ${price}${stockInfo}`,
});