机器人被反应触发时多次回复

时间:2020-05-19 20:38:25

标签: node.js discord.js

现在我正在制作一个discord机器人(在discord.js版本12中)。

它是这样的:

  • 有人发送和侮辱
  • 如果侮辱包含在列表中(存储在insultes.json中),则机器人会发送一条消息并添加一个反应
  • 如果我们添加相同的反应,则机器人会发送另一条消息

我面临的问题是,如果我继续添加响应,则该漫游器将继续答复2、3、4次,依此类推:每次(n),我都会检查响应,并以n + 1条消息答复。

这是代码:

bot.on('message', message => {
  const insulte = require('./insultes.json');

  for (let p = 0; p < insulte.length; p++) {
    // Check if the insult is in the list and make sure it's not from the bot itself
    if (message.content.toLowerCase().includes(insulte[p]) && message.author.id !== "711337757435363468") {
      message.channel.send("First message").then(messageReaction => {
        messageReaction.react("➡️");
      });

      bot.on('messageReactionAdd', (reaction, user) => {
        if (reaction.emoji.name === "➡️" && user.id !== "711337757435363468") {
          message.channel.send("Additional message");
        }
      });
    }
  }
});

1 个答案:

答案 0 :(得分:0)

我认为您的问题出在您使用bot.on('messageReactionAdd', ...的事实上:这意味着,每次运行该部分代码时,该代码都会添加另一个侦听器,该侦听器与以前使用的侦听器相加

此外,当添加对任何消息的响应时,不仅是您发送的消息,该代码也会触发。

根据您的问题,我不知道该机器人是不是应该在您每次对某条消息做出反应时回复一条消息,还是只执行一次然后忽略该消息。我认为是后者。

这是我的看法:

bot.on('message', message => {
  const insults = require('./insultes.json')

  if (insults.some(i => message.content.toLowerCase().includes(i)) && message.author.id !== "711337757435363468") {
    message.channel.send("First message").then(myMsg=> {
      myMsg.react("➡️");

      let reactionFilter = (reaction, user) => reaction.emoji.name === '➡️' && user.id !== "711337757435363468"
      myMsg.awaitReactions(reactionFilter, { max: 1 }).then(() => {
        myMsg.channel.send('Additional message')
      })
    });
  }
})

如您所见,我正在使用Array.some()来检查消息中是否存在任何侮辱,而不是for循环。我正在使用Message.awaitReactions()来获取第一个反应并做出响应:此后,该漫游器将只忽略对该消息的任何其他反应,但仍将对其他消息起作用。

如果有不清楚的地方或无法解决的问题,请随时告诉我:)