我是 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
答案 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)
}
});
这解决了您最初的问题,但是现在您的机器人总是对这两个事件做出反应。
如您所见,机器人发送了两条消息。这就是为什么您只需要一个 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。