Discord.js 命令机器人错误:机器人快疯了

时间:2021-03-03 18:21:51

标签: node.js discord discord.js bots

我是 Node.js 编码的初学者,最近在 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

he is kinda crazy

1 个答案:

答案 0 :(得分:1)

问题在于您的代码中有两个 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)
    }
});

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

enter image description here

如您所见,机器人发送了两条消息。这就是为什么您只需要一个 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);
    }
    
});

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