#node.js #if-statement #discord.js
Вопрос:
Я написал бота для раздора. «о» — это первая буква игры. «атла» — это скип. Когда я написал-o MUSIC_NAME, музыка добавляет очередь и начинает воспроизводиться. И когда я напишу снова, просто добавлю очередь. Здесь все еще в порядке. Когда я писал-атла. Это также отлично работает. Но когда я разрешаю изменять саму автоматическую музыку, она автоматически меняет музыку. Но проблема здесь в другом. Конец последней музыки не работает иначе, если (list.length === 0) блокируется в функции endHandler. Как я могу это исправить? Спасибо за ваше внимание.
const Discord = require('discord.js');
const config = require("./config.json");
const ytdl = require('ytdl-core');
const google = require('googleapis');
const youtube = new google.youtube_v3.Youtube({ version: 'v3', auth: "api_key" });
const client = new Discord.Client();
const prefix = "-";
let dispatcher;
let connection;
let url;
let list = [];
let cMusic;
let pStatus = false;
client.once('ready', () => {
console.log('Ready!');
client.user.setActivity("Hymn For The Weekend", {
type: "LISTENING",
});
});
client.on('message', async (message) => {
if (message.author.bot) return;
if (!message.content.startsWith(prefix)) return;
if (!message.guild) return;
const commandBody = message.content.slice(prefix.length);
const args = commandBody.split(' ');
const command = args.shift().toLowerCase();
if (command === 'yardım') {
message.reply(
`
Komutlar:
-o MUSIC_NAME --> "o", oynat kelimesinden gelmekte.
-durdur
-devam
-atla
-sg --> çıkış yaptırır.
`
);
}
if (command === 'o') {
mName = args.join(' ');
if (args.length == 0) {
message.reply("Geçersiz oynatma isteğinde bulundun. Adam ol.");
} else {
if (message.member.voice.channel) {
connection = await message.member.voice.channel.join();
await youtube.search.list({ part: 'snippet', q: `${mName}` }, async function (err, data) {
if (err) {
console.error('Error: ' err);
message.reply('Hata: ' err);
}
if (data) {
let mQueue = 0;
if(data.data.items[mQueue].id.kind === 'youtube#video') {
url = "https://www.youtube.com/watch?v=" data.data.items[mQueue].id.videoId;
console.log(url);
} else if (data.data.items[mQueue 1].id.kind === 'youtube#video') {
url = "https://www.youtube.com/watch?v=" data.data.items[mQueue 1].id.videoId;
console.log(url);
} else if (data.data.items[mQueue 2].id.kind === 'youtube#video') {
url = "https://www.youtube.com/watch?v=" data.data.items[mQueue 2].id.videoId;
console.log(url);
} else {
message.reply("Aradığın şarkıyı bulamadım.")
}
let mObj = {
name: mName,
link: url
}
await list.push(mObj);
message.channel.send(`"${mObj.name}" sıraya eklendi.`);
if (list.length === 1 amp;amp; pStatus === false) {
pStatus = true;
cMusic = list.shift();
dispatcher = connection.play(ytdl(`${cMusic.link}`, { filter: 'audioonly' }));
dispatcher.on('start', () => {
message.reply(`${cMusic.name} çalıyorum.`);
});
endHandler();
}
}
});
} else {
message.reply("Önce sesli bir kanala katılmalısın!");
}
}
}
if (command === 'durdur') {
if (message.member.voice.channel) {
dispatcher.pause();
pStatus = false;
} else {
message.reply("Önce sesli bir kanala katılmalısın.")
}
}
if (command === 'devam') {
if (message.member.voice.channel) {
message.reply("Bu özellik şu an kullanımda değil.")
} else {
message.reply("Önce sesli bir kanala katılmalısın.")
}
}
if (command === 'atla') {
if (message.member.voice.channel) {
dispatcher.pause();
pStatus = false;
if (list.length >= 1) {
cMusic = list.shift();
dispatcher = connection.play(ytdl(`${cMusic.link}`, { filter: 'audioonly' }));
dispatcher.on('start', () => {
message.reply(`${cMusic.name} çalıyorum.`);
});
endHandler();
} else {
message.reply("Liste sonlandı.");
}
} else {
message.reply("Önce sesli bir kanala katılmalısın.")
}
}
if (command === 'sg') {
pStatus = false;
message.reply("Ben gidiyom hoçça galın.");
connection.disconnect();
}
const endHandler = () => {
dispatcher.on('finish', () => {
pStatus = false;
if (list.length >= 1) {
message.reply("listede birden çok link var.")
cMusic = list.shift();
dispatcher = connection.play(ytdl(`${cMusic.link}`, { filter: 'audioonly' }));
dispatcher.on('start', () => {
message.reply(`${cMusic.name} çalıyorum.`);
pStatus = true;
});
} else if (list.length === 0) {
message.reply("Liste sonlandı.")
<---------!THIS PART IS NOT WORKING!--------->
}
});
}
});
client.login(config.BOT_TOKEN);
Ответ №1:
Я не знаком с ботами Discord, но я не думаю endHandler
, что вы когда-нибудь запустите эту else if
часть так, как она есть, потому что ваш код всегда создает новую dispatcher
, когда воспроизводит следующую песню, но никогда не настраивает finish
для нее обработчик.
const endHandler = () => {
dispatcher.on('finish', () => {
pStatus = false;
if (list.length >= 1) {
message.reply("listede birden çok link var.")
cMusic = list.shift();
// A new dispatcher is created which means no `finish` event handlers exist at this point.
dispatcher = connection.play(ytdl(`${cMusic.link}`, { filter: 'audioonly' }));
dispatcher.on('start', () => {
message.reply(`${cMusic.name} çalıyorum.`);
pStatus = true;
});
} else if (list.length === 0) {
message.reply("Liste sonlandı.")
}
});
}
Что вам нужно сделать, так это снова зарегистрировать обработчик событий для finish
события. Самое быстрое (и, возможно, грязное) решение-позвонить endHandler()
еще раз:
const endHandler = () => {
dispatcher.on('finish', () => {
pStatus = false;
if (list.length >= 1) {
message.reply("listede birden çok link var.")
cMusic = list.shift();
// A new dispatcher is created which means no `finish` event handlers exist at this point.
dispatcher = connection.play(ytdl(`${cMusic.link}`, { filter: 'audioonly' }));
dispatcher.on('start', () => {
message.reply(`${cMusic.name} çalıyorum.`);
pStatus = true;
});
endHandler();
} else if (list.length === 0) {
message.reply("Liste sonlandı.")
}
});
}
Комментарии:
1. Я пробовал так же, но это снова не работает. Рабочий манипулятор, но не работающий где-либо еще или еще, если часть.
2. @feyyum я обновил свой ответ, так как теперь немного лучше понимаю ваш код
3. Теперь это работает. Я благодарен тебе за это.