messages = channel.getHistory().retrievePast(tracker).complete();
channel.deleteMessages(messages).complete();
- innerSpan.setStatus(SpanStatus.OK);
} catch (IllegalArgumentException ex) {
olderThan2Weeks = true;
} catch (Exception e) {
- innerSpan.setThrowable(e);
- innerSpan.setStatus(SpanStatus.INTERNAL_ERROR);
- } finally {
- innerSpan.finish();
+ logger.error("Error purging final iteration", e);
}
-
-
- innerSpan.finish();
}
} catch (Exception e) {
- transaction.setThrowable(e);
- transaction.setStatus(SpanStatus.INTERNAL_ERROR);
- } finally {
- transaction.finish();
- MessageCreateBuilder builder = new MessageCreateBuilder()
- .addContent("Finished purging ")
- .addContent(String.valueOf(toPurge))
- .addContent(" messages.");
-
- if (olderThan2Weeks) {
- builder.addContent("\n").addContent("Messages older than two weeks weren't deleted.");
- }
- context.reply(builder.build());
- lock.unlock();
+ logger.error("Error purging messages", e);
}
+
+ MessageCreateBuilder builder = new MessageCreateBuilder()
+ .addContent("Finished purging ")
+ .addContent(String.valueOf(toPurge))
+ .addContent(" messages.");
+
+ if (olderThan2Weeks) {
+ builder.addContent("\n").addContent("Messages older than two weeks weren't deleted.");
+ }
+ context.edit(MessageEditData.fromCreateData(builder.build()));
+ lock.unlock();
}
}
diff --git a/src/main/java/me/bobert/netneutrality/utils/JpaUtils.java b/src/main/java/me/bobert/netneutrality/utils/JpaUtils.java
index 2996950..c3be9bb 100644
--- a/src/main/java/me/bobert/netneutrality/utils/JpaUtils.java
+++ b/src/main/java/me/bobert/netneutrality/utils/JpaUtils.java
@@ -6,12 +6,11 @@ package me.bobert.netneutrality.utils;
* https://discord.gg/qUa6zNFZsd
*/
-import io.sentry.Breadcrumb;
-import io.sentry.Sentry;
-import io.sentry.SentryLevel;
import me.bobert.netneutrality.core.GuildManager;
-import me.bobert.netneutrality.core.SessionManager;
+import me.bobert.netneutrality.core.db.SessionManager;
import me.bobert.netneutrality.db.entities.OGuild;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
import org.hibernate.HibernateException;
import org.hibernate.ObjectNotFoundException;
import org.hibernate.Session;
@@ -21,6 +20,8 @@ import java.util.function.Consumer;
public class JpaUtils {
+ private static final Logger log = LogManager.getLogger(JpaUtils.class);
+
/**
* Tries to read the persistent state into the object.
*
@@ -38,16 +39,14 @@ public class JpaUtils {
session.load(object, id);
} catch (HibernateException exception) {
if (exception instanceof ObjectNotFoundException) {
- Sentry.addBreadcrumb(Breadcrumb.error("ObjectNotFoundException"));
-
if (object instanceof OGuild oGuild) {
String cachedId = oGuild.getGuildId();
- Sentry.captureMessage("Trying to load Guild[" + cachedId + "] while entity doesn't exist in database, reloading..", SentryLevel.ERROR);
+ log.error("Trying to load Guild[{}] while entity doesn't exist in database, reloading..", cachedId);
GuildManager guildManager = GuildManager.getManager(cachedId);
guildManager.reloadEntity();
guildManager.getBlacklistCache().clear();
- Sentry.captureMessage("Guild[" + cachedId + "] reloaded", SentryLevel.INFO);
+ log.info("Guild[{}] reloaded", cachedId);
}
}
@@ -57,14 +56,14 @@ public class JpaUtils {
}
public static void updateWithTransaction(Object persistantEntity, Runnable runnable) {
- Session session = SessionManager.getSessionFactory().openSession();
- session.beginTransaction();
+ try(Session session = SessionManager.getSessionFactory().openSession()) {
+ session.beginTransaction();
- runnable.run();
+ runnable.run();
- session.merge(persistantEntity);
- session.getTransaction().commit();
- session.close();
+ session.merge(persistantEntity);
+ session.getTransaction().commit();
+ }
}
public static void getWithSession(OGuild oGuild, Consumer consumer) {
@@ -72,15 +71,16 @@ public class JpaUtils {
}
/**
+ * Loads the entity and relations from the database and executes the given consumer
+ *
* @param persistantEntity The entity to load
* @param id The identifier for the entity
* @param consumer The comsumer, which exposes the session
*/
public static void getWithSession(Object persistantEntity, Serializable id, Consumer consumer) {
- Session session = SessionManager.getSessionFactory().openSession();
- tryLoad(session, persistantEntity, id);
-
- consumer.accept(session);
- session.close();
+ try(Session session = SessionManager.getSessionFactory().openSession()) {
+ tryLoad(session, persistantEntity, id);
+ consumer.accept(session);
+ }
}
}
diff --git a/src/main/java/me/bobert/netneutrality/utils/MessageFunction.java b/src/main/java/me/bobert/netneutrality/utils/MessageFunction.java
index 3cd26b6..4cf05ad 100644
--- a/src/main/java/me/bobert/netneutrality/utils/MessageFunction.java
+++ b/src/main/java/me/bobert/netneutrality/utils/MessageFunction.java
@@ -10,11 +10,13 @@ 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 me.bobert.netneutrality.command.AbstractCommand;
-import me.bobert.netneutrality.command.CommandManager;
+import me.bobert.netneutrality.command.Command;
import me.bobert.netneutrality.command.CommandType;
+import me.bobert.netneutrality.core.command.CommandManager;
import me.bobert.netneutrality.core.context.CommandContext;
-import me.bobert.netneutrality.exceptions.CommandException;
+import me.bobert.netneutrality.core.context.Context;
+import me.bobert.netneutrality.core.context.TaskContext;
+import me.bobert.netneutrality.exceptions.ContextException;
import me.bobert.netneutrality.music.MusicManager;
import me.bobert.netneutrality.music.QueueManager;
import me.bobert.netneutrality.music.SourceFinder;
@@ -22,6 +24,7 @@ import net.dv8tion.jda.api.EmbedBuilder;
import net.dv8tion.jda.api.entities.Member;
import net.dv8tion.jda.api.entities.Message;
import net.dv8tion.jda.api.entities.MessageEmbed;
+import net.dv8tion.jda.api.entities.User;
import net.dv8tion.jda.api.entities.channel.middleman.MessageChannel;
import org.apache.commons.lang3.time.DurationFormatUtils;
import org.apache.logging.log4j.LogManager;
@@ -36,7 +39,7 @@ import java.util.Set;
public class MessageFunction {
- private final static Logger logger = LogManager.getLogger(MessageFunction.class);
+ private static final Logger logger = LogManager.getLogger(MessageFunction.class);
public static MessageEmbed buildCurrentlyPlayingMessage(MusicManager manager) {
AudioTrack current = manager.getCurrentlyPlaying();
@@ -53,7 +56,7 @@ public class MessageFunction {
return message.build();
}
- public static MessageEmbed buildAddingTrackMessage(AudioTrack track, SourceFinder.AudioSourceType type) {
+ public static MessageEmbed buildAddingTrackMessage(AudioTrack track, Member member, SourceFinder.AudioSourceType type) {
EmbedBuilder message = new EmbedBuilder();
String url = track.getIdentifier();
String thumbnail = null;
@@ -74,37 +77,24 @@ public class MessageFunction {
message.setColor(Color.BLUE);
message.addField("Track title: ", String.format("[**`%s`**](%s)", track.getInfo().title, url), false);
message.addField("Duration: ", DurationFormatUtils.formatDuration(track.getDuration(), "**HH:mm:ss**", true), false);
+ message.setFooter(member.getEffectiveName(), member.getEffectiveAvatarUrl());
message.setTimestamp(OffsetDateTime.now());
return message.build();
}
- public static MessageEmbed buildSearchResultsMessage(List tracks) {
+ public static MessageEmbed buildAddingPlaylistMessage(List tracks, String playlistName, Member member, SourceFinder.AudioSourceType type) {
EmbedBuilder message = new EmbedBuilder();
-
- message.setTitle("Select the track to add to the queue");
- message.setColor(Color.BLUE);
-
- int i = 0;
- for (AudioTrack track : tracks) {
- message.addField(++i + ": ", String.format("**`%s`**", track.getInfo().title), false);
- }
-
- return message.build();
- }
-
- public static MessageEmbed buildAddingPlaylistMessage(AudioPlaylist playlist, String identifier, SourceFinder.AudioSourceType type) {
- EmbedBuilder message = new EmbedBuilder();
- String url = identifier;
+ String url = "";
String thumbnail = null;
if (type == SourceFinder.AudioSourceType.Youtube || type == SourceFinder.AudioSourceType.YTSearch) {
- url = String.format("https://youtu.be/%s", playlist.getTracks().get(0).getIdentifier());
- thumbnail = String.format("https://i3.ytimg.com/vi/%s/hqdefault.jpg", playlist.getTracks().get(0).getIdentifier());
+ url = String.format("https://youtu.be/%s", tracks.get(0).getIdentifier());
+ thumbnail = String.format("https://i3.ytimg.com/vi/%s/hqdefault.jpg", tracks.get(0).getIdentifier());
}
if (type == SourceFinder.AudioSourceType.YTMusic) {
- thumbnail = String.format("https://i3.ytimg.com/vi/%s/hqdefault.jpg", playlist.getTracks().get(0).getIdentifier());
+ thumbnail = String.format("https://i3.ytimg.com/vi/%s/hqdefault.jpg", tracks.get(0).getIdentifier());
}
if (thumbnail != null) {
@@ -112,8 +102,9 @@ public class MessageFunction {
}
message.setTitle("Adding playlist to queue..");
message.setColor(Color.BLUE);
- message.addField("Playlist: ", String.format("[**`%s`**](%s)", playlist.getName(), url), false);
- message.addField("Number of tracks: ", String.valueOf(playlist.getTracks().size()), false);
+ message.addField("Playlist: ", String.format("[**`%s`**](%s)", playlistName, url), false);
+ message.addField("Number of tracks: ", String.valueOf(tracks.size()), false);
+ message.setFooter(member.getEffectiveName(), member.getEffectiveAvatarUrl());
message.setTimestamp(OffsetDateTime.now());
return message.build();
@@ -174,19 +165,47 @@ public class MessageFunction {
return message.build();
}
- public static ArrayList buildHelpMessage(Member member) {
+ public static MessageEmbed buildSearchResultsMessage(List tracks, Member member) {
+ EmbedBuilder embed = new EmbedBuilder();
+
+ embed.setTitle("Search results");
+ embed.setDescription("I found the following tracks for your query, please select which one you want to play:");
+ embed.setColor(Color.MAGENTA);
+
+ int i = 0;
+ for (AudioTrack track : tracks) {
+ embed.addField(++i + ": ", track.getInfo().title, false);
+ }
+
+ embed.setFooter(member.getEffectiveName(), member.getEffectiveAvatarUrl());
+ embed.setTimestamp(OffsetDateTime.now());
+
+ return embed.build();
+ }
+
+ public static MessageEmbed buildPlaylistLoadMessage(AudioPlaylist playlist, Member member) {
+ EmbedBuilder embed = new EmbedBuilder();
+
+ embed.setTitle(String.format("Loading playlist: %s", playlist.getName()));
+ embed.setDescription(String.format("You are about to load %d tracks from this playlist, are you sure?", playlist.getTracks().size()));
+ embed.setColor(Color.CYAN);
+
+ embed.setFooter(member.getEffectiveName(), member.getEffectiveAvatarUrl());
+ embed.setTimestamp(OffsetDateTime.now());
+
+ return embed.build();
+ }
+
+ public static ArrayList buildHelpMessage() {
HashMap help = new HashMap<>();
- for (AbstractCommand command : CommandManager.commands.values()) {
+ for (Command command : CommandManager.commands.values()) {
if (command.getType() == null)
continue;
String description = "No description yet";
if (command.isEnabled() && command.getType() != CommandType.UNLISTED) {
- if (command.getType() == CommandType.ADMINISTRATION && !UserFunction.isAdmin(member))
- continue;
-
if (command.getDescription() != null)
description = command.getDescription();
@@ -223,23 +242,33 @@ public class MessageFunction {
return message.build();
}
- public static MessageEmbed buildDebugMessage(CommandContext context, CommandException error) {
+ public static MessageEmbed buildDebugMessage(ContextException exception) {
+ Context context = exception.getContext();
+
EmbedBuilder message = new EmbedBuilder();
message.setColor(Color.RED);
- message.setTitle(":warning: Exception in command execution");
- message.addField("Caused by command:", context.getCommand().getCommandName(), false);
- message.addField("Exception:", error.getMessage(), false);
- if (error.getCause() != null) {
+ message.setTitle(":warning: Exception in context");
+
+ if (context instanceof CommandContext commandContext) {
+ message.addField("Caused by command:", commandContext.getCommand().getCommandName(), false);
+ }
+
+ if (context instanceof TaskContext taskContext) {
+ message.addField("Caused by task with ID:", taskContext.getId(), false);
+ }
+
+ message.addField("Exception:", exception.getMessage(), false);
+ if (exception.getCause() != null) {
String cause;
- if (error.getCause().getMessage() != null && !error.getCause().getMessage().isEmpty()) {
- cause = error.getCause().getMessage();
+ if (exception.getCause().getMessage() != null && !exception.getCause().getMessage().isEmpty()) {
+ cause = exception.getCause().getMessage();
} else {
- cause = error.getCause().getClass().getName();
+ cause = exception.getCause().getClass().getName();
}
message.addField("Caused by:", cause, false);
}
- message.setFooter("Requested by " + context.getGuildUser().getEffectiveName(), context.getGuildUser().getAvatarUrl());
+ message.setFooter("User in context: " + context.getDiscordUser().getEffectiveName(), context.getDiscordUser().getAvatarUrl());
message.setTimestamp(OffsetDateTime.now());
return message.build();
diff --git a/src/main/java/me/bobert/netneutrality/utils/MusicUtils.java b/src/main/java/me/bobert/netneutrality/utils/MusicUtils.java
index 47a36e7..58c49b4 100644
--- a/src/main/java/me/bobert/netneutrality/utils/MusicUtils.java
+++ b/src/main/java/me/bobert/netneutrality/utils/MusicUtils.java
@@ -5,20 +5,50 @@ package me.bobert.netneutrality.utils;
* https://discord.gg/qUa6zNFZsd
*/
-import me.bobert.netneutrality.core.context.CommandContext;
-import me.bobert.netneutrality.exceptions.CommandExecutionException;
+import me.bobert.netneutrality.core.context.Context;
+import me.bobert.netneutrality.exceptions.ContextException;
import me.bobert.netneutrality.music.MusicManager;
+import net.dv8tion.jda.api.entities.GuildVoiceState;
import net.dv8tion.jda.api.entities.Member;
-import net.dv8tion.jda.api.entities.channel.concrete.VoiceChannel;
+import net.dv8tion.jda.api.entities.channel.middleman.AudioChannel;
public class MusicUtils {
- public static boolean checkIfConnected(MusicManager manager, CommandContext context) {
- if (context.getGuildUser().getVoiceState() == null) {
- throw new CommandExecutionException("Voice state is null, this should not happen", context, null);
+ public static boolean connect(Context context) {
+ return connect(context, false);
+ }
+
+ public static boolean connect(Context context, boolean skipChecks) {
+ MusicManager manager = MusicManager.get(context.getGuild());
+ Member member = context.getGuildUser();
+ if (member == null) {
+ return false;
}
- if (!context.getGuildUser().getVoiceState().inAudioChannel()) {
+ AudioChannel audioChannel = getVoiceChannel(context);
+ if (audioChannel == null) {
+ context.reply("You are not in a voice channel");
+ return false;
+ }
+
+ if (!skipChecks && !isUserDj(member) && (manager.isConnected() && manager.isNotConnectedTo(audioChannel))) {
+ context.reply("The bot isn't connected to your voice channel");
+ return false;
+ }
+
+ if (manager.isNotConnectedTo(audioChannel)) {
+ manager.connect(audioChannel);
+ manager.getScheduler().attachChannel(context.getChannel());
+ }
+
+ return true;
+ }
+
+ public static boolean checkIfConnected(Context context) {
+ MusicManager manager = MusicManager.get(context.getGuild());
+
+ AudioChannel voiceChannel = getVoiceChannel(context);
+ if (voiceChannel == null) {
context.reply("You are not in a voice channel");
return false;
}
@@ -28,8 +58,7 @@ public class MusicUtils {
return false;
}
- VoiceChannel vChannel = (VoiceChannel) context.getGuildUser().getVoiceState().getChannel();
- if (manager.isNotConnectedTo(vChannel)) {
+ if (manager.isNotConnectedTo(voiceChannel)) {
context.reply("The bot isn't in your voice channel");
return false;
}
@@ -37,6 +66,37 @@ public class MusicUtils {
return true;
}
+ public static boolean checkIfNotConnected(Context context) {
+ MusicManager manager = MusicManager.get(context.getGuild());
+
+ AudioChannel voiceChannel = getVoiceChannel(context);
+ if (voiceChannel == null) {
+ context.reply("You are not in a voice channel");
+ return false;
+ }
+
+ if (manager.isConnected()) {
+ context.reply("The bot is already in a voice channel");
+ return false;
+ }
+
+ return manager.isNotConnectedTo(voiceChannel);
+ }
+
+ public static AudioChannel getVoiceChannel(Context context) {
+ GuildVoiceState memberVoiceState = context.getGuildUser().getVoiceState();
+
+ if (memberVoiceState == null) {
+ throw new ContextException("Voice state is null", context, null);
+ }
+
+ if (!memberVoiceState.inAudioChannel()) {
+ return null;
+ }
+
+ return memberVoiceState.getChannel();
+ }
+
public static boolean isUserDj(Member member) {
MusicManager manager = MusicManager.get(member.getGuild());
diff --git a/src/main/java/me/bobert/netneutrality/utils/Settings.java b/src/main/java/me/bobert/netneutrality/utils/Settings.java
index e1084da..62d0348 100644
--- a/src/main/java/me/bobert/netneutrality/utils/Settings.java
+++ b/src/main/java/me/bobert/netneutrality/utils/Settings.java
@@ -77,7 +77,7 @@ public class Settings {
try {
Properties p = new Properties();
- InputStream is = getClass().getResourceAsStream("/app.properties");
+ InputStream is = getClass().getResourceAsStream("/application.properties");
if (is != null) {
p.load(is);
version = p.getProperty("app.version", "");
diff --git a/src/main/resources/app.properties b/src/main/resources/application.properties
similarity index 100%
rename from src/main/resources/app.properties
rename to src/main/resources/application.properties
diff --git a/src/main/resources/hibernate.cfg.xml b/src/main/resources/hibernate.cfg.xml
index 817a6be..955a01e 100644
--- a/src/main/resources/hibernate.cfg.xml
+++ b/src/main/resources/hibernate.cfg.xml
@@ -8,12 +8,13 @@
com.mysql.cj.jdbc.Driver
org.hibernate.hikaricp.internal.HikariCPConnectionProvider
-
+
-
+
+
\ No newline at end of file
diff --git a/src/main/resources/persistable-tasks.json b/src/main/resources/persistable-tasks.json
new file mode 100644
index 0000000..7db2d5a
--- /dev/null
+++ b/src/main/resources/persistable-tasks.json
@@ -0,0 +1,17 @@
+{
+ "tasks": [
+ {
+ "class": "me.bobert.netneutrality.tasks.emoji.EmojiReactionRoleTask",
+ "params": [
+ "guildId",
+ "messageId",
+ "emojiMapping"
+ ],
+ "types": [
+ "string",
+ "string",
+ "map"
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/src/test/java/netneutrality/music/source/UdioAudioSourceManagerTest.java b/src/test/java/me/bobert/netneutrality/music/source/UdioAudioSourceManagerTest.java
similarity index 86%
rename from src/test/java/netneutrality/music/source/UdioAudioSourceManagerTest.java
rename to src/test/java/me/bobert/netneutrality/music/source/UdioAudioSourceManagerTest.java
index 745e5e2..55ec954 100644
--- a/src/test/java/netneutrality/music/source/UdioAudioSourceManagerTest.java
+++ b/src/test/java/me/bobert/netneutrality/music/source/UdioAudioSourceManagerTest.java
@@ -1,4 +1,4 @@
-package netneutrality.music.source;
+package me.bobert.netneutrality.music.source;
/*
* Copyright (c) anthorob
*
@@ -8,8 +8,6 @@ package netneutrality.music.source;
import com.sedmelluq.discord.lavaplayer.track.AudioItem;
import com.sedmelluq.discord.lavaplayer.track.AudioReference;
import com.sedmelluq.discord.lavaplayer.track.AudioTrackInfo;
-import me.bobert.netneutrality.music.source.UdioAudioSourceManager;
-import me.bobert.netneutrality.music.source.UdioAudioTrack;
import org.junit.Test;
import static org.junit.Assert.assertNotNull;
diff --git a/src/test/java/netneutrality/utils/SettingsTest.java b/src/test/java/me/bobert/netneutrality/utils/SettingsTest.java
similarity index 58%
rename from src/test/java/netneutrality/utils/SettingsTest.java
rename to src/test/java/me/bobert/netneutrality/utils/SettingsTest.java
index 3e13580..e2a23ad 100644
--- a/src/test/java/netneutrality/utils/SettingsTest.java
+++ b/src/test/java/me/bobert/netneutrality/utils/SettingsTest.java
@@ -1,4 +1,4 @@
-package netneutrality.utils;
+package me.bobert.netneutrality.utils;
/*
* Copyright (c) anthorob
@@ -6,7 +6,6 @@ package netneutrality.utils;
* https://discord.gg/qUa6zNFZsd
*/
-import me.bobert.netneutrality.utils.Settings;
import org.junit.Test;
import static org.junit.Assert.*;
@@ -19,11 +18,4 @@ public class SettingsTest {
assertNotNull(version);
}
-
- @Test
- public void getGitVersion() {
- String version = Settings.getInstance().getGitVersion();
-
- assertNotNull(version);
- }
}
\ No newline at end of file