미사용/(舊)디스코드봇 강좌

디스코드봇(파이썬) 04 | 디스코드봇으로 파일,TTS를 사용하거나 올리자.

건유1019 2020. 4. 4. 12:00

이번에는 2편과 3편에서 사용한 것을 포함해서, 더욱 자세히 알아볼 것 중 하나입니다.

2편과 3편에서 중요하지만 크게 설명하지 않았던, 메시지 보내는 기능입니다!

await message.channel.send("메세지 내용")

이것이 아무리 간단하다고 보여도 잘쓰면 중요한 기능 중 하나가 됩니다. 오늘은 이것에 대해 자세히 파해 쳐봅시다.


기본적인 메세지 전송하기!

사실 저 기능의 기본적인 기능은 "메시지 내용"을 보내는 것입니다.

매우 간단하면서도 활용도가 넓은 기능중 하나.

이것을 이용해서 여러분들 디스코드 기본 기능들을 쓸 수 있는 것 아시나요?

(좌) ~~내용~~ (중앙) **내용** (우) > 내용

 

사실 이건 진짜 간단한 기능이니, 여기까지만 적고 pass 하겠습니다.


Embed 사용

이것은 지난 3편 강좌에서 진행한것을 보고 오시면 잘 아실 겁니다.

embed 사용.

이것 또한 지난 강좌에서 진행하였으니 pass 하도록 하겠습니다.

안 보고 오셨다면 3편 강좌를 보고 오는 것을 추천드립니다 [디스코드 봇(파이썬) 03 | Embed를 사용해보자.]


TTS 사용

물론 우리는, "/tts (메시지)"를 사용하지만, 봇은 저렇게 해서 tts를 사용할 수 없습니다. 따라서 discord.py는 따로 사용법이 존재합니다. 코드를 위와 같이 수정해보세요!

await message.channel.send("이것은 TTS 테스트라고 합니다!",tts=True)

그러면 이제 TTS가 "이것은 TTS 테스트라고 합니다"라고 읽을 겁니다. 사실 여기까지도 간단하니 pass 하도록 하겠습니다. (아니 이러다 다 패스 하겠네...)


파일 업로드!

디스코드 봇을 통해 embed 사용하지 않고 사진, 동영상, 음악, 파일을 올릴 수 있는 것을 아시나요? 바로 discord.File를 사용하면 됩니다. 한번, File이라는 코드를 만들어 봅시다.

 

(원도우 기준)

import os #import discord 아래에 추가해 줍니다.

dirctory = os.path.dirname(__file__) #이곳부턴 기존 if문 내에 추가해 주시면 됩니다.
file = discord.File(dirctory + "\\text.txt")

리눅스는 '\'로 인식하는 것이 아닌 '/'로 경로를 설정하므로 다르게 적어주십니다.

 

(리눅스 기준)

import os #import discord 아래에 추가해 줍니다.

dirctory = os.path.dirname(__file__) #이곳부턴 기존 if문 내에 추가해 주시면 됩니다.
file = discord.File(dirctory + "/text.txt")

가끔은, 저렇게 해도 안 먹는 경우가 있습니다. 그럴 땐 실행 위치가 다른 것으로 직접 경로를 정해주는 것이 편합니다.

경로를 직접 정할 땐 굳이 import os와, os.path 쓰지 않고, 아래의 코드처럼 수정해주시면 됩니다.

file = discord.File("/home/pi/Desktop/텍스트.txt") #리눅스 경우 위와같이 작성

위와 같이 경로를 직접 적어주시면 됩니다.

await message.channel.send(file=file)

그리고 위 코드를 추가해주시면 파일을 출력할 수 있습니다.

또한, list 형식을 활용하여 file을 여러 개 올릴 수도 있습니다.

file = ["",""]
file[0] = discord.File("/home/pi/Desktop/텍스트1.txt")
file[1] = discord.File("/home/pi/Desktop/텍스트2.txt")
await message.channel.send(files=file)

위 내용과 같이 수정해주시면 파일을 한 번에 업로드할 수 있으며, 아래의 코드처럼 작성하면 파일을 보내면서 내용도 전달할 수 있습니다.

file = discord.File("/home/pi/Desktop/텍스트.txt")
await message.channel.send("메세지 내용",file=file)

(좌) txt파일 업로드 (우) mp3파일 업로드

 

(좌) mp4파일 업로드 (우) png파일 업로드

위 사진별로 파일 종류별로 디스코드가 올려줍니다.

 

아래의 코드처럼 해주시면, 저 파일들도 스포일러를 걸 수 있습니다.

file = discord.File("/home/pi/Desktop/텍스트.txt",spoiler=False)
await message.channel.send(file=file)

스포일러 걸었을 경우

스포일러는 영상, 음악, 파일, 사진에 모두 다 걸 수 있습니다.


메시지를 관리하기!

이제 저 보낸 메시지를 관리해봅시다.

msg = await message.channel.send("메세지 내용")

이렇게 하면 msg라는 변수 안에 저 내용이 전달되고 message라는 인자로 저장됩니다.

이제 저것을 응용해서 여러 가지 짓을 할 수 있습니다. 또한 on_message에서 들어오는 message값도 msg값과 똑같이 사용할 수 있습니다!

 

일단, 기본적으로 인자가 돌아오는 명령어부터 알아보겠습니다.

(message 형의 변수).jump_url ▷ 이렇게 하면 링크를 주는데 이링크를 클릭하면 저 내용으로 이동시켜줍니다.

(message 형의 변수).tts ▷ TTS 여부를 bool(True/False) 값으로 반환합니다

(message 형의 변수).content ▷ 메시지 내용을 반환합니다.

(message 형의 변수).author ▷ 메시지 보낸 자를 author 값으로 반환합니다. author 값을 str로 변환하면 유저명을 볼 수 있습니다.

(message 형의 변수).guild  메시지 보낸 서버값을 변환합니다. str로 전환하면 서버명을 확인할 수 있습니다.

(message 형의 변수).channel   메세지 보낸 채널 값을 변환합니다. str로 전환하면 채널명을 확인할 수 있습니다

(message 형의 변수).embeds 만약 로그를 기록할 때, embed가 사용됐을 경우 아래의 리스트에 들어갑니다.

(message 형의 변수).mention_everyone ▷ 에브리원이 사용됐는지의 값을 bool(True/False)값으로 반환합니다

(message 형의 변수).mentions ▷ 맨션 한 사람을 리스트 값으로 반환합니다. ex:) @유저

(message 형의 변수).channel_mentions ▷ 맨션 한 채널을 리스트 값으로 반환합니다. ex:) #채널

(message 형의 변수).role_mentions ▷ 맨션 한 역할을 리스트 값으로 반환합니다. ex:) @권한

(message 형의 변수).id ▷메시지 ID를 반환합니다. 이것은 예전에 get_message로 사용됐지만 지금은 제거됐으므로 다루지 않겠습니다.

(message 형의 변수).pinned ▷ 핀 여부의 값을 bool(True/False)값으로 반환합니다.

(message 형의 변수).reactions ▷ 메시지에 반응이 달릴 경우 이곳을 통해 리스트로 반환됩니다.

(message 형의 변수).created_at ▷ 메시지가 작성된 시간을 반환합니다.

(message 형의 변수).edited_at ▷ 메시지가 수정된 시간을 반환합니다.

 

(message 형의 변수) 이곳에는 아까 선언한 msg나 on_message(message)의 message를 넣어주시면 됩니다.

이 여러 개 기능 중 edited_at,pinned,reactions 이 값들은 실시간으로 message가 반영되는 것이 아니므로, None 혹은 [] 값이 반환될 수 있습니다. 또한 author, channel, guild의 관련 내용은 추후 강의를 작성할 예정입니다.. 

 

이제 코루틴(비동기)를 활용한 기능들을 알아봅시다. 이 내용은 저것처럼 한 줄 내로 넣을 수 없고 따로 해주셔야 합니다.

await (message 형의 변수).pin()

메시지를 고정합니다.

await (message 형의 변수).unpin()

메세지 고정을 해제합니다.

await (message 형의 변수).delete()

메세지를 삭제합니다. 이것 다량의 메세지를 삭제하는 그런 것이 아닙니다. 단지 "그 내용"만 삭제시킬 수 있습니다.

await (message 형의 변수).edit("수정할 내용")

메세지를 수정합니다. edit은 또한 위에서 설명했듯이, content, embed의 두 가지로 넣어주실 수 있습니다. 물론, file를 수정할 순 없습니다.

await (message 형의 변수).add_reaction(emoji)

이렇게 하면 반응을 추가해주실 수 있습니다. emoji 값에는 본인이 직접 이모지를 넣어주셔도 됩니다. 그러나 IDLE에서는 글씨가 깨지거나 오류가 발생할 수 있습니다. 

await (message 형의 변수).clear_reaction(emoji) #특정 반응만 제거
await (message 형의 변수).clear_reactions() #모든 반응 제거

emoji에 관련 댄 반응을 했을 경우 그 반응을 모두 제거합니다. 두번째꺼를 했을 경우에는 모든 반응이 제거됩니다.


오늘은 꽤 복잡하지만 중요한 것을 다루어 보았습니다. 다음에는 slice와 split을 활용한 특정 부분만 읽기에 대해 알아보겠습니다.