我试图让我的第一个执行命令的不和谐机器人执行,但是问题是,如果用户使用链接将dms!command链接到该机器人,该机器人会多次响应,因为该命令执行了多次。
client.on('message', msg1 => {
if (msg1.content.startsWith("!command")) {
var splitMessage = msg1.content.split(" ");
if (splitMessage[1] != undefined) {
var url = splitMessage[1];
if (url.includes("google.com")) {
var execSync = require('child_process').execSync;
var x = Math.floor((Math.random() * 9999999999) + 1);
var cmd = 'wkhtmltopdf ' + url + ' ' + x + '.pdf';
var options = {
encoding: 'utf8'
}
var filename = x + '.pdf';
console.log(execSync(cmd, options));
msg1.reply({ files: [filename] });
}
}
}
});
答案 0 :(得分:1)
您的漫游器多次答复一条消息,因为它本身答复了消息。
您需要检测到来自bot的消息,然后将其忽略。
message.author.bot
返回一个布尔值,如果它是true
,则表示消息来自机器人而不是人类。
您可以将我的代码如下:
client.on('message', msg1 => {
// detect bot message
if (msg1.author.bot) {
// do nothing
console.log('Ignoring bot message!');
return;
}
if (msg1.content.startsWith("!command")) {
var splitMessage = msg1.content.split(" ");
if (splitMessage[1] != undefined) {
var url = splitMessage[1];
if (url.includes("google.com")) {
var execSync = require('child_process').execSync;
var x = Math.floor((Math.random() * 9999999999) + 1);
var cmd = 'wkhtmltopdf ' + url + ' ' + x + '.pdf';
var options = {
encoding: 'utf8'
}
var filename = x + '.pdf';
console.log(execSync(cmd, options));
msg1.reply({ files: [filename] });
}
}
}
});
答案 1 :(得分:0)
不和谐的机器人会多次回复一条消息,有几个原因,让我们逐一检查一下,看看是什么原因造成的。
Discord.js会为所有收到的消息调用on('message')回调,即使该机器人是消息的作者。这可能导致漫游器回复其自身的消息并触发无限循环 我们可以通过忽略来自机器人的所有消息来简单地避免这种情况。
if(msg.author == client.user) return;
类似于前面的例子,我们可能希望我们的机器人忽略来自同一服务器中其他机器人的消息。幸运的是discord.js有一个标志,用于指示消息是来自漫游器还是普通用户。 我们可以通过忽略来自所有漫游器的所有消息来简单地避免这种情况。
if(msg.author.bot) return;
快速浏览您的代码表明,该机器人正在回复以'!command'开头的消息,并且其回复不包含'!command',因此即使没有上述建议的返回,它也不应回复自身。
好吧,您的机器人有可能表现得很完美,并且只回复一次,但是您的机器人有多个实例正在运行。僵尸程序的每个实例都被视为自己的实例,因此,它会自行回复消息,而忽略另一个实例在做什么。