エクステンション

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

はじめに

その中核となるエクステンションは 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}.')

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

この例では単純なコマンドを実装しており、エクステンションがロードされることでこのコマンドがBotに追加されます。最後にこのエクステンションをロードする必要があります。ロードには commands.Bot.load_extension() を実行します。このエクステンションを読み込むために bot.load_extension('hello') を実行します。

コグ

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

注釈

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

リロード

エクステンションを更新し、その参照を再読込したい場合のために、ライブラリには Bot.reload_extension() が用意されています。

>>> bot.reload_extension('hello')

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

クリーンアップ

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

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

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