From 6d03d212a6f56c2de6e67ae8c84763afc7977370 Mon Sep 17 00:00:00 2001 From: Isaac Parenteau Date: Fri, 4 Oct 2019 23:52:57 -0500 Subject: [PATCH] Refactored to break out class --- pom.xml | 2 +- .../adaptors/MusicListenerAdaptor.java | 177 ++++++++++++++++++ .../discord/eighttrack/main/Entry.java | 134 +------------ .../eighttrack/scheduler/TrackScheduler.java | 4 + 4 files changed, 185 insertions(+), 132 deletions(-) create mode 100644 src/main/java/net/locusworks/discord/eighttrack/adaptors/MusicListenerAdaptor.java 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(); }