Hadder/src/main/java/com/bbn/hadder/audio/TrackManager.java
2020-01-07 16:41:13 +01:00

88 lines
2.4 KiB
Java

package com.bbn.hadder.audio;
import com.sedmelluq.discord.lavaplayer.player.AudioPlayer;
import com.sedmelluq.discord.lavaplayer.player.event.AudioEventAdapter;
import com.sedmelluq.discord.lavaplayer.track.AudioTrack;
import com.sedmelluq.discord.lavaplayer.track.AudioTrackEndReason;
import net.dv8tion.jda.api.entities.Guild;
import net.dv8tion.jda.api.entities.Member;
import net.dv8tion.jda.api.entities.VoiceChannel;
import java.util.*;
import java.util.concurrent.LinkedBlockingQueue;
/**
* @author Skidder / GregTCLTK
*/
public class TrackManager extends AudioEventAdapter {
private final AudioPlayer player;
private final Queue<AudioInfo> queue;
private boolean loop = false;
AudioTrack lastTrack;
public TrackManager(AudioPlayer player) {
this.player = player;
this.queue = new LinkedBlockingQueue<>();
}
public void queue(AudioTrack track, Member author) {
AudioInfo info = new AudioInfo(track, author);
queue.add(info);
if (player.getPlayingTrack() == null) {
player.playTrack(track);
}
}
@Override
public void onTrackStart(AudioPlayer player, AudioTrack track) {
AudioInfo info = queue.element();
VoiceChannel vChan = info.getAuthor().getVoiceState().getChannel();
if (vChan == null) {
player.stopTrack();
} else {
info.getAuthor().getGuild().getAudioManager().openAudioConnection(vChan);
}
}
@Override
public void onTrackEnd(AudioPlayer player, AudioTrack track, AudioTrackEndReason endReason) {
this.lastTrack = track;
Guild g = queue.poll().getAuthor().getGuild();
if (loop) {
player.playTrack(this.lastTrack.makeClone());
} else if (queue.isEmpty()) {
g.getAudioManager().closeAudioConnection();
} else {
player.playTrack(queue.element().getTrack());
}
}
public Set<AudioInfo> getQueuedTracks() {
return new LinkedHashSet<>(queue);
}
public void purgeQueue() {
queue.clear();
}
public void remove(AudioInfo entry) {
queue.remove(entry);
}
public boolean isLoop()
{
return loop;
}
public void setLoop(boolean repeating)
{
this.loop = repeating;
}
public AudioInfo getTrackInfo(AudioTrack track) {
return queue.stream().filter(audioInfo -> audioInfo.getTrack().equals(track)).findFirst().orElse(null);
}
}