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
args:
- JAVA_VERSION=17
- VERSION=0.1.6
- VERSION=0.1.7
volumes:
- ./data:/app
restart: unless-stopped

View File

@@ -3,7 +3,7 @@
<modelVersion>4.0.0</modelVersion>
<groupId>com.bensherriff</groupId>
<artifactId>siren</artifactId>
<version>0.1.6</version>
<version>0.1.7</version>
<packaging>jar</packaging>
<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.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);

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.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()) {
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");
}
}
}
}

View File

@@ -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,6 +48,7 @@ public class SlashListener extends Listener {
String command = event.getName();
event.deferReply().queue();
try {
switch (command) {
case "play" -> {
String trackURL = Objects.requireNonNull(event.getOption("url")).getAsString();
@@ -80,17 +82,24 @@ public class SlashListener extends Listener {
}
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();
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();
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

View File

@@ -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,15 +30,16 @@ 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();
try {
if ("!play".equals(command[0]) && command.length == 2) {
loadAndPlay(channel, userID, command[1]);
} else if ("!skip".equals(command[0])) {
@@ -62,18 +64,25 @@ public class TextListener extends Listener {
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();
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();
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

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;
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<Long, GuildSettings> 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<Long, GuildSettings> 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<Long, GuildSettings> guildSettings) {
this.guildSettings = guildSettings;
}
}