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 com.sedmelluq.discord.lavaplayer.track.AudioTrack;
import net.dv8tion.jda.api.entities.*; import net.dv8tion.jda.api.entities.*;
import netneutrality.MusicBot; import netneutrality.MusicBot;
import netneutrality.ThreadManager;
import netneutrality.handler.LogHandler; import netneutrality.handler.LogHandler;
import netneutrality.utils.MessageFunction; import netneutrality.utils.MessageFunction;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.LinkedList; import java.util.LinkedList;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.TimeUnit;
public class MusicManager { public class MusicManager {
private final static Logger logger = LoggerFactory.getLogger(MusicManager.class);
private final static AudioPlayerManager playerManager = new DefaultAudioPlayerManager(); private final static AudioPlayerManager playerManager = new DefaultAudioPlayerManager();
private AudioPlayer player; private final AudioPlayer player;
private TrackScheduler scheduler; private final TrackScheduler scheduler;
private final static Map<String, MusicManager> managers = new ConcurrentHashMap<>(); private final static Map<String, MusicManager> managers = new ConcurrentHashMap<>();
private long guildId; private final long guildId;
private boolean isPlaying = false;
private String topic; private String topic;
private MusicManager(Guild guild) { private MusicManager(Guild guild) {
@@ -65,6 +69,11 @@ public class MusicManager {
if (vChannel != null && !isConnectedTo(vChannel)) { if (vChannel != null && !isConnectedTo(vChannel)) {
Guild guild = MusicBot.getJDA().getGuildById(guildId); Guild guild = MusicBot.getJDA().getGuildById(guildId);
guild.getAudioManager().openAudioConnection(vChannel); guild.getAudioManager().openAudioConnection(vChannel);
ThreadManager.scheduler.scheduleWithFixedDelay(() -> {
if (getCurrentlyPlaying() == null && scheduler.queue.isEmpty())
leave();
}, 10, 10, TimeUnit.SECONDS);
} else } else
MusicBot.LOGGER.error("Error connecting!"); MusicBot.LOGGER.error("Error connecting!");
} }
@@ -74,11 +83,11 @@ public class MusicManager {
return guild != null && guild.getAudioManager().getConnectedChannel() != null; return guild != null && guild.getAudioManager().getConnectedChannel() != null;
} }
public AudioTrack getCurrentlyPlaying() { public synchronized AudioTrack getCurrentlyPlaying() {
return player.getPlayingTrack(); return player.getPlayingTrack();
} }
public void leave() { public synchronized void leave() {
if (isConnected()) { if (isConnected()) {
stopMusic(); stopMusic();
} }
@@ -97,25 +106,26 @@ public class MusicManager {
player.destroy(); player.destroy();
} }
public static void disconnectPlayers() { public synchronized static void disconnectPlayers() {
for (MusicManager mm : managers.values()) { for (MusicManager mm : managers.values()) {
mm.leave(); 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); String identifier = SourceFinder.getIdentifier(url);
System.out.println(identifier); logger.debug(identifier);
scheduler.setTextChannel(channel); scheduler.setTextChannel(channel);
if (identifier != null) { if (identifier != null) {
playerManager.loadItem(identifier, new AudioLoadResultHandler() { playerManager.loadItem(identifier, new AudioLoadResultHandler() {
@Override @Override
public void trackLoaded(AudioTrack audioTrack) { 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); scheduler.queue(audioTrack);
} }
@@ -124,7 +134,10 @@ public class MusicManager {
public void playlistLoaded(AudioPlaylist playlist) { public void playlistLoaded(AudioPlaylist playlist) {
if (identifier.startsWith("ytsearch:")) { 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 { } else {
for (AudioTrack track : playlist.getTracks()) { for (AudioTrack track : playlist.getTracks()) {
scheduler.queue(track); scheduler.queue(track);
@@ -134,7 +147,7 @@ public class MusicManager {
@Override @Override
public void noMatches() { public void noMatches() {
System.out.println("Oh shit! I got nothing"); channel.sendMessage("No matches found").queue();
} }
@Override @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() { public synchronized void skip() {
if (!scheduler.queue.isEmpty()) { if (!scheduler.queue.isEmpty()) {
scheduler.nextTrack(); scheduler.nextTrack();
} else } else {
stopMusic(); stopMusic();
leave();
}
} }
public void setVolume(int volume) { public synchronized void setVolume(int volume) {
player.setVolume(volume); player.setVolume(volume);
} }
@@ -21,9 +21,9 @@ enum SourceEnum {
} }
public class SourceFinder { 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 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 soundcloudMatcher;
private static Matcher BandcampMatcher; private static Matcher BandcampMatcher;
private static Matcher vimeoMatcher; private static Matcher vimeoMatcher;
@@ -38,13 +38,13 @@ public class SourceFinder {
if (soundcloudMatcher.find()) if (soundcloudMatcher.find())
return SourceEnum.Soundcloud; return SourceEnum.Soundcloud;
if (url.startsWith("ytsearch:")) if (!(url.startsWith("http://") || url.startsWith("https://")))
return SourceEnum.YTSearch; return SourceEnum.YTSearch;
return SourceEnum.Nothing; return SourceEnum.Nothing;
} }
public static String getIdentifier(String url, TextChannel channel) { public static String getIdentifier(String url) {
String identifier = null; String identifier = null;
switch (getSource(url)) { switch (getSource(url)) {
@@ -56,11 +56,10 @@ public class SourceFinder {
identifier = url; identifier = url;
break; break;
case YTSearch: case YTSearch:
identifier = url; identifier = "ytsearch:" + url;
break; break;
case Nothing: case Nothing:
identifier = null; identifier = null;
channel.sendMessage("No source found to play the given url").queue();
break; break;
} }
@@ -28,7 +28,7 @@ public class TrackScheduler extends AudioEventAdapter {
this.queue = new LinkedBlockingQueue<>(); 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 // 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 // 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. // 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 // 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. // giving null to startTrack, which is a valid argument and will simply stop the player.
AudioTrack track = queue.poll(); AudioTrack track = queue.poll();
if (track != null) if (track != null) {
channel.getManager().setTopic(":speaker: Now playing : " + track.getInfo().title).queue(); channel.getManager().setTopic(":speaker: Now playing : " + track.getInfo().title).queue();
else
channel.getManager().setTopic(topic).queue();
player.startTrack(track, false); player.startTrack(track, false);
} else {
channel.getManager().setTopic(topic).queue();
}
} }
@Override @Override