我目前有一个Discord机器人,它可以读取与游戏服务器面板相关的API的信息。 在此Bot中,有启动/重新启动/停止/终止服务器的任务。我想让最终用户可以选择对机器人发布的嵌入内容做出反应,并做出一定的反应来触发这些任务。 机器人发布的Command和embed是:
当前检查已触发哪个反应的代码如下:
message.channel.send(embed).then(async (sentEmbed) => {
sentEmbed.react("?")
sentEmbed.react("?")
sentEmbed.react("?")
sentEmbed.react("❌")
const filter = (reaction, user) => {
console.log(reaction.emoji.name)
return reaction.emoji.name === '?' && user.id === message.author.id;
};
const collector = sentEmbed.createReactionCollector(filter, {time: 20000});
collector.on('collect', (reaction, user) => {
Client.startServer(args[0]).then((response) => {
const start_embed = new Discord.MessageEmbed()
.setTitle(response)
.setColor(settings.embed.color.default)
.setFooter(settings.embed.footer);
message.channel.send(start_embed);
}).catch((error) => {
message.channel.send(client.embederror(error))
});
});
const filter2 = (reaction, user) => {
return reaction.emoji.name === '?' && user.id === message.author.id;
};
const collector2 = sentEmbed.createReactionCollector(filter2, {time: 20000});
collector.on('collect', (reaction, user) => {
Client.restartServer(args[0]).then((response) => {
const restart_embed = new Discord.MessageEmbed()
.setTitle(response)
.setColor(settings.embed.color.default)
.setFooter(settings.embed.footer);
message.channel.send(restart_embed);
}).catch((error) => {
message.channel.send(client.embederror(error))
});
});
const filter3 = (reaction, user) => {
return reaction.emoji.name === '?' && user.id === message.author.id;
};
const collector3 = sentEmbed.createReactionCollector(filter3, {time: 30000});
collector.on('collect', (reaction, user) => {
console.log(`User Stopped There Server`);
});
const filter4 = (reaction, user) => {
return reaction.emoji.name === '❌' && user.id === message.author.id;
};
const collector4 = sentEmbed.createReactionCollector(filter4, {time: 30000});
collector.on('collect', (reaction, user) => {
console.log(`User Killed There Server`);
});
})
此代码可用于检测消息上的反应,但是当用户对任何反应做出反应时,它将运行所有触发代码,因此该机器人发布了两个嵌入,我将其定义为该机器人在反应发生时应输出的内容触发。
我只希望用户单击一个响应,然后机器人执行某项操作,然后用户可以单击另一个响应,然后机器人执行其他操作。
预先感谢
答案 0 :(得分:1)
问题是您使用collector.on("collect")
4次而不是使用collector2
,collector3
和collector4
最好不要有这样的变量,因为这样就表明您可能会感到困惑
另外,您不应有4个不同的过滤器和收集器,尤其是因为您重复了很多代码
const validEmojis = ['?', '?', '?', '❌'];
const filter = (reaction, user) => {
return validEmojis.includes(reaction.emoji.name) && user.id === message.author.id;
};
const collector = sentEmbed.createReactionCollector(filter, { time: 20000, maxEmojis: 1 });
collector.on('collect', (reaction, user) => {
const name = reaction.emoji.name;
//you only use it in two cases but I assume you will use it for all later on
const embed = new Discord.MessageEmbed()
.setColor(settings.embed.color.default)
.setFooter(settings.embed.footer);
if (name === '?' || name === '?') {
const method = name === '?' ? "startServer" : "restartServer";
Client[method](args[0])
.then(response => {
embed.setTitle(response);
message.channel.send(start_embed);
}).catch((error) => {
message.channel.send(client.embederror(error))
});
} else if (name === '?') {
console.log(`User Stopped There Server`);
} else if (name === '❌') {
console.log(`User Killed There Server`);
}
});