실전! 초보를 위한 디스코드 봇 개발 with 파이썬 (3) - 명령어 만들기, 접두사 짓기

2020. 5. 6. 19:07디스코드 봇 만들기

지난 강의에서는 봇을 초대하고, 간단한 봇 하나를 켜보기까지 했습니다.

이번 시간에는 아케이드봇에 명령어를 제대로 다뤄보겠습니다.

 

1. 코루틴 하나가 명령어 하나

지난 시간 마지막 부분을 다시 떠올려볼까요? 저번 시간을 다시 훑어보고 오시는 것도 좋습니다.

import discord
from discord.ext import commands

client = commands.Bot(command_prefix='*')

@client.command()
async def hello(ctx):
    await ctx.send('안녕하세요')

client.run('봇 토큰')

코루틴이란, 정말 간단히 말해서 함수를 정의할 때 쓰는 def 키워드 앞에 async가 붙은, async def 로 정의하는 함수라고 볼 수 있습니다. 우리말로 순화하면 '비동기 함수' 정도겠습니다. 즉, 파이썬 discord.py 모듈은 이 코루틴 하나에 명령어 하나가 대응된다고 보면 됩니다.

비동기 작업은 파이썬 초보분들께 어려울 수 있기에 이 강의에서는 설명을 되도록 생략하려 합니다. 궁금하신 분은 구글 등에 '파이썬 비동기'를 검색해서 찾아볼 수 있습니다.

discord.py 모듈에서는 명령어를 만들 때 반드시 async def 키워드를 사용해야 합니다.

또, 기본적으로는 코루틴의 이름(저 코드에서는 hello겠습니다)이 곧 명령어의 이름이 됩니다.

2. 접두사 충돌

저번 시간에 아케이드봇에 *hello 라고 입력하면 '안녕하세요' 를 말하게 하는 명령어를 만들었습니다.

명령어 앞에 항상 붙는 글자(또는 기호)를 명령어 접두사라고 합니다. 이 봇에서는 명령어 접두사를 *(별표)로 정했습니다.

 

따라서 코루틴의 이름이자 명령어 이름인 hello 앞에 *를 붙여야 명령어가 작동하게 됩니다. 접두사는 없어도 되지만 그렇게 한다면 의도치 않게 명령이 실행될 것입니다.

 

그런데 !(느낌표)처럼 이미 많은 봇들이 사용하는 접두사를 사용할 경우, 아래 그림처럼 명령어 하나에 여러 봇이 달려드는 경우도 생길 것입니다.

 

주의! 사진에 나온 봇들은 본인이 만든 것이 아닙니다!

3. 좋은 접두사를 짓는 방법

사실 현재 한글자 기호로 이루어진 접두사(!, &, ^ 등)은 많은 봇들이 쓰고 있는 상황입니다. 따라서 자신의 봇만을 나타낼 수 있는 특별한 접두사를 짓는 게 좋습니다. 어떤게 있을까요?

 

1) 봇의 이름을 따온다

이 강의에서 만들고 있는 봇의 이름은 '아케이드봇'입니다.

 

'아케이드봇'을 접두사로 쓰기에는 너무 깁니다. 명령어를 연속해서 입력해야 하는 경우 힘이 들 수 있습니다. 그러면 3글자 정도면 적당할듯 합니다.

저는 봇의 이름에서 따온다면 '아케봇' 으로 정하겠습니다. 그럼 다른 방법은요?

 

2) 기존의 기호 접두사에 살을 붙이자

아니면, 기호는 그대로 사용하되 좀 더 중복되지 않게, 특별하게 짓는 건 어떤가요?

 

!(느낌표)에 '아케이드봇'의 '아케'를 따서 '!아케'로 정하겠습니다.


아케봇, !아케. 어떤게 좋을까요?

 

저는 '아케봇'으로 하겠습니다.

 

import discord
from discord.ext import commands

client = commands.Bot(command_prefix='아케봇 ')

@client.command()
async def hello(ctx):
    await ctx.send('안녕하세요')

client.run('봇 토큰')

command_prefix를 '아케봇 '으로 하여 client 인스턴스를 만들었습니다.

잘 보시면 '아케봇' 뒤에 띄어쓰기를 쓴 것을 볼 수 있습니다. 제 경우에는, '아케봇' 뒤에 띄어쓰기(스페이스바)를 한 개 넣어줬습니다.

왜냐하면, 그렇게 하지 않으면 '아케봇hello' 라고 입력해야 하기 때문입니다.

저는 '아케봇 hello'와 같이, '아케봇' 띄어쓰기 'hello'를 원하기 때문입니다.

 

4. 명령어의 이름을 붙이자!

이제 정말로 정말 제대로 된 명령어를 만들어 보겠습니다.

 

자, 지금 한 가지 마음에 안 드는 부분을 떼 왔습니다. 바로 hello 명령을 사용할 때 '아케봇 hello' 와 같이 영어를 사용해야 한다는 점입니다. 함수의 이름이 곧 명령어 이름이 되는데, 저는 한글을 쓰고 싶습니다. 어떻게 해야 할까요?

@client.command()
async def hello(ctx):
    await ctx.send('안녕하세요')

1) 함수 이름을 한글로!

먼저 함수의 이름을 한글로 바꾸는 방법입니다.

@client.command()
async def 안녕(ctx):
    await ctx.send('안녕하세요')

자, 이렇게 코루틴의 이름을 '안녕'으로 바꿨습니다. 이제 봇을 켜보면...

생각한 대로 작동하는 것을 볼 수 있습니다!

 

2) 이름을 직접 정하기!

근데, 사실 명령어 이름을 바꾸기 위해 함수 이름을 바꾸는 것은 딱히 권하고 싶은 방법은 아닙니다.

왜냐면, 명령어 이름을 상황에 따라 바꾸고 싶은 경우도 있기 때문입니다. 그럴 경우 아래의 방법이 쉽습니다.

 

이 방법은 어떤가요?

@client.command(name='안녕')
async def hello(ctx):
    await ctx.send('안녕하세요')

자, 함수 이름은 hello로 영어인데 함수에 붙어 있는 데코레이터가 name 인수를 '안녕' 으로 받았습니다. 이 상태로 봇을 켜봅시다...

신기하게도, 함수의 이름인 'hello'를 입력하니 반응이 없고, name 인수로 준 '안녕'을 입력하니 '안녕하세요'라고 말했습니다.

즉, name 인수에 명령어의 이름을 직접 정해줄 수 있습니다!


5. 별명 정해주기

name 인수 말고도 aliases 인수가 있습니다. aliases는 번역해보면 '별명' 이라는 뜻인데요, 말 그대로 명령어의 또다른 이름들입니다. 명령어에 별명은 여러 개를 정할 수 있습니다. 이걸 보세요!

@client.command(aliases=['안녕', '안녕하세요', 'ㅎㅇ'])
async def hello(ctx):
    await ctx.send('안녕하세요')

aliases 인수에 리스트 형태로 '안녕', '안녕하세요', 'ㅎㅇ'를 넘겨줬습니다. 이제 봇을 켜볼까요?

함수의 이름을 포함해서, aliases 인수로 넘겨준 별명으로도 명령어가 동작하는 것을 볼 수 있습니다!


오늘은 봇 접두사를 정하고, 기본 명령어를 추가해 봤습니다.

다음 강의에서 명령어 체크 등 부가적인 기능을 알아봅시다.