node.js - 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
解决方案
问题是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);
}
});
这是命令处理程序的一个非常基本的版本,但它可以工作。如果您想了解更高级的版本,请参见此处。
推荐阅读
- html - 如何正确保存网站的html代码?
- c++ - 如何将多个主要功能上传到 1 个 GitHub 存储库?
- c# - LINQ Query with method syntax
- r - 为并行创建一个多嵌套的“foreach”循环
- c++ - 没有空格的流提取 - 如何将文本文件中的列表存储到数组中
- spring - 未连接时的Spring Eureka LoadBalanced RestTemplate
- selenium - 在 Jenkins HTML Publisher 上播放视频时出现问题
- matplotlib - 应用tight_layout后调整matplotlib子图轴+标签
- android - 如何在 android 中捕获 5G 的 RSRP、SINR 等网络参数。我会在 NSA 模式下同时获得 LTE 和 5G 参数吗?
- java - 为什么这个三元语句给我一个语法错误?