首页 > 解决方案 > Discord.js 命令机器人错误:机器人快疯了

问题描述

我是 Node.js Coding 的初学者,最近在 repl.it 上编写了我的机器人

我有特定的审核命令,基本上是警告和静音。当我运行机器人时,然后在聊天中写一些东西(例如,一切,只是'。')它说我必须提及然后警告自己,然后再次警告他之前的警告消息等。我不知道是否你确实明白,但无论如何。

这是我的代码:

client.on("message", async (message) => {
 let victim = message.mentions.users.first()
 if(!victim) message.reply("mention someone to warn.")
 else {
 let embed = new Discord.MessageEmbed()
 .setTitle("Warnings")
 .setDescription(`${victim} got warned by ${message.author}!`)
 .setColor("GREEN")
 .setFooter(`Moderator : ${message.author.username}`)
 .setTimestamp()
 
 message.channel.send(embed)
 }
});

client.on("message", async (message) => {
    if(message.content.startsWith("!mute")) {
      if(message.member.hasPermission("ADMINISTRATOR")) {
        let member = message.mentions.members.first()
          if(!member) {
            message.channel.send("Mention someone to mute!")
          } else {
            member.roles.add("813876389475385394")
            let embed = new Discord.MessageEmbed()
              .setTitle("Mutes")
              .setDescription(`${victim} got kicked by ${message.author}!`)
              .setColor("GREEN")
              .setFooter(`Moderator : ${message.author.username}`)
              .setTimestamp()
            message.channel.send(embed)
          };
       };
    };
});

如果有一些问题可以问它,如果您能提供帮助,我将不胜感激!<3

他有点疯狂

标签: node.jsdiscorddiscord.jsbots

解决方案


问题是onMessage您的代码中有两个事件(您只需要一个),并且您从不检查消息的作者是否是机器人本身。onMessage该检查很重要,因为机器人会因您的第一个事件而响应任何消息。

这个:

client.on("message", async (message) => {
    let victim = message.mentions.users.first()
    if (!victim) message.reply("mention someone to warn.")
    else {
        let embed = new Discord.MessageEmbed()
            .setTitle("Warnings")
            .setDescription(`${victim} got warned by ${message.author}!`)
            .setColor("GREEN")
            .setFooter(`Moderator : ${message.author.username}`)
            .setTimestamp()

        message.channel.send(embed)
    }
});

在该块中,您永远不会检查任何命令,因此它总是会触发。

现在是实际问题和后续修复。 注意:我知道这是一个很长的句子,但请耐心等待

首先,您的机器人会对任何消息做出反应,并检查该消息中是否提到了某人。如果不是这样,它会回复提到原作者,这反过来又会再次触发事件。这一次有人被提及(因为回复)并且机器人发送嵌入,它再次做出反应并重新开始循环。

现在要解决您的特定问题,您需要做的就是检查消息的作者是否是机器人。你用if (message.author.bot) return;.

所以它应该是这样的:

client.on("message", async (message) => {
    if (message.author.bot) return;
    let victim = message.mentions.users.first()
    if (!victim) message.reply("mention someone to warn.")
    else {
        let embed = new Discord.MessageEmbed()
            .setTitle("Warnings")
            .setDescription(`${victim} got warned by ${message.author}!`)
            .setColor("GREEN")
            .setFooter(`Moderator : ${message.author.username}`)
            .setTimestamp()

        message.channel.send(embed)
    }
});

这解决了您最初的问题,但是现在您遇到的问题是您的机器人总是对这两个事件做出反应。

在此处输入图像描述

如您所见,机器人发送两条消息。这就是为什么您只需要一个 onMessage事件。您所要做的就是将您的两个命令放入一个事件中。它应该看起来像这样:

client.on("message", async (message) => {
    if (message.author.bot) return;
    if (message.content.startsWith("!mute")) {
        if (message.member.hasPermission("ADMINISTRATOR")) {
            let member = message.mentions.members.first();
            if (!member) {
                message.channel.send("Mention someone to mute!")
            } else {
                member.roles.add("813876389475385394");
                let embed = new Discord.MessageEmbed()
                    .setTitle("Mutes")
                    .setDescription(`${victim} got kicked by ${message.author}!`)
                    .setColor("GREEN")
                    .setFooter(`Moderator : ${message.author.username}`)
                    .setTimestamp();
                
                message.channel.send(embed);
            };
        };
    } else if (message.content.startsWith("!warn")) {
        let victim = message.mentions.users.first();
        if (!victim) return message.reply("mention someone to warn.");
        
        let embed = new Discord.MessageEmbed()
            .setTitle("Warnings")
            .setDescription(`${victim} got warned by ${message.author}!`)
            .setColor("GREEN")
            .setFooter(`Moderator : ${message.author.username}`)
            .setTimestamp();

        message.channel.send(embed);
    }
    
});

这是命令处理程序的一个非常基本的版本,但它可以工作。如果您想了解更高级的版本,请参见此处


推荐阅读