Discord.py如何检测成员是否持有指定角色?现有代码始终返回无权限如何解决
问题诊断
你的代码核心错误是命令回调的参数接收不符合discord.py的规则:所有命令的第一个参数固定为上下文对象ctx,你当前将这个参数命名为author,直接拿上下文对象和角色成员列表里的成员对象做比对,不同类型的对象永远不会匹配,所以始终返回无权限提示。
修复后的实现代码
@client.command(aliases = ['4v4 ping']) async def ping4v4(ctx): channel = client.get_channel(870969338679660591) target_role_id = 870969337958240260 # 自动获取触发指令的成员,无需用户主动@自己 trigger_member = ctx.author # 角色检测有两种可用写法,选一种即可 # 写法1:直接遍历成员角色校验ID,性能更高,无空对象报错风险 has_role = any(role.id == target_role_id for role in trigger_member.roles) # 写法2:和你原逻辑对齐,先获取角色对象再校验 # guild = client.get_guild(870969337945669722) # target_role = guild.get_role(target_role_id) # has_role = target_role in trigger_member.roles if has_role: await channel.send(" 4v4 ping hehe ") else: await channel.send(" You don't have perms! ")
补充说明
- 旧版discord.py需要加的
pass_context=True参数在v1.0+版本中已经默认开启,无需额外声明 - 如果你使用的是discord.py v2.0+版本,需要确保你已经在开发者后台开启了
members权限intent,且代码中已经注册该intent,否则可能出现角色读取失败的问题
内容的提问来源于stack exchange,提问作者RiverFlows73
相关产品推荐
相关产品推荐

