const reactionRolesSchema = require("@schemas/reaction-roles-schema") const cache = {} const fetchCache = (guildID) => cache[guildID] || [] const addToCache = async (guildID, message, emoji, roleID) => { const array = cache[guildID] || [message, {}] if (emoji && roleID) { array[1][emoji] = roleID } await message.channel.messages.fetch(message.id, true, true) cache[guildID] = array; } const handleReaction = (reaction, user, adding) => { const { message } = reaction const { guild } = message const [fetchedMessage, roles] = fetchCache(guild.id) if (!fetchedMessage) { return } if (fetchedMessage === message.id && guild.me.hasPermission('MANAGE_ROLES')) { const toCompare = reaction.emoji.id || reaction.emoji.name for (const key of Object.keys(roles)) { if (key === toCompare) { const role = guild.roles.cache.get(roles[key]) if (role) { const member = guild.members.cache.get(user.id) if (global.adding) { member.roles.add(role) } else { member.roles.remove(role) } } return } } } } module.exports = async (client) => { const results = await reactionRolesSchema.find() for (const result of results) { const { guildID, channelID, messageID, roles } = result const guild = await client.guilds.cache.get(guildID) if (!guild) { client.logDatabase(`Removing guild ID: "${guildID}" from the database!`); await reactionRolesSchema.deleteOne({ guildID }); return } const channel = await guild.channels.cache.get(channelID); if (!channel) { client.logDatabase(`Removing channel ID: "${channelID}" from the database!`); await reactionRolesSchema.deleteOne({ channelID }); return } try { const cacheMessages = true const skipCache = true const fetchedMessage = await channel.messages.fetch(messageID, cacheMessages, skipCache) if (fetchedMessage) { const newRoles = {} for (const role of roles) { const { emoji, roleId } = role newRoles[emoji] = roleId } cache[guildId] = [fetchedMessage, newRoles] } } catch (e) { client.logDatabase(`Removing message ID: "${messageID}" from the database!`) await reactionRolesSchema.deleteOne({ messageID }) return; } } } module.exports.fetchCache = fetchCache; module.exports.addToCache = addToCache; module.exports.handleReaction = handleReaction;