확장

봇의 개발 단계에서는 런타임에 봇 기능을 확장하고 코드를 신속하게 언로드/리로드(핫 리로딩이라고도 불림) 하고 싶을 때가 옵니다. 커맨드 프레임워크에는 확장이라는 기능이 내장되어 있습니다.

기초

확장의 중심부인 파이썬 파일에는 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)

이 예시에서 우리는 간단한 명령어를 정의하였고, 확장이 로드될 때 이 명령어는 봇에 추가됩니다. 이제 마지막 단계는 commands.Bot.load_extension()을 호출하는 것입니다. 이 확장을 로드하기 위해서는 bot.load_extension('hello')을 호출합니다

Cogs

확장자는 보통 cogs와 함께 사용됩니다. 더 자세한 정보는 Cogs 문서를 확인하세요.

참고

확장자의 경로는 궁극적으로는 import 메커니즘과 비슷합니다. 이 뜻은 만약 폴더가 존재할 경우, 반드시 마침표로 구분되어야 합니다. 예를 들어, plugins/hello.py에 있는 확장을 로드하는 경우, plugins.hello로 사용합니다.

리로딩

확장자에 변화를 주고 레퍼런스를 리로드하고 싶은 경우, Bot.reload_extension()함수와 라이브러리가 도움을 줄 것입니다.

>>> bot.reload_extension('hello')

확장이 리로드되면 확장에 포함된 모든 변경사항이 적용됩니다. 이는 봇을 재시작하지 않고 기능을 추가하거나 제거할 때유용합니다. 만약 리로딩 과정에 오류가 발생하면 봇에변경 사항이 적용되지 않습니다.

확장 정리하기

가끔 확장을 정리하거나 언로드되었는지 확인해야 할 때가 있습니다. 이런 경우를 위해 teardown 진입점이 존재합니다. 이는 setup과 비슷하지만 확장이 언로드될 때 호출됩니다.

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

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