## 第二次大作業 - Discord Bot
北區:黃千睿
竹區:李慕庭
---
## Introduction & Score
----
* 自己實作一個Discord的機器人
* 還要自己設計一些小小的內容~
* 最後要寫一份報告介紹你的設計 > <
----
### 這個機器人要有的功能
* 使用者自建todo list
* 玩Wordle
* 自訂功能一
* 自訂功能二
----
### Todo list
* 新增一個待辨事項 (5%)
* 刪除一個待辨事項 (5%)
* 排序並輸出所有待辨事項 (5%)
* 清空所有待辨事項 (5%)
----
### Wordle
* 爬單字資料庫 (5%)
* Random (2%)
* 回應 (8%)
* 結束(成功/公布答案) (5%)
----
### 自訂功能一
* 指令一 (4%)
* 指令二 (3%)
* 指令三 (3%)
----
### 自訂功能二
* 指令一 (4%)
* 指令二 (3%)
* 指令三 (3%)
----
### 給個例子 - 玩1A2B
* 開始玩
* 猜一個數字
* 結束時輸出猜測次數排名
----
例子出來了,不能寫1A2B
當然如果你想要有超過三個指令也行
只是多的沒有分數,但能讓你的bot更完整
----
### Coding Style(10%)
* 優質易懂的變數名稱
* 詳細的註解
* 用函數or其他方法包裝功能
* PEP8
* Error Handling
**達成一項就是2分**
----
### Report
* 解釋你的專案架構(5%)
(有哪些檔案、各代表什麼)
* 解釋你如何實作的 (10%)
(尤其是自訂功能的部分)
----
### 上臺分享
* 勇敢走上臺講話(5%)
* 講師們評分(5%)
* 來自同學的評分(5%)
----
### Bonus (10%)
----
### 滿分:110
聽起來很可怕嗎?
----
### 可以找朋朋~
[分組表單](https://docs.google.com/spreadsheets/d/1vxJv7UKPAJ4szB7z6xVC1xrkN94XVZA4mI5sKdKsu0o/edit?usp=sharing)
請在5/21前填寫完畢
**1~3人一組**
----
### DeadLine : 6/18
要上臺報告喔
---
## Set up discord
----
[Download discord desktop](https://discord.com/download)
----
### Create a sever
![](https://hackmd.io/_uploads/SyiOpGF4n.png)
(左下角的加號)
----
### Create a sever
![](https://hackmd.io/_uploads/Skp6aMFVh.png)
(建立伺服器)
----
### Create a sever
![](https://hackmd.io/_uploads/H1mV0MY43.png)
(我和我的好友)
----
### Create a sever
![](https://hackmd.io/_uploads/BktUCftN2.png)
(取名字 & 建立)
----
### Create an application
[Enter developers application](https://discord.com/developers/applications)
![](https://hackmd.io/_uploads/SJcsbXKN2.png)
(右上角 **new applicaion**)
----
### Create an application
![](https://hackmd.io/_uploads/r1CCWXY43.png)
(取個名字 & Create)
----
### Create an application
![](https://hackmd.io/_uploads/ByH6zmKN3.png)
(Pivileged Gateway Intents全開 & 按save change)
----
### Create an application
![](https://hackmd.io/_uploads/SJ25XQtE3.png)
OAuth2 → URL Generator → scope → 打勾bot
----
### Create an application
![](https://hackmd.io/_uploads/H1XONmYNn.png)
OAuth2 → URL Generator → Bot permissions →
按照上面的打勾(?!
----
### Create an application
![](https://hackmd.io/_uploads/S1dkrXtV3.png)
OAuth2 → URL Generator → Generated URL → Copy
----
### Create an application
把URL貼到google上
![](https://hackmd.io/_uploads/Hk8uHmKE2.png)
(選擇剛剛建立的伺服器 & 繼續 & 繼續 & 繼續)
----
然後你應該就要成功看到
bot跳進你剛建立的伺服器
---
## Set up environment
----
### Download template
[Github link](https://github.com/Fireball0424/Sprout2023py---2nd-Project/tree/main)
----
### Install packages
```
$ pip install discord
$ pip install python-dotenv
```
----
### Enviromental Variables
回到剛剛的application → bot → copy TOKEN
![](https://hackmd.io/_uploads/ByVoZrYVn.png)
----
### Enviromental Variables
複製template中的 .env.defaults
命名為 .env,並把TOKEN貼上
![](https://hackmd.io/_uploads/SklrZrKNh.png)
----
### Test
In VS code command, run bot.py
```
$ python bot.py
```
----
### Test
進入一般頻道 → 打 ```$Hello```
![](https://hackmd.io/_uploads/S1qWfSKE3.png)
機器人如果回覆你 Hello, world,代表設置成功咯~
---
### 模板架構
----
* bot.py
* core.py
* cmds/
* main.py
* todolist.py
* wordle.py
* custom1.py
* custom2.py
* music(bonus).py
* event.py
* .env
* data.json
----
### <提醒>
你可以自由import任何library
也可以新增任何你想要的檔案
但記得在report中說明
----
### bot.py
run bot.py → 執行bot
在VSCode terminal 中可以用 Ctrl + C 來中止
----
### core.py
用cog管理指令
可以在discord中載入指令,不用重新執行bot
```
$load extend
$unload extend
$reload extend
```
----
![](https://hackmd.io/_uploads/rktCetYNn.png)
----
可以看現在所有的指令
```
$help
```
----
![](https://hackmd.io/_uploads/SJj1GjtV3.png)
---
## Todo List
----
將 item(待辨事項) 加入todo list
```
$AddTodoList item
```
----
將 item(待辨事項) 移除todo list
```
$RemoveTodoList item
```
如果todo list中沒有這個待辨事項
bot要輸出 "此待辨事項不存在"
----
![](https://hackmd.io/_uploads/HJ8xq_YVn.png)
----
將todolist按照 **字典序** 排序並輸出
```
$SortTodoList
```
----
清空todolist
```
$ClearTodoList
```
----
![](https://hackmd.io/_uploads/BJ-lodFVn.png)
---
## Wordle
----
### 遊戲介紹
* 答案是一個5個英文字母且存在的單字
* 每次玩家猜出一個單字,要回答每個位置的字母
* 位置及字母都對
* 字母對但位置不對
* 都不對
* 最多只能猜6次
----
### 玩玩看就知道了
[Wordle Link](https://www.nytimes.com/games/wordle/index.html)
----
### 初始化
loading [單字庫](https://gist.github.com/cfreshman/d97dbe7004522f7bc52ed2a6e22e2c04),可以按**raw**來載入txt file
不限定讀取的方法
但不能是直接讀取本機檔案
----
### Wordle 指令名稱
```
$Play
```
Random選一個單字設為答案
----
### Wordle 指令名稱
```
$Ask ans
```
要注意一些情況
* 沒有輸入```$Play``` 就直接輸```$Ask```
* 問超過6次要停
* 問不是5個單字的字母
* 問不是單字的字母組合
----
為了方便實作,Ask response可以輸出
* 大寫 = 位置對字母也對
* 小寫 = 字母對但位置不對
* \# = 都不對
----
正確答案 : right
Ask : input
輸出 : i###T
----
![](https://hackmd.io/_uploads/rJJZC9F43.png)
----
![](https://hackmd.io/_uploads/HyAWJit4n.png)
----
設計其他更美觀的輸出方法 (2% bonus)
---
## Bonus - Music Bot
----
幫一個有基本架構的music bot加上功能
1. 讓使用者能夠透過樂曲名稱搜尋音樂(4%)
2. Queue(2%)
3. Vote(2%)
----
### Set up music bot
----
### Music Bot 運作流程
1. 用 yt-dlp 搭配 FFmpeg 去 youtube下載音檔 (mp3)
2. 把你的 Bot 連到 Voice Channel
3. 呼叫 discord.FFmpegPCMAudio 播歌
----
### 已經幫你寫好的 Music Bot 指令
1. 下載音檔
2. 將 Bot 連到 Voice Channel 播歌
(沒有播放清單)
3. 暫停 / 繼續
4. 卡歌 / 讓 Bot 離開 Voice Channel
----
* 可以自己實作出 queue, vote 等酷酷的功能
* 使用完 Music Bot 記得呼叫 $leave 離開 Voice Channel,不然會因為閒置太久出錯 (重新啟動Bot)
* [yt-dlp](https://www.mankier.com/1/yt-dlp) 不是 python 套件,所以我們會用神秘的方法讓 Music Bot 動起來
----
### 一些前置作業
----
```
pip install pyNaCl
```
* 如果你的作業系統是 Windows :
* 把 [FFmpeg 和 yt-dlp 執行檔們](https://drive.google.com/drive/folders/1saBzH-jajJuDgn2_d_Ts_Yf-RtNj6aZa?usp=sharing)下載下來放進 Sprout2023py---2nd-Project/
----
* 如果你的作業系統不是 Windows
* 到 [FFmpeg 的下載網站](https://ffmpeg.org/download.html) 選擇自己的作業系統然後從下載的 packge 中找到 `ffmpeg` 和 `ffprobe` 兩個執行檔
* 到 [yt-dlp 的 GitHub](https://github.com/yt-dlp/yt-dlp) 滑到 Release Files 下載對應的執行檔
----
你的 Directory 應該會長這樣
![](https://i.imgur.com/ElRT0dO.png =200x)
----
### 關於 yt-dlp
* yt-dlp 不是 python 套件,所以不能像之前用過的東西一樣直接 import
* yt-dlp 是我們放在資料夾中的執行檔
* 可以嘗試在小黑窗 (terminal) 輸入
```bash=
./yt-dlp_x86.exe <youtube url>
```
----
* 為了讓我們可以在 python 裡面使用 terminal 的指令,我們呼叫 os.system()
```python=
os.system(f"yt-dlp_x86.exe --extract-audio --audio-format mp3 --audio-quality 0 {url}")
```
----
## [Q&A document](https://docs.google.com/document/d/1w0tAYyEUcaJQWVlcjD7OVqDPxFNP6brsQSWI2lsizyc/edit?usp=sharing)
{"metaMigratedAt":"2023-06-18T02:44:36.623Z","metaMigratedFrom":"YAML","title":"第二次大作業","breaks":true,"contributors":"[{\"id\":\"12fd27f5-82a5-4f30-8a85-e747ae0676cf\",\"add\":1380,\"del\":83},{\"id\":\"cc9d2950-af2b-4feb-8745-4367e4091769\",\"add\":6101,\"del\":975}]"}