Discord.JS如何修改Message Embed指定字段实现圈速排行榜局部更新
Discord赛道排行榜Embed单字段更新实现方案
前置要求
使用discord.js v13及以上版本,提前存储10条赛道对应Embed消息的ID与赛道名称的映射关系,避免全量遍历频道消息。
实现步骤
- 定位目标赛道对应的Embed消息
通过预存的映射表直接拉取目标消息,不需要检索频道内其他消息,不会影响其他Embed内容。 - 提取现有排行榜数据
从目标消息的首个Embed中读取已有的3条成绩字段,转换为可排序的结构化数组:// 拉取目标赛道消息 const targetTrackMsg = await yourChannel.messages.fetch(trackIdMap["Track 3 Name"]); const originEmbed = targetTrackMsg.embeds[0]; // 转换为结构化成绩数组 let lapTimeList = originEmbed.fields.map(item => ({ username: item.name, seconds: Number(item.value.replace(" seconds", "")) })); - 插入新成绩后重排序取前三名
直接将新成绩插入数组后按圈速升序排列,截取前3位即可自动淘汰最后一名:// 插入玩家新成绩 lapTimeList.push({ username: "Clark", seconds: 38 }); // 排序后仅保留前三名 lapTimeList = lapTimeList.sort((a, b) => a.seconds - b.seconds).slice(0, 3); - 局部更新目标消息的Embed
复用原有Embed的标题,仅替换字段内容后更新消息,不会改动消息其他属性,也不会影响频道内其他内容:const updatedEmbed = new MessageEmbed().setTitle(originEmbed.title); lapTimeList.forEach(item => updatedEmbed.addField(item.username, `${item.seconds} seconds`)); await targetTrackMsg.edit({ embeds: [updatedEmbed] });
权限提示:机器人需要持有目标频道的「查看频道」「读取消息历史」「管理消息」「嵌入链接」权限,才能正常完成消息更新操作。
内容的提问来源于stack exchange,提问作者eX C0n
相关产品推荐
相关产品推荐

