You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Mongoose如何获取指定case编号对应的message ID实现Discord机器人日志编辑

你的功能异常根本原因是当前数据库结构设计错误:Modlog集合下每个服务器仅存储1条文档,每次新增case时你直接覆盖了该文档的messageID、caseID、type等字段,导致数据库中只能保留最新一条case的关联信息,编辑时自然只能拿到最新case的消息ID。

解决方案

第一步 调整数据库结构

新增独立的Case集合存储每条case的独立信息,字段定义如下:

  • guildID: 所属服务器ID
  • caseID: case编号(自增数字)
  • messageID: 对应日志消息的ID
  • type: 操作类型
  • moderatorID: 执行操作的管理员ID
  • targetID: 被处理的用户ID
  • reason: 处理原因

原来的Modlog集合仅保留服务器配置字段即可,不需要存储单条case的相关信息:

  • guildID: 服务器ID
  • modLog.enabled: 日志开关状态
  • modLog.channelID: 日志频道ID
  • caseID: 用于自增分配下一个case编号

第二步 修改新增case的逻辑

原来的Modlog.findOneAndUpdate仅用于生成自增的case编号,拿到编号后新建Case文档存储当前case的所有信息,不要直接修改Modlog文档的字段:

Modlog.findOneAndUpdate({ guildID: msg.channel.guild.id }, { $inc: { 'caseID': 1 } }, { new: true }, async function (err, doc) {
        if (err) throw err;
        if (!doc) return;
        if (doc.modLog.enabled) {
            const logChannel = msg.channel.guild.channels.get(doc.modLog.channelID)
            if (!logChannel) return
            // 发送日志消息
            let m = await logChannel.createMessage({
                embed: {
                    title: `${action} | Case #${doc.caseID}`,
                    color: colour,
                    fields: [
                        {
                            name: 'User',
                            value: user,
                            inline: true
                        },
                        {
                            name: 'Moderator',
                            value: moderator ? moderator : 'No issuer.',
                            inline: true
                        },
                        {
                            name: 'Reason',
                            value: reason ? reason : 'No reason.'
                        }
                    ]
                }
            });
            // 新建Case文档存储当前case信息
            const newCase = new Case({
                guildID: msg.channel.guild.id,
                caseID: doc.caseID,
                messageID: m.id,
                type: action,
                moderatorID: moderator,
                targetID: user,
                reason: reason
            })
            await newCase.save()
        }
    })

第三步 修改编辑case的逻辑

查询时增加对Case集合的查询,通过guildID和用户传入的caseID匹配到对应case,拿到关联的messageID再执行编辑操作:

Modlog.findOne({ guildID: msg.guildID }, async (err, modlogDoc) => {
        if (err) throw err;
        if (!modlogDoc.modLog.enabled) return msg.channel.createMessage(`Modlog is not enabled in this server! ${this.emoji.cross}`);

        const inputCaseID = Number(caseID)
        if (isNaN(inputCaseID)) return msg.channel.createMessage(`Case \`#${caseID}\` was not a number! ${this.emoji.cross}`);

        // 查询指定case的信息
        const targetCase = await Case.findOne({ guildID: msg.guildID, caseID: inputCaseID })
        if (!targetCase) return msg.channel.createMessage(`Couldn\'t find case \`#${caseID}\`! ${this.emoji.cross}`);

        const moderator = this.bot.users.get(targetCase.moderatorID) || {
            username: 'Unknown User',
            discriminator: '0000'
        }

        const target = this.bot.users.get(targetCase.targetID) || {
            username: 'Unknown User',
            discriminator: '0000'
        }

        let embed = {
            title: `${targetCase.type} | Case #${targetCase.caseID}`,
            fields: [
                {
                    name: 'User',
                    value: `${target.username}#${target.discriminator} (${target.id})`,
                    inline: true
                },
                {
                    name: 'Moderator',
                    value: `${moderator.username}#${moderator.discriminator} (${moderator.id})`,
                    inline: true
                },
                {
                    name: 'Reason',
                    value: reason
                }
            ]
        };

        try {
            await this.bot.editMessage(modlogDoc.modLog.channelID, targetCase.messageID, { embed: embed });
            // 同步更新case的reason字段
            targetCase.reason = reason
            await targetCase.save()
            await msg.channel.createMessage(`Case **#${caseID}** has been updated. ${this.emoji.tick}`);
        } catch (e) {
            await msg.channel.createMessage(`I\'m unable to edit that case or it has been deleted. ${this.emoji.cross}`);
        }
    });

内容的提问来源于stack exchange,提问作者ETLegacy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 10:39:02