Discord.py斜杠命令踢人权限校验失效问题求助
问题原因与解决方案
为什么权限校验失效?
@commands.has_permissions(kick_members=True) 是Discord.py针对传统前缀命令设计的权限校验装饰器,完全不适用于斜杠命令(@client.tree.command 注册的应用命令)。两类命令分属不同系统,传统命令的权限装饰器无法对斜杠命令生效,因此才会出现任何人都能执行踢人操作的情况。
正确的权限校验方法
针对斜杠命令,有两种常用的权限校验方式:
方式1:使用app_commands内置的权限检查装饰器
直接使用discord.app_commands.checks.has_permissions装饰器,这是专门为应用命令设计的权限校验工具:
@client.tree.command(description = "kick a user") @app_commands.describe(member = "who am i kicking", reason = "why am i kicking them") @app_commands.checks.has_permissions(kick_members=True) async def kick(interaction: discord.Interaction, member : discord.Member, reason: str=None): await member.kick(reason=reason) await interaction.response.send_message(f'Kicked {member.mention} for {reason}', ephemeral=True)
方式2:在命令内部手动校验权限
如果需要自定义无权限提示等灵活逻辑,可以在函数内直接检查用户的服务器权限:
@client.tree.command(description = "kick a user") @app_commands.describe(member = "who am i kicking", reason = "why am i kicking them") async def kick(interaction: discord.Interaction, member : discord.Member, reason: str=None): # 检查执行命令的用户是否有踢人权限 if not interaction.user.guild_permissions.kick_members: await interaction.response.send_message("你没有执行踢人操作的权限!", ephemeral=True) return await member.kick(reason=reason) await interaction.response.send_message(f'Kicked {member.mention} for {reason}', ephemeral=True)
内容的提问来源于stack exchange,提问作者IndigoFire
相关产品推荐
相关产品推荐

