diff --git a/pom.xml b/pom.xml
index 209b375..9597d7d 100644
--- a/pom.xml
+++ b/pom.xml
@@ -63,7 +63,7 @@
shade
- DeBOTchery-${project.version}
+ EightTrack-${project.version}
diff --git a/src/main/java/net/locusworks/discord/eighttrack/adaptors/MusicListenerAdaptor.java b/src/main/java/net/locusworks/discord/eighttrack/adaptors/MusicListenerAdaptor.java
new file mode 100644
index 0000000..87243bd
--- /dev/null
+++ b/src/main/java/net/locusworks/discord/eighttrack/adaptors/MusicListenerAdaptor.java
@@ -0,0 +1,177 @@
+package net.locusworks.discord.eighttrack.adaptors;
+
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.time.OffsetDateTime;
+import java.util.List;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.stream.Collectors;
+
+import com.sedmelluq.discord.lavaplayer.player.AudioPlayer;
+import com.sedmelluq.discord.lavaplayer.player.DefaultAudioPlayerManager;
+import com.sedmelluq.discord.lavaplayer.source.AudioSourceManagers;
+import com.sedmelluq.discord.lavaplayer.track.AudioTrack;
+
+import net.dv8tion.jda.api.EmbedBuilder;
+import net.dv8tion.jda.api.Permission;
+import net.dv8tion.jda.api.entities.MessageEmbed;
+import net.dv8tion.jda.api.entities.VoiceChannel;
+import net.dv8tion.jda.api.events.message.MessageReceivedEvent;
+import net.dv8tion.jda.api.hooks.ListenerAdapter;
+import net.dv8tion.jda.api.managers.AudioManager;
+import net.locusworks.discord.eighttrack.handlers.EightTrackAudioSendHandler;
+import net.locusworks.discord.eighttrack.main.Entry;
+import net.locusworks.discord.eighttrack.scheduler.TrackScheduler;
+import net.locusworks.logger.ApplicationLogger;
+import net.locusworks.logger.ApplicationLoggerFactory;
+
+public class MusicListenerAdaptor extends ListenerAdapter {
+
+ private Path musicDir;
+ private TrackScheduler ts;
+ private DefaultAudioPlayerManager apm;
+ private ApplicationLogger logger;
+ private AudioPlayer player;
+ private AtomicBoolean playing;
+
+ public MusicListenerAdaptor(Path musicDir) throws IOException {
+ this.logger = ApplicationLoggerFactory.getLogger(Entry.class);
+ this.playing = new AtomicBoolean(false);
+ this.musicDir = musicDir;
+
+ this.apm = new DefaultAudioPlayerManager();
+
+ AudioSourceManagers.registerLocalSource(apm);
+ this.player = apm.createPlayer();
+
+ this.ts = new TrackScheduler();
+ player.addListener(ts);
+ indexFiles();
+ }
+
+ @Override
+ public void onMessageReceived(MessageReceivedEvent event) {
+ if (event.getAuthor().isBot()) return;
+
+ String command = event.getMessage().getContentRaw().trim().toLowerCase();
+ switch (command) {
+ case "-play":
+ playing.set(true);
+ play(event);
+ return;
+ case "-stop":
+ playing.set(false);
+ stop(event);
+ return;
+ case "-next":
+ next(event);
+ return;
+ case "-repeat":
+ playing.set(true);
+ repeat(event);
+ return;
+ case "-whatsnext":
+ whatsNext(event);
+ break;
+ case "-index":
+ index(event);
+ break;
+ default:
+ return;
+ }
+ }
+
+ private void indexFiles() throws IOException {
+ List songs = Files.walk(musicDir)
+ .filter(p-> p.getFileName().toString().endsWith(".mp3"))
+ .collect(Collectors.toList());
+
+ logger.info("Adding %d songs from directory %s", songs.size(), musicDir);
+
+ for (Path song : songs) {
+ logger.debug("Loading song: %s", song);
+ try {
+ apm.loadItem(song.toAbsolutePath().toString(), ts);
+ } catch (IllegalStateException ex) {
+ logger.warn("Unable to load song :%s -> %s", song.toAbsolutePath().toString(), ex.getMessage());
+ }
+ }
+ }
+
+ private void index(MessageReceivedEvent event) {
+ event.getTextChannel().sendMessage(String.format("<@%s>, Please wait as i reindex the music files", event.getAuthor().getId())).queue();
+ try {
+ indexFiles();
+ } catch (IOException e) {
+ event.getTextChannel().sendMessage(String.format("<@%s>, Unable to reindex the music files: %s", event.getAuthor().getId(), e.getMessage())).queue();
+ return;
+ }
+
+ event.getTextChannel().sendMessage(String.format("<@%s>, Reindexing complete", event.getAuthor().getId())).queue();
+ }
+
+ private void whatsNext(MessageReceivedEvent event) {
+ AudioTrack track = ts.peek();
+ MessageEmbed embed = new EmbedBuilder()
+ .setAuthor(event.getMember().getEffectiveName(), null, event.getAuthor().getAvatarUrl())
+ .setTitle("Next Up:")
+ .setDescription(String.format("**%s** by __%s__", track.getInfo().title, track.getInfo().author))
+ .setTimestamp(OffsetDateTime.now())
+ .build();
+ event.getTextChannel().sendMessage(embed).queue();
+ }
+
+ private void repeat(MessageReceivedEvent event) {
+ next(event);
+ ts.setFinishedCallback((ater) -> {
+ if (!playing.get()) return;
+ next(event);
+ });
+ }
+
+ private void next(MessageReceivedEvent event) {
+ stop(event);
+ play(event);
+ }
+
+ private void stop(MessageReceivedEvent event) {
+ player.stopTrack();
+ }
+
+ private void play(MessageReceivedEvent event) {
+ VoiceChannel vc = event.getMember().getVoiceState().getChannel();
+ if (vc == null) {
+ event.getTextChannel().sendMessage(String.format("<@%s> you are not in a voice channel to play music", event.getMember().getId())).queue();
+ return;
+ }
+
+ if (!event.getGuild().getSelfMember().hasPermission(vc, Permission.VOICE_CONNECT, Permission.VOICE_SPEAK)) {
+ event.getTextChannel().sendMessage(String.format("<@%s>, I cannot play my music in channel %s as I dont have permission to",
+ event.getMember().getId(), vc.getName())).queue();
+ return;
+ }
+
+ AudioManager manager = event.getGuild().getAudioManager();
+ manager.openAudioConnection(vc);
+
+ manager.setSendingHandler(new EightTrackAudioSendHandler(player));
+
+ if (ts.hasTracks()) {
+ AudioTrack track = ts.getNextTrack();
+
+ MessageEmbed embed = new EmbedBuilder()
+ .setAuthor(event.getMember().getEffectiveName(), null, event.getAuthor().getAvatarUrl())
+ .setTitle("Now Playing:")
+ .setDescription(String.format("**%s** by __%s__", track.getInfo().title, track.getInfo().author))
+ .setTimestamp(OffsetDateTime.now())
+ .build();
+
+ event.getTextChannel().sendMessage(embed).queue();
+ player.playTrack(track);
+ ts.trackLoaded(track);
+ }
+ }
+
+
+}
diff --git a/src/main/java/net/locusworks/discord/eighttrack/main/Entry.java b/src/main/java/net/locusworks/discord/eighttrack/main/Entry.java
index dfc913e..a942315 100644
--- a/src/main/java/net/locusworks/discord/eighttrack/main/Entry.java
+++ b/src/main/java/net/locusworks/discord/eighttrack/main/Entry.java
@@ -1,36 +1,18 @@
package net.locusworks.discord.eighttrack.main;
import java.io.IOException;
-import java.nio.file.Files;
-import java.nio.file.Path;
import java.nio.file.Paths;
-import java.time.OffsetDateTime;
-import java.util.Iterator;
-
import javax.security.auth.login.LoginException;
-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 com.sedmelluq.discord.lavaplayer.track.AudioTrack;
import net.dv8tion.jda.api.AccountType;
-import net.dv8tion.jda.api.EmbedBuilder;
import net.dv8tion.jda.api.JDA;
import net.dv8tion.jda.api.JDABuilder;
-import net.dv8tion.jda.api.Permission;
-import net.dv8tion.jda.api.entities.MessageEmbed;
-import net.dv8tion.jda.api.entities.VoiceChannel;
-import net.dv8tion.jda.api.events.message.MessageReceivedEvent;
-import net.dv8tion.jda.api.hooks.ListenerAdapter;
-import net.dv8tion.jda.api.managers.AudioManager;
-import net.locusworks.discord.eighttrack.handlers.EightTrackAudioSendHandler;
-import net.locusworks.discord.eighttrack.scheduler.TrackScheduler;
+import net.locusworks.discord.eighttrack.adaptors.MusicListenerAdaptor;
import net.locusworks.logger.ApplicationLogger;
import net.locusworks.logger.ApplicationLoggerFactory;
public class Entry {
-
+
public static void main(String[] args) throws LoginException, IOException {
if (args.length < 1) throw new RuntimeException("no token provided");
@@ -39,116 +21,6 @@ public class Entry {
JDA client = new JDABuilder(AccountType.BOT).setToken(args[0]).build();
- AudioPlayerManager apm = new DefaultAudioPlayerManager();
- AudioSourceManagers.registerLocalSource(apm);
-
- final AudioPlayer player = apm.createPlayer();
-
- TrackScheduler ts = new TrackScheduler();
-
- player.addListener(ts);
-
- for (Iterator iter = Files.list(Paths.get(args[1])).iterator(); iter.hasNext();) {
- Path song = iter.next();
- if (!song.getFileName().toString().toLowerCase().endsWith(".mp3")) continue;
- logger.info("Loading song: %s", song);
- try {
- apm.loadItem(song.toAbsolutePath().toString(), ts);
- } catch (IllegalStateException ex) {
- logger.warn("Unable to load song :%s -> %s", song.toAbsolutePath().toString(), ex.getMessage());
- }
- }
-
- client.addEventListener(new ListenerAdapter() {
-
- @Override
- public void onMessageReceived(final MessageReceivedEvent event) {
- if (event.getAuthor().isBot()) return;
-
- String command = event.getMessage().getContentRaw().trim().toLowerCase();
-
- switch (command) {
- case "-play":
- play(event, ts, player);
- return;
- case "-stop":
- stop(event, ts, player);
- return;
- case "-next":
- next(event, ts, player);
- return;
- case "-repeat":
- repeat(event, ts, player);
- return;
- case "-whatsnext":
- whatsNext(event, ts, player);
- default:
- return;
- }
- }
- });
+ client.addEventListener(new MusicListenerAdaptor(Paths.get(args[1])));
}
-
- protected static void whatsNext(MessageReceivedEvent event, TrackScheduler ts, AudioPlayer player) {
- AudioTrack track = ts.peek();
- MessageEmbed embed = new EmbedBuilder()
- .setAuthor(event.getMember().getEffectiveName(), null, event.getAuthor().getAvatarUrl())
- .setTitle("Next Up:")
- .setDescription(String.format("**%s** by __%s__", track.getInfo().title, track.getInfo().author))
- .setTimestamp(OffsetDateTime.now())
- .build();
- event.getTextChannel().sendMessage(embed).queue();
- }
-
- protected static void repeat(MessageReceivedEvent event, TrackScheduler ts, AudioPlayer player) {
- next(event, ts, player);
- ts.setFinishedCallback((ater) -> {
- next(event, ts, player);
- });
-
- }
-
- protected static void next(MessageReceivedEvent event, TrackScheduler ts, AudioPlayer player) {
- stop(event, ts, player);
- play(event, ts, player);
- }
-
- private static void stop(MessageReceivedEvent event, TrackScheduler ts, AudioPlayer player) {
- player.stopTrack();
- }
-
- private static void play(MessageReceivedEvent event, TrackScheduler ts, AudioPlayer player) {
- VoiceChannel vc = event.getMember().getVoiceState().getChannel();
- if (vc == null) {
- event.getTextChannel().sendMessage(String.format("<@%s you are not in a voice channel to play music", event.getMember().getId())).queue();
- return;
- }
-
- if (!event.getGuild().getSelfMember().hasPermission(vc, Permission.VOICE_CONNECT, Permission.VOICE_SPEAK)) {
- event.getTextChannel().sendMessage(String.format("<@%s, I cannot play my music in channel %s as I dont have permission to",
- event.getMember().getId(), vc.getName())).queue();
- return;
- }
-
- AudioManager manager = event.getGuild().getAudioManager();
- manager.openAudioConnection(vc);
-
- manager.setSendingHandler(new EightTrackAudioSendHandler(player));
-
- if (ts.hasTracks()) {
- AudioTrack track = ts.getNextTrack();
-
- MessageEmbed embed = new EmbedBuilder()
- .setAuthor(event.getMember().getEffectiveName(), null, event.getAuthor().getAvatarUrl())
- .setTitle("Now Playing:")
- .setDescription(String.format("**%s** by __%s__", track.getInfo().title, track.getInfo().author))
- .setTimestamp(OffsetDateTime.now())
- .build();
-
- event.getTextChannel().sendMessage(embed).queue();
- player.playTrack(track);
- ts.trackLoaded(track);
- }
- }
-
}
diff --git a/src/main/java/net/locusworks/discord/eighttrack/scheduler/TrackScheduler.java b/src/main/java/net/locusworks/discord/eighttrack/scheduler/TrackScheduler.java
index a6d2d79..e7a2814 100644
--- a/src/main/java/net/locusworks/discord/eighttrack/scheduler/TrackScheduler.java
+++ b/src/main/java/net/locusworks/discord/eighttrack/scheduler/TrackScheduler.java
@@ -60,6 +60,10 @@ public class TrackScheduler extends AudioEventAdapter implements AudioEventListe
// TODO Auto-generated method stub
}
+ public int trackCount() {
+ return trackQueue.size();
+ }
+
public AudioTrack peek() {
return trackQueue.peek();
}