I am creating a discord music bot. Right now, it can play music, show queue, pause, resume, stop etc. I am trying to implement a looping feature which loops either a single music or a whole list. However, its not working. I can't see anything wrong with the logic with my code.
This is my structure:
const structure = {
channel: message.channel,
vc: channel,
volume: 85,
playing: true,
queue: [],
connection: null,
loopall: false,//added
loopone: false//added
};
This is the play function of bot
async function play(track) {
try {
const data = message.client.queue.get(message.guild.id);
if (!track) {
data.channel.send("Queue is empty, Leaving voice channel");
message.guild.me.voice.channel.leave();
return deletequeue(message.guild.id);
}
data.connection.on("disconnect", () => deletequeue(message.guild.id));
const source = await ytdl(track.url, {
filter: "audioonly",
quality: "highestaudio",
highWaterMark: 1 << 25,
opusEncoded: true,
});
const player = data.connection
.play(source, { type: "opus" })
.on("finish", () => {
if(data.loopone==true){//
play(data.queue[0])
}else if(data.loopall==true){
data.queue.push(data.queue[0])
data.queue.shift()
}//
var removed = data.queue.shift();
if(data.loop == true){
data.queue.push(removed)
}
play(data.queue[0]);
});
player.setVolumeLogarithmic(data.volume / 100);
data.channel.send(
new MessageEmbed()
.setAuthor(
"Started Playing",
"https://img.icons8.com/color/2x/cd--v3.gif"
)
.setColor("9D5CFF")
.setThumbnail(track.thumbnail)
.addField("Song Name", track.name, false)
.addField("Views", track.views, false)
.addField("Duration", track.duration, false)
.addField("Requested By", track.requested, false)
.setFooter("Youtube Music Player")
);
} catch (e) {
console.error(e);
}
}
}
}
And here is the function to change the loopall and loopone boolean:
const{MessageEmbed}=require('discord.js');
module.exports={
name:'loop',
aliases:[''],
cooldown:0,
description:'',
async execute(client,message,args,Discord){
const channel =message.member.voice.channel;
if(!channel) return message.channel.send("You must in a voice channel")
let queue=message.client.queue.get(message.guild.id)
if(!queue) return message.channel.send(new MessageEmbed()
.setDescription("No songs playing in this channel")
.setColor("PURPLE")
);
if(queue.loopall==false &&queue.loopone==false){
queue.loopall=true;
queue.loopone=false;
return message.channel.send(new MessageEmbed()
.setDescription("Looping all songs")
.setColor("PURPLE")
);}else if(queue.loopall==true){
queue.loopall=false;
queue.loopone=!queue.loopone;
return message.channel.send(new MessageEmbed()
.setDescription("Looping one song")
.setColor("PURPLE")
);}else if(queue.loopone==true){
queue.loopall=false;
queue.loopone=false;
return message.channel.send(new MessageEmbed()
.setDescription("Disabled looping")
.setColor("PURPLE")
);
}
}
} Can anyone point out what is wrong with the code?