Added auto-disconnect for music player and improved scheduler
This commit is contained in:
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
|
||||
|
||||
Reference in new issue
Block a user