feat: enhance modal interaction handling with dynamic prefix search and improved logging
This commit is contained in:
@@ -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');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -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 });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user