diff --git a/src/main/java/codes/ztereohype/ztereomusic/ZtereoMUSIC.java b/src/main/java/codes/ztereohype/ztereomusic/ZtereoMUSIC.java index 3b4d3c4..54068ae 100644 --- a/src/main/java/codes/ztereohype/ztereomusic/ZtereoMUSIC.java +++ b/src/main/java/codes/ztereohype/ztereomusic/ZtereoMUSIC.java @@ -1,7 +1,8 @@ package codes.ztereohype.ztereomusic; -import codes.ztereohype.ztereomusic.audio.GuildMusicPlayer; +import codes.ztereohype.ztereomusic.audio.TrackManager; import codes.ztereohype.ztereomusic.command.Command; +import codes.ztereohype.ztereomusic.command.commands.Pause; import codes.ztereohype.ztereomusic.command.commands.Ping; import codes.ztereohype.ztereomusic.command.commands.Play; import codes.ztereohype.ztereomusic.command.commands.Skip; @@ -38,10 +39,9 @@ public class ZtereoMUSIC { private JDA jda; private AudioPlayerManager playerManager; - private Map guildMusicPlayerMap = new HashMap<>(); + private Map guildTrackManagerMap = new HashMap<>(); - private ZtereoMUSIC() { - } + private ZtereoMUSIC() {} public static ZtereoMUSIC getInstance() { return ZtereoMUSIC.INSTANCE; @@ -71,6 +71,9 @@ public class ZtereoMUSIC { Skip skip = new Skip(); this.getCommandMap().put(skip.getMeta().getName(), skip); + Pause pause = new Pause(); + this.getCommandMap().put(pause.getMeta().getName(), pause); + for (String commandName : this.getCommandAliases().keySet()) { for (String aliasName : this.getCommandMap().get(commandName).getMeta().getAliases()) { this.getCommandAliases().put(aliasName, commandName); diff --git a/src/main/java/codes/ztereohype/ztereomusic/audio/GuildMusicPlayer.java b/src/main/java/codes/ztereohype/ztereomusic/audio/GuildMusicPlayer.java deleted file mode 100644 index cec542c..0000000 --- a/src/main/java/codes/ztereohype/ztereomusic/audio/GuildMusicPlayer.java +++ /dev/null @@ -1,57 +0,0 @@ -package codes.ztereohype.ztereomusic.audio; - -import com.sedmelluq.discord.lavaplayer.player.AudioPlayer; -import com.sedmelluq.discord.lavaplayer.player.AudioPlayerManager; -import com.sedmelluq.discord.lavaplayer.track.AudioTrack; -import lombok.Getter; -import net.dv8tion.jda.api.entities.MessageChannel; - -public class GuildMusicPlayer { - private final @Getter AudioPlayer player; - private final TrackManager trackManager; - private final MessageChannel infoChannel; - - public GuildMusicPlayer(AudioPlayerManager playerManager, MessageChannel infoChannel) { - player = playerManager.createPlayer(); - trackManager = new TrackManager(player, infoChannel); - player.addListener(trackManager); - this.infoChannel = infoChannel; - } - - public AudioPlayerSendHandler getAudioSendHandler() { - return new AudioPlayerSendHandler(this.player); - } - - public void queue(AudioTrack track) { - // change this to add to queue and call onTrackEnd! - if (player.getPlayingTrack() == null) { - player.playTrack(track); - } else { - trackManager.queue(track); - infoChannel.sendMessage("Queued " + track.getInfo().title).queue(); - } - } - - public void clearQueue() { - trackManager.trackQueue.clear(); - } - - public void pause() { - infoChannel.sendMessage("Pausing...").queue(); - player.setPaused(true); - } - - public void resume() { - infoChannel.sendMessage("Resuming...").queue(); - player.setPaused(false); - } - - public void skip() { - infoChannel.sendMessage("Skipping...").queue(); - trackManager.playNext(); - } - - public void stop() { - player.stopTrack(); - } -} diff --git a/src/main/java/codes/ztereohype/ztereomusic/audio/GuildMusicPlayers.java b/src/main/java/codes/ztereohype/ztereomusic/audio/GuildMusicPlayers.java deleted file mode 100644 index f2906de..0000000 --- a/src/main/java/codes/ztereohype/ztereomusic/audio/GuildMusicPlayers.java +++ /dev/null @@ -1,46 +0,0 @@ -package codes.ztereohype.ztereomusic.audio; - -import codes.ztereohype.ztereomusic.ZtereoMUSIC; -import net.dv8tion.jda.api.entities.Guild; -import net.dv8tion.jda.api.entities.MessageChannel; -import net.dv8tion.jda.api.entities.VoiceChannel; - -import java.util.Objects; - -public class GuildMusicPlayers { - public static GuildMusicPlayer getGuildAudioPlayer(Guild guild, MessageChannel infoChannel, VoiceChannel connectedChannel, VoiceChannel requestedChannel) { - long guildId = guild.getIdLong(); - boolean isInSameVC = Objects.equals(connectedChannel, requestedChannel); - - // If I get called in a different vc I delete the old manager - if (!isInSameVC) { - ZtereoMUSIC.getInstance().getGuildMusicPlayerMap().remove(guildId); - } - - GuildMusicPlayer musicPlayer = ZtereoMUSIC.getInstance().getGuildMusicPlayerMap().get(guildId); - - if (musicPlayer == null) { - musicPlayer = new GuildMusicPlayer(ZtereoMUSIC.getInstance().getPlayerManager(), infoChannel); - ZtereoMUSIC.getInstance().getGuildMusicPlayerMap().put(guildId, musicPlayer); - guild.getAudioManager().openAudioConnection(requestedChannel); - } - - guild.getAudioManager().setSendingHandler(musicPlayer.getAudioSendHandler()); - - return musicPlayer; - } - - // stops player, disconnects from vc, and deletes the wrapper - public static void removeGuildAudioPlayer(Guild guild) { - long guildId = guild.getIdLong(); - GuildMusicPlayer musicPlayer = ZtereoMUSIC.getInstance().getGuildMusicPlayerMap().get(guildId); - - if (musicPlayer == null) return; - - musicPlayer.stop(); - guild.getAudioManager().closeAudioConnection(); - - //todo: remove this when will be part of disconnection listener - ZtereoMUSIC.getInstance().getGuildMusicPlayerMap().remove(guildId); - } -} diff --git a/src/main/java/codes/ztereohype/ztereomusic/audio/TrackManager.java b/src/main/java/codes/ztereohype/ztereomusic/audio/TrackManager.java index 2152a69..19c7d91 100644 --- a/src/main/java/codes/ztereohype/ztereomusic/audio/TrackManager.java +++ b/src/main/java/codes/ztereohype/ztereomusic/audio/TrackManager.java @@ -1,11 +1,13 @@ package codes.ztereohype.ztereomusic.audio; import com.sedmelluq.discord.lavaplayer.player.AudioPlayer; +import com.sedmelluq.discord.lavaplayer.player.AudioPlayerManager; import com.sedmelluq.discord.lavaplayer.player.event.AudioEventAdapter; import com.sedmelluq.discord.lavaplayer.tools.FriendlyException; import com.sedmelluq.discord.lavaplayer.track.AudioTrack; import com.sedmelluq.discord.lavaplayer.track.AudioTrackEndReason; import lombok.Getter; +import net.dv8tion.jda.api.entities.Guild; import net.dv8tion.jda.api.entities.MessageChannel; import java.util.ArrayList; @@ -15,17 +17,54 @@ public class TrackManager extends AudioEventAdapter { private final @Getter AudioPlayer player; public final List trackQueue = new ArrayList<>(); private final MessageChannel infoChannel; + private final Guild guild; - public TrackManager(AudioPlayer player, MessageChannel infoChannel) { - this.player = player; + public TrackManager(AudioPlayerManager playerManager, MessageChannel infoChannel, Guild guild) { + this.player = playerManager.createPlayer(); this.infoChannel = infoChannel; + this.guild = guild; + + player.addListener(this); + } + + public AudioPlayerSendHandler getAudioSendHandler() { + return new AudioPlayerSendHandler(this.player); } public void queue(AudioTrack track) { - trackQueue.add(track); + // change this to add to queue and call onTrackEnd! + if (player.getPlayingTrack() == null) { + player.playTrack(track); + } else { + trackQueue.add(track); + infoChannel.sendMessage("Queued " + track.getInfo().title).queue(); + } } - public void playNext() { + public void clearQueue() { + trackQueue.clear(); + } + + public void pause() { + infoChannel.sendMessage("Pausing...").queue(); + player.setPaused(true); + } + + public void resume() { + infoChannel.sendMessage("Resuming...").queue(); + player.setPaused(false); + } + + public void skip() { + infoChannel.sendMessage("Skipping...").queue(); + playNext(); + } + + public void stop() { + player.stopTrack(); + } + + private void playNext() { // if the player was playing a track (probably means it's a skip), stop it if (player.getPlayingTrack() != null) { player.stopTrack(); @@ -58,15 +97,14 @@ public class TrackManager extends AudioEventAdapter { } if (endReason.equals(AudioTrackEndReason.CLEANUP)) { - // todo: leave the vc? + TrackManagers.removeGuildTrackManager(guild); } // endReason == FINISHED: A track finished or died by an exception (mayStartNext = true). // endReason == LOAD_FAILED: Loading of a track failed (mayStartNext = true). // endReason == STOPPED: The player was stopped. // endReason == REPLACED: Another track started playing while this had not finished - // endReason == CLEANUP: Player hasn't been queried for a while, if you want you can put a - // clone of this back to your queue + // endReason == CLEANUP: Player hasn't been queried for a while, if you want you can put a clone of this back to your queue } @Override diff --git a/src/main/java/codes/ztereohype/ztereomusic/audio/TrackManagers.java b/src/main/java/codes/ztereohype/ztereomusic/audio/TrackManagers.java new file mode 100644 index 0000000..63f84c6 --- /dev/null +++ b/src/main/java/codes/ztereohype/ztereomusic/audio/TrackManagers.java @@ -0,0 +1,61 @@ +package codes.ztereohype.ztereomusic.audio; + +import codes.ztereohype.ztereomusic.ZtereoMUSIC; +import com.sedmelluq.discord.lavaplayer.player.AudioPlayer; +import net.dv8tion.jda.api.entities.Guild; +import net.dv8tion.jda.api.entities.MessageChannel; +import net.dv8tion.jda.api.entities.VoiceChannel; + +import java.util.Objects; + +public class TrackManagers { + public static TrackManager getGuildTrackManager(Guild guild) { + long guildId = guild.getIdLong(); + + TrackManager trackManager = ZtereoMUSIC.getInstance().getGuildTrackManagerMap().get(guildId); + + if (trackManager == null) { + return null; + } + + guild.getAudioManager().setSendingHandler(trackManager.getAudioSendHandler()); + + return trackManager; + } + + public static TrackManager getGuildTrackManager(Guild guild, MessageChannel infoChannel, VoiceChannel connectedChannel, VoiceChannel requestedChannel) { + long guildId = guild.getIdLong(); + boolean isInSameVC = Objects.equals(connectedChannel, requestedChannel); + + // If I get called in a different vc I delete the old manager + if (!isInSameVC) { + ZtereoMUSIC.getInstance().getGuildTrackManagerMap().remove(guildId); + } + + TrackManager trackManager = ZtereoMUSIC.getInstance().getGuildTrackManagerMap().get(guildId); + + if (trackManager == null) { + trackManager = new TrackManager(ZtereoMUSIC.getInstance().getPlayerManager(), infoChannel, guild); + ZtereoMUSIC.getInstance().getGuildTrackManagerMap().put(guildId, trackManager); + guild.getAudioManager().openAudioConnection(requestedChannel); + } + + guild.getAudioManager().setSendingHandler(trackManager.getAudioSendHandler()); + + return trackManager; + } + + // stops player, disconnects from vc, and deletes the wrapper + public static void removeGuildTrackManager(Guild guild) { + long guildId = guild.getIdLong(); + TrackManager trackManager = ZtereoMUSIC.getInstance().getGuildTrackManagerMap().get(guildId); + + if (trackManager == null) return; + + trackManager.stop(); + guild.getAudioManager().closeAudioConnection(); + + //todo: remove this when will be part of disconnection listener y fa fere ts tts sad + ZtereoMUSIC.getInstance().getGuildTrackManagerMap().remove(guildId); + } +} diff --git a/src/main/java/codes/ztereohype/ztereomusic/command/commands/Pause.java b/src/main/java/codes/ztereohype/ztereomusic/command/commands/Pause.java new file mode 100644 index 0000000..da71d6d --- /dev/null +++ b/src/main/java/codes/ztereohype/ztereomusic/command/commands/Pause.java @@ -0,0 +1,74 @@ +package codes.ztereohype.ztereomusic.command.commands; + +import codes.ztereohype.ztereomusic.audio.TrackManager; +import codes.ztereohype.ztereomusic.audio.TrackManagers; +import codes.ztereohype.ztereomusic.command.Command; +import codes.ztereohype.ztereomusic.command.CommandMeta; +import net.dv8tion.jda.api.entities.Guild; +import net.dv8tion.jda.api.entities.Member; +import net.dv8tion.jda.api.entities.MessageChannel; +import net.dv8tion.jda.api.entities.VoiceChannel; +import net.dv8tion.jda.api.events.message.MessageReceivedEvent; +import net.dv8tion.jda.api.managers.AudioManager; + +import java.util.Objects; + +public class Pause implements Command { + CommandMeta meta = new CommandMeta("pause", "Pause the playing music", new String[]{"resume"}, false, false); + + @Override + public CommandMeta getMeta() { + return this.meta; + } + + @Override + public void execute(MessageReceivedEvent messageEvent, String[] args) { + Member author = Objects.requireNonNull(messageEvent.getMember()); + + if (author.getVoiceState() == null) { + messageEvent.getChannel().sendMessage("I was unable to access your information... strange...").queue(); + return; + } + + // todo: make this part of a perms system (only people in same vc or vc at all have perms on music control) + /* Note to self: Things to check before executing command + - if he's in vc + - if we are in vc + - if we are in the same vc + */ + if (!author.getVoiceState().inVoiceChannel()) { + messageEvent.getMessage().reply("You are not in a voice channel!").queue(); + return; + } + + Guild guild = messageEvent.getGuild(); + VoiceChannel voiceChannel = author.getVoiceState().getChannel(); + MessageChannel messageChannel = messageEvent.getChannel(); + AudioManager manager = guild.getAudioManager(); + + if (manager.getConnectedChannel() == null) { + messageChannel.sendMessage("I am not even playing anything!").queue(); + return; + } + + // Check if we are in the same vc + if (!Objects.equals(author.getVoiceState().getChannel(), manager.getConnectedChannel())) { + messageChannel.sendMessage("We aren't in the same channel").queue(); + return; + } + + TrackManager trackManager = TrackManagers.getGuildTrackManager(guild, messageChannel, manager.getConnectedChannel(), voiceChannel); + + // Check if we are playing anything + if (trackManager.getPlayer().getPlayingTrack() == null) { + messageChannel.sendMessage("I am not even playing anything!").queue(); + return; + } + + if (trackManager.getPlayer().isPaused()) { + trackManager.resume(); + } else { + trackManager.pause(); + } + } +} diff --git a/src/main/java/codes/ztereohype/ztereomusic/command/commands/Play.java b/src/main/java/codes/ztereohype/ztereomusic/command/commands/Play.java index 3bbf0eb..327b00f 100644 --- a/src/main/java/codes/ztereohype/ztereomusic/command/commands/Play.java +++ b/src/main/java/codes/ztereohype/ztereomusic/command/commands/Play.java @@ -1,8 +1,8 @@ package codes.ztereohype.ztereomusic.command.commands; import codes.ztereohype.ztereomusic.ZtereoMUSIC; -import codes.ztereohype.ztereomusic.audio.GuildMusicPlayer; -import codes.ztereohype.ztereomusic.audio.GuildMusicPlayers; +import codes.ztereohype.ztereomusic.audio.TrackManager; +import codes.ztereohype.ztereomusic.audio.TrackManagers; import codes.ztereohype.ztereomusic.command.Command; import codes.ztereohype.ztereomusic.command.CommandMeta; import com.sedmelluq.discord.lavaplayer.player.AudioLoadResultHandler; @@ -19,7 +19,7 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; public class Play implements Command { - CommandMeta meta = new CommandMeta("play", "Play music!", new String[]{}, false, false); + CommandMeta meta = new CommandMeta("play", "Play music!", new String[]{"p"}, false, false); @Override public CommandMeta getMeta() { @@ -62,18 +62,18 @@ public class Play implements Command { identifier = mergedArgs; } - GuildMusicPlayer musicPlayer = GuildMusicPlayers.getGuildAudioPlayer(guild, messageChannel, manager.getConnectedChannel(), voiceChannel); + TrackManager trackManager = TrackManagers.getGuildTrackManager(guild, messageChannel, manager.getConnectedChannel(), voiceChannel); playerManager.loadItem(identifier, new AudioLoadResultHandler() { @Override public void trackLoaded(AudioTrack track) { - musicPlayer.queue(track); + trackManager.queue(track); } @Override public void playlistLoaded(AudioPlaylist playlist) { for (AudioTrack track : playlist.getTracks()) { - musicPlayer.queue(track); + trackManager.queue(track); } } diff --git a/src/main/java/codes/ztereohype/ztereomusic/command/commands/Skip.java b/src/main/java/codes/ztereohype/ztereomusic/command/commands/Skip.java index b250960..4a37630 100644 --- a/src/main/java/codes/ztereohype/ztereomusic/command/commands/Skip.java +++ b/src/main/java/codes/ztereohype/ztereomusic/command/commands/Skip.java @@ -1,7 +1,7 @@ package codes.ztereohype.ztereomusic.command.commands; -import codes.ztereohype.ztereomusic.audio.GuildMusicPlayer; -import codes.ztereohype.ztereomusic.audio.GuildMusicPlayers; +import codes.ztereohype.ztereomusic.audio.TrackManager; +import codes.ztereohype.ztereomusic.audio.TrackManagers; import codes.ztereohype.ztereomusic.command.Command; import codes.ztereohype.ztereomusic.command.CommandMeta; import net.dv8tion.jda.api.entities.Guild; @@ -31,9 +31,10 @@ public class Skip implements Command { // todo: make this part of a perms system (only people in same vc or vc at all have perms on music control) /* Note to self: Things to check before executing command - - if he's in vc - if we are in vc - if we are in the same vc + - if we are playing something + - if mr user has the goshdarn role */ if (!author.getVoiceState().inVoiceChannel()) { messageEvent.getMessage().reply("You are not in a voice channel!").queue(); @@ -56,14 +57,14 @@ public class Skip implements Command { return; } - GuildMusicPlayer musicPlayer = GuildMusicPlayers.getGuildAudioPlayer(guild, messageChannel, manager.getConnectedChannel(), voiceChannel); + TrackManager trackManager = TrackManagers.getGuildTrackManager(guild, messageChannel, manager.getConnectedChannel(), voiceChannel); // Check if we are playing anything - if (musicPlayer.getPlayer().getPlayingTrack() == null) { + if (trackManager.getPlayer().getPlayingTrack() == null) { messageChannel.sendMessage("I am not even playing anything!").queue(); return; } - musicPlayer.skip(); + trackManager.skip(); } }