Added auto-disconnect for music player and improved scheduler

This commit is contained in:
anthorob committed 2021-09-10 19:14:51 -04:00
1 parent b019852c62
commit c92b9317de
3 files changed
+46 -26

No files matched your search

@@ -16,22 +16,26 @@ import com.sedmelluq.discord.lavaplayer.track.AudioPlaylist;
import com.sedmelluq.discord.lavaplayer.track.AudioTrack;
import net.dv8tion.jda.api.entities.*;
import netneutrality.MusicBot;
import netneutrality.ThreadManager;
import netneutrality.handler.LogHandler;
import netneutrality.utils.MessageFunction;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.TimeUnit;
public class MusicManager {
private final static Logger logger = LoggerFactory.getLogger(MusicManager.class);
private final static AudioPlayerManager playerManager = new DefaultAudioPlayerManager();
private AudioPlayer player;
private TrackScheduler scheduler;
private final AudioPlayer player;
private final TrackScheduler scheduler;
private final static Map<String, MusicManager> managers = new ConcurrentHashMap<>();
private long guildId;
private boolean isPlaying = false;
private final long guildId;
private String topic;
private MusicManager(Guild guild) {
@@ -65,6 +69,11 @@ public class MusicManager {
if (vChannel != null && !isConnectedTo(vChannel)) {
Guild guild = MusicBot.getJDA().getGuildById(guildId);
guild.getAudioManager().openAudioConnection(vChannel);
ThreadManager.scheduler.scheduleWithFixedDelay(() -> {
if (getCurrentlyPlaying() == null && scheduler.queue.isEmpty())
leave();
}, 10, 10, TimeUnit.SECONDS);
} else
MusicBot.LOGGER.error("Error connecting!");
}
@@ -74,11 +83,11 @@ public class MusicManager {
return guild != null && guild.getAudioManager().getConnectedChannel() != null;
}
public AudioTrack getCurrentlyPlaying() {
public synchronized AudioTrack getCurrentlyPlaying() {
return player.getPlayingTrack();
}
public void leave() {
public synchronized void leave() {
if (isConnected()) {
stopMusic();
}
@@ -97,25 +106,26 @@ public class MusicManager {
player.destroy();
}
public static void disconnectPlayers() {
public synchronized static void disconnectPlayers() {
for (MusicManager mm : managers.values()) {
mm.leave();
}
}
public synchronized void play(String url, TextChannel channel, Member user, boolean silent ) {
public synchronized void play(String url, TextChannel channel, Member user, boolean silent) {
String identifier = SourceFinder.getIdentifier(url, channel);
System.out.println(identifier);
String identifier = SourceFinder.getIdentifier(url);
logger.debug(identifier);
scheduler.setTextChannel(channel);
if (identifier != null) {
playerManager.loadItem(identifier, new AudioLoadResultHandler() {
@Override
public void trackLoaded(AudioTrack audioTrack) {
if (!silent)
channel.sendMessage(MessageFunction.buildAddingTrackMessage(audioTrack, user)).queue();
if (!silent) {
channel.sendMessage(MessageFunction.buildAddingTrackMessage(audioTrack, user)).queue();
}
scheduler.queue(audioTrack);
}
@@ -124,7 +134,10 @@ public class MusicManager {
public void playlistLoaded(AudioPlaylist playlist) {
if (identifier.startsWith("ytsearch:")) {
scheduler.queue(playlist.getTracks().get(0));
AudioTrack track = playlist.getTracks().get(0);
channel.sendMessage(MessageFunction.buildAddingTrackMessage(track, user)).queue();
scheduler.queue(track);
} else {
for (AudioTrack track : playlist.getTracks()) {
scheduler.queue(track);
@@ -134,7 +147,7 @@ public class MusicManager {
@Override
public void noMatches() {
System.out.println("Oh shit! I got nothing");
channel.sendMessage("No matches found").queue();
}
@Override
@@ -144,17 +157,22 @@ public class MusicManager {
});
} else {
channel.sendMessage("No source found to play the given url").queue();
leave();
}
}
public synchronized void skip() {
if (!scheduler.queue.isEmpty()) {
scheduler.nextTrack();
} else
} else {
stopMusic();
leave();
}
}
public void setVolume(int volume) {
public synchronized void setVolume(int volume) {
player.setVolume(volume);
}
@@ -21,9 +21,9 @@ enum SourceEnum {
}
public class SourceFinder {
private static Pattern youtubePattern = Pattern.compile("^(?:https?://)?(?:(?:www\\.)?)?(?:youtube\\.com|youtu\\.be)/.*?(?:embed|e|v|watch.*?v=)?/?([-_a-z0-9]{10,})?(?:&?index=\\d+)?(?>(?:playlist\\?|&)?list=([^#\\\\&\\?]{12,}))?", Pattern.CASE_INSENSITIVE);
private static final Pattern youtubePattern = Pattern.compile("^(?:https?://)?(?:(?:www\\.)?)?(?:youtube\\.com|youtu\\.be)/.*?(?:embed|e|v|watch.*?v=)?/?([-_a-z0-9]{10,})?(?:&?index=\\d+)?(?>(?:playlist\\?|&)?list=([^#\\\\&\\?]{12,}))?", Pattern.CASE_INSENSITIVE);
private static final Pattern soundcloudPattern = Pattern.compile("^(?:https?://)?(?:www\\.)?(?:m\\.)?soundcloud\\.com/([a-zA-Z0-9-_]+)/([a-zA-Z0-9-_]+)(?:\\\\?.*|)$", Pattern.CASE_INSENSITIVE);
private static Matcher youtubeMatcher;
private static Pattern soundcloudPattern = Pattern.compile("^(?:https?://)?(?:www\\.)?(?:m\\.)?soundcloud\\.com/([a-zA-Z0-9-_]+)/([a-zA-Z0-9-_]+)(?:\\\\?.*|)$", Pattern.CASE_INSENSITIVE);
private static Matcher soundcloudMatcher;
private static Matcher BandcampMatcher;
private static Matcher vimeoMatcher;
@@ -38,13 +38,13 @@ public class SourceFinder {
if (soundcloudMatcher.find())
return SourceEnum.Soundcloud;
if (url.startsWith("ytsearch:"))
if (!(url.startsWith("http://") || url.startsWith("https://")))
return SourceEnum.YTSearch;
return SourceEnum.Nothing;
}
public static String getIdentifier(String url, TextChannel channel) {
public static String getIdentifier(String url) {
String identifier = null;
switch (getSource(url)) {
@@ -56,11 +56,10 @@ public class SourceFinder {
identifier = url;
break;
case YTSearch:
identifier = url;
identifier = "ytsearch:" + url;
break;
case Nothing:
identifier = null;
channel.sendMessage("No source found to play the given url").queue();
break;
}
@@ -28,7 +28,7 @@ public class TrackScheduler extends AudioEventAdapter {
this.queue = new LinkedBlockingQueue<>();
}
public void queue(AudioTrack track) {
public synchronized void queue(AudioTrack track) {
// Calling startTrack with the noInterrupt set to true will start the track only if nothing is currently playing. If
// something is playing, it returns false and does nothing. In that case the player was already playing so this
// track goes to the queue instead.
@@ -67,11 +67,14 @@ public class TrackScheduler extends AudioEventAdapter {
// Start the next track, regardless of if something is already playing or not. In case queue was empty, we are
// giving null to startTrack, which is a valid argument and will simply stop the player.
AudioTrack track = queue.poll();
if (track != null)
if (track != null) {
channel.getManager().setTopic(":speaker: Now playing : " + track.getInfo().title).queue();
else
player.startTrack(track, false);
} else {
channel.getManager().setTopic(topic).queue();
player.startTrack(track, false);
}
}
@Override