이번에는 지난번 인사 명령에 이어 명령어를 더 추가하고 Embed에 대해서 알아보도록 하겠다.
새로 만들 명령은 주사위로, 예전 게시판 웹사이트를 보면 댓글로 많이 들어가 있었던 기능이다.
@bot.command(aliases=['주사위'])
async def roll(ctx, number:int):
await ctx.send(f'주사위를 굴려 {random.randint(1,int(number))}이(가) 나왔습니다 (1~{number})')
3줄 남짓의 짧은 코드다.
이번 명령어는 단순히 명령어 하나만 입력받는 것이 아니라 매개변수를 하나 더 받는다
이와 같이 매개변수를 입력받고자 할때는 ctx 뒤에 매개변수 명을 써주자
@bot.command()
async def repeat(ctx, *, txt):
await ctx.send(txt)
ctx와 매개변수 사이에 *을 넣는 경우도 있는데, 이때는 명령어 뒤의 모든 단어들을 매개변수로 넣어준다
send 명령어 안에 f라는 글자가 보이는데, 이는 f-string으로 파이썬 3.6 부터 나온 기능이다.
문자열을 출력하는 경우, 중간에 일부 문자열을 바꿔줘야 하는 경우가 생기는데 이때 사용하는 기능이다.
이전 버전의 기능인 %나 format을 사용하는 방법도 쓸 수 있다.
출력 문자열 맨 앞 따옴표 앞에 f를 붙이고, 주사위를 굴렸을 때 나온 값들을 문자열 속의 중괄호 안에 넣어주면 문자열 속의 내용을 바꾸고도 출력해줄 수 있다.
주사위를 굴리는데, 명령어를 잘못 작성하는 경우는 어떻게 할까?
위와 같이 매개변수를 넣지않고 명령어를 칠 경우에는 터미널 상에만 에러 로그가 남을뿐 디스코드 상에는 아무것도 뜨지 않는다.
예외 처리하는 방법을 알아보자
@bot.command(aliases=['주사위'])
async def roll(ctx, number:int):
await ctx.send(f'주사위를 굴려 {random.randint(1,int(number))}이(가) 나왔습니다 (1~{number})')
@roll.error
async def roll_error(ctx,error):
await ctx.send('명령어 오류!!!')
@[명령어].error로 밑단 함수는 위의 명령어에 대한 에러 처리 함수라고 정의해준다
에러처리 함수에 error 매개변수를 넣어준다
이와 같이 에러를 잡도록 설정해주면 예외가 발생되면 에러처리 함수로 빠지게 된다.
다음은 Embed 기능을 이용해서 명령어를 만들어보자
Embed는 표나 테이블처럼 만들어진 메시지를 더 깔끔하게 정리해서 보여주는 기능이다.
@bot.command(aliases=['도움말', 'h'])
async def 도움(ctx):
embed = discord.Embed(title="AlphaBot", description="Primary Bot for Discord by Omoknooni", color=0x4432a8)
embed.add_field(name="1. 인사", value="!hello", inline=False)
embed.add_field(name="2. 주사위", value="!roll [범위숫자]", inline=False)
embed.add_field(name="3. 음성채널 입장/퇴장", value="!join / !leave (초대자가 입장된 상태에만 가능)", inline=False)
embed.add_field(name="4. 음악", value="!play [Youtube URL] : 음악을 재생\n!pause : 일시정지\n!resume : 다시 재생\n!stop : 중지", inline=False)
await ctx.send(embed=embed)
우선 discord.Embed로 Embed를 선언해주고 제목과 설명, 좌측의 색상을 설정한다.
그리고 embed.add_field로 필드를 추가해 내용을 적을 수 있다. 필드 추가는 여러 개 가능하다.
inline 옵션은 필드 내용이 써지는 방식을 설정하는데, true의 경우 필드가 옆으로 붙으면서 작성된다
Embed에는 사진을 넣을 수도 있는데, 썸네일로 넣는 방법과 큰 이미지로 넣는 방법이 있다
embed.set_thumbnail(url="HTTP(S) 링크")
embed.set_image(url="HTTP(S) 링크")
사진을 넣는 url링크는 http(s)만 지원한다고 한다.
다음으로 봇의 큰 기능 중 하나인 음악 재생을 구현해보도록 하겠다