фильтровать реакции от конкретных пользователей discord.js - PullRequest
0 голосов
/ 23 июня 2019

Я создаю бота, где игроки могут соревноваться друг с другом. После публикации команды вызова, которая включает в себя список игроков, которым они хотят выполнить вызов, я заставляю своего бота получать идентификаторы разницы для каждого из этих пользователей.

Затем у меня есть пост бота в канале испытаний, в котором перечислены игроки, и я жду реакции только тех игроков, которые получили вызов. Я сделал сборщик реакций, чтобы собрать эти реакции. Я хочу отфильтровать эти реакции, чтобы они включали только те, которые были оспорены, чтобы случайные игроки не смогли захватить задачу.

В приведенном ниже коде uniquePlayersIDArray представляет собой массив разрозненных идентификаторов пользователя. Я просто хочу, чтобы бот собирал реакции только от пользователей из этого массива.

Я пытался использовать uniquePlayersIDArray.indexOf (user.id), чтобы определить, находится ли пользователь в массиве. Как показано ниже, я попробовал uniquePlayersIDArray.includes (user.id).

async function acceptQuestion() {

  const agree = "✅"
  const disagree = "❌"
  let msg = await message.channel.send(`A challenge has been issued by ${author}?\n\n**IF** you are listed above, please select one of the following to accept or deny the challenge...`)
  await msg.react(agree)
  await msg.react(disagree)

  const filter = (reaction, user) => {
  return ['✅', '❌'].includes(reaction.emoji.name) && uniquePlayersIDArray.includes(user.id);

  };
 const collector = await msg.createReactionCollector(filter, { time: 15000 });

  collector.on('collect', (reaction, reactionCollector) => {

  console.log(`Collected ${reaction.emoji.name}`)

  if (reaction.emoji.name === '✅') {
  message.channel.send(`${reaction.user} has **accepted** the challenge! Please await 5 minutes to pass or for all challenged players to respond!`)
  } else if (reaction.emoji.name === '❌') {
  message.channel.send(`${reaction.user} has **declined* the challenge! Please await 5 minutes to pass or for all challenged players to respond!`)
    }
    });

    collector.on('end', collected => {
    console.log(`Collected ${collected.size} items`);
    });
    }

Я знаю, что это работает без добавления чего-либо после ".include (Reaction.emoji.name)" в операторе фильтра, но тогда он принимает все реакции.

Я просто хочу, чтобы все реакции людей, которых не оспаривали, игнорировались.

Спасибо за помощь заранее.

1 Ответ

0 голосов
/ 25 июня 2019

Вы можете добавить MessageCollector, чтобы проверить, реагирует ли автор исполнителя, и использовать message.awaitReactions вместо createReactionCollector

message.awaitReactions(filter, { max: 1, time: 500000, errors: ['time'] })
                .then(collected => {
                    const reaction = collected.first();

                    if (reaction.emoji.name === '✅') {
                        msg.channel.send(logSetup);
                            const collector = new Discord.MessageCollector(msg.channel, m => m.author.id === msg.author.id, { time: 500000 });
                            console.log(collector)
                            collector.on('collect', message => {

                                message.channel.send("You clicked ✅");

                            })
                    } else {
                        msg.reply('You clicked ❌');
                    }
                })
...