提问者:小点点

等待对bot消息的反应


我想做一个投票机器人来计算对一条消息的反应。机器人发送一条消息,对其作出反应,并计算对其消息的反应。

当我使用AwaitReactions时,反应不会在Then中处理。

代码如下:

channel.send(mess)
 .then(async m => {
       await m.react(ok);
       await m.react(ko);
       await m.react(maybe);
       m.awaitReactions((r, u) => { console.log(`filter:${u.username}`); return true; }, {max: 100000})
        .then(collected => {
             console.log("Reacted");
             collected.forEach(c => { console.log(c); });
         })
          .catch(collected => {
              console.log("Catch");
          });
});

当对生成的消息作出反应时,唯一打印的console.log是filter函数中的那个。

为什么thencatch中的console.log没有执行?

编辑:在AwaitRections的函数参数中添加return。添加返回并不能解决这个问题。


共1个答案

匿名用户

当您等待反应时,当您在options对象中传递的参数之一达到时(如时间到了,或达到最大反应数),承诺就会被解决。如果未达到任何参数,则不解析承诺。在你的情况下,你只给出最大的反应(100000),而这是永远也达不到的。

例如,要在获得轮询结果之前等待30秒,您可以执行以下操作:

m.awaitReactions((r, u) => { console.log(`filter:${u.username}`); return true; }, { time: 30000 })
    .then(collected => {
         console.log("Collector ended");
         // Collected is a collection with all the reactions collected
         console.log(collected);
     })
     .catch(collected => {
          console.log("No reaction collected");
     });

如果您想做像您的例子中的“reacted”的console.log当某人做出反应时,您需要使用MessageCollector而不是Message.AwaitReactions。您可以执行:

let collector = message.createReactionCollector((r, u) => { console.log(`filter:${u.username}`); return true; });
collector.on("collect", (reaction, user) => {
     console.log("Reacted");
});