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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 04:48:03