Показать пользователей, которые отреагировали на сообщение с ReactionCollector - PullRequest
1 голос
/ 11 марта 2019

Я пытаюсь сделать команду «голосовать», где вы можете увидеть, кто проголосовал.Это мой текущий код:

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`);
  });
})

Я пытался заменить "кто-то проголосовал!"с именем пользователя, который проголосовал: как я могу это сделать?

Другое дело, что collected.size это 0, если никто не отреагировал, но это всегда 1, независимо от того, 1 или 5 пользователейотреагировал: что я там не так делаю?

1 Ответ

1 голос
/ 11 марта 2019

Я пытался заменить "кто-то голосовал!"с именем пользователя, который проголосовал: как я могу это сделать?

Вы не можете получить пользователя из обработчика события 'collect', так как параметр является MessageReaction: вы можете толькополучить всех пользователей, которые отреагировали.
Единственное, что вы можете сделать, это изменить фильтр примерно так:

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.size0 если никто не отреагировал, но его всегда 1 независимо от того, отреагировал ли 1 или 5 пользователей: что я там не так делаю?

Проблема в том, что collected содержит собранные Реакции , а не пользователей, и поскольку ваш фильтр принимает только один смайлик, его size будет 0 или 1.
Чтобы узнать количество пользователей, вам нужно проверить 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`);
});
...