From c92b9317de06e84f2474ef5dfdb667de9636816b Mon Sep 17 00:00:00 2001 From: anthorob Date: Fri, 10 Sep 2021 19:14:51 -0400 Subject: [PATCH] Added auto-disconnect for music player and improved scheduler --- .../netneutrality/music/MusicManager.java | 50 +++++++++++++------ .../netneutrality/music/SourceFinder.java | 11 ++-- .../netneutrality/music/TrackScheduler.java | 11 ++-- 3 files changed, 46 insertions(+), 26 deletions(-) diff --git a/src/main/java/netneutrality/music/MusicManager.java b/src/main/java/netneutrality/music/MusicManager.java index bdf7ca6..82704eb 100644 --- a/src/main/java/netneutrality/music/MusicManager.java +++ b/src/main/java/netneutrality/music/MusicManager.java @@ -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 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); } diff --git a/src/main/java/netneutrality/music/SourceFinder.java b/src/main/java/netneutrality/music/SourceFinder.java index 4f69588..2196ff4 100644 --- a/src/main/java/netneutrality/music/SourceFinder.java +++ b/src/main/java/netneutrality/music/SourceFinder.java @@ -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; } diff --git a/src/main/java/netneutrality/music/TrackScheduler.java b/src/main/java/netneutrality/music/TrackScheduler.java index bc27f66..05bf815 100644 --- a/src/main/java/netneutrality/music/TrackScheduler.java +++ b/src/main/java/netneutrality/music/TrackScheduler.java @@ -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