Acabo de empezar a tener un problema con mi bot de gestión de roles discord.js. El bot agregará con éxito un rol en el evento de reacción. Si un usuario elimina la reacción, el rol debería desaparecer.
Tengo un método auxiliar que regresa temprano si el usuario no tiene el rol (para evitar trabajo innecesario y mantener limpio el registro). Este método evita que el rol se elimine en el primer evento de eliminación de reacción. La secuencia es la siguiente:
guild.members.cache.get(user.id).roles.cache.has(role.id) devuelve false.El rol aparece correctamente en Discord correctamente la primera vez, sin embargo, hice algunas investigaciones y agregué el siguiente código al bot:
guild.members.cache.get(member.id).roles.add(role.id) .then(() => guild.members.cache.get(author.id)) .then(user => console.log(user._roles));El resultado no incluye el nuevo rol, a pesar de que el usuario está promocionado en el cliente, por lo que parece que la memoria caché no se actualiza de inmediato. ¿Cómo puedo asegurarme de obtener la información más actualizada?
Editar: terminé solucionando esto creando mi propio caché para almacenar roles, pero para la posteridad, aquí hay un código adicional para tratar de aislar la causa:
let guild; const messageId = //some value const roleId = //some value const channelId = //some value const emojiName = //some value client.on('messageReactionAdd', async (reaction, user) => { handleReactionAdded(reaction, user) }); client.on('messageReactionRemove', async (reaction, user) => { handleReactionRemoval(reaction, user) }); const handleReactionAdded = async (reaction, user) => { if (reaction.message.partial) await reaction.message.fetch(); if (reaction.partial) await reaction.fetch(); if (user.bot || !reaction.message.guild) return; if (reaction.message.id == messageId && reaction.message.channel.id == channelId && reaction.emoji.name === emojiName) { guild = reaction.message.guild if (_hasRole(user)) return; guild.members.cache .get(user.id) .roles .add(roleId) } const handleReactionAdded = async (reaction, user) => { if (reaction.message.partial) await reaction.message.fetch(); if (reaction.partial) await reaction.fetch(); if (user.bot || !reaction.message.guild) return; if (reaction.message.id == messageId && reaction.message.channel.id == channelId && reaction.emoji.name === emojiName) { guild = reaction.message.guild if (!_hasRole(user)) return; guild.members.cache .get(user.id) .roles .remove(roleId) } const _hasRole = user => { return guild.members.cache.get(user.id).roles.has(roleId); }Si se trata de un problema con el caché desactualizado, forzar la recuperación del miembro de la API después de agregar el rol podría resolverlo, ya que el administrador de roles no parece tener su propio método de recuperación, pero no estoy seguro.
await guild.members.fetch({user, force: true})