【问题标题】:Discord bot replies multiple timesDiscord 机器人多次回复
【发布时间】:2020-01-25 02:13:09
【问题描述】:

我试图制作我的第一个执行命令的不和谐机器人,但问题是如果用户通过链接向机器人发送 !command 指令,机器人会多次回复,因为该命令执行多次。

client.on('message', msg1 => {
  if (msg1.content.startsWith("!command")) {
    var splitMessage = msg1.content.split(" ");
    if (splitMessage[1] != undefined) {
      var url = splitMessage[1];
      if (url.includes("google.com")) {
        var execSync = require('child_process').execSync;
        var x = Math.floor((Math.random() * 9999999999) + 1);
        var cmd = 'wkhtmltopdf ' + url + ' ' + x + '.pdf';

        var options = {
          encoding: 'utf8'
        }

        var filename = x + '.pdf';
        console.log(execSync(cmd, options));
        msg1.reply({ files: [filename] });
      }
    }
  }
});

【问题讨论】:

    标签: javascript node.js discord discord.js


    【解决方案1】:

    您的机器人多次回复消息,因为它自己回复消息。

    你需要检测来自bot的消息,然后忽略它。

    message.author.bot 返回一个布尔值,如果是true,这意味着消息来自机器人而不是人类。

    您可以如下查看我的代码:

    client.on('message', msg1 => {
      // detect bot message
      if (msg1.author.bot) {
        // do nothing
        console.log('Ignoring bot message!');
        return;
      }
      if (msg1.content.startsWith("!command")) {
        var splitMessage = msg1.content.split(" ");
        if (splitMessage[1] != undefined) {
          var url = splitMessage[1];
          if (url.includes("google.com")) {
            var execSync = require('child_process').execSync;
            var x = Math.floor((Math.random() * 9999999999) + 1);
            var cmd = 'wkhtmltopdf ' + url + ' ' + x + '.pdf';
    
            var options = {
              encoding: 'utf8'
            }
    
            var filename = x + '.pdf';
            console.log(execSync(cmd, options));
            msg1.reply({ files: [filename] });
          }
        }
      }
    });
    

    【讨论】:

      【解决方案2】:

      discord 机器人会多次回复一条消息的原因有几个,让我们逐一分析,看看是哪一个原因造成的。

      机器人正在回复自己的回复,陷入无限循环

      Discord.js 为收到的所有消息调用 on('message') 回调,即使机器人是消息的作者。这可能会导致机器人回复自己的消息并触发无限循环 我们可以通过忽略来自我们机器人的所有消息来简单地避免这种情况。

      if(msg.author == client.user) return;
      

      机器人正在回复另一个机器人消息,陷入无限对话

      与前一种情况类似,我们可能希望我们的机器人忽略来自同一服务器中其他机器人的消息。幸运的是,discord.js 有一个标志来判断消息是来自机器人还是普通用户。 我们可以通过忽略来自所有机器人的所有消息来简单地避免这种情况。

      if(msg.author.bot) return;
      
      快速浏览您的代码会发现该机器人正在回复以“!command”开头的消息,并且它的回复不包含“!command”,因此即使没有上面建议的返回,它也不应该回复自己。

      那么除了代码问题之外,还有什么可能导致机器人多次回复同一条消息呢?

      嗯,您的机器人有可能表现完美,并且只回复一次,但您的机器人有多个实例正在运行。 bot 的每个实例都被视为自己的实例,因此会自行回复消息,而忽略其他实例正在执行的操作。

      【讨论】:

        猜你喜欢
        • 2020-11-08
        • 2021-11-08
        • 2020-07-08
        • 1970-01-01
        • 2018-12-06
        • 2022-10-30
        • 2020-10-11
        • 1970-01-01
        • 2019-02-13
        相关资源
        最近更新 更多