Укажите, кто нажал на реакцию после бота

#javascript #discord #discord.js

#javascript #Discord #discord.js

Вопрос:

Я использую ${reaction.message.author} , чтобы бот упоминал человека, который нажал на реакцию после этого. Но бот упоминает о себе.

Как сделать так, чтобы бот упоминал пользователя, который нажал на реакцию после бота?

===Код===

 client.on('message', (message) => {
  const args = message.content.slice(prefix.length).trim().split(/  /g);
  const command = args.shift().toLowerCase();

  if (message.content.startsWith(prefix   'Interpol')) {
    const response = args.join(' ');

    message.channel
      .send({
        content: '<@amp;776034311245660200>',
        embed: {
          color: 3447003,
          title: 'Новый вызов',
          timestamp: new Date(),
        },
      })
      .then((sentMessage) => {
        sentMessage.react('1️⃣');
        message.delete({ timeout: 100 });
        const filter = (reaction, user) => {
          return ['1️⃣'].includes(reaction.emoji.name);
        };

        sentMessage
          .awaitReactions(filter, {
            max: 2,
            time: 60000,
            errors: ['time'],
          })
          .then((collected) => {
            const reaction = collected.first();

            if (reaction.emoji.name === '1️⃣') {
              console.log(reaction.message.author);

              message.author.send({
                embed: {
                  color: 3447003,
                  title: 'Вызов принят',
                  description: `**Сотрудник:** ${reaction.message.author}`,
                  timestamp: new Date(),
                },
              });
            }
          });
      });
  }
});
 

Ответ №1:

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

 const filter = (reaction, user) => {
  return ['1️⃣'].includes(reaction.emoji.name) amp;amp; !user.bot;
};
 

Обновление: итак, вы хотите найти первого участника, который отреагировал на сообщение и не является ботом. Проблема в том, что вы отправляете DM с reaction.message.author . reaction.message это сообщение, к которому относится эта реакция, так sentMessage что в вашем случае и author это сообщение — это сам бот.

Вы можете .find() указать первого участника, который отреагировал на сообщение, проверив reaction.users.cache . reaction.users является менеджером пользователей, которые дали эту реакцию (включая бота). Используя .find() , вы можете вернуть одного участника:

 message.channel
  .send({
    content: '<@amp;776034311245660200>',
    embed: {
      color: 3447003,
      title: 'Новый вызов',
      timestamp: new Date(),
    },
  })
  .then((sentMessage) => {
    sentMessage.react('1️⃣');
    message.delete({ timeout: 100 });
    const filter = (reaction, user) => {
      return !user.bot amp;amp; ['1️⃣'].includes(reaction.emoji.name);
    };

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

        if (reaction.emoji.name === '1️⃣') {
          // find the first member who reacted and is not a bot
          const member = reaction.users.cache.find((user) => !user.bot);

          message.author.send({
            embed: {
              color: 3447003,
              title: 'Вызов принят',
              description: `**Сотрудник:** ${member}`,
              timestamp: new Date(),
            },
          });
        }
      })
      .catch(console.log);
  });
 

Комментарии:

1. Я попробовал, но бот перестал отвечать. Раньше он просто упоминал себя, но теперь ничего

2. Я думаю, потому что вы добавили errors: ['time'] и max: 2 . Если только один участник нажмет на реакцию, время ожидания истечет через 60 секунд, и это должно быть catch отредактировано. Попробуйте уменьшить max значение до 1 или удалить errors параметр.

3. Сделал, бот продолжает упоминать себя.

Ответ №2:

Если я не ошибаюсь, вам просто не хватает фильтра. Это обычное явление, когда при попытке что-то собрать бот выбирает для себя собственное сообщение / реакцию.

Чтобы исправить это, все, что вам нужно добавить в вашу функцию фильтра. amp;amp; user.id === message.author.id;

Итак: return ['1️⃣'].includes(reaction.emoji.name) amp;amp; user.id === message.author.id;

Это в основном проверяет, был ли пользователь, который отреагировал, также отправителем сообщения, который, как я предполагаю, является ботом. Иначе нет, тогда вы могли бы просто !user.bot проверить, не бот ли ответил, как сказал Жолт.