From afb27df33dc7cb7df16266e83bded7616a5b0243 Mon Sep 17 00:00:00 2001 From: Matthew Cech Date: Thu, 17 Oct 2019 22:39:56 -0700 Subject: [PATCH 01/11] gitflow-hotfix-stash: slowmerge --- .classpath | 6 +- src/commands/music/CommandMusicMain.java | 7 +- src/commands/music/SubCommandAddTrack.java | 2 +- src/main/Main.java | 7 +- src/trash/AudioPlayerSendHandler.java | 41 +++++++ src/trash/GuildMusicManager.java | 34 ++++++ src/trash/MainFAKE.java | 126 +++++++++++++++++++++ src/trash/TrackScheduler.java | 55 +++++++++ 8 files changed, 271 insertions(+), 7 deletions(-) create mode 100644 src/trash/AudioPlayerSendHandler.java create mode 100644 src/trash/GuildMusicManager.java create mode 100644 src/trash/MainFAKE.java create mode 100644 src/trash/TrackScheduler.java diff --git a/.classpath b/.classpath index 571ccd1..6cf8f5a 100644 --- a/.classpath +++ b/.classpath @@ -24,8 +24,8 @@ - - - + + + diff --git a/src/commands/music/CommandMusicMain.java b/src/commands/music/CommandMusicMain.java index 7176498..f9417b8 100644 --- a/src/commands/music/CommandMusicMain.java +++ b/src/commands/music/CommandMusicMain.java @@ -2,6 +2,7 @@ package commands.music; import core.Command; import core.LocStrings; +import core.SubCommandFormattable; import core.SubCommandFramework; import dataStructures.*; @@ -9,7 +10,7 @@ public class CommandMusicMain extends Command { SubCommandFramework framework = new SubCommandFramework(); public CommandMusicMain(KittyRole level, KittyRating rating) - { + { super(level, rating); framework.addCommand("join", new SubCommandJoin(KittyRole.General, KittyRating.Safe)); framework.addCommand("leave", new SubCommandLeave(KittyRole.General, KittyRating.Safe)); @@ -22,6 +23,8 @@ public class CommandMusicMain extends Command @Override public void onRun(KittyGuild guild, KittyChannel channel, KittyUser user, UserInput input, Response res) { - framework.run(guild, channel, user, input).Call(res); + SubCommandFormattable scf = framework.run(guild, channel, user, input); + System.out.println("SCF: " + scf.resString); + scf.Call(res); } } \ No newline at end of file diff --git a/src/commands/music/SubCommandAddTrack.java b/src/commands/music/SubCommandAddTrack.java index d8f7472..8ffef3f 100644 --- a/src/commands/music/SubCommandAddTrack.java +++ b/src/commands/music/SubCommandAddTrack.java @@ -25,8 +25,8 @@ public class SubCommandAddTrack extends SubCommand //Get track from Youtube String video = YT.getYT(input.args); ac.loadAndPlay(video, guild); + System.out.println("Internal: " + ac.response); - System.out.println(ac.response); return new SubCommandFormattable(video); } } \ No newline at end of file diff --git a/src/main/Main.java b/src/main/Main.java index 5f4beaa..463ad75 100644 --- a/src/main/Main.java +++ b/src/main/Main.java @@ -24,13 +24,14 @@ import dataStructures.Response; import dataStructures.UserInput; import net.dv8tion.jda.core.events.message.guild.GuildMessageReceivedEvent; import net.dv8tion.jda.core.hooks.ListenerAdapter; +import trash.MainFAKE; import utils.GlobalLog; // http://www.slf4j.org/ - this JDA logging tool has been disabled by specifying NOP implementation. // This is the application entry point, and bot startup location! @SuppressWarnings("unused") -public class Main extends ListenerAdapter +public class Main// extends ListenerAdapter { // Variables and bot specific objects private static KittyCore kittyCore; @@ -45,6 +46,9 @@ public class Main extends ListenerAdapter // Initialization and setup public static void main(String[] args) throws InterruptedException, LoginException, Exception { + MainFAKE.mainFAKE(args); + } + /* // Factory startup. The ordering is intentional. GlobalLog.initialize(); databaseManager = ObjectBuilderFactory.constructDatabaseManager(); @@ -115,4 +119,5 @@ public class Main extends ListenerAdapter if(!Superintendent.perCommandUpkeepPost(kittyCore, databaseManager)) return; } + */ } \ No newline at end of file diff --git a/src/trash/AudioPlayerSendHandler.java b/src/trash/AudioPlayerSendHandler.java new file mode 100644 index 0000000..daf7414 --- /dev/null +++ b/src/trash/AudioPlayerSendHandler.java @@ -0,0 +1,41 @@ +package trash; + +import com.sedmelluq.discord.lavaplayer.player.AudioPlayer; +import com.sedmelluq.discord.lavaplayer.track.playback.AudioFrame; + +import net.dv8tion.jda.core.audio.AudioSendHandler; + +/** + * This is a wrapper around AudioPlayer which makes it behave as an AudioSendHandler for JDA. As JDA calls canProvide + * before every call to provide20MsAudio(), we pull the frame in canProvide() and use the frame we already pulled in + * provide20MsAudio(). + */ +public class AudioPlayerSendHandler implements AudioSendHandler +{ + private final AudioPlayer audioPlayer; + private AudioFrame lastFrame; + + public AudioPlayerSendHandler(AudioPlayer audioPlayer) + { + this.audioPlayer = audioPlayer; + } + + @Override + public boolean canProvide() + { + lastFrame = audioPlayer.provide(); + return lastFrame != null; + } + + @Override + public byte[] provide20MsAudio() + { + return lastFrame.getData(); + } + + @Override + public boolean isOpus() + { + return true; + } +} \ No newline at end of file diff --git a/src/trash/GuildMusicManager.java b/src/trash/GuildMusicManager.java new file mode 100644 index 0000000..478a3b0 --- /dev/null +++ b/src/trash/GuildMusicManager.java @@ -0,0 +1,34 @@ +package trash; +import com.sedmelluq.discord.lavaplayer.player.AudioPlayer; +import com.sedmelluq.discord.lavaplayer.player.AudioPlayerManager; + +/** + * Holder for both the player and a track scheduler for one guild. + */ +public class GuildMusicManager { + /** + * Audio player for the guild. + */ + public final AudioPlayer player; + /** + * Track scheduler for the player. + */ + public final TrackScheduler scheduler; + + /** + * Creates a player and a track scheduler. + * @param manager Audio player manager to use for creating the player. + */ + public GuildMusicManager(AudioPlayerManager manager) { + player = manager.createPlayer(); + scheduler = new TrackScheduler(player); + player.addListener(scheduler); + } + + /** + * @return Wrapper around AudioPlayer to use it as an AudioSendHandler. + */ + public AudioPlayerSendHandler getSendHandler() { + return new AudioPlayerSendHandler(player); + } +} \ No newline at end of file diff --git a/src/trash/MainFAKE.java b/src/trash/MainFAKE.java new file mode 100644 index 0000000..9b4f006 --- /dev/null +++ b/src/trash/MainFAKE.java @@ -0,0 +1,126 @@ +package trash; +import java.util.HashMap; +import java.util.Map; + +import com.sedmelluq.discord.lavaplayer.player.AudioLoadResultHandler; +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.tools.FriendlyException; +import com.sedmelluq.discord.lavaplayer.track.AudioPlaylist; +import com.sedmelluq.discord.lavaplayer.track.AudioTrack; + +import net.dv8tion.jda.core.AccountType; +import net.dv8tion.jda.core.JDA; +import net.dv8tion.jda.core.JDABuilder; +import net.dv8tion.jda.core.entities.Guild; +import net.dv8tion.jda.core.entities.TextChannel; +import net.dv8tion.jda.core.entities.VoiceChannel; +import net.dv8tion.jda.core.events.message.guild.GuildMessageReceivedEvent; +import net.dv8tion.jda.core.hooks.ListenerAdapter; +import net.dv8tion.jda.core.managers.AudioManager; +import offline.Ref; + +public class MainFAKE extends ListenerAdapter { + public static void mainFAKE(String[] args) throws Exception { + JDA bot = new JDABuilder(AccountType.BOT).setToken(Ref.TestToken).buildBlocking(); + bot.addEventListener(new MainFAKE()); + } + + private final AudioPlayerManager playerManager; + private final Map musicManagers; + + private MainFAKE() { + this.musicManagers = new HashMap<>(); + + this.playerManager = new DefaultAudioPlayerManager(); + AudioSourceManagers.registerRemoteSources(playerManager); + AudioSourceManagers.registerLocalSource(playerManager); + } + + private synchronized GuildMusicManager getGuildAudioPlayer(Guild guild) { + long guildId = Long.parseLong(guild.getId()); + GuildMusicManager musicManager = musicManagers.get(guildId); + + if (musicManager == null) { + musicManager = new GuildMusicManager(playerManager); + musicManagers.put(guildId, musicManager); + } + + guild.getAudioManager().setSendingHandler(musicManager.getSendHandler()); + + return musicManager; + } + + @Override + public void onGuildMessageReceived(GuildMessageReceivedEvent event) { + String[] command = event.getMessage().getContentRaw().split(" ", 2); + + if ("!play".equals(command[0]) && command.length == 2) { + loadAndPlay(event.getChannel(), command[1]); + } else if ("!skip".equals(command[0])) { + skipTrack(event.getChannel()); + } + + super.onGuildMessageReceived(event); + } + + private void loadAndPlay(final TextChannel channel, final String trackUrl) { + GuildMusicManager musicManager = getGuildAudioPlayer(channel.getGuild()); + + playerManager.loadItemOrdered(musicManager, trackUrl, new AudioLoadResultHandler() { + @Override + public void trackLoaded(AudioTrack track) { + channel.sendMessage("Adding to queue " + track.getInfo().title).queue(); + + play(channel.getGuild(), musicManager, track); + } + + @Override + public void playlistLoaded(AudioPlaylist playlist) { + AudioTrack firstTrack = playlist.getSelectedTrack(); + + if (firstTrack == null) { + firstTrack = playlist.getTracks().get(0); + } + + channel.sendMessage("Adding to queue " + firstTrack.getInfo().title + " (first track of playlist " + playlist.getName() + ")").queue(); + + play(channel.getGuild(), musicManager, firstTrack); + } + + @Override + public void noMatches() { + channel.sendMessage("Nothing found by " + trackUrl).queue(); + } + + @Override + public void loadFailed(FriendlyException exception) { + System.out.println(exception.getCause()); + channel.sendMessage("Could not play: " + exception.getMessage()).queue(); + } + }); + } + + private void play(Guild guild, GuildMusicManager musicManager, AudioTrack track) { + connectToFirstVoiceChannel(guild.getAudioManager()); + + musicManager.scheduler.queue(track); + } + + private void skipTrack(TextChannel channel) { + GuildMusicManager musicManager = getGuildAudioPlayer(channel.getGuild()); + musicManager.scheduler.nextTrack(); + + channel.sendMessage("Skipped to next track.").queue(); + } + + private static void connectToFirstVoiceChannel(AudioManager audioManager) { + if (!audioManager.isConnected() && !audioManager.isAttemptingToConnect()) { + for (VoiceChannel voiceChannel : audioManager.getGuild().getVoiceChannels()) { + audioManager.openAudioConnection(voiceChannel); + break; + } + } + } +} \ No newline at end of file diff --git a/src/trash/TrackScheduler.java b/src/trash/TrackScheduler.java new file mode 100644 index 0000000..b61b4e3 --- /dev/null +++ b/src/trash/TrackScheduler.java @@ -0,0 +1,55 @@ +package trash; +import com.sedmelluq.discord.lavaplayer.player.AudioPlayer; +import com.sedmelluq.discord.lavaplayer.player.event.AudioEventAdapter; +import com.sedmelluq.discord.lavaplayer.track.AudioTrack; +import com.sedmelluq.discord.lavaplayer.track.AudioTrackEndReason; + +import java.util.concurrent.BlockingQueue; +import java.util.concurrent.LinkedBlockingQueue; + +/** + * This class schedules tracks for the audio player. It contains the queue of tracks. + */ +public class TrackScheduler extends AudioEventAdapter { + private final AudioPlayer player; + private final BlockingQueue queue; + + /** + * @param player The audio player this scheduler uses + */ + public TrackScheduler(AudioPlayer player) { + this.player = player; + this.queue = new LinkedBlockingQueue<>(); + } + + /** + * Add the next track to queue or play right away if nothing is in the queue. + * + * @param track The track to play or add to queue. + */ + public void queue(AudioTrack track) { + // Calling startTrack with the noInterrupt set to true will start the track only if nothing is currently playing. If + // something is playing, it returns false and does nothing. In that case the player was already playing so this + // track goes to the queue instead. + if (!player.startTrack(track, true)) { + queue.offer(track); + } + } + + /** + * Start the next track, stopping the current one if it is playing. + */ + public void nextTrack() { + // Start the next track, regardless of if something is already playing or not. In case queue was empty, we are + // giving null to startTrack, which is a valid argument and will simply stop the player. + player.startTrack(queue.poll(), false); + } + + @Override + public void onTrackEnd(AudioPlayer player, AudioTrack track, AudioTrackEndReason endReason) { + // Only start the next track if the end reason is suitable for it (FINISHED or LOAD_FAILED) + if (endReason.mayStartNext) { + nextTrack(); + } + } +} \ No newline at end of file From 4ed18b8accefd07e5d574a348a3eab8e5c37d8b8 Mon Sep 17 00:00:00 2001 From: Matthew Cech Date: Thu, 17 Oct 2019 22:55:49 -0700 Subject: [PATCH 02/11] = main migrate --- src/main/Main.java | 131 ++++++++++++++++++++++++++++++++++++++-- src/trash/MainFAKE.java | 126 -------------------------------------- 2 files changed, 125 insertions(+), 132 deletions(-) delete mode 100644 src/trash/MainFAKE.java diff --git a/src/main/Main.java b/src/main/Main.java index 463ad75..c24eb38 100644 --- a/src/main/Main.java +++ b/src/main/Main.java @@ -1,12 +1,18 @@ package main; +import java.util.HashMap; import java.util.List; +import java.util.Map; import javax.security.auth.login.LoginException; +import com.sedmelluq.discord.lavaplayer.player.AudioLoadResultHandler; 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.tools.FriendlyException; +import com.sedmelluq.discord.lavaplayer.track.AudioPlaylist; +import com.sedmelluq.discord.lavaplayer.track.AudioTrack; import core.CharacterManager; import core.CommandEnabler; @@ -22,16 +28,24 @@ import dataStructures.KittyGuild; import dataStructures.KittyUser; import dataStructures.Response; import dataStructures.UserInput; +import net.dv8tion.jda.core.AccountType; +import net.dv8tion.jda.core.JDA; +import net.dv8tion.jda.core.JDABuilder; +import net.dv8tion.jda.core.entities.Guild; +import net.dv8tion.jda.core.entities.TextChannel; +import net.dv8tion.jda.core.entities.VoiceChannel; import net.dv8tion.jda.core.events.message.guild.GuildMessageReceivedEvent; import net.dv8tion.jda.core.hooks.ListenerAdapter; -import trash.MainFAKE; +import net.dv8tion.jda.core.managers.AudioManager; +import offline.Ref; +import trash.GuildMusicManager; import utils.GlobalLog; // http://www.slf4j.org/ - this JDA logging tool has been disabled by specifying NOP implementation. // This is the application entry point, and bot startup location! @SuppressWarnings("unused") -public class Main// extends ListenerAdapter +public class Main extends ListenerAdapter { // Variables and bot specific objects private static KittyCore kittyCore; @@ -46,9 +60,114 @@ public class Main// extends ListenerAdapter // Initialization and setup public static void main(String[] args) throws InterruptedException, LoginException, Exception { - MainFAKE.mainFAKE(args); + JDA bot = new JDABuilder(AccountType.BOT).setToken(Ref.TestToken).buildBlocking(); + bot.addEventListener(new Main()); + + } - /* + + private final AudioPlayerManager playerManager; + private final Map musicManagers; + + public Main() { + this.musicManagers = new HashMap<>(); + + this.playerManager = new DefaultAudioPlayerManager(); + AudioSourceManagers.registerRemoteSources(playerManager); + AudioSourceManagers.registerLocalSource(playerManager); + } + + private synchronized GuildMusicManager getGuildAudioPlayer(Guild guild) { + long guildId = Long.parseLong(guild.getId()); + GuildMusicManager musicManager = musicManagers.get(guildId); + + if (musicManager == null) { + musicManager = new GuildMusicManager(playerManager); + musicManagers.put(guildId, musicManager); + } + + guild.getAudioManager().setSendingHandler(musicManager.getSendHandler()); + + return musicManager; + } + + @Override + public void onGuildMessageReceived(GuildMessageReceivedEvent event) { + String[] command = event.getMessage().getContentRaw().split(" ", 2); + + if ("!play".equals(command[0]) && command.length == 2) { + loadAndPlay(event.getChannel(), command[1]); + } else if ("!skip".equals(command[0])) { + skipTrack(event.getChannel()); + } + + super.onGuildMessageReceived(event); + } + + private void loadAndPlay(final TextChannel channel, final String trackUrl) { + GuildMusicManager musicManager = getGuildAudioPlayer(channel.getGuild()); + + playerManager.loadItemOrdered(musicManager, trackUrl, new AudioLoadResultHandler() { + @Override + public void trackLoaded(AudioTrack track) { + channel.sendMessage("Adding to queue " + track.getInfo().title).queue(); + + play(channel.getGuild(), musicManager, track); + } + + @Override + public void playlistLoaded(AudioPlaylist playlist) { + AudioTrack firstTrack = playlist.getSelectedTrack(); + + if (firstTrack == null) { + firstTrack = playlist.getTracks().get(0); + } + + channel.sendMessage("Adding to queue " + firstTrack.getInfo().title + " (first track of playlist " + playlist.getName() + ")").queue(); + + play(channel.getGuild(), musicManager, firstTrack); + } + + @Override + public void noMatches() { + channel.sendMessage("Nothing found by " + trackUrl).queue(); + } + + @Override + public void loadFailed(FriendlyException exception) { + System.out.println(exception.getCause()); + channel.sendMessage("Could not play: " + exception.getMessage()).queue(); + } + }); + } + + private void play(Guild guild, GuildMusicManager musicManager, AudioTrack track) { + connectToFirstVoiceChannel(guild.getAudioManager()); + + musicManager.scheduler.queue(track); + } + + private void skipTrack(TextChannel channel) { + GuildMusicManager musicManager = getGuildAudioPlayer(channel.getGuild()); + musicManager.scheduler.nextTrack(); + + channel.sendMessage("Skipped to next track.").queue(); + } + + private static void connectToFirstVoiceChannel(AudioManager audioManager) { + if (!audioManager.isConnected() && !audioManager.isAttemptingToConnect()) { + for (VoiceChannel voiceChannel : audioManager.getGuild().getVoiceChannels()) { + audioManager.openAudioConnection(voiceChannel); + break; + } + } + } +} + + + /* ---------------------------------------------------------------------------------------------------------------------------------------------------------- + * + * // Factory startup. The ordering is intentional. GlobalLog.initialize(); databaseManager = ObjectBuilderFactory.constructDatabaseManager(); @@ -119,5 +238,5 @@ public class Main// extends ListenerAdapter if(!Superintendent.perCommandUpkeepPost(kittyCore, databaseManager)) return; } - */ -} \ No newline at end of file +} + */ \ No newline at end of file diff --git a/src/trash/MainFAKE.java b/src/trash/MainFAKE.java deleted file mode 100644 index 9b4f006..0000000 --- a/src/trash/MainFAKE.java +++ /dev/null @@ -1,126 +0,0 @@ -package trash; -import java.util.HashMap; -import java.util.Map; - -import com.sedmelluq.discord.lavaplayer.player.AudioLoadResultHandler; -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.tools.FriendlyException; -import com.sedmelluq.discord.lavaplayer.track.AudioPlaylist; -import com.sedmelluq.discord.lavaplayer.track.AudioTrack; - -import net.dv8tion.jda.core.AccountType; -import net.dv8tion.jda.core.JDA; -import net.dv8tion.jda.core.JDABuilder; -import net.dv8tion.jda.core.entities.Guild; -import net.dv8tion.jda.core.entities.TextChannel; -import net.dv8tion.jda.core.entities.VoiceChannel; -import net.dv8tion.jda.core.events.message.guild.GuildMessageReceivedEvent; -import net.dv8tion.jda.core.hooks.ListenerAdapter; -import net.dv8tion.jda.core.managers.AudioManager; -import offline.Ref; - -public class MainFAKE extends ListenerAdapter { - public static void mainFAKE(String[] args) throws Exception { - JDA bot = new JDABuilder(AccountType.BOT).setToken(Ref.TestToken).buildBlocking(); - bot.addEventListener(new MainFAKE()); - } - - private final AudioPlayerManager playerManager; - private final Map musicManagers; - - private MainFAKE() { - this.musicManagers = new HashMap<>(); - - this.playerManager = new DefaultAudioPlayerManager(); - AudioSourceManagers.registerRemoteSources(playerManager); - AudioSourceManagers.registerLocalSource(playerManager); - } - - private synchronized GuildMusicManager getGuildAudioPlayer(Guild guild) { - long guildId = Long.parseLong(guild.getId()); - GuildMusicManager musicManager = musicManagers.get(guildId); - - if (musicManager == null) { - musicManager = new GuildMusicManager(playerManager); - musicManagers.put(guildId, musicManager); - } - - guild.getAudioManager().setSendingHandler(musicManager.getSendHandler()); - - return musicManager; - } - - @Override - public void onGuildMessageReceived(GuildMessageReceivedEvent event) { - String[] command = event.getMessage().getContentRaw().split(" ", 2); - - if ("!play".equals(command[0]) && command.length == 2) { - loadAndPlay(event.getChannel(), command[1]); - } else if ("!skip".equals(command[0])) { - skipTrack(event.getChannel()); - } - - super.onGuildMessageReceived(event); - } - - private void loadAndPlay(final TextChannel channel, final String trackUrl) { - GuildMusicManager musicManager = getGuildAudioPlayer(channel.getGuild()); - - playerManager.loadItemOrdered(musicManager, trackUrl, new AudioLoadResultHandler() { - @Override - public void trackLoaded(AudioTrack track) { - channel.sendMessage("Adding to queue " + track.getInfo().title).queue(); - - play(channel.getGuild(), musicManager, track); - } - - @Override - public void playlistLoaded(AudioPlaylist playlist) { - AudioTrack firstTrack = playlist.getSelectedTrack(); - - if (firstTrack == null) { - firstTrack = playlist.getTracks().get(0); - } - - channel.sendMessage("Adding to queue " + firstTrack.getInfo().title + " (first track of playlist " + playlist.getName() + ")").queue(); - - play(channel.getGuild(), musicManager, firstTrack); - } - - @Override - public void noMatches() { - channel.sendMessage("Nothing found by " + trackUrl).queue(); - } - - @Override - public void loadFailed(FriendlyException exception) { - System.out.println(exception.getCause()); - channel.sendMessage("Could not play: " + exception.getMessage()).queue(); - } - }); - } - - private void play(Guild guild, GuildMusicManager musicManager, AudioTrack track) { - connectToFirstVoiceChannel(guild.getAudioManager()); - - musicManager.scheduler.queue(track); - } - - private void skipTrack(TextChannel channel) { - GuildMusicManager musicManager = getGuildAudioPlayer(channel.getGuild()); - musicManager.scheduler.nextTrack(); - - channel.sendMessage("Skipped to next track.").queue(); - } - - private static void connectToFirstVoiceChannel(AudioManager audioManager) { - if (!audioManager.isConnected() && !audioManager.isAttemptingToConnect()) { - for (VoiceChannel voiceChannel : audioManager.getGuild().getVoiceChannels()) { - audioManager.openAudioConnection(voiceChannel); - break; - } - } - } -} \ No newline at end of file From a1fa8b29b21ba9f573bf4e64540c8bf194659153 Mon Sep 17 00:00:00 2001 From: Matthew Cech Date: Thu, 17 Oct 2019 23:22:29 -0700 Subject: [PATCH 03/11] = Condensed main shapsnot --- src/main/Main.java | 171 ++++++++++++++++++++------------------------- 1 file changed, 76 insertions(+), 95 deletions(-) diff --git a/src/main/Main.java b/src/main/Main.java index c24eb38..6f14b5f 100644 --- a/src/main/Main.java +++ b/src/main/Main.java @@ -47,6 +47,26 @@ import utils.GlobalLog; @SuppressWarnings("unused") public class Main extends ListenerAdapter { + public class SmallAudio implements AudioLoadResultHandler + { + private TextChannel channel; + private GuildMusicManager manager; + + private SmallAudio(TextChannel channel, GuildMusicManager manager) { + this.channel = channel; + this.manager = manager; + } + + @Override public void loadFailed(FriendlyException arg0) { } + @Override public void noMatches() { } + @Override public void playlistLoaded(AudioPlaylist arg0) { } + + @Override + public void trackLoaded(AudioTrack track) { + play(channel.getGuild(), manager, track); + } + } + // Variables and bot specific objects private static KittyCore kittyCore; private static DatabaseManager databaseManager; @@ -66,102 +86,63 @@ public class Main extends ListenerAdapter } - private final AudioPlayerManager playerManager; - private final Map musicManagers; + public final AudioPlayerManager playerManager; + private final Map musicManagers; + + public Main() { + this.musicManagers = new HashMap<>(); + + this.playerManager = new DefaultAudioPlayerManager(); + AudioSourceManagers.registerRemoteSources(playerManager); + AudioSourceManagers.registerLocalSource(playerManager); + } + + private synchronized GuildMusicManager getGuildAudioPlayer(Guild guild) { + long guildId = Long.parseLong(guild.getId()); + GuildMusicManager musicManager = musicManagers.get(guildId); + + if (musicManager == null) { + musicManager = new GuildMusicManager(playerManager); + musicManagers.put(guildId, musicManager); + } + + guild.getAudioManager().setSendingHandler(musicManager.getSendHandler()); + + return musicManager; + } - public Main() { - this.musicManagers = new HashMap<>(); - - this.playerManager = new DefaultAudioPlayerManager(); - AudioSourceManagers.registerRemoteSources(playerManager); - AudioSourceManagers.registerLocalSource(playerManager); - } - - private synchronized GuildMusicManager getGuildAudioPlayer(Guild guild) { - long guildId = Long.parseLong(guild.getId()); - GuildMusicManager musicManager = musicManagers.get(guildId); - - if (musicManager == null) { - musicManager = new GuildMusicManager(playerManager); - musicManagers.put(guildId, musicManager); - } - - guild.getAudioManager().setSendingHandler(musicManager.getSendHandler()); - - return musicManager; - } - - @Override - public void onGuildMessageReceived(GuildMessageReceivedEvent event) { - String[] command = event.getMessage().getContentRaw().split(" ", 2); - - if ("!play".equals(command[0]) && command.length == 2) { - loadAndPlay(event.getChannel(), command[1]); - } else if ("!skip".equals(command[0])) { - skipTrack(event.getChannel()); - } - - super.onGuildMessageReceived(event); - } - - private void loadAndPlay(final TextChannel channel, final String trackUrl) { - GuildMusicManager musicManager = getGuildAudioPlayer(channel.getGuild()); - - playerManager.loadItemOrdered(musicManager, trackUrl, new AudioLoadResultHandler() { - @Override - public void trackLoaded(AudioTrack track) { - channel.sendMessage("Adding to queue " + track.getInfo().title).queue(); - - play(channel.getGuild(), musicManager, track); - } - - @Override - public void playlistLoaded(AudioPlaylist playlist) { - AudioTrack firstTrack = playlist.getSelectedTrack(); - - if (firstTrack == null) { - firstTrack = playlist.getTracks().get(0); - } - - channel.sendMessage("Adding to queue " + firstTrack.getInfo().title + " (first track of playlist " + playlist.getName() + ")").queue(); - - play(channel.getGuild(), musicManager, firstTrack); - } - - @Override - public void noMatches() { - channel.sendMessage("Nothing found by " + trackUrl).queue(); - } - - @Override - public void loadFailed(FriendlyException exception) { - System.out.println(exception.getCause()); - channel.sendMessage("Could not play: " + exception.getMessage()).queue(); - } - }); - } - - private void play(Guild guild, GuildMusicManager musicManager, AudioTrack track) { - connectToFirstVoiceChannel(guild.getAudioManager()); - - musicManager.scheduler.queue(track); - } - - private void skipTrack(TextChannel channel) { - GuildMusicManager musicManager = getGuildAudioPlayer(channel.getGuild()); - musicManager.scheduler.nextTrack(); - - channel.sendMessage("Skipped to next track.").queue(); - } - - private static void connectToFirstVoiceChannel(AudioManager audioManager) { - if (!audioManager.isConnected() && !audioManager.isAttemptingToConnect()) { - for (VoiceChannel voiceChannel : audioManager.getGuild().getVoiceChannels()) { - audioManager.openAudioConnection(voiceChannel); - break; - } - } - } + @Override + public void onGuildMessageReceived(GuildMessageReceivedEvent event) + { + if (event.getMessage().getContentRaw().contains("!play")) + { + final TextChannel channel = event.getChannel(); + final Guild guild = channel.getGuild(); + + channel.sendMessage("Doing something..."); + + GuildMusicManager musicManager = getGuildAudioPlayer(guild); + connectToFirstVoiceChannel(guild.getAudioManager()); + playerManager.loadItemOrdered(musicManager, "https://www.youtube.com/watch?v=qL-JCVA22Lo", new SmallAudio(channel, musicManager)); + } + + super.onGuildMessageReceived(event); + } + + private void play(Guild guild, GuildMusicManager musicManager, AudioTrack track) { + connectToFirstVoiceChannel(guild.getAudioManager()); + + musicManager.scheduler.queue(track); + } + + private static void connectToFirstVoiceChannel(AudioManager audioManager) { + if (!audioManager.isConnected() && !audioManager.isAttemptingToConnect()) { + for (VoiceChannel voiceChannel : audioManager.getGuild().getVoiceChannels()) { + audioManager.openAudioConnection(voiceChannel); + break; + } + } + } } From 248814b9e38bdb6fea17d42103c2919546adcae0 Mon Sep 17 00:00:00 2001 From: Matthew Cech Date: Thu, 17 Oct 2019 23:31:06 -0700 Subject: [PATCH 04/11] = Condense, iterative --- src/main/Main.java | 163 +++++++++++++++----------- src/trash/AudioPlayerSendHandler.java | 52 ++++---- 2 files changed, 122 insertions(+), 93 deletions(-) diff --git a/src/main/Main.java b/src/main/Main.java index 6f14b5f..b998210 100644 --- a/src/main/Main.java +++ b/src/main/Main.java @@ -7,12 +7,14 @@ import java.util.Map; import javax.security.auth.login.LoginException; import com.sedmelluq.discord.lavaplayer.player.AudioLoadResultHandler; +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.tools.FriendlyException; import com.sedmelluq.discord.lavaplayer.track.AudioPlaylist; import com.sedmelluq.discord.lavaplayer.track.AudioTrack; +import com.sedmelluq.discord.lavaplayer.track.playback.AudioFrame; import core.CharacterManager; import core.CommandEnabler; @@ -31,6 +33,7 @@ import dataStructures.UserInput; import net.dv8tion.jda.core.AccountType; import net.dv8tion.jda.core.JDA; import net.dv8tion.jda.core.JDABuilder; +import net.dv8tion.jda.core.audio.AudioSendHandler; import net.dv8tion.jda.core.entities.Guild; import net.dv8tion.jda.core.entities.TextChannel; import net.dv8tion.jda.core.entities.VoiceChannel; @@ -47,23 +50,68 @@ import utils.GlobalLog; @SuppressWarnings("unused") public class Main extends ListenerAdapter { + public class AudioPlayerSendHandler implements AudioSendHandler + { + private final AudioPlayer audioPlayer; + private AudioFrame lastFrame; + + public AudioPlayerSendHandler(AudioPlayer audioPlayer) + { + this.audioPlayer = audioPlayer; + } + + @Override + public boolean canProvide() + { + lastFrame = audioPlayer.provide(); + return lastFrame != null; + } + + @Override public byte[] provide20MsAudio() + { + return lastFrame.getData(); + } + + @Override public boolean isOpus() + { + return true; + } + } + public class SmallAudio implements AudioLoadResultHandler { private TextChannel channel; + private Guild guild; private GuildMusicManager manager; - private SmallAudio(TextChannel channel, GuildMusicManager manager) { + private SmallAudio(TextChannel channel, Guild guild, GuildMusicManager manager) + { this.channel = channel; this.manager = manager; + this.guild = guild; } @Override public void loadFailed(FriendlyException arg0) { } @Override public void noMatches() { } @Override public void playlistLoaded(AudioPlaylist arg0) { } - + @Override - public void trackLoaded(AudioTrack track) { - play(channel.getGuild(), manager, track); + public void trackLoaded(AudioTrack track) + { + connectToFirstVoiceChannel(guild.getAudioManager()); + manager.scheduler.queue(track); + } + + private void connectToFirstVoiceChannel(AudioManager audioManager) + { + if (!audioManager.isConnected() && !audioManager.isAttemptingToConnect()) + { + for (VoiceChannel voiceChannel : audioManager.getGuild().getVoiceChannels()) + { + audioManager.openAudioConnection(voiceChannel); + break; + } + } } } @@ -80,72 +128,53 @@ public class Main extends ListenerAdapter // Initialization and setup public static void main(String[] args) throws InterruptedException, LoginException, Exception { - JDA bot = new JDABuilder(AccountType.BOT).setToken(Ref.TestToken).buildBlocking(); - bot.addEventListener(new Main()); - - + JDA bot = new JDABuilder(AccountType.BOT).setToken(Ref.TestToken).buildBlocking(); + bot.addEventListener(new Main()); } - public final AudioPlayerManager playerManager; - private final Map musicManagers; - - public Main() { - this.musicManagers = new HashMap<>(); - - this.playerManager = new DefaultAudioPlayerManager(); - AudioSourceManagers.registerRemoteSources(playerManager); - AudioSourceManagers.registerLocalSource(playerManager); - } - - private synchronized GuildMusicManager getGuildAudioPlayer(Guild guild) { - long guildId = Long.parseLong(guild.getId()); - GuildMusicManager musicManager = musicManagers.get(guildId); - - if (musicManager == null) { - musicManager = new GuildMusicManager(playerManager); - musicManagers.put(guildId, musicManager); - } - - guild.getAudioManager().setSendingHandler(musicManager.getSendHandler()); - - return musicManager; - } - - @Override - public void onGuildMessageReceived(GuildMessageReceivedEvent event) - { - if (event.getMessage().getContentRaw().contains("!play")) - { - final TextChannel channel = event.getChannel(); - final Guild guild = channel.getGuild(); - - channel.sendMessage("Doing something..."); - - GuildMusicManager musicManager = getGuildAudioPlayer(guild); - connectToFirstVoiceChannel(guild.getAudioManager()); - playerManager.loadItemOrdered(musicManager, "https://www.youtube.com/watch?v=qL-JCVA22Lo", new SmallAudio(channel, musicManager)); - } - - super.onGuildMessageReceived(event); - } - - private void play(Guild guild, GuildMusicManager musicManager, AudioTrack track) { - connectToFirstVoiceChannel(guild.getAudioManager()); - - musicManager.scheduler.queue(track); - } - - private static void connectToFirstVoiceChannel(AudioManager audioManager) { - if (!audioManager.isConnected() && !audioManager.isAttemptingToConnect()) { - for (VoiceChannel voiceChannel : audioManager.getGuild().getVoiceChannels()) { - audioManager.openAudioConnection(voiceChannel); - break; - } - } - } + public final AudioPlayerManager playerManager; + private final Map musicManagers; + + public Main() + { + this.musicManagers = new HashMap<>(); + + this.playerManager = new DefaultAudioPlayerManager(); + AudioSourceManagers.registerRemoteSources(playerManager); + AudioSourceManagers.registerLocalSource(playerManager); + } + + private synchronized GuildMusicManager getGuildAudioPlayer(Guild guild) + { + long guildId = Long.parseLong(guild.getId()); + GuildMusicManager musicManager = musicManagers.get(guildId); + + if (musicManager == null) { + musicManager = new GuildMusicManager(playerManager); + musicManagers.put(guildId, musicManager); + } + + guild.getAudioManager().setSendingHandler(musicManager.getSendHandler()); + + return musicManager; + } + + @Override + public void onGuildMessageReceived(GuildMessageReceivedEvent event) + { + if(event.getMessage().getContentRaw().contains("!hasan")) + { + final TextChannel channel = event.getChannel(); + final Guild guild = channel.getGuild(); + + GuildMusicManager musicManager = getGuildAudioPlayer(guild); + playerManager.loadItemOrdered(musicManager, "https://www.youtube.com/watch?v=qL-JCVA22Lo", new SmallAudio(channel, guild, musicManager)); + } + + super.onGuildMessageReceived(event); + } } - - + /* ---------------------------------------------------------------------------------------------------------------------------------------------------------- * * diff --git a/src/trash/AudioPlayerSendHandler.java b/src/trash/AudioPlayerSendHandler.java index daf7414..9d00ca8 100644 --- a/src/trash/AudioPlayerSendHandler.java +++ b/src/trash/AudioPlayerSendHandler.java @@ -12,30 +12,30 @@ import net.dv8tion.jda.core.audio.AudioSendHandler; */ public class AudioPlayerSendHandler implements AudioSendHandler { - private final AudioPlayer audioPlayer; - private AudioFrame lastFrame; - - public AudioPlayerSendHandler(AudioPlayer audioPlayer) - { - this.audioPlayer = audioPlayer; - } - - @Override - public boolean canProvide() - { - lastFrame = audioPlayer.provide(); - return lastFrame != null; - } - - @Override - public byte[] provide20MsAudio() - { - return lastFrame.getData(); - } - - @Override - public boolean isOpus() - { - return true; - } + private final AudioPlayer audioPlayer; + private AudioFrame lastFrame; + + public AudioPlayerSendHandler(AudioPlayer audioPlayer) + { + this.audioPlayer = audioPlayer; + } + + @Override + public boolean canProvide() + { + lastFrame = audioPlayer.provide(); + return lastFrame != null; + } + + @Override + public byte[] provide20MsAudio() + { + return lastFrame.getData(); + } + + @Override + public boolean isOpus() + { + return true; + } } \ No newline at end of file From 4d36bb0cb97cfc1ed845ff867719bc2d4c5fac25 Mon Sep 17 00:00:00 2001 From: Matthew Cech Date: Thu, 17 Oct 2019 23:33:14 -0700 Subject: [PATCH 05/11] = Condensed managers and handler --- src/main/Main.java | 20 ++++++++++++- src/trash/AudioPlayerSendHandler.java | 41 --------------------------- src/trash/GuildMusicManager.java | 34 ---------------------- 3 files changed, 19 insertions(+), 76 deletions(-) delete mode 100644 src/trash/AudioPlayerSendHandler.java delete mode 100644 src/trash/GuildMusicManager.java diff --git a/src/main/Main.java b/src/main/Main.java index b998210..7012164 100644 --- a/src/main/Main.java +++ b/src/main/Main.java @@ -41,7 +41,7 @@ import net.dv8tion.jda.core.events.message.guild.GuildMessageReceivedEvent; import net.dv8tion.jda.core.hooks.ListenerAdapter; import net.dv8tion.jda.core.managers.AudioManager; import offline.Ref; -import trash.GuildMusicManager; +import trash.TrackScheduler; import utils.GlobalLog; // http://www.slf4j.org/ - this JDA logging tool has been disabled by specifying NOP implementation. @@ -50,6 +50,24 @@ import utils.GlobalLog; @SuppressWarnings("unused") public class Main extends ListenerAdapter { + public class GuildMusicManager + { + public final AudioPlayer player; + public final TrackScheduler scheduler; + + public GuildMusicManager(AudioPlayerManager manager) + { + player = manager.createPlayer(); + scheduler = new TrackScheduler(player); + player.addListener(scheduler); + } + + public AudioPlayerSendHandler getSendHandler() + { + return new AudioPlayerSendHandler(player); + } + } + public class AudioPlayerSendHandler implements AudioSendHandler { private final AudioPlayer audioPlayer; diff --git a/src/trash/AudioPlayerSendHandler.java b/src/trash/AudioPlayerSendHandler.java deleted file mode 100644 index 9d00ca8..0000000 --- a/src/trash/AudioPlayerSendHandler.java +++ /dev/null @@ -1,41 +0,0 @@ -package trash; - -import com.sedmelluq.discord.lavaplayer.player.AudioPlayer; -import com.sedmelluq.discord.lavaplayer.track.playback.AudioFrame; - -import net.dv8tion.jda.core.audio.AudioSendHandler; - -/** - * This is a wrapper around AudioPlayer which makes it behave as an AudioSendHandler for JDA. As JDA calls canProvide - * before every call to provide20MsAudio(), we pull the frame in canProvide() and use the frame we already pulled in - * provide20MsAudio(). - */ -public class AudioPlayerSendHandler implements AudioSendHandler -{ - private final AudioPlayer audioPlayer; - private AudioFrame lastFrame; - - public AudioPlayerSendHandler(AudioPlayer audioPlayer) - { - this.audioPlayer = audioPlayer; - } - - @Override - public boolean canProvide() - { - lastFrame = audioPlayer.provide(); - return lastFrame != null; - } - - @Override - public byte[] provide20MsAudio() - { - return lastFrame.getData(); - } - - @Override - public boolean isOpus() - { - return true; - } -} \ No newline at end of file diff --git a/src/trash/GuildMusicManager.java b/src/trash/GuildMusicManager.java deleted file mode 100644 index 478a3b0..0000000 --- a/src/trash/GuildMusicManager.java +++ /dev/null @@ -1,34 +0,0 @@ -package trash; -import com.sedmelluq.discord.lavaplayer.player.AudioPlayer; -import com.sedmelluq.discord.lavaplayer.player.AudioPlayerManager; - -/** - * Holder for both the player and a track scheduler for one guild. - */ -public class GuildMusicManager { - /** - * Audio player for the guild. - */ - public final AudioPlayer player; - /** - * Track scheduler for the player. - */ - public final TrackScheduler scheduler; - - /** - * Creates a player and a track scheduler. - * @param manager Audio player manager to use for creating the player. - */ - public GuildMusicManager(AudioPlayerManager manager) { - player = manager.createPlayer(); - scheduler = new TrackScheduler(player); - player.addListener(scheduler); - } - - /** - * @return Wrapper around AudioPlayer to use it as an AudioSendHandler. - */ - public AudioPlayerSendHandler getSendHandler() { - return new AudioPlayerSendHandler(player); - } -} \ No newline at end of file From 94a3f1afcdd07f3265e755a1376fec5ff6568b5e Mon Sep 17 00:00:00 2001 From: Matthew Cech Date: Thu, 17 Oct 2019 23:37:44 -0700 Subject: [PATCH 06/11] = Condensed track scheduler --- src/main/Main.java | 6 +--- src/trash/TrackScheduler.java | 55 ----------------------------------- 2 files changed, 1 insertion(+), 60 deletions(-) delete mode 100644 src/trash/TrackScheduler.java diff --git a/src/main/Main.java b/src/main/Main.java index 7012164..60637e3 100644 --- a/src/main/Main.java +++ b/src/main/Main.java @@ -41,7 +41,6 @@ import net.dv8tion.jda.core.events.message.guild.GuildMessageReceivedEvent; import net.dv8tion.jda.core.hooks.ListenerAdapter; import net.dv8tion.jda.core.managers.AudioManager; import offline.Ref; -import trash.TrackScheduler; import utils.GlobalLog; // http://www.slf4j.org/ - this JDA logging tool has been disabled by specifying NOP implementation. @@ -53,13 +52,10 @@ public class Main extends ListenerAdapter public class GuildMusicManager { public final AudioPlayer player; - public final TrackScheduler scheduler; public GuildMusicManager(AudioPlayerManager manager) { player = manager.createPlayer(); - scheduler = new TrackScheduler(player); - player.addListener(scheduler); } public AudioPlayerSendHandler getSendHandler() @@ -117,7 +113,7 @@ public class Main extends ListenerAdapter public void trackLoaded(AudioTrack track) { connectToFirstVoiceChannel(guild.getAudioManager()); - manager.scheduler.queue(track); + manager.player.startTrack(track, false); } private void connectToFirstVoiceChannel(AudioManager audioManager) diff --git a/src/trash/TrackScheduler.java b/src/trash/TrackScheduler.java deleted file mode 100644 index b61b4e3..0000000 --- a/src/trash/TrackScheduler.java +++ /dev/null @@ -1,55 +0,0 @@ -package trash; -import com.sedmelluq.discord.lavaplayer.player.AudioPlayer; -import com.sedmelluq.discord.lavaplayer.player.event.AudioEventAdapter; -import com.sedmelluq.discord.lavaplayer.track.AudioTrack; -import com.sedmelluq.discord.lavaplayer.track.AudioTrackEndReason; - -import java.util.concurrent.BlockingQueue; -import java.util.concurrent.LinkedBlockingQueue; - -/** - * This class schedules tracks for the audio player. It contains the queue of tracks. - */ -public class TrackScheduler extends AudioEventAdapter { - private final AudioPlayer player; - private final BlockingQueue queue; - - /** - * @param player The audio player this scheduler uses - */ - public TrackScheduler(AudioPlayer player) { - this.player = player; - this.queue = new LinkedBlockingQueue<>(); - } - - /** - * Add the next track to queue or play right away if nothing is in the queue. - * - * @param track The track to play or add to queue. - */ - public void queue(AudioTrack track) { - // Calling startTrack with the noInterrupt set to true will start the track only if nothing is currently playing. If - // something is playing, it returns false and does nothing. In that case the player was already playing so this - // track goes to the queue instead. - if (!player.startTrack(track, true)) { - queue.offer(track); - } - } - - /** - * Start the next track, stopping the current one if it is playing. - */ - public void nextTrack() { - // Start the next track, regardless of if something is already playing or not. In case queue was empty, we are - // giving null to startTrack, which is a valid argument and will simply stop the player. - player.startTrack(queue.poll(), false); - } - - @Override - public void onTrackEnd(AudioPlayer player, AudioTrack track, AudioTrackEndReason endReason) { - // Only start the next track if the end reason is suitable for it (FINISHED or LOAD_FAILED) - if (endReason.mayStartNext) { - nextTrack(); - } - } -} \ No newline at end of file From 0ff71abfb0bb549670942e94008ebafe135e5d3d Mon Sep 17 00:00:00 2001 From: Matthew Cech Date: Fri, 18 Oct 2019 00:00:35 -0700 Subject: [PATCH 07/11] = Player isolation --- src/main/Main.java | 43 ++++++++++++------------------------------- 1 file changed, 12 insertions(+), 31 deletions(-) diff --git a/src/main/Main.java b/src/main/Main.java index 60637e3..11a91e3 100644 --- a/src/main/Main.java +++ b/src/main/Main.java @@ -52,16 +52,11 @@ public class Main extends ListenerAdapter public class GuildMusicManager { public final AudioPlayer player; - - public GuildMusicManager(AudioPlayerManager manager) + + public GuildMusicManager(AudioPlayerManager manager, Guild guild) { player = manager.createPlayer(); } - - public AudioPlayerSendHandler getSendHandler() - { - return new AudioPlayerSendHandler(player); - } } public class AudioPlayerSendHandler implements AudioSendHandler @@ -96,12 +91,12 @@ public class Main extends ListenerAdapter { private TextChannel channel; private Guild guild; - private GuildMusicManager manager; + private AudioPlayer player; - private SmallAudio(TextChannel channel, Guild guild, GuildMusicManager manager) + private SmallAudio(TextChannel channel, Guild guild, AudioPlayer player) { this.channel = channel; - this.manager = manager; + this.player = player; this.guild = guild; } @@ -113,7 +108,7 @@ public class Main extends ListenerAdapter public void trackLoaded(AudioTrack track) { connectToFirstVoiceChannel(guild.getAudioManager()); - manager.player.startTrack(track, false); + player.startTrack(track, false); } private void connectToFirstVoiceChannel(AudioManager audioManager) @@ -147,32 +142,16 @@ public class Main extends ListenerAdapter } public final AudioPlayerManager playerManager; - private final Map musicManagers; + public final AudioPlayer player; public Main() { - this.musicManagers = new HashMap<>(); - this.playerManager = new DefaultAudioPlayerManager(); + this.player = playerManager.createPlayer(); AudioSourceManagers.registerRemoteSources(playerManager); AudioSourceManagers.registerLocalSource(playerManager); } - private synchronized GuildMusicManager getGuildAudioPlayer(Guild guild) - { - long guildId = Long.parseLong(guild.getId()); - GuildMusicManager musicManager = musicManagers.get(guildId); - - if (musicManager == null) { - musicManager = new GuildMusicManager(playerManager); - musicManagers.put(guildId, musicManager); - } - - guild.getAudioManager().setSendingHandler(musicManager.getSendHandler()); - - return musicManager; - } - @Override public void onGuildMessageReceived(GuildMessageReceivedEvent event) { @@ -181,8 +160,10 @@ public class Main extends ListenerAdapter final TextChannel channel = event.getChannel(); final Guild guild = channel.getGuild(); - GuildMusicManager musicManager = getGuildAudioPlayer(guild); - playerManager.loadItemOrdered(musicManager, "https://www.youtube.com/watch?v=qL-JCVA22Lo", new SmallAudio(channel, guild, musicManager)); + System.out.println("Attempting to play"); + GuildMusicManager noDispose = new GuildMusicManager(playerManager, guild); + guild.getAudioManager().setSendingHandler(new AudioPlayerSendHandler(player)); + playerManager.loadItemOrdered(noDispose, "https://www.youtube.com/watch?v=qL-JCVA22Lo", new SmallAudio(channel, guild, player)); } super.onGuildMessageReceived(event); From 12e0ec98bd7ac2f547b0f7be168174a6c0aab7ef Mon Sep 17 00:00:00 2001 From: Matthew Cech Date: Fri, 18 Oct 2019 00:04:38 -0700 Subject: [PATCH 08/11] = Swapped to sync object --- src/main/Main.java | 43 ++++++++++++++++++------------------------- 1 file changed, 18 insertions(+), 25 deletions(-) diff --git a/src/main/Main.java b/src/main/Main.java index 11a91e3..9611c13 100644 --- a/src/main/Main.java +++ b/src/main/Main.java @@ -49,16 +49,6 @@ import utils.GlobalLog; @SuppressWarnings("unused") public class Main extends ListenerAdapter { - public class GuildMusicManager - { - public final AudioPlayer player; - - public GuildMusicManager(AudioPlayerManager manager, Guild guild) - { - player = manager.createPlayer(); - } - } - public class AudioPlayerSendHandler implements AudioSendHandler { private final AudioPlayer audioPlayer; @@ -124,16 +114,6 @@ public class Main extends ListenerAdapter } } - // Variables and bot specific objects - private static KittyCore kittyCore; - private static DatabaseManager databaseManager; - private static CommandManager commandManager; - private static Stats stats; - private static RPManager rpManager; - private static PluginManager pluginManager; - private static CharacterManager charManager; - - // Initialization and setup public static void main(String[] args) throws InterruptedException, LoginException, Exception { @@ -161,18 +141,31 @@ public class Main extends ListenerAdapter final Guild guild = channel.getGuild(); System.out.println("Attempting to play"); - GuildMusicManager noDispose = new GuildMusicManager(playerManager, guild); guild.getAudioManager().setSendingHandler(new AudioPlayerSendHandler(player)); - playerManager.loadItemOrdered(noDispose, "https://www.youtube.com/watch?v=qL-JCVA22Lo", new SmallAudio(channel, guild, player)); + + playerManager.loadItemOrdered(new Object(), "https://www.youtube.com/watch?v=qL-JCVA22Lo", new SmallAudio(channel, guild, player)); } super.onGuildMessageReceived(event); } } - /* ---------------------------------------------------------------------------------------------------------------------------------------------------------- - * - * +/* ---------------------------------------------------------------------------------------------------------------------------------------------------------- + + + // Variables and bot specific objects + private static KittyCore kittyCore; + private static DatabaseManager databaseManager; + private static CommandManager commandManager; + private static Stats stats; + private static RPManager rpManager; + private static PluginManager pluginManager; + private static CharacterManager charManager; + + + // Initialization and setup + public static void main(String[] args) throws InterruptedException, LoginException, Exception + { // Factory startup. The ordering is intentional. GlobalLog.initialize(); databaseManager = ObjectBuilderFactory.constructDatabaseManager(); From dfbf646abc7e51a3660a7a0c07435ebcecf3b73e Mon Sep 17 00:00:00 2001 From: Matthew Cech Date: Fri, 18 Oct 2019 00:08:23 -0700 Subject: [PATCH 09/11] = synced item tweak --- src/main/Main.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/Main.java b/src/main/Main.java index 9611c13..6e11048 100644 --- a/src/main/Main.java +++ b/src/main/Main.java @@ -114,6 +114,9 @@ public class Main extends ListenerAdapter } } + public final AudioPlayerManager playerManager; + public final AudioPlayer player; + // Initialization and setup public static void main(String[] args) throws InterruptedException, LoginException, Exception { @@ -121,13 +124,11 @@ public class Main extends ListenerAdapter bot.addEventListener(new Main()); } - public final AudioPlayerManager playerManager; - public final AudioPlayer player; - public Main() { this.playerManager = new DefaultAudioPlayerManager(); this.player = playerManager.createPlayer(); + AudioSourceManagers.registerRemoteSources(playerManager); AudioSourceManagers.registerLocalSource(playerManager); } @@ -140,10 +141,9 @@ public class Main extends ListenerAdapter final TextChannel channel = event.getChannel(); final Guild guild = channel.getGuild(); - System.out.println("Attempting to play"); guild.getAudioManager().setSendingHandler(new AudioPlayerSendHandler(player)); - playerManager.loadItemOrdered(new Object(), "https://www.youtube.com/watch?v=qL-JCVA22Lo", new SmallAudio(channel, guild, player)); + playerManager.loadItemOrdered(player, "https://www.youtube.com/watch?v=qL-JCVA22Lo", new SmallAudio(channel, guild, player)); } super.onGuildMessageReceived(event); From 462bb58ead917962a5408e5e97c0789a04ad6683 Mon Sep 17 00:00:00 2001 From: Alex Date: Sat, 19 Oct 2019 02:56:11 -0400 Subject: [PATCH 10/11] =Fixing Youtube Player --- src/commands/music/CommandMusicMain.java | 3 + src/commands/music/SubCommandAddTrack.java | 12 +- src/commands/music/SubCommandPlaylist.java | 24 ++++ src/commands/music/SubCommandSkip.java | 23 ++++ src/commands/music/SubCommandStop.java | 24 ++++ src/core/ObjectBuilderFactory.java | 24 +++- src/dataStructures/KittyGuild.java | 11 +- src/main/Main.java | 107 +---------------- src/utils/audio/AudioController.java | 84 -------------- src/utils/audio/AudioPlayerSendHandler.java | 41 ------- src/utils/audio/AudioUtils.java | 120 +++++++++++++++++++- src/utils/audio/GuildMusicManager.java | 36 ------ src/utils/audio/TrackScheduler.java | 62 ---------- 13 files changed, 216 insertions(+), 355 deletions(-) create mode 100644 src/commands/music/SubCommandPlaylist.java create mode 100644 src/commands/music/SubCommandSkip.java create mode 100644 src/commands/music/SubCommandStop.java delete mode 100644 src/utils/audio/AudioController.java delete mode 100644 src/utils/audio/AudioPlayerSendHandler.java delete mode 100644 src/utils/audio/GuildMusicManager.java delete mode 100644 src/utils/audio/TrackScheduler.java diff --git a/src/commands/music/CommandMusicMain.java b/src/commands/music/CommandMusicMain.java index f9417b8..6581271 100644 --- a/src/commands/music/CommandMusicMain.java +++ b/src/commands/music/CommandMusicMain.java @@ -15,6 +15,9 @@ public class CommandMusicMain extends Command framework.addCommand("join", new SubCommandJoin(KittyRole.General, KittyRating.Safe)); framework.addCommand("leave", new SubCommandLeave(KittyRole.General, KittyRating.Safe)); framework.addCommand("add", new SubCommandAddTrack(KittyRole.General, KittyRating.Safe)); + framework.addCommand("skip", new SubCommandSkip(KittyRole.General, KittyRating.Safe)); + framework.addCommand("stop", new SubCommandStop(KittyRole.General, KittyRating.Safe)); + framework.addCommand("playlist", new SubCommandPlaylist(KittyRole.General, KittyRating.Safe)); } @Override diff --git a/src/commands/music/SubCommandAddTrack.java b/src/commands/music/SubCommandAddTrack.java index 8ffef3f..39febae 100644 --- a/src/commands/music/SubCommandAddTrack.java +++ b/src/commands/music/SubCommandAddTrack.java @@ -9,7 +9,6 @@ import dataStructures.KittyRole; import dataStructures.KittyUser; import dataStructures.UserInput; import network.NetworkYoutube; -import utils.audio.AudioController; public class SubCommandAddTrack extends SubCommand { @@ -17,16 +16,17 @@ public class SubCommandAddTrack extends SubCommand public SubCommandAddTrack(KittyRole level, KittyRating rating) { super(level, rating); } NetworkYoutube YT = new NetworkYoutube(); - AudioController ac = new AudioController(); @Override public SubCommandFormattable OnRun(KittyGuild guild, KittyChannel channel, KittyUser user, UserInput input) { //Get track from Youtube - String video = YT.getYT(input.args); - ac.loadAndPlay(video, guild); - System.out.println("Internal: " + ac.response); - + String video = input.args; + if(!(video.startsWith("https://www.youtube") || video.startsWith("https://www.youtu.be"))) + { + video = YT.getYT(video); + } + guild.audio.playVideo(video); return new SubCommandFormattable(video); } } \ No newline at end of file diff --git a/src/commands/music/SubCommandPlaylist.java b/src/commands/music/SubCommandPlaylist.java new file mode 100644 index 0000000..4ab8c88 --- /dev/null +++ b/src/commands/music/SubCommandPlaylist.java @@ -0,0 +1,24 @@ +package commands.music; + +import java.util.ArrayList; + +import com.sedmelluq.discord.lavaplayer.track.AudioTrack; + +import core.SubCommand; +import core.SubCommandFormattable; +import dataStructures.*; + +public class SubCommandPlaylist extends SubCommand +{ + + public SubCommandPlaylist(KittyRole roleLevel, KittyRating contentRating) {super(roleLevel, contentRating); } + + @Override + public SubCommandFormattable OnRun(KittyGuild guild, KittyChannel channel, KittyUser user, UserInput input) + { +// ArrayList playlist = guild.audio.getPlaylist(); + String stringPlaylist = guild.audio.getPlaylist(guild.audio.player); + return new SubCommandFormattable(stringPlaylist); + } + +} diff --git a/src/commands/music/SubCommandSkip.java b/src/commands/music/SubCommandSkip.java new file mode 100644 index 0000000..b57ee52 --- /dev/null +++ b/src/commands/music/SubCommandSkip.java @@ -0,0 +1,23 @@ +package commands.music; + +import core.SubCommand; +import core.SubCommandFormattable; +import dataStructures.KittyChannel; +import dataStructures.KittyGuild; +import dataStructures.KittyRating; +import dataStructures.KittyRole; +import dataStructures.KittyUser; +import dataStructures.UserInput; + +public class SubCommandSkip extends SubCommand +{ + public SubCommandSkip(KittyRole level, KittyRating rating) { super(level, rating); } + { + + } + @Override + public SubCommandFormattable OnRun(KittyGuild guild, KittyChannel channel, KittyUser user, UserInput input) + { + return new SubCommandFormattable(guild.audio.skipVideo(guild.audio.player)); + } +} diff --git a/src/commands/music/SubCommandStop.java b/src/commands/music/SubCommandStop.java new file mode 100644 index 0000000..2aacffd --- /dev/null +++ b/src/commands/music/SubCommandStop.java @@ -0,0 +1,24 @@ +package commands.music; + +import core.SubCommand; +import core.SubCommandFormattable; +import dataStructures.KittyChannel; +import dataStructures.KittyGuild; +import dataStructures.KittyRating; +import dataStructures.KittyRole; +import dataStructures.KittyUser; +import dataStructures.UserInput; + +public class SubCommandStop extends SubCommand +{ + + public SubCommandStop(KittyRole roleLevel, KittyRating contentRating) {super(roleLevel, contentRating);} + + @Override + public SubCommandFormattable OnRun(KittyGuild guild, KittyChannel channel, KittyUser user, UserInput input) + { + + return new SubCommandFormattable(guild.audio.stopPlayer(guild.audio.player)); + } + +} diff --git a/src/core/ObjectBuilderFactory.java b/src/core/ObjectBuilderFactory.java index 0b8dced..fd5d592 100644 --- a/src/core/ObjectBuilderFactory.java +++ b/src/core/ObjectBuilderFactory.java @@ -7,16 +7,29 @@ import java.util.concurrent.Semaphore; import javax.security.auth.login.LoginException; +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.player.AudioPlayerManager; //import com.sedmelluq.discord.lavaplayer.player.DefaultAudioPlayerManager; import core.lua.PluginManager; -import dataStructures.*; +import dataStructures.KittyChannel; +import dataStructures.KittyCore; +import dataStructures.KittyGuild; +import dataStructures.KittyRating; +import dataStructures.KittyRole; +import dataStructures.KittyUser; import main.Main; import net.dv8tion.jda.core.AccountType; import net.dv8tion.jda.core.JDA; import net.dv8tion.jda.core.JDABuilder; -import net.dv8tion.jda.core.entities.*; +import net.dv8tion.jda.core.entities.Emote; +import net.dv8tion.jda.core.entities.Game; +import net.dv8tion.jda.core.entities.Guild; +import net.dv8tion.jda.core.entities.Member; +import net.dv8tion.jda.core.entities.User; import net.dv8tion.jda.core.events.message.guild.GuildMessageReceivedEvent; import offline.Ref; import utils.AdminControl; @@ -56,7 +69,7 @@ public class ObjectBuilderFactory private static CommandManager commandManager; //Audio track manager -// private static AudioPlayerManager audioPlayer = new DefaultAudioPlayerManager(); + private static AudioPlayerManager playerManager = new DefaultAudioPlayerManager(); // Localization classes - these are singletons, but should be initialized before almost all other // things so their inclusion in the factory is to ensure they're started at the correct time. @@ -91,6 +104,9 @@ public class ObjectBuilderFactory database = null; stats = null; + AudioSourceManagers.registerRemoteSources(playerManager); + AudioSourceManagers.registerLocalSource(playerManager); + // Start by reading from things that are external. Because // we require these things to be resolved before the rest of the application, // we place them here. @@ -148,7 +164,7 @@ public class ObjectBuilderFactory else { // Construct a new guild with defaults - guild = new KittyGuild(uid, new AdminControl(event.getGuild()), emotesString, new AudioUtils(event.getGuild())); + guild = new KittyGuild(uid, new AdminControl(event.getGuild()), emotesString, new AudioUtils(event.getGuild(), playerManager)); DatabaseManager.instance.globalRegister(guild); guildCache.put(uid, guild); } diff --git a/src/dataStructures/KittyGuild.java b/src/dataStructures/KittyGuild.java index 4369490..ceb056d 100644 --- a/src/dataStructures/KittyGuild.java +++ b/src/dataStructures/KittyGuild.java @@ -2,15 +2,10 @@ package dataStructures; import java.util.ArrayList; -import com.sedmelluq.discord.lavaplayer.player.AudioPlayerManager; -import com.sedmelluq.discord.lavaplayer.player.DefaultAudioPlayerManager; -import com.sedmelluq.discord.lavaplayer.source.AudioSourceManagers; - import core.DatabaseManager; import core.DatabaseTrackedObject; import utils.AdminControl; import utils.audio.AudioUtils; -import utils.audio.GuildMusicManager; // Context for a given guild for kittybot. Primarily designed to hold guild-specific settings. public class KittyGuild extends DatabaseTrackedObject @@ -28,8 +23,6 @@ public class KittyGuild extends DatabaseTrackedObject public ArrayList choices = new ArrayList(); public AdminControl control; public AudioUtils audio; - public GuildMusicManager musicManager; - public AudioPlayerManager playerManager = new DefaultAudioPlayerManager(); public ArrayList raffleUsersUnchosen = new ArrayList(); public ArrayList raffleUsersChosen = new ArrayList(); @@ -51,14 +44,12 @@ public class KittyGuild extends DatabaseTrackedObject // Default content for a guild public KittyGuild(String uniqueID, AdminControl adminControl, ArrayList emoji, AudioUtils audio) { + super(uniqueID); - AudioSourceManagers.registerRemoteSources(playerManager); - AudioSourceManagers.registerLocalSource(playerManager); this.uniqueID = uniqueID; roleList = new KittyTrackedVector(roleListName, uniqueID); beans = new KittyTrackedLong(beansName, uniqueID); registerTrackedObjects(); - musicManager = new GuildMusicManager(playerManager); control = adminControl; this.contentRating = KittyRating.Safe; diff --git a/src/main/Main.java b/src/main/Main.java index 6e11048..23e3b7d 100644 --- a/src/main/Main.java +++ b/src/main/Main.java @@ -49,110 +49,6 @@ import utils.GlobalLog; @SuppressWarnings("unused") public class Main extends ListenerAdapter { - public class AudioPlayerSendHandler implements AudioSendHandler - { - private final AudioPlayer audioPlayer; - private AudioFrame lastFrame; - - public AudioPlayerSendHandler(AudioPlayer audioPlayer) - { - this.audioPlayer = audioPlayer; - } - - @Override - public boolean canProvide() - { - lastFrame = audioPlayer.provide(); - return lastFrame != null; - } - - @Override public byte[] provide20MsAudio() - { - return lastFrame.getData(); - } - - @Override public boolean isOpus() - { - return true; - } - } - - public class SmallAudio implements AudioLoadResultHandler - { - private TextChannel channel; - private Guild guild; - private AudioPlayer player; - - private SmallAudio(TextChannel channel, Guild guild, AudioPlayer player) - { - this.channel = channel; - this.player = player; - this.guild = guild; - } - - @Override public void loadFailed(FriendlyException arg0) { } - @Override public void noMatches() { } - @Override public void playlistLoaded(AudioPlaylist arg0) { } - - @Override - public void trackLoaded(AudioTrack track) - { - connectToFirstVoiceChannel(guild.getAudioManager()); - player.startTrack(track, false); - } - - private void connectToFirstVoiceChannel(AudioManager audioManager) - { - if (!audioManager.isConnected() && !audioManager.isAttemptingToConnect()) - { - for (VoiceChannel voiceChannel : audioManager.getGuild().getVoiceChannels()) - { - audioManager.openAudioConnection(voiceChannel); - break; - } - } - } - } - - public final AudioPlayerManager playerManager; - public final AudioPlayer player; - - // Initialization and setup - public static void main(String[] args) throws InterruptedException, LoginException, Exception - { - JDA bot = new JDABuilder(AccountType.BOT).setToken(Ref.TestToken).buildBlocking(); - bot.addEventListener(new Main()); - } - - public Main() - { - this.playerManager = new DefaultAudioPlayerManager(); - this.player = playerManager.createPlayer(); - - AudioSourceManagers.registerRemoteSources(playerManager); - AudioSourceManagers.registerLocalSource(playerManager); - } - - @Override - public void onGuildMessageReceived(GuildMessageReceivedEvent event) - { - if(event.getMessage().getContentRaw().contains("!hasan")) - { - final TextChannel channel = event.getChannel(); - final Guild guild = channel.getGuild(); - - guild.getAudioManager().setSendingHandler(new AudioPlayerSendHandler(player)); - - playerManager.loadItemOrdered(player, "https://www.youtube.com/watch?v=qL-JCVA22Lo", new SmallAudio(channel, guild, player)); - } - - super.onGuildMessageReceived(event); - } -} - -/* ---------------------------------------------------------------------------------------------------------------------------------------------------------- - - // Variables and bot specific objects private static KittyCore kittyCore; private static DatabaseManager databaseManager; @@ -236,5 +132,4 @@ public class Main extends ListenerAdapter if(!Superintendent.perCommandUpkeepPost(kittyCore, databaseManager)) return; } -} - */ \ No newline at end of file +} \ No newline at end of file diff --git a/src/utils/audio/AudioController.java b/src/utils/audio/AudioController.java deleted file mode 100644 index 8c05bed..0000000 --- a/src/utils/audio/AudioController.java +++ /dev/null @@ -1,84 +0,0 @@ -package utils.audio; - -import com.sedmelluq.discord.lavaplayer.player.AudioLoadResultHandler; -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.tools.FriendlyException; -import com.sedmelluq.discord.lavaplayer.track.AudioPlaylist; -import com.sedmelluq.discord.lavaplayer.track.AudioTrack; - -import dataStructures.KittyGuild; - -public class AudioController -{ - private final AudioPlayerManager playerManager; - public String response; - - public AudioController() - { - playerManager = new DefaultAudioPlayerManager(); - AudioSourceManagers.registerRemoteSources(playerManager); - AudioSourceManagers.registerLocalSource(playerManager); - } - - public void loadAndPlay(final String trackUrl, KittyGuild guild) - { - GuildMusicManager musicManager = guild.musicManager; - response = "HERE"; - - playerManager.loadItemOrdered(musicManager, trackUrl, new AudioLoadResultHandler() - { - @Override - public void trackLoaded(AudioTrack track) - { - response = "Adding to queue " + track.getInfo().title; - System.out.println("QUEUED"); - play(musicManager, track); - } - - @Override - public void playlistLoaded(AudioPlaylist playlist) - { - AudioTrack firstTrack = playlist.getSelectedTrack(); - - if (firstTrack == null) - { - firstTrack = playlist.getTracks().get(0); - } - - response = "Adding to queue " + firstTrack.getInfo().title + " (first track of playlist " + playlist.getName() + ")"; - - play(musicManager, firstTrack); - } - - @Override - public void noMatches() - { - System.out.println("NOT QUEUED"); - response = "Nothing found by " + trackUrl; - } - - @Override - public void loadFailed(FriendlyException exception) - { - System.out.println("EXCEPTION"); - System.out.println(exception.getCause()); - } - }); - } - - private void play(GuildMusicManager musicManager, AudioTrack track) - { - - musicManager.scheduler.queue(track); - } - - private void skipTrack(KittyGuild guild) - { - GuildMusicManager musicManager = guild.musicManager; - musicManager.scheduler.nextTrack(); - - response = "Skipped to next track."; - } -} diff --git a/src/utils/audio/AudioPlayerSendHandler.java b/src/utils/audio/AudioPlayerSendHandler.java deleted file mode 100644 index db51dc0..0000000 --- a/src/utils/audio/AudioPlayerSendHandler.java +++ /dev/null @@ -1,41 +0,0 @@ -package utils.audio; - -import com.sedmelluq.discord.lavaplayer.player.AudioPlayer; -import com.sedmelluq.discord.lavaplayer.track.playback.AudioFrame; - -import net.dv8tion.jda.core.audio.AudioSendHandler; - -/** - * This is a wrapper around AudioPlayer which makes it behave as an AudioSendHandler for JDA. As JDA calls canProvide - * before every call to provide20MsAudio(), we pull the frame in canProvide() and use the frame we already pulled in - * provide20MsAudio(). - */ -public class AudioPlayerSendHandler implements AudioSendHandler -{ - private final AudioPlayer audioPlayer; - private AudioFrame lastFrame; - - public AudioPlayerSendHandler(AudioPlayer audioPlayer) - { - this.audioPlayer = audioPlayer; - } - - @Override - public boolean canProvide() - { - lastFrame = audioPlayer.provide(); - return lastFrame != null; - } - - @Override - public byte[] provide20MsAudio() - { - return lastFrame.getData(); - } - - @Override - public boolean isOpus() - { - return true; - } -} \ No newline at end of file diff --git a/src/utils/audio/AudioUtils.java b/src/utils/audio/AudioUtils.java index e570f33..a734b55 100644 --- a/src/utils/audio/AudioUtils.java +++ b/src/utils/audio/AudioUtils.java @@ -1,4 +1,17 @@ package utils.audio; +import java.util.ArrayList; +import java.util.LinkedList; +import java.util.Queue; + +import com.sedmelluq.discord.lavaplayer.player.AudioLoadResultHandler; +import com.sedmelluq.discord.lavaplayer.player.AudioPlayer; +import com.sedmelluq.discord.lavaplayer.player.AudioPlayerManager; +import com.sedmelluq.discord.lavaplayer.tools.FriendlyException; +import com.sedmelluq.discord.lavaplayer.track.AudioPlaylist; +import com.sedmelluq.discord.lavaplayer.track.AudioTrack; +import com.sedmelluq.discord.lavaplayer.track.playback.AudioFrame; + +import net.dv8tion.jda.core.audio.AudioSendHandler; import net.dv8tion.jda.core.entities.Guild; import net.dv8tion.jda.core.entities.VoiceChannel; import net.dv8tion.jda.core.managers.AudioManager; @@ -6,13 +19,19 @@ import net.dv8tion.jda.core.managers.AudioManager; public class AudioUtils { private Guild guild; - public AudioManager audio; + public AudioManager am; + public final AudioPlayer player; + public final AudioPlayerManager playerManager; + private Queue playlist = new LinkedList<>(); - public AudioUtils(Guild guild) + public AudioUtils(Guild guild, AudioPlayerManager playerManager) { + player = playerManager.createPlayer(); + this.playerManager = playerManager; this.guild = guild; - audio = guild.getAudioManager(); + am = guild.getAudioManager(); + } public boolean joinChannel(String channelName) @@ -21,7 +40,7 @@ public class AudioUtils channel = guild.getVoiceChannelsByName(channelName, true).get(0); if(channel != null) { - audio.openAudioConnection(channel); + am.openAudioConnection(channel); return true; } return false; @@ -29,11 +48,100 @@ public class AudioUtils public boolean leaveChannel() { - if(audio.isConnected()) + if(am.isConnected()) { - audio.closeAudioConnection(); + am.closeAudioConnection(); return true; } return false; } + + + public class AudioPlayerSendHandler implements AudioSendHandler + { + private final AudioPlayer audioPlayer; + private AudioFrame lastFrame; + + public AudioPlayerSendHandler(AudioPlayer audioPlayer) + { + this.audioPlayer = audioPlayer; + } + + @Override + public boolean canProvide() + { + lastFrame = audioPlayer.provide(); + return lastFrame != null; + } + + @Override public byte[] provide20MsAudio() + { + return lastFrame.getData(); + } + + @Override public boolean isOpus() + { + return true; + } + } + + public class SmallAudio implements AudioLoadResultHandler + { + private AudioPlayer player; + + private SmallAudio(AudioPlayer player) + { + this.player = player; + } + + @Override public void loadFailed(FriendlyException arg0) { } + @Override public void noMatches() { } + @Override public void playlistLoaded(AudioPlaylist arg0) { } + + @Override + public void trackLoaded(AudioTrack track) + { + synchronized(playlist) + { + playlist.add(track); + } + //if(player.getPlayingTrack() == null) + { + do + { + if(player.getPlayingTrack() == null) + { + player.startTrack(playlist.poll(), false); + } + } + while(!playlist.isEmpty()); + } + } + } + + + public String playVideo(String videoURL) + { + guild.getAudioManager().setSendingHandler(new AudioPlayerSendHandler(player)); + playerManager.loadItemOrdered(player, videoURL, new SmallAudio(player)); + + return null; + } + + public String skipVideo(AudioPlayer player) + { + return null; + } + + public String stopPlayer(AudioPlayer player) + { + playlist.clear(); + player.stopTrack(); + return "Stopped"; + } + + public String getPlaylist(AudioPlayer player) + { + return player.getPlayingTrack().getInfo().title; + } } diff --git a/src/utils/audio/GuildMusicManager.java b/src/utils/audio/GuildMusicManager.java deleted file mode 100644 index 599f513..0000000 --- a/src/utils/audio/GuildMusicManager.java +++ /dev/null @@ -1,36 +0,0 @@ -package utils.audio; - -import com.sedmelluq.discord.lavaplayer.player.AudioPlayer; -import com.sedmelluq.discord.lavaplayer.player.AudioPlayerManager; - -/** - * Holder for both the player and a track scheduler for one guild. - */ -public class GuildMusicManager { - /** - * Audio player for the guild. - */ - public final AudioPlayer player; - /** - * Track scheduler for the player. - */ - public final TrackScheduler scheduler; - - /** - * Creates a player and a track scheduler. - * @param manager Audio player manager to use for creating the player. - */ - public GuildMusicManager(AudioPlayerManager manager) - { - player = manager.createPlayer(); - scheduler = new TrackScheduler(player); - player.addListener(scheduler); - } - - /** - * @return Wrapper around AudioPlayer to use it as an AudioSendHandler. - */ - public AudioPlayerSendHandler getSendHandler() { - return new AudioPlayerSendHandler(player); - } -} \ No newline at end of file diff --git a/src/utils/audio/TrackScheduler.java b/src/utils/audio/TrackScheduler.java deleted file mode 100644 index 381510f..0000000 --- a/src/utils/audio/TrackScheduler.java +++ /dev/null @@ -1,62 +0,0 @@ -package utils.audio; - -import com.sedmelluq.discord.lavaplayer.player.AudioPlayer; -import com.sedmelluq.discord.lavaplayer.player.event.AudioEventAdapter; -import com.sedmelluq.discord.lavaplayer.track.AudioTrack; -import com.sedmelluq.discord.lavaplayer.track.AudioTrackEndReason; - -import java.util.concurrent.BlockingQueue; -import java.util.concurrent.LinkedBlockingQueue; - -/** - * This class schedules tracks for the audio player. It contains the queue of tracks. - */ -public class TrackScheduler extends AudioEventAdapter { - private final AudioPlayer player; - private final BlockingQueue queue; - - /** - * @param player The audio player this scheduler uses - */ - public TrackScheduler(AudioPlayer player) - { - this.player = player; - this.queue = new LinkedBlockingQueue<>(); - } - - /** - * Add the next track to queue or play right away if nothing is in the queue. - * - * @param track The track to play or add to queue. - */ - public void queue(AudioTrack track) - { - // Calling startTrack with the noInterrupt set to true will start the track only if nothing is currently playing. If - // something is playing, it returns false and does nothing. In that case the player was already playing so this - // track goes to the queue instead. - if (!player.startTrack(track, true)) - { - queue.offer(track); - } - } - - /** - * Start the next track, stopping the current one if it is playing. - */ - public void nextTrack() - { - // Start the next track, regardless of if something is already playing or not. In case queue was empty, we are - // giving null to startTrack, which is a valid argument and will simply stop the player. - player.startTrack(queue.poll(), false); - } - - @Override - public void onTrackEnd(AudioPlayer player, AudioTrack track, AudioTrackEndReason endReason) - { - // Only start the next track if the end reason is suitable for it (FINISHED or LOAD_FAILED) - if (endReason.mayStartNext) - { - nextTrack(); - } - } -} \ No newline at end of file From bd1bcc1bd36ce0fd2c0b5d1215543134299e1676 Mon Sep 17 00:00:00 2001 From: Alex Date: Sat, 19 Oct 2019 02:59:18 -0400 Subject: [PATCH 11/11] =Bug fix --- src/utils/audio/AudioUtils.java | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/src/utils/audio/AudioUtils.java b/src/utils/audio/AudioUtils.java index a734b55..c320651 100644 --- a/src/utils/audio/AudioUtils.java +++ b/src/utils/audio/AudioUtils.java @@ -105,17 +105,14 @@ public class AudioUtils { playlist.add(track); } - //if(player.getPlayingTrack() == null) + do { - do + if(player.getPlayingTrack() == null) { - if(player.getPlayingTrack() == null) - { - player.startTrack(playlist.poll(), false); - } + player.startTrack(playlist.poll(), false); } - while(!playlist.isEmpty()); } + while(!playlist.isEmpty()); } }