abdulazeez
abdulazeez

Reputation: 71

keep playing the song even if someone else joined the channel

Hello I'm trying to make the bot play specific songs then I want the bot to leave the channel and I made it, but the problem is when someone else joins the channel while the bot is playing it restart playing the songs

client.on('voiceStateUpdate', async (oldState, newState) => {
    const channel = client.channels.cache.get('921118985876017217')
    if (oldState.channel == null && newState.channel == channel) {
  await new Promise(function (resolve , reject) {
            resolve(
                joinVoiceChannel({
                    channelId: channel.id,
                    guildId: newState.guild.id,
                    adapterCreator: newState.guild.voiceAdapterCreator
                }))
            let stream = ytdl('https://www.youtube.com/watch?v=TU1i6I1ms6s', {
                filter: "audioonly",
                fmt: "mp3",
                encoderArgs: ['-af', 'bass=g=10'],
            })

            let secStream = ytdl('https://www.youtube.com/watch?v=wHqKkiHlvJc&list=RDwHqKkiHlvJc&start_radio=1', {
                filter: "audioonly",
                fmt: "mp3",
                encoderArgs: ['-af', 'bass=g=10'],
            })
         
            const resource = createAudioResource(stream, {
                inputType: StreamType.Arbitrary,
                inlineVolume: true,
            });
            // resource.volume.setVolume(0.5);
            const secReasorce = createAudioResource(secStream, {
                inputType: StreamType.Arbitrary, /* StreamType.Arbitrary type of the song like mpe */
                inlineVolume: true,
            });
            const player = createAudioPlayer();
            player.play(resource)
            const connection = getVoiceConnection(oldState.guild.id)
            connection.subscribe(player)
            player.on(AudioPlayerStatus.Idle, () =>setTimeout(() => {
                try{
                    {player.play(secReasorce)}
                }catch{
                    connection.destroy()
                }
            }, 3000))
            player.on( AudioPlayerStatus.Playing , ()=>{
                //I think there will be the solution but I don't know any functions does what I want
            } )
        })

Upvotes: 1

Views: 74

Answers (1)

Marble
Marble

Reputation: 79

You have to keep track of whether it's already playing audio or not. Since you're getting the channel based off of an ID; I'm assuming you're only using it in one voice channel. So you could just have a boolean outside of the lambda expression's scope that keeps track of whether it's playing.

If you implement that you'd have something like this:

let isPlaying = false; // Create a variable to keep track of whether it's playing or not.

client.on('voiceStateUpdate', async (oldState, newState) => {

    // If it's already playing, return and do nothing.
    if (isPlaying) return;

    const channel = client.channels.cache.get('921118985876017217')
    if (oldState.channel == null && newState.channel == channel) {
            await new Promise(function (resolve , reject) {
            resolve(
                joinVoiceChannel({
                    channelId: channel.id,
                    guildId: newState.guild.id,
                    adapterCreator: newState.guild.voiceAdapterCreator
                }))

            isPlaying = true; // Bot successfully joined vc, it now begins to play audio.

            // Removed code unrelated to the answer so you can more easily see the changes.

            player.on(AudioPlayerStatus.Idle, () =>setTimeout(() => {
                try{
                    {player.play(secReasorce)}
                }catch{
                    // I assume this is where you make it disconnect? 
                    // If so, retain the integrity of `isPlaying` by setting it back to false.
                    isPlaying = false;
                    connection.destroy()
                }
            }, 3000))
        })```

Upvotes: 2

Related Questions