使用 ReactionCollector 显示对消息做出反应的用户

Show users that reacted to a message with a ReactionCollector

我正在尝试创建一个 "vote" 命令,您可以在其中查看谁投票了。这是我当前的代码:

message.channel.send("React with  to vote").then(Msent =>
  Msent.react('')).then(Msent => {
  const collector = Msent.message.createReactionCollector((reaction, user) => reaction.emoji.name === '', {
    time: 15000
  });

  collector.on('collect', r => {
    if (r.emoji.name === '') {
      message.channel.send("someone voted!");
    }
  });
  collector.on('end', collected => {
    message.channel.send(`${collected.size} users voted`);
  });
})

我一直在尝试用投票用户的姓名替换 "someone voted!":我该怎么做?

另一件事是,如果没有人做出反应,collected.size 就是 0,但无论是 1 还是 5 个用户做出反应,它总是 1:我做错了什么?

I've been trying to replace "someone voted!" with the name of the user who voted: how can I do this?

您无法从 'collect' 事件处理程序中获取用户,因为参数是 MessageReaction:您只能获取 all 个用户反应了。
您唯一可以做的就是将过滤器修改为如下所示:

const filter = (reaction, user) => {
  if (reaction.emoji.name === '') {
    message.channel.send(`${user} voted!`); // This will mention the user
    message.channel.send(`${user.tag} voted!`); // This will only say their name
    return true;
  } else return false;
}
const collector = Msent.createReactionCollector(filter, { time: 15000 });

collected.size is 0 if no one reacted, but its always 1 no matter if 1 or 5 users reacted: what am I doing wrong there?

问题是 collected 包含收集的 反应 ,而不是用户,并且由于您的过滤器只接受一个表情符号,因此 size 只会是01.
要获得您需要检查 MessageReaction.users.size:

的用户数量
collector.on('end', collected => {
  let n_users = 0;
  if (collected.size > 0) { // Check if there was any vote
    let reaction = collected.first(); // Take the first (and only) 'type' of reaction
    n_users = reaction.users.size; // Get the number of users that used it
  }
  message.channel.send(`${n_users} users voted`);
});