discord.py中如何判断成员角色等级高于等于消息发送者,解决ban指令失效问题
问题排查与修复
核心故障原因
你代码中member参数的类型声明错误:你使用了discord.User类型,该类型是Discord全局用户对象,不包含任何服务器内的角色属性,只有服务器成员对象discord.Member才具备top_role属性,这直接导致角色校验逻辑完全失效,后续封禁流程也无法正常触发。
隐藏问题补充
除此之外你的代码还缺失两个必要校验、一个异常处理:
- 未校验机器人自身是否有封禁成员的权限
- 未校验目标成员的角色等级是否高于机器人,Discord规定机器人无法封禁角色比自己高的用户
- 给被封禁用户发私信的逻辑没有异常捕获,若用户关闭了陌生人私信,会触发异常导致代码中断
修复后代码
import discord import datetime from discord.ext import commands async def ban (ctx, member:discord.Member=None, *, reason=None): channel = ctx.channel # 校验入参合法性 if member == None or member == ctx.message.author: embed = discord.Embed(title="封禁", description=f"从服务器中封禁指定成员", colour=discord.Colour.purple()) await ctx.send(embed=embed) return # 校验命令调用者的权限 if not ctx.author.guild_permissions.ban_members: embed4=discord.Embed(color=discord.Colour.purple(), timestamp=datetime.datetime.utcnow(), title="权限不足!", description="你没有使用封禁命令的权限") await ctx.send(embed=embed4) return # 生成默认封禁理由 if reason == None: reason = "违反服务器规则" # 校验调用者与目标成员的角色等级 if member.top_role >= ctx.author.top_role: embed3=discord.Embed(color=discord.Colour.purple(), title="角色等级不足", description="你无法封禁角色等级高于或等于你的用户") await channel.send(embed=embed3) return # 校验机器人自身的封禁权限 if not ctx.guild.me.guild_permissions.ban_members: embed5=discord.Embed(color=discord.Colour.purple(), timestamp=datetime.datetime.utcnow(), title="机器人权限不足!", description="我没有封禁成员的权限,请调整我的角色权限配置") await ctx.send(embed=embed5) return # 校验机器人与目标成员的角色等级 if member.top_role >= ctx.guild.me.top_role: embed6=discord.Embed(color=discord.Colour.purple(), title="角色等级不足", description="该用户角色等级高于我,我无法执行封禁操作") await channel.send(embed=embed6) return # 执行封禁操作 await ctx.guild.ban(member, reason=reason) embed = discord.Embed(title="封禁成功", description=f" {member.mention} 已被 {ctx.author.mention} 封禁", colour=discord.Colour.purple()) await ctx.send(embed=embed) # 私信通知被封禁用户,增加异常捕获避免报错 try: message = f"你已被移出 {ctx.guild.name} 服务器,封禁理由:{reason}" await member.send(message) except: pass
关键修改点说明
- 将
member参数的类型从discord.User调整为discord.Member,正确获取用户在服务器内的角色信息 - 新增机器人侧的权限、角色等级校验逻辑,避免因机器人权限不足导致执行失败
- 对私信逻辑增加异常捕获,避免因用户关闭陌生人私信触发代码报错
- 所有Embed提示内容调整为中文,符合使用需求
内容的提问来源于stack exchange,提问作者uptighte
相关产品推荐
相关产品推荐

