Mongoose如何获取指定case编号对应的message ID实现Discord机器人日志编辑
你的功能异常根本原因是当前数据库结构设计错误:Modlog集合下每个服务器仅存储1条文档,每次新增case时你直接覆盖了该文档的messageID、caseID、type等字段,导致数据库中只能保留最新一条case的关联信息,编辑时自然只能拿到最新case的消息ID。
解决方案
第一步 调整数据库结构
新增独立的Case集合存储每条case的独立信息,字段定义如下:
guildID: 所属服务器IDcaseID: case编号(自增数字)messageID: 对应日志消息的IDtype: 操作类型moderatorID: 执行操作的管理员IDtargetID: 被处理的用户IDreason: 处理原因
原来的Modlog集合仅保留服务器配置字段即可,不需要存储单条case的相关信息:
guildID: 服务器IDmodLog.enabled: 日志开关状态modLog.channelID: 日志频道IDcaseID: 用于自增分配下一个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
相关产品推荐
相关产品推荐

