如何编写Discord.js@特定用户时警告触发者的代码 现有代码无法运行
问题排查与修复方案
现有代码问题
- 匹配逻辑存在缺陷:全等判断仅能匹配整条消息内容刚好为@指定用户的场景,只要消息存在其他内容就无法触发,同时没有兼容昵称提及的
<@!用户ID>格式,匹配覆盖率极低 - 未过滤机器人自身消息:没有排除机器人发送的内容,可能触发死循环
- 缺少必要网关权限:Discord.js v13及以上版本需要主动在开发者后台开启
Message Content特权意图,同时初始化客户端时注册对应意图,否则无法接收messageCreate事件、也无法获取消息内容 - 硬编码逻辑灵活性差:直接写死用户ID和用户名,容易出现ID匹配错误,也无法适配多目标检测等场景
实现前置准备
登录Discord开发者平台,进入对应机器人应用的「Bot」设置页,在「Privileged Gateway Intents」板块开启
Message Content Intent开关,否则消息读取相关功能会失效。
修正后代码
const Client = require("./Structures/Client.js"); const config = require("./Data/config.json"); // 填入需要被检测的目标用户ID,支持填入多个 const TARGET_USER_IDS = ["替换为USER2的真实用户ID"]; const client = new Client({ // 若你自行封装的Client支持传参,需在此处注册必要意图 intents: [ "Guilds", "GuildMessages", "MessageContent" ] }); client.on("messageCreate", message => { // 过滤所有机器人发送的消息 if (message.author.bot) return; // 检测消息中是否提及了目标用户 const isMentionTarget = message.mentions.users.some(user => TARGET_USER_IDS.includes(user.id)); if (isMentionTarget) { // 警告发起提及的用户,可根据需求修改提示内容 message.reply(`警告:${message.author.tag} 禁止提及指定用户`); // 可在此处追加删除消息、临时禁言等额外操作 } }); client.start(config.token);
补充说明
如果仅需要检测单个目标用户,可简化判断逻辑,直接调用message.mentions.users.has('目标用户ID')即可,无需遍历数组。
不要手动匹配消息内容字符串判断提及,使用Discord.js封装的message.mentions属性可以自动兼容各类提及格式,不会出现匹配误差。
内容的提问来源于stack exchange,提问作者Rey
相关产品推荐
相关产品推荐

