# Discord Bot
siriuskoan
---
## Discord Bot 可以怎麼玩
(credit to Sean)
- 身份組機器人
- 音樂機器人
- 歡迎訊息
- 活躍度排名、小遊戲
- 搜尋、訂閱
----
### 身份組 Bot
![](https://i.imgur.com/dYipNNv.png)
----
### 音樂 Bot
![](https://i.imgur.com/JsmoWgy.png)
----
### 歡迎訊息
![](https://i.imgur.com/03GQgBb.png)
----
### 活躍度排名
![](https://i.imgur.com/aRFpvEF.png)
----
### 小遊戲
![](https://i.imgur.com/xv5WCDP.png)
----
### 訂閱
![](https://i.imgur.com/zN1QIh7.png)
----
### 搜尋貓貓
![](https://i.imgur.com/6ZwE2W5.png)
----
### 團購訂餐
![](https://i.imgur.com/XGDEcm0.png)
---
## 新增機器人到自己的伺服器
1. 建立 application & bot
2. 建立伺服器
3. 把 bot 邀請進去
步驟截圖請見[去年簡報](https://hackmd.io/@Sean64/dc-bot#/2)
---
## 安裝 discord.py
```
$ python3 -m pip install discord.py
```
---
## 建立 Discord Bot
```python=
import discord
intents = discord.Intents.default()
intents.message_content = True
client = discord.Client(intents=intents)
@client.event
async def on_ready():
print(f"We have logged in as {client.user}")
@client.event
async def on_message(message):
if message.author == client.user:
return
if message.content.startswith("$hello"):
await message.channel.send(f"hello, {message.author}")
client.run("TOKEN")
```
----
### 建立指令
```python=
import discord
from discord.ext import commands
intents = discord.Intents.default()
intents.message_content = True
client = discord.Client(intents=intents)
bot = commands.Bot(command_prefix="!", intents=intents)
@bot.command()
async def ping(ctx):
await ctx.send("pong")
bot.run("TOKEN")
```
---
## 補充 - Decorator
```python=
@bot.command()
async def ping(ctx):
await ctx.send("pong")
```
----
### 補充 - Decorator
- Python 的語法糖
- 把你宣告的函式包進一個已經寫好的函式裡
----
### 補充 - Decorator
```python=
import time
from functools import wraps
def timeit(func):
@wraps(func)
def wrapper(*args, **kwargs):
start = time.time()
res = func(*args, **kwargs)
end = time.time()
print('Time spent in %s is %f seconds.' % (func.__name__, end - start))
return res
return wrapper
def fib(n):
if n <= 2:
return 1
return fib(n - 1) + fib(n - 2)
@timeit
def run():
print(fib(40))
if __name__ == '__main__':
run()
```
----
### 補充 - Decorator
[更多範例](https://towardsdatascience.com/10-fabulous-python-decorators-ab674a732871)
---
## 補充 - async
- 遇到耗時間但你不用做事的事情的時候,可以把 CPU 拿去做其他事情以避免浪費
- e.g., 網路傳輸、資料庫讀寫、...
----
### 補充 - async
```python=
import time
import asyncio
async def do_something2(i):
print(f"第 {i} 次開始")
await asyncio.sleep(2)
print(f"第 {i} 次結束")
if __name__ == "__main__":
start = time.time()
loop = asyncio.get_event_loop()
tasks = [loop.create_task(do_something2(i + 1)) for i in range(5)]
loop.run_until_complete(asyncio.wait(tasks))
loop.close()
print(f"time: {time.time() - start} (s)")
```
---
## 補充 - Token
- Token 很重要
- 不能寫在檔案裡面讓大家看光光
- 要寫到其他地方
----
### 補充 - Token
- 可以把 token 放到環境變數裡面
```
# windows cmd
$ set token=TOKEN
# mac
$ export token=TOKEN
```
----
### 補充 - Token
- 然後在 python 裡面讀出來
- 給 discord bot 去跑
```python=
import os
TOKEN = os.getenv("token")
...
client.run(TOKEN)
```
---
## 更多功能
- [Discord Bot Template](https://github.com/kkrypt0nn/Python-Discord-Bot-Template)
- Google
{"metaMigratedAt":"2023-06-18T03:44:48.007Z","metaMigratedFrom":"YAML","title":"Discord Bot","breaks":true,"contributors":"[{\"id\":\"a2dd0460-a150-40b3-8024-44d3b3f2e06b\",\"add\":3336,\"del\":29}]"}