v0.1.7 - Settings handling tweaks

This commit is contained in:
2023-01-29 11:50:40 -05:00
parent eb244a539a
commit 1e809c6108
9 changed files with 166 additions and 100 deletions

View File

@@ -9,7 +9,7 @@ services:
dockerfile: ./Dockerfile dockerfile: ./Dockerfile
args: args:
- JAVA_VERSION=17 - JAVA_VERSION=17
- VERSION=0.1.6 - VERSION=0.1.7
volumes: volumes:
- ./data:/app - ./data:/app
restart: unless-stopped restart: unless-stopped

View File

@@ -3,7 +3,7 @@
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<groupId>com.bensherriff</groupId> <groupId>com.bensherriff</groupId>
<artifactId>siren</artifactId> <artifactId>siren</artifactId>
<version>0.1.6</version> <version>0.1.7</version>
<packaging>jar</packaging> <packaging>jar</packaging>
<repositories> <repositories>

View File

@@ -10,6 +10,7 @@ import net.dv8tion.jda.api.audio.AudioSendHandler;
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
import java.io.IOException;
import java.nio.Buffer; import java.nio.Buffer;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
import java.util.concurrent.BlockingQueue; import java.util.concurrent.BlockingQueue;
@@ -27,7 +28,7 @@ public class AudioHandler extends AudioEventAdapter implements AudioSendHandler
public AudioHandler(PlayerManager manager, long guildID) { public AudioHandler(PlayerManager manager, long guildID) {
this.manager = manager; this.manager = manager;
player = manager.createPlayer(); player = manager.createPlayer();
player.setVolume(manager.getListener().getSettings().getVolume()); player.setVolume(manager.getListener().getSettings().getGuildSettings().get(guildID).getVolume());
player.addListener(this); player.addListener(this);
this.queue = new LinkedBlockingQueue<>(); this.queue = new LinkedBlockingQueue<>();
this.buffer = ByteBuffer.allocate(1024); this.buffer = ByteBuffer.allocate(1024);

View File

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

View File

@@ -3,8 +3,10 @@ package com.bensherriff.siren.listener;
import com.bensherriff.siren.audio.AudioHandler; import com.bensherriff.siren.audio.AudioHandler;
import com.bensherriff.siren.audio.PlayerManager; import com.bensherriff.siren.audio.PlayerManager;
import com.bensherriff.siren.commands.Command; 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.Settings;
import com.bensherriff.siren.settings.SettingsManager;
import com.sedmelluq.discord.lavaplayer.track.AudioTrack; import com.sedmelluq.discord.lavaplayer.track.AudioTrack;
import net.dv8tion.jda.api.JDA; import net.dv8tion.jda.api.JDA;
import net.dv8tion.jda.api.entities.Guild; 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()); long guildId = Long.parseLong(guild.getId());
AudioHandler audioHandler = musicManagers.get(guildId); AudioHandler audioHandler = musicManagers.get(guildId);
if (audioHandler == null) { if (audioHandler == null) {
LOGGER.info("Creating Audio Handler for guild {}", guildId); 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); audioHandler = new AudioHandler(playerManager, guildId);
musicManagers.put(guildId, audioHandler); musicManagers.put(guildId, audioHandler);
} }
@@ -79,44 +85,49 @@ public abstract class Listener extends ListenerAdapter {
super.onReady(event); 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()); connectToVoiceChannel(userID, guild.getAudioManager());
audioHandler.addTrack(track); audioHandler.addTrack(track);
} }
protected void stopTrack(Guild guild) { protected void stopTrack(Guild guild) throws IOException {
AudioHandler audioHandler = getGuildAudioPlayer(guild); AudioHandler audioHandler = getGuildAudioPlayer(guild);
audioHandler.stopTrack(); audioHandler.stopTrack();
guild.getAudioManager().closeAudioConnection(); guild.getAudioManager().closeAudioConnection();
} }
protected void skipTrack(Guild guild) { protected void skipTrack(Guild guild) throws IOException {
AudioHandler audioHandler = getGuildAudioPlayer(guild); AudioHandler audioHandler = getGuildAudioPlayer(guild);
audioHandler.stopTrack(); audioHandler.stopTrack();
} }
protected void pauseTrack(Guild guild) { protected void pauseTrack(Guild guild) throws IOException {
AudioHandler audioHandler = getGuildAudioPlayer(guild); AudioHandler audioHandler = getGuildAudioPlayer(guild);
audioHandler.setPaused(true); audioHandler.setPaused(true);
} }
protected void resumeTrack(Guild guild) { protected void resumeTrack(Guild guild) throws IOException {
AudioHandler audioHandler = getGuildAudioPlayer(guild); AudioHandler audioHandler = getGuildAudioPlayer(guild);
audioHandler.setPaused(false); audioHandler.setPaused(false);
} }
protected void changeVolume(Guild guild, int volume) throws IOException { protected void changeVolume(Guild guild, int volume) throws IOException {
AudioHandler audioHandler = getGuildAudioPlayer(guild); AudioHandler audioHandler = getGuildAudioPlayer(guild);
getSettings().setVolume(volume); settings.getGuildSettings().get(guild.getIdLong()).setVolume(volume);
SettingsManager.write(getSettings());
audioHandler.setVolume(volume); audioHandler.setVolume(volume);
} }
private void connectToVoiceChannel(String userID, AudioManager audioManager) { private void connectToVoiceChannel(String userID, AudioManager audioManager) throws EmptyVoiceChannelException {
if (!audioManager.isConnected()) { if (!audioManager.isConnected()) {
Member member = audioManager.getGuild().getMemberById(userID); Member member = audioManager.getGuild().getMemberById(userID);
if (member != null && member.getVoiceState() != null && member.getVoiceState().inAudioChannel()) { if (member != null) {
VoiceChannel voiceChannel = Objects.requireNonNull(member.getVoiceState().getChannel()).asVoiceChannel(); if (member.getVoiceState() != null && member.getVoiceState().inAudioChannel()) {
audioManager.openAudioConnection(voiceChannel); VoiceChannel voiceChannel = Objects.requireNonNull(member.getVoiceState().getChannel()).asVoiceChannel();
audioManager.openAudioConnection(voiceChannel);
} else {
throw new EmptyVoiceChannelException("Member {} is not connected to a voice channel");
}
} }
} }
} }

View File

@@ -1,6 +1,7 @@
package com.bensherriff.siren.listener; package com.bensherriff.siren.listener;
import com.bensherriff.siren.audio.AudioHandler; import com.bensherriff.siren.audio.AudioHandler;
import com.bensherriff.siren.exceptions.EmptyVoiceChannelException;
import com.bensherriff.siren.settings.Settings; import com.bensherriff.siren.settings.Settings;
import com.sedmelluq.discord.lavaplayer.player.AudioLoadResultHandler; import com.sedmelluq.discord.lavaplayer.player.AudioLoadResultHandler;
import com.sedmelluq.discord.lavaplayer.tools.FriendlyException; import com.sedmelluq.discord.lavaplayer.tools.FriendlyException;
@@ -47,50 +48,58 @@ public class SlashListener extends Listener {
String command = event.getName(); String command = event.getName();
event.deferReply().queue(); event.deferReply().queue();
switch (command) { try {
case "play" -> { switch (command) {
String trackURL = Objects.requireNonNull(event.getOption("url")).getAsString(); case "play" -> {
loadAndPlay(guild, userId, trackURL, event); 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());
} }
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" -> { } catch (IOException ex) {
pauseTrack(guild); LOGGER.error(ex.getMessage());
event.getHook().sendMessage("Pausing track").queue();
}
case "resume" -> {
resumeTrack(guild);
event.getHook().sendMessage("Resumed track").queue();
}
default -> event.getHook().sendMessage("Invalid command").queue();
} }
super.onSlashCommandInteraction(event); 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); AudioHandler audioHandler = getGuildAudioPlayer(guild);
playerManager.loadItemOrdered(audioHandler, trackUrl, new AudioLoadResultHandler() { playerManager.loadItemOrdered(audioHandler, trackUrl, new AudioLoadResultHandler() {
@Override @Override
public void trackLoaded(AudioTrack track) { public void trackLoaded(AudioTrack track) {
event.getHook().sendMessage("Adding **" + track.getInfo().title + "** to queue").queue(); try {
playTrack(guild, userID, audioHandler, track); 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 @Override
@@ -101,8 +110,12 @@ public class SlashListener extends Listener {
firstTrack = playlist.getTracks().get(0); firstTrack = playlist.getTracks().get(0);
} }
event.getHook().sendMessage("Adding **" + firstTrack.getInfo().title + "** to queue (first track of playlist " + playlist.getName() + ")").queue(); try {
playTrack(guild, userID, audioHandler, firstTrack); 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 @Override

View File

@@ -2,6 +2,7 @@ package com.bensherriff.siren.listener;
import com.bensherriff.siren.audio.AudioHandler; import com.bensherriff.siren.audio.AudioHandler;
import com.bensherriff.siren.commands.CommandEvent; import com.bensherriff.siren.commands.CommandEvent;
import com.bensherriff.siren.exceptions.EmptyVoiceChannelException;
import com.bensherriff.siren.settings.Settings; import com.bensherriff.siren.settings.Settings;
import com.sedmelluq.discord.lavaplayer.player.AudioLoadResultHandler; import com.sedmelluq.discord.lavaplayer.player.AudioLoadResultHandler;
import com.sedmelluq.discord.lavaplayer.tools.FriendlyException; import com.sedmelluq.discord.lavaplayer.tools.FriendlyException;
@@ -29,51 +30,59 @@ public class TextListener extends Listener {
TextChannel channel = event.getChannel().asTextChannel(); TextChannel channel = event.getChannel().asTextChannel();
String userID = event.getAuthor().getId(); String userID = event.getAuthor().getId();
Guild guild = channel.getGuild(); Guild guild = channel.getGuild();
AudioHandler audioHandler = getGuildAudioPlayer(guild); // AudioHandler audioHandler = getGuildAudioPlayer(guild);
CommandEvent commandEvent = new CommandEvent.CommandBuilder(command[0], userID) // CommandEvent commandEvent = new CommandEvent.CommandBuilder(command[0], userID)
.setTextChannel(channel) // .setTextChannel(channel)
.setGuild(guild) // .setGuild(guild)
.setAudioHandler(audioHandler) // .setAudioHandler(audioHandler)
.setArgs(Arrays.asList(command).subList(1, command.length)) // .setArgs(Arrays.asList(command).subList(1, command.length))
.build(); // .build();
if ("!play".equals(command[0]) && command.length == 2) { try {
loadAndPlay(channel, userID, command[1]); if ("!play".equals(command[0]) && command.length == 2) {
} else if ("!skip".equals(command[0])) { loadAndPlay(channel, userID, command[1]);
skipTrack(guild); } else if ("!skip".equals(command[0])) {
channel.sendMessage("Skipped to the next track").queue(); skipTrack(guild);
} else if ("!stop".equals(command[0])) { channel.sendMessage("Skipped to the next track").queue();
stopTrack(guild); } else if ("!stop".equals(command[0])) {
channel.sendMessage("Stopped track and cleared queue").queue(); stopTrack(guild);
} else if ("!volume".equals(command[0]) && command.length == 2) { channel.sendMessage("Stopped track and cleared queue").queue();
int volume = Integer.parseInt(command[1]); } else if ("!volume".equals(command[0]) && command.length == 2) {
try { int volume = Integer.parseInt(command[1]);
changeVolume(guild, volume); try {
} catch (IOException ex) { changeVolume(guild, volume);
channel.sendMessage("Unable to update the settings file.").queue(); } catch (IOException ex) {
LOGGER.error(ex.getMessage()); 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(); } catch (IOException ex) {
} else if ("!pause".equals(command[0])) { LOGGER.error(ex.getMessage());
pauseTrack(guild);
channel.sendMessage("Paused track").queue();
} else if ("!resume".equals(command[0])) {
resumeTrack(guild);
channel.sendMessage("Resumed track").queue();
} }
super.onMessageReceived(event); 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()); AudioHandler audioHandler = getGuildAudioPlayer(channel.getGuild());
playerManager.loadItemOrdered(audioHandler, trackUrl, new AudioLoadResultHandler() { playerManager.loadItemOrdered(audioHandler, trackUrl, new AudioLoadResultHandler() {
@Override @Override
public void trackLoaded(AudioTrack track) { public void trackLoaded(AudioTrack track) {
channel.sendMessage("Adding **" + track.getInfo().title + "** to queue").queue(); try {
playTrack(channel.getGuild(), userID, audioHandler, track); 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 @Override
@@ -84,8 +93,12 @@ public class TextListener extends Listener {
firstTrack = playlist.getTracks().get(0); firstTrack = playlist.getTracks().get(0);
} }
channel.sendMessage("Adding **" + firstTrack.getInfo().title + "** to queue (first track of playlist " + playlist.getName() + ")").queue(); try {
playTrack(channel.getGuild(), userID, audioHandler, firstTrack); 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 @Override

View File

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

View File

@@ -1,14 +1,14 @@
package com.bensherriff.siren.settings; package com.bensherriff.siren.settings;
import java.io.IOException; import java.util.HashMap;
import java.util.Map;
public class Settings { public class Settings {
private String token = ""; private String token = "";
private String owner = ""; private String owner = "";
private String prefix = "!"; private Map<Long, GuildSettings> guildSettings = new HashMap<>();
private int volume = 100;
public String getToken() { public String getToken() {
return token; return token;
@@ -26,20 +26,11 @@ public class Settings {
this.owner = owner; this.owner = owner;
} }
public String getPrefix() { public Map<Long, GuildSettings> getGuildSettings() {
return prefix; return guildSettings;
} }
public void setPrefix(String prefix) { public void setGuildSettings(Map<Long, GuildSettings> guildSettings) {
this.prefix = prefix; this.guildSettings = guildSettings;
}
public int getVolume() {
return volume;
}
public void setVolume(int volume) throws IOException {
this.volume = volume;
SettingsManager.write(this);
} }
} }