User select menus allow users to select one or more Discord users from the server. They’re useful for tagging users, assigning roles, or creating user-based interactions.
Unlike string select menus that require predefined options, user select menus dynamically show all users in the server. Users can be selected directly from Discord’s user picker.
User select menus in djs-core are created using the UserSelectMenu class. Each select menu component file in src/components/selects/user/ is automatically registered.
Use user select menus when you need users to select actual Discord users, like tagging people, assigning permissions, or choosing team members. For static options, use string select menus instead.
import { UserSelectMenu } from "@djs-core/runtime";
export default new UserSelectMenu()
.setPlaceholder("Select a user")
.run(async (interaction) => {
const selectedUser = interaction.users.first();
if (selectedUser) {
await interaction.reply(`You selected: ${selectedUser.username}`);
}
});
Multiple User Selection
User select menus can allow users to select multiple users:
import { UserSelectMenu } from "@djs-core/runtime";
export default new UserSelectMenu()
.setPlaceholder("Select users")
.setMinValues(1)
.setMaxValues(5)
.run(async (interaction) => {
const selectedUsers = interaction.users.map((user) => user.username);
await interaction.reply(`Selected users: ${selectedUsers.join(", ")}`);
});
Accessing Selected Users
The interaction.users collection contains all selected users. Here’s what’s available:
Collection of all selected User objects - Use .first(), .map(), .forEach(), etc.
Collection of GuildMember objects (only available in guilds) - Contains server-specific member data
Check if the interaction happened in a server (not DMs) - Returns boolean
User select menus can receive custom data using .setData().
Component Definition
[src/components/selects/user/assign.ts]
import { UserSelectMenu } from "@djs-core/runtime";
export default new UserSelectMenu<{ action: string }>()
.setPlaceholder("Select users to assign")
.run(async (interaction, data) => {
const users = interaction.users.map((u) => u.username);
await interaction.reply(
`Performing ${data.action} for: ${users.join(", ")}`,
);
});
assignSelect.setData({ action: "assign_role" })