【问题标题】:Node.js can't read else if or else partNode.js 无法读取 else if 或 else 部分
【发布时间】:2021-08-31 09:59:02
【问题描述】:

我写了一个不和谐的机器人。 “o”是游戏的第一个字母。 “阿特拉”是跳过。当我写 -o MUSIC_NAME 时,音乐正在添加队列并开始播放。当我再次写作时,只需添加队列。一切都还好,还在这里。当我写 -atla.它也运行良好。但是当我允许改变自动音乐本身时,它会自动改变音乐。但问题就在这里。如果 (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 && 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);

【问题讨论】:

    标签: node.js if-statement discord.js


    【解决方案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ı.")
            }
        });
    }
    

    【讨论】:

    • 我试过这样,但它不再工作了。工作 endHandler 但不工作 else 或 else if part.
    • @feyyum 我已经更新了我的答案,因为我现在更好地理解了你的代码
    • 现在可以使用了。我很感激你。
    猜你喜欢
    • 1970-01-01
    • 2022-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-17
    • 2018-07-29
    相关资源
    最近更新 更多