Estoy creando un comando de bot de discordia que da una pregunta y dos emojis en el mensaje de la pregunta para que el usuario reaccione. Si selecciona el emoji incorrecto, el bot le dirá "Incorrecto", reaccionará nuevamente al mensaje y esperará a que el usuario reaccione. Quiero poner esto en un ciclo infinito que solo se detiene cuando el usuario elige el emoji correcto. Esto es lo que he trabajado hasta ahora:
message.channel.send(`Question?`).then(sentMessage => { sentMessage.react('✅'); sentMessage.react('❌'); const filter = (reaction, user) => { return ['✅', '❌'].includes(reaction.emoji.name) && user.id != `${bid}`; // bid = bot's id }; sentMessage.awaitReactions({ filter, max: 1, time: 60000, errors: ['time'] }).then(collected => { var reaction = collected.first(); if (reaction.emoji.name === '❌') { var check = true; while (check) { console.log('?'); message.channel.send('Wrong').then(sentMessage => { sentMessage.react('✅'); sentMessage.react('❌'); const filter = (reaction, user) => { return ['✅', '❌'].includes(reaction.emoji.name) && user.id != `${bid}`; }; sentMessage.awaitReactions({ filter, max: 1, time: 60000, errors: ['time'] }).then(collected => { var reaction = collected.first(); if (reaction.emoji.name == '✅') check = false; }); }); } } }); }); La idea es que cuando el usuario finalmente reaccione ✅ después de reaccionar primero ❌, check se volverá false y el bucle se detendrá. Sin embargo, después de elegir primero ❌, el bucle while no está ejecutando ningún código dentro de él que no sea el bucle console.log('?') . ¿Alguien puede señalar dónde hice mal?
En su código, envía Wrong y coloca la lógica de verificación de reacción dentro then envuelve con while . Sin embargo, dado que Channel.send devuelve una Promesa, terminará casi instantáneamente, continúe el bucle mientras realiza Channel.send y la lógica de reacción simultáneamente. Puede usar una función asíncrona y llamarla recursivamente. Entonces el código sería este:
message.channel.send(`Question?`).then(sentMessage => { sentMessage.react('✅'); sentMessage.react('❌'); const filter = (reaction, user) => { return ['✅', '❌'].includes(reaction.emoji.name) && user.id != `${bid}`; // bid = bot's id }; sentMessage.awaitReactions({ filter, max: 1, time: 60000, errors: ['time'] }).then(collected => { var reaction = collected.first(); if (reaction.emoji.name === '❌') { async function reactionLoop() { console.log('?'); let sentMessage = await message.channel.send('Wrong'); await sentMessage.react('✅'); await sentMessage.react('❌'); const filter = (reaction, user) => ['✅', '❌'].includes(reaction.emoji.name) && user.id != `${bid}`; let collected = await sentMessage.awaitReactions({ filter, max: 1, time: 60000, errors: ['time'] }) var reaction = collected.first(); if (reaction.emoji.name == '✅') await reactionLoop(); } reactionLoop(); } }); });