iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 6
1
AI & Data

用Node.js製作後台零負擔的DiscordBot系列 第 6

Day6 - 防呆觀念

以下文章已於 2021/09/16 轉移至 微笑之家
對於discord.js更新,或是有其他問題,都歡迎到以下網址查看喔
本站
本主題
本文章


昨天我們大致說明了關於bot.js的運作
今天對library文檔做一些補充,以及程序防呆概念

昨天我們介紹bot.js時,有提到client在監聽message事件時,會回傳一message物件

6-1

我們將message物件取名為msg,並且從msg中撈出content來檢查訊息內容,用reply來回傳訊息到訊息原本的頻道。

這些功能都可以從library文檔中找到,我們開啟昨天的discord.js文檔,然後在左側的功能列表中找到Message

6-2

這就是client監聽事件後帶回給我們的物件了,左側是變數,右側是方法
可以看到content在左側,在右側可以找到reply

所以如果要對msg有進一步的調用,我們都必須來看文檔,了解這個library提供了哪些功能給開發者。

在前面,我多次強調client監聽,獲得message事件這件事情
discord.js的功能使用是基於物件,也就是想做到甚麼事情、要先了解這件事情該調用哪個物件合適

6-3

這是我們昨天使用的回傳訊息的方式,也是discord.js包好給我們的方式

6-4

這是透過message物件獲得他所屬的channel(頻道)物件,再指定我要從這個channel底下send(發送)我要發送的訊息。

除非原本要做的行為很簡單,以及需要tag訊息來源user,這種情況才會使用reply
不然正常我們是使用msg.channel.send,這種寫法就不會再在訊息前方自動tag使用者了,且傳入的內容也不局限於文字;
之後如果要新增甚麼功能,也都是依這個邏輯下去文檔尋找。


讓我們回來到今天的主題,我們要稍微的修改一下我們的程式

6-5

為了讓bot之後更好修改內容,我們將msg.reply統一改成msg.channel.send

6-6

眼尖的同學應該注意到了,筆者除了修改reply以外,還把pong改成ping了
這是為了後續的測試,同學們可以運行起來,看看效果

6-7

機器人的訊息傳送停不下來了!
這是因為機器人傳送訊息的同時,也代表著client會再接到一個message事件,這是機器人自己的訊息,同時他也觸發了機器人的下一個訊息回應,這就導致了無限迴圈

同學們可以先在終端機上面用ctrl+c來強制中止程序
6-8

那麼,我們該怎麼迴避這個問題呢?

  • 讓程序的回應不要跟判斷的句子一樣
  • 判斷訊息來源

第一種作法就是說改成像之前一樣ping回pong
因為判斷與觸發的句子不一樣,就不會有問題了
但如果之後程序變得龐大,或是我們的觸發與回應句可以供其他人添加的話,第一種作法就會比較沒辦法達成我們的需求

第二種作法就是在client監聽到message事件時,先判斷訊息來源是否符合條件,套在現在的問題的話就是我們要判斷是不是bot
這樣做,除了我們的程序不會再因為自己的話無限自閉以外,對於有多機器人的群組,也就不會去理會其他機器人的訊息了,大家各自服務。

6-9

只要msg.member.user.bot這個參數是true,就代表訊息來自於機器人,不會再處理下面的事情,是不是很簡單呢?


上一篇
Day5 - 函式庫文檔與基本範例講解
下一篇
Day7 - 你的Bot需要一個前綴字
系列文
用Node.js製作後台零負擔的DiscordBot31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

2
kai0401
iT邦新手 5 級 ‧ 2021-06-29 19:35:29

請問"這就是client監聽事件後帶回給我們的物件了,左側是變數,右側是方法
可以看到content在左側,在右側可以找到reply" 是什麼意思呢?

我想做一個能讓bot在特定頻道才能夠接收訊息並做出回覆.

已經找到如何在特定頻道發送文字了 是用:
msg.guild.channels.cache.get('頻道id').send('文字');

但當寫到判斷式時 我寫:
if (msg.guild.channels.cache.get('頻道id').content === 'ping')
但並不起作用 也無錯誤訊息 不知道是為何?

微笑 iT邦新手 1 級 ‧ 2021-06-30 15:16:06 檢舉

client在做訊息監聽時,監聽到訊息後,會將一個Message物件回傳給我們
圖片中就是Library文檔中的Message物件,底下有寫到其提供的Properties(變數)與Methods(方法)

你希望bot可以在特定頻道接收訊息並回覆
這個功能的重點在於bot必需只對特定頻道的訊息有反應
msg.guild.channels.cache.get('頻道id').send('文字');
的功能是對特定頻道發送訊息

發送與監聽是兩回事喔,而且當判斷式有偵測出訊息來源是該頻道時,使用msg.reply()或是msg.channel.send()就可以了,不需要再從緩存中指定頻道

如果要知道被bot監聽到的訊息,來自於哪個頻道的話可以使用msg.channel.id來獲取

我要留言

立即登入留言