diff --git a/src/main/java/codes/ztereohype/ztereomusic/Bot.java b/src/main/java/codes/ztereohype/ztereomusic/Bot.java index 28a1b7a..c5ed82b 100644 --- a/src/main/java/codes/ztereohype/ztereomusic/Bot.java +++ b/src/main/java/codes/ztereohype/ztereomusic/Bot.java @@ -1,6 +1,6 @@ package codes.ztereohype.ztereomusic; -import codes.ztereohype.ztereomusic.audio.TrackManager; +import codes.ztereohype.ztereomusic.audio.GuildMusicPlayer; import codes.ztereohype.ztereomusic.command.Command; import codes.ztereohype.ztereomusic.command.commands.Ping; import codes.ztereohype.ztereomusic.command.commands.Play; @@ -13,11 +13,13 @@ import com.sedmelluq.discord.lavaplayer.source.AudioSourceManagers; import lombok.Getter; import net.dv8tion.jda.api.JDA; import net.dv8tion.jda.api.JDABuilder; -import net.dv8tion.jda.api.entities.VoiceChannel; import java.util.HashMap; import java.util.Map; +import static net.dv8tion.jda.api.requests.GatewayIntent.GUILD_MESSAGES; +import static net.dv8tion.jda.api.requests.GatewayIntent.GUILD_VOICE_STATES; + public class Bot { private static @Getter Config config; private static @Getter JDA bot; @@ -26,14 +28,14 @@ public class Bot { private static @Getter final Map commandAliases = new HashMap<>(); public static AudioPlayerManager playerManager; - public static Map trackScheduerMap = new HashMap<>(); + public static Map guildMusicPlayerMap = new HashMap<>(); public static void main(String[] args) throws Exception { config = new Config("./config.json5"); - bot = JDABuilder.createDefault(config.getPropreties().get("token")).build().awaitReady(); + bot = JDABuilder.createDefault(config.getPropreties().get("token"), GUILD_MESSAGES, GUILD_VOICE_STATES).build().awaitReady(); - setCommands(); setupAudio(); + setCommands(); setListeners(); } @@ -48,9 +50,7 @@ public class Bot { commandMap.put(skip.getMeta().getName(), skip); for (String commandName : commandMap.keySet()) { - System.out.println("loading aliases from: " + commandName); for (String aliasName : commandMap.get(commandName).getMeta().getAliases()) { - System.out.println("loaded " + aliasName + " from command " + commandName); commandAliases.put(aliasName, commandName); } } @@ -59,6 +59,7 @@ public class Bot { public static void setupAudio() { playerManager = new DefaultAudioPlayerManager(); AudioSourceManagers.registerRemoteSources(playerManager); + AudioSourceManagers.registerLocalSource(playerManager); } public static void setListeners() { diff --git a/src/main/java/codes/ztereohype/ztereomusic/audio/TrackManager.java b/src/main/java/codes/ztereohype/ztereomusic/audio/TrackManager.java index cf54947..2152a69 100644 --- a/src/main/java/codes/ztereohype/ztereomusic/audio/TrackManager.java +++ b/src/main/java/codes/ztereohype/ztereomusic/audio/TrackManager.java @@ -13,7 +13,7 @@ import java.util.List; public class TrackManager extends AudioEventAdapter { private final @Getter AudioPlayer player; - private final List trackQueue = new ArrayList<>(); + public final List trackQueue = new ArrayList<>(); private final MessageChannel infoChannel; public TrackManager(AudioPlayer player, MessageChannel infoChannel) { @@ -22,20 +22,10 @@ public class TrackManager extends AudioEventAdapter { } public void queue(AudioTrack track) { - // change this to add to queue and call onTrackEnd! - if (player.getPlayingTrack() == null) { - play(track); - } else { - trackQueue.add(track); - infoChannel.sendMessage("Queued " + track.getInfo().title); - } + trackQueue.add(track); } - private void play(AudioTrack track) { - player.playTrack(track); - } - - private void playNext() { + public void playNext() { // if the player was playing a track (probably means it's a skip), stop it if (player.getPlayingTrack() != null) { player.stopTrack(); @@ -48,36 +38,18 @@ public class TrackManager extends AudioEventAdapter { AudioTrack nextTrack = trackQueue.get(0); trackQueue.remove(nextTrack); - play(nextTrack); + player.playTrack(nextTrack); infoChannel.sendMessage("Playing next track: " + nextTrack.getInfo().title).queue(); } - public void pause() { - player.setPaused(true); - } - - public void resume() { - player.setPaused(false); - } - - public void skip() { - playNext(); - } + @Override + public void onPlayerPause(AudioPlayer player) {} @Override - public void onPlayerPause(AudioPlayer player) { -// infoChannel.sendMessage("Pausing...").queue(); - } + public void onPlayerResume(AudioPlayer player) {} @Override - public void onPlayerResume(AudioPlayer player) { -// infoChannel.sendMessage("Resuming...").queue(); - } - - @Override - public void onTrackStart(AudioPlayer player, AudioTrack track) { -// infoChannel.sendMessage("Starting track: " + track.getInfo().title).queue(); - } + public void onTrackStart(AudioPlayer player, AudioTrack track) {} @Override public void onTrackEnd(AudioPlayer player, AudioTrack track, AudioTrackEndReason endReason) { @@ -85,6 +57,10 @@ public class TrackManager extends AudioEventAdapter { playNext(); } + if (endReason.equals(AudioTrackEndReason.CLEANUP)) { + // todo: leave the vc? + } + // 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. 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 6f1e404..f1c194c 100644 --- a/src/main/java/codes/ztereohype/ztereomusic/command/commands/Play.java +++ b/src/main/java/codes/ztereohype/ztereomusic/command/commands/Play.java @@ -1,12 +1,11 @@ package codes.ztereohype.ztereomusic.command.commands; import codes.ztereohype.ztereomusic.Bot; -import codes.ztereohype.ztereomusic.audio.AudioPlayerSendHandler; -import codes.ztereohype.ztereomusic.audio.TrackManager; +import codes.ztereohype.ztereomusic.audio.GuildMusicPlayer; +import codes.ztereohype.ztereomusic.audio.GuildMusicPlayers; import codes.ztereohype.ztereomusic.command.Command; import codes.ztereohype.ztereomusic.command.CommandMeta; 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; @@ -63,54 +62,18 @@ public class Play implements Command { identifier = mergedArgs; } - - /* Generally you would want to create a player per every - different target you might want to separately stream audio to. - It is totally fine to create them even if they are unlikely to be used, - as they do not use any resources on their own without an active track. */ - AudioPlayer player; - TrackManager trackManager; - - boolean isInVC = manager.isConnected(); - boolean isInSameVC = isInVC && Objects.equals(manager.getConnectedChannel(), voiceChannel); - - if (isInSameVC && Bot.trackScheduerMap.containsKey(voiceChannel)) { - System.out.println("Found a trackScheduler for this VC already! reusing..."); - - trackManager = Bot.trackScheduerMap.get(voiceChannel); - player = trackManager.getPlayer(); - - player.addListener(trackManager); - - } else { - // Maybe we don't wanna clear the whole queue when he gets kicked out? - if (Bot.trackScheduerMap.containsKey(voiceChannel)) { - System.out.println("Found old trackScheduler for this channel. Cleaning it up..."); - Bot.trackScheduerMap.remove(voiceChannel); - } - - System.out.println("Creating a new trackScheduler..."); - - player = playerManager.createPlayer(); - trackManager = new TrackManager(player, messageChannel); - - player.addListener(trackManager); - manager.setSendingHandler(new AudioPlayerSendHandler(player)); - manager.openAudioConnection(voiceChannel); - - Bot.trackScheduerMap.put(voiceChannel, trackManager); - } + GuildMusicPlayer musicPlayer = GuildMusicPlayers.getGuildAudioPlayer(guild, messageChannel, manager.getConnectedChannel(), voiceChannel); playerManager.loadItem(identifier, new AudioLoadResultHandler() { @Override public void trackLoaded(AudioTrack track) { - trackManager.queue(track); + musicPlayer.queue(track); } @Override public void playlistLoaded(AudioPlaylist playlist) { for (AudioTrack track : playlist.getTracks()) { - trackManager.queue(track); + musicPlayer.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 dd1101a..b250960 100644 --- a/src/main/java/codes/ztereohype/ztereomusic/command/commands/Skip.java +++ b/src/main/java/codes/ztereohype/ztereomusic/command/commands/Skip.java @@ -1,11 +1,12 @@ package codes.ztereohype.ztereomusic.command.commands; -import codes.ztereohype.ztereomusic.Bot; -import codes.ztereohype.ztereomusic.audio.TrackManager; +import codes.ztereohype.ztereomusic.audio.GuildMusicPlayer; +import codes.ztereohype.ztereomusic.audio.GuildMusicPlayers; 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; @@ -28,6 +29,12 @@ public class Skip implements Command { 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; @@ -35,25 +42,28 @@ public class Skip implements Command { Guild guild = messageEvent.getGuild(); VoiceChannel voiceChannel = author.getVoiceState().getChannel(); + MessageChannel messageChannel = messageEvent.getChannel(); AudioManager manager = guild.getAudioManager(); - boolean isInVC = manager.isConnected(); - boolean isInSameVC = isInVC && Objects.equals(manager.getConnectedChannel(), voiceChannel); - - if (isInSameVC && Bot.trackScheduerMap.containsKey(voiceChannel)) { - TrackManager trackManager = Bot.trackScheduerMap.get(voiceChannel); - - if (trackManager.getPlayer().getPlayingTrack() == null) { - messageEvent.getMessage().reply("No track is playing.").queue(); - return; - } - - trackManager.skip(); - - } else { - messageEvent.getMessage().reply("No track is playing...").queue(); + 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; + } + GuildMusicPlayer musicPlayer = GuildMusicPlayers.getGuildAudioPlayer(guild, messageChannel, manager.getConnectedChannel(), voiceChannel); + + // Check if we are playing anything + if (musicPlayer.getPlayer().getPlayingTrack() == null) { + messageChannel.sendMessage("I am not even playing anything!").queue(); + return; + } + + musicPlayer.skip(); + } }