【问题标题】:Discord.js Command Bot Error: bot is going crazyDiscord.js 命令机器人错误:机器人快疯了
【发布时间】:2021-06-02 08:59:27
【问题描述】:

我是 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)
          };
       };
    };
});

如果有什么问题可以问 如果您能提供帮助,我将不胜感激!

he is kinda crazy

【问题讨论】:

  • 你能截屏一下你发消息时到底发生了什么吗?
  • 抛出什么错误?它使调试变得如此容易
  • @JoeMoore 我认为他们没有收到错误。我认为一切正常,但听起来,它仍在发送他们不希望机器人发送的响应。
  • 我确实添加了截图@QuazArxx

标签: node.js discord discord.js bots


【解决方案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)
    }
});

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

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

【讨论】:

  • 兄弟,tysm,这是一个很棒的指南
  • 您可以将答案标记为正确,如果您觉得有帮助,请点赞
  • 但是等等,你解决了最后一个问题,但现在静音命令不起作用
  • 我对您的实际 mute 代码没有任何更改。当我测试它时,它一直工作到if (!member) 部分。
  • 嗯,好吧,你的回答真的很有用,我会把它标记为有用,但是,你能帮我静音命令吗
猜你喜欢
  • 2020-08-21
  • 2021-06-02
  • 2021-04-18
  • 2022-06-25
  • 2021-08-14
  • 2020-11-09
  • 2021-11-21
  • 2021-08-09
  • 2021-02-07
相关资源
最近更新 更多