Cogでコマンドを管理しよう
きっと向上心の高いみなさんなら、めちゃくちゃたくさんコマンドを作っていると思います。
ってなわけで、コマンドを沢山作っていくと、main.py
の1ファイルだけではコマンドの管理とかが大変になると思います。
また、例えばコマンドをちょっと修正した際に毎度毎度BOTを再起動するのは手間ですよね。
それらを解決できるのがCogという機能です。
Cogとは?
大雑把にいうと、コマンドなどを一つのクラスにまとめることができるもので、コマンドを別のファイルにまとめることが出来るってわけです。
とりあえずdog.py
というファイルを作ってみましょう。
from nextcord.ext import commands
class Dog(commands.Cog):
def __init__(self, bot: commands.Bot):
self.bot = bot
def setup(bot):
bot.add_cog(Dog(bot))
これがCogの原型です。
次に、main.py
のbot.run
までにコードを追加します。
+ bot.load_extension("dog")
bot.run("TOKEN")
これで準備はできました。
まず、bot.load_extension("dog")
で、ファイルdog.py
を読み込みます。(Extensionの読み込み)
すると、dog.py
のsetup
関数が実行されます。(Extensionのセットアップ)
そして、インスタンス化されたDog
がBOTにCogとして追加されるという原理です。(Cogの追加)
準備はできましたが、このままでは特に何にもできないので、Cogにコマンドを追加しましょう。
from nextcord.ext import commands
class Dog(commands.Cog):
def __init__(self, bot: commands.Bot):
self.bot = bot
+ @commands.command()
+ async def dog(self, ctx: commands.Context):
+ await ctx.reply("わおーん!")
def setup(bot):
bot.add_cog(Dog(bot))
こんな感じに追加します。
まず、今までbot.command
だったのがcommands.command
になりました。
Cog内ではこのように、一部のデコレーターなどに変化がある場合があります。
また、新しくself
という引数が付きましたが、これはPythonの仕様としてClass内の関数にはselfがくっつく(インスタンス化されたクラスからコマンドを呼び出すと第一引数にインスタンス化されたクラスが渡る)というものです。
詳しくはPython class self
とかで調べてみてください。
普通にコマンドが実行できましたね。
Extension
extension
関連の関数にはload_extension
以外にもreload_extension
やunload_extension
があります。
このreload_extension
を実行すると、BOTを再起動しなくてもコマンドの更新などが行えます。
詳細は省略しますが、自分でデバッグ用コマンドを作成したり、jishaku
やonami
といったデバッグツールを入れることで楽にコマンドの管理ができたりします。頭の片隅に置いてきましょう。
次回
多くのPy製DiscordBOTはCogを活用していると思います。
では、よりもっと本物に近づけましょう。さて、何が足りないか?
次回はスラッシュコマンドをご紹介します。
では、次回の記事をお楽しみに!