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
相关产品推荐
相关产品推荐

