diff --git a/src/events/ready.ts b/src/events/ready.ts index f3728bd..2e12957 100644 --- a/src/events/ready.ts +++ b/src/events/ready.ts @@ -5,6 +5,50 @@ import logger from "../core/lib/logger"; bot.on(Events.ClientReady, () => { logger.info("Ready!"); + // ============================================ + // 🛡️ HANDLER GLOBAL PARA ERRORES DE DISCORD.JS + // ============================================ + // Interceptar errores específicos de ModalSubmitInteraction con UserSelect + + process.on('uncaughtException', (error) => { + // Interceptar errores específicos de Discord.js GuildMemberManager + if (error.message?.includes("Cannot read properties of undefined (reading 'id')") && + error.stack?.includes('GuildMemberManager._add')) { + + logger.warn('🔧 Discord.js bug interceptado: GuildMemberManager error con UserSelect en modal'); + // @ts-ignore + logger.warn('Stack trace:', error.stack); + + // NO terminar el proceso, solo logear el error + return; + } + + // Para otros errores críticos, mantener el comportamiento original + // @ts-ignore + logger.error('💥 UncaughtException crítico:', error); + process.exit(1); + }); + + process.on('unhandledRejection', (reason, promise) => { + // Interceptar rechazos relacionados con el mismo bug + if (reason && typeof reason === 'object' && + 'message' in reason && + // @ts-ignore + reason.message?.includes("Cannot read properties of undefined (reading 'id')")) { + + logger.warn('🔧 Discord.js promise rejection interceptada: GuildMemberManager error'); + // @ts-ignore + logger.warn('Reason:', reason); + + // NO terminar el proceso + return; + } + + // Para otras promesas rechazadas, logear pero continuar + // @ts-ignore + logger.error('🚨 UnhandledRejection:', reason); + }); + // ============================================ // 🚀 OPCIÓN 1: ACTIVIDAD FIJA (RECOMENDADO PARA HEROKU 512MB) // ============================================