首先先介紹我們會用到的相關 Library

1.

這個是用來分析與下載 YouTube URL,下載的資訊也包含其他相關資訊,像是影片標題等等…

2.

opus encoder 是一種聲音編碼的格式

我們使用 discord.js 這一個函式庫來操控 ChatBot 撥放音樂,discord.js 中你有兩種函式庫的選擇 (也可以兩個都裝 discord.js 會選擇效能最好的使用)。

第一種

opusscript 安裝簡易且快速,但效能相對較差。

第二種

node-opus 效能較好,但安裝較為麻煩。

Note:
在安裝此函式庫時,必須確保 Python 版本為 2.7.X (需移除 Python 其他版本),否則無法安裝。

3.

FFmpeg 是一個可以執行音訊和視訊多種格式的錄影、轉檔、串流功能

Note:
我在本地端開發時(OS: Windows 10),ffmpeg-binaries 正常運作。
但是當佈署到雲端時(OS: Ubuntu 18.04 or Mac),ffmpeg-binaries 無法運作,導致音樂一播放,會立即結束。
Solution:
不要使用 ffmpeg-binaries,自行在 Ubuntu 上面安裝 ffmpeg(cmd: apt-get -y install ffmpeg),即可解決。

全部程式碼

packages.json

ffmpeg 部分我已經先裝好了,所以沒有導入 ffmpeg-binaries,而且他問題也很多,基本上能夠不用就不用。

再來是說明部分程式碼

queue 的部分,是我用來放置訊息進來時,所會用到的相關重要資訊

textChannel → 發送該訊息的頻道

voiceChannel → 傳送訊息的成員,所在的頻道

connection → 儲存 join() 回傳的 VoiceConnection instance (才能頻道播放音樂)

!message.member.voiceChannel → 確認傳送訊息的成員,是否在該頻道內

之後然後我們讀取 message.content 的第一個字元,來判斷是要中斷音樂還是播放音樂(X or !)。

如果是播放音樂的指令的話,程式會將其送到 exec 函式中進行處理。

其中如果有歌曲的話,就單純將歌曲 push 到 songs 陣列中。

如果歌單沒有歌曲的話,代表此次連線是第一次連線,所以我們將相關頻道訊息都存入到我們剛剛的 queue 中,然後呼叫 play 函式執行播放指令。

在 play 函式中,只要 songs 陣列有歌,就會持續播放 ;相反,只要 songs 是空的,ChatBot 就會離開頻道 ( queue.voiceChannel.leave();)

queue.connection.playStream → 我們在裡面使用 ytdl 所提供的函式來分析 youtube url 並擷取其相關資訊與播放,

當音樂結束 .on(‘end’) 會將 songs index[0] 移除,並播放下一首歌

dispatcher.setVolume(queue.volume); → 調整音樂聲量

到這邊就結束啦~~~~~~

在程式碼部分,基本上都不會太難。

最難的部分,其實是安裝相關函式庫,畢竟大家環境不同,都有很多 Bug 要修。

雖然直接用別人寫好的相對來說,應該會好一些,不過你就是要照著別人的規則去控制機器人,想到心情就不好 OwO

成果

--

--