개발/디스코드 봇 제작 [PYTHON]

[디스코드 봇 제작] 음성채널 입장&퇴장

꾸적꾸적 2023. 2. 18. 15:25

현재 제작해야하는 봇은

음악봇과 공부시간 정리봇

먼저 음악 봇 부터 제작했습니다.

 

아무래도 음악 봇이라면 다들 사용하는 유튜브 링크를 사용하는 방법인데,

명령어 시작 링크

이런식으로 구현되도록 저도 똑같이 만들어보았습니다.

 

하지만 그보다 먼저 중요한것은,

봇이 내가 들어와 있는 음성 채널에 들어오고 나가는 것을 구현하는 것.

 

from discord.ext import commands	# 디스코드 봇에서 사용할 여러가지 기능을 위한 임포트
import discord				# 디스코드 봇을 위한 임포트

discord_bot_token = TOKEN		# 토큰 정보는 각자의 토큰 정보
intents = discord.Intents.default()	# Intents 부분의 설정을 사용하기 위한 변수 불러오기
intents.message_content = True		# 메세지를 쓰기위한 message_content True 설정.

# 상태에 보이고 싶은 문구 설정
# 상태 메세지는 게임 중일때 어떤 게임을 하는지를 알려주는 것이기 때문에, Game으로 설정.
bot_activity = discord.Game(name=":: DB가 싫어요 ::")

# activity 는 봇 상태를 알려주는 것
# command_prefix = "$" 는 "$" 라는 명령어 시작 구문을 만들어주는것, 아래로 예를 들자면 $ping
# intents 는 봇 Intents를 사용하기 위한 구문, 우리는 코드상으로 수정을 해주었으니 넣어줄 것.
bot = commands.Bot(activity=bot_activity, command_prefix="$", intents=intents)

#################################################################
#디스코드 봇 이벤트
@bot.event				# 안쓰면 작동을 안함
async def on_ready():			# 봇이 켜져있음을 확인하는 동작
  print('Bot: {}'.format(bot.user))
#################################################################
#디스코드 봇 커맨드
# 봇 음성채널 입장
@bot.command()				# 안쓰면 작동을 안함
async def 들어와(ctx):			# 들어와 라는 명령어로 실행
  if ctx.author.voice and ctx.author.voice.channel:	
    channel = ctx.author.voice.channel
    await channel.connect()
    await ctx.send(":: " + str(bot.voice_clients[0].channel) + " 채널에 들어갈게요! ::")
  else:
    await ctx.send(":: 음성채널에 사용자가 없어요! ::")
    
# 봇 음성채널 나가기
@bot.command()				# 안쓰면 작동을 안함
async def 나가(ctx):			# 나가 라는 명령어로 실행
  if ctx.author.voice and ctx.author.voice.channel:
    await ctx.send(":: 나가보겠습니다! ::")
    await bot.voice_clients[0].disconnect()
  else:
    await ctx.send(":: 아직 들어가지 않았어요! ::")
    
bot.run(discord_bot_token)

여기서 ctx.author.voice 같은 변수가 나오는데,

ctx.author는 디스코드를 사용중인 사용자, 즉, 명령어를 입력한 사람을 의미하고,

명령어를 입력한 사용자가 채널에 없다면 안들어가는 것,

봇이 아직 채널에 들어가있지 않은데 나가게 한다면 들어가지 않았다고 하는 것.

if else로 예외 처리를 두어 오류를 미연에 방지합니다.