feat: enhance modal interaction handling with dynamic prefix search and improved logging

This commit is contained in:
2025-10-03 21:03:30 -05:00
parent adb8c503f3
commit d438082b48
2 changed files with 35 additions and 5 deletions

View File

@@ -10,6 +10,8 @@ import { prisma } from '../../core/database/prisma';
export default { export default {
customId: 'ld_points_modal', customId: 'ld_points_modal',
run: async (interaction: ModalSubmitInteraction) => { run: async (interaction: ModalSubmitInteraction) => {
logger.info(`🔍 Modal ldPointsModal ejecutado. CustomId: ${interaction.customId}`);
if (!interaction.guild) { if (!interaction.guild) {
return interaction.reply({ return interaction.reply({
content: '❌ Solo disponible en servidores.', content: '❌ Solo disponible en servidores.',
@@ -29,6 +31,8 @@ export default {
try { try {
// Extraer el userId del customId (formato: ld_points_modal:userId) // Extraer el userId del customId (formato: ld_points_modal:userId)
const userId = interaction.customId.split(':')[1]; const userId = interaction.customId.split(':')[1];
logger.info(`🔍 UserId extraído: ${userId}`);
if (!userId) { if (!userId) {
return interaction.reply({ return interaction.reply({
content: '❌ Error al identificar el usuario.', content: '❌ Error al identificar el usuario.',
@@ -39,6 +43,7 @@ export default {
// Obtener valor del modal // Obtener valor del modal
// @ts-ignore // @ts-ignore
const totalInput = interaction.fields.getTextInputValue('total_points').trim(); const totalInput = interaction.fields.getTextInputValue('total_points').trim();
logger.info(`🔍 Input recibido: ${totalInput}`);
if (!totalInput) { if (!totalInput) {
return interaction.reply({ return interaction.reply({
@@ -58,6 +63,7 @@ export default {
}); });
if (!stats) { if (!stats) {
logger.info(`🔍 Creando nuevo registro de stats para userId: ${userId}`);
// Crear nuevo registro si no existe // Crear nuevo registro si no existe
stats = await prisma.partnershipStats.create({ stats = await prisma.partnershipStats.create({
data: { data: {
@@ -70,6 +76,8 @@ export default {
}); });
} }
logger.info(`🔍 Stats actuales - Total: ${stats.totalPoints}`);
// Función para parsear el input y calcular el nuevo valor // Función para parsear el input y calcular el nuevo valor
const calculateNewValue = (input: string, currentValue: number): number => { const calculateNewValue = (input: string, currentValue: number): number => {
const firstChar = input[0]; const firstChar = input[0];
@@ -95,6 +103,7 @@ export default {
// Calcular nuevo valor de puntos totales // Calcular nuevo valor de puntos totales
const newTotalPoints = calculateNewValue(totalInput, stats.totalPoints); const newTotalPoints = calculateNewValue(totalInput, stats.totalPoints);
logger.info(`🔍 Nuevo total calculado: ${newTotalPoints}`);
// Actualizar en base de datos (solo puntos totales) // Actualizar en base de datos (solo puntos totales)
await prisma.partnershipStats.update({ await prisma.partnershipStats.update({
@@ -109,6 +118,8 @@ export default {
} }
}); });
logger.info(`✅ Puntos actualizados exitosamente en la base de datos`);
// Obtener nombre del usuario // Obtener nombre del usuario
let userName = 'Usuario'; let userName = 'Usuario';
try { try {
@@ -152,12 +163,22 @@ export default {
flags: MessageFlags.Ephemeral flags: MessageFlags.Ephemeral
}); });
logger.info(`✅ Respuesta enviada al usuario`);
} catch (e) { } catch (e) {
logger.error({ err: e }, 'Error en ldPointsModal'); logger.error({ err: e }, 'Error en ldPointsModal');
await interaction.reply({
content: '❌ Error al actualizar los puntos.', // Intentar responder con el error
flags: MessageFlags.Ephemeral try {
}); if (!interaction.replied && !interaction.deferred) {
await interaction.reply({
content: '❌ Error al actualizar los puntos.',
flags: MessageFlags.Ephemeral
});
}
} catch (replyError) {
logger.error({ err: replyError }, 'Error al enviar respuesta de error');
}
} }
} }
}; };

View File

@@ -42,12 +42,21 @@ bot.on(Events.InteractionCreate, async (interaction: BaseInteraction) => {
// 🔹 Modales // 🔹 Modales
if (interaction.isModalSubmit()) { if (interaction.isModalSubmit()) {
const modal = modals.get(interaction.customId); // Primero intentar búsqueda exacta
let modal = modals.get(interaction.customId);
// Si no se encuentra, intentar búsqueda por prefijo (para modales dinámicos)
if (!modal) {
const prefix = interaction.customId.split(':')[0];
modal = modals.get(prefix);
}
if (modal) await modal.run(interaction, bot); if (modal) await modal.run(interaction, bot);
} }
} catch (error) { } catch (error) {
logger.error({ err: error }, "Error ejecutando interacción"); logger.error({ err: error }, "Error ejecutando interacción");
if (interaction.isRepliable()) { if (interaction.isRepliable()) {
// @ts-ignore
await interaction.reply({ content: "❌ Hubo un error ejecutando la interacción.", ephemeral: true }); await interaction.reply({ content: "❌ Hubo un error ejecutando la interacción.", ephemeral: true });
} }
} }