javascript - 查找由机器人创建的嵌入 (discord.js)
问题描述
这可能有点复杂...
我在我的服务器上制作了一个报告系统,如果用户对“❗”做出反应,则此消息会在只有所有者看到的频道中报告。这是我到目前为止的代码:
client.on("messageReactionAdd", (messageReaction, user) => {
const msg = messageReaction.message;
if (messageReaction.emoji.name == "❗") {
if (messageReaction.count > 1) {
// code missing here
} else {
const embed = new Discord.MessageEmbed()
.setColor("#ff9e00")
.setDescription("§ Report")
.setFooter(`${msg.member.user.tag}`, msg.member.user.displayAvatarURL())
.setTimestamp()
.addFields(
{name: "Message", value: `[${msg.cleanContent}](${msg.url})`, inline: false},
{name: "Amount", value: messageReaction.count, inline: true},
{name: "Channel", value: `${msg.channel.name}`, inline: true});
msg.member.guild.channels.cache.get(config.channels.report).send((embed));
}
};
});
所以,每次有人报告一条消息,他是第一个报告它的人,我的机器人会发送一个新的机器人,但我现在想要如果反应不是第一个,我希望机器人编辑相应的嵌入,并增加/更新messageReaction.count
. 有人知道我如何在没有数据库的情况下找到初始消息吗?
提前致谢!
解决方案
我已修改代码以保留已发送报告中的消息 ID 集合。
当需要编辑报告时,从集合中获取其 ID 并用于获取实际消息,然后从旧嵌入创建新嵌入,并增加第二个字段。最后,使用包含递增字段的新嵌入来编辑消息。
client.on("messageReactionAdd", async (messageReaction, user) => {
const msg = messageReaction.message;
if (messageReaction.emoji.name == "❗") {
if (messageReaction.count > 1) {
const message = (await msg.guild.channels.cache.get(config.channels.report).messages.fetch()).find(message => message.embeds[0].fields[3].value === msg.id);
const embed = new Discord.MessageEmbed(message.embeds[0])
.spliceFields(1, 1, {name: "Amount", value: messageReaction.count, inline: true});
message.edit(embed);
} else {
const embed = new Discord.MessageEmbed()
.setColor("#ff9e00")
.setDescription("§ Report")
.setFooter(`${msg.member.user.tag}`, msg.member.user.displayAvatarURL())
.setTimestamp()
.addFields(
{name: "Message", value: `[${msg.cleanContent}](${msg.url})`, inline: false},
{name: "Amount", value: messageReaction.count, inline: true},
{name: "Channel", value: `${msg.channel.name}`, inline: true},
{name: "Message ID", value: msg.id, inline: false});
msg.guild.channels.cache.get(config.channels.report).send(embed);
}
};
});
如果您想在删除原始消息时编辑报告,这里有一些额外的代码:
client.on("messageDelete", async (msg) => {
const message = (await msg.guild.channels.cache.get(config.channels.report).messages.fetch()).find(message => message.embeds[0].fields[3].value === msg.id);
if (message) {
const embed = new Discord.MessageEmbed(message.embeds[0])
.spliceFields(0, 1, {name: "Message", value: `[${msg.cleanContent}](*deleted*)`, inline: false})
.spliceFields(3, 1, {name: "Message ID", value: '*deleted*', inline: false})
.setDescription("§ Report\n**The user deleted their message, but here is its content.**");
message.edit(embed);
}
});
推荐阅读
- python - 每次都正确关闭数据库吗?
- r - 更改 R 中的一种单元格数据类型
- c# - 为什么在具体装饰器的构造函数中我必须重复超类构造函数的代码?
- c - Mac M1 openssl CLion 编译问题
- flutter - 如何实现滑动选择?类似于 iOS 上的照片应用
- angular - 两种方式数据绑定和将数据从 html 发送到 ts 文件中的变量
- python - 如何从在 localhost 上运行的服务器获取数据?
- java - LocalBroadcastManager 不适用于 API 30
- postgresql - Postgresql 是否在事务中隐式包装 select 语句?
- javascript - 为什么我们在这段代码中使用 query.toLowerCase()