搜尋此網誌

2022年10月4日 星期二

Discord.js Slash Command

緣起:


    初試 Discord.js 成功後,我第二步想做的是寫自己的指令,接續這篇。在 Discord 上打一個斜線,它就會跑出指令來讓你選擇,有的還能加上參數之類的,我想要做個類似輸入 /rise_monster "魔物名" 的指令,輸入後,我的機器人就會用爬蟲去抓取相關的資料,然後將結果 (比如圖片、肉質表之類的),傳回 Discord Server 上。


    頭一次學這種東西,看文件看得有些吃力,卡了一會後才了解它的整個流程。


創立 Command 檔案:


    它是這樣做的,每個指令跟處理方式都存成一個 js 檔,放在一個叫 commands 的資料夾裡,在向 App 註冊指令、讀取指令時,再用 fs 來動態讀取那些指令的內容,處理 command 跟製作 command js 檔格式的教學在這,我們就先看製作 command js 檔的部份,它長這樣


    它放在我們 專案目錄/commands 資料夾裡,它這個指令的名稱叫 ping,所以檔名也要跟它一樣,叫 ping.js,它有用到 module.exports ,跟 node.js 的模組管理有關,我對這東西沒到很明白,這邊有教學。它會用到的是 Discord.js 的 SlashCommandBuilder 物件,setName 是設定指令的名稱,setDescription 是它功能的描述,再來是一個 async 的 callback function,傳的參數是一個 interaction,這裡有 interaction 的介紹,它這邊用 interacation 的 reply 方法來回覆 pong!。


向 APP 註冊 Command:


    這裡一樣是寫程式來完成,你可以在你專案下額外新增一個叫 register_command.js 的檔案,並把程式寫在裡面,這部份的教學文章請看這篇,你要複製的是 Guild commands 那章節的程式碼

這邊的程式碼

    需要改的變數值就那個 "clientId" 跟 "guildId",clientId 指的就你 APP 的 id,你可以到 Discord Developer 的 Portal 那邊選擇你的 APP,在 General Information 那邊能看到你 APP 的 id。再來是 guildId,老實說,我一開始忘了 guild 這單字的意思,去查了後才知道是 "公會",也就是你 Discord 上的伺服器啦,那要怎麼得到你伺服器的 id 呢 ?

    你到你 Discord 的設定,應用程式設定那邊,點選進階


    把開發者模式給啟用


    這時你用右鍵點選你的伺服器,就會有個複製 id 的選項,點了就能複製那個伺服器的 id,把 id 給貼到 guildId 變數裡


    哦對,那個 token 也要改一下,改成我們自己存取 AccessToken 的方式 (auth.json 檔裡的 token)



    這支程式的目地是把指令給加到某個伺服器裡 (那個伺服器裡要有我們的機器人),程式執行完後如果沒問題的話,我們在伺服器裡輸入 / 後,就能看到我們加入的指令在選項內


    其實,可以註冊全域的 command,也就是說註冊 command 後,不限定哪個伺服器,只要你的伺服器裡有我們的機器人,都能呼叫那個被註冊的 command。官方的教學文件是說,就把 rest.put 那段改成這樣即可


    你這時啟動 bot.js,再對伺服器輸入指令後,你會發現,等了一會後,只收到錯誤的訊息


    因為我們還需寫個監聽指令並回應的程式


監聽指令並做回應:


    它的實作方式是,在啟動機器人前,先把 commands 資料夾底下的 .js 檔都讀取,並在 client 物件裡新增一個叫 commands 的欄位,它是一個 Collection,可以儲存 key value 對,把每個作為指令的 .js 檔以 "指令名稱" : "指令動作" 存到 client 的 commands  裡


    再來讓 client 監聽 interactionCreate 事件,callback function 會傳入一個 ChatInputCommandInteraction 物件,接著就能用它來做一些操作。


    它的 isChatInputCommand 可以確認目前的指令是否為聊天用的指令 (?


    從 interaction.client.commands 可以取得我們的命令 Collection, intereaction.commandName 可以取得使用者輸入的指令名稱,然後 Collection 的 get 可以取得 key 對應的 value,如果找不到的話表示指令不存在,有抓到的話可以接著執行指令。

    最後執行程式,程式沒問題的話,我們輸入 /ping 送出後,就能看到機器人回應 pong!





沒有留言:

張貼留言