机器人为什么会自我反应? (discord.js)

时间:2019-07-06 09:35:12

标签: javascript node.js discord.js

我正在设置一个机器人,该机器人将等待用户的反应以编写短消息。目前,该机器人对自己的反应做出了回应!为什么?

const { Client, RichEmbed, Discord } = require('discord.js');
const config = require('./config.json');
const client= new Client();


client.on('ready', () => {
    console.log('je suis pret!');
    client.user.setActivity("/help pour appeler de l'aide (avec le code NOMAD bien sur)", { type: 'WATCHING' });

})
client.on('messageReactionAdd', (reaction, user) => {
    console.log(`${user.username} reacted with "${reaction.emoji.name}".`);
});

client.on('messageReactionRemove', (reaction, user) => {
    console.log(`${user.username} removed their "${reaction.emoji.name}" reaction.`);
});
client.on('message', async message => {
    if (message.author.bot) return; 

    if (message.content.toLowerCase().startsWith('!rea')) {
      try {
        const sentMessage = await message.channel.send('Select a number.');

        for (let n = 1; n <= 5; n++) await sentMessage.react(`${n}⃣`);

        const filter = (reaction, user) => ['1', '2', '3', '4', '5'].includes(reaction.emoji.name.slice(0, 1)) && user.id === message.author.id;
        const collected = await sentMessage.awaitReactions(filter, { maxMatches: 1, time: 60000 });

        if (collected.size === 0) {
          await sentMessage.clearReactions();
          await message.channel.send('Your time ran out.');
        } else {
          const reaction = collected.first();

          switch(reaction.emoji.name.slice(0, 1)) {
            case '1':
              await message.channel.send('You chose `one`.');
              break;
          }
        }
      } catch(err) {
        console.error(err);
      }
    }
  });
client.login(config.token);

我发现了问题:该漫游器认为第一条消息是“!rea”,因此,如果我在!rea下面添加响应,它就会回答! 我该如何解决这个问题,因为我希望他考虑了嵌入反应!

谢谢您的帮助

1 个答案:

答案 0 :(得分:0)

您的客户的message事件由任何消息发出,包括自身发送的消息。

要防止漫游器(以及您的客户端)触发代码,请在回调的开头添加一个条件,以检查作者的User.bot属性,并返回是否为true

if (message.author.bot) return; // Stop if the author is a bot.

// Continue with your code.

此外,您正在收集对错误消息以及每条消息的反应。您的第一个message回调中的then() 外部是机器人收到的

为使事情更简单易读,我们可以使用await关键字(请注意,它只能用于异步上下文,例如在声明为async的函数中)。

结合这些更改...

client.on('message', async message => {
  if (message.author.bot) return; 

  if (message.content.toLowerCase().startsWith('!rea')) {
    try {
      const sentMessage = await message.channel.send('Select a number.');

      for (let n = 1; n <= 5; n++) await sentMessage.react(`${n}⃣`);

      const filter = (reaction, user) => ['1', '2', '3', '4', '5'].includes(reaction.emoji.name.slice(0, 1)) && user.id === message.author.id;
      const collected = await sentMessage.awaitReactions(filter, { maxMatches: 1, time: 60000 });

      if (collected.size === 0) {
        await sentMessage.clearReactions();
        await message.channel.send('Your time ran out.');
      } else {
        const reaction = collected.first();

        switch(reaction.emoji.name.slice(0, 1)) {
          case '1':
            await message.channel.send('You chose `one`.');
            break;
        }
      }
    } catch(err) {
      console.error(err);
    }
  }
});