feat: enhance error handling and fallback logic in points modal processing
This commit is contained in:
@@ -29,12 +29,73 @@ export default {
|
|||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
// Obtener valores del modal - usando la estructura de example.ts.txt
|
// Obtener valores del modal con manejo seguro de errores
|
||||||
const totalInput = interaction.components.getTextInputValue('points_input').trim();
|
let totalInput: string;
|
||||||
const selectedUsers = interaction.components.getSelectedUsers('user_select');
|
let selectedUsers: any;
|
||||||
|
let userId: string;
|
||||||
|
let userName: string;
|
||||||
|
|
||||||
|
try {
|
||||||
|
totalInput = interaction.components.getTextInputValue('points_input').trim();
|
||||||
|
} catch (error) {
|
||||||
|
logger.error('Error obteniendo points_input:', error);
|
||||||
|
return interaction.reply({
|
||||||
|
content: '❌ Error al obtener el valor de puntos del modal.',
|
||||||
|
flags: MessageFlags.Ephemeral
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// Manejo seguro del UserSelect con fallback
|
||||||
|
try {
|
||||||
|
selectedUsers = interaction.components.getSelectedUsers('user_select');
|
||||||
|
|
||||||
|
if (!selectedUsers || selectedUsers.size === 0) {
|
||||||
|
// Fallback: intentar obtener los IDs directamente de los datos raw
|
||||||
|
const rawData = (interaction as any).data?.components;
|
||||||
|
if (rawData) {
|
||||||
|
const userSelectComponent = this.findUserSelectComponent(rawData, 'user_select');
|
||||||
|
if (userSelectComponent?.values?.length > 0) {
|
||||||
|
userId = userSelectComponent.values[0];
|
||||||
|
logger.info(`🔄 Fallback: UserId extraído de datos raw: ${userId}`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!userId) {
|
||||||
|
return interaction.reply({
|
||||||
|
content: '❌ Debes seleccionar un usuario del leaderboard.',
|
||||||
|
flags: MessageFlags.Ephemeral
|
||||||
|
});
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
const selectedUser = Array.from(selectedUsers.values())[0];
|
||||||
|
userId = selectedUser?.id;
|
||||||
|
userName = selectedUser?.tag ?? selectedUser?.username ?? userId;
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
logger.error('Error procesando UserSelect, intentando fallback:', error);
|
||||||
|
|
||||||
|
// Fallback más agresivo: obtener directamente de los datos raw
|
||||||
|
try {
|
||||||
|
const rawData = (interaction as any).data?.components;
|
||||||
|
const userSelectComponent = this.findUserSelectComponent(rawData, 'user_select');
|
||||||
|
|
||||||
|
if (userSelectComponent?.values?.length > 0) {
|
||||||
|
userId = userSelectComponent.values[0];
|
||||||
|
logger.info(`🔄 Fallback agresivo: UserId extraído: ${userId}`);
|
||||||
|
} else {
|
||||||
|
throw new Error('No se pudo extraer userId de los datos raw');
|
||||||
|
}
|
||||||
|
} catch (fallbackError) {
|
||||||
|
logger.error('Falló el fallback:', fallbackError);
|
||||||
|
return interaction.reply({
|
||||||
|
content: '❌ Error procesando la selección de usuario. Inténtalo de nuevo.',
|
||||||
|
flags: MessageFlags.Ephemeral
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
logger.info(`🔍 Input recibido: ${totalInput}`);
|
logger.info(`🔍 Input recibido: ${totalInput}`);
|
||||||
logger.info(`🔍 Usuarios seleccionados: ${selectedUsers?.size || 0}`);
|
logger.info(`🔍 UserId extraído: ${userId}`);
|
||||||
|
|
||||||
if (!totalInput) {
|
if (!totalInput) {
|
||||||
return interaction.reply({
|
return interaction.reply({
|
||||||
@@ -43,17 +104,6 @@ export default {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!selectedUsers || selectedUsers.size === 0) {
|
|
||||||
return interaction.reply({
|
|
||||||
content: '❌ Debes seleccionar un usuario del leaderboard.',
|
|
||||||
flags: MessageFlags.Ephemeral
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
// Obtener el primer (y único) usuario seleccionado
|
|
||||||
const selectedUser = Array.from(selectedUsers.values())[0];
|
|
||||||
const userId = selectedUser?.id;
|
|
||||||
|
|
||||||
if (!userId) {
|
if (!userId) {
|
||||||
return interaction.reply({
|
return interaction.reply({
|
||||||
content: '❌ Error al identificar el usuario seleccionado.',
|
content: '❌ Error al identificar el usuario seleccionado.',
|
||||||
@@ -61,7 +111,16 @@ export default {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
logger.info(`🔍 UserId extraído: ${userId}`);
|
// Si no tenemos userName, intentar obtenerlo del servidor
|
||||||
|
if (!userName) {
|
||||||
|
try {
|
||||||
|
const targetMember = await interaction.guild.members.fetch(userId);
|
||||||
|
userName = targetMember.displayName || targetMember.user.username;
|
||||||
|
} catch (error) {
|
||||||
|
logger.warn(`No se pudo obtener info del usuario ${userId}:`, error);
|
||||||
|
userName = `Usuario ${userId}`;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Obtener o crear el registro de stats del usuario
|
// Obtener o crear el registro de stats del usuario
|
||||||
let stats = await prisma.partnershipStats.findUnique({
|
let stats = await prisma.partnershipStats.findUnique({
|
||||||
@@ -174,9 +233,6 @@ export default {
|
|||||||
|
|
||||||
logger.info(`✅ Puntos actualizados exitosamente en la base de datos`);
|
logger.info(`✅ Puntos actualizados exitosamente en la base de datos`);
|
||||||
|
|
||||||
// Obtener nombre del usuario usando la información del UserSelect
|
|
||||||
const userName = selectedUser?.tag ?? selectedUser?.username ?? userId;
|
|
||||||
|
|
||||||
// Calcular las diferencias
|
// Calcular las diferencias
|
||||||
const totalDiff = newTotalPoints - stats.totalPoints;
|
const totalDiff = newTotalPoints - stats.totalPoints;
|
||||||
const weeklyDiff = newWeeklyPoints - stats.weeklyPoints;
|
const weeklyDiff = newWeeklyPoints - stats.weeklyPoints;
|
||||||
@@ -227,5 +283,31 @@ export default {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
// Función auxiliar para buscar componentes UserSelect en datos raw
|
||||||
|
findUserSelectComponent(components: any[], customId: string): any {
|
||||||
|
if (!components) return null;
|
||||||
|
|
||||||
|
for (const comp of components) {
|
||||||
|
if (comp.components) {
|
||||||
|
const found = this.findUserSelectComponent(comp.components, customId);
|
||||||
|
if (found) return found;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (comp.component) {
|
||||||
|
if (comp.component.custom_id === customId) {
|
||||||
|
return comp.component;
|
||||||
|
}
|
||||||
|
const found = this.findUserSelectComponent([comp.component], customId);
|
||||||
|
if (found) return found;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (comp.custom_id === customId) {
|
||||||
|
return comp;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user