diff --git a/pom.xml b/pom.xml index 9a003bf..28098f4 100644 --- a/pom.xml +++ b/pom.xml @@ -96,6 +96,12 @@ https://jitpack.io + + arbjergDev-snapshots + Lavalink Repository + https://maven.lavalink.dev/snapshots + + @@ -113,7 +119,7 @@ dev.arbjerg lavaplayer - 2.1.1 + 0eaeee195f0315b2617587aa3537fa202df07ddc-SNAPSHOT @@ -167,7 +173,7 @@ org.apache.logging.log4j - log4j-slf4j2-impl + log4j-slf4j-impl 2.23.1 diff --git a/src/main/java/netneutrality/core/LogHandler.java b/src/main/java/netneutrality/core/LogHandler.java index ba11ac9..47363cb 100644 --- a/src/main/java/netneutrality/core/LogHandler.java +++ b/src/main/java/netneutrality/core/LogHandler.java @@ -27,16 +27,18 @@ public class LogHandler { * @param e The exceptions to log */ public static void log(Exception e) { - if (e instanceof CommandExecutionException) { - Sentry.captureException(e); - logInternally((CommandExecutionException) e); - tryLogToDebugChannel((CommandExecutionException) e); - tryGracefulSlashContextError((CommandExecutionException) e); + Sentry.captureException(e); + + if (e instanceof CommandExecutionException exception) { + CommandContext context = exception.getCommandContext(); + + logInternally(exception, context); + tryLogToDebugChannel(exception, context); + tryGracefulSlashContextError(exception, context); return; } - Sentry.captureException(e); logger.error(e.getMessage(), e); } @@ -59,14 +61,11 @@ public class LogHandler { } } - private static void logInternally(CommandException error) { - CommandContext context = error.getCommandContext(); - logger.error("Exception thrown from command [{}] in guild [{}]: {}", context.getCommand().getCommandName(), context.getGuild().getId(), error.getMessage(), error); + private static void logInternally(CommandException exception, CommandContext context) { + logger.error("Exception thrown from command [{}] in guild [{}]: {}", context.getCommand().getCommandName(), context.getGuild().getId(), exception.getMessage(), exception); } - private static void tryLogToDebugChannel(CommandException error) { - CommandContext context = error.getCommandContext(); - + private static void tryLogToDebugChannel(CommandException exception, CommandContext context) { if (context.getGuild() != null) { if (GuildManager.getManager(context.getGuild()).isDebugEnabled()) { context.getGuild() @@ -74,16 +73,14 @@ public class LogHandler { .stream() .filter(textChannel -> textChannel.getName().equals("debug") || textChannel.getName().equals("log")) .filter(TextChannel::canTalk) - .forEach(textChannel -> textChannel.sendMessageEmbeds(MessageFunction.buildDebugMessage(context, error)).queue()); + .forEach(textChannel -> textChannel.sendMessageEmbeds(MessageFunction.buildDebugMessage(context, exception)).queue()); } } } - private static void tryGracefulSlashContextError(CommandExecutionException error) { - CommandContext context = error.getCommandContext(); - + private static void tryGracefulSlashContextError(CommandException exception, CommandContext context) { if (context instanceof SlashCommandContext slashCommandContext) { - slashCommandContext.replyEphemeral("Error during command execution"); + slashCommandContext.reply(MessageFunction.buildSentryErrorMessage(exception.getMessage())); } } } diff --git a/src/main/java/netneutrality/core/context/CommandContext.java b/src/main/java/netneutrality/core/context/CommandContext.java index 4e2db05..ff2d737 100644 --- a/src/main/java/netneutrality/core/context/CommandContext.java +++ b/src/main/java/netneutrality/core/context/CommandContext.java @@ -53,5 +53,9 @@ public interface CommandContext { replyToMessage(String.format(format, arguments)); } + default void replyToMessage(MessageEmbed... embeds) { + replyToMessage(MessageCreateData.fromEmbeds(embeds)); + } + void dispatchToCommand(String commandName); } diff --git a/src/main/java/netneutrality/core/context/SlashCommandContext.java b/src/main/java/netneutrality/core/context/SlashCommandContext.java index 775301f..9684e3c 100644 --- a/src/main/java/netneutrality/core/context/SlashCommandContext.java +++ b/src/main/java/netneutrality/core/context/SlashCommandContext.java @@ -138,6 +138,10 @@ public class SlashCommandContext implements CommandContext { event.reply(message).setEphemeral(true).queue(); } + public void replyEphemeral(MessageEmbed... embeds) { + replyEphemeral(MessageCreateData.fromEmbeds(embeds)); + } + public void replyEphemeral(String format, Object... arguments) { replyEphemeral(String.format(format, arguments)); } diff --git a/src/main/java/netneutrality/music/TrackLoadingHandler.java b/src/main/java/netneutrality/music/TrackLoadingHandler.java index 52b467f..ccd5151 100644 --- a/src/main/java/netneutrality/music/TrackLoadingHandler.java +++ b/src/main/java/netneutrality/music/TrackLoadingHandler.java @@ -56,9 +56,8 @@ public class TrackLoadingHandler implements AudioLoadResultHandler { loadConsumer.accept(true); } - if (loadingDisabled) { + if (loadingDisabled) return; - } context.deleteMessage(); @@ -76,9 +75,9 @@ public class TrackLoadingHandler implements AudioLoadResultHandler { loadConsumer.accept(true); } - if (loadingDisabled) { + if (loadingDisabled) return; - } + logger.debug("Guild {}: playlist loaded: {}", guild.getId(), identifier); if (!playlist.getTracks().isEmpty()) { @@ -110,24 +109,22 @@ public class TrackLoadingHandler implements AudioLoadResultHandler { @Override public void noMatches() { - logger.debug("Guild {}: no matches for identifier {}", guild.getId(), identifier); + if (loadConsumer != null) + loadConsumer.accept(false); if (!silent) context.replyToMessage("No matches found"); - - if (loadConsumer != null) - loadConsumer.accept(false); } @Override public void loadFailed(FriendlyException e) { + if (loadConsumer != null) + loadConsumer.accept(false); + logger.debug("Guild {}: load failed for identifier {}", guild.getId(), identifier, e); LogHandler.log(e); if (!silent) - context.replyToMessage("Failed to load track: " + e.getMessage()); - - if (loadConsumer != null) - loadConsumer.accept(false); + context.replyToMessage(MessageFunction.buildSentryErrorMessage("Failed to load track: " + e.getMessage())); } } diff --git a/src/main/java/netneutrality/music/TrackScheduler.java b/src/main/java/netneutrality/music/TrackScheduler.java index 1b471d9..5e7bc1d 100644 --- a/src/main/java/netneutrality/music/TrackScheduler.java +++ b/src/main/java/netneutrality/music/TrackScheduler.java @@ -16,6 +16,7 @@ import net.dv8tion.jda.api.entities.MessageEmbed; import net.dv8tion.jda.api.entities.channel.concrete.TextChannel; import net.dv8tion.jda.api.entities.channel.middleman.MessageChannel; import netneutrality.core.LogHandler; +import netneutrality.utils.MessageFunction; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -119,7 +120,7 @@ public class TrackScheduler extends AudioEventAdapter { public void onTrackException(AudioPlayer player, AudioTrack track, FriendlyException exception) { logger.debug("Guild {}: exception while playing track [{}]: {}", guild.getId(), track.getIdentifier(), exception.getMessage()); LogHandler.log(exception); - sendMessageToChannel("Error while playing track [" + track.getInfo().title + "]: " + exception.getMessage()); + sendMessageToChannel(MessageFunction.buildSentryErrorMessage(String.format("Error while playing track [%s]: %s", track.getInfo().title, exception.getMessage()))); } @Override diff --git a/src/main/java/netneutrality/utils/MessageFunction.java b/src/main/java/netneutrality/utils/MessageFunction.java index 77c4a50..1b8f941 100644 --- a/src/main/java/netneutrality/utils/MessageFunction.java +++ b/src/main/java/netneutrality/utils/MessageFunction.java @@ -10,6 +10,7 @@ package netneutrality.utils; import com.sedmelluq.discord.lavaplayer.track.AudioPlaylist; import com.sedmelluq.discord.lavaplayer.track.AudioTrack; import com.sedmelluq.discord.lavaplayer.track.AudioTrackInfo; +import io.sentry.Sentry; import net.dv8tion.jda.api.EmbedBuilder; import net.dv8tion.jda.api.entities.Member; import net.dv8tion.jda.api.entities.Message; @@ -208,6 +209,17 @@ public class MessageFunction { return messages; } + public static MessageEmbed buildSentryErrorMessage(String error) { + EmbedBuilder message = new EmbedBuilder(); + message.setColor(Color.RED); + message.setTitle(":warning: Error during execution :warning:"); + message.addField("Error message:", error, false); + message.addField("Error ID:", Sentry.getLastEventId().toString(), false); + message.setTimestamp(OffsetDateTime.now()); + + return message.build(); + } + public static MessageEmbed buildDebugMessage(CommandContext context, CommandException error) { EmbedBuilder message = new EmbedBuilder(); message.setColor(Color.RED); diff --git a/src/main/java/netneutrality/utils/MusicUtils.java b/src/main/java/netneutrality/utils/MusicUtils.java index 3f5fa2a..71a1046 100644 --- a/src/main/java/netneutrality/utils/MusicUtils.java +++ b/src/main/java/netneutrality/utils/MusicUtils.java @@ -16,7 +16,6 @@ public class MusicUtils { public static boolean checkIfConnected(MusicManager manager, CommandContext context) { if (context.getGuildUser().getVoiceState() == null) { - context.reply("Voice state is null, this should not happen"); throw new CommandExecutionException("Voice state is null, this should not happen", context, null); }