如何配置Discord斜杠命令仅允许管理员或指定角色使用?
解决Discord斜杠命令权限控制问题
你之前用的@commands.has_any_roles()是针对前缀命令(即@bot.command()注册的命令)的装饰器,不适用于斜杠命令(@bot.tree.command()注册的命令)。要实现管理员或指定角色才能使用斜杠命令,需要用App Command系统的检查机制,以下是两种可行方案:
方案一:使用内联lambda检查器
直接通过@app_commands.check()装饰器传入lambda表达式,同时检查管理员权限和指定角色:
import discord from discord import app_commands # 替换为你的服务器ID和允许的角色ID SERVER_ID = 你的服务器ID ALLOWED_ROLE_IDS = {角色ID1, 角色ID2, 角色ID3} @bot.tree.command(name="addrole", description="Rangadás", guild=discord.Object(id=SERVER_ID)) @app_commands.check(lambda i: i.user.guild_permissions.administrator or any(role.id in ALLOWED_ROLE_IDS for role in i.user.roles)) async def addrole(interaction: discord.Interaction, member: discord.Member, role: discord.Role): await member.add_roles(role) await interaction.response.send_message(f"{member.mention}-ra ráadva: `{role.name}`!")
方案二:自定义检查函数(更易维护)
如果需要复用权限逻辑或追求更清晰的代码结构,可以封装成自定义检查函数:
import discord from discord import app_commands def has_required_access(): def predicate(interaction: discord.Interaction) -> bool: # 优先检查管理员权限 if interaction.user.guild_permissions.administrator: return True # 检查是否拥有指定角色之一 allowed_role_ids = {角色ID1, 角色ID2, 角色ID3} return any(role.id in allowed_role_ids for role in interaction.user.roles) return app_commands.check(predicate) # 应用命令和检查器 @bot.tree.command(name="addrole", description="Rangadás", guild=discord.Object(id=你的服务器ID)) @has_required_access() async def addrole(interaction: discord.Interaction, member: discord.Member, role: discord.Role): await member.add_roles(role) await interaction.response.send_message(f"{member.mention}-ra ráadva: `{role.name}`!")
可选:添加权限不足提示
可以给命令绑定错误处理器,当用户无权限时返回仅自己可见的友好提示:
@addrole.error async def addrole_error(interaction: discord.Interaction, error: app_commands.AppCommandError): if isinstance(error, app_commands.CheckFailure): await interaction.response.send_message("你没有使用该命令的权限!", ephemeral=True)
内容的提问来源于stack exchange,提问作者matethelol
相关产品推荐
相关产品推荐

