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

如何配置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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 01:40:25