我正在研究机器人。对于某个齿轮,我希望创建一个自定义检查装饰器,以检查运行该命令的人员是否具有特定角色。角色作为角色类存储为实例变量。当我尝试运行它时,它不起作用。您如何制作装饰器?
class Moderation(commands.Cog):
def __init__(self, bot: commands.Bot):
self.bot = bot
self.mod_role = None # Assume there's already a role here
class Decorator:
@classmethod
def requires_mod(cls, func):
async def decorator(self, ctx: commands.Context, *args, **kwargs):
if self.mod_role not in ctx.author.roles:
await ctx.send("You do not have permission to use this command")
func(ctx, *args, **kwargs)
return decorator
@commands.command()
@Decorator.requires_mod
async def purge(self, ctx: commands.Context, amt: int):
await ctx.channel.purge(limit=amt+1)
await ctx.send(f":white_check_mark: | Deleted {amt} messages.")
答案 0 :(得分:1)
此概念已内置在Checks扩展名awk '
BEGIN { OFS="\t" }
NR==1 { print "Sample", $0 }
FNR==1 { fname=FILENAME; sub(/_.*/,"",fname); next }
{ print fname, $0 }
' *bla.txt
中
甚至cog_check
之类的特定于齿轮的检查都不知道齿轮本身:没有一个接受commands
作为参数。
您需要重写支票,以使其不依赖self
。如果您现在知道角色名称或ID,或在创建self
类时,可以使用内置的has_any_role
检查。
否则,最简单的方法可能是使用Moderation
的类属性或全局值来存储角色:
Moderation