@@ -632,15 +632,104 @@ module.exports = {
632632 return names [ category ] || 'Outras' ;
633633 } ,
634634
635+ // Função auxiliar para verificar e notificar conquistas sem duplicação
636+ async checkAndNotifyAchievementsSafe ( userId , guildId , achievementIds , prisma , message ) {
637+ try {
638+ const userData = await this . getUserCompleteData ( userId , guildId , prisma ) ;
639+ const unlockedAchievements = await this . checkAchievements ( userData ) ;
640+
641+ // Filtrar apenas as conquistas solicitadas
642+ const targetAchievements = unlockedAchievements . filter ( a =>
643+ achievementIds . includes ( a . id )
644+ ) ;
645+
646+ const newAchievements = [ ] ;
647+
648+ for ( const achievement of targetAchievements ) {
649+ // Verificar se já foi notificada nos últimos 7 dias
650+ const recentNotification = await prisma . commandLog . findFirst ( {
651+ where : {
652+ userId,
653+ guildId,
654+ command : `achievement_${ achievement . id } ` ,
655+ createdAt : {
656+ gte : new Date ( Date . now ( ) - 7 * 24 * 60 * 60 * 1000 ) // 7 dias atrás
657+ }
658+ }
659+ } ) ;
660+
661+ if ( ! recentNotification ) {
662+ newAchievements . push ( achievement ) ;
663+
664+ // Registrar que foi notificada
665+ await prisma . commandLog . create ( {
666+ data : {
667+ userId,
668+ guildId,
669+ command : `achievement_${ achievement . id } `
670+ }
671+ } ) ;
672+ }
673+ }
674+
675+ // Notificar e dar recompensas para novas conquistas
676+ if ( newAchievements . length > 0 && message ) {
677+ await message . channel . send ( {
678+ embeds : [ {
679+ title : `🏆 Conquista${ newAchievements . length > 1 ? 's' : '' } Desbloqueada${ newAchievements . length > 1 ? 's' : '' } !` ,
680+ description : newAchievements . map ( a => `${ a . emoji } **${ a . name } **` ) . join ( '\n' ) ,
681+ color : 0xffd700 ,
682+ footer : { text : 'Use l~achievements para ver todas suas conquistas!' }
683+ } ]
684+ } ) ;
685+
686+ await this . giveRewards ( userId , guildId , newAchievements , prisma ) ;
687+ }
688+
689+ return newAchievements ;
690+ } catch ( error ) {
691+ console . error ( 'Erro ao verificar conquistas:' , error ) ;
692+ return [ ] ;
693+ }
694+ } ,
695+
635696 // Função para outros comandos verificarem e notificarem conquistas desbloqueadas
636697 async checkAndNotifyAchievements ( userId , guildId , prisma , channel ) {
637698 try {
638699 const userData = await this . getUserCompleteData ( userId , guildId , prisma ) ;
639700 const unlockedAchievements = await this . checkAchievements ( userData ) ;
640701
641- // TODO: Implementar sistema de conquistas já notificadas
642- // Por agora, apenas retorna as conquistas para notificação manual
643- return unlockedAchievements ;
702+ // Filtrar conquistas já notificadas usando logs de comando
703+ const newAchievements = [ ] ;
704+
705+ for ( const achievement of unlockedAchievements ) {
706+ // Verificar se já foi notificada nos últimos 7 dias (evita spam)
707+ const recentNotification = await prisma . commandLog . findFirst ( {
708+ where : {
709+ userId,
710+ guildId,
711+ command : `achievement_${ achievement . id } ` ,
712+ createdAt : {
713+ gte : new Date ( Date . now ( ) - 7 * 24 * 60 * 60 * 1000 ) // 7 dias atrás
714+ }
715+ }
716+ } ) ;
717+
718+ if ( ! recentNotification ) {
719+ newAchievements . push ( achievement ) ;
720+
721+ // Registrar que foi notificada
722+ await prisma . commandLog . create ( {
723+ data : {
724+ userId,
725+ guildId,
726+ command : `achievement_${ achievement . id } `
727+ }
728+ } ) ;
729+ }
730+ }
731+
732+ return newAchievements ;
644733 } catch ( error ) {
645734 console . error ( 'Erro ao verificar conquistas:' , error ) ;
646735 return [ ] ;
0 commit comments