前言
本文介紹在 Node Express 上透過 discord.js,
來讓 Discord Bot 上線,
並處理 User 在 Channel 跟 Bot 對話,
或 User 直接跟 Bot 對話(非 Channel) 的訊息處理。
例如,Bot 發送訊息到 Channel 、發送訊息給 User 或是針對訊息回覆(reply)。
實作
建立 Discord Bot
1.建立 Application (Bot)
到 Discord Developer Portal - Applications 建立 Application (就是 Bot)。
2.設定 Application 基本資料
在「General Information」Tab 設定 App Icon, Name, Description 及 Tags …等資料
3.設定 OAuth2 -> URL Generator
在「OAuth2 -> URL Generator」設定將 Bot 加到 Discord 伺服器的權限 URL,
在「SCOPES」需要 bot,「BOT PERMISSIONS」需要Send Messages,
移到最下面,將「GENERATED URL」內容 Copy 下來,
在 Browser 上開啟新的 Tab ,並貼上剛才 Copy 的 URL,
將 Bot 加到某伺服器之中(如果選不到伺服器,請先新增伺服器)。
授與 Bot 權限
最後成功將 Bot 加到 伺服器 之中,
在 伺服器 中,會顯示 bot3 出現的訊息,但目前為 離線 狀態。
4.Copy Bot Token
切回到 Bot 設定的頁面,切到 「Bot」 Tab,
按下 Reset Token,並將 Token Copy 下來,
5.設定 Privileged Gateway Intents
因為要讀取使用者的訊息,所以需要啟用MESSAGE CONTENT INTENT,
建立 Node 程式來處理 Bot
1.建立 Node 程式並加入套件
1 | mkdir bot3 |
在 package.json
中加入 "type": "module"
1 | { |
- 註: discord.js v14 需要 Node 版本在 16.11.0 以上哦~
2.設定 Bot Token 到 .env 中
加入 .evn
檔案,並加入 Bot Token 設定,如下,
1 | DISCORD_TOKEN=剛才Copy的Token |
3.新增 app.js 來處理 User 與 Bot 的訊息溝通
3.1.建立 express 網站
建立簡單的 Express 網站,並設定全域的bot
做為存放 Discord 的變數
1 | import { Client, Events, GatewayIntentBits, Partials } from "discord.js"; |
執行node app.js
,開啟 Browser,URL 輸入http://localhost:3000/
,
可以看到 Hello Discord Bot, Use Discord.js
,就表示 Express 運作沒問題。
3.2.連線/啟動 Discord Bot,並處理訊息
建立 StartDiscordBots
function ,建立 Client
物件來處理 Discord Bot 的訊息事件,
並設定/start
Route,執行StartDiscordBots
,如下,
1 | import { Client, Events, GatewayIntentBits, Partials } from "discord.js"; |
執行node app.js
,開啟 Browser,URL 輸入http://localhost:3000/start
,
可以看到 已啟動 Bot
。
切到 Discord 頁面,可以發現這時,Bot3
已經上線了哦~
在 Channel 對話中輸入 Hello Bot3
,
則可以看到 Bot 會回 2 個訊息,
一個是針對原訊息回覆(Reply), 一個是在 Chanel 中發送訊息(Send),
直接跟 Bot3 對話,輸入 Bot3 DM
後,
可以看到 Bot 也是會回 2 個訊息,
一個是針對原訊息回覆(Reply), 一個是送訊息給 User(Send),
3.3.發送訊息到 Channel
上述是針對 User 發的訊息處理,如果是要由 Bot 發送訊息給 Channel,
需要有ChannelId
,ChannelId
可以從 Discord 的 URL 中取出來,
例如,https://discord.com/channels/guildId/channelId
所以在 app.js 加入Send2Channel
function 來處理將訊息送到 Channel 之中。
設定 /sendC
Route 取得 QueryString 後,呼叫 Send2Channel
,如下,
1 | import { Client, Events, GatewayIntentBits, Partials } from "discord.js"; |
重新執行 app.js,開啟 Browser ,先連到 http://localhost:3000/start
,
再將 URL 改成 http://localhost:3000/sendC?cid=Discord中的ChannelId
,
就可以發現 Bot 發送 Hello /SendC
的訊息,
3.4.發送訊息給 User
發送訊息給 User 需要 UserId ,可以從收到的 Message 來取得,
例如,msg.author.id
所以在 app.js 加入Send2User
function 來處理將訊息送給 User 之。
設定 /sendU
Route 取得 QueryString 後,呼叫 Send2User
,如下,
1 | import { Client, Events, GatewayIntentBits, Partials } from "discord.js"; |
重新執行 app.js,開啟 Browser ,先連到 http://localhost:3000/start
,
再將 URL 改成 http://localhost:3000/sendU?uid=userId
,
就可以發現 Bot 發送 Hello /sendU
的訊息,
3.5.回覆某訊息
要針對某個訊息來「回覆」,需要那個訊息的Channeld及MessageId,
所以在Events.MessageCreate事件中,
就有將訊息的Channeld及MessageId一併顯示出來,
所以在 app.js 加入Reply2Msg
function 來處理針對某訊息(channelId
, msgId
)回覆。
設定 /reply
Route 取得 QueryString(cid, mid) 後,呼叫 Reply2Msg
,如下,
1 | import { Client, Events, GatewayIntentBits, Partials } from "discord.js"; |
重新執行 app.js,開啟 Browser ,先連到 http://localhost:3000/start
,
再將 URL 改成 http://localhost:3000/reply?mid=訊息中的msgId&cid=訊息中的channelId
,
就可以發現 Bot 針對那個訊息發送 Reply2Msg:...Hello /reply
的訊息,
- 註: 上面使用 Discord.js 取物件時,大多會使用
cache.get
,如果取不到,就用fetch