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;
}
}