본문 바로가기
Programming/Discord Bot (Python)

Discord 봇 만들기 - 6) 봇을 DIY 해보자 - 명령어 편

by Maker KSH 2021. 7. 4.
=Info
아래 코드는 Windows 10, Python 3.9, discord-py 1.7.3 기준으로 작성되었습니다.
(운영체제 등에 따라 조금 다를 수도 있습니다.)(만약 업데이트 등에 의해 코드가 다르다면 알려주세요!)

 

주의)
Discord.py의 개발이 중단되었습니다.
따라서 이 포스팅을 따라할 경우 봇이 정상 작동하지 않을 수 있습니다.
자세한 내용은 "여기"를 참고해주세요.

 

안녕하세요 여러분! 오늘은 게임을 한다면 모두가 아는 통화 플랫폼!

Discord에서 봇을 만드는 방법 6번째! 이제 봇을 원하는 대로 제작하여 봅시다.

(이 강의는 선행 강의를 모두 마쳤다는 전재하에 진행됩니다.)

이번 강의에서는 명령어 처리에 대하여 자세히 알아봅시다.

(여기에있는 코드는 "Discord.py 공식 레퍼런스"를 참조하여 작성되었습니다.)


  • <B>.command() 
@<B>.command()
async def <원하는 명령어>(<args>, <kwargs>):
...

또는

@<B>.command(name = <원하는 명령어>)
async def <원하는 함수이름>(<args>, <kwargs>):
...

위에서 설정한 Discoord봇의 명령어에 따른 실행될 명령어를 설정합니다.

두가지 방법이 있지만, 저는 두번째 방법을 선호하는 편입니다.

(일단은 두가지 방법 다 서술해두었으나, 둘중 편한방법 하나 사용하시길 바랍니다.)

또한, 명령어는 겹칠 수 없습니다. 만약 겹치는 경우 에러가 나며 봇이 실행되지 않습니다!)

명령어가 겹친 경우
= 애러코드 =
discord.ext.commands.errors.CommandRegistrationError: The command input is already an existing command or alias. 

 

  • <args>만 사용 (명령어 뒤에 오는 글자가 없는 경우)
# Ex - <args>만 사용 1
@bot.command()
async def Hi(ctx):
    await ctx.send("Hello!!")
    # 채팅창에 "!Hi"입력시 "Hi!" 출력
    
# Ex - <args>만 사용 2
@bot.command(name = "Hi")
async def _Hi(ctx):
    await ctx.send("Hello!!")
    # 채팅창에 "!Hi"입력시 "Hi!" 출력
Ex 1, 2 결과
예제 실행 결과

  • <args>, <kwargs> 사용 (명령어 뒤에 오는 글자가 있을 경우) 
<kwargs>가 단순 문자일때
# Ex - <args>, <kwargs>(단순 문자) 사용 1
@bot.command()
async def input(ctx, *, message=None):
    await ctx.send(message)
    # 채팅창에 "!input <원하는 내용>"입력시 "<원하는 내용>" 출력.
    
# Ex - <args>, <kwargs>(단순 문자) 사용 2
@bot.command(name="input")
async def _input(ctx, *, message=None):
    await ctx.send(message)
	# 채팅창에 "!input <원하는 내용>"입력시 "<원하는 내용>" 출력.

예제 실행 결과


<kwargs>가 유저일때(@를 이용한 테그 사용)
# Ex - <args>, <kwargs>(유저) 사용 1
@bot.command()
async def input(ctx, user_name: discord.Member):
    await ctx.send(user_name)
    # 채팅창에 "!user @<원하는 유저>"입력시 "<원하는 유저>" 출력.
    
# Ex - <args>, <kwargs>(유저) 사용 2
@bot.command(name="user")
async def _user(ctx, user_name: discord.Member):
    await ctx.send(user_name)
	# 채팅창에 "!user @<원하는 유저>"입력시 "<원하는 유저>" 출력.

예제 실행 결과


<kwargs>가 유저와 단순 문자를 동시에 받을때,
# Ex - <args>, <kwargs>(복합) 사용 1
@bot.command()
async def test(ctx, user_name: discord.Member, *, message=None):
    await ctx.send(f"{user_name} / {message}")
	# 채팅창에 "!user @<원하는 유저> <원하는 내용>"입력시
    # "<원하는 유저> / <원하는 내용>" 출력.
    
# Ex - <args>, <kwargs>(복합) 사용 2
@bot.command(name="test")
async def _test(ctx, user_name: discord.Member, *, message=None):
    await ctx.send(f"{user_name} / {message}")
	# 채팅창에 "!user @<원하는 유저> <원하는 내용>"입력시
    # "<원하는 유저> / <원하는 내용>" 출력.

예제 실행 결과


총정리

명령어 뒤에 옵션이 붙지 않는다면 <args>만 사용합니다.
=> "!<명령어>"일때만 활용
Ex) "!안녕", "!날짜", "!돈" 등

 

명령어 뒤에 옵션이 붙는다면 <args>, <kwargs> 모두 사용합니다.
=> "!<명령어> <옵션>" 일때 활용
Ex) "!돈주기 A 100원", "!강퇴 A 잘생겨서", "!경고 B 코딩 잘해서" 등

다음 강의에서는 기타 명령어에 대하여 배워봅시다.

 

여기까지 따라와 주시고, 끝까지 봐주신 여러분들께 감사드립니다!

혹시 궁금한 점이나 사진과 틀린 점이 있으면 알려주세요! 수정하도록 하겠습니다!!

(가시기 전에 공감 한 번만 눌러주시면 저에게 큰 힘이 됩니다! 감사합니다!)

 

댓글