エクステンション¶
Bot開発ではBotを起動している間にコードを素早くアンロードし、再度ロードし直したい (ホットリロードとも呼ばれます) という時があります。コマンドフレームワークでは エクステンション と呼ばれる概念でこの機能が組み込まれています。
はじめに¶
その中核となるエクステンションは setup
というエントリポイントを持つPythonファイルです。このsetupは通常のPython関数である必要があります (コルーチンではありません)。この関数はエクステンションをロードする Bot
を受け取るための単一のパラメータを持ちます。
エクステンションの例は以下のとおりです:
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
というエントリポイントが用意されています。
def setup(bot):
print('I am being loaded!')
def teardown(bot):
print('I am being unloaded!')