Событие завершения BroadcastDispatcher вызывается только один раз (discord.js)

2020-08-01 javascript discord discord.js voice

Я пытаюсь сделать LoFi Radio для Discord. Всякий раз, когда бот выходит в онлайн, он присоединяется к каждому каналу с именем lofi на сервере (это очень плохо закодировано и не будет работать, если на одном сервере более двух каналов lofi, я знаю, исправлю позже). событие завершения диспетчера вещания вызывается только один раз. Я хочу, чтобы он воспроизводил новую случайную песню каждый раз, когда останавливается последняя, ​​но он воспроизводит только одну, когда она выходит в онлайн, и одну после этой песни, тогда диспетчер имеет значение null что меня смущает.

Код:

var fs = require('fs');
var client = new Client();
var files = fs.readdirSync("./mp3/");

var broadcast;
var curSong;
var dispatcher;

client.on("ready", () => {
    console.log(`------------${client.user.tag}------------\n`);

    curSong = `./mp3/${files[Math.floor(Math.random() * files.length)]}`;
    broadcast = client.voice.createBroadcast();
    broadcast.play(curSong);
    broadcast.dispatcher.on("finish", () => {
        curSong = `./mp3/${files[Math.floor(Math.random() * files.length)]}`;
        broadcast.play(curSong);
        client.user.setPresence({ activity: { name: curSong.split("/")[2].replace(".mp3", ""), type: "STREAMING", url: "https://twitch.tv/TwitchChannel" }, status: "Online" });
    });

    client.user.setPresence({ activity: { name: curSong.split("/")[2].replace(".mp3", ""), type: "STREAMING", url: "https://twitch.tv/TwitchChannel" }, status: "Online" });

    client.channels.cache.array().forEach((chnl) => {
        if(chnl.name.toLowerCase() == "lofi") {
            chnl.join().then(connection => {
                connection.play(broadcast);
            });
        }
    });
});

Answers

Я исправил это, создав функцию внутри события готовности клиента.

Это код всего бота (исключая логин и сообщение)

var fs = require('fs');
var client = new Client();
var files = fs.readdirSync("./mp3/");

var broadcast;
var curSong;
var dispatcher;

client.on("ready", () => {
    console.log(`------------${client.user.tag}------------\n`);

    curSong = `./mp3/${files[Math.floor(Math.random() * files.length)]}`;
    broadcast = client.voice.createBroadcast();
    broadcast.play(curSong);
    dispatcherLol();

    client.user.setPresence({ activity: { name: curSong.split("/")[2].replace(".mp3", ""), type: "STREAMING", url: "https://twitch.tv/AtlasDevelopment" }, status: "Online" });

    client.channels.cache.array().forEach((chnl) => {
        if(chnl.name.toLowerCase() == "lofi") {
            chnl.join().then(connection => {
                connection.play(broadcast);
            });
        }
    });

    function dispatcherLol() {
        broadcast.dispatcher.on("finish", () => {
            curSong = `./mp3/${files[Math.floor(Math.random() * files.length)]}`;
            broadcast.play(curSong);
            client.user.setPresence({ activity: { name: curSong.split("/")[2].replace(".mp3", ""), type: "STREAMING", url: "https://twitch.tv/AtlasDevelopment" }, status: "Online" });
            dispatcherLol();
        });
        return;
    }
});

Related