본문 바로가기

개발일지/디스코드 봇

디스코드 봇 개발 일지 2023-01-02 - 음성 채널 입장 및 퇴장

# 계묘년 새해 복 많이 받으세요

 

 

※ 작성자가 작성한 내용이 일부 틀릴 수도 있음 주의

 

※ 작성자가 코드 쓰다가 계속 코드 수정함 주의

 

※ 이번꺼 내용물 매우 적음 주의

 

* 참고 사이트

https://lektion-von-erfolglosigkeit.tistory.com/96

 

디스코드 봇 만들기#11 - 음악 봇

드디어 방치해두었던 음악 봇을 다시 만들어보자 사실 디코에서 굳이 음악을 듣지 않아서 좀 밀렸다 저번에는 유튜브에서 youtube_dl을 이용해 파일을 다운로드 받고 ffmpeg로 mp3로 바꾼 뒤 그걸 봇

lektion-von-erfolglosigkeit.tistory.com

 

봇을 조금씩 만들고 있는데

 

친구들이 (정책에 의해) 죽어?버린 FredBot 같은 봇을 만들어달라고 했다.

 

그렇게 찾아보다가 이 글이 내가 원하는 것과 거의 일치한 것 같아서

 

참고를 하였다.

 

 

 

친구들한테 듣자하니 Youtube 정책에 의해 후원 등을 통해 영리적 이익을 얻는

 

유튜브를 이용한 봇들이 음성 채널에 음악을 트는 것이 막혔다고 한다.

 

나는 딱히 영리적인 목적으로 하려는 것이 아니라고 생각되어 하기로 했다.

 

* 혹시 관련 문제가 생길 경우, 특별한 공지 없이 글을 내릴 수도 있을지도 모르겠다.

 

 

 

음성 채널 입장

 

당연하지만, 일단은 참고 글의 코드를 거의 그대로 이용해보았다.

 

한 가지 에러가 떴다.

 

RuntimeError: PyNaCl library needed in order to use voice

 

 

해결된 이후에 오류 메시지를 다시 띄울 수 있는 방법이 귀찮아서 인터넷에서 비슷한 경우를 띄웠다.

 

단순히 PyNaCl 이 필요하다는 에러 메시지이기 때문에 cmd 를 켜고 (윈도우 왼쪽 아래에 입력하는 곳에 cmd)

 

 

pip install PyNaCl

 

 

이거를 쳐주자.

 

대소문자 구분이 있는지는 잘 모르겠고,

 

디코 봇 코드에 import 할 필요는 따로 없으니

 

다시 실행해주면 문제없이 잘 진행될 것이다.

 

 

 

 

그 외에 사용상에 문제가 전혀 없었고, 중복 사용의 경우 로그 상에서만 에러 메시지를 출력하고 (이미 참여로 인한)

 

기능상에 문제는 없어 입장 메시지만 추가하였다.

 

 

 

여기에는 간단하게 "명령어 입력자의 음성 채널을 불러온 것"에 대해서만 설명만 써놓겠다.

 

@bot.command()
async def play(message,*vars):

    if(len(vars)==0):
        channel = message.author.voice.channel
        await channel.connect()
        await message.channel.send("얼티메이트 봇 등장이요~~")

 

참고 글의 코드랑 차이점이 거의 없으며, 내 봇에 사용한 다른 함수와의 통일성을 위한 변수 이름 변경만 있다.

 

전에 썼다시피, message.channel.send() 를 통해 명령에 대한 답변을 "명령이 작성된 채널에 올렸다."

 

 

비슷하게, message 에는 메시지를 작성한 author (Member class) 에 대한 정보가 있고

 

이 멤버에는 voice (VoiceState class), 이어서 그 channel (VoiceChannel class) 에 대한 정보를 가진다.

 

최종적으로 그 VoiceChannel 에 connect 하여 "메시지를 작성한 인원의 음성 채널 정보를 가져와 접속" 하였다.

 

이런 정보에 대한 것들을 API Reference 를 통해 알아가면서 접근하면 이론상 다 할 수는 있다.

 

 

 

 

......너무나도 당연한 이야기를 하였지만, 

 

혹시나 더 무언가를 하고 싶지만, API Reference 를 잘 이용할 줄 몰라

 

누군가의 글만 따라하는 것에서 더 나아가는 방법을 적어두고자 작성하였다. 

 

API 버전 업으로 사용법 변경에 의한 오류의 해결과 함께

 

 

 

 

잡설이 길었다. 

 

 

 

 

 

음성 채널 퇴장

 

퇴장 또한 별게 아니다.

 

다만, VoiceChannel class 에는 disconnect() 가 없다.

 

VoiceClient class 에는 있다.

 

@bot.command()
async def stop(message):
    await bot.voice_clients[0].disconnect()
    await message.channel.send("수구바위~~")

 

bot 은 Client 에 기반을 두어, voice_clients list 를 가지며, 연결된 음성 채널 리스트를 가진다.

 

접속을 끊어주자.

 

 

 

 

오늘 하루를 마치며

 

연말연초라고 퍼질러 놀다보니 참고한 글에서 더 발전된 것은 없다.

 

내용에 대한 알맹이도 거의 없다.

 

지금은 더 나아가지 않았지만 후에 두 발짝 나아가기 위한 하루였다 생각하자.

 

 

 

자신감을 상실하지 않기 위한 정신승리는 필요하다. 화이팅

 

물론 커뮤니티식 "아무튼 내가 다 맞음"같은 정신승리는 해롭다.

 

 

 

728x90