Discord机器人mute命令错误禁言管理员 如何修复对应代码?
解决方法
你需要在执行禁言操作前新增目标用户的权限校验逻辑,避免对持有管理员/Moderator权限的用户执行禁言操作,修改后的代码如下:
@bot.command(aliases=['m']) @commands.has_permissions(kick_members=True) async def mute(ctx, member: discord.Member): # 校验被操作成员是否为管理员/Moderator if member.guild_permissions.kick_members or member.guild_permissions.administrator: embed = discord.Embed(title="操作失败", description=f"无法对管理员/Moderator {member.mention} 执行禁言操作", color=0xff0000) await ctx.send(embed=embed) return muted_role = ctx.guild.get_role(900024798585954325) # 额外补充禁言角色不存在的校验 if not muted_role: embed = discord.Embed(title="操作失败", description="未找到禁言角色,请联系机器人开发者检查配置", color=0xff0000) await ctx.send(embed=embed) return await member.add_roles(muted_role) embed = discord.Embed(title="用户已禁言", description=f"{member.mention} 已被成功禁言", color=0x00ff00) await ctx.send(embed=embed)
修改说明
- 新增了目标用户权限校验逻辑:如果被@的用户拥有
kick_members(踢人权限,和你给指令触发者设置的权限一致)或者administrator(服务器最高管理员权限),就直接终止操作并返回错误提示,符合你不允许禁言Moderator的需求 - 补充了禁言角色不存在的边界情况处理,避免代码抛出未捕获异常
可选调整:如果你服务器的Moderator是通过特定角色标识,而非全局权限判断的,可以将上述权限校验代码替换为如下逻辑,替换其中的
MODERATOR_ROLE_ID为你服务器的Moderator角色ID即可:moderator_role = ctx.guild.get_role(MODERATOR_ROLE_ID) if moderator_role in member.roles: embed = discord.Embed(title="操作失败", description=f"无法对管理员/Moderator {member.mention} 执行禁言操作", color=0xff0000) await ctx.send(embed=embed) return
内容的提问来源于stack exchange,提问作者Soumyajoy Das
相关产品推荐
相关产品推荐

