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
+ }
+}