diff --git a/pom.xml b/pom.xml index 5bf4c26..9531281 100644 --- a/pom.xml +++ b/pom.xml @@ -64,7 +64,11 @@ jansi 1.17 - + + com.sedmelluq + lavaplayer + 1.2.51 + \ No newline at end of file diff --git a/src/main/java/netneutrality/music/MusicManager.java b/src/main/java/netneutrality/music/MusicManager.java new file mode 100644 index 0000000..3b5dc23 --- /dev/null +++ b/src/main/java/netneutrality/music/MusicManager.java @@ -0,0 +1,46 @@ +package netneutrality.music; + +/* + * Copyright (c) anthorob + * + * This file is closed-source. It should not be distributed or copied in any way or form + */ + +import com.sedmelluq.discord.lavaplayer.player.AudioPlayer; +import com.sedmelluq.discord.lavaplayer.player.AudioPlayerManager; +import com.sedmelluq.discord.lavaplayer.player.DefaultAudioPlayerManager; +import com.sedmelluq.discord.lavaplayer.source.AudioSourceManagers; +import net.dv8tion.jda.core.entities.Guild; +import net.dv8tion.jda.core.managers.AudioManager; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +public class MusicManager { + + private AudioPlayerManager playerManager = new DefaultAudioPlayerManager(); + private AudioPlayer player; + private TrackScheduler scheduler; + private static Map managers = new ConcurrentHashMap<>(); + private long guildId; + + private MusicManager(Guild guild) { + + this.guildId = guild.getIdLong(); + player = playerManager.createPlayer(); + scheduler = new TrackScheduler(player); + player.addListener(scheduler); + + AudioSourceManagers.registerRemoteSources(playerManager); + + managers.put(guild.getId(), this); + } + + public static MusicManager get(Guild guild) { + if (managers.containsKey(guild.getId())) { + return managers.get(guild.getId()); + } else { + return new MusicManager(guild); + } + } +} diff --git a/src/main/java/netneutrality/music/TrackScheduler.java b/src/main/java/netneutrality/music/TrackScheduler.java new file mode 100644 index 0000000..95c05f4 --- /dev/null +++ b/src/main/java/netneutrality/music/TrackScheduler.java @@ -0,0 +1,61 @@ +package netneutrality.music; + +/* + * Copyright (c) anthorob + * + * This file is closed-source. It should not be distributed or copied in any way or form + */ + +import com.sedmelluq.discord.lavaplayer.player.AudioPlayer; +import com.sedmelluq.discord.lavaplayer.player.event.AudioEventAdapter; +import com.sedmelluq.discord.lavaplayer.tools.FriendlyException; +import com.sedmelluq.discord.lavaplayer.track.AudioTrack; +import com.sedmelluq.discord.lavaplayer.track.AudioTrackEndReason; + +public class TrackScheduler extends AudioEventAdapter { + + private AudioPlayer player; + + public TrackScheduler(AudioPlayer player) { + this.player = player; + } + + @Override + public void onPlayerPause(AudioPlayer player) { + // Player was paused + } + + @Override + public void onPlayerResume(AudioPlayer player) { + // Player was resumed + } + + @Override + public void onTrackStart(AudioPlayer player, AudioTrack track) { + // A track started playing + } + + @Override + public void onTrackEnd(AudioPlayer player, AudioTrack track, AudioTrackEndReason endReason) { + if (endReason.mayStartNext) { + // Start next track + } + + // endReason == FINISHED: A track finished or died by an exception (mayStartNext = true). + // endReason == LOAD_FAILED: Loading of a track failed (mayStartNext = true). + // endReason == STOPPED: The player was stopped. + // endReason == REPLACED: Another track started playing while this had not finished + // endReason == CLEANUP: Player hasn't been queried for a while, if you want you can put a + // clone of this back to your queue + } + + @Override + public void onTrackException(AudioPlayer player, AudioTrack track, FriendlyException exception) { + // An already playing track threw an exception (track end event will still be received separately) + } + + @Override + public void onTrackStuck(AudioPlayer player, AudioTrack track, long thresholdMs) { + // Audio track has been unable to provide us any audio, might want to just start a new track + } +}