Tengo problemas, creo que se debe a async. Aquí está el código:
const calculateMessageKarma = async (reaction) => { if (reaction.partial) {await reaction.fetch();} // Get The Member That Gave Karma & Verify Author = Karma Giver let mK = 0; let tMK = 0; //Upvotes if(await reaction.message.reactions.resolve(config.reactions.UPVOTE)){ let uvotes = await reaction.message.reactions.resolve(config.reactions.UPVOTE).users.fetch() await uvotes.forEach(async vote => { let member = await reaction.client.guilds.cache.find((guild) => guild.id === config.guilds.zentrading).members.fetch(vote.id).then((value) => { return value; }); if(vote.id === reaction.message.author.id) return; // Dont count reactions to own messages if (member.roles.highest.id == config.roles.guildlead.id) { mK += 5} else if (member.roles.highest.id == config.roles.guildmod.id) { mK += 4;} else if (member.roles.highest.id == config.roles.arahant.id) {mK += 3} else if (member.roles.highest.id == config.roles.non_returner.id) {mK += 2} else if (member.roles.highest.id == config.roles.once_returner.id) { mK += 1} else if (member.roles.highest.id == config.roles.non_returner.id) {mK += 1} else {mK += 0} }) } //Downvotes if(await reaction.message.reactions.resolve(config.reactions.DOWNVOTE)){ let dvotes = await reaction.message.reactions.resolve(config.reactions.DOWNVOTE).users.fetch() await dvotes.forEach(async vote => { let member = await reaction.client.guilds.cache.find((guild) => guild.id === config.guilds.zentrading).members.fetch(vote.id).then((value) => { return value; }); if(vote.id === reaction.message.author.id) return; // Dont count reactions to own messages if (member.roles.highest.id == config.roles.guildlead.id) { mK += -5} else if (member.roles.highest.id == config.roles.guildmod.id) { mK += -4;} else if (member.roles.highest.id == config.roles.arahant.id) {mK += -3} else if (member.roles.highest.id == config.roles.non_returner.id) {mK += -2} else if (member.roles.highest.id == config.roles.once_returner.id) { mK += -1} else if (member.roles.highest.id == config.roles.non_returner.id) {mK += -1} else {mK += 0} }) } if (mK > 0) { tMK = 2 + Math.floor(mK / 10) * 1;} else if (mK < 0){ tMK = -1 + Math.floor(mK / 5) * -1;} else { tMK = 0;} return tMK; } Esto está destinado a contar el número de dos reacciones diferentes y asignar el peso de estas reacciones en función del rol de los miembros y luego tomar el valor mK y calcular una puntuación para el mensaje en función de una fórmula. El código funciona bien para config.reactions.UPVOTE pero la declaración config.reactions.DOWNVOTE if casi se ignora. He depurado y determinado que las declaraciones if se están evaluando pero no devuelven el cálculo adecuado.
También sé que las ID son correctas, ya que cuando se llama a messageReactionAdded y messageReactionRemove, está verificando la reacción antes de llamar a esta función.
Versión del nodo: 16.4.0
Pude encontrar una solución usando lo siguiente:
Como parte de la documentación: await reaction.message.reactions.resolve(config.reactions.DOWNVOTE).users.fetch()
Se resuelve con una colección de usuarios, mapeados por sus ID.
Por lo tanto, necesitamos usar .values() para devolver un mapa que podamos iterar usando algo como esto:
let votes = await reaction.message.reactions.resolve(config.reactions.DOWNVOTE).users.fetch().then(users => {return users.values()}) for(vote of votes){Este bucle for ahora devuelve correctamente los valores necesarios para calcular mK.