如何通过Slash Commands(斜杠命令)在DiscordJS中实现角色发放功能?
实现Discord斜杠命令角色发放功能
前置条件
- 机器人需拥有「管理角色」服务器权限
- 机器人的角色位置必须高于要发放的目标角色(否则无法为用户添加该角色)
- 在Discord开发者门户开启「服务器成员意图」(Member Intent)
代码实现
使用discord.py v2.x
import discord from discord import app_commands # 配置意图 intents = discord.Intents.default() intents.members = True client = discord.Client(intents=intents) tree = app_commands.CommandTree(client) # 定义斜杠命令 @tree.command(name="give_role", description="为指定用户授予角色") @app_commands.describe(user="要授予角色的用户", role="要发放的角色") @app_commands.default_permissions(manage_roles=True) # 仅允许有管理角色权限的用户使用 async def give_role(interaction: discord.Interaction, user: discord.Member, role: discord.Role): # 权限检查:机器人是否能管理角色 if not interaction.guild.me.guild_permissions.manage_roles: await interaction.response.send_message("我没有管理角色的权限!", ephemeral=True) return # 角色层级检查 if role.position >= interaction.guild.me.top_role.position: await interaction.response.send_message("我的角色等级低于目标角色,无法执行操作!", ephemeral=True) return # 执行角色添加 await user.add_roles(role) await interaction.response.send_message(f"已成功为 {user.mention} 授予 {role.mention} 角色", ephemeral=True) # 机器人启动后同步命令 @client.event async def on_ready(): await tree.sync() print(f"已登录为 {client.user}") client.run("你的机器人Token")
使用discord.js v14+
const { Client, GatewayIntentBits, SlashCommandBuilder, PermissionsBitField } = require('discord.js'); const client = new Client({ intents: [ GatewayIntentBits.Guilds, GatewayIntentBits.GuildMembers // 开启成员意图 ] }); // 注册斜杠命令 client.on('ready', async () => { console.log(`已登录为 ${client.user.tag}`); await client.application.commands.create( new SlashCommandBuilder() .setName('give_role') .setDescription('为指定用户授予角色') .addUserOption(option => option.setName('user') .setDescription('要授予角色的用户') .setRequired(true)) .addRoleOption(option => option.setName('role') .setDescription('要发放的角色') .setRequired(true)) .setDefaultMemberPermissions(PermissionsBitField.Flags.ManageRoles) // 权限限制 ); }); // 处理命令交互 client.on('interactionCreate', async interaction => { if (!interaction.isChatInputCommand()) return; if (interaction.commandName === 'give_role') { const user = interaction.options.getUser('user'); const member = interaction.guild.members.cache.get(user.id); const role = interaction.options.getRole('role'); // 机器人权限检查 if (!interaction.guild.members.me.permissions.has(PermissionsBitField.Flags.ManageRoles)) { return interaction.reply({ content: '我没有管理角色的权限!', ephemeral: true }); } // 角色层级检查 if (role.position >= interaction.guild.members.me.roles.highest.position) { return interaction.reply({ content: '我的角色等级低于目标角色,无法执行操作!', ephemeral: true }); } // 添加角色 await member.roles.add(role); await interaction.reply({ content: `已成功为 ${user} 授予 ${role} 角色`, ephemeral: true }); } }); client.login('你的机器人Token');
关键注意事项
- 斜杠命令同步后可能需要1-5分钟才能在服务器中显示
- 如果需要让所有用户都能使用命令,移除代码中的
default_permissions相关配置 - 若遇到「无法获取成员」的错误,检查是否已正确开启成员意图并重新邀请机器人到服务器
内容的提问来源于stack exchange,提问作者TheDEVIX
相关产品推荐
相关产品推荐

