Discord.JS 如何监听匹配作者指定的特定用户提及以实现用户信息查询命令
Discord.js 用户标签查询指令匹配逻辑修正
核心故障原因
message.mentions.members.first()返回Discord.js封装的GuildMember类实例对象,不是字符串格式的用户ID,直接拿对象和<@xxx>提及字符串、纯数字ID字符串做全等比较,永远无法匹配成功- 原代码条件判断逻辑混乱、存在语法错误,只要第一个判断不满足就直接中断逻辑,根本走不到响应分支
- 目前硬编码单个用户的响应内容,没有设计多用户标签的存储结构,无法支持全服务器成员查询
原代码问题明细
- 比对逻辑错误:错把GuildMember实例直接当字符串比对,正确的取数方式是读取实例的
id属性(纯数字字符串格式的Discord用户ID)做匹配 - 流程逻辑错误:
if (member !== '<@772597378142306354>')return;会在匹配失败时直接中断执行,根本不会进入后续的用户标签返回分支 - 语法错误:原代码中
else if判断后直接写return又接独立代码块,语法不合法
可直接运行的修正代码
首先定义存储全服成员游戏标签的映射结构(后续可替换为本地json文件、数据库存储),修正匹配逻辑:
// 存储用户Activision标签的映射表:key为Discord用户ID,value为对应平台标签 const activisionTagMap = { "772597378142306354": "WalterWhite#2396124", // 可继续在此处补充其他用户的ID与对应标签 } module.exports = { name: 'codtag', execute(message, args) { // 获取消息中第一个被提及的服务器成员 const mentionedMember = message.mentions.members?.first() // 无参数/未提及用户时返回错误提示 if (!args.length || !mentionedMember) { return message.channel.send({ embed: { color: '#da1801', title: 'Activision Gamertag: Error', description: 'You need to tag a user dummy.' } }) } // 取被提及用户的纯ID去映射表查询 const targetUserId = mentionedMember.id const recordedTag = activisionTagMap[targetUserId] // 未录入对应用户标签时返回提示 if (!recordedTag) { return message.channel.send({ embed: { color: '#ffaa00', title: 'Activision Gamertag: Not Found', description: `No Activision tag recorded for <@${targetUserId}>` } }) } // 查询成功返回对应标签 return message.channel.send({ embed: { color: '#1243c6', title: 'Activision Gamertag', description: `Here is <@${targetUserId}>'s Activision tag: \n\n **${recordedTag}**` } }) } }
扩展说明
- 若要实现PSN标签查询功能,只需新增
psnTagMap映射表,复用上述代码逻辑即可快速生成psn指令 - 如需支持用户自主录入标签,可将硬编码的映射表替换为本地json文件或轻量数据库存储,避免每次更新标签都要重启机器人
内容的提问来源于stack exchange,提问作者Diego
相关产品推荐
相关产品推荐

