You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 17:40:58