【问题标题】:finding an embed created by a bot (discord.js)查找由机器人创建的嵌入 (discord.js)
【发布时间】:2020-11-22 07:11:39
【问题描述】:

这可能有点复杂...

我在我的服务器上创建了一个报告系统,如果用户对“❗”做出反应,则此消息会在只有所有者看到的频道中报告。到目前为止,这是我的代码:

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。 有人知道我如何在没有数据库的情况下找到初始消息吗?

提前致谢!

【问题讨论】:

  • 我认为你需要监听原始事件@​​987654321@
  • 请不要把两个问题合二为一。

标签: javascript node.js discord discord.js


【解决方案1】:

我已修改代码以保留来自已发送报告的消息 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);
    }
});

【讨论】:

  • 嘿,非常感谢!但是,如果机器人重新启动,这是否也有效,报告集合不应该再次为空吗?
  • 另外,message.embeds[0] 似乎不起作用,这个数组“嵌入”是从哪里来的,我的 cmd 也在说cannot ready property "embeds" of undefined,所以消息也没有真正得到
  • 好吧,我发现const message = msg.channel.messages.cache.get(reports.get(msg.id)); 不起作用,我猜它无法获取嵌入的消息对象
  • 好的,我找到了您的问题,您正在搜索 msg.channel 中的嵌入,但我的报告是在报告频道中发送的,我对其进行了修改,但现在它只能在不重新启动机器人的情况下工作,所以我仍然需要一个数据库...还是谢谢你!
  • 我已经按照上面评论中的描述修改了我的代码。
猜你喜欢
  • 2020-09-08
  • 2020-09-15
  • 2021-04-09
  • 2020-07-18
  • 2018-09-25
  • 2021-09-18
  • 2021-05-08
  • 2020-09-22
  • 2023-04-10
相关资源
最近更新 更多