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

Discord bot如何区分消息内主动@与回复触发的用户提及

Discord bot 显式@触发的规范解决方案

原有写法的问题

  • 第一种写法if (message.mentions.has(bot.users.cache.get(userID)))误触发的原因是:Discord 默认会将回复消息的被回复用户自动加入 mentions 集合,哪怕正文没有主动@对方,所以会命中判断逻辑。
  • 第二种临时写法if (message.content.includes(userID))存在严重误判风险:如果普通聊天文本中恰好出现了目标用户的ID字符串,没有任何@操作也会触发响应,逻辑严谨性不足。

推荐规范方案

适配 Discord.js v13 及以上版本

官方API直接提供了忽略回复隐式@的配置参数,一行即可实现需求,准确率最高:

const targetUser = bot.users.cache.get(userID)
// 加入ignoreRepliedUser配置,排除回复带来的隐式@
if (targetUser && message.mentions.has(targetUser, { ignoreRepliedUser: true })) {
  // 你的消息推送逻辑
}

这个方案完全基于官方原生能力实现,只会匹配正文主动输入的@,不会出现普通ID字符串匹配的误判问题。

适配 Discord.js v13 以下旧版本

如果使用的是不支持ignoreRepliedUser配置的旧版本,可以手动排除回复场景的误判:

const targetUser = bot.users.cache.get(userID)
if (targetUser 
  && message.mentions.has(targetUser)
  // 排除「仅回复目标用户、正文未@」的场景
  && (!message.reference || message.mentions.repliedUser?.id !== userID)
) {
  // 你的消息推送逻辑
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 14:57:01