Discord.py 명령어 - discord.py myeonglyeong-eo

Dev/Discord Bot

Discord.py로 디스코드 봇 만들기 (3) - 명령어 제작(2)

빨강고양이 2021. 6. 11. 19:55

Discord.py 명령어 - discord.py myeonglyeong-eo

지난번에 간단하게 인사를 하는 명령어를 만들어 보았다. 이번에는 봇이 내가 한 말을 따라 말하는 것과 임베드에 대해 살펴볼 것이다.

먼저 내가 한 말을 따라 하는 것부터 만들어보자. 봇이 명령어를 입력받는 것 뒤에 띄어쓰기를 하고 할 말을 입력하면 된다.

Discord.py 명령어 - discord.py myeonglyeong-eo

이런 식으로 적으면 되는데, 중간에 *은 띄어쓰기를 구분해주는 것이다. msg에는 띄어쓰기를 하고 난 뒤에 적히는 모든 메시지를 담고 있다. msg에 담겨 있는 메세지를 다시 봇이 보내 주는 것이다.

명령어를 적고 봇을 실행한다. 실행하면 아래 화면처럼 사용할 수 있다.

Discord.py 명령어 - discord.py myeonglyeong-eo
봇이 내가 한 말을 따라하는 것을 볼 수 있다.

간단한 인사를 주고받는 명령어와 에코 명령어를 만들어봤다. 이번엔 임베드에 대해 알아볼 것이다.

먼저 임베드란 아래 사진과 같은 것을 이야기한다.

Discord.py 명령어 - discord.py myeonglyeong-eo
미니 쿠다라는 봇이다.

코드는 어떻게 작성하는지 알아보자.

Discord.py 명령어 - discord.py myeonglyeong-eo

위와 같이 작성을 하고 명령어를 사용해 보면, 아래 사진처럼 나오게 된다. 

Discord.py 명령어 - discord.py myeonglyeong-eo

코드 부분에 보면 embed = discord.Embed(title="타이틀!", description="디스크립션!", color=0xffffff) 이런 부분이 있는데, 말 그대로 title은 맨 위 제목을 뜻 하고, description은 title 밑에 있는 설명(?)을 뜻한다. color는 임베드의 왼쪽 편에 세로줄 색상을 지정하는 것이다. 뒤에 들어가는 숫자는 0x 뒤에 헥사코드를 입력하면 된다.

embed.set_thumbnail(url="https://imgur.com/1fTB9uk.png")은 오른쪽 위에 있는 썸네일 사진을 넣어준다.

embed.add_field(name="안녕하세요", value="안녕하세요, 반갑습니다.", inline=False)의 name은 소제목을 의미하고, value는 소제목 안의 내용을 의미한다. 마지막의 inline은 False를 입력하면 위 사진같이 나오게 되고, True를 입력하면 아래 사진처럼 나오게 된다.

Discord.py 명령어 - discord.py myeonglyeong-eo

inlien 부분은 자기가 편한 대로 사용하면 된다.

embed.set_footer(text="Bot Made by 빨강고양이#5278", icon_url="https://imgur.com/1fTB9uk.png")에서 text는 말 그대로 맨 밑에 들어갈 글귀를 적는 것이고, icon_url은 이미지를 넣는 곳이다.

위 코드에는 없지만 embed.set_image()라는 코드가 있는데, 이 코드는 그냥 사진만 넣어주는 코드이다.

ex) embed.set_image(url="https://imgur.com/1fTB9uk.png")

이렇게 에코 명령어와 임베드에 대해 알아보았다. 다음에는 명령어를 입력한 사람이 해당 서버의 관리자인지 확인해주는 명령어와 서버의 관리자만 사용 가능한 공지사항 명령어를 만들 것이다.

RyuWoong 2020. 2. 11. 08:55

Discord.py 명령어 - discord.py myeonglyeong-eo


안녕하세요. 깜뭉이입니다.

이전 글에서 응답하는 봇을 만들어 봤습니다만 discord.Client 기반은 봇에 적합하지 않고 대신 discord.Bot을 기반으로 제작하는 것이 좋기때문에 이번에 제대로 된 봇을 만들어 보고자 합니다. 제작하는 과정에서 어려움이 많았는데 특히 대부분 글은 Client를 기반으로 제작한 글이여서 참고할게 적더라구요. 그래서 이번에 디스코드 봇을 제작하는 글을 쓰게된 계기가 되었습니다. 그리고 discordpy가 1.3버전으로 업그레이드 되면서 코드가 마이그레이션이 되었습니다. 그래서 이전 버전의 discordpy와 변경점이 있어서 구글링시 오류가 나는 경우도 생겼습니다. 그러니 만드실때 꼭 API문서를 참조하시면서 만드시는게 좋습니다. 사설이 길었습니다. 시작하겠습니다.


discord.Bot 기반으로 작성한 코드는 아래와 같습니다.

import asyncio,discord
from discord.ext import commands

#봇의 설정
token = "토큰 값 입력"  #시작하기 글에서 토큰 값을 복사해 넣어줍니다.
game = discord.Game("!도움") #다른 봇을 보면 상태창에 -help 이렇게 적힌걸 보실수 있을 겁니다.
bot = commands.Bot(command_prefix='!',status=discord.Status.online,activity=game)

#봇 시작
@bot.event
async def on_ready():
	print("봇 시작")

bot.run(token)

이전 Client 기반과 지금은 큰 차이는 없지만, 몇몇 코드를 설명하면서 넘어가겠습니다.

import asyncio,discord는 필요한 API를 끌어와줍니다. 둘은 꼭 필요한 API입니다. 없으면 절대 안됩니다.

token 은 주민등록번호와 같은 존재입니다. 토큰 값이 노출되면 아주 위험합니다. 해킹의 우려가 생기기 때문이죠. 그러니 잘 관리하세요. 저는 아래와 같이 따로 파일을 둬서 관리합니다.

import os

token_path = os.path.dirname( os.path.abspath( __file__ ) )+"/token.txt"
t = open(token_path,"r",encoding="utf-8")
token = t.read().split()[0]
print("Token_key : ",token)

해당 코드를 위 코드에 더해주면 됩니다. import os로 파일을 불러올수 있게끔 해주는게 포인트. 그리고 run.py가 있는 폴더에 token.txt를 만들어서 안에 토큰값을 저장해 따로 보관하는 방식을 사용합니다. github에 올릴 때도 token.txt는 ignore처리 하면 토큰값이 노출될 일이 없겠죠?

그다음 commands.Bot 입니다.

command_prefix 는 해당 구문이 맨 앞에 있을때 명령어로 인식한다는 겁니다.

현재 '!' 로 설정 되어 있죠? 향후 명령어를 추가하고 명령을 실행하려면 !도움, !안녕 이렇게 맨 앞에 '!' 가있어야 명령어로 인식합니다. 서버에서 사용하는 다른 봇과 겹치지 않게 잘 설정 해주세요.

status 는 봇의 상태 값입니다. 온라인, 자리비움 등 설정할 수 있는데 status값이 없으면 온라인이 기본 값 입니다.

activity 는 상태말이라고 보면 편합니다. 디스코드에서 유저들의 상태를 보면 League of Legend 하는중.. 이렇게 적혀있는걸 보실 수 있으실텐데 그곳을 채워주는 겁니다. game = discord.Game() 내 텍스트를 편집해주시면 됩니다.

그럼 명령어로 간단하게 응답하는 봇을 만들어 보면서 이번 글은 마치도록 하겠습니다.

import asyncio,discord,os
from discord.ext import commands

#토큰
token_path = os.path.dirname( os.path.abspath( __file__ ) )+"/token.txt"
t = open(token_path,"r",encoding="utf-8")
token = t.read().split()[0]
print("Token_key : ",token)

game = discord.Game("!도움")
bot = commands.Bot(command_prefix='!',status=discord.Status.online,activity=game,help_command=None)

@bot.event
async def on_ready():
	print("봇 시작")
    
@bot.command()
async def 도움(ctx):
	await ctx.send("무엇을 도와드릴까요?")
    
bot.run(token)

봇을 저번처럼 파워셀을 통해서 온라인 시키고, 봇이 있는 채널에서 !도움을 입력해보세요.

그럼 봇은 무엇을 도와드릴까요? 라고 대답합니다.