Help us understand the problem. What is going on with this article?

discord.py rewriteのCogに変更があったようなので

More than 1 year has passed since last update.

discord.pyのrewriteバージョンに更新がありました。

前提: discord.pyのrewriteバージョンとasyncバージョンの区別ができる。
discord.pyのrewriteバージョンを使っている。

※Botを作り始める人向けではありません。

Cogを知らない人へ

Cogっておいしいの?

Cogは、クラスの一種で、使い方はたくさんありますが、よくあるのが「コマンド類を別ファイルで定義」というものです。

たとえば、「hogehogebot」にはゲーム、音楽再生、天気予報の機能があったとします。
通常は、

hogehogebot.py
import discord as d
from discord.ext import commands as c

bot = c.Bot(command_prefix="!")

@bot.command()
async def game_numguess(ctx):
    """数あて"""
    ....

@bot.command()
async def music_youtube(ctx, *, name):
    """YouTube音源再生"""
    ....

bot.run("tokenをおく")

などと書きますが、これではhogehogebot.pyが長くなり、ごちゃごちゃします。
そこで、ファイルを分けるために、Cogを使います。

hogehogebot.py
import discord as d
from discord.ext import commands as c
from cog_music import Music
from cog_games import Games

bot = c.Bot(command_prefix="!")

bot.add_cog(Games())
bot.add_cog(Music(bot=bot))

bot.run("tokenをおく")

Cogされるファイルの中身は?

以前は以下のように、単純なクラスでした。

cog_music.py
from discord.ext import commands as c

class Music:
    def __init__(self, bot):
        self.bot = bot
    @c.command()
    async def music_youtube(self, ctx, *, name):
        ...

Cogの改定について

Cogが改定されたのは、2019年2月23日。以下のような変更点があります。

  • Cogのクラスは、すべてdiscord.ext.commands.Cogから継承しないといけない
  • そうしないと、Cogを読み込んでもらえない
  • Cog用のエラーチェックなどの方法が変わった

上のコードを書き直して

cog_music.py
from discord.ext import commands as c

class Music(c.Cog, name="Music"):
    def __init__(self, bot):
        self.bot = bot
    @c.command()
    async def music_youtube(self, ctx, *, name):
        ...

c.Cogが追加されていますね。
nameは既定でクラス名と同じなので、省いても大丈夫です。

ほかにも

  • Cog内でon_messageなどを使っている場合は、@c.Cog.listener()を付けましょう。
  • Cogのコマンドをtupleで得るには、Cog.get_commands()が使えます。
  • Command.instanceCommand.cogになりました!
  • Cog関連で__から始まる名前の関数は、すべて改名されています。

公式ドキュメント

apple502j
Logo is by me, CC BY-SA 2.0
https://github.com/apple502j
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away