이번 시간에는 지금까지 배운 것을 토대로, 방을 관리하고 유저 정보에 대해 파 해쳐 봅시다.
서버를 관리해보자!
일단 길드에 대해 파 해쳐 봅시다. 길드에 대한 발언은 저번 4편 강의에서 추후 진행한다고 했었습니다.
길드는 message.guild 혹은 client.get_guild(길드 ID)를 통하여 얻어내실 수 있으며, 이를 통하여 서버를 종합적으로 관리하는 기능이라고 보면 편합니다.
우선 서버명을 알아내는 방법은 (guild형 변수). name을 통하여 알아내실 수 있습니다. 텍스트 채팅 서버 말고 음성 채팅의 서버는 (guild형 변수). region를 통하여
코드 | 리턴값 | 설명 |
(guild형 변수).afk_timeout | 잠수 시간 | 잠수와 관련된 기능으로 afk_timeout는 몇 초후 초과할껏인지, afk_channel에는 잠수 채널에 대해 알아 보실수 있습니다. |
(guild형 변수).afk_channel | 잠수 채널 | |
(guild형 변수).icon | 아이콘 | icon은 서버의 아이콘을 값으로 불러옵니다. icon_url 경우 http형으로 불러오며, icon_url_as 의 경우 http 형으로 불러오면서 포맷을 설정해주실수 있습니다. 포맷의 경우 ‘webp’, ‘jpeg’, ‘jpg’, ‘png’, 'gif'로 설정해 주실수 있으며, gif 경우는 서버의 아이콘이 gif 일때만 가능합니다. |
(guild형 변수).icon_url | 아이콘 링크 | |
(guild형 변수).icon_url_as | 아이콘 링크(포맷 설정) | |
(guild형 변수).id | 서버 ID | 서버 ID를 불러옵니다. 이 ID는 client.get_guild(길드 ID) 이것을 사용할때 사용하는 길드 ID와 같습니다. |
(guild형 변수).owner | 서버 주인(author 값) | 이 2개의 명령어는 서버 주인을 확인하는 겁니다. owner를 할경우 서버 주인을 리턴하며, owner_id 할 경우 서버 주인의 ID를 불러옵니다. 물론, (guild형 변수).owner.id 를 통해서도 서버 주인의 ID를 불러올수 있습니다. |
(guild형 변수).owner_id | 서버 주인의 ID | |
(guild형 변수).verification_level | 서버 인증 단계 |
서버 인증단계를 VerificationLevel형으로 반환합니다. none 일 경우 인증단계가 존재하지 않는 것이고, low의 경우 이메일 인증이 완료된 상태, medium의 경우 5분 이상 인증된 상태이어야 하고, high의 경우 이메일 인증 5분 이상 및 길드 가입 10분 이상, extreme경우 최고 단계입니다. 물론 extreme에서는 상황에 따라, table_flip, double_table_flip, very_high 이 3개가 반환 되는 경우도 있다고 했으니, 참고하시기 바랍니다. |
(guild형 변수).premium_tier | 티어(int값으로 리턴) |
이 2개로 서버 부스트 단계를 알아낼수 있습니다. premium_tier의 값이 1일 경우 1단계이며, 최대 3까지 올라갑니다. premium_subscription_count 이거의 경우 부스트 개수를 알아낼 수 있습니다. |
(guild형 변수).premium_subscription_count | 부스트 개수 | |
(guild형 변수).channels | 채널 목록(리스트) | 채널 목록을 리스트 값으로 반환합니다. |
(guild형 변수).voice_client | 접속중인 채널 | 현재 접속중인 음성 채널을 불러옵니다. 이를 통해 play() 등을 활용하여 음악을 재생할수 있습니다. |
(guild형 변수).voice_channels | 음성 채널 목록 | 각 종류별로 채널목록을 리스트로 리턴합니다. |
(guild형 변수).text_channels | 텍스트 채널 목록 | |
(guild형 변수).categories | 카테고리 목록 | |
(guild형 변수).get_channel(채널 ID) | 채널 |
채널 ID를 입력하면, 채널값을 불러옵니다. 이를 통해 send()를 사용하여 메시지를 보낼 수도 있습니다. 이에 대한 자세한 정보는 4편을 참조하시면 되겠습니다. |
(guild형 변수).system_channel | 시스템 채널 | 시스템 채널를 리턴합니다. 시스템 채널로는 만약 유저가 접속했을때 뜨는 그런 메세지를 보내는 채널을 말하며, 서버 설정을 통하여 설정하실수 있습니다. |
(guild형 변수).emoji_limit | 이모지 최대 갯수 | 서버의 각 한도를 리턴합니다. 이모지와 음성채널, 업로드 크기 한도의 조정은 니트로 서버 부스트를 통하여 할수 있습니다. |
(guild형 변수).bitrate_limit | 음성채널 비트레이트 한도 | |
(guild형 변수).filesize_limit | 업로드 크기 한도 | |
(guild형 변수).roles | 역할 목록 | 역할을 리턴합니다. 역할ID의 경우 서버 설정에서 역할 우클릭을 하셔서 얻어 낼수 있습니다(PC기준) |
(guild형 변수).get_role(역할 ID) | 특정ID에 대한 역할 | |
(guild형 변수).default_role | 기본 역할 | 기본 역할을 리턴합니다. 대부분의 서버는 @everyone을 리턴할껍니다. |
(guild형 변수).premium_subscribers | 서버 부스트한 사람들(리스트) | 서버 부스트한 사람들을 리스트로 불러옵니다. |
(guild형 변수).is_icon_animated | 아이콘 GIF 유/무 | 아이콘이 애니메이션화 되있는지 유무를 True와 False값으로 불러옵니다. |
(guild형 변수).banner_url | 배너 링크 |
서버 배너의 값을 링크로 리턴합니다. banner_url_as에서는 ‘webp’, ‘jpeg’,‘png'의 3가지로 불러올수 있습니다. |
(guild형 변수).banner_url_as() | 배너 링크(포맷 설정) | |
(guild형 변수).splash_url | 스플레시 링크 | 서버 스플레시(?)의 값을 링크로 리턴합니다.splash_url_as에서는 ‘webp’, ‘jpeg’,‘png'의 3가지로 불러올수 있습니다. 포맷의 경우 ‘webp’, ‘jpeg’, ‘jpg’, ‘png’로 불러올수 있습니다. |
(guild형 변수).splash_url_as() | 스플레시 링크(포맷 설정) | |
(guild형 변수).member_count | 멤버수 | 멤버수를 반환합니다. |
(guild형 변수).created_at | 생성일 | 서버 생성일을 반환합니다. |
(guild형 변수).get_member_named(이름) | 특정 유저 값 | 이름에 해당 유저 명을 입력하면, 유저에 대한 값이 리턴됩니다. |
(guild형 변수).emojis | 이모지 목록(리스트) | 이모지들을 리스트로 변환합니다. |
이렇게 코루틴이 아닌 일반형으로 길드의 값을 모두 적어봤는데요. 생각보다 매우 많습니다. 이제는 코 루틴을 사용한 서버 서버 관리에 대해 알아보겠습니다. 코루틴을 사용해서는 특정 유저를 밴하거나, 킥, 채널 생성, 카테고리 생성의 작업을 하실 수 있습니다.
await (guild형 변수).leave()
우선 leave() 입니다. 이를 통해, 봇이 서버를 나가게 하실 수 있습니다.
await (guild형 변수).edit(변경할인자=변경할내용,reason=변경한 사유)
이를 사용할 경우에는 방의 설정을 변경해 주실 수 있습니다. 이 중에서 변경할 인자로는, 서버명(name), 음성채팅 국가(region), banner, splash, icon을 바이트로 주시면 위들 또한 변경 가능합니다.
또한, afk_channel, afk_timeout을 통한 잠수 채널 설정도 가능합니다.
await (guild형 변수).create_text_channel(name, overwrites=None, category=None, reason=None)
이를 사용 시에는 텍스트 채널을 생성합니다. overwrites값에는 채널을 설정하는 권한이 주어집니다.
overwrites = {
(guild형 변수).default_role: discord.PermissionOverwrite(read_messages=False),
(guild형 변수).me: discord.PermissionOverwrite(read_messages=True)
}
channel = await (guild형 변수).create_text_channel('secret', overwrites=overwrites)
위 와같이 채널 권한 설정도 가능합니다. channel 값에는 새로 생성된 채널 값이 반환됩니다.
await (guild형 변수).create_voice_channel(name,overwrites=None, category=None, reason=None)
이를 사용 시에는 음성 채널을 만듭니다. overwrites에는 전에 설정했던 퍼머션등을 설정해주실 수 있습니다. 이외에 비트레이트(bitrate)를 통해 그 서버 최대 비트레이트까지 설정해주실 수 있습니다. 또한 최대 유저수(user_limit)를 통해 유저 수도 설정할 수 있습니다.
await (guild형 변수).create_category(name, overwrites=None, reason=None)
이 기능을 사용 시에는 카테고리를 생성합니다. overwrites에는 전에 설정했던 퍼머션등을 설정해주실 수 있습니다.
await (guild형 변수).create_category_channel(name, overwrites=None, reason=None)
이 기능은 아까 await create_text_channel(name, overwrites=None, category=None, reason=None)에서 카테고리를 설정한 상태의 기능과 똑같다고 보시면 됩니다. 대신 카테고리도 같이 만들어진다는 차이점이 있습니다.
이렇게 설명해드린 코 루틴 명령어들은 모두 방 채널 관련 명령어였습니다.
await (guild형 변수).bans()
이제 이 코드를 작성하면, 밴(차단) 리스트를 확인하실 수 있습니다.
await (guild형 변수).webhooks()
위에는 밴 목록을 본다면 이건, 웹 훅 목록을 확인하실 수 있습니다.
await (guild형 변수).invites()
위 코드는 위 두 가지가 웹 훅과 밴 리스트를 불러온다고 하면, 이건 초대 목록을 불러옵니다.
await (guild형 변수).create_custom_emoji(name, image, roles=None, reason=None)
이제 커스텀 이모지를 추가할 수도 있습니다. 이미지에는 discord.Files를 사용한 값을 넣어주시면 됩니다. 이 와중에 커스텀 이모지를 제거하는 방법은 아직 확인하질 못했습니다.
await (guild형 변수).create_role(규칙명, reason=None)
이를 사용해서 역할도 봇으로 만드실 수 있습니다. 이 또한 규칙을 제거하는 방법은 아직 발견하지 못했습니다. 인자 중에 permissions를 사용하여, 권한 설정해주실 수 있으며, colour를 사용하여, 색상을 지정할 수도 있습니다.
await (guild형 변수).kick(user, reason=None)
await (guild형 변수).ban(user, reason=None, delete_message_days=1)
await (guild형 변수).unban(user, reason=None)
위 3개의 명령어를 통하여, 킥, 밴, 언밴을 할 수 있습니다. 이중 밴에서는 delete_message_days를 통해 삭제할 메시지를 며칠부터 보낸 메시지를 삭제한 지 설정해주실 수 있습니다. 일반적으로 밴하면 저기능은 없던데, 여기서는 저기능이 있으니 신기하네요.
이렇게 방 관리하는 방법에 대해 알아보았습니다.
텍스트 방을 관리해보자!
이제는 텍스트 방에 대해 관리를 해봅시다. 텍스트 방의 대한 변수는 message.guild.get_channel(텍스트 채널 ID), message.channel를 통하여, 얻어낼 수 있습니다.
일단 코 루틴이 아닌 돌아오는 값들만 읽을 수 있는 것들만 표로 적어보겠습니다.
코드 | 리턴값 | 설명 |
(channel형 변수).name | 채널명 | 채널명이 리턴됩니다. |
(channel형 변수).guild | 채널의 서버 | 이 채널이 소속된 서버값이 리턴됩니다. 이 리턴값은 아까 "서버에 대해 알아보자"에 대한 설명한 값과 똑같습니다. |
(channel형 변수).id | 채널 ID | 채널 ID가 반환됩니다. |
(channel형 변수).category | 카테고리 | 채널의 카테고리와 카테고리 ID가 반환됩니다. |
(channel형 변수).category_id | 카테고리 ID | |
(channel형 변수).topic | 주제 | 채널의 주제(설명)이 반환됩니다. |
(channel형 변수).last_message_id | 마지막 메세지 ID | 채널의 마지막 메세지를 반환하며, 마지막 메세지의 값은 4편에서 진행한 값과 동일합니다. 또한 last_mesage_id를 사용하여 그 메세지의 ID를 얻어낼수 있습니다. |
(channel형 변수).last_message | 마지막 메세지 | |
(channel형 변수).slowmode_delay | 슬로우다운 딜레이 걸린시간 | 슬로우 다운이 되어 있다는 그 초를 리턴합니다. 만약에 슬로우 다운이 비활성화 되있다면, 0이라는 값을 반환하게 됩니다. |
(channel형 변수).type | 채널 유형 | 채널 유형을 반환하게 되지만 저희가 알아보는것은 텍스트 유형이기 때문에 TextChannel 이라고 반환될껏입니다. |
(channel형 변수).members | 채널에 소속된 멤버목록 | 해당 방을 보고있는 멤버를 리스트로 불러옵니다. 만약에 메세지 읽기와 기록보기 권한이 없을 경우 이 리스트에 포함되지 않습니다. |
(channel형 변수).is_nsfw() | nsfw 여부 | nsfw 여부를 True와 False 값으로 반환합니다, |
(channel형 변수).is_news() | 뉴스 설정 여부 | 뉴스 설정 여부를 True와 False값으로 반환한다는 말이긴 합니다. 그러나, 실제로 디스코드에서는 팀에 소속된 개발자외에는 설정할수는 없는 기능입니다. |
(channel형 변수).created_at |
채널 생성일 | 채널 생성일을 datetime 값으로 반환합니다. |
(channel형 변수).mention | 채널 맨션 | 채널 맨션을 반환합니다. "#채널명" 해당값을 반환하는것과 비슷한것입니다. |
이렇게 일단 코 루틴을 사용하지 않은 값들을 모두 작성해보았습니다. 이제부터 작성하는 것은 삭제에 관련된 코 루틴 함수 혹은 메시지 보내기, 채널 관리 외에는 존재하지 않습니다. 처음에는 삭제에 관련된 게 더 많은 줄 알았지만 관리하는 것이 더 많네요.
await (channel형 변수).edit(변경할인자=변경할내용,reason=변경한 사유)
일단 채널에 대한 변 집부터 알아보겠습니다. 변경할 인자에는 name을 통해 이름을 변경할 수도 있고, topic을 통해 설명을 변경할 수도 있습니다. nsfw에 True를 통해 nsfw를 설정할 수도 있습니다. category를 통하여, 카테고리 설정도 가능하며, slowmode_delay를 통하여 지연 채팅을 거실 수도 있습니다.
await (channel형 변수).send("내용")
이건 메시지를 보내는 것이며, 2편과, 4편에서 모두 서술된 사용법입니다.
2020/03/28 - [디스코드봇(파이썬) 강좌] - 디스코드봇(파이썬) 02 | 기본적인 내용을 주고 받자.
2020/04/04 - [디스코드봇(파이썬) 강좌] - 디스코드봇(파이썬) 04 | 디스코드봇으로 파일,TTS를 사용하거나 올리자.
자세한 정보가 궁금하시다면 위 2개의 강좌를 다시 보시는 것을 추천드립니다.
이제 2개는 모두 익숙하실 겁니다. 하나는 위에서 진행했던 것과 비슷하며 하나는 2편과 4편에서 다루었기 때문입니다.
이제부터는 다른 코 루틴 코드도 알아볼 것입니다.
await (channel형 변수).clone(name=None, reason=None)
일단 clone입니다. clone의 경우 채널을 복제하는 것입니다. 이 경우 discord.py가 패치되면서 추가된 기능인데, 의외로 편합니다. 그냥 방을 봇으로 만드는 게 더 편해질 정도.
await (channel형 변수).set_permissions(target, overwrite=see-below, reason=None, permissions)
채널 권한을 설정하실 수 있습니다. 물론 overwrites_for(obj)를 통해서도 정하 실수 있지만, set_permissions를 사용하는 것이 더 편합니다.
await (channel형 변수).invites()
await (channel형 변수).pins()
각각 2개는 모두 목록으로 돌아옵니다. invites의 경우 아까의 guild invite와 달리, 이 방으로 초대되는 링크를 불러옵니다. pins의 경우 이 채널에서 고정된 메시지를 불러옵니다.
await (channel형 변수).create_invite()
이 채널에 대한 초대를 만듭니다. 이에 인자로 max_age를 주어서, 최대 사용 날짜를 설정하고, max_uses를 통하여 최대 사용 횟수를 정해줄 수도 있습니다.
await (channel형 변수).delete()
이를 사용하면, "메시지"를 삭제하는 것이 아닌, "채널"을 삭제하게 됩니다.
await (channel형 변수).webhooks()
await (channel형 변수).create_webhook(name, avatar=None, reason=None)
이 2개를 사용해서 웹 훅을 확인할 수 있습니다.
webhooks에는 이 채널에 대한 웹 훅을 확인하며, create_webhook는 웹후크를 새로 구독하는 것입니다.
await (channel형 변수).delete_messages(messages)
이를 사용해서, 아까 delete는 채널을 삭제하는 것과는 달리 이는 메시지를 삭제합니다. messages에 메시지 값을 리스트형으로 주면 그 메시지를 삭제합니다.
이제 대망의 메세지를 대량으로 삭제하는 것입니다. 거의 대부분의 유저들은 이 기능을 찾기 위해서 많은 강좌를 본다고 들었습니다.
await (channel형 변수).purge(limit=(int형의 삭제할 메세지 갯수))
이를 사용하면, 메시지를 대량으로 삭제할 수 있습니다. 이를 YBOT에서는 아래의 코드처럼 응용하였습니다.
if message.content.startswith('=청소'):
try:
amount = list_message[1]
except:
embed = discord.Embed(title="Ybot helper",description="=청소 [갯수]로 사용하실수 있습니다.", color=0x00aaaa)
await message.channel.send(embed=embed)
return
try:
await message.channel.purge(limit = int(amount))
embed = discord.Embed(title="청소!",description=str(message.author) + "에의해" + amount + '개가 청소되었습니다.', color=0x00aaaa)
await message.channel.send(embed=embed)
return
except discord.Forbidden:
embed = discord.Embed(title="Ybot helper",description=str(message.channel) + "의 권한이 부족합니다.\nYBOT '메세지 관리'권한을 부여해주세요.", color=0x00aaaa)
await message.channel.send(embed=embed)
return
except:
embed = discord.Embed(title="Ybot helper",description="올바른값을 입력하세요.", color=0x00aaaa)
await message.channel.send(embed=embed)
return
=청소라는 명령어가 단독적으로 들어오면 사용법을 알려줍니다. 만약에 숫자가 들어온다면, "누구에 의해 몇 개가 삭제되었습니다."라고 반환합니다. 물론 여기서 봇이 메시지 관리 권한이 없을 경우에는 예외 값으로 discord.Forbidden이라는 것이 반환되게 됩니다. 이럴 경우 권한이 부족하다고 통보하게 되며
이외에 except의 경우는 int에서 발생하는 오류로 간주하고, 올바른 값을 입력해 달라고 적용하였습니다.
실제로 위와 같이 청소를 사용 후에는 뜨게 됩니다. 이 와중에 베타 테스트로 시행한 건 안 비밀
이상으로 7편의 강좌를 마칩니다. 이번 강의는 사실 지난주에 올라가려고 했으나, 여러모로 복잡한 일이 계속 생기고 일도 꼬이고... 해야 할 건 많아서... 무려 지연된 상태에서 업로드 되게 됐습니다. 앞으로 더 이럴 것 같긴 합니다만 최대한 일정에 맞추도록 노력하겠습니다. 또한 업로드 시간을 기존 "토요일 12시"를 기점으로 잡았었지만, "일요일 12시"로 잡아보도록 하겠습니다. 이상으로 강의를 마치며, 다음에는 봇으로 역할에 대해 다루어 보겠습니다.
'미사용 > (舊)디스코드봇 강좌' 카테고리의 다른 글
디스코드봇(파이썬) 09 | 이모지,반응을 달아보자. (462) | 2020.05.17 |
---|---|
디스코드봇(파이썬) 08 | 역할관리 해보자! (857) | 2020.05.10 |
디스코드봇(파이썬) 06 | discord.py의 이벤트함수를 알아보고 서로 상호작용을 해보자. (27) | 2020.04.18 |
디스코드봇(파이썬) 05 | 메세지의 특정부분만 읽어보자. (0) | 2020.04.11 |
디스코드봇(파이썬) 04 | 디스코드봇으로 파일,TTS를 사용하거나 올리자. (4) | 2020.04.04 |