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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 00:48:31