javascript - 如何创建音乐机器人
问题描述
我正在尝试使用 Javascript 构建一个音乐机器人,但我卡住了,当我使用命令播放音乐时,机器人加入了语音频道,但它没有开始播放歌曲,我知道我的代码有一些奇怪的部分,但我没有'不知道如何更新它,我也确实在“discord.js ffmpeg fluent-ffmpeg @discordjs/opus ytdl-core”这一行中安装了运行音乐所需的软件包,我可以得到一些帮助,请使用我使用的代码:
const Discord = require("discord.js");
const { prefix, token } = require("./config.json");
const ytdl = require("ytdl-core");
const client = new Discord.Client();
const queue = new Map();
client.once("ready", () => {
console.log("Ready!");
});
client.once("reconnecting", () => {
console.log("Reconnecting!");
});
client.once("disconnect", () => {
console.log("Disconnect!");
});
client.on("message", async message => {
if (message.author.bot) return;
if (!message.content.startsWith(prefix)) return;
const serverQueue = queue.get(message.guild.id);
if (message.content.startsWith(`${prefix}play`)) {
execute(message, serverQueue);
return;
} else if (message.content.startsWith(`${prefix}skip`)) {
skip(message, serverQueue);
return;
} else if (message.content.startsWith(`${prefix}stop`)) {
stop(message, serverQueue);
return;
} else {
message.channel.send("You need to enter a valid command!");
}
});
async function execute(message, serverQueue) {
const args = message.content.split(" ");
const voiceChannel = message.member.voice.channel;
if (!voiceChannel)
return message.channel.send(
"You need to be in a voice channel to play music!"
);
const permissions = voiceChannel.permissionsFor(message.client.user);
if (!permissions.has("CONNECT") || !permissions.has("SPEAK")) {
return message.channel.send(
"I need the permissions to join and speak in your voice channel!"
);
}
const songInfo = await ytdl.getInfo(args[1]);
const song = {
title: songInfo.videoDetails.title,
url: songInfo.videoDetails.video_url,
};
if (!serverQueue) {
const queueContruct = {
textChannel: message.channel,
voiceChannel: voiceChannel,
connection: null,
songs: [],
volume: 5,
playing: true
};
queue.set(message.guild.id, queueContruct);
queueContruct.songs.push(song);
try {
var connection = await voiceChannel.join();
queueContruct.connection = connection;
play(message.guild, queueContruct.songs[0]);
} catch (err) {
console.log(err);
queue.delete(message.guild.id);
return message.channel.send(err);
}
} else {
serverQueue.songs.push(song);
return message.channel.send(`${song.title} has been added to the queue!`);
}
}
function skip(message, serverQueue) {
if (!message.member.voice.channel)
return message.channel.send(
"You have to be in a voice channel to stop the music!"
);
if (!serverQueue)
return message.channel.send("There is no song that I could skip!");
serverQueue.connection.dispatcher.end();
}
function stop(message, serverQueue) {
if (!message.member.voice.channel)
return message.channel.send(
"You have to be in a voice channel to stop the music!"
);
if (!serverQueue)
return message.channel.send("There is no song that I could stop!");
serverQueue.songs = [];
serverQueue.connection.dispatcher.end();
}
function play(guild, song) {
const serverQueue = queue.get(guild.id);
if (!song) {
serverQueue.voiceChannel.leave();
queue.delete(guild.id);
return;
}
const dispatcher = serverQueue.connection
.play(ytdl(song.url))
.on("finish", () => {
serverQueue.songs.shift();
play(guild, serverQueue.songs[0]);
})
.on("error", error => console.error(error));
dispatcher.setVolumeLogarithmic(serverQueue.volume / 5);
serverQueue.textChannel.send(`Start playing: **${song.title}**`);
}
client.login(token);
解决方案
我可能会和你开始 discord-bot 完全相同的代码。
我会描述我的情况。
我的 args 有空格
,我的前缀是hey!
(包括空格),我想播放像hey! play [music]
.
在这种情况下, args[1] 是“播放”,所以它不播放任何东西。不是youtube链接。
我不确定 ytdl,我只是复制并粘贴它。
当我尝试!play popsong
时,它不会出现一些错误。
这是因为,args[1] (await ytdl.getInfo(args[1]);
) 必须是 youtube 链接包含https://
。
所以,我更改了execute
函数中的一些代码。
async function execute(message, serverQueue) {
const args = message.content.split(' ');
var another = args.slice(1, args.length).join(' ');
if(another.includes('youtu') && !another.startsWith('https://')) {
another = "https://"+another;
}
if(another.includes('youtu')) {
// play here
}
else {
// search youtube data api
}
}
只是为了测试,检查上面的2个案例。
推荐阅读
- javascript - I want to put a materialTopTabNavigator under the header echo with navigationOptions of a stack
- c++ - 使 std::optional 构造函数发出隐式转换警告
- docker - 使 Nginx 代理仅升级 Docker Compose 堆栈中的 SignalR WebSocket 连接
- assembly - 为什么不允许 xor'ing DS?
- cookies - MarkLogic xdmp.http* 支持响应标头中的多个 Set-Cookie
- python - 当我尝试从 except 块中的列表中删除记录时,为什么会出现“IndexError: list index out of range”
- tcp - CPU如何分配来自网络的数据?
- angular - 调用服务函数时未定义“订阅”
- r - 是否有一个 R 函数可以按某个变量对表进行分组?
- java - 如何在 JFrame 的方法中打印数据