discord.js如何正确获取指定用户发送的最近2条消息
discord.js 获取指定用户最近消息问题修复
两种失效方案的原因
user.lastMessage、user.lastMessageId是客户端缓存属性,仅当机器人启动后在权限范围内接收/主动拉取过该用户的消息、对应内容存在本地缓存时才有值,缓存缺失场景下固定返回undefined,无法作为可靠的消息获取依据。messages.fetch()接口原生不支持author过滤参数,传入的{ author: message.author }不会被接口识别,接口默认返回频道内最近的一批消息,自然会混入其他用户发送的内容。
可用实现方式
单频道场景:拉取消息后本地过滤
如果仅需统计用户在当前频道的最近消息,拉取足够数量的频道历史消息后,在本地按作者ID过滤即可:
// 单接口最多拉取100条频道消息,普通活跃场景下足够筛选出目标用户的最近2条发言 message.channel.messages.fetch({ limit: 100 }) .then(messages => { // 过滤当前用户的消息,按发送时间倒序排序后取最近2条 const userRecentMsgs = messages .filter(msg => msg.author.id === message.author.id) .sort((prev, next) => next.createdTimestamp - prev.createdTimestamp) .first(2); // 适配15秒写入冷却逻辑 if (userRecentMsgs.length === 2) { const gap = Date.now() - userRecentMsgs[1].createdTimestamp; // 距离上一条可计入消息不足15秒,跳过数据库写入 if (gap < 15000) return; } // 满足冷却要求,执行等级经验写入数据库的逻辑 })
全服等级系统推荐方案
如果你的用户等级系统是全服务器生效,不建议每次触发消息都拉取历史消息,性能损耗高且容易受接口限制影响。直接维护一张冷却映射表即可:
- 用内存
Map或者独立数据库字段存储用户ID: 上次计入等级经验的时间戳 - 用户每次发消息时,先查询对应时间戳,和当前时间差值大于等于15秒时,才更新时间戳、执行经验写入逻辑
- 该方案不需要调用消息拉取接口,响应速度更快,是等级类系统的通用实现。
内容的提问来源于stack exchange,提问作者IDcLuc
相关产品推荐
相关产品推荐

