Node.js не могу прочитать еще, если или еще часть

#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. Теперь это работает. Я благодарен тебе за это.