discord - 我的不和谐音乐机器人会播放音乐,但是当我尝试停止它时它不起作用
问题描述
当我执行play
命令时,我的机器人工作,但是当我执行stop
命令时,它给了我一堆错误。我正在使用FFmpeg
和discord.js
。我的代码是:
const Discord = require('discord.js');
const bot = new Discord.Client
const ytdl = require("ytdl-core")
const token = 'MY API TOKEN'
const PREFIX = '?';
var version = '1.2';
var servers = {};
bot.on('ready', () => {
console.log('This bot is online!' + version);
})
bot.on('message', message => {
let args = message.content.substring(PREFIX.length).split(" ");
switch (args[0]) {
case 'play':
function play(connection, message) {
var server = servers[message.guild.id];
server.dispatcher = connection.play(ytdl(server.queue[0], { filter: "audioonly" }))
server.queue.shift();
server.dispatcher.on("end", function () {
if (server.queue[0]) {
play(connection, message);
} else {
connection.disconnect();
}
});
}
if (!args[1]) {
message.channel.send("You need to provide a link!")
return;
}
if (!message.member.voice.channel) {
message.channel.send("You must be in a Voice Channel to play the bot!")
return;
}
if (!servers[message.guild.id]) servers[message.guild.id] = {
queue: []
}
var server = servers[message.guild.id];
server.queue.push(args[1]);
if (!message.guild.voice) message.member.voice.channel.join().then(function (connection) {
play(connection, message);
})
break;
case 'skip':
var server = servers[message.guild.id]
if (servers.dispatcher) server.dispatcher.end()
message.channel.send("Skipping the song...")
break;
case 'stop':
if (message.guild.voice.connection) {
for (var i = server.queue.length - 1; i >= 0; i--) {
server.queue.splice(i, 1);
}
server.dispatcher.end();
message.channel.send("Ending the queue leaving the voice channel!")
console.log('stopped the queue')
}
if (message.guild.connection) message.guild.connection.voice.disconnect();
break;
}
});
bot.login(token);
当我玩的时候,它工作得很好。但是当我停止音乐时,我收到了这个错误:
TypeError: Cannot read property 'queue' of undefined
at Client.<anonymous> (C:\Users\picar\Desktop\DiscordMusicBot\index.js:79:36)
at Client.emit (events.js:315:20)
at MessageCreateAction.handle (C:\Users\picar\Desktop\DiscordMusicBot\node_modules\discord.js\src\client\actions\MessageCreate.js:31:14)
at Object.module.exports [as MESSAGE_CREATE] (C:\Users\picar\Desktop\DiscordMusicBot\node_modules\discord.js\src\client\websocket\handlers\MESSAGE_CREATE.js:4:32)
at WebSocketManager.handlePacket (C:\Users\picar\Desktop\DiscordMusicBot\node_modules\discord.js\src\client\websocket\WebSocketManager.js:386:31)
at WebSocketShard.onPacket (C:\Users\picar\Desktop\DiscordMusicBot\node_modules\discord.js\src\client\websocket\WebSocketShard.js:436:22)
at WebSocketShard.onMessage (C:\Users\picar\Desktop\DiscordMusicBot\node_modules\discord.js\src\client\websocket\WebSocketShard.js:293:10)
at WebSocket.onMessage (C:\Users\picar\Desktop\DiscordMusicBot\node_modules\ws\lib\event-target.js:125:16)
at WebSocket.emit (events.js:315:20)
at Receiver.receiverOnMessage (C:\Users\picar\Desktop\DiscordMusicBot\node_modules\ws\lib\websocket.js:800:20)
解决方案
case 'stop':
if (message.guild.voice.connection) {
var server = servers[message.guild.id]; // I think this could be useful
for (var i = server.queue.length - 1; i >= 0; i--) {
server.queue.splice(i, 1);
}
server.dispatcher.end();
message.channel.send("Ending the queue leaving the voice channel!")
console.log('stopped the queue')
}
if (message.guild.connection) message.guild.connection.voice.disconnect();
break;
推荐阅读
- python - 用于表格数据的自动编码器的高 mse 损失
- node.js - 通过 Travis CI API 传递 Node.JS 运行参数
- javascript - 带有 Next.js 的自定义脚本
- c++ - 完美的转发和dll导出
- angular6 - Valor Software - ngx bootstrap Alert 组件在 Angular 6 中以编程方式具有关闭按钮?
- c# - 如何使用 C# 显示 XML 的层次结构
- php - 循环遍历数组相关模型,创建一个嵌套数组
- sql-server - 使用 SSIS 远程连接到 SQL Server
- electron - 制作电子应用程序 oneClick 以进行更新,但不用于首次安装
- php - 有没有办法用默认的 Bootstrap 4 小部件 Yii2 制作侧边栏