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 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
|
player.startTrack(track, false);
|
||||||
|
} else {
|
||||||
channel.getManager().setTopic(topic).queue();
|
channel.getManager().setTopic(topic).queue();
|
||||||
player.startTrack(track, false);
|
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
Reference in new issue
Block a user