Discord机器人userinfo命令获取提及用户最高角色异常问题
解决Discord.js中
user.highestRole显示自身角色的问题 嘿,我看你在写userinfo命令的时候踩了个小坑——当提及其他用户执行命令时,Embed里的最高角色字段居然显示的是你自己的角色,而不是被提及用户的。这问题我之前帮人排查过,给你说说原因和解决办法!
问题根源
你现在用的user是从message.mentions.users.first()拿到的用户对象(User),但highestRole这个属性是属于**服务器成员对象(GuildMember)**的!用户对象只包含用户的全局信息(比如用户名、头像),没有服务器专属的角色数据,所以当你调用user.highestRole时,代码其实是在当前会话的上下文里 fallback 到了你自己的成员信息,自然就显示你的角色了。
解决办法
我们需要拿到用户对应的服务器成员对象,而不是单纯的用户对象:
替换获取对象的方式
直接获取提及的成员,而不是用户:let member = message.mentions.members.first() || message.member;这里
message.member就是你自己的成员对象,作为默认值。修改Embed中的字段调用
把原来的user.highestRole换成member.highestRole,同时其他和用户信息相关的字段可以通过member.user来访问(比如member.user.tag、member.user.username)。
修正后的完整代码示例
if(cmd === `${prefix}user`){ // 优先获取提及的成员,没有的话用命令发送者的成员对象 let member = message.mentions.members.first() || message.member; let userInfo = new Discord.RichEmbed() .setAuthor(member.user.tag, member.user.avatarURL) .setThumbnail(member.user.displayAvatarURL) .setFooter("Informacje Użytkownika") .setTimestamp() .setColor("#1d1dbb") .addField("Nick:", member.user.username) // 现在能正确显示被提及用户的最高角色了 .addField("Najwyższa ranga:", member.highestRole); message.channel.send(userInfo); }
小补充
- 如果不想显示角色的提及格式(带@的那种),只想显示角色名称,可以改成
member.highestRole.name - 记得确保你的机器人有读取服务器成员的权限,不然可能获取不到
GuildMember对象 - 如果命令可能在DM里被调用,最好加个判断:
if(!message.guild) return message.reply("这个命令只能在服务器里使用哦!"),避免因为message.guild为null导致报错。
内容的提问来源于stack exchange,提问作者Tony Sorbet
相关产品推荐
相关产品推荐

