※ 작성자가 작성한 내용이 일부 틀릴 수도 있음 주의
※ 직접 하면서 알게된 것을 모두 써서 사족이 많음
※ 리빙 포인트) 모듈 단위로 잘 쪼개자
모든 command를 main에 다 넣는 것은 좋지 않다.
기본적으로 main에 모든 명령어를 넣는 것은 매우 비효율적이다.
다만 각 모듈 단위에 명령어를 넣어버리면 main에서 바로 사용할 수는 없다.
이를 해결하기 위해 load_extension이라는 것이 있다.
각 모듈 단위에 명령어를 구현한 파일을 놓고 이를 로드하는 것이다.
load_extension
#main.py
import discord
from discord.ext import commands
bot = commands.Bot(command_prefix=constants.PREFIX,intents=discord.Intents.all())
다음과 같이 봇을 정의했다고 하자.
이것을 bot.load_extension(모듈명) 형식으로 사용하는데,
이 함수는 반드시 앞에 await를 써야 작동한다.
또한 이 await는 비동기 함수(async) 내에서만 작동한다.
그래서 내 기존 주사위 command 파일이 cordDice.py 라고 하면
다음과 같이 작성하여 모듈을 로드할 수 있다.
@bot.event
async def on_ready(): # 봇이 로그인할 때 동작
print(f"Login bot: {bot.user}") # 봇이 로그인한 것을 확인
await bot.load_extension("cordDice")
# await bot.load_extension("폴더명.cordDice") # 내부 폴더에 위치한 경우
print("Extension load Finished") # 익스텐션이 로드된 것을 확인
@bot.event에 속한 on_ready 는 봇이 로그인할 때 자동으로 동작하는데,
굳이 load_extension을 이 함수에 넣을 필요성은 없지만,
on_ready 함수를 일종의 봇 로드 준비 과정의 트리거로 사용한 것이므로
편할대로 함수를 따로 구현해주거나 위와 같이 on_ready에 넣어줘도 되겠다.
main과 같은 위치에 모듈이 있는 것이 아닌
서브 폴더에 있다면 주석과 같이 수정해주면 된다.
이것만으로는 아직 부족하다.
add_command
cordDice.py에도 설정을 해줘야 한다.
아래와 같이 명령어가 구현되어 있다고 하자.
#cordDice.py
from discord.ext import commands
@commands.command(aliases=cordDiceUtil.aliases)
async def 주사위(ctx, *vars):
...
그러면 이것에 setup 함수를 추가해야하는데, 이에 따라 수정하면 일단 아래와 같다.
#cordDice.py
from discord.ext import commands
@commands.command(aliases=cordDiceUtil.aliases)
async def 주사위(ctx, *vars):
...
async def setup(bot):
bot.add_command(주사위)
간단하게 설명하자면, main에서 load_extension 을 하면
해당 모듈의 setup 함수를 통해 command 를 추가한다고 생각해주면 된다.
그래서 만약 모듈에 새 커맨드를 추가하면, 그것 또한 add_command로 추가해줘야 한다.
모듈 파일을 class 를 통해 구성한 경우, add_cog 를 이용할 수 있으나,
이에 대해서는 지금 당장 필요성을 못 느껴 사용을 안 했기 때문에
나중에 사용하게 되면 그때 따로 글을 쓰려고 한다.
결과는 이전과 같아서 추가적으로 올리지 않을 것이다.
여담
오늘(12시 넘어서 월요일) 개강인데 수업이 없다.
기분이 좋다.
이제 음악 재생 관련 코드를 리팩토링 해야하는데
아 하기 귀찮다.
관련 에러코드 (접은 글)
discord.ext.commands.errors.ExtensionNotFound: Extension '' could not be loaded.
discord.ext.commands.bot Ignoring exception in command None
discord.ext.commands.errors.CommandNotFound: Command "d" is not found
discord.ext.commands.errors.ExtensionFailed: Extension '' raised an error: NameError: name '' is not defined
RuntimeWarning: coroutine 'BotBase.load_extension' was never awaited bot.load_extension("")
'개발일지 > 디스코드 봇' 카테고리의 다른 글
디스코드 봇 개발 일지 2024-03-03 - 구글 클라우드로 24시간 봇 돌리기 & 주사위 기능 리팩토링 & 이모티콘 사용 (6) | 2024.03.03 |
---|---|
디스코드 봇 개발 일지 2024-02-25 - 코드 리팩토링 + command aliases (0) | 2024.02.25 |
디스코드 봇 개발 일지 2024-01-19 - 로컬에서 LLM 돌려보기 대실패 (0) | 2024.01.19 |
디스코드 봇 개발 일지(아님) 2023-07-19 - 학습한 AI 모델한테 노래 부르게 하기 (0) | 2023.07.19 |
디스코드 봇 개발 일지 2023-07-12 - TTS 봇 - 갑자기 깨달음 (계획 변경) (0) | 2023.07.12 |