Discord.py问题:如何让无ban_members权限用户看不到Slash Ban命令
解决Discord.py Hybrid命令隐藏无权限用户的问题
问题根源
你使用的@commands.has_permissions(ban_members=True)仅限制前缀命令的执行权限,对Slash命令(应用命令)的可见性无影响。要让无ban_members权限的用户看不到该Slash命令,需使用Discord.py针对应用命令的权限控制装饰器。
解决方案
添加@discord.app_commands.default_permissions(ban_members=True)装饰器,该装饰器会告知Discord:仅拥有对应权限的用户才能看到此Slash命令。同时保留原有装饰器以限制前缀命令的执行权限。
修改后的完整代码:
#cogs / admin/ ban.py from discord.ext import commands import discord, typing class banUser(commands.Cog): def __init__(self, client): self.client = client @commands.hybrid_command() @commands.has_permissions(ban_members=True) # 限制前缀命令的执行权限 @discord.app_commands.default_permissions(ban_members=True) # 设置Slash命令的可见权限 @commands.cooldown(1, 10, commands.BucketType.user) async def ban_user(self, ctx, member: discord.Member, reason: typing.Optional[str]): """ Ban certain members from your server. """ await member.ban(reason = reason) await ctx.reply(f"{member} has been successfully banned from the server.", ephemeral=True) em = discord.Embed(color=discord.Color.from_rgb(0,0,255),title=f"**{member} has been banned from the server**.",description=f"{member} has been banned from the server for {reason}.") await ctx.send(embed=em) async def setup(client): await client.add_cog(banUser(client))
补充说明
- 装饰器顺序:
@discord.app_commands.default_permissions需放在@commands.hybrid_command之后,确保正确作用于Slash命令模块。 - 服务器权限覆盖:服务器管理员可在Discord后台「整合」页面,针对该命令自定义权限规则,此规则会覆盖代码中的默认权限设置。
- 细粒度权限:若需针对特定角色或复杂逻辑限制,可使用
@discord.app_commands.checks.has_role(角色ID/名称)或自定义检查函数,但这类方式仅限制命令执行而非隐藏,若要隐藏仍需配合default_permissions。
内容的提问来源于stack exchange,提问作者Ruler
相关产品推荐
相关产品推荐

