如何为discord.py创建自定义装饰器?

时间:2019-06-17 18:38:09

标签: python python-3.x discord.py discord.py-rewrite

我正在研究机器人。对于某个齿轮,我希望创建一个自定义检查装饰器,以检查运行该命令的人员是否具有特定角色。角色作为角色类存储为实例变量。当我尝试运行它时,它不起作用。您如何制作装饰器?

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.")

1 个答案:

答案 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