discord.py如何实现允许持有多个指定角色中任一的用户触发命令
问题原因
@commands.has_role 装饰器本身仅支持传入单个角色参数,你写的 "Lab Demonstrator" OR "Staff" 是Python的逻辑运算,最终只会返回第一个非空值也就是 "Lab Demonstrator",本质还是只校验单个角色,自然达不到效果。
解决方案
方案1:使用内置的多角色校验装饰器
discord.py 已经提供了原生支持多角色校验的装饰器has_any_role,直接把需要校验的所有角色名作为参数传入即可,只要用户持有任意一个符合要求的角色就能通过校验:
@commands.has_any_role("Lab Demonstrator", "Staff", "teacher")
如果想要更高的稳定性,避免服务器修改角色名导致校验失效,也可以传入角色ID代替角色名:
# 括号内替换为三个角色对应的实际ID @commands.has_any_role(101234567890123456, 101234567890123457, 101234567890123458)
方案2:自定义校验规则(适合复杂场景)
如果后续还有其他自定义校验逻辑,可以自己写校验函数配合commands.check装饰器使用:
# 先定义自定义校验装饰器 def check_allowed_role(): def predicate(ctx): allowed_role_names = {"Lab Demonstrator", "Staff", "teacher"} # 遍历用户所有角色判断是否有符合要求的 return any(role.name in allowed_role_names for role in ctx.author.roles) return commands.check(predicate) # 在命令上添加该装饰器即可 @check_allowed_role()
内容的提问来源于stack exchange,提问作者Osian
相关产品推荐
相关产品推荐

