Skip to content

Commit 65b4ba9

Browse files
committed
Major hotfic on validations
1 parent b4c1a7a commit 65b4ba9

9 files changed

Lines changed: 218 additions & 164 deletions

File tree

commands/achievements.js

Lines changed: 92 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -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 [];

commands/avatar.js

Lines changed: 14 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -16,32 +16,20 @@ module.exports = {
1616
const { PrismaClient } = require('@prisma/client');
1717
const prisma = new PrismaClient();
1818

19-
const userData = await achievementsModule.getUserCompleteData(message.author.id, message.guild.id, prisma);
20-
const unlockedAchievements = await achievementsModule.checkAchievements(userData);
21-
22-
// Verificar conquistas criativas
23-
const creativeAchievements = unlockedAchievements.filter(a =>
24-
a.id === 'creative'
25-
);
26-
27-
if (creativeAchievements.length > 0) {
28-
setTimeout(async () => {
29-
try {
30-
await message.channel.send({
31-
embeds: [{
32-
title: '🏆 Conquista Desbloqueada!',
33-
description: `**${message.author.username}** desbloqueou: ${creativeAchievements[0].emoji} **${creativeAchievements[0].name}**`,
34-
color: 0xffd700,
35-
footer: { text: 'Use l~achievements para ver todas suas conquistas!' }
36-
}]
37-
});
38-
39-
await achievementsModule.giveRewards(message.author.id, message.guild.id, creativeAchievements, prisma);
40-
} catch (error) {
41-
console.log('Erro notificando conquista criativa:', error.message);
42-
}
43-
}, 1000);
44-
}
19+
// Usar a função auxiliar para notificar sem duplicação
20+
setTimeout(async () => {
21+
try {
22+
await achievementsModule.checkAndNotifyAchievementsSafe(
23+
message.author.id,
24+
message.guild.id,
25+
['creative'],
26+
prisma,
27+
message
28+
);
29+
} catch (error) {
30+
console.log('Erro notificando conquista criativa:', error.message);
31+
}
32+
}, 1000);
4533

4634
await prisma.$disconnect();
4735
} catch (error) {

commands/bughunt.js

Lines changed: 14 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -618,33 +618,21 @@ module.exports = {
618618
// Verificar conquistas para participantes quando há sucesso
619619
try {
620620
const achievementsModule = require('./achievements');
621-
const userData = await achievementsModule.getUserCompleteData(participant.userId, message.guild.id, prisma);
622-
const unlockedAchievements = await achievementsModule.checkAchievements(userData);
623621

624-
// Verificar conquistas de Bug Hunt
625-
const bugHuntAchievements = unlockedAchievements.filter(a =>
626-
['bug_hunter', 'bug_master', 'game_god'].includes(a.id)
627-
);
628-
629-
if (bugHuntAchievements.length > 0) {
630-
setTimeout(async () => {
631-
try {
632-
const user = await message.client.users.fetch(participant.userId);
633-
await message.channel.send({
634-
embeds: [{
635-
title: '🏆 Conquista Desbloqueada!',
636-
description: `**${user.username}** desbloqueou: ${bugHuntAchievements[0].emoji} **${bugHuntAchievements[0].name}**`,
637-
color: 0xffd700,
638-
footer: { text: 'Use l~achievements para ver todas suas conquistas!' }
639-
}]
640-
});
641-
642-
await achievementsModule.giveRewards(participant.userId, message.guild.id, bugHuntAchievements, prisma);
643-
} catch (error) {
644-
console.log('Erro notificando conquista de Bug Hunt:', error.message);
645-
}
646-
}, 3000 + Math.random() * 2000); // Evitar spam de notificações
647-
}
622+
// Usar a função auxiliar para notificar sem duplicação
623+
setTimeout(async () => {
624+
try {
625+
const newAchievements = await achievementsModule.checkAndNotifyAchievementsSafe(
626+
participant.userId,
627+
message.guild.id,
628+
['bug_hunter', 'bug_master', 'game_god'],
629+
prisma,
630+
message
631+
);
632+
} catch (error) {
633+
console.log('Erro notificando conquista de Bug Hunt:', error.message);
634+
}
635+
}, 3000 + Math.random() * 2000); // Evitar spam de notificações
648636
} catch (error) {
649637
console.log('Erro verificando conquistas de Bug Hunt:', error.message);
650638
}

commands/codegolf.js

Lines changed: 14 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -350,33 +350,21 @@ module.exports = {
350350
// Verificar conquistas do vencedor
351351
try {
352352
const achievementsModule = require('./achievements');
353-
const userData = await achievementsModule.getUserCompleteData(winnerId, duel.guildId, prisma);
354-
const unlockedAchievements = await achievementsModule.checkAchievements(userData);
355353

356-
// Verificar conquistas de Code Golf
357-
const golfAchievements = unlockedAchievements.filter(a =>
358-
['golfer', 'golf_master', 'game_god'].includes(a.id)
359-
);
360-
361-
if (golfAchievements.length > 0) {
362-
setTimeout(async () => {
363-
try {
364-
const winner = await message.client.users.fetch(winnerId);
365-
await message.channel.send({
366-
embeds: [{
367-
title: '🏆 Conquista Desbloqueada!',
368-
description: `**${winner.username}** desbloqueou: ${golfAchievements[0].emoji} **${golfAchievements[0].name}**`,
369-
color: 0xffd700,
370-
footer: { text: 'Use l~achievements para ver todas suas conquistas!' }
371-
}]
372-
});
373-
374-
await achievementsModule.giveRewards(winnerId, duel.guildId, golfAchievements, prisma);
375-
} catch (error) {
376-
console.log('Erro notificando conquista de Code Golf:', error.message);
377-
}
378-
}, 2000);
379-
}
354+
// Usar a função auxiliar para notificar sem duplicação
355+
setTimeout(async () => {
356+
try {
357+
await achievementsModule.checkAndNotifyAchievementsSafe(
358+
winnerId,
359+
duel.guildId,
360+
['golfer', 'golf_master', 'game_god'],
361+
prisma,
362+
message
363+
);
364+
} catch (error) {
365+
console.log('Erro notificando conquista de Code Golf:', error.message);
366+
}
367+
}, 2000);
380368
} catch (error) {
381369
console.log('Erro verificando conquistas de Code Golf:', error.message);
382370
}

commands/daily.js

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -95,17 +95,18 @@ module.exports = {
9595
let achievementNotification = '';
9696
try {
9797
const achievementsModule = require('./achievements');
98-
const userData = await achievementsModule.getUserCompleteData(message.author.id, message.guild.id, prisma);
99-
const unlockedAchievements = await achievementsModule.checkAchievements(userData);
10098

101-
// Verificar conquistas relacionadas a coins e daily streaks
102-
const allAchievements = unlockedAchievements.filter(a =>
103-
['first_coins', 'coin_collector', 'millionaire', 'dedicated', 'persistent', 'daily_addict'].includes(a.id)
99+
// Usar a função auxiliar para notificar sem duplicação
100+
const newAchievements = await achievementsModule.checkAndNotifyAchievementsSafe(
101+
message.author.id,
102+
message.guild.id,
103+
['first_coins', 'coin_collector', 'millionaire', 'dedicated', 'persistent', 'daily_addict'],
104+
prisma,
105+
null // Não enviar mensagem automática, será customizada
104106
);
105107

106-
if (allAchievements.length > 0) {
107-
achievementNotification = `\n\n🏆 **Conquista desbloqueada!** ${allAchievements[0].emoji} ${allAchievements[0].name}`;
108-
await achievementsModule.giveRewards(message.author.id, message.guild.id, allAchievements, prisma);
108+
if (newAchievements.length > 0) {
109+
achievementNotification = `\n\n🏆 **Conquista desbloqueada!** ${newAchievements[0].emoji} ${newAchievements[0].name}`;
109110
}
110111
} catch (error) {
111112
// Ignorar erros de conquistas para não quebrar o comando principal

commands/decrypt.js

Lines changed: 14 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -152,32 +152,21 @@ module.exports = {
152152
let achievementNotification = '';
153153
try {
154154
const achievementsModule = require('./achievements');
155-
const userData = await achievementsModule.getUserCompleteData(message.author.id, message.guild.id, prisma);
156-
const unlockedAchievements = await achievementsModule.checkAchievements(userData);
157155

158-
// Filtrar conquistas relacionadas ao decrypt
159-
const decryptAchievements = unlockedAchievements.filter(a =>
160-
['first_decrypt', 'speed_decoder', 'decrypt_master'].includes(a.id)
161-
);
162-
163-
if (decryptAchievements.length > 0) {
164-
setTimeout(async () => {
165-
try {
166-
const embed = {
167-
color: 0x00ff00,
168-
title: '🎉 Nova Conquista Desbloqueada!',
169-
description: `**${message.author.username}** desbloqueou: ${decryptAchievements[0].emoji} **${decryptAchievements[0].name}**`,
170-
timestamp: new Date(),
171-
footer: { text: 'Use l~achievements para ver todas suas conquistas!' }
172-
};
173-
await message.channel.send({ embeds: [embed] });
174-
} catch (error) {
175-
console.log('Erro enviando notificação de conquista:', error.message);
176-
}
177-
}, 1000);
178-
179-
await achievementsModule.giveRewards(message.author.id, message.guild.id, decryptAchievements, prisma);
180-
}
156+
// Usar a função auxiliar para notificar sem duplicação
157+
setTimeout(async () => {
158+
try {
159+
await achievementsModule.checkAndNotifyAchievementsSafe(
160+
message.author.id,
161+
message.guild.id,
162+
['first_decrypt', 'speed_decoder', 'decrypt_master'],
163+
prisma,
164+
message
165+
);
166+
} catch (error) {
167+
console.log('Erro enviando notificação de conquista:', error.message);
168+
}
169+
}, 1000);
181170
} catch (error) {
182171
console.log('Erro verificando conquistas decrypt:', error.message);
183172
}

commands/enviar.js

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -164,18 +164,23 @@ module.exports = {
164164
let achievementNotification = '';
165165
try {
166166
const achievementsModule = require('./achievements');
167-
const userData = await achievementsModule.getUserCompleteData(message.author.id, message.guild.id, prisma);
168-
const unlockedAchievements = await achievementsModule.checkAchievements(userData);
167+
const { PrismaClient } = require('@prisma/client');
168+
const prisma = new PrismaClient();
169169

170-
// Verificar conquistas sociais
171-
const socialAchievements = unlockedAchievements.filter(a =>
172-
['generous', 'helping_hand'].includes(a.id)
170+
// Usar a função auxiliar para notificar sem duplicação
171+
const newAchievements = await achievementsModule.checkAndNotifyAchievementsSafe(
172+
message.author.id,
173+
message.guild.id,
174+
['generous', 'helping_hand'],
175+
prisma,
176+
null // Não enviar mensagem automática, será customizada
173177
);
174178

175-
if (socialAchievements.length > 0) {
176-
achievementNotification = `\n\n🏆 **Conquista desbloqueada!** ${socialAchievements[0].emoji} ${socialAchievements[0].name}`;
177-
await achievementsModule.giveRewards(message.author.id, message.guild.id, socialAchievements, prisma);
179+
if (newAchievements.length > 0) {
180+
achievementNotification = `\n\n🏆 **Conquista desbloqueada!** ${newAchievements[0].emoji} ${newAchievements[0].name}`;
178181
}
182+
183+
await prisma.$disconnect();
179184
} catch (error) {
180185
console.log('Erro verificando conquistas de transferência:', error.message);
181186
}

commands/hack.js

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -122,17 +122,18 @@ module.exports = {
122122
let achievementNotification = '';
123123
try {
124124
const achievementsModule = require('./achievements');
125-
const userData = await achievementsModule.getUserCompleteData(message.author.id, message.guild.id, prisma);
126-
const unlockedAchievements = await achievementsModule.checkAchievements(userData);
127125

128-
// Verificar conquistas de hack
129-
const hackAchievements = unlockedAchievements.filter(a =>
130-
['novice_hacker', 'elite_hacker', 'game_god'].includes(a.id)
126+
// Usar a função auxiliar para notificar sem duplicação
127+
const newAchievements = await achievementsModule.checkAndNotifyAchievementsSafe(
128+
message.author.id,
129+
message.guild.id,
130+
['novice_hacker', 'elite_hacker', 'game_god'],
131+
prisma,
132+
null // Não enviar mensagem automática, será customizada
131133
);
132134

133-
if (hackAchievements.length > 0) {
134-
achievementNotification = `\n\n🏆 **Conquista desbloqueada!** ${hackAchievements[0].emoji} ${hackAchievements[0].name}`;
135-
await achievementsModule.giveRewards(message.author.id, message.guild.id, hackAchievements, prisma);
135+
if (newAchievements.length > 0) {
136+
achievementNotification = `\n\n🏆 **Conquista desbloqueada!** ${newAchievements[0].emoji} ${newAchievements[0].name}`;
136137
}
137138
} catch (error) {
138139
console.log('Erro verificando conquistas de hack:', error.message);

0 commit comments

Comments
 (0)