From 1e809c61089ef3351163f04c78082ae1543a1263 Mon Sep 17 00:00:00 2001 From: Benjamin Sherriff Date: Sun, 29 Jan 2023 11:50:40 -0500 Subject: [PATCH] v0.1.7 - Settings handling tweaks --- docker-compose.yml | 2 +- pom.xml | 2 +- .../bensherriff/siren/audio/AudioHandler.java | 3 +- .../EmptyVoiceChannelException.java | 12 +++ .../bensherriff/siren/listener/Listener.java | 35 +++++--- .../siren/listener/SlashListener.java | 83 +++++++++++-------- .../siren/listener/TextListener.java | 81 ++++++++++-------- .../siren/settings/GuildSettings.java | 25 ++++++ .../bensherriff/siren/settings/Settings.java | 23 ++--- 9 files changed, 166 insertions(+), 100 deletions(-) create mode 100644 src/main/java/com/bensherriff/siren/exceptions/EmptyVoiceChannelException.java create mode 100644 src/main/java/com/bensherriff/siren/settings/GuildSettings.java diff --git a/docker-compose.yml b/docker-compose.yml index f9b0008..e4487d6 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -9,7 +9,7 @@ services: dockerfile: ./Dockerfile args: - JAVA_VERSION=17 - - VERSION=0.1.6 + - VERSION=0.1.7 volumes: - ./data:/app restart: unless-stopped diff --git a/pom.xml b/pom.xml index f3269de..3335401 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 com.bensherriff siren - 0.1.6 + 0.1.7 jar diff --git a/src/main/java/com/bensherriff/siren/audio/AudioHandler.java b/src/main/java/com/bensherriff/siren/audio/AudioHandler.java index ceb5c58..adc6c2c 100644 --- a/src/main/java/com/bensherriff/siren/audio/AudioHandler.java +++ b/src/main/java/com/bensherriff/siren/audio/AudioHandler.java @@ -10,6 +10,7 @@ import net.dv8tion.jda.api.audio.AudioSendHandler; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import java.io.IOException; import java.nio.Buffer; import java.nio.ByteBuffer; import java.util.concurrent.BlockingQueue; @@ -27,7 +28,7 @@ public class AudioHandler extends AudioEventAdapter implements AudioSendHandler public AudioHandler(PlayerManager manager, long guildID) { this.manager = manager; player = manager.createPlayer(); - player.setVolume(manager.getListener().getSettings().getVolume()); + player.setVolume(manager.getListener().getSettings().getGuildSettings().get(guildID).getVolume()); player.addListener(this); this.queue = new LinkedBlockingQueue<>(); this.buffer = ByteBuffer.allocate(1024); diff --git a/src/main/java/com/bensherriff/siren/exceptions/EmptyVoiceChannelException.java b/src/main/java/com/bensherriff/siren/exceptions/EmptyVoiceChannelException.java new file mode 100644 index 0000000..076efa1 --- /dev/null +++ b/src/main/java/com/bensherriff/siren/exceptions/EmptyVoiceChannelException.java @@ -0,0 +1,12 @@ +package com.bensherriff.siren.exceptions; + +public class EmptyVoiceChannelException extends Exception { + + public EmptyVoiceChannelException(String errorMessage) { + super(errorMessage); + } + + public EmptyVoiceChannelException(Throwable cause) { + super(cause); + } +} diff --git a/src/main/java/com/bensherriff/siren/listener/Listener.java b/src/main/java/com/bensherriff/siren/listener/Listener.java index 04e4921..f9a8dbe 100644 --- a/src/main/java/com/bensherriff/siren/listener/Listener.java +++ b/src/main/java/com/bensherriff/siren/listener/Listener.java @@ -3,8 +3,10 @@ package com.bensherriff.siren.listener; import com.bensherriff.siren.audio.AudioHandler; import com.bensherriff.siren.audio.PlayerManager; import com.bensherriff.siren.commands.Command; -import com.bensherriff.siren.commands.PlayCommand; +import com.bensherriff.siren.exceptions.EmptyVoiceChannelException; +import com.bensherriff.siren.settings.GuildSettings; import com.bensherriff.siren.settings.Settings; +import com.bensherriff.siren.settings.SettingsManager; import com.sedmelluq.discord.lavaplayer.track.AudioTrack; import net.dv8tion.jda.api.JDA; import net.dv8tion.jda.api.entities.Guild; @@ -57,12 +59,16 @@ public abstract class Listener extends ListenerAdapter { } } - public synchronized AudioHandler getGuildAudioPlayer(Guild guild) { + public synchronized AudioHandler getGuildAudioPlayer(Guild guild) throws IOException { long guildId = Long.parseLong(guild.getId()); AudioHandler audioHandler = musicManagers.get(guildId); if (audioHandler == null) { LOGGER.info("Creating Audio Handler for guild {}", guildId); + if (!settings.getGuildSettings().containsKey(guildId)) { + settings.getGuildSettings().put(guildId, new GuildSettings()); + SettingsManager.write(settings); + } audioHandler = new AudioHandler(playerManager, guildId); musicManagers.put(guildId, audioHandler); } @@ -79,44 +85,49 @@ public abstract class Listener extends ListenerAdapter { super.onReady(event); } - protected void playTrack(Guild guild, String userID, AudioHandler audioHandler, AudioTrack track) { + protected void playTrack(Guild guild, String userID, AudioHandler audioHandler, AudioTrack track) throws EmptyVoiceChannelException { connectToVoiceChannel(userID, guild.getAudioManager()); audioHandler.addTrack(track); } - protected void stopTrack(Guild guild) { + protected void stopTrack(Guild guild) throws IOException { AudioHandler audioHandler = getGuildAudioPlayer(guild); audioHandler.stopTrack(); guild.getAudioManager().closeAudioConnection(); } - protected void skipTrack(Guild guild) { + protected void skipTrack(Guild guild) throws IOException { AudioHandler audioHandler = getGuildAudioPlayer(guild); audioHandler.stopTrack(); } - protected void pauseTrack(Guild guild) { + protected void pauseTrack(Guild guild) throws IOException { AudioHandler audioHandler = getGuildAudioPlayer(guild); audioHandler.setPaused(true); } - protected void resumeTrack(Guild guild) { + protected void resumeTrack(Guild guild) throws IOException { AudioHandler audioHandler = getGuildAudioPlayer(guild); audioHandler.setPaused(false); } protected void changeVolume(Guild guild, int volume) throws IOException { AudioHandler audioHandler = getGuildAudioPlayer(guild); - getSettings().setVolume(volume); + settings.getGuildSettings().get(guild.getIdLong()).setVolume(volume); + SettingsManager.write(getSettings()); audioHandler.setVolume(volume); } - private void connectToVoiceChannel(String userID, AudioManager audioManager) { + private void connectToVoiceChannel(String userID, AudioManager audioManager) throws EmptyVoiceChannelException { if (!audioManager.isConnected()) { Member member = audioManager.getGuild().getMemberById(userID); - if (member != null && member.getVoiceState() != null && member.getVoiceState().inAudioChannel()) { - VoiceChannel voiceChannel = Objects.requireNonNull(member.getVoiceState().getChannel()).asVoiceChannel(); - audioManager.openAudioConnection(voiceChannel); + if (member != null) { + if (member.getVoiceState() != null && member.getVoiceState().inAudioChannel()) { + VoiceChannel voiceChannel = Objects.requireNonNull(member.getVoiceState().getChannel()).asVoiceChannel(); + audioManager.openAudioConnection(voiceChannel); + } else { + throw new EmptyVoiceChannelException("Member {} is not connected to a voice channel"); + } } } } diff --git a/src/main/java/com/bensherriff/siren/listener/SlashListener.java b/src/main/java/com/bensherriff/siren/listener/SlashListener.java index a71ecb4..c5ccfb9 100644 --- a/src/main/java/com/bensherriff/siren/listener/SlashListener.java +++ b/src/main/java/com/bensherriff/siren/listener/SlashListener.java @@ -1,6 +1,7 @@ package com.bensherriff.siren.listener; import com.bensherriff.siren.audio.AudioHandler; +import com.bensherriff.siren.exceptions.EmptyVoiceChannelException; import com.bensherriff.siren.settings.Settings; import com.sedmelluq.discord.lavaplayer.player.AudioLoadResultHandler; import com.sedmelluq.discord.lavaplayer.tools.FriendlyException; @@ -47,50 +48,58 @@ public class SlashListener extends Listener { String command = event.getName(); event.deferReply().queue(); - switch (command) { - case "play" -> { - String trackURL = Objects.requireNonNull(event.getOption("url")).getAsString(); - loadAndPlay(guild, userId, trackURL, event); - } - case "skip" -> { - skipTrack(guild); - event.getHook().sendMessage("Skipped to the next track").queue(); - } - case "stop" -> { - stopTrack(guild); - event.getHook().sendMessage("Stopped track and cleared queue").queue(); - } - case "volume" -> { - int volume = Objects.requireNonNull(event.getOption("volume")).getAsInt(); - try { - changeVolume(guild, volume); - } catch (IOException ex) { - event.getHook().sendMessage("Unable to set the volume").queue(); - LOGGER.error(ex.getMessage()); + try { + switch (command) { + case "play" -> { + String trackURL = Objects.requireNonNull(event.getOption("url")).getAsString(); + loadAndPlay(guild, userId, trackURL, event); } - event.getHook().sendMessage("Set volume to " + volume).queue(); + case "skip" -> { + skipTrack(guild); + event.getHook().sendMessage("Skipped to the next track").queue(); + } + case "stop" -> { + stopTrack(guild); + event.getHook().sendMessage("Stopped track and cleared queue").queue(); + } + case "volume" -> { + int volume = Objects.requireNonNull(event.getOption("volume")).getAsInt(); + try { + changeVolume(guild, volume); + } catch (IOException ex) { + event.getHook().sendMessage("Unable to set the volume").queue(); + LOGGER.error(ex.getMessage()); + } + event.getHook().sendMessage("Set volume to " + volume).queue(); + } + case "pause" -> { + pauseTrack(guild); + event.getHook().sendMessage("Pausing track").queue(); + } + case "resume" -> { + resumeTrack(guild); + event.getHook().sendMessage("Resumed track").queue(); + } + default -> event.getHook().sendMessage("Invalid command").queue(); } - case "pause" -> { - pauseTrack(guild); - event.getHook().sendMessage("Pausing track").queue(); - } - case "resume" -> { - resumeTrack(guild); - event.getHook().sendMessage("Resumed track").queue(); - } - default -> event.getHook().sendMessage("Invalid command").queue(); + } catch (IOException ex) { + LOGGER.error(ex.getMessage()); } super.onSlashCommandInteraction(event); } - private void loadAndPlay(Guild guild, final String userID, final String trackUrl, SlashCommandInteractionEvent event) { + private void loadAndPlay(Guild guild, final String userID, final String trackUrl, SlashCommandInteractionEvent event) throws IOException { AudioHandler audioHandler = getGuildAudioPlayer(guild); playerManager.loadItemOrdered(audioHandler, trackUrl, new AudioLoadResultHandler() { @Override public void trackLoaded(AudioTrack track) { - event.getHook().sendMessage("Adding **" + track.getInfo().title + "** to queue").queue(); - playTrack(guild, userID, audioHandler, track); + try { + playTrack(guild, userID, audioHandler, track); + event.getHook().sendMessage("Adding **" + track.getInfo().title + "** to queue").queue(); + } catch (EmptyVoiceChannelException e) { + event.getHook().sendMessage("You must connect to a voice channel first!").queue(); + } } @Override @@ -101,8 +110,12 @@ public class SlashListener extends Listener { firstTrack = playlist.getTracks().get(0); } - event.getHook().sendMessage("Adding **" + firstTrack.getInfo().title + "** to queue (first track of playlist " + playlist.getName() + ")").queue(); - playTrack(guild, userID, audioHandler, firstTrack); + try { + playTrack(guild, userID, audioHandler, firstTrack); + event.getHook().sendMessage("Adding **" + firstTrack.getInfo().title + "** to queue (first track of playlist " + playlist.getName() + ")").queue(); + } catch (EmptyVoiceChannelException e) { + event.getHook().sendMessage("You must connect to a voice channel first!").queue(); + } } @Override diff --git a/src/main/java/com/bensherriff/siren/listener/TextListener.java b/src/main/java/com/bensherriff/siren/listener/TextListener.java index 8f08860..c1c21ac 100644 --- a/src/main/java/com/bensherriff/siren/listener/TextListener.java +++ b/src/main/java/com/bensherriff/siren/listener/TextListener.java @@ -2,6 +2,7 @@ package com.bensherriff.siren.listener; import com.bensherriff.siren.audio.AudioHandler; import com.bensherriff.siren.commands.CommandEvent; +import com.bensherriff.siren.exceptions.EmptyVoiceChannelException; import com.bensherriff.siren.settings.Settings; import com.sedmelluq.discord.lavaplayer.player.AudioLoadResultHandler; import com.sedmelluq.discord.lavaplayer.tools.FriendlyException; @@ -29,51 +30,59 @@ public class TextListener extends Listener { TextChannel channel = event.getChannel().asTextChannel(); String userID = event.getAuthor().getId(); Guild guild = channel.getGuild(); - AudioHandler audioHandler = getGuildAudioPlayer(guild); +// AudioHandler audioHandler = getGuildAudioPlayer(guild); - CommandEvent commandEvent = new CommandEvent.CommandBuilder(command[0], userID) - .setTextChannel(channel) - .setGuild(guild) - .setAudioHandler(audioHandler) - .setArgs(Arrays.asList(command).subList(1, command.length)) - .build(); +// CommandEvent commandEvent = new CommandEvent.CommandBuilder(command[0], userID) +// .setTextChannel(channel) +// .setGuild(guild) +// .setAudioHandler(audioHandler) +// .setArgs(Arrays.asList(command).subList(1, command.length)) +// .build(); - if ("!play".equals(command[0]) && command.length == 2) { - loadAndPlay(channel, userID, command[1]); - } else if ("!skip".equals(command[0])) { - skipTrack(guild); - channel.sendMessage("Skipped to the next track").queue(); - } else if ("!stop".equals(command[0])) { - stopTrack(guild); - channel.sendMessage("Stopped track and cleared queue").queue(); - } else if ("!volume".equals(command[0]) && command.length == 2) { - int volume = Integer.parseInt(command[1]); - try { - changeVolume(guild, volume); - } catch (IOException ex) { - channel.sendMessage("Unable to update the settings file.").queue(); - LOGGER.error(ex.getMessage()); + try { + if ("!play".equals(command[0]) && command.length == 2) { + loadAndPlay(channel, userID, command[1]); + } else if ("!skip".equals(command[0])) { + skipTrack(guild); + channel.sendMessage("Skipped to the next track").queue(); + } else if ("!stop".equals(command[0])) { + stopTrack(guild); + channel.sendMessage("Stopped track and cleared queue").queue(); + } else if ("!volume".equals(command[0]) && command.length == 2) { + int volume = Integer.parseInt(command[1]); + try { + changeVolume(guild, volume); + } catch (IOException ex) { + channel.sendMessage("Unable to update the settings file.").queue(); + LOGGER.error(ex.getMessage()); + } + channel.sendMessage("Set volume to " + command[1]).queue(); + } else if ("!pause".equals(command[0])) { + pauseTrack(guild); + channel.sendMessage("Paused track").queue(); + } else if ("!resume".equals(command[0])) { + resumeTrack(guild); + channel.sendMessage("Resumed track").queue(); } - channel.sendMessage("Set volume to " + command[1]).queue(); - } else if ("!pause".equals(command[0])) { - pauseTrack(guild); - channel.sendMessage("Paused track").queue(); - } else if ("!resume".equals(command[0])) { - resumeTrack(guild); - channel.sendMessage("Resumed track").queue(); + } catch (IOException ex) { + LOGGER.error(ex.getMessage()); } super.onMessageReceived(event); } - private void loadAndPlay(final TextChannel channel, final String userID, final String trackUrl) { + private void loadAndPlay(final TextChannel channel, final String userID, final String trackUrl) throws IOException { AudioHandler audioHandler = getGuildAudioPlayer(channel.getGuild()); playerManager.loadItemOrdered(audioHandler, trackUrl, new AudioLoadResultHandler() { @Override public void trackLoaded(AudioTrack track) { - channel.sendMessage("Adding **" + track.getInfo().title + "** to queue").queue(); - playTrack(channel.getGuild(), userID, audioHandler, track); + try { + playTrack(channel.getGuild(), userID, audioHandler, track); + channel.sendMessage("Adding **" + track.getInfo().title + "** to queue").queue(); + } catch (EmptyVoiceChannelException e) { + channel.sendMessage("You must connect to a voice channel first!").queue(); + } } @Override @@ -84,8 +93,12 @@ public class TextListener extends Listener { firstTrack = playlist.getTracks().get(0); } - channel.sendMessage("Adding **" + firstTrack.getInfo().title + "** to queue (first track of playlist " + playlist.getName() + ")").queue(); - playTrack(channel.getGuild(), userID, audioHandler, firstTrack); + try { + playTrack(channel.getGuild(), userID, audioHandler, firstTrack); + channel.sendMessage("Adding **" + firstTrack.getInfo().title + "** to queue (first track of playlist " + playlist.getName() + ")").queue(); + } catch (EmptyVoiceChannelException e) { + channel.sendMessage("You must connect to a voice channel first!").queue(); + } } @Override diff --git a/src/main/java/com/bensherriff/siren/settings/GuildSettings.java b/src/main/java/com/bensherriff/siren/settings/GuildSettings.java new file mode 100644 index 0000000..a1e4fd8 --- /dev/null +++ b/src/main/java/com/bensherriff/siren/settings/GuildSettings.java @@ -0,0 +1,25 @@ +package com.bensherriff.siren.settings; + +import java.io.IOException; + +public class GuildSettings { + + private String prefix = "!"; + private int volume = 100; + + public String getPrefix() { + return prefix; + } + + public void setPrefix(String prefix) { + this.prefix = prefix; + } + + public int getVolume() { + return volume; + } + + public void setVolume(int volume) throws IOException { + this.volume = volume; + } +} diff --git a/src/main/java/com/bensherriff/siren/settings/Settings.java b/src/main/java/com/bensherriff/siren/settings/Settings.java index e0643b1..6aa22bc 100644 --- a/src/main/java/com/bensherriff/siren/settings/Settings.java +++ b/src/main/java/com/bensherriff/siren/settings/Settings.java @@ -1,14 +1,14 @@ package com.bensherriff.siren.settings; -import java.io.IOException; +import java.util.HashMap; +import java.util.Map; public class Settings { private String token = ""; private String owner = ""; - private String prefix = "!"; - private int volume = 100; +private Map guildSettings = new HashMap<>(); public String getToken() { return token; @@ -26,20 +26,11 @@ public class Settings { this.owner = owner; } - public String getPrefix() { - return prefix; + public Map getGuildSettings() { + return guildSettings; } - public void setPrefix(String prefix) { - this.prefix = prefix; - } - - public int getVolume() { - return volume; - } - - public void setVolume(int volume) throws IOException { - this.volume = volume; - SettingsManager.write(this); + public void setGuildSettings(Map guildSettings) { + this.guildSettings = guildSettings; } }