Refactored to break out class
This commit is contained in:
2
pom.xml
2
pom.xml
@ -63,7 +63,7 @@
|
|||||||
<goal>shade</goal>
|
<goal>shade</goal>
|
||||||
</goals>
|
</goals>
|
||||||
<configuration>
|
<configuration>
|
||||||
<finalName>DeBOTchery-${project.version}</finalName>
|
<finalName>EightTrack-${project.version}</finalName>
|
||||||
<transformers>
|
<transformers>
|
||||||
<transformer
|
<transformer
|
||||||
implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
|
implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
|
||||||
|
@ -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<Path> 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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
@ -1,31 +1,13 @@
|
|||||||
package net.locusworks.discord.eighttrack.main;
|
package net.locusworks.discord.eighttrack.main;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.nio.file.Files;
|
|
||||||
import java.nio.file.Path;
|
|
||||||
import java.nio.file.Paths;
|
import java.nio.file.Paths;
|
||||||
import java.time.OffsetDateTime;
|
|
||||||
import java.util.Iterator;
|
|
||||||
|
|
||||||
import javax.security.auth.login.LoginException;
|
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.AccountType;
|
||||||
import net.dv8tion.jda.api.EmbedBuilder;
|
|
||||||
import net.dv8tion.jda.api.JDA;
|
import net.dv8tion.jda.api.JDA;
|
||||||
import net.dv8tion.jda.api.JDABuilder;
|
import net.dv8tion.jda.api.JDABuilder;
|
||||||
import net.dv8tion.jda.api.Permission;
|
import net.locusworks.discord.eighttrack.adaptors.MusicListenerAdaptor;
|
||||||
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.logger.ApplicationLogger;
|
import net.locusworks.logger.ApplicationLogger;
|
||||||
import net.locusworks.logger.ApplicationLoggerFactory;
|
import net.locusworks.logger.ApplicationLoggerFactory;
|
||||||
|
|
||||||
@ -39,116 +21,6 @@ public class Entry {
|
|||||||
|
|
||||||
JDA client = new JDABuilder(AccountType.BOT).setToken(args[0]).build();
|
JDA client = new JDABuilder(AccountType.BOT).setToken(args[0]).build();
|
||||||
|
|
||||||
AudioPlayerManager apm = new DefaultAudioPlayerManager();
|
client.addEventListener(new MusicListenerAdaptor(Paths.get(args[1])));
|
||||||
AudioSourceManagers.registerLocalSource(apm);
|
|
||||||
|
|
||||||
final AudioPlayer player = apm.createPlayer();
|
|
||||||
|
|
||||||
TrackScheduler ts = new TrackScheduler();
|
|
||||||
|
|
||||||
player.addListener(ts);
|
|
||||||
|
|
||||||
for (Iterator<Path> 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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -60,6 +60,10 @@ public class TrackScheduler extends AudioEventAdapter implements AudioEventListe
|
|||||||
// TODO Auto-generated method stub
|
// TODO Auto-generated method stub
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public int trackCount() {
|
||||||
|
return trackQueue.size();
|
||||||
|
}
|
||||||
|
|
||||||
public AudioTrack peek() {
|
public AudioTrack peek() {
|
||||||
return trackQueue.peek();
|
return trackQueue.peek();
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user