[PYTHON] nest cog dans discord.py

supposition

Le code de cet article est juste un code simplifié pour l'explication, donc seul le code absurde apparaîtra. Notez s'il vous plaît.

le rouage est devenu compliqué

L'extension de commande discord.py (https://discordpy.readthedocs.io/ja/latest/ext/commands/index.html) a la capacité de regrouper plusieurs commandes et événements appelés cog. de cette façon

hoge.py


from discord.ext import commands as c

class CogHogeFuga(c.Cog):
    def __init__(self, bot, hoge):
        self._bot = bot
        self._hoge = hoge

    @c.command()
    async def hoge1(self, ctx):
        await ctx.send("hoge")
    
    @c.command()
    async def hoge2(self, ctx):
        foo = await hoge3()
        return foo

    async def hoge3(self):
        return self._hoge

Si vous écrivez, le simple chargement de CogHogeFuga chargera à la fois hoge1 et hoge2.

Cependant, à mesure que le développement progressait, il est devenu comme suit.

hoge.py


from discord.ext import commands as c

class CogHogeFuga(c.Cog):
    def __init__(self, bot, hoge):
        self._bot = bot
        self._hoge = hoge
        self._fuga = None

    @c.command()
    async def hoge1(self, ctx):
        await ctx.send("hoge")
    
    @c.command()
    async def hoge2(self, ctx):
        foo = await hoge3()
        await ctx.send(foo)

    async def hoge3(self):
        return self._hoge

    """
Commandes ajoutées ci-dessous à partir d'ici
    """
    
    @c.command()
    async def fuga1(self, ctx):
        return ctx.send("fuga")

    async def fuga2(self, ctx, new_):
        self._fuga = new_

    @c.command()
    async def fuga3(self, ctx):
        foo = await fuga4()
        await ctx.send(foo)

    async def fuga4(self):
        return self._fuga

J'ai essayé de l'ajouter d'une manière ou d'une autre, mais les commandes liées à hoge et les commandes liées à fuga sont mélangées. Il y aura peut-être plus de commandes liées à bar dans le futur, et j'aimerais les séparer si possible.

Cependant, augmenter simplement le nombre de rouages augmentera le temps et l'effort requis pour charger les rouages. Les deux hoge et fuga sont similaires, donc si possible, j'aimerais le faire avec un seul effort debot.add_cog (CogHogeFuga (bot)).

pignon de nid

Donc, je pense que ce serait bien de pouvoir imbriquer des rouages. En fait, en écrivant ce qui suit, le chargement du rouage lui-même peut être laissé sous la forme bot.add_cog (CogHogeFuga (bot)).

hoge.py


from discord.ext import commands as c

class CogHogeFuga(c.Cog):
    def __init__(self, bot, hoge):
        self._bot = bot

        self._bot.add_cog(CogHoge(self._bot, hoge)) #point
        self._bot.add_cog(CogFuga(self._bot)) #point

class CogHoge(c.Cog):
    def __init__(self, bot, hoge):
        self._bot = bot
        self._hoge = hoge


    @c.command()
    async def hoge1(self, ctx):
        await ctx.send("hoge")
    
    @c.command()
    async def hoge2(self, ctx):
        foo = await hoge3()
        await ctx.send(foo)

    async def hoge3(self):
        return self._hoge
    

class CogFuga(c.Cog):
    def __init__(self, bot):
        self._bot = bot
        self._fuga = None

    @c.command()
    async def fuga1(self, ctx):
        return ctx.send("fuga")

    async def fuga2(self, ctx, new_):
        self._fuga = new_

    @c.command()
    async def fuga3(self, ctx):
        foo = await fuga4()
        await ctx.send(foo)

    async def fuga4(self):
        return self._fuga

En passant le bot lui-même lors de l'ajout de Cog comme décrit ci-dessus, il était possible d'ajouter d'autres Cogs au bot au moment de l'initialisation.

À la fin

Veuillez me faire savoir s'il existe un moyen plus simple.

Qu'est-ce qui est reconnaissant

C'est l'arrière du refroidisseur. Comme mentionné ci-dessus, chaque rouage doit être add_cog au bot. Il y a aussi une fonction pour charger le fichier entier appelé ʻExtension, mais cela exécute aussi finalement la méthode setup () dans le fichier, donc vous devez écrire ʻadd_cog ici.

je peux

――Je veux écrire ensemble les choses qui sont très pertinentes, je veux comprendre ――Je veux éviter de modifier plusieurs endroits avec une seule réparation

Ainsi, il est réalisé en imbriquant Cog. Avec cette méthode d'écriture, par exemple, si vous voulez diviser un certain Cog, vous n'avez qu'à réécrire le Cog que vous voulez diviser, et il n'est pas nécessaire de décrire le processus de chargement d'un nouveau Cog dans une autre partie.

Recommended Posts

nest cog dans discord.py
Comprendre les rouages et les extensions dans discord.py
[Discord.py] Comprendre Cog
Modules Nest dans Boost.Python
Messages mis à jour dans discord.py
Transmettez des arguments à Task dans discord.py