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

如何在discord.py中限制特定角色使用指定命令

在discord.py中禁止特定角色使用命令的实现方法

下面提供几种实用的实现方式,均基于discord.py核心机制完成:

方法一:自定义Check装饰器(推荐)

这种方式符合discord.py的设计规范,把权限检查逻辑封装成可复用的装饰器,适用于多个命令。

首先定义检查函数,判断用户是否持有被禁止的角色:

from discord.ext import commands

def forbid_role(*role_ids):
    def predicate(ctx):
        # 反向判断:用户不包含任何传入的禁止角色ID时返回True(允许执行命令)
        return not any(role.id in role_ids for role in ctx.author.roles)
    return commands.check(predicate)

用该装饰器修饰需要限制的命令,传入目标禁止角色ID即可:

@bot.command(name="restricted_cmd")
@forbid_role(123456789012345678, 987654321098765432)  # 替换为实际禁止角色ID
async def restricted_command(ctx):
    await ctx.send("这个命令仅对未被禁止的角色开放!")

方法二:命令内直接判断

如果仅单个命令需要限制,可直接在命令逻辑中做检查,省去装饰器定义:

@bot.command(name="restricted_cmd")
async def restricted_command(ctx):
    # 定义禁止的角色ID集合
    forbidden_role_ids = {123456789012345678, 987654321098765432}
    
    # 检查用户是否持有禁止角色
    if any(role.id in forbidden_role_ids for role in ctx.author.roles):
        await ctx.send("你被禁止使用这个命令!")
        return
    
    # 命令的正常执行逻辑
    await ctx.send("命令执行完成!")

补充:用角色名称判断(不推荐)

若暂时无法获取角色ID,可使用角色名称判断,但需注意角色名称可能重复,稳定性不如ID:

def forbid_role_name(*role_names):
    def predicate(ctx):
        return not any(role.name in role_names for role in ctx.author.roles)
    return commands.check(predicate)

@bot.command(name="restricted_cmd")
@forbid_role_name("黑名单成员", "临时禁言用户")
async def restricted_command(ctx):
    await ctx.send("只有未被禁止的角色能使用此命令!")

错误提示优化

使用装饰器时,用户被禁止会触发CheckFailure异常,可通过全局或局部处理给出友好提示:

全局异常处理

@bot.event
async def on_command_error(ctx, error):
    if isinstance(error, commands.CheckFailure):
        await ctx.send("抱歉,你没有权限执行这个命令!")
    # 保留其他错误的默认处理
    else:
        raise error

命令局部异常处理

@restricted_command.error
async def restricted_cmd_error(ctx, error):
    if isinstance(error, commands.CheckFailure):
        await ctx.send("你被禁止使用这个命令,请联系管理员!")

内容的提问来源于stack exchange,提问作者S_cripted

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 13:10:28