エクステンション

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

はじめに

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

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

hello.py
from discord.ext import commands

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

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

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

コグ

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

注釈

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

リロード

When you make a change to the extension and want to reload the references, the library comes with a function to do this for you, Bot.reload_extension().

>>> bot.reload_extension('hello')

Once the extension reloads, any changes that we did will be applied. This is useful if we want to add or remove functionality without restarting our bot. If an error occurred during the reloading process, the bot will pretend as if the reload never happened.

クリーンアップ

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

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

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