切換
舊版
前往
大廳
主題

Discord Bot 開發筆記,使用 DSharpPlus

GG | 2020-03-21 20:10:27 | 巴幣 1020 | 人氣 4778

花了大約一週的時間開發一個專屬的 Discord 聊天機器人,名為「鴨講」。
趁著記憶猶新記錄一下重點。

開發之前,先規畫了想實現的功能,主要有這些:
1) 針對特定關鍵字觸發回應,例如看到「早安」就會回覆「某某人早安」,就像機器人在跟你聊天一樣。
2) 執行特定的指令。

先看成果,首先是聊天:

然後執行指令:

--

接著是開發工具與套件。
網路上搜尋到的教學大多使用 node.js/discord.js 框架,以 javaScript 開發。
但是我不熟 javaScript,所以找了使用 C# 的工具,也就是這次使用的 DSharpPlus。
它是跑在 .NET Core 上面的,所以目前只能做出終端機介面,沒有漂亮的圖形視窗。
註:還有另一套也是使用 C# 的工具:Discord.Net。不過我這次用的是 DSharpPlus 就是了。

開發流程大致上分為:
1) 註冊Bot帳號 (極簡單)
2) 取得Bot專屬Token (極簡單)
3) 實做Bot基本框架,讓Bot活起來 (難度普通)
4) 邀請Bot到Discord群組 (極簡單)
5) 實做Bot的功能 (就是寫程式)

關於「註冊帳號」與「取得Token」,網路上的分享非常多就不重覆了。重點只有一個就是 Token 那串字千萬要保密不可外洩。
而實做的部份我都是看這位的教學,講得很完整:

基本上有在用 C# 開發的人應該都看得懂。

--

最後就是自己的一些心得筆記。

Discord 裡面常常查到一個名為 Guild(公會) 的東西,這個 Guild 指的就是 Discord 群組。取這名字真有遊戲感。

Discord 裡各種項目皆有一個專屬id,長度是 ulong。無論是使用者(user)、頻道(channel)、身份組(role)……通通都是這樣的觀念。想要查詢某個東西的 id 最簡單的方式就是在 Discord 的該項目上面(例如使用者)按右鍵,選「複製ID」即可。

想要處理收到的訊息,只要向 Client 註冊 MessageCreated 即可,這是一個 delegate。收到訊息後會傳入 MessageCreateEventArgs 型態的參數,裡面會有這一筆訊息的完整資訊,包括訊息內文、從哪個頻道傳來的、發話者是誰、提及了哪些人等等應有盡有。

如果上傳了自訂的表符emoji,都會生成由二個冒號包住的語法,例如 :hello:
Bot發送訊息到群組時,這種emoji語法不會被自動轉成圖案,所以發送前記得如果有emoji要先透過 DiscordEmoji.FromName() 轉成正確的語法。

想模擬機器人正在打字,也就是顯示「xxx正在輸入…」的訊息。只要對指定的 Channel 呼叫 TriggerTypingAsync() 即可。

需要使用 C# 的 async 語法,也就是非同步的寫法。不熟悉的話建議先作點功課。

以上,開發自己的 Discord Bot 沒那麼難。

--

本篇相關連結。

DSharpPlus

以 DSharpPlus 實作 Discord Bot 影片教學

Discord.Net

async 等待與不等待的觀念釐清

--

創作回應

rixinsc
太神惹~
2020-04-20 01:59:07
GG
謝謝,其實看著教學做滿簡單的
2020-04-20 11:49:45
五丘松
抓到!!! 鴨講!!
2020-05-27 11:14:08
GG
鴨講被發現了
2020-05-27 14:52:22
墨曦
你好,方便請教一下GuildMemberAdded這個事件的問題嗎?
2021-06-21 20:51:36
GG
什麼問題請說。不過老實說我沒用過 GuildMemberAdded 也許幫不上忙XD
2021-06-22 00:09:39
墨曦
我想要監控成員加入了哪個頻道然後發送訊息,但Guid好像是整個伺服器? 而我綁定這個事件後後也測試讓人員加入伺服器,但這個事件還是沒有觸發
2021-06-22 10:45:42
GG
Discord沒有「加入頻道」的功能吧,應該只能用不同身份組來限制哪個User可以看見什麼頻道。而GuildMemberAdded理論上在有人加伺服器的時候應該要觸發才對 (我沒測試,但文件上是這樣寫的)。有時候是套件本身的bug,我之前也被坑過一次,最後把套件更新後就正常了,供你參考。
2021-06-22 20:50:39
月神
不好意思
這邊想請教一個問題

我嘗試查些寫BOT的YT找了方法寫一個顯示訊息(EmbedBuilder)
結果在做測試的時候每當我SAVE一次然後運行程式他就會變成多個視窗顯示
而且好像每次會根據我的編輯呈現變化

EX:第一次:寫1,儲存執行:1
第二次:改寫2﹑儲存執行:1 2
便這樣,依此類推
請問有知道什麼原因嗎可以指教嗎?

方法建立為預設:jda = JDABuilder.createDefault().build();

因為在找的時候影片為3.8.0左右的版本有不一樣所以附上現在的寫法↑

謝謝您的回應解答
2021-07-26 20:52:37

更多創作