Skip to content

This issue was moved to a discussion.

You can continue the conversation there. Go to discussion →

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

【用 JS 寫一個 Discord Bot!】02 音樂機器人 - 一顆藍莓 #2

Closed
utterances-bot opened this issue Dec 25, 2020 · 79 comments

Comments

@utterances-bot
Copy link

【用 JS 寫一個 Discord Bot!】02 音樂機器人 - 一顆藍莓

前端工程師與她的筆記們

https://b-l-u-e-b-e-r-r-y.github.io/post/DiscordBot02/

Copy link

您好,不知道為何我輸入的!!join後,機器人完全都沒反應,不會加入頻道。

Copy link

kurega commented Dec 28, 2020

請問 !!join 機器人加進來後,按 !!play 加上網址 沒有跑出提示訊息及播放歌曲

Copy link
Owner

@thisiskk
檢查一下:

  1. 機器人有上線嗎?
    如果機器人是離線狀態,可能是 token.json 中的 token 有誤
  2. 你目前正在伺服器的語音頻道裡面嗎?

如果上述兩點都有做到,看看 terminal 有沒有錯誤訊息,可以貼上來我看看是什麼問題~

Copy link
Owner

@kurega
我更新了程式碼和套件版本,可以再測試看看能不能正常播放

Copy link

kurega commented Jan 13, 2021

可以了

Copy link

CatTW commented Jan 31, 2021

請問我在撥放音樂時沒反應
而後台跑出:

Error: No video id found: https://www.youtube.com/watch?v=lg1N-4jJJrk&ab_channel=TrapNation
at Object.exports.getVideoID (C:\Users\10user\Desktop\音樂機器人\node_modules\ytdl-core\lib\url-utils.js:66:11)
at Function.exports. [as getInfo] (C:\Users\10user\Desktop\音樂機器人\node_modules\ytdl-core\lib\info.js:470:29)
at Music.play (C:\Users\10user\Desktop\音樂機器人\discord.js:41:36)
at Client. (C:\Users\10user\Desktop\音樂機器人\discord.js:174:25)
at Client.emit (events.js:315:20)
at MessageCreateAction.handle (C:\Users\10user\Desktop\音樂機器人\node_modules\discord.js\src\client\actions\MessageCreate.js:31:14)
at Object.module.exports [as MESSAGE_CREATE] (C:\Users\10user\Desktop\音樂機器人\node_modules\discord.js\src\client\websocket\handlers\MESSAGE_CREATE.js:4:32)
at WebSocketManager.handlePacket (C:\Users\10user\Desktop\音樂機器人\node_modules\discord.js\src\client\websocket\WebSocketManager.js:384:31)
at WebSocketShard.onPacket (C:\Users\10user\Desktop\音樂機器人\node_modules\discord.js\src\client\websocket\WebSocketShard.js:444:22)
at WebSocketShard.onMessage (C:\Users\10user\Desktop\音樂機器人\node_modules\discord.js\src\client\websocket\WebSocketShard.js:301:10)

請問這是什麼意思

Copy link
Owner

@CatTW

問題出在這行的 musicURL 字串沒處理乾淨,前面多了一個空格

const musicURL = msg.content.replace(`${prefix}play`, '');

改為這樣應該就正常了:

const musicURL = msg.content.replace(`${prefix}play`, '').trim();

感謝回報~
Github Repo 也更新了

Copy link

npm install @discordjs/opus
用不了阿~~

Copy link
Owner

@RockKingdom
剛剛測試可以正常安裝。有什麼錯誤訊息嗎?

Copy link

跑出一堆err

Copy link

npm ERR! code 1
npm ERR! path C:\Users\USER\Desktop\HappyMusic\node_modules@discordjs\opus
npm ERR! command failed
npm ERR! command C:\WINDOWS\system32\cmd.exe /d /s /c node-pre-gyp install --fallback-to-build
npm ERR! Failed to execute 'F:\node.exe F:\node_modules\npm\node_modules\node-gyp\bin\node-gyp.js configure --fallback-to-build --module=C:\Users\USER\Desktop\HappyMusic\node_modules@discordjs\opus\prebuild\node-v88-napi-v3-win32-x64-unknown-unknown\opus.node --module_name=opus --module_path=C:\Users\USER\Desktop\HappyMusic\node_modules@discordjs\opus\prebuild\node-v88-napi-v3-win32-x64-unknown-unknown --napi_version=7 --node_abi_napi=napi --napi_build_version=3 --node_napi_label=napi-v3' (1)
npm ERR! node-pre-gyp info it worked if it ends with ok
npm ERR! node-pre-gyp info using node-pre-gyp@0.2.0
npm ERR! node-pre-gyp info using node@15.8.0 | win32 | x64
npm ERR! node-pre-gyp WARN Using needle for node-pre-gyp https download
npm ERR! node-pre-gyp info check checked for "C:\Users\USER\Desktop\HappyMusic\node_modules@discordjs\opus\prebuild\node-v88-napi-v3-win32-x64-unknown-unknown\opus.node" (not found)
npm ERR! node-pre-gyp http GET https://github.com/discordjs/opus/releases/download/v0.4.0/opus-v0.4.0-node-v88-napi-v3-win32-x64-unknown-unknown.tar.gz
npm ERR! node-pre-gyp http 404 https://github.com/discordjs/opus/releases/download/v0.4.0/opus-v0.4.0-node-v88-napi-v3-win32-x64-unknown-unknown.tar.gz
npm ERR! node-pre-gyp WARN Tried to download(404): https://github.com/discordjs/opus/releases/download/v0.4.0/opus-v0.4.0-node-v88-napi-v3-win32-x64-unknown-unknown.tar.gz
npm ERR! node-pre-gyp WARN Pre-built binaries not found for @discordjs/opus@0.4.0 and node@15.8.0 (node-v88 ABI, unknown) (falling back to source compile with node-gyp)
npm ERR! node-pre-gyp http 404 status code downloading tarball https://github.com/discordjs/opus/releases/download/v0.4.0/opus-v0.4.0-node-v88-napi-v3-win32-x64-unknown-unknown.tar.gz
npm ERR! gyp info it worked if it ends with ok
npm ERR! gyp info using node-gyp@7.1.2
npm ERR! gyp info using node@15.8.0 | win32 | x64
npm ERR! gyp info ok
npm ERR! gyp info it worked if it ends with ok
npm ERR! gyp info using node-gyp@7.1.2
npm ERR! gyp info using node@15.8.0 | win32 | x64
npm ERR! gyp info find Python using Python version 3.9.0 found at "F:\python.exe"
npm ERR! gyp ERR! find VS
npm ERR! gyp ERR! find VS msvs_version not set from command line or npm config
npm ERR! gyp ERR! find VS VCINSTALLDIR not set, not running in VS Command Prompt
npm ERR! gyp ERR! find VS could not use PowerShell to find Visual Studio 2017 or newer, try re-running with '--loglevel silly' for more details
npm ERR! gyp ERR! find VS looking for Visual Studio 2015
npm ERR! gyp ERR! find VS - not found
npm ERR! gyp ERR! find VS not looking for VS2013 as it is only supported up to Node.js 8
npm ERR! gyp ERR! find VS
npm ERR! gyp ERR! find VS **************************************************************
npm ERR! gyp ERR! find VS You need to install the latest version of Visual Studio
npm ERR! gyp ERR! find VS including the "Desktop development with C++" workload.
npm ERR! gyp ERR! find VS For more information consult the documentation at:
npm ERR! gyp ERR! find VS https://github.com/nodejs/node-gyp#on-windows
npm ERR! gyp ERR! find VS **************************************************************
npm ERR! gyp ERR! find VS
npm ERR! gyp ERR! configure error
npm ERR! gyp ERR! stack Error: Could not find any Visual Studio installation to use
npm ERR! gyp ERR! stack at VisualStudioFinder.fail (F:\node_modules\npm\node_modules\node-gyp\lib\find-visualstudio.js:121:47)
npm ERR! gyp ERR! stack at F:\node_modules\npm\node_modules\node-gyp\lib\find-visualstudio.js:74:16
npm ERR! gyp ERR! stack at VisualStudioFinder.findVisualStudio2013 (F:\node_modules\npm\node_modules\node-gyp\lib\find-visualstudio.js:351:14)
npm ERR! gyp ERR! stack at F:\node_modules\npm\node_modules\node-gyp\lib\find-visualstudio.js:70:14
npm ERR! gyp ERR! stack at F:\node_modules\npm\node_modules\node-gyp\lib\find-visualstudio.js:372:16
npm ERR! gyp ERR! stack at F:\node_modules\npm\node_modules\node-gyp\lib\util.js:54:7
npm ERR! gyp ERR! stack at F:\node_modules\npm\node_modules\node-gyp\lib\util.js:33:16
npm ERR! gyp ERR! stack at ChildProcess.exithandler (node:child_process:334:5)
npm ERR! gyp ERR! stack at ChildProcess.emit (node:events:378:20)
npm ERR! gyp ERR! stack at maybeClose (node:internal/child_process:1067:16)
npm ERR! gyp ERR! System Windows_NT 10.0.19041
npm ERR! gyp ERR! command "F:\node.exe" "F:\node_modules\npm\node_modules\node-gyp\bin\node-gyp.js" "configure" "--fallback-to-build" "--module=C:\Users\USER\Desktop\HappyMusic\node_modules\@discordjs\opus\prebuild\node-v88-napi-v3-win32-x64-unknown-unknown\opus.node" "--module_name=opus" "--module_path=C:\Users\USER\Desktop\HappyMusic\node_modules\@discordjs\opus\prebuild\node-v88-napi-v3-win32-x64-unknown-unknown" "--napi_version=7" "--node_abi_napi=napi" "--napi_build_version=3" "--node_napi_label=napi-v3"
npm ERR! gyp ERR! cwd C:\Users\USER\Desktop\HappyMusic\node_modules@discordjs\opus
npm ERR! gyp ERR! node -v v15.8.0
npm ERR! gyp ERR! node-gyp -v v7.1.2
npm ERR! gyp ERR! not ok
npm ERR! node-pre-gyp ERR! build error
npm ERR! node-pre-gyp ERR! stack Error: Failed to execute 'F:\node.exe F:\node_modules\npm\node_modules\node-gyp\bin\node-gyp.js configure --fallback-to-build --module=C:\Users\USER\Desktop\HappyMusic\node_modules@discordjs\opus\prebuild\node-v88-napi-v3-win32-x64-unknown-unknown\opus.node --module_name=opus --module_path=C:\Users\USER\Desktop\HappyMusic\node_modules@discordjs\opus\prebuild\node-v88-napi-v3-win32-x64-unknown-unknown --napi_version=7 --node_abi_napi=napi --napi_build_version=3 --node_napi_label=napi-v3' (1)
npm ERR! node-pre-gyp ERR! stack at ChildProcess. (C:\Users\USER\Desktop\HappyMusic\node_modules@discordjs\node-pre-gyp\lib\util\compile.js:85:20)
npm ERR! node-pre-gyp ERR! stack at ChildProcess.emit (node:events:378:20)
npm ERR! node-pre-gyp ERR! stack at maybeClose (node:internal/child_process:1067:16)
npm ERR! node-pre-gyp ERR! stack at Process.ChildProcess._handle.onexit (node:internal/child_process:301:5)
npm ERR! node-pre-gyp ERR! System Windows_NT 10.0.19041
npm ERR! node-pre-gyp ERR! command "F:\node.exe" "C:\Users\USER\Desktop\HappyMusic\node_modules\@discordjs\node-pre-gyp\bin\node-pre-gyp" "install" "--fallback-to-build"
npm ERR! node-pre-gyp ERR! cwd C:\Users\USER\Desktop\HappyMusic\node_modules@discordjs\opus
npm ERR! node-pre-gyp ERR! node -v v15.8.0
npm ERR! node-pre-gyp ERR! node-pre-gyp -v v0.2.0
npm ERR! node-pre-gyp ERR! not ok

npm ERR! A complete log of this run can be found in:
npm ERR! C:\Users\USER\AppData\Local\npm-cache_logs\2021-02-05T11_33_12_104Z-debug.log

Copy link

@RockKingdom
安裝不了可以試試用這個" npm install opusscript ",
我自己也是裝不了" npm install @discordjs/opus "
改裝另一個就可以

Copy link

" npm install ffmpeg-static " 在ubuntu20.04會一直安裝失敗, 用這個網站的安裝方法(https://www.vultr.com/docs/how-to-install-the-latest-static-build-of-ffmpeg) 下去安裝有成功, 但音樂播到一半(約3分鐘)就不會繼續了

Copy link

// 把音量降 50%,不然第一次容易被機器人的音量嚇到 QQ
this.dispatcher[guildID].setVolume(0.2);

可以使用其他指令
但是音量設定沒有成功耶

Copy link
Owner

@hmes98318
之前我也遇過這樣的情況,音樂播起來很卡,而且超過一定時間就會停止播放
後來用同樣的程式碼測試,突然就正常了。播放很順暢,也不會突然停止
猜測可能跟當下的網路環境有關,換個網路試試看

Copy link
Owner

@a25814740
setVolume() 這個方法不是調整機器人的使用者音量,而是播放的音量~
也就是說從 DC 的使用者介面是看不出來有調整過的
如果用 setVolume(0.1) 和 setVolume(1) 下去比較的話,就可以感覺出差別

Copy link

white887 commented Mar 4, 2021

$ node discord.js
C:\Users\user\Desktop\disocrd bot\discord.js:21
const { token } = require('./token.json');
^

SyntaxError: Identifier 'token' has already been declared
?[90m at wrapSafe (internal/modules/cjs/loader.js:979:16)?[39m
?[90m at Module._compile (internal/modules/cjs/loader.js:1027:27)?[39m
?[90m at Object.Module._extensions..js (internal/modules/cjs/loader.js:1092:1
0)?[39m
?[90m at Module.load (internal/modules/cjs/loader.js:928:32)?[39m
?[90m at Function.Module._load (internal/modules/cjs/loader.js:769:14)?[39m
?[90m at Function.executeUserEntryPoint [as runMain] (internal/modules/run_ma
in.js:72:12)?[39m
?[90m at internal/main/run_main_module.js:17:47?[39m

Copy link
Owner

@white887
看起來是 token 被重複宣告了,檢查一下程式碼吧~

Copy link

放歌的時候完全沒有聲音呢@@

Copy link
Owner

@arbius1008
程式碼有修改過嗎?
有錯誤訊息嗎?
如果都沒有的話,檢查一下機器人的使用者音量看看

Copy link

會撥到下一首的時候,撥放清單就完全被清掉了

Copy link
Owner

發現在套件完全沒有更新的情況下,會遇到放歌沒有聲音的問題
正在找尋問題和解法 Q__Q 有新進度會再上來更新

@EKoublier
Copy link

EKoublier commented Apr 4, 2021

想請問一下如果中文顯示部分變亂碼要怎麼改善?

Copy link
Owner

@EKoublier
是指機器人在DC發言出現亂碼嗎?

@EKoublier
Copy link

@B-l-u-e-b-e-r-r-y
是的不好意思,沒有把問題講清楚;是在 Discord機器人於指令接收後,反饋在文字頻道中會出現亂碼問題。

Copy link
Owner

@EKoublier
試試看用記事本打開 discord.js 檔案,看右下角是不是 UTF-8 的格式
如果是不是 UTF-8,就另存為 UTF-8 的格式,再試著運行看看
不過我不是很確定是不是編碼問題,因為沒有遇到過 Orz

Copy link

請問以下代碼是發生什麽事了QAQ

node:internal/modules/cjs/loader:1154
throw err;
^

SyntaxError: c:\Users\macyc\new\config.json: Unexpected end of JSON input
at parse ()
at Object.Module._extensions..json (node:internal/modules/cjs/loader:1151:22)
at Module.load (node:internal/modules/cjs/loader:988:32)
at Function.Module._load (node:internal/modules/cjs/loader:828:14)
at Module.require (node:internal/modules/cjs/loader:1012:19)
at require (node:internal/modules/cjs/helpers:93:18)
at Object. (c:\Users\macyc\new\discord.js:4:20)
at Module._compile (node:internal/modules/cjs/loader:1108:14)
at Object.Module._extensions..js (node:internal/modules/cjs/loader:1137:10)
at Module.load (node:internal/modules/cjs/loader:988:32)

Copy link
Owner

@macychan1
config.json 語法錯誤
你有修改過 config.json 檔嗎?
有的話,注意引號要用 " 而不是 '
沒有的話檢查檔案是否為下面內容

{
    "prefix": "!!"
}

Copy link

請問大大,播放音樂一定要用網址嗎?可不可以直接搜尋

Copy link

ghost commented May 20, 2021

請問這個錯誤碼是發生甚麼事?
playMusic(msg, guildID, musicInfo) ;{
^

ReferenceError: playMusic is not defined
at Object. (D:\data\discordbot\discord.js:59:5)
?[90m at Module._compile (internal/modules/cjs/loader.js:1068:30)?[39m
?[90m at Object.Module._extensions..js (internal/modules/cjs/loader.js:1097:10)?[39m
?[90m at Module.load (internal/modules/cjs/loader.js:933:32)?[39m
?[90m at Function.Module._load
(internal/modules/cjs/loader.js:774:14)?[39m
?[90m at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:72:12)?[39m
?[90m at internal/main/run_main_module.js:17:47?[39m

Copy link

還是一樣

Copy link
Owner

@han-han030

Hi,Token 是在 Bot > Build-A-Bot token 點 Copy 喔

然後再把 Copy 下來的 token 貼到 token.json 中

完整建立機器人的流程:【用 JS 寫一個 Discord Bot!】01 建立機器人

Copy link
Owner

@Chestnut5113

哈哈當初寫的時候沒測試太多,也沒做什麼防呆 XD

程式碼已更新到文章及 Github Repository 中了,主要是更新 join、play 和 leave 的部分~

Copy link
Owner

@SodaSean12
@su3cl3

node-ytdl-core 昨天發布了新版本,更新套件之後應該可以正常使用

Copy link

知道了 謝謝通知我現在試試

Copy link

成功了機器人發出聲音了謝謝你;w; (我找了其他很多文章但都沒用 還好ytdl更新了

@su3cl3
Copy link

su3cl3 commented Jun 28, 2021

更新之後可以正常使用了 謝謝你

Copy link

痾有個問題 我的機器人音樂撥到一半會停掉

Copy link

但後臺正常

Copy link

痾痾痾等等沒事了是我電腦問題不好意思@@

Copy link

我上傳託管就正常了

Copy link

@B-l-u-e-b-e-r-r-y
請問如果我想要音樂有重複撥放音樂的功能要怎麼寫呢?

Copy link

wiwbb commented Jun 28, 2021

playMusic內的91和99行都有一個shift會導致換歌時一次跳兩首歌 若把91行註解後第一首歌會連續播兩次 後面正常
本來打算把self.list[guildID].shift()後面的.shift()刪除 但換歌的時候顯示undefined
測試的時候pause後在resume就無法繼續播放歌曲的 看不出原因

第一次碰這個QQ有點不懂 求解

Copy link

謝謝大大,照著教學做沒啥問題

Copy link
Owner

@SodaSean12

有點難解釋要如何實作欸,大概補一下會用到的 property 都是些什麼東西:

class Music {
    constructor() {
        /**
         * 下面的物件都是以 Discord guild id 當 key,例如:
         * this.isPlaying = {
         *     724145832802385970: false
         * }
         */

        /**
         * 機器人是否正在播放音樂
         * this.isPlaying = {
         *     724145832802385970: false
         * }
         */
        this.isPlaying = {};

        /**
         * 等待播放的音樂隊列,例如:
         * this.queue = {
         *     724145832802385970: [{
         *         name: 'G.E.M.鄧紫棋【好想好想你 Missing You】Official Music Video',
         *         url: 'https://www.youtube.com/watch?v=P6QXo88IG2c&ab_channel=GEM%E9%84%A7%E7%B4%AB%E6%A3%8B'
         *     }]
         * }
         */
        this.queue = {};

        // https://discord.js.org/#/docs/main/stable/class/VoiceConnection
        this.connection = {};

        // https://discord.js.org/#/docs/main/stable/class/StreamDispatcher
        this.dispatcher = {};
    }
}

至於如何實作只能說看人 Orz,可能要有程式底子 + 讀懂我的邏輯才有辦法自己改寫

Copy link
Owner

@wiwbb

playMusic內的91和99行都有一個shift會導致換歌時一次跳兩首歌 若把91行註解後第一首歌會連續播兩次 後面正常
本來打算把self.list[guildID].shift()後面的.shift()刪除 但換歌的時候顯示undefined

真的欸,應該是我寫的時候沒注意到 shift() 會改變原陣列 Orz

把第 99 行改成這樣應該就 OK 了

self.playMusic(msg, guildID, self.queue[guildID][0]);

假日再來更新文章 @@


測試的時候pause後在resume就無法繼續播放歌曲的 看不出原因

這個是 Node.js 版本太高導致的問題,可以參考這篇文:
The function dispatcher.pause() and dispatcher.resume() only works on a second switch #5300

目前可能就只能降版本或等 discord.js 套件修復這個問題

Copy link

wiwbb commented Jun 28, 2021

@B-l-u-e-b-e-r-r-y
謝謝您的回覆 所有問題已經順利解決

但在觀看程式碼與使用時遇到一些問題想請教您 (因為之前稍微學過一些c語言可能會比較以那個方面的提出問題)

像是第1~5行應該是所謂宣告區 查了網路上的資料大部分都寫const是用來設定無法改變的變數 但這邊的作法好像有點像是引入函式庫的感覺有點不太理解這部分的用法,然後const後應該加的是變數名稱 不知道為什麼要加一個大括號.
我在第3行的等號後面想直接輸入token而把它改成=('放機器人的token') 但無法使用 錯誤資訊顯示 {
UnhandledPromiseRejectionWarning: Error [TOKEN_INVALID]: An invalid token was provided.
at WebSocketManager.connect
}
再來是10到15行 queue我看起來是宣告一個陣列並使其初值為空集合,剩下的我看不太出來是什麼,看過網路上一篇文章 this指向全域又可以拿來呼叫,那這個應該是跟discord.js的指令有關係嗎?

看過您其他篇文章的async和您推薦的網站 但不是太明白 我暫且把他理解成有防止錯誤中斷程式執行的一種寫法 但是裡面的try有點不懂用法 try裡面是用await 當收到的訊息為resolve時執行 若為reject則是執行catch裡的程式碼嗎?

94行的this要改成self本來以為是為了避免讓playMusic在多個伺服器的清單出現混亂的狀況 但後來發現有掛上self.list[guildID] 有伺服器的id存在應該不會錯亂才對 那這個self的我就想不到要用在哪裡了.

後來發現上述有一個敘述是 const guildID = msg.guild.id; 所以下面的中括號內無論是guildID或是msg.guild.id指的都是同樣的東西對嗎?

還有關於193行的const music = new Music(); 照這個狀況下面是否可以改成 Music().join(msg); 這種形式.

最後是有關於想要加上其他指令的部分 假設我想要加一個清除播放清單的指令 我應該是在Music內加上一個!!delete(msg)後開始打程式 一開始我是打成這樣
delete(msg){
if(this.list[guildID].length > 0){
delete this.list[msg.guild.id];
msg.channel('已清除播放清單');
}else{
msg.channel('清單中並無歌單');
}
}
然後
if (msg.content === ${prefix}delete) {
music.delete(msg);

}

但出現錯誤資訊
(node:6024) UnhandledPromiseRejectionWarning: Unhandled promise rejection.
這時我想使用上述的async來處理 因為它提供的是 rejection應該放在catch內可執行,但好像也無法這樣用請問是為什麼呢?

問題有點多還麻煩您撥冗回覆了 非常感謝您

Copy link

wiwbb commented Jun 28, 2021

@wiwbb
補充上面最後一段 程式碼修改成
async delete(msg){

    try{

    }catch(e){
        if(this.list[guildID].length > 0){
            delete this.list[msg.guild.id];
            msg.channel('已清除播放清單');
        }else{
            msg.channel('清單中並無歌單');
        }
    }
    
}

Copy link
Owner

@wiwbb

像是第1~5行應該是所謂宣告區 查了網路上的資料大部分都寫const是用來設定無法改變的變數 但這邊的作法好像有點像是引入函式庫的感覺有點不太理解這部分的用法,然後const後應該加的是變數名稱 不知道為什麼要加一個大括號.

引入函式庫的寫法就是這樣:

const ytdl = require('ytdl-core');

至於為什麼要加大括號,這是解構賦值的寫法,可以直接取出物件的值。

const { Client } = require('discord.js');

// 其實也等於
const discord = require('discord.js');
const client = discord.Client;

我在第3行的等號後面想直接輸入token而把它改成=('放機器人的token') 但無法使用 錯誤資訊顯示
UnhandledPromiseRejectionWarning: Error [TOKEN_INVALID]: An invalid token was provided.
at WebSocketManager.connect

這邊取 token 的寫法其實就是上面寫的,是引入的一種,不一定只能用來引入函式庫,自己寫的模組或檔案也可以引入。

const { token } = require('./token.json');

如果要直接放機器人的 token,就是一般宣告變數的寫法:

const token = 'your token';

再來是10到15行 queue我看起來是宣告一個陣列並使其初值為空集合,剩下的我看不太出來是什麼,看過網路上一篇文章 this指向全域又可以拿來呼叫,那這個應該是跟discord.js的指令有關係嗎?

這邊宣告的變數型態都是物件而不是陣列,物件是 {},而陣列是 []

this.isPlaying = {};
this.queue = {};
this.connection = {};
this.dispatcher = {};

至於物件裡面放的是什麼,上面的回應有解釋過。

再來是 this 的問題,這邊的 class 是類別,而 Music 內部的 this 指向的是它自己,所以 this 可以取用到 Music 類別內部定義的所有屬性和方法。

關於 class 可以參考這篇文:JavaScript ES6 class 關鍵字

至於 this,他算是蠻複雜的東西,MDN 的文章寫得蠻詳細,但裡面專有名詞太多不好懂,要學 JS 的話建議從頭打好基礎。

推薦這門我身邊的前端幾乎都有買的課:JavaScript 全攻略:克服 JS 的奇怪部分


94行的this要改成self本來以為是為了避免讓playMusic在多個伺服器的清單出現混亂的狀況 但後來發現有掛上self.list[guildID] 有伺服器的id存在應該不會錯亂才對 那這個self的我就想不到要用在哪裡了.

與伺服器的 ID 無關。這邊是我搞錯了,原以為 on finish event 的 callback 裡面的 this 指向的會是別的東西。

所以這邊可以都用 this 就好。

// 歌曲播放結束時的事件
this.dispatcher[guildID].on('finish', () => {
    // 如果隊列中有歌曲
    if (this.queue[guildID].length > 0) {
        this.playMusic(msg, guildID, self.queue[guildID].shift());
    } else {
        this.isPlaying[guildID] = false;
        msg.channel.send('目前沒有音樂了,請加入音樂 :D');
    }
});

後來發現上述有一個敘述是 const guildID = msg.guild.id; 所以下面的中括號內無論是guildID或是msg.guild.id指的都是同樣的東西對嗎?

是的,不過 const 宣告是區塊性的,有些地方還是維持 msg.guild.id 只是因為我懶得宣告 XD


還有關於193行的const music = new Music(); 照這個狀況下面是否可以改成 Music().join(msg); 這種形式.

new Music().join(msg) 這寫法是 OK。

但如果每次使用 Music 的方法時都寫成 new Music().xxx() 的話,等同於不斷創造新變數,他們會位於不同記憶體位置,每個 Music 內部的變數都是獨立的。


看過您其他篇文章的async和您推薦的網站 但不是太明白 我暫且把他理解成有防止錯誤中斷程式執行的一種寫法 但是裡面的try有點不懂用法 try裡面是用await 當收到的訊息為resolve時執行 若為reject則是執行catch裡的程式碼嗎?

最後是有關於想要加上其他指令的部分 假設我想要加一個清除播放清單的指令 我應該是在Music內加上一個!!delete(msg)後開始打程式

這句 "try裡面是用await 當收到的訊息為resolve時執行" 只對了一半,await 是用 try catch 捕捉錯誤沒錯,但不是收到 resolve 的時候才執行 try。

而是程式碼一定會執行 try,如果是 resolve 會繼續往下執行,reject 則是直接跳到 catch

回到你的程式碼:

async delete(msg) {
    try {
    } catch(e) {
        if(this.list[guildID].length > 0){
            delete this.list[msg.guild.id];
            msg.channel('已清除播放清單');
        } else {
            msg.channel('清單中並無歌單');
        }
    }
}

這邊有幾個問題:

  • 程式碼應該放到 try 裡
  • 函式裡面沒有 await 卻標示成 async function
  • guildID 未被宣告
  • 機器人在頻道發送訊息的寫法應為 msg.channel.send()
delete(msg) {
    try {
        if(this.list[guildID].length > 0){
            delete this.list[msg.guild.id];
            msg.channel.send('已清除播放清單');
        } else {
            msg.channel.send('清單中並無歌單');
        }
    } catch(e) {
        // Error Handling
    }
}

Copy link

$ node discord.js
internal/modules/cjs/loader.js:905
throw err;
^

Error: Cannot find module 'discord.js'
Require stack:

  • C:\Users\JIAEN\Desktop\discord bot2\discord.js
    ?[90m at Function.Module._resolveFilename (internal/modules/cjs/loader.js:902
    :15)?[39m
    ?[90m at Function.Module._load (internal/modules/cjs/loader.js:746:27)?[39m
    ?[90m at Module.require (internal/modules/cjs/loader.js:974:19)?[39m
    ?[90m at require (internal/modules/cjs/helpers.js:92:18)?[39m
    at Object. (C:\Users\JIAEN\Desktop\discord bot2\discord.js:1:20)
    ?[90m at Module._compile (internal/modules/cjs/loader.js:1085:14)?[39m
    ?[90m at Object.Module._extensions..js (internal/modules/cjs/loader.js:1114:1
    0)?[39m
    ?[90m at Module.load (internal/modules/cjs/loader.js:950:32)?[39m
    ?[90m at Function.Module._load (internal/modules/cjs/loader.js:790:14)?[39m
    ?[90m at Function.executeUserEntryPoint [as runMain] (internal/modules/run_ma
    in.js:76:12)?[39m {
    code: ?[32m'MODULE_NOT_FOUND'?[39m,
    requireStack: [ ?[32m'C:\Users\JIAEN\Desktop\discord bot2\discord.js'?[39
    m ]
    }

Copy link
Owner

@JIAEN6666

npm i discord.js

Copy link

可以不用網址用歌曲名稱播放嗎
linux ubuntu vps 運行正常

Copy link

SC-Liii commented Jul 14, 2021

那個...我不太清楚發生甚麼事了...他有三種錯誤呢...

E:\Program Files\nodejs>npm install ffmpeg-static

npm ERR! code EPERM
npm ERR! syscall unlink
npm ERR! path E:\Program Files\nodejs\node_modules\npm.licensee.json
npm ERR! errno -4048
npm ERR! Error: EPERM: operation not permitted, unlink 'E:\Program Files\nodejs\node_modules\npm.licensee.json'
npm ERR! [OperationalError: EPERM: operation not permitted, unlink 'E:\Program Files\nodejs\node_modules\npm.licensee.json'] {
npm ERR! cause: [Error: EPERM: operation not permitted, unlink 'E:\Program Files\nodejs\node_modules\npm.licensee.json'] {
npm ERR! errno: -4048,
npm ERR! code: 'EPERM',
npm ERR! syscall: 'unlink',
npm ERR! path: 'E:\Program Files\nodejs\node_modules\npm\.licensee.json'
npm ERR! },
npm ERR! errno: -4048,
npm ERR! code: 'EPERM',
npm ERR! syscall: 'unlink',
npm ERR! path: 'E:\Program Files\nodejs\node_modules\npm\.licensee.json'
npm ERR! }
npm ERR!

npm ERR! code EPERM
npm ERR! syscall unlink
npm ERR! path E:\Program Files\nodejs\node_modules\npm.mailmap
npm ERR! errno -4048
npm ERR! Error: EPERM: operation not permitted, unlink 'E:\Program Files\nodejs\node_modules\npm.mailmap'
npm ERR! [OperationalError: EPERM: operation not permitted, unlink 'E:\Program Files\nodejs\node_modules\npm.mailmap'] {
npm ERR! cause: [Error: EPERM: operation not permitted, unlink 'E:\Program Files\nodejs\node_modules\npm.mailmap'] {
npm ERR! errno: -4048,
npm ERR! code: 'EPERM',
npm ERR! syscall: 'unlink',
npm ERR! path: 'E:\Program Files\nodejs\node_modules\npm\.mailmap'
npm ERR! },
npm ERR! errno: -4048,
npm ERR! code: 'EPERM',
npm ERR! syscall: 'unlink',
npm ERR! path: 'E:\Program Files\nodejs\node_modules\npm\.mailmap'
npm ERR! }
npm ERR!

npm ERR! code EPERM
npm ERR! syscall unlink
npm ERR! path E:\Program Files\nodejs\node_modules\npm\AUTHORS
npm ERR! errno -4048
npm ERR! Error: EPERM: operation not permitted, unlink 'E:\Program Files\nodejs\node_modules\npm\AUTHORS'
npm ERR! [OperationalError: EPERM: operation not permitted, unlink 'E:\Program Files\nodejs\node_modules\npm\AUTHORS'] {
npm ERR! cause: [Error: EPERM: operation not permitted, unlink 'E:\Program Files\nodejs\node_modules\npm\AUTHORS'] {
npm ERR! errno: -4048,
npm ERR! code: 'EPERM',
npm ERR! syscall: 'unlink',
npm ERR! path: 'E:\Program Files\nodejs\node_modules\npm\AUTHORS'
npm ERR! },
npm ERR! errno: -4048,
npm ERR! code: 'EPERM',
npm ERR! syscall: 'unlink',
npm ERR! path: 'E:\Program Files\nodejs\node_modules\npm\AUTHORS'
npm ERR! }
npm ERR!
npm ERR! The operation was rejected by your operating system.
npm ERR! It's possible that the file was already in use (by a text editor or antivirus),
npm ERR! or that you lack permissions to access it.
npm ERR!
npm ERR! If you believe this might be a permissions issue, please double-check the
npm ERR! permissions of the file and its containing directories, or try running
npm ERR! the command again as root/Administrator.

@JIAEN6666
Copy link

JIAEN6666 commented Jul 14, 2021

可以不用網址用歌曲名稱播放嗎
linux ubuntu vps 運行正常

可以不用網址用歌曲名稱播放嗎
linux ubuntu vps 運行正常

我也想知道!!想請藍莓大大教教❤

Copy link
Owner

@SC-Liii

不是很確定是什麼原因,有可能是權限問題,確認一下跑指令時是不是使用系統管理員的身分
請參考下面這篇問答
npm - EPERM: operation not permitted on Windows

Copy link
Owner

@husky20211 @JIAEN6666

要實現使用者輸入名稱 > 搜尋 yoututbe 相關結果的功能,可以試著加入 node-ytsr 這個模組寫看看

目前比較沒時間研究這些,請見諒 Orz

Copy link

請問一下可不可以加一個loop的指令 謝謝orz

@wolf-yuan-6115
Copy link

@husky20211 @JIAEN6666

要實現使用者輸入名稱 > 搜尋 yoututbe 相關結果的功能,可以試著加入 node-ytsr 這個模組寫看看

目前比較沒時間研究這些,請見諒 Orz

建議用youtube-sr

Repository owner locked and limited conversation to collaborators Aug 31, 2021

This issue was moved to a discussion.

You can continue the conversation there. Go to discussion →

Labels
None yet
Projects
None yet
Development

No branches or pull requests