---
# System prepended metadata

title: Discord Bot Build Tutorial
tags: [Documentation, Templates]

---

---
title: 'Discord Bot Build Tutorial'
disqus: hackmd
author: Made by RemixFan
---

Discord Bot Tutorial 
===

[TOC]

:::success
📌這是專門用來教學的文檔，有興趣歡迎加入[酷欸Discord社群](https://discord.gg/WvPh4y39q7)
:::

## Discord Bot建置
前往Discord Development -> [點我前往](https://discord.com/developers/applications)

點擊 **New Application** 後輸入自訂機器人名稱後創建機器人

![image](https://hackmd.io/_uploads/HkrarpETT.png)

在左方點擊 **Bot** 選項並找到 **Reset Token**

![image](https://hackmd.io/_uploads/rkTePTEpp.png)

當你點完 **Reset Token** 後會需要輸入你的Discord使用者密碼

![image](https://hackmd.io/_uploads/S1KLDTE6p.png)

輸入完後即可取得TOKEN -> **請務必複製好TOKEN**


接著在 **Bot** 頁面往下滑 找到底下這個，並在右方點擊按鈕開啟這三個功能

![image](https://hackmd.io/_uploads/HytIO6Eaa.png)

回到 **OAuth2** 頁面並勾選 BOT 及 Administrator

![image](https://hackmd.io/_uploads/r1gwK6Npa.png)

勾選完畢後滑到底下並複製 GENERATED URL 的連結

![image](https://hackmd.io/_uploads/rynOFpETa.png)

最後，將該連結丟到

![image](https://hackmd.io/_uploads/r1jAFTNTa.png)

並Enter前往，則會出現底下的東西

![image](https://hackmd.io/_uploads/SkYe9a4T6.png)

確認要將機器人放的伺服器後**按繼續並授權**即可完成機器人基本建置



## Module 

斜線指令模組 -> [Pycord](https://docs.pycord.dev/en/stable/)
discord.ext 執行模組 -> [Discord](https://discordpy.readthedocs.io/en/stable/api.html?highlight=message#discord.Message)
asyncio異步協程模組 -> [Asyncio](https://codimd.mcl.math.ncu.edu.tw/s/yTqt6QuaZ)
## Replit建置
---
![image](https://hackmd.io/_uploads/ryTUeTEpp.png)
> 點擊Shell並在其中輸入底下這行後並按下Enter

```
pip install discord
```

![image](https://hackmd.io/_uploads/SJftg6EpT.png)
> 在Shell中繼續輸入底下這行並再次按下Enter

```
pip install py-cord
```

## 程式基本架構
---

#### 引入模組
```python=
import discord
from discord.ext import commands
import asyncio
```

#### 權限授予
```python=
intents = discord.Intents.all()
bot = commands.Bot(command_prefix="k! ", intents=intents)
```
##### Intents介紹 : 
> 可以把intents看成授權監聽事件
其分成members、presences、message_content
可以在程式中選擇自己要授權的功能，這樣可以保持bot的性能，專注在有授權的功能
但一般我都會用Intents.all()比較方便

#### 事件觸發
```python=
@bot.event
async def on_ready():
    print("Bot is online")
```

#### 執行機器人
``` python=
TOKEN =("[輸入你的機器人TOKEN]")

if __name__ == "__main__":
    bot.run(TOKEN)
```

## 異步協程Async/Await

#### 介紹
一個燒爆你CPU的東西(x)
異步的概念很簡單，就是在執行多樣工作時能夠在同一線程下利用時間來造成類同步運算的感覺

實際操作長這樣
```python=
import asyncio
import time

async def aaa():
    await asyncio.sleep(1) # -> 後面的asyncio.sleep(1)就是指"工作"
    print("aaa") # -> 他也是工作之一，但由於這個只是單純print，故不會需要耗時

async def bbb():
    await asyncio.sleep(1)
    print("bbb")

st = time.time()
asyncio.run(asyncio.wait([aaa(), bbb()]))
print(time.time() - st)
```
> **async** 代表的意思就是將函式的模式改為異步模式
> **await** 代表了在異步模式下可以將工作暫時進入等待階段

在await的等待期間，程式的線程會尋找其他異步程式並執行，直到結束或再次遇到await才回到原來的程式。

舉個例子比較清楚 -> 
假設有兩個玩家 A 和 B 在同一時間點上分別執行了兩個異步的函式，分別為 `aaa()` 和 `bbb()`。

1. 假設程式先收到了 A 玩家的指令，開始執行 `aaa()`。
2. 在 `aaa()` 中遇到了 `await asyncio.sleep(1)`，表示需要等待 1 秒
3. 在這一秒的等待期間，程式會去執行 B 玩家的 `bbb()`，因為它是另一個異步的函式。
4. 當 `bbb()` 中遇到了 `await` 時，程式又會放棄 `bbb()` 的執行權，回去執行 `aaa()`。
5. 這樣的切換會持續進行，直到兩個指令都執行完畢。

這東西講起來很複雜，就稍微介紹一下就好。


## 斜線指令介紹
---
#### 基本slash_command介紹
``` python=
@bot.slash_command(name="名稱", description="敘述")
async def wtf(ctx):
  await ctx.respond("HEY")
```

#### async與await在discord bot中的概念
多個玩家在執行指令時，每次執行時都會被打包成新的工作，但是在同一線程下執行，故在指令遇到await時就會快速偵測待做工作並執行直到每個工作都結束

## 事件觸發介紹
---
廢話不多說，直接上程式

```python=
@bot.listen()
async def on_message(message):
  print(message.content)
```
:::success
這是一個監聽on_message的事件，可以在Discord官方的文檔中搜尋listen()事件，即可找到
括號中的message就是取得當事件被某message觸發時，先取得該message的型態
接著就可以在監聽事件函式中去做執行。
:::

---

:::info
⭐ 此檔案目前暫時擱置，正等待著編輯者哪一天心血來潮多加一些東西
🏷️ 編輯者 : Rix 
🖥️ 錯誤回報 : [點我聯絡編輯者](https://github.com/Remixfan0912)
:::

