setTimeout js和语音通道不一致

时间:2020-02-14 16:34:01

标签: javascript node.js

首先,很抱歉我的英语不好。 我正在开发一个不和谐的音乐机器人,我想添加一个功能,使该机器人在与语音通道断开连接之前保持30秒钟(当空闲=所有音乐都没播放更多内容时)

async function play(guild, song) {
    const serverQueue = queue.get(guild.id);
    if (!song) {
        setTimeout(function() {serverQueue.voiceChannel.leave();}, 30000);
        queue.delete(guild.id);
        return;
    }
    console.log(serverQueue.songs);
    const dispatcher = serverQueue.connection.playOpusStream(await ytdl(song.url))
        .on('end', reason => {
            console.log(reason)
            serverQueue.songs.shift()
            play(guild, serverQueue.songs[0])
        })
        .on('error', error => console.error(error));
    serverQueue.textChannel.send(`\`\`\`Start playing : ${song.title}\`\`\``);
}

但是我想让它在使用“停止”命令时立即与语音通道断开连接并结束所有操作

else if (command === 'play') {

    const voiceChannel = message.member.voiceChannel;
    ...
}
else if (command === 'stop') {
    if (!message.member.voiceChannel) return message.channel.send("you are not in a voice channel")
    if (!serverQueue) return message.channel.send("nothing to stop!")
    serverQueue.songs = []
    serverQueue.connection.dispatcher.end();

    serverQueue.voiceChannel.leave();

    return undefined;
}
else if (command === 'next') {
    if (!message.member.voiceChannel) return message.channel.send("you are not in a voice channel")
    if (!serverQueue) return message.channel.send("nothing!")
    serverQueue.connection.dispatcher.end();
    message.channel.send("```Next music!```");
    return undefined;
}

当结束播放音乐时,它会等待30秒,然后断开连接,好! 但是问题是:如果有人在等待30秒时使用了“播放”命令,它会播放他的音乐曲目,但会在30秒后剪切所有内容(即使第二首曲目没有结束)

1 个答案:

答案 0 :(得分:1)

您将需要将setTimeout分配给变量。然后在再次播放时使用clearTimeout功能。要取消serverQueue.voiceChannel.leave()

文档说明了如何使用它here