const { MessageEmbed } = require('discord.js'); const { QuickDB } = require('quick.db'); const db = new QuickDB(); const activeUsers = new Map(); const inProgress = new Set(); module.exports = { name: 'presenceUpdate', run: async (oldPresence, newPresence) => { if (!oldPresence || !newPresence) { return; } const guild = newPresence.guild; const member = await guild.members.fetch(newPresence.member.id); const activities = newPresence.activities; let vanityId = await db.get(`vanity_${guild.id}`); let vanityRoleId = await db.get(`vanityrole_${guild.id}`); let vanityChannel = await db.get(`vanitychannel_${guild.id}`); let vanityRole = guild.roles.cache.get(vanityRoleId); if (activities.type === 'CUSTOM') { if (activities && activities.length > 0) { const hasVanityActivity = activities.some((activity) => activity && activity.state && (activity.state.includes(`.gg/${vanityId}`) || activity.state.includes(`discord.gg/${vanityId}`)) ); if (hasVanityActivity) { if ( !vanityRole || (!activeUsers.has(member.id) && newPresence.status !== 'offline' && !inProgress.has(member.id)) ) { const vanity = new MessageEmbed() .setColor('0x178719') .setAuthor(member.user.tag) .setDescription(`${member.user}, you now have <@&${vanityRoleId}>\n*Thank you for supporting us!*`) .setFooter(`discord.gg/${vanityId}`); try { inProgress.add(member.id); await member.roles.add(vanityRole); await guild.channels.cache.get(vanityChannel).send({ embeds: [vanity] }); console.log(`${vanityRoleId} successfully added to ${member.user.username} - ${guild.name}`); activeUsers.set(member.id, Date.now()); console.log(`activeUsers for ${member.id} has been set`) } catch (error) { console.error('An error occurred while adding the role or sending a message:', error); } finally { inProgress.delete(member.id); } } } } else if (vanityRole && !inProgress.has(member.id)) { try { inProgress.add(member.id); if (member.roles.cache.has(vanityRoleId)) { console.log(`Before role removal: ${member.roles.cache.map(role => role.name).join(', ')}`); await member.roles.remove(vanityRole); console.log(`After role removal: ${member.roles.cache.map(role => role.name).join(', ')}`); console.log(`${vanityRoleId} successfully removed from ${member.user.username} - ${guild.name}`); activeUsers.delete(member.id); console.log(`activeUsers for ${member.id} has been removed`); } } catch (error) { console.error('An error occurred while removing the role:', error); } finally { inProgress.delete(member.id); } } } else if (!activities.type === 'CUSTOM') { return } }, };