如何在pycord中禁止无对应权限的用户使用服务器斜杠命令
Pycord斜杠指令权限限制方案
你代码中@slash_command.has_permissions的写法不属于Pycord支持的语法,Pycord有两种成熟的权限限制方案可选:
方案1:运行时权限校验(和原discord.py逻辑一致)
这种方案用户可以看到指令,但调用时会校验权限,校验不通过直接拦截,和你原来的使用习惯完全匹配。
直接复用discord.py的commands.has_permissions装饰器即可,注意两点:
- 装饰器顺序:权限装饰器要放在
@slash_command下方 - 斜杠指令不需要用
*标记可变参数,直接声明参数即可,ctx.reply建议替换为ctx.respond适配斜杠指令的响应逻辑
修正后代码示例:
from discord.ext import commands # 修正后代码 @slash_command(name = "ban") @commands.has_permissions(ban_members = True) async def ban_command(self, ctx, user_name : discord.Member, reason = None): if await Permission.check_permission(ctx, 1): return None await user_name.ban(reason = reason) if reason != None: await ctx.respond(str(user_name) + "님이 차단되셨습니다." + "\n이유 : " + str(reason), mention_author = False) else: await ctx.respond(str(user_name) + "님이 차단되셨습니다.", mention_author = False)
如果需要自定义权限不足的提示,可以为指令添加错误处理回调,使用ephemeral=True参数可以让提示仅对调用者可见,不会公屏刷屏:
@ban_command.error async def ban_command_error(self, ctx, error): if isinstance(error, commands.MissingPermissions): await ctx.respond("你没有封禁成员的权限,无法使用该指令", ephemeral=True)
方案2:Discord端前置权限校验(体验更优)
这种方案会直接把权限规则注册到Discord接口,没有对应权限的用户在服务器的指令列表里根本看不到这个指令,不需要调用后再拦截。
使用Pycord提供的default_permissions装饰器即可:
from discord.commands import default_permissions # 修正后代码 @slash_command(name = "ban") @default_permissions(ban_members = True) async def ban_command(self, ctx, user_name : discord.Member, reason = None): if await Permission.check_permission(ctx, 1): return None await user_name.ban(reason = reason) if reason != None: await ctx.respond(str(user_name) + "님이 차단되셨습니다." + "\n이유 : " + str(reason), mention_author = False) else: await ctx.respond(str(user_name) + "님이 차단되셨습니다.", mention_author = False)
内容的提问来源于stack exchange,提问作者KOI3125
相关产品推荐
相关产品推荐

