Skip to content

Commit

Permalink
New post
Browse files Browse the repository at this point in the history
  • Loading branch information
sunwoo-j committed May 29, 2024
1 parent 3ebf8f0 commit 49a213d
Show file tree
Hide file tree
Showing 15 changed files with 258 additions and 211 deletions.
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -21,4 +21,5 @@ package-lock.json
!.vscode/settings.json
!.vscode/extensions.json

# Misc
# Draft
_draft
197 changes: 0 additions & 197 deletions _drafts/2024-05-24-discord-bot-3.md

This file was deleted.

20 changes: 20 additions & 0 deletions _drafts/2024-05-27-discord-bot-4.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
---
title: 디스코드 봇 DIY - 4. 유저 데이터베이스
date: 2024-05-28 14:50:38 +/-TTTT
lastmod: 2022-05-28 14:50:38 +/-TTTT
categories: [Python, discord.py]
tags: [python, discord, bot, database]
description: 엑셀 파일로 유저 정보 등록하고 관리하기
---

> 이 글에서 다루는 내용
> - 이벤트 종류 이해하기
> - 새로운 멤버가 들어올 때 환영 DM 보내기
> - 채널
##

사용자별로 자금이 있고 그

데이터베이스를

6 changes: 3 additions & 3 deletions _layouts/archives.html
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@

{% include lang.html %}

{% assign df_strftime_m = site.data.locales[lang].df.archives.strftime | default: '/ %m' %}
{% assign df_dayjs_m = site.data.locales[lang].df.archives.dayjs | default: '/ MM' %}
{% assign df_strftime_m = site.data.locales[lang].df.archives.strftime | default: '%m/' %}
{% assign df_dayjs_m = site.data.locales[lang].df.archives.dayjs | default: 'MM/' %}

<div id="archives" class="pl-xl-3">
{% for post in site.posts %}
Expand All @@ -23,10 +23,10 @@

<li>
{% assign ts = post.date | date: '%s' %}
<span class="date day" data-ts="{{ ts }}" data-df="DD">{{ post.date | date: '%d' }}</span>
<span class="date month small text-muted ms-1" data-ts="{{ ts }}" data-df="{{ df_dayjs_m }}">
{{ post.date | date: df_strftime_m }}
</span>
<span class="date day" data-ts="{{ ts }}" data-df="DD">{{ post.date | date: '%d' }}</span>
<a href="{{ post.url | relative_url }}">{{ post.title }}</a>
</li>

Expand Down
10 changes: 5 additions & 5 deletions _posts/2024-05-22-discord-bot-1.md
Original file line number Diff line number Diff line change
Expand Up @@ -150,9 +150,9 @@ async def on_message(message):
client.run('your token here')
```

코드를 보면 `client`를 먼저 설정하고 `on_ready()``on_message()`라는 `event`들에 대한 event handler를 지정한 것을 볼 수 있다. 여기서 말하는 `event` 메시지 전송이나 유저 밴, 길드 채널 생성과 같은 특이사항이 발생했을 때 디스코드가 보내는 일종의 데이터라고 보면 된다. `on_ready()`는 그중 `Client`가 디스코드와의 연결을 성공했을 때 보내지는 `event`, 코드에서 설정한 `client`가 다음 명령을 받아들일 준비가 되었을 때 호출된다고 보면 된다. `on_message()`는 마찬가지로 메시지가 전송됐을 때 발동되는 함수이다.
코드를 보면 `client`를 먼저 설정하고 `on_ready()``on_message()`라는 **이벤트(event)**들에 대한 event handler를 지정한 것을 볼 수 있다. 여기서 말하는 이벤트는 메시지 전송이나 유저 밴, 길드 채널 생성과 같은 상황이 발생했을 때 디스코드가 보내는 일종의 데이터라고 보면 된다. `on_ready()`는 그중 `Client`가 디스코드와의 연결을 성공했을 때 보내지는 이벤트로, 코드에서 설정한 `client`가 다음 명령을 받아들일 준비가 되었을 때 호출된다고 보면 된다. `on_message()`는 마찬가지로 메시지가 전송됐을 때 발동되는 함수이다.

> `discord.py`에서 다루는 `event` 목록은 [여기서](https://discordpy.readthedocs.io/en/latest/api.html?highlight=event#discord-api-events) 확인할 수 있다.
> `discord.py`에서 다루는 이벤트 목록은 [여기서](https://discordpy.readthedocs.io/en/latest/api.html?#discord-api-events) 확인할 수 있다.
{: .prompt-info}

하지만 이 코드만 가지고 내 봇을 콕 집어 실행시킬 수 없는데, 이때 필요한 것이 내 봇의 **토큰(token)**이다. 토큰은 봇의 고유 식별자로, 봇이 디스코드 API와 통신을 주고받는 데에 꼭 필요하다.
Expand All @@ -167,7 +167,7 @@ client.run('your token here')

![](/assets/img/discord bot/1_21.png)

새로 발급된 토큰은 생성됐을 때만 노출되고 페이지를 새로고침하면 사라지게 된다. 그렇기 때문에 <kbd>Copy</kbd>로 복사해 주고 어딘가 안전한 곳에 저장해야 한다. 토큰을 잊어버렸다면 다시 <kbd>Reset Token</kbd>으로 재발급해야 한다.
새로 발급된 토큰은 생성됐을 때만 노출되고 페이지를 새로고침하면 사라지게 된다. 그렇기 때문에 <kbd>Copy</kbd>로 복사해 주고 어딘가 안전한 곳에 저장해야 한다. 토큰을 잃어버렸다면 다시 <kbd>Reset Token</kbd>으로 재발급해야 한다.

> **이 토큰은 봇의 권한을 총괄하는 비밀번호와 같으므로, 절대 공유해서는 안 된다.**
{: .prompt-danger }
Expand All @@ -176,7 +176,7 @@ client.run('your token here')

![](/assets/img/discord bot/1_22.png)

[Intents](https://discord.com/developers/docs/topics/gateway#gateway-intents)는 디스코드가 보내는 `event` 종류를 설정하는 값들인데, 민감한 정보를 담고 있는 `GUILD_PRESENCES`, `GUILD_MEMBERS`, `MESSAGE_CONTENT` 등의 Privileged Gateway Intents는 기본적으로 접근이 막혀있기 때문에 접근을 허용해 주어야 한다. 스크롤을 내려 **Privileged Gateway Intents** 섹션에서 모든 intent를 활성화시키고 <kbd>Save Changes</kbd>를 눌러 저장해 주자.
[Intents](https://discord.com/developers/docs/topics/gateway#gateway-intents)는 디스코드가 보내는 이벤트의 종류를 설정하는 값들인데, 민감한 정보를 담고 있는 `GUILD_PRESENCES`, `GUILD_MEMBERS`, `MESSAGE_CONTENT` 등의 Privileged Gateway Intents는 기본적으로 접근이 막혀있기 때문에 접근을 허용해 주어야 한다. 스크롤을 내려 **Privileged Gateway Intents** 섹션에서 모든 intent를 활성화시키고 <kbd>Save Changes</kbd>를 눌러 저장해 주자.

> 나중에 봇이 100개 이상의 서버에 추가되면 디스코드에서 Intents 활용이 적합한지 심사하게 된다.
{: .prompt-info}
Expand All @@ -185,7 +185,7 @@ client.run('your token here')
intents = discord.Intents.all()
```

모든 intent를 활성화시켰기 때문에 코드에서 `discord.Intents.default()``discord.Intents.all()`로 바꿔주었다. 이제 코드에서 `your token here` 대신 발급받은 토큰을 붙여넣기하여 실행시켜보자.
모든 intent를 활성화시켰기 때문에 코드에서 `discord.Intents.default()``discord.Intents.all()`로 바꿔주었다. 이러면 앞으로 intent 권한 때문에 고통받을 일은 없다. 이제 코드에서 `your token here` 대신 발급받은 토큰을 붙여넣기하여 실행시켜보자.

![](/assets/img/discord bot/1_23.png)

Expand Down
10 changes: 5 additions & 5 deletions _posts/2024-05-24-discord-bot-2.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ date: 2024-05-24 11:07:32 +/-TTTT
lastmod: 2022-05-24 22:57:40 +/-TTTT
categories: [Python, discord.py]
tags: [python, discord, bot, exception]
description: 확장 라이브러리로 명령어 설정하기
description: discord.ext.commands로 명령어 설정하기
---

> 이 글에서 다루는 내용
Expand All @@ -14,7 +14,7 @@ description: 확장 라이브러리로 명령어 설정하기
## Bot과 확장 라이브러리

`Bot`은 앞서 본 `Client`의 기능들을 상속받는 일종의 subclass이다. `Client`만 활용해서 봇을 개발할 수도 있겠지만, `Client`event를 일일이 지정해 줘야 한다는 단점이 있다. 쉽게 말해 번거롭다는 뜻이다. 이와 같은 단점들을 보완하기 위해 `discord.py`는 확장 라이브러리인 `discord.ext`(extension)을 포함하고 있다. 이 라이브러리에 `Bot`이 들어있는데, 편리성을 위해 만들어진 만큼 비교적 간편하게 명령어를 추가할 수 있다.
`Bot`은 앞서 본 `Client`의 기능들을 상속받는 일종의 subclass이다. `Client`만 활용해서 봇을 개발할 수도 있겠지만, `Client`이벤트를 일일이 지정해 줘야 한다는 단점이 있다. 쉽게 말해 번거롭다는 뜻이다. 이와 같은 단점들을 보완하기 위해 `discord.py`는 확장 라이브러리인 `discord.ext`(extension)을 포함하고 있다. 이 라이브러리에 `Bot`이 들어있는데, 편리성을 위해 만들어진 만큼 비교적 간편하게 명령어를 추가할 수 있다.

### 1. Bot으로 명령어 추가하기

Expand Down Expand Up @@ -84,7 +84,7 @@ async def hello(ctx):
bot.run(TOKEN)
```

두 코드 모두 동일하게 작동한다. 자세히 들여다보면 `on_message()` 대신에 `Command`를 활용한 것을 볼 수 있다. `Client`를 사용할 때는 텍스트로 함수를 호출하기 위해서 `on_message()`라는 `event` 특정해 줘야 했지만, `Command`를 활용하면 `event` 따로 설정할 필요 없이 바로 명령어가 인식되는 모습이다. Decorator에서 `name='hello'`parameter를 지정했기 때문에 `command_prefix``name`이 합쳐진 `$hello`를 입력하면 연결된 함수가 호출된다.
두 코드 모두 동일하게 작동한다. 자세히 들여다보면 `on_message()` 대신에 `Command`를 활용한 것을 볼 수 있다. `Client`를 사용할 때는 텍스트로 함수를 호출하기 위해서 `on_message()`라는 이벤트를 특정해 줘야 했지만, `Command`를 활용하면 이벤트를 따로 설정할 필요 없이 바로 명령어가 인식되는 모습이다. Decorator에서 `name='hello'`argument를 지정했기 때문에 `command_prefix``name`이 합쳐진 `$hello`를 입력하면 연결된 함수가 호출된다.

> **`ctx`**는 명령어를 실행한 사람이 누군지와 어떤 채널에서 입력됐는지 등의 [context 정보](https://discordpy.readthedocs.io/en/latest/ext/commands/commands.html#invocation-context)를 담고 있다.
{: .prompt-info}
Expand All @@ -99,7 +99,7 @@ bot.run(TOKEN)

![](/assets/img/discord%20bot/2_2.png)

명령어 Decorator에 `help` parameter를 추가하면 설명도 달 수 있다. 어떤 명령어들이 있고 무엇을 하는지 사용자에게 보여줄 수 있는 가장 간단한 방법이다. 하여간 이런 식으로 `Client`에는 없는 추가 기능들이 자잘하게 있다.
명령어 Decorator에 `help` argument를 추가하면 설명도 달 수 있다. 어떤 명령어들이 있고 무엇을 하는지 사용자에게 보여줄 수 있는 가장 간단한 방법이다. 하여간 이런 식으로 `Client`에는 없는 추가 기능들이 자잘하게 있다.

### 2. 명령어에 Parameter 추가하기

Expand Down Expand Up @@ -138,7 +138,7 @@ async def multiply_error(ctx, error):

확장 라이브러리의 장점이 여기 또 나온다. `Command`**exception**을 넘겨받아 따로 error handling을 할 수 있는 건데, 위의 경우 argument가 정해진 type과 다르게 주어질 때 발생하는 `BadArgument`를 처리하고 있다.

> `Commands`에서 발생할 수 있는 exception 목록은 [여기](https://discordpy.readthedocs.io/en/latest/ext/commands/api.html?highlight=command%20error#exceptions)서 확인할 수 있다.
> `Commands`에서 발생할 수 있는 exception 목록은 [여기](https://discordpy.readthedocs.io/en/latest/ext/commands/api.html?error#exceptions)서 확인할 수 있다.
{: .prompt-info}

![](/assets/img/discord%20bot/2_4.png) | ![](/assets/img/discord%20bot/2_5.png)
Expand Down
Loading

0 comments on commit 49a213d

Please sign in to comment.