如何在Discord.js用户信息命令中获取用户角色?
解决Discord.js用户信息命令中获取角色的问题
你遇到的核心问题是:用getUser()获取的是全局User对象,这个对象不包含服务器(Guild)内的角色数据。角色是和具体服务器绑定的,必须通过GuildMember对象才能获取。
修改步骤:
- 替换获取用户的方式:把
interaction.options.getUser('target')改成interaction.options.getMember('target'),拿到绑定当前服务器的GuildMember实例。 - 传递GuildMember到嵌入构建函数:调用
createEmbed时把获取到的成员对象传进去。 - 提取并格式化角色列表:通过GuildMember的
roles.cache属性获取角色集合,排序后转成可显示的字符串。
修改后的完整代码:
const { SlashCommandBuilder } = require('discord.js'); module.exports = { data: new SlashCommandBuilder() .setName('user') .setDescription('Display info about a selected user') .addUserOption(option => option.setName('target').setDescription('The user\'s information to show')), async execute(interaction) { // 获取绑定当前服务器的成员对象(GuildMember),如果没选目标则用命令发起者 const member = interaction.options.getMember('target') || interaction.member; if (member) { createEmbed(interaction, member); } }, }; function createEmbed(interaction, member) { // 处理角色:按权限位置从高到低排序,转成提及格式,可自行添加filter排除@everyone const rolesList = member.roles.cache .sort((a, b) => b.position - a.position) .map(role => role.toString()) .join('\n') || '无自定义角色'; const embed = { title: `${member.user.tag} 的用户信息`, thumbnail: { url: member.user.displayAvatarURL() }, fields: [ { name: '用户名', value: member.user.username, inline: true }, { name: '服务器昵称', value: member.nickname || '无昵称', inline: true }, { name: '加入服务器时间', value: member.joinedAt?.toLocaleString() || '未知', inline: true }, { name: '角色', value: rolesList, inline: false } ], timestamp: new Date(), color: member.displayHexColor || 0xffffff }; interaction.reply({ embeds: [embed] }); }
关键说明:
- GuildMember vs User:User是全局用户数据,GuildMember是用户在特定服务器内的实例,包含角色、昵称、加入时间等服务器相关信息。
- 角色排序:用
b.position - a.position让高权限角色排在前面,和Discord原生的角色显示逻辑一致。 - 角色提及:
role.toString()会自动转成角色的@提及格式(如<@&123456>),发送后Discord会渲染成可点击的角色链接。 - 边界处理:如果用户只有默认的@everyone角色,会显示“无自定义角色”,你可以根据需求调整提示内容。
内容的提问来源于stack exchange,提问作者Shambu Kumar
相关产品推荐
相关产品推荐

