エクステンション

ボット開発ではボットを起動している間にコードを素早くアンロードし、再度ロードし直したい (ホットリロードとも呼ばれます) という時があります。コマンドフレームワークでは エクステンション と呼ばれる概念でこの機能が組み込まれています。

はじめに

その中核となるエクステンションは setup というエントリポイントを持つPythonファイルです。このsetupはPythonのコルーチンである必要があります。この関数はエクステンションをロードする Bot を受け取るための単一のパラメータを持ちます。

エクステンションの例は以下のとおりです:

hello.py
from discord.ext import commands

@commands.command()
async def hello(ctx):
    await ctx.send(f'Hello {ctx.author.display_name}.')

async def setup(bot):
    bot.add_command(hello)

この例では簡単なコマンドを定義し、エクステンションが読み込まれた際に、コマンドがボットに追加されるようにします。最後にエクステンションを読み込むために、 Bot.load_extension() を呼び出します。このエクステンションを読み込むためには、 await bot.load_extension('hello') を呼び出します。

コグ

エクステンションは通常、コグと組み合わせて使用します。詳細については コグ のドキュメントを参照してください。

注釈

エクステンションのパスは究極的にはimportのメカニズムと似ています。これはフォルダ等がある場合、それをドットで区切らなければならないということです。例えば plugins/hello.py というエクステンションをロードする場合は、 plugins.hello という文字列を使います。

リロード

エクステンションに変更を加えて、その変更を再読み込みしたい場合があります。このためにライブラリには Bot.reload_extension() という関数が用意されています。

>>> await bot.reload_extension('hello')

エクステンションを再読込みすると、その変更が適用されます。ボットを再起動せずに機能の追加や削除を行いたい場合に便利です。再読込処理中にエラーが発生した場合、ボットは再読込処理をする前の状態に戻ります。

クリーンアップ

稀ではありますが、エクステンションにクリーンアップが必要だったり、いつアンロードするかを確認したい場合があります。このために setup に似たエクステンションがアンロードされるときに呼び出される teardown というエントリポイントが用意されています。

Exceptions raised in the teardown function are ignored, and the extension is still unloaded.

basic_ext.py
async def setup(bot):
    print('I am being loaded!')

async def teardown(bot):
    print('I am being unloaded!')