-
Notifications
You must be signed in to change notification settings - Fork 0
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
Comments
您好,不知道為何我輸入的!!join後,機器人完全都沒反應,不會加入頻道。 |
請問 !!join 機器人加進來後,按 !!play 加上網址 沒有跑出提示訊息及播放歌曲 |
@thisiskk
如果上述兩點都有做到,看看 terminal 有沒有錯誤訊息,可以貼上來我看看是什麼問題~ |
@kurega |
可以了 |
請問我在撥放音樂時沒反應 Error: No video id found: https://www.youtube.com/watch?v=lg1N-4jJJrk&ab_channel=TrapNation 請問這是什麼意思 |
問題出在這行的 musicURL 字串沒處理乾淨,前面多了一個空格 const musicURL = msg.content.replace(`${prefix}play`, ''); 改為這樣應該就正常了: const musicURL = msg.content.replace(`${prefix}play`, '').trim(); 感謝回報~ |
npm install @discordjs/opus |
@RockKingdom |
跑出一堆err |
npm ERR! code 1 npm ERR! A complete log of this run can be found in: |
@RockKingdom |
" npm install ffmpeg-static " 在ubuntu20.04會一直安裝失敗, 用這個網站的安裝方法(https://www.vultr.com/docs/how-to-install-the-latest-static-build-of-ffmpeg) 下去安裝有成功, 但音樂播到一半(約3分鐘)就不會繼續了 |
// 把音量降 50%,不然第一次容易被機器人的音量嚇到 QQ 可以使用其他指令 |
@hmes98318 |
@a25814740 |
$ node discord.js SyntaxError: Identifier 'token' has already been declared |
@white887 |
放歌的時候完全沒有聲音呢@@ |
@arbius1008 |
會撥到下一首的時候,撥放清單就完全被清掉了 |
發現在套件完全沒有更新的情況下,會遇到放歌沒有聲音的問題 |
想請問一下如果中文顯示部分變亂碼要怎麼改善? |
@EKoublier |
@B-l-u-e-b-e-r-r-y |
@EKoublier |
請問以下代碼是發生什麽事了QAQ node:internal/modules/cjs/loader:1154 SyntaxError: c:\Users\macyc\new\config.json: Unexpected end of JSON input |
@macychan1
|
請問大大,播放音樂一定要用網址嗎?可不可以直接搜尋 |
請問這個錯誤碼是發生甚麼事? ReferenceError: playMusic is not defined |
還是一樣 |
Hi,Token 是在 Bot > Build-A-Bot token 點 Copy 喔 然後再把 Copy 下來的 token 貼到 token.json 中 完整建立機器人的流程:【用 JS 寫一個 Discord Bot!】01 建立機器人 |
哈哈當初寫的時候沒測試太多,也沒做什麼防呆 XD 程式碼已更新到文章及 Github Repository 中了,主要是更新 join、play 和 leave 的部分~ |
node-ytdl-core 昨天發布了新版本,更新套件之後應該可以正常使用 |
知道了 謝謝通知我現在試試 |
成功了機器人發出聲音了謝謝你;w; (我找了其他很多文章但都沒用 還好ytdl更新了 |
更新之後可以正常使用了 謝謝你 |
痾有個問題 我的機器人音樂撥到一半會停掉 |
但後臺正常 |
痾痾痾等等沒事了是我電腦問題不好意思@@ |
我上傳託管就正常了 |
@B-l-u-e-b-e-r-r-y |
playMusic內的91和99行都有一個shift會導致換歌時一次跳兩首歌 若把91行註解後第一首歌會連續播兩次 後面正常 第一次碰這個QQ有點不懂 求解 |
謝謝大大,照著教學做沒啥問題 |
有點難解釋要如何實作欸,大概補一下會用到的 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,可能要有程式底子 + 讀懂我的邏輯才有辦法自己改寫 |
真的欸,應該是我寫的時候沒注意到 shift() 會改變原陣列 Orz 把第 99 行改成這樣應該就 OK 了 self.playMusic(msg, guildID, self.queue[guildID][0]); 假日再來更新文章 @@
這個是 Node.js 版本太高導致的問題,可以參考這篇文: 目前可能就只能降版本或等 discord.js 套件修復這個問題 |
@B-l-u-e-b-e-r-r-y 但在觀看程式碼與使用時遇到一些問題想請教您 (因為之前稍微學過一些c語言可能會比較以那個方面的提出問題) 像是第1~5行應該是所謂宣告區 查了網路上的資料大部分都寫const是用來設定無法改變的變數 但這邊的作法好像有點像是引入函式庫的感覺有點不太理解這部分的用法,然後const後應該加的是變數名稱 不知道為什麼要加一個大括號. 看過您其他篇文章的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)後開始打程式 一開始我是打成這樣
但出現錯誤資訊 問題有點多還麻煩您撥冗回覆了 非常感謝您 |
@wiwbb
|
引入函式庫的寫法就是這樣: const ytdl = require('ytdl-core'); 至於為什麼要加大括號,這是解構賦值的寫法,可以直接取出物件的值。 const { Client } = require('discord.js');
// 其實也等於
const discord = require('discord.js');
const client = discord.Client;
這邊取 token 的寫法其實就是上面寫的,是引入的一種,不一定只能用來引入函式庫,自己寫的模組或檔案也可以引入。 const { token } = require('./token.json'); 如果要直接放機器人的 token,就是一般宣告變數的寫法: const token = 'your token';
這邊宣告的變數型態都是物件而不是陣列,物件是 this.isPlaying = {};
this.queue = {};
this.connection = {};
this.dispatcher = {}; 至於物件裡面放的是什麼,上面的回應有解釋過。 再來是 關於 class 可以參考這篇文:JavaScript ES6 class 關鍵字 至於 推薦這門我身邊的前端幾乎都有買的課:JavaScript 全攻略:克服 JS 的奇怪部分
與伺服器的 ID 無關。這邊是我搞錯了,原以為 on finish event 的 callback 裡面的 所以這邊可以都用 // 歌曲播放結束時的事件
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');
}
});
是的,不過
但如果每次使用 Music 的方法時都寫成
這句 "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('清單中並無歌單');
}
}
} 這邊有幾個問題:
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
}
} |
$ node discord.js Error: Cannot find module 'discord.js'
|
|
可以不用網址用歌曲名稱播放嗎 |
那個...我不太清楚發生甚麼事了...他有三種錯誤呢... E:\Program Files\nodejs>npm install ffmpeg-static npm ERR! code EPERM npm ERR! code EPERM npm ERR! code EPERM |
我也想知道!!想請藍莓大大教教❤ |
不是很確定是什麼原因,有可能是權限問題,確認一下跑指令時是不是使用系統管理員的身分 |
要實現使用者輸入名稱 > 搜尋 yoututbe 相關結果的功能,可以試著加入 node-ytsr 這個模組寫看看 目前比較沒時間研究這些,請見諒 Orz |
請問一下可不可以加一個loop的指令 謝謝orz |
建議用youtube-sr |
This issue was moved to a discussion.
You can continue the conversation there. Go to discussion →
【用 JS 寫一個 Discord Bot!】02 音樂機器人 - 一顆藍莓
前端工程師與她的筆記們
https://b-l-u-e-b-e-r-r-y.github.io/post/DiscordBot02/
The text was updated successfully, but these errors were encountered: