如何在discord.js中制作服务器用户选择菜单(Nekotina样式)
实现Discord服务器用户选择菜单(集成到UserInfo命令)
核心方案:使用Discord的User Select Menu组件
常规ActionRow是组件容器,你需要在其中嵌入User Select Menu组件——这正是Nekotina这类机器人实现用户选择的核心方式,它原生支持服务器内用户筛选、搜索功能,样式完全匹配你想要的效果。
代码示例(以Discord.js v14为例)
const { SlashCommandBuilder, ActionRowBuilder, UserSelectMenuBuilder, EmbedBuilder } = require('discord.js'); module.exports = { data: new SlashCommandBuilder() .setName('userinfo') .setDescription('查看服务器用户信息'), async execute(interaction) { // 构建用户选择菜单 const userSelectMenu = new UserSelectMenuBuilder() .setCustomId('userinfo_select_target') .setPlaceholder('选择要查看的用户') .setMinValues(1) .setMaxValues(1); // 限制单次选择1个用户 // 将菜单放入ActionRow容器 const actionRow = new ActionRowBuilder().addComponents(userSelectMenu); // 发送初始交互消息 await interaction.reply({ content: '请选择目标用户:', components: [actionRow], ephemeral: true // 可选:仅发起命令的用户可见 }); // 监听菜单交互事件 const filter = i => i.customId === 'userinfo_select_target' && i.user.id === interaction.user.id; const collector = interaction.channel.createMessageComponentCollector({ filter, time: 60000 }); collector.on('collect', async i => { const selectedUserId = i.values[0]; const targetUser = await interaction.guild.members.fetch(selectedUserId); // 构建用户信息Embed const infoEmbed = new EmbedBuilder() .setTitle(`${targetUser.user.tag} 的详细信息`) .setThumbnail(targetUser.user.displayAvatarURL({ size: 256 })) .addFields( { name: '用户ID', value: targetUser.user.id, inline: true }, { name: '加入服务器时间', value: targetUser.joinedAt.toLocaleString(), inline: true }, { name: '账号创建时间', value: targetUser.user.createdAt.toLocaleString(), inline: true }, { name: '最高角色', value: targetUser.roles.highest.name, inline: true } ) .setColor('#2f3136'); // 更新消息展示用户信息,移除选择菜单 await i.update({ content: '', embeds: [infoEmbed], components: [] }); }); collector.on('end', collected => { if (collected.size === 0) { interaction.editReply({ content: '选择超时,请重新执行命令。', components: [] }); } }); }, };
关键细节说明
- UserSelectMenuBuilder:Discord原生组件,自带用户搜索、服务器成员筛选功能,样式与你参考的Nekotina机器人完全一致,无需自行实现复杂的用户检索逻辑。
- 交互权限控制:通过
filter确保只有发起命令的用户能操作菜单,避免无关人员干扰。 - 样式适配:该组件的样式是Discord官方统一的下拉选择菜单,无法自定义CSS(Discord组件不支持),但完全符合主流机器人的交互样式标准。
扩展优化点
- 若需要支持多选用户,修改
setMinValues和setMaxValues的数值即可。 - 要限制选择特定角色的用户,可在
collect事件中添加角色校验:
if (!targetUser.roles.cache.has('目标角色ID')) { return i.reply({ content: '仅能选择指定角色的用户!', ephemeral: true }); }
内容的提问来源于stack exchange,提问作者Roycy Eduardo
相关产品推荐
相关产品推荐

