From 68c659ed0b5c13656f67d3527f34206571991771 Mon Sep 17 00:00:00 2001
From: Egg-03 <111327101+eggy03@users.noreply.github.com>
Date: Fri, 29 May 2026 08:48:58 +0530
Subject: [PATCH 01/66] build: introduce quarkus bom
Signed-off-by: Egg-03 <111327101+eggy03@users.noreply.github.com>
---
pom.xml | 157 ++++++++++++++++++++++++++++++++++----------------------
1 file changed, 96 insertions(+), 61 deletions(-)
diff --git a/pom.xml b/pom.xml
index 7e03807..1f9a840 100644
--- a/pom.xml
+++ b/pom.xml
@@ -1,9 +1,7 @@
-
+
-
4.0.0
-
io.github.eggy03
papertrailbot
3.7.3
@@ -11,56 +9,73 @@
A simple bot for logging all server and member actions
+
+ 25
UTF-8
UTF-8
- 25
+
+
+ quarkus-bom
+ io.quarkus.platform
+ 3.35.4
+ uber-jar
+ true
6.4.1
2.0.4
- 2.7.0
- 3.2.0
3.20.0
33.5.0-jre
+ 26.1.0
1.18.46
- 3.8.0
- 3.15.0
-
-
- io.github.eggy03.papertrail.bot.main.Start
+ 3.15.0
+ 3.5.5
+
+
+
+ ${quarkus.platform.group-id}
+ ${quarkus.platform.artifact-id}
+ ${quarkus.platform.version}
+ pom
+ import
+
+
+
+
+
+
+
+ io.quarkus
+ quarkus-arc
+
+
+
net.dv8tion
JDA
${jda.version}
+
- org.tinylog
- slf4j-tinylog
- ${tinylog.version}
-
-
- org.tinylog
- tinylog-api
- ${tinylog.version}
-
-
- org.tinylog
- tinylog-impl
- ${tinylog.version}
+ org.projectlombok
+ lombok
+ ${lombok.version}
+ provided
- io.github.cdimascio
- dotenv-java
- ${dotenv.version}
+ org.jetbrains
+ annotations
+ ${jetbrains.annotations.version}
+
org.apache.commons
commons-lang3
@@ -79,49 +94,22 @@
${papertrail.sdk.version}
-
- org.projectlombok
- lombok
- ${lombok.version}
- provided
-
${project.artifactId}
-
- org.apache.maven.plugins
- maven-assembly-plugin
- ${maven.assembly.plugin.version}
-
-
-
- true
- ${app.main.class}
-
-
-
- jar-with-dependencies
-
-
-
-
- assemble-all
- package
-
- single
-
-
-
+ ${quarkus.platform.group-id}
+ quarkus-maven-plugin
+ ${quarkus.platform.version}
+ true
-
- org.apache.maven.plugins
maven-compiler-plugin
- ${maven-compiler-plugin.version}
+ ${compiler-plugin.version}
+ true
org.projectlombok
@@ -131,7 +119,54 @@
+
+ maven-surefire-plugin
+ ${surefire-plugin.version}
+
+ @{argLine}
+
+ org.jboss.logmanager.LogManager
+ ${maven.home}
+
+
+
+
+ maven-failsafe-plugin
+ ${surefire-plugin.version}
+
+
+
+ integration-test
+ verify
+
+
+
+
+ @{argLine}
+
+ ${project.build.directory}/${project.artifactId}-runner
+ org.jboss.logmanager.LogManager
+ ${maven.home}
+
+
+
+
+
+ native
+
+
+ native
+
+
+
+ false
+ false
+ true
+
+
+
+
From 424903d1723ce23d37fc7e4b07d719318ca17370 Mon Sep 17 00:00:00 2001
From: Egg-03 <111327101+eggy03@users.noreply.github.com>
Date: Fri, 29 May 2026 09:36:58 +0530
Subject: [PATCH 02/66] refactor(bootstrap): migrate application to Quarkus
framework
- Replace manual bootstrap with Quarkus CDI and `@QuarkusMain` in `Start.java`
- Remove `EnvConfig.java` and use `application.properties` for configuration
- Add `PaperTrailSdkBeanProvider.java` to produce SDK client beans
Signed-off-by: Egg-03 <111327101+eggy03@users.noreply.github.com>
---
.../bot/bean/PaperTrailSdkBeanProvider.java | 36 ++++
.../papertrail/bot/main/BootstrapService.java | 155 +++++++-----------
.../eggy03/papertrail/bot/main/Start.java | 49 +-----
.../papertrail/bot/utils/EnvConfig.java | 24 ---
src/main/resources/application.properties | 16 ++
src/main/resources/banner.txt | 8 +
src/main/resources/tinylog.properties | 4 -
7 files changed, 124 insertions(+), 168 deletions(-)
create mode 100644 src/main/java/io/github/eggy03/papertrail/bot/bean/PaperTrailSdkBeanProvider.java
delete mode 100644 src/main/java/io/github/eggy03/papertrail/bot/utils/EnvConfig.java
create mode 100644 src/main/resources/application.properties
create mode 100644 src/main/resources/banner.txt
delete mode 100644 src/main/resources/tinylog.properties
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/bean/PaperTrailSdkBeanProvider.java b/src/main/java/io/github/eggy03/papertrail/bot/bean/PaperTrailSdkBeanProvider.java
new file mode 100644
index 0000000..6f01d5b
--- /dev/null
+++ b/src/main/java/io/github/eggy03/papertrail/bot/bean/PaperTrailSdkBeanProvider.java
@@ -0,0 +1,36 @@
+package io.github.eggy03.papertrail.bot.bean;
+
+import io.github.eggy03.papertrail.sdk.client.AuditLogRegistrationClient;
+import io.github.eggy03.papertrail.sdk.client.MessageLogContentClient;
+import io.github.eggy03.papertrail.sdk.client.MessageLogRegistrationClient;
+import jakarta.enterprise.context.ApplicationScoped;
+import jakarta.enterprise.inject.Produces;
+import jakarta.inject.Inject;
+import lombok.NonNull;
+import org.eclipse.microprofile.config.inject.ConfigProperty;
+
+@ApplicationScoped
+public class PaperTrailSdkBeanProvider {
+
+ private final @NonNull String apiUrl;
+
+ @Inject
+ public PaperTrailSdkBeanProvider(@ConfigProperty(name = "api.url") @NonNull String apiUrl) {
+ this.apiUrl = apiUrl;
+ }
+
+ @Produces
+ public AuditLogRegistrationClient auditLogRegistrationClient() {
+ return new AuditLogRegistrationClient(apiUrl);
+ }
+
+ @Produces
+ public MessageLogRegistrationClient messageLogRegistrationClient() {
+ return new MessageLogRegistrationClient(apiUrl);
+ }
+
+ @Produces
+ public MessageLogContentClient messageLogContentClient() {
+ return new MessageLogContentClient(apiUrl);
+ }
+}
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/main/BootstrapService.java b/src/main/java/io/github/eggy03/papertrail/bot/main/BootstrapService.java
index 83e0e4f..722414d 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/main/BootstrapService.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/main/BootstrapService.java
@@ -1,23 +1,14 @@
package io.github.eggy03.papertrail.bot.main;
-import io.github.eggy03.papertrail.bot.listeners.auditlog.event.AuditLogEventListener;
-import io.github.eggy03.papertrail.bot.listeners.auditlogsupl.event.guild.GuildBoostEventListener;
-import io.github.eggy03.papertrail.bot.listeners.auditlogsupl.event.guild.GuildMemberJoinAndLeaveEventListener;
-import io.github.eggy03.papertrail.bot.listeners.auditlogsupl.event.guild.GuildPollEventListener;
-import io.github.eggy03.papertrail.bot.listeners.auditlogsupl.event.guild.GuildVoiceEventListener;
-import io.github.eggy03.papertrail.bot.listeners.command.AuditLogSetupCommandListener;
-import io.github.eggy03.papertrail.bot.listeners.command.BotSetupInstructionCommandListener;
-import io.github.eggy03.papertrail.bot.listeners.command.DebugCommandListener;
-import io.github.eggy03.papertrail.bot.listeners.command.MessageLogSetupCommandListener;
-import io.github.eggy03.papertrail.bot.listeners.command.ServerStatCommandListener;
-import io.github.eggy03.papertrail.bot.listeners.messagelog.event.MessageLogListener;
-import io.github.eggy03.papertrail.bot.listeners.misc.SelfKickListener;
-import io.github.eggy03.papertrail.bot.listeners.misc.SlashCommandRegistrationListener;
-import io.github.eggy03.papertrail.sdk.client.AuditLogRegistrationClient;
-import io.github.eggy03.papertrail.sdk.client.MessageLogContentClient;
-import io.github.eggy03.papertrail.sdk.client.MessageLogRegistrationClient;
+import io.quarkus.runtime.Startup;
+import jakarta.annotation.PostConstruct;
+import jakarta.enterprise.context.ApplicationScoped;
+import jakarta.enterprise.inject.Instance;
+import jakarta.enterprise.inject.Produces;
+import jakarta.inject.Inject;
import lombok.NonNull;
import net.dv8tion.jda.api.OnlineStatus;
+import net.dv8tion.jda.api.hooks.ListenerAdapter;
import net.dv8tion.jda.api.requests.GatewayIntent;
import net.dv8tion.jda.api.requests.RestConfig;
import net.dv8tion.jda.api.sharding.DefaultShardManagerBuilder;
@@ -25,23 +16,43 @@
import net.dv8tion.jda.api.utils.ChunkingFilter;
import net.dv8tion.jda.api.utils.MemberCachePolicy;
import net.dv8tion.jda.api.utils.cache.CacheFlag;
-import org.jetbrains.annotations.ApiStatus;
+import org.eclipse.microprofile.config.inject.ConfigProperty;
import org.jspecify.annotations.Nullable;
-import java.util.concurrent.ExecutorService;
-
-/**
- * A wrapper over {@link DefaultShardManagerBuilder} configured with defaults
- */
+@ApplicationScoped
+@Startup
public class BootstrapService {
- private final @NonNull DefaultShardManagerBuilder builder;
-
- public BootstrapService(@NonNull String token) {
- builder = DefaultShardManagerBuilder.createDefault(token);
+ private final @NonNull String discordToken;
+ private final @NonNull Integer minShardId;
+ private final @NonNull Integer maxShardId;
+ private final @NonNull Integer totalShards;
+ private final @Nullable String twilightHttpProxyUrl;
+ private final @NonNull Instance listeners;
+
+ private ShardManager shardManager;
+
+ @Inject
+ public BootstrapService(
+ @ConfigProperty(name = "discord.token") @NonNull String discordToken,
+ @ConfigProperty(name = "min.shard.id", defaultValue = "0") @NonNull Integer minShardId,
+ @ConfigProperty(name = "max.shard.id", defaultValue = "0") @NonNull Integer maxShardId,
+ @ConfigProperty(name = "total.shards", defaultValue = "1") @NonNull Integer totalShards,
+ @ConfigProperty(name = "twilight.http.proxy.url") @Nullable String twilightHttpProxyUrl,
+ @NonNull Instance listeners
+ ) {
+ this.discordToken = discordToken;
+ this.minShardId = minShardId;
+ this.maxShardId = maxShardId;
+ this.totalShards = totalShards;
+ this.twilightHttpProxyUrl = twilightHttpProxyUrl;
+ this.listeners = listeners;
}
- public BootstrapService applyRecommendedPreset() {
+ @PostConstruct
+ void login() {
+
+ DefaultShardManagerBuilder builder = DefaultShardManagerBuilder.createDefault(discordToken);
builder.enableIntents(GatewayIntent.SCHEDULED_EVENTS,
GatewayIntent.AUTO_MODERATION_EXECUTION,
@@ -67,86 +78,38 @@ public BootstrapService applyRecommendedPreset() {
);
// chunk all guilds
builder.setChunkingFilter(ChunkingFilter.ALL);
- return this;
- }
-
- public BootstrapService applyDefaultStatus() {
+ // set status
builder.setStatus(OnlineStatus.ONLINE);
- return this;
- }
- public BootstrapService applyPreBuildEventListeners(
- @NonNull ExecutorService vThreadPool,
- @NonNull AuditLogRegistrationClient auditLogRegistrationClient,
- @NonNull MessageLogRegistrationClient messageLogRegistrationClient,
- @NonNull MessageLogContentClient messageLogContentClient
- ) {
-
- builder.addEventListeners(
+ // add listeners
+ listeners.forEach(builder::addEventListeners);
- new AuditLogSetupCommandListener(auditLogRegistrationClient),
- new AuditLogEventListener(auditLogRegistrationClient, vThreadPool),
+ // add shards
+ builder.setShardsTotal(totalShards);
+ builder.setShards(minShardId, maxShardId);
- new MessageLogSetupCommandListener(messageLogRegistrationClient),
- new MessageLogListener(messageLogRegistrationClient, messageLogContentClient, vThreadPool),
+ // add custom twilight http proxy url if present
+ // note the current implementation only changes the proxy
+ // JDA's internal rate limit logic still applies on top of the proxy
+ // you need to provide a custom RestRateLimiter config
+ if (twilightHttpProxyUrl != null) {
+ builder.setRestConfig(new RestConfig().setBaseUrl(twilightHttpProxyUrl));
+ }
- new GuildVoiceEventListener(auditLogRegistrationClient, vThreadPool),
- new GuildMemberJoinAndLeaveEventListener(auditLogRegistrationClient, vThreadPool),
- new GuildPollEventListener(auditLogRegistrationClient, vThreadPool),
- new GuildBoostEventListener(auditLogRegistrationClient, vThreadPool),
- new SelfKickListener(auditLogRegistrationClient, messageLogRegistrationClient, vThreadPool),
+ // build shard manager and login
+ shardManager = builder.build();
- new ServerStatCommandListener(),
- new BotSetupInstructionCommandListener(),
- new DebugCommandListener(vThreadPool, auditLogRegistrationClient, messageLogRegistrationClient),
- new SlashCommandRegistrationListener()
- );
- return this;
}
- public BootstrapService applySharding(@Nullable String minShardId, @Nullable String maxShardId, @Nullable String totalShards) {
-
- // default to single shards in case of nulls (allows for easier user config)
- // only advanced users who know what they are doing should care about sharding
- if (minShardId == null || maxShardId == null || totalShards == null) {
- builder
- .setShardsTotal(1)
- .setShards(0, 0);
- } else {
- builder
- .setShardsTotal(Integer.parseInt(totalShards))
- .setShards(Integer.parseInt(minShardId), Integer.parseInt(maxShardId));
- }
- return this;
- }
+ @Produces
+ @ApplicationScoped
+ ShardManager shardManager() {
- /**
- *
- * Allows you to use provide a custom proxy server address that will
- * change the base of all routes from {@code discord.com} to {@code baseUrl}
- *
- *
- * Can be used with Twilight HTTP Proxy
- * to enforce a synchronization of the global rate limit across
- * multiple processes/instances of the bot
- *
- *
- * @param baseUrl in the form of {@code host:port}. No config is applied if the baseUrl is null or blank
- * @return the {@link BootstrapService} instance. Useful for chaining.
- */
- @ApiStatus.Experimental
- public BootstrapService applyProxyConfig(@Nullable String baseUrl) {
-
- if (baseUrl == null || baseUrl.isBlank())
- return this;
-
- builder.setRestConfig(new RestConfig().setBaseUrl(baseUrl));
- return this;
- }
+ if (shardManager == null)
+ throw new IllegalStateException("ShardManager requested before it was available");
- public ShardManager start() {
- return builder.build();
+ return shardManager;
}
}
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/main/Start.java b/src/main/java/io/github/eggy03/papertrail/bot/main/Start.java
index b5a4a45..3a0098a 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/main/Start.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/main/Start.java
@@ -1,50 +1,11 @@
package io.github.eggy03.papertrail.bot.main;
-import io.github.eggy03.papertrail.bot.listeners.misc.ActivityUpdateListener;
-import io.github.eggy03.papertrail.bot.utils.EnvConfig;
-import io.github.eggy03.papertrail.sdk.client.AuditLogRegistrationClient;
-import io.github.eggy03.papertrail.sdk.client.MessageLogContentClient;
-import io.github.eggy03.papertrail.sdk.client.MessageLogRegistrationClient;
-import net.dv8tion.jda.api.sharding.ShardManager;
+import io.quarkus.runtime.Quarkus;
+import io.quarkus.runtime.annotations.QuarkusMain;
-import java.util.Objects;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-
-/*
- * The main class of the bot
- */
+@QuarkusMain
public class Start {
-
- static void main() {
-
- // get env vars
- final String token = Objects.requireNonNull(EnvConfig.get("TOKEN"), "Discord Token cannot be null");
- final String papertrailApiBaseUrl = Objects.requireNonNull(EnvConfig.get("API_URL"), "PaperTrail API URL cannot be null");
- final String minShardId = EnvConfig.get("MIN_SHARD_ID"); // min for this instance
- final String maxShardId = EnvConfig.get("MAX_SHARD_ID"); // max for this instance
- final String totalShards = EnvConfig.get("TOTAL_SHARDS"); // total shards for all instances
- final String customBaseUrlProxy = EnvConfig.get("PROXY_URL"); // custom proxy url for the rate limited twilight discord http proxy
-
- // set v-thread pools for listeners
- final ExecutorService vThreadPool = Executors.newVirtualThreadPerTaskExecutor();
-
- // initialize SDK clients to call papertrail API service
- final AuditLogRegistrationClient auditLogRegistrationClient = new AuditLogRegistrationClient(papertrailApiBaseUrl);
- final MessageLogRegistrationClient messageLogRegistrationClient = new MessageLogRegistrationClient(papertrailApiBaseUrl);
- final MessageLogContentClient messageLogContentClient = new MessageLogContentClient(papertrailApiBaseUrl);
-
- // boostrap the bot
- ShardManager manager = new BootstrapService(token)
- .applyRecommendedPreset()
- .applyDefaultStatus()
- .applyPreBuildEventListeners(vThreadPool, auditLogRegistrationClient, messageLogRegistrationClient, messageLogContentClient)
- .applySharding(minShardId, maxShardId, totalShards)
- .applyProxyConfig(customBaseUrlProxy)
- .start();
-
- // post build listeners that require a fully built shard manager
- manager.addEventListener(new ActivityUpdateListener(manager));
+ static void main(String... args) {
+ Quarkus.run(args);
}
-
}
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/utils/EnvConfig.java b/src/main/java/io/github/eggy03/papertrail/bot/utils/EnvConfig.java
deleted file mode 100644
index 9064d40..0000000
--- a/src/main/java/io/github/eggy03/papertrail/bot/utils/EnvConfig.java
+++ /dev/null
@@ -1,24 +0,0 @@
-package io.github.eggy03.papertrail.bot.utils;
-
-import io.github.cdimascio.dotenv.Dotenv;
-import lombok.NonNull;
-import lombok.experimental.UtilityClass;
-import org.jspecify.annotations.Nullable;
-
-@UtilityClass
-public class EnvConfig {
-
- @NonNull
- private static final Dotenv dotenv = Dotenv.configure().ignoreIfMalformed().ignoreIfMissing().load();
-
- @Nullable
- public static String get(@NonNull String key) {
-
- String value = dotenv.get(key);
- if (value != null) {
- return value;
- }
-
- return System.getenv(key);
- }
-}
diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties
new file mode 100644
index 0000000..475cdbf
--- /dev/null
+++ b/src/main/resources/application.properties
@@ -0,0 +1,16 @@
+# Token
+discord.token=${TOKEN}
+# PaperTrail API URL
+api.url=${API_URL}
+# Shard Config
+min.shard.id=${MIN_SHARD_ID}
+max.shard.id=${MAX_SHARD_ID}
+total.shards=${TOTAL_SHARDS}
+# Twilight HTTP Proxy URL
+twilight.http.proxy.url=${TWILIGHT_HTTP_PROXY_URL}
+# Logging Level
+quarkus.log.level=INFO
+# Analytics
+quarkus.analytics.disabled=true
+# Banner
+quarkus.banner.path=banner.txt
\ No newline at end of file
diff --git a/src/main/resources/banner.txt b/src/main/resources/banner.txt
new file mode 100644
index 0000000..cb67b82
--- /dev/null
+++ b/src/main/resources/banner.txt
@@ -0,0 +1,8 @@
+ _____ _______ _ _
+ | __ \ |__ __| (_) |
+ | |__) |_ _ _ __ ___ _ __| |_ __ __ _ _| |
+ | ___/ _` | '_ \ / _ \ '__| | '__/ _` | | |
+ | | | (_| | |_) | __/ | | | | | (_| | | |
+ |_| \__,_| .__/ \___|_| |_|_| \__,_|_|_|
+ | |
+ |_|
\ No newline at end of file
diff --git a/src/main/resources/tinylog.properties b/src/main/resources/tinylog.properties
deleted file mode 100644
index a9bf9fa..0000000
--- a/src/main/resources/tinylog.properties
+++ /dev/null
@@ -1,4 +0,0 @@
-writer=console
-writer.format={level}: {class}.{method}()\n{message}
-writer.level=info
-writingthread=true
\ No newline at end of file
From 4145be529857a153531d55acfe3163e8361fcb34 Mon Sep 17 00:00:00 2001
From: Egg-03 <111327101+eggy03@users.noreply.github.com>
Date: Fri, 29 May 2026 10:15:20 +0530
Subject: [PATCH 03/66] refactor(config): move default values to
`application.properties`
- Move default configuration values to `application.properties`
- Update `BootstrapService.java` to check if proxy URL is blank instead of null
Signed-off-by: Egg-03 <111327101+eggy03@users.noreply.github.com>
---
.../papertrail/bot/main/BootstrapService.java | 13 ++++++-------
src/main/resources/application.properties | 9 +++++----
2 files changed, 11 insertions(+), 11 deletions(-)
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/main/BootstrapService.java b/src/main/java/io/github/eggy03/papertrail/bot/main/BootstrapService.java
index 722414d..27b4f70 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/main/BootstrapService.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/main/BootstrapService.java
@@ -17,7 +17,6 @@
import net.dv8tion.jda.api.utils.MemberCachePolicy;
import net.dv8tion.jda.api.utils.cache.CacheFlag;
import org.eclipse.microprofile.config.inject.ConfigProperty;
-import org.jspecify.annotations.Nullable;
@ApplicationScoped
@Startup
@@ -27,7 +26,7 @@ public class BootstrapService {
private final @NonNull Integer minShardId;
private final @NonNull Integer maxShardId;
private final @NonNull Integer totalShards;
- private final @Nullable String twilightHttpProxyUrl;
+ private final @NonNull String twilightHttpProxyUrl;
private final @NonNull Instance listeners;
private ShardManager shardManager;
@@ -35,10 +34,10 @@ public class BootstrapService {
@Inject
public BootstrapService(
@ConfigProperty(name = "discord.token") @NonNull String discordToken,
- @ConfigProperty(name = "min.shard.id", defaultValue = "0") @NonNull Integer minShardId,
- @ConfigProperty(name = "max.shard.id", defaultValue = "0") @NonNull Integer maxShardId,
- @ConfigProperty(name = "total.shards", defaultValue = "1") @NonNull Integer totalShards,
- @ConfigProperty(name = "twilight.http.proxy.url") @Nullable String twilightHttpProxyUrl,
+ @ConfigProperty(name = "min.shard.id") @NonNull Integer minShardId,
+ @ConfigProperty(name = "max.shard.id") @NonNull Integer maxShardId,
+ @ConfigProperty(name = "total.shards") @NonNull Integer totalShards,
+ @ConfigProperty(name = "twilight.http.proxy.url") @NonNull String twilightHttpProxyUrl,
@NonNull Instance listeners
) {
this.discordToken = discordToken;
@@ -93,7 +92,7 @@ void login() {
// note the current implementation only changes the proxy
// JDA's internal rate limit logic still applies on top of the proxy
// you need to provide a custom RestRateLimiter config
- if (twilightHttpProxyUrl != null) {
+ if (!twilightHttpProxyUrl.isBlank()) { // don't use isEmpty cause default value is a whitespace
builder.setRestConfig(new RestConfig().setBaseUrl(twilightHttpProxyUrl));
}
diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties
index 475cdbf..446ca3d 100644
--- a/src/main/resources/application.properties
+++ b/src/main/resources/application.properties
@@ -3,11 +3,12 @@ discord.token=${TOKEN}
# PaperTrail API URL
api.url=${API_URL}
# Shard Config
-min.shard.id=${MIN_SHARD_ID}
-max.shard.id=${MAX_SHARD_ID}
-total.shards=${TOTAL_SHARDS}
+min.shard.id=${MIN_SHARD_ID:0}
+max.shard.id=${MAX_SHARD_ID:0}
+total.shards=${TOTAL_SHARDS:1}
# Twilight HTTP Proxy URL
-twilight.http.proxy.url=${TWILIGHT_HTTP_PROXY_URL}
+# default value is a whitespace
+twilight.http.proxy.url=${TWILIGHT_HTTP_PROXY_URL: }
# Logging Level
quarkus.log.level=INFO
# Analytics
From adb18fe5feb3ae0700fd1bfb7f26b0981926f38d Mon Sep 17 00:00:00 2001
From: Egg-03 <111327101+eggy03@users.noreply.github.com>
Date: Fri, 29 May 2026 10:48:28 +0530
Subject: [PATCH 04/66] refactor: remove deprecated StackWalkerUtils and its
references
- Delete the deprecated `StackWalkerUtils.java` file
- Remove obsolete comments referencing `StackWalkerUtils` in helper utility classes
Signed-off-by: Egg-03 <111327101+eggy03@users.noreply.github.com>
---
.../helper/automod/utils/AutoModUtils.java | 6 ----
.../helper/channel/utils/ChannelUtils.java | 5 ----
.../helper/guild/utils/GuildUtils.java | 5 ----
.../helper/member/utils/MemberUtils.java | 5 ----
.../auditlog/helper/role/utils/RoleUtils.java | 5 ----
.../utils/ScheduledEventUtils.java | 5 ----
.../soundboard/utils/SoundboardUtils.java | 5 ----
.../helper/stage/utils/StageUtils.java | 5 ----
.../helper/thread/utils/ThreadUtils.java | 5 ----
.../bot/utils/StackWalkerUtils.java | 28 -------------------
10 files changed, 74 deletions(-)
delete mode 100644 src/main/java/io/github/eggy03/papertrail/bot/utils/StackWalkerUtils.java
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/automod/utils/AutoModUtils.java b/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/automod/utils/AutoModUtils.java
index c83f3b9..1ce238f 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/automod/utils/AutoModUtils.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/automod/utils/AutoModUtils.java
@@ -8,12 +8,6 @@
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
-
-/*
- * See {@link io.github.eggy03.papertrail.bot.utils.StackWalkerUtils}
- * and other utilities in the util package
- * to know why logging isn't needed here
- */
@UtilityClass
public class AutoModUtils {
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/channel/utils/ChannelUtils.java b/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/channel/utils/ChannelUtils.java
index 25f3a7a..f039a4e 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/channel/utils/ChannelUtils.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/channel/utils/ChannelUtils.java
@@ -14,11 +14,6 @@
import java.util.EnumSet;
-/*
- * See {@link io.github.eggy03.papertrail.bot.utils.StackWalkerUtils}
- * and other utilities in the util package
- * to know why logging isn't needed in some of the methods here
- */
@UtilityClass
@Slf4j
public class ChannelUtils {
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/guild/utils/GuildUtils.java b/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/guild/utils/GuildUtils.java
index c5d0a7b..6fbb6be 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/guild/utils/GuildUtils.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/guild/utils/GuildUtils.java
@@ -11,11 +11,6 @@
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
-/*
- * See {@link io.github.eggy03.papertrail.bot.utils.StackWalkerUtils}
- * and other utilities in the util package
- * to know why logging isn't needed in some of the methods here
- */
@UtilityClass
public class GuildUtils {
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/member/utils/MemberUtils.java b/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/member/utils/MemberUtils.java
index 8b86170..d7451fd 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/member/utils/MemberUtils.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/member/utils/MemberUtils.java
@@ -14,11 +14,6 @@
import java.util.Objects;
import java.util.stream.Collectors;
-/*
- * See {@link io.github.eggy03.papertrail.bot.utils.StackWalkerUtils}
- * and other utilities in the util package
- * to know why logging isn't needed in some of the methods here
- */
@UtilityClass
@Slf4j
public class MemberUtils {
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/role/utils/RoleUtils.java b/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/role/utils/RoleUtils.java
index f340d13..a291126 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/role/utils/RoleUtils.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/role/utils/RoleUtils.java
@@ -12,11 +12,6 @@
import java.util.IllegalFormatException;
import java.util.Map;
-/*
- * See {@link io.github.eggy03.papertrail.bot.utils.StackWalkerUtils}
- * and other utilities in the util package
- * to know why logging isn't needed in some of the methods here
- */
@UtilityClass
@Slf4j
public class RoleUtils {
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/scheduledevent/utils/ScheduledEventUtils.java b/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/scheduledevent/utils/ScheduledEventUtils.java
index d15a4fb..39843ad 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/scheduledevent/utils/ScheduledEventUtils.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/scheduledevent/utils/ScheduledEventUtils.java
@@ -10,11 +10,6 @@
import java.util.Map;
-/*
- * See {@link io.github.eggy03.papertrail.bot.utils.StackWalkerUtils}
- * and other utilities in the util package
- * to know why logging isn't needed in some of the methods here
- */
@UtilityClass
@Slf4j
public class ScheduledEventUtils {
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/soundboard/utils/SoundboardUtils.java b/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/soundboard/utils/SoundboardUtils.java
index 17f8bca..e50fd6a 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/soundboard/utils/SoundboardUtils.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/soundboard/utils/SoundboardUtils.java
@@ -7,11 +7,6 @@
import java.math.RoundingMode;
-/*
- * See {@link io.github.eggy03.papertrail.bot.utils.StackWalkerUtils}
- * and other utilities in the util package
- * to know why logging isn't needed in some of the methods here
- */
@UtilityClass
public class SoundboardUtils {
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/stage/utils/StageUtils.java b/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/stage/utils/StageUtils.java
index 8994b97..85f9716 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/stage/utils/StageUtils.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/stage/utils/StageUtils.java
@@ -6,11 +6,6 @@
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
-/*
- * See {@link io.github.eggy03.papertrail.bot.utils.StackWalkerUtils}
- * and other utilities in the util package
- * to know why logging isn't needed in some of the methods here
- */
@UtilityClass
public class StageUtils {
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/thread/utils/ThreadUtils.java b/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/thread/utils/ThreadUtils.java
index 8fe2cb5..5d16167 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/thread/utils/ThreadUtils.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/thread/utils/ThreadUtils.java
@@ -7,11 +7,6 @@
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
-/*
- * See {@link io.github.eggy03.papertrail.bot.utils.StackWalkerUtils}
- * and other utilities in the util package
- * to know why logging isn't needed in some of the methods here
- */
@UtilityClass
public class ThreadUtils {
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/utils/StackWalkerUtils.java b/src/main/java/io/github/eggy03/papertrail/bot/utils/StackWalkerUtils.java
deleted file mode 100644
index 1537cd4..0000000
--- a/src/main/java/io/github/eggy03/papertrail/bot/utils/StackWalkerUtils.java
+++ /dev/null
@@ -1,28 +0,0 @@
-package io.github.eggy03.papertrail.bot.utils;
-
-import lombok.experimental.UtilityClass;
-import org.jetbrains.annotations.NotNull;
-
-import java.util.stream.Collectors;
-
-@UtilityClass
-@Deprecated(forRemoval = true)
-@SuppressWarnings({"java:S1123", "java:S1133"})
-public class StackWalkerUtils {
-
- private static final StackWalker STACK_WALKER = StackWalker.getInstance(StackWalker.Option.RETAIN_CLASS_REFERENCE);
-
- // will show call hierarchies
- @NotNull
- @Deprecated(forRemoval = true)
- public static String getCallHierarchy() {
- return STACK_WALKER.walk(frames -> frames
- .skip(1)
- .limit(3)
- .map(frame -> frame.getDeclaringClass().getSimpleName() +
- "#" + frame.getMethodName() +
- ":" + frame.getLineNumber()
- ).collect(Collectors.joining(" -> "))
- );
- }
-}
From b1299ef334a508bf0ce60d5acd2c1916fddf636f Mon Sep 17 00:00:00 2001
From: Egg-03 <111327101+eggy03@users.noreply.github.com>
Date: Fri, 29 May 2026 10:50:15 +0530
Subject: [PATCH 05/66] refactor(misc-listeners): use CDI annotations and
virtual threads
- Add `@ApplicationScoped` and `@Inject` to listener classes
- Replace manual `Executor` with `@RunOnVirtualThread` in `SelfKickListener`
- Remove unused imports and comments
Signed-off-by: Egg-03 <111327101+eggy03@users.noreply.github.com>
---
.../misc/ActivityUpdateListener.java | 13 ++++++----
.../bot/listeners/misc/SelfKickListener.java | 25 +++++++++++--------
.../SlashCommandRegistrationListener.java | 2 ++
3 files changed, 24 insertions(+), 16 deletions(-)
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/misc/ActivityUpdateListener.java b/src/main/java/io/github/eggy03/papertrail/bot/listeners/misc/ActivityUpdateListener.java
index 5198a72..cc59daf 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/misc/ActivityUpdateListener.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/listeners/misc/ActivityUpdateListener.java
@@ -1,8 +1,9 @@
package io.github.eggy03.papertrail.bot.listeners.misc;
import io.github.eggy03.papertrail.bot.constant.ProjectInfo;
+import jakarta.enterprise.context.ApplicationScoped;
+import jakarta.inject.Inject;
import lombok.NonNull;
-import lombok.RequiredArgsConstructor;
import net.dv8tion.jda.api.entities.Activity;
import net.dv8tion.jda.api.events.guild.GuildJoinEvent;
import net.dv8tion.jda.api.events.guild.GuildLeaveEvent;
@@ -10,15 +11,17 @@
import net.dv8tion.jda.api.hooks.ListenerAdapter;
import net.dv8tion.jda.api.sharding.ShardManager;
-/*
- * This class updates the number of servers the bot is in
- */
-@RequiredArgsConstructor
+@ApplicationScoped
public class ActivityUpdateListener extends ListenerAdapter {
@NonNull
private final ShardManager manager;
+ @Inject
+ public ActivityUpdateListener(@NonNull ShardManager manager) {
+ this.manager = manager;
+ }
+
@Override
public void onReady(@NonNull ReadyEvent event) { // update on cold start
updateActivity();
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/misc/SelfKickListener.java b/src/main/java/io/github/eggy03/papertrail/bot/listeners/misc/SelfKickListener.java
index 34f20b7..16e4aa5 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/misc/SelfKickListener.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/listeners/misc/SelfKickListener.java
@@ -2,18 +2,19 @@
import io.github.eggy03.papertrail.sdk.client.AuditLogRegistrationClient;
import io.github.eggy03.papertrail.sdk.client.MessageLogRegistrationClient;
+import io.smallrye.common.annotation.Blocking;
+import io.smallrye.common.annotation.RunOnVirtualThread;
+import jakarta.enterprise.context.ApplicationScoped;
+import jakarta.inject.Inject;
import lombok.NonNull;
-import lombok.RequiredArgsConstructor;
import net.dv8tion.jda.api.entities.Guild;
import net.dv8tion.jda.api.events.guild.GuildLeaveEvent;
import net.dv8tion.jda.api.hooks.ListenerAdapter;
-import java.util.concurrent.Executor;
-
/*
* This class will have methods that unregister the log channels from the database after the bot has been kicked
*/
-@RequiredArgsConstructor
+@ApplicationScoped
public class SelfKickListener extends ListenerAdapter {
@NonNull
@@ -22,16 +23,18 @@ public class SelfKickListener extends ListenerAdapter {
@NonNull
private final MessageLogRegistrationClient messageLogRegistrationClient;
- @NonNull
- private final Executor vThreadPool;
+ @Inject
+ public SelfKickListener(@NonNull AuditLogRegistrationClient auditLogRegistrationClient, @NonNull MessageLogRegistrationClient messageLogRegistrationClient) {
+ this.auditLogRegistrationClient = auditLogRegistrationClient;
+ this.messageLogRegistrationClient = messageLogRegistrationClient;
+ }
@Override
+ @Blocking
+ @RunOnVirtualThread
public void onGuildLeave(@NonNull GuildLeaveEvent event) {
-
Guild leftGuild = event.getGuild();
- vThreadPool.execute(() -> {
- auditLogRegistrationClient.deleteRegisteredGuild(leftGuild.getId());
- messageLogRegistrationClient.deleteRegisteredGuild(leftGuild.getId());
- });
+ auditLogRegistrationClient.deleteRegisteredGuild(leftGuild.getId());
+ messageLogRegistrationClient.deleteRegisteredGuild(leftGuild.getId());
}
}
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/misc/SlashCommandRegistrationListener.java b/src/main/java/io/github/eggy03/papertrail/bot/listeners/misc/SlashCommandRegistrationListener.java
index ddf479f..66643c4 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/misc/SlashCommandRegistrationListener.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/listeners/misc/SlashCommandRegistrationListener.java
@@ -1,5 +1,6 @@
package io.github.eggy03.papertrail.bot.listeners.misc;
+import jakarta.enterprise.context.ApplicationScoped;
import lombok.NonNull;
import net.dv8tion.jda.api.JDA;
import net.dv8tion.jda.api.events.session.ReadyEvent;
@@ -13,6 +14,7 @@
/*
* Registers all the slash commands places throughout the code on startup
*/
+@ApplicationScoped
public class SlashCommandRegistrationListener extends ListenerAdapter {
@Override
From f93d480ac0350590eddf566136385c02260a6a5b Mon Sep 17 00:00:00 2001
From: Egg-03 <111327101+eggy03@users.noreply.github.com>
Date: Fri, 29 May 2026 10:58:29 +0530
Subject: [PATCH 06/66] refactor: move main classes to parent bot package
Signed-off-by: Egg-03 <111327101+eggy03@users.noreply.github.com>
---
.../eggy03/papertrail/bot/{main => }/BootstrapService.java | 2 +-
.../java/io/github/eggy03/papertrail/bot/{main => }/Start.java | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
rename src/main/java/io/github/eggy03/papertrail/bot/{main => }/BootstrapService.java (98%)
rename src/main/java/io/github/eggy03/papertrail/bot/{main => }/Start.java (80%)
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/main/BootstrapService.java b/src/main/java/io/github/eggy03/papertrail/bot/BootstrapService.java
similarity index 98%
rename from src/main/java/io/github/eggy03/papertrail/bot/main/BootstrapService.java
rename to src/main/java/io/github/eggy03/papertrail/bot/BootstrapService.java
index 27b4f70..bdd4186 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/main/BootstrapService.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/BootstrapService.java
@@ -1,4 +1,4 @@
-package io.github.eggy03.papertrail.bot.main;
+package io.github.eggy03.papertrail.bot;
import io.quarkus.runtime.Startup;
import jakarta.annotation.PostConstruct;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/main/Start.java b/src/main/java/io/github/eggy03/papertrail/bot/Start.java
similarity index 80%
rename from src/main/java/io/github/eggy03/papertrail/bot/main/Start.java
rename to src/main/java/io/github/eggy03/papertrail/bot/Start.java
index 3a0098a..c03e72f 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/main/Start.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/Start.java
@@ -1,4 +1,4 @@
-package io.github.eggy03.papertrail.bot.main;
+package io.github.eggy03.papertrail.bot;
import io.quarkus.runtime.Quarkus;
import io.quarkus.runtime.annotations.QuarkusMain;
From 61a8b39a8318e9c5aaeb503d1562de5795f3993e Mon Sep 17 00:00:00 2001
From: Egg-03 <111327101+eggy03@users.noreply.github.com>
Date: Fri, 29 May 2026 11:16:54 +0530
Subject: [PATCH 07/66] refactor: reorganize package structure for listeners
and helpers
- Move helper classes from `listeners` to `service` package
- Flatten listener packages by removing nested subdirectories
- Update package declarations and imports across affected files
- Delete obsolete `package-info.java`
Signed-off-by: Egg-03 <111327101+eggy03@users.noreply.github.com>
---
...entListener.java => AuditLogListener.java} | 130 +++++++++---------
.../guild => }/GuildBoostEventListener.java | 8 +-
.../GuildMemberJoinAndLeaveEventListener.java | 6 +-
.../guild => }/GuildPollEventListener.java | 6 +-
.../guild => }/GuildVoiceEventListener.java | 4 +-
.../listeners/auditlogsupl/package-info.java | 12 --
.../command/AuditLogSetupCommandListener.java | 14 +-
.../command/DebugCommandListener.java | 2 +-
.../MessageLogSetupCommandListener.java | 16 +--
.../command/ServerStatCommandListener.java | 2 +-
.../{event => }/MessageLogListener.java | 20 +--
.../misc/ActivityUpdateListener.java | 4 +-
...utoModerationFlagToChannelEventHelper.java | 2 +-
...utoModerationMemberTimeoutEventHelper.java | 2 +-
...ModerationRuleBlockMessageEventHelper.java | 2 +-
.../AutoModerationRuleCreateEventHelper.java | 4 +-
.../AutoModerationRuleDeleteEventHelper.java | 2 +-
.../AutoModerationRuleUpdateEventHelper.java | 2 +-
.../auditlog}/automod/utils/AutoModUtils.java | 2 +-
.../auditlog}/bot/BotAddEventHelper.java | 2 +-
.../channel/ChannelCreateEventHelper.java | 4 +-
.../channel/ChannelDeleteEventHelper.java | 4 +-
.../ChannelOverrideCreateEventHelper.java | 4 +-
.../ChannelOverrideDeleteEventHelper.java | 4 +-
.../ChannelOverrideUpdateEventHelper.java | 4 +-
.../channel/ChannelUpdateEventHelper.java | 4 +-
.../VoiceChannelStatusDeleteEventHelper.java | 2 +-
.../VoiceChannelStatusUpdateEventHelper.java | 2 +-
.../auditlog}/channel/utils/ChannelUtils.java | 2 +-
.../emoji/EmojiCreateEventHelper.java | 2 +-
.../emoji/EmojiDeleteEventHelper.java | 2 +-
.../emoji/EmojiUpdateEventHelper.java | 2 +-
.../generic/GenericAuditLogEventHelper.java | 2 +-
.../guild/GuildProfileUpdateEventHelper.java | 2 +-
.../guild/GuildUpdateEventHelper.java | 4 +-
.../auditlog}/guild/utils/GuildUtils.java | 2 +-
.../HomeSettingsCreateEventHelper.java | 4 +-
.../HomeSettingsUpdateEventHelper.java | 2 +-
...ionCommandPrivilegesUpdateEventHelper.java | 2 +-
.../IntegrationCreateEventHelper.java | 2 +-
.../IntegrationDeleteEventHelper.java | 2 +-
.../invite/InviteCreateEventHelper.java | 4 +-
.../invite/InviteDeleteEventHelper.java | 4 +-
.../auditlog}/invite/utils/InviteUtils.java | 2 +-
.../member/MemberRoleUpdateEventHelper.java | 4 +-
.../member/MemberUpdateEventHelper.java | 2 +-
.../member/MemberVoiceKickEventHelper.java | 6 +-
.../member/MemberVoiceMoveEventHelper.java | 6 +-
.../auditlog}/member/utils/MemberUtils.java | 2 +-
.../message/MessagePinEventHelper.java | 4 +-
.../message/MessageUnpinEventHelper.java | 4 +-
.../auditlog}/message/utils/MessageUtils.java | 2 +-
.../auditlog}/modactions/BanEventHelper.java | 2 +-
.../auditlog}/modactions/KickEventHelper.java | 2 +-
.../modactions/UnbanEventHelper.java | 2 +-
.../OnboardingPromptCreateEventHelper.java | 2 +-
.../OnboardingPromptDeleteEventHelper.java | 2 +-
.../OnboardingPromptUpdateEventHelper.java | 2 +-
.../OnboardingUpdateEventHelper.java | 4 +-
.../onboarding/utils/OnboardingUtils.java | 2 +-
.../auditlog}/role/RoleCreateEventHelper.java | 2 +-
.../auditlog}/role/RoleDeleteEventHelper.java | 4 +-
.../auditlog}/role/RoleUpdateEventHelper.java | 4 +-
.../auditlog}/role/utils/RoleUtils.java | 2 +-
.../ScheduledEventCreateEventHelper.java | 4 +-
.../ScheduledEventDeleteEventHelper.java | 4 +-
.../ScheduledEventUpdateEventHelper.java | 4 +-
.../utils/ScheduledEventUtils.java | 2 +-
.../SoundboardSoundCreateEventHelper.java | 4 +-
.../SoundboardSoundDeleteEventHelper.java | 4 +-
.../SoundboardSoundUpdateEventHelper.java | 4 +-
.../soundboard/utils/SoundboardUtils.java | 2 +-
.../stage/StageInstanceCreateEventHelper.java | 4 +-
.../stage/StageInstanceDeleteEventHelper.java | 4 +-
.../stage/StageInstanceUpdateEventHelper.java | 4 +-
.../auditlog}/stage/utils/StageUtils.java | 2 +-
.../sticker/StickerCreateEventHelper.java | 4 +-
.../sticker/StickerDeleteEventHelper.java | 4 +-
.../sticker/StickerUpdateEventHelper.java | 4 +-
.../auditlog}/sticker/utils/StickerUtils.java | 12 +-
.../thread/ThreadCreateEventHelper.java | 6 +-
.../thread/ThreadDeleteEventHelper.java | 6 +-
.../thread/ThreadUpdateEventHelper.java | 6 +-
.../auditlog}/thread/utils/ThreadUtils.java | 2 +-
.../webhook/WebhookCreateEventHelper.java | 6 +-
.../webhook/WebhookRemoveEventHelper.java | 6 +-
.../webhook/WebhookUpdateEventHelper.java | 6 +-
.../auditlog}/webhook/utils/WebhookUtils.java | 2 +-
.../GuildMemberJoinEventHelper.java | 2 +-
.../GuildMemberRemoveEventHelper.java | 2 +-
...GuildMemberUpdateBoostTimeEventHelper.java | 2 +-
.../auditlogsupl}/GuildPollEventHelper.java | 2 +-
.../GuildUpdateBoostCountEventHelper.java | 2 +-
.../GuildUpdateBoostTierEventHelper.java | 2 +-
.../auditlogsupl}/GuildVoiceEventHelper.java | 2 +-
.../MessageLogMessageDeleteEventHelper.java | 2 +-
.../MessageLogMessageReceivedEventHelper.java | 2 +-
.../MessageLogMessageUpdateEventHelper.java | 2 +-
98 files changed, 242 insertions(+), 254 deletions(-)
rename src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/{event/AuditLogEventListener.java => AuditLogListener.java} (56%)
rename src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlogsupl/{event/guild => }/GuildBoostEventListener.java (83%)
rename src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlogsupl/{event/guild => }/GuildMemberJoinAndLeaveEventListener.java (86%)
rename src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlogsupl/{event/guild => }/GuildPollEventListener.java (85%)
rename src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlogsupl/{event/guild => }/GuildVoiceEventListener.java (87%)
delete mode 100644 src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlogsupl/package-info.java
rename src/main/java/io/github/eggy03/papertrail/bot/listeners/messagelog/{event => }/MessageLogListener.java (80%)
rename src/main/java/io/github/eggy03/papertrail/bot/{listeners/auditlog/helper => service/auditlog}/automod/AutoModerationFlagToChannelEventHelper.java (96%)
rename src/main/java/io/github/eggy03/papertrail/bot/{listeners/auditlog/helper => service/auditlog}/automod/AutoModerationMemberTimeoutEventHelper.java (96%)
rename src/main/java/io/github/eggy03/papertrail/bot/{listeners/auditlog/helper => service/auditlog}/automod/AutoModerationRuleBlockMessageEventHelper.java (96%)
rename src/main/java/io/github/eggy03/papertrail/bot/{listeners/auditlog/helper => service/auditlog}/automod/AutoModerationRuleCreateEventHelper.java (94%)
rename src/main/java/io/github/eggy03/papertrail/bot/{listeners/auditlog/helper => service/auditlog}/automod/AutoModerationRuleDeleteEventHelper.java (96%)
rename src/main/java/io/github/eggy03/papertrail/bot/{listeners/auditlog/helper => service/auditlog}/automod/AutoModerationRuleUpdateEventHelper.java (96%)
rename src/main/java/io/github/eggy03/papertrail/bot/{listeners/auditlog/helper => service/auditlog}/automod/utils/AutoModUtils.java (93%)
rename src/main/java/io/github/eggy03/papertrail/bot/{listeners/auditlog/helper => service/auditlog}/bot/BotAddEventHelper.java (96%)
rename src/main/java/io/github/eggy03/papertrail/bot/{listeners/auditlog/helper => service/auditlog}/channel/ChannelCreateEventHelper.java (95%)
rename src/main/java/io/github/eggy03/papertrail/bot/{listeners/auditlog/helper => service/auditlog}/channel/ChannelDeleteEventHelper.java (92%)
rename src/main/java/io/github/eggy03/papertrail/bot/{listeners/auditlog/helper => service/auditlog}/channel/ChannelOverrideCreateEventHelper.java (95%)
rename src/main/java/io/github/eggy03/papertrail/bot/{listeners/auditlog/helper => service/auditlog}/channel/ChannelOverrideDeleteEventHelper.java (95%)
rename src/main/java/io/github/eggy03/papertrail/bot/{listeners/auditlog/helper => service/auditlog}/channel/ChannelOverrideUpdateEventHelper.java (96%)
rename src/main/java/io/github/eggy03/papertrail/bot/{listeners/auditlog/helper => service/auditlog}/channel/ChannelUpdateEventHelper.java (97%)
rename src/main/java/io/github/eggy03/papertrail/bot/{listeners/auditlog/helper => service/auditlog}/channel/VoiceChannelStatusDeleteEventHelper.java (96%)
rename src/main/java/io/github/eggy03/papertrail/bot/{listeners/auditlog/helper => service/auditlog}/channel/VoiceChannelStatusUpdateEventHelper.java (96%)
rename src/main/java/io/github/eggy03/papertrail/bot/{listeners/auditlog/helper => service/auditlog}/channel/utils/ChannelUtils.java (98%)
rename src/main/java/io/github/eggy03/papertrail/bot/{listeners/auditlog/helper => service/auditlog}/emoji/EmojiCreateEventHelper.java (96%)
rename src/main/java/io/github/eggy03/papertrail/bot/{listeners/auditlog/helper => service/auditlog}/emoji/EmojiDeleteEventHelper.java (96%)
rename src/main/java/io/github/eggy03/papertrail/bot/{listeners/auditlog/helper => service/auditlog}/emoji/EmojiUpdateEventHelper.java (96%)
rename src/main/java/io/github/eggy03/papertrail/bot/{listeners/auditlog/helper => service/auditlog}/generic/GenericAuditLogEventHelper.java (96%)
rename src/main/java/io/github/eggy03/papertrail/bot/{listeners/auditlog/helper => service/auditlog}/guild/GuildProfileUpdateEventHelper.java (97%)
rename src/main/java/io/github/eggy03/papertrail/bot/{listeners/auditlog/helper => service/auditlog}/guild/GuildUpdateEventHelper.java (97%)
rename src/main/java/io/github/eggy03/papertrail/bot/{listeners/auditlog/helper => service/auditlog}/guild/utils/GuildUtils.java (98%)
rename src/main/java/io/github/eggy03/papertrail/bot/{listeners/auditlog/helper => service/auditlog}/homesettings/HomeSettingsCreateEventHelper.java (94%)
rename src/main/java/io/github/eggy03/papertrail/bot/{listeners/auditlog/helper => service/auditlog}/homesettings/HomeSettingsUpdateEventHelper.java (96%)
rename src/main/java/io/github/eggy03/papertrail/bot/{listeners/auditlog/helper => service/auditlog}/integration/ApplicationCommandPrivilegesUpdateEventHelper.java (95%)
rename src/main/java/io/github/eggy03/papertrail/bot/{listeners/auditlog/helper => service/auditlog}/integration/IntegrationCreateEventHelper.java (96%)
rename src/main/java/io/github/eggy03/papertrail/bot/{listeners/auditlog/helper => service/auditlog}/integration/IntegrationDeleteEventHelper.java (96%)
rename src/main/java/io/github/eggy03/papertrail/bot/{listeners/auditlog/helper => service/auditlog}/invite/InviteCreateEventHelper.java (95%)
rename src/main/java/io/github/eggy03/papertrail/bot/{listeners/auditlog/helper => service/auditlog}/invite/InviteDeleteEventHelper.java (95%)
rename src/main/java/io/github/eggy03/papertrail/bot/{listeners/auditlog/helper => service/auditlog}/invite/utils/InviteUtils.java (97%)
rename src/main/java/io/github/eggy03/papertrail/bot/{listeners/auditlog/helper => service/auditlog}/member/MemberRoleUpdateEventHelper.java (94%)
rename src/main/java/io/github/eggy03/papertrail/bot/{listeners/auditlog/helper => service/auditlog}/member/MemberUpdateEventHelper.java (98%)
rename src/main/java/io/github/eggy03/papertrail/bot/{listeners/auditlog/helper => service/auditlog}/member/MemberVoiceKickEventHelper.java (88%)
rename src/main/java/io/github/eggy03/papertrail/bot/{listeners/auditlog/helper => service/auditlog}/member/MemberVoiceMoveEventHelper.java (87%)
rename src/main/java/io/github/eggy03/papertrail/bot/{listeners/auditlog/helper => service/auditlog}/member/utils/MemberUtils.java (94%)
rename src/main/java/io/github/eggy03/papertrail/bot/{listeners/auditlog/helper => service/auditlog}/message/MessagePinEventHelper.java (92%)
rename src/main/java/io/github/eggy03/papertrail/bot/{listeners/auditlog/helper => service/auditlog}/message/MessageUnpinEventHelper.java (92%)
rename src/main/java/io/github/eggy03/papertrail/bot/{listeners/auditlog/helper => service/auditlog}/message/utils/MessageUtils.java (94%)
rename src/main/java/io/github/eggy03/papertrail/bot/{listeners/auditlog/helper => service/auditlog}/modactions/BanEventHelper.java (96%)
rename src/main/java/io/github/eggy03/papertrail/bot/{listeners/auditlog/helper => service/auditlog}/modactions/KickEventHelper.java (96%)
rename src/main/java/io/github/eggy03/papertrail/bot/{listeners/auditlog/helper => service/auditlog}/modactions/UnbanEventHelper.java (96%)
rename src/main/java/io/github/eggy03/papertrail/bot/{listeners/auditlog/helper => service/auditlog}/onboarding/OnboardingPromptCreateEventHelper.java (97%)
rename src/main/java/io/github/eggy03/papertrail/bot/{listeners/auditlog/helper => service/auditlog}/onboarding/OnboardingPromptDeleteEventHelper.java (97%)
rename src/main/java/io/github/eggy03/papertrail/bot/{listeners/auditlog/helper => service/auditlog}/onboarding/OnboardingPromptUpdateEventHelper.java (97%)
rename src/main/java/io/github/eggy03/papertrail/bot/{listeners/auditlog/helper => service/auditlog}/onboarding/OnboardingUpdateEventHelper.java (95%)
rename src/main/java/io/github/eggy03/papertrail/bot/{listeners/auditlog/helper => service/auditlog}/onboarding/utils/OnboardingUtils.java (95%)
rename src/main/java/io/github/eggy03/papertrail/bot/{listeners/auditlog/helper => service/auditlog}/role/RoleCreateEventHelper.java (97%)
rename src/main/java/io/github/eggy03/papertrail/bot/{listeners/auditlog/helper => service/auditlog}/role/RoleDeleteEventHelper.java (95%)
rename src/main/java/io/github/eggy03/papertrail/bot/{listeners/auditlog/helper => service/auditlog}/role/RoleUpdateEventHelper.java (96%)
rename src/main/java/io/github/eggy03/papertrail/bot/{listeners/auditlog/helper => service/auditlog}/role/utils/RoleUtils.java (97%)
rename src/main/java/io/github/eggy03/papertrail/bot/{listeners/auditlog/helper => service/auditlog}/scheduledevent/ScheduledEventCreateEventHelper.java (94%)
rename src/main/java/io/github/eggy03/papertrail/bot/{listeners/auditlog/helper => service/auditlog}/scheduledevent/ScheduledEventDeleteEventHelper.java (94%)
rename src/main/java/io/github/eggy03/papertrail/bot/{listeners/auditlog/helper => service/auditlog}/scheduledevent/ScheduledEventUpdateEventHelper.java (95%)
rename src/main/java/io/github/eggy03/papertrail/bot/{listeners/auditlog/helper => service/auditlog}/scheduledevent/utils/ScheduledEventUtils.java (98%)
rename src/main/java/io/github/eggy03/papertrail/bot/{listeners/auditlog/helper => service/auditlog}/soundboard/SoundboardSoundCreateEventHelper.java (93%)
rename src/main/java/io/github/eggy03/papertrail/bot/{listeners/auditlog/helper => service/auditlog}/soundboard/SoundboardSoundDeleteEventHelper.java (93%)
rename src/main/java/io/github/eggy03/papertrail/bot/{listeners/auditlog/helper => service/auditlog}/soundboard/SoundboardSoundUpdateEventHelper.java (95%)
rename src/main/java/io/github/eggy03/papertrail/bot/{listeners/auditlog/helper => service/auditlog}/soundboard/utils/SoundboardUtils.java (86%)
rename src/main/java/io/github/eggy03/papertrail/bot/{listeners/auditlog/helper => service/auditlog}/stage/StageInstanceCreateEventHelper.java (93%)
rename src/main/java/io/github/eggy03/papertrail/bot/{listeners/auditlog/helper => service/auditlog}/stage/StageInstanceDeleteEventHelper.java (93%)
rename src/main/java/io/github/eggy03/papertrail/bot/{listeners/auditlog/helper => service/auditlog}/stage/StageInstanceUpdateEventHelper.java (94%)
rename src/main/java/io/github/eggy03/papertrail/bot/{listeners/auditlog/helper => service/auditlog}/stage/utils/StageUtils.java (90%)
rename src/main/java/io/github/eggy03/papertrail/bot/{listeners/auditlog/helper => service/auditlog}/sticker/StickerCreateEventHelper.java (95%)
rename src/main/java/io/github/eggy03/papertrail/bot/{listeners/auditlog/helper => service/auditlog}/sticker/StickerDeleteEventHelper.java (95%)
rename src/main/java/io/github/eggy03/papertrail/bot/{listeners/auditlog/helper => service/auditlog}/sticker/StickerUpdateEventHelper.java (95%)
rename src/main/java/io/github/eggy03/papertrail/bot/{listeners/auditlog/helper => service/auditlog}/sticker/utils/StickerUtils.java (79%)
rename src/main/java/io/github/eggy03/papertrail/bot/{listeners/auditlog/helper => service/auditlog}/thread/ThreadCreateEventHelper.java (93%)
rename src/main/java/io/github/eggy03/papertrail/bot/{listeners/auditlog/helper => service/auditlog}/thread/ThreadDeleteEventHelper.java (93%)
rename src/main/java/io/github/eggy03/papertrail/bot/{listeners/auditlog/helper => service/auditlog}/thread/ThreadUpdateEventHelper.java (95%)
rename src/main/java/io/github/eggy03/papertrail/bot/{listeners/auditlog/helper => service/auditlog}/thread/utils/ThreadUtils.java (89%)
rename src/main/java/io/github/eggy03/papertrail/bot/{listeners/auditlog/helper => service/auditlog}/webhook/WebhookCreateEventHelper.java (91%)
rename src/main/java/io/github/eggy03/papertrail/bot/{listeners/auditlog/helper => service/auditlog}/webhook/WebhookRemoveEventHelper.java (91%)
rename src/main/java/io/github/eggy03/papertrail/bot/{listeners/auditlog/helper => service/auditlog}/webhook/WebhookUpdateEventHelper.java (93%)
rename src/main/java/io/github/eggy03/papertrail/bot/{listeners/auditlog/helper => service/auditlog}/webhook/utils/WebhookUtils.java (90%)
rename src/main/java/io/github/eggy03/papertrail/bot/{listeners/auditlogsupl/helper/guild => service/auditlogsupl}/GuildMemberJoinEventHelper.java (96%)
rename src/main/java/io/github/eggy03/papertrail/bot/{listeners/auditlogsupl/helper/guild => service/auditlogsupl}/GuildMemberRemoveEventHelper.java (97%)
rename src/main/java/io/github/eggy03/papertrail/bot/{listeners/auditlogsupl/helper/guild => service/auditlogsupl}/GuildMemberUpdateBoostTimeEventHelper.java (96%)
rename src/main/java/io/github/eggy03/papertrail/bot/{listeners/auditlogsupl/helper/guild => service/auditlogsupl}/GuildPollEventHelper.java (97%)
rename src/main/java/io/github/eggy03/papertrail/bot/{listeners/auditlogsupl/helper/guild => service/auditlogsupl}/GuildUpdateBoostCountEventHelper.java (95%)
rename src/main/java/io/github/eggy03/papertrail/bot/{listeners/auditlogsupl/helper/guild => service/auditlogsupl}/GuildUpdateBoostTierEventHelper.java (96%)
rename src/main/java/io/github/eggy03/papertrail/bot/{listeners/auditlogsupl/helper/guild => service/auditlogsupl}/GuildVoiceEventHelper.java (97%)
rename src/main/java/io/github/eggy03/papertrail/bot/{listeners/messagelog/helper => service/messagelog}/MessageLogMessageDeleteEventHelper.java (97%)
rename src/main/java/io/github/eggy03/papertrail/bot/{listeners/messagelog/helper => service/messagelog}/MessageLogMessageReceivedEventHelper.java (90%)
rename src/main/java/io/github/eggy03/papertrail/bot/{listeners/messagelog/helper => service/messagelog}/MessageLogMessageUpdateEventHelper.java (98%)
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/event/AuditLogEventListener.java b/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/AuditLogListener.java
similarity index 56%
rename from src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/event/AuditLogEventListener.java
rename to src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/AuditLogListener.java
index c16d8c7..eab9b76 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/event/AuditLogEventListener.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/AuditLogListener.java
@@ -1,67 +1,67 @@
-package io.github.eggy03.papertrail.bot.listeners.auditlog.event;
-
-import io.github.eggy03.papertrail.bot.listeners.auditlog.helper.automod.AutoModerationFlagToChannelEventHelper;
-import io.github.eggy03.papertrail.bot.listeners.auditlog.helper.automod.AutoModerationMemberTimeoutEventHelper;
-import io.github.eggy03.papertrail.bot.listeners.auditlog.helper.automod.AutoModerationRuleBlockMessageEventHelper;
-import io.github.eggy03.papertrail.bot.listeners.auditlog.helper.automod.AutoModerationRuleCreateEventHelper;
-import io.github.eggy03.papertrail.bot.listeners.auditlog.helper.automod.AutoModerationRuleDeleteEventHelper;
-import io.github.eggy03.papertrail.bot.listeners.auditlog.helper.automod.AutoModerationRuleUpdateEventHelper;
-import io.github.eggy03.papertrail.bot.listeners.auditlog.helper.bot.BotAddEventHelper;
-import io.github.eggy03.papertrail.bot.listeners.auditlog.helper.channel.ChannelCreateEventHelper;
-import io.github.eggy03.papertrail.bot.listeners.auditlog.helper.channel.ChannelDeleteEventHelper;
-import io.github.eggy03.papertrail.bot.listeners.auditlog.helper.channel.ChannelOverrideCreateEventHelper;
-import io.github.eggy03.papertrail.bot.listeners.auditlog.helper.channel.ChannelOverrideDeleteEventHelper;
-import io.github.eggy03.papertrail.bot.listeners.auditlog.helper.channel.ChannelOverrideUpdateEventHelper;
-import io.github.eggy03.papertrail.bot.listeners.auditlog.helper.channel.ChannelUpdateEventHelper;
-import io.github.eggy03.papertrail.bot.listeners.auditlog.helper.channel.VoiceChannelStatusDeleteEventHelper;
-import io.github.eggy03.papertrail.bot.listeners.auditlog.helper.channel.VoiceChannelStatusUpdateEventHelper;
-import io.github.eggy03.papertrail.bot.listeners.auditlog.helper.emoji.EmojiCreateEventHelper;
-import io.github.eggy03.papertrail.bot.listeners.auditlog.helper.emoji.EmojiDeleteEventHelper;
-import io.github.eggy03.papertrail.bot.listeners.auditlog.helper.emoji.EmojiUpdateEventHelper;
-import io.github.eggy03.papertrail.bot.listeners.auditlog.helper.generic.GenericAuditLogEventHelper;
-import io.github.eggy03.papertrail.bot.listeners.auditlog.helper.guild.GuildProfileUpdateEventHelper;
-import io.github.eggy03.papertrail.bot.listeners.auditlog.helper.guild.GuildUpdateEventHelper;
-import io.github.eggy03.papertrail.bot.listeners.auditlog.helper.homesettings.HomeSettingsCreateEventHelper;
-import io.github.eggy03.papertrail.bot.listeners.auditlog.helper.homesettings.HomeSettingsUpdateEventHelper;
-import io.github.eggy03.papertrail.bot.listeners.auditlog.helper.integration.ApplicationCommandPrivilegesUpdateEventHelper;
-import io.github.eggy03.papertrail.bot.listeners.auditlog.helper.integration.IntegrationCreateEventHelper;
-import io.github.eggy03.papertrail.bot.listeners.auditlog.helper.integration.IntegrationDeleteEventHelper;
-import io.github.eggy03.papertrail.bot.listeners.auditlog.helper.invite.InviteCreateEventHelper;
-import io.github.eggy03.papertrail.bot.listeners.auditlog.helper.invite.InviteDeleteEventHelper;
-import io.github.eggy03.papertrail.bot.listeners.auditlog.helper.member.MemberRoleUpdateEventHelper;
-import io.github.eggy03.papertrail.bot.listeners.auditlog.helper.member.MemberUpdateEventHelper;
-import io.github.eggy03.papertrail.bot.listeners.auditlog.helper.member.MemberVoiceKickEventHelper;
-import io.github.eggy03.papertrail.bot.listeners.auditlog.helper.member.MemberVoiceMoveEventHelper;
-import io.github.eggy03.papertrail.bot.listeners.auditlog.helper.message.MessagePinEventHelper;
-import io.github.eggy03.papertrail.bot.listeners.auditlog.helper.message.MessageUnpinEventHelper;
-import io.github.eggy03.papertrail.bot.listeners.auditlog.helper.modactions.BanEventHelper;
-import io.github.eggy03.papertrail.bot.listeners.auditlog.helper.modactions.KickEventHelper;
-import io.github.eggy03.papertrail.bot.listeners.auditlog.helper.modactions.UnbanEventHelper;
-import io.github.eggy03.papertrail.bot.listeners.auditlog.helper.onboarding.OnboardingPromptCreateEventHelper;
-import io.github.eggy03.papertrail.bot.listeners.auditlog.helper.onboarding.OnboardingPromptDeleteEventHelper;
-import io.github.eggy03.papertrail.bot.listeners.auditlog.helper.onboarding.OnboardingPromptUpdateEventHelper;
-import io.github.eggy03.papertrail.bot.listeners.auditlog.helper.onboarding.OnboardingUpdateEventHelper;
-import io.github.eggy03.papertrail.bot.listeners.auditlog.helper.role.RoleCreateEventHelper;
-import io.github.eggy03.papertrail.bot.listeners.auditlog.helper.role.RoleDeleteEventHelper;
-import io.github.eggy03.papertrail.bot.listeners.auditlog.helper.role.RoleUpdateEventHelper;
-import io.github.eggy03.papertrail.bot.listeners.auditlog.helper.scheduledevent.ScheduledEventCreateEventHelper;
-import io.github.eggy03.papertrail.bot.listeners.auditlog.helper.scheduledevent.ScheduledEventDeleteEventHelper;
-import io.github.eggy03.papertrail.bot.listeners.auditlog.helper.scheduledevent.ScheduledEventUpdateEventHelper;
-import io.github.eggy03.papertrail.bot.listeners.auditlog.helper.soundboard.SoundboardSoundCreateEventHelper;
-import io.github.eggy03.papertrail.bot.listeners.auditlog.helper.soundboard.SoundboardSoundDeleteEventHelper;
-import io.github.eggy03.papertrail.bot.listeners.auditlog.helper.soundboard.SoundboardSoundUpdateEventHelper;
-import io.github.eggy03.papertrail.bot.listeners.auditlog.helper.stage.StageInstanceCreateEventHelper;
-import io.github.eggy03.papertrail.bot.listeners.auditlog.helper.stage.StageInstanceDeleteEventHelper;
-import io.github.eggy03.papertrail.bot.listeners.auditlog.helper.stage.StageInstanceUpdateEventHelper;
-import io.github.eggy03.papertrail.bot.listeners.auditlog.helper.sticker.StickerCreateEventHelper;
-import io.github.eggy03.papertrail.bot.listeners.auditlog.helper.sticker.StickerDeleteEventHelper;
-import io.github.eggy03.papertrail.bot.listeners.auditlog.helper.sticker.StickerUpdateEventHelper;
-import io.github.eggy03.papertrail.bot.listeners.auditlog.helper.thread.ThreadCreateEventHelper;
-import io.github.eggy03.papertrail.bot.listeners.auditlog.helper.thread.ThreadDeleteEventHelper;
-import io.github.eggy03.papertrail.bot.listeners.auditlog.helper.thread.ThreadUpdateEventHelper;
-import io.github.eggy03.papertrail.bot.listeners.auditlog.helper.webhook.WebhookCreateEventHelper;
-import io.github.eggy03.papertrail.bot.listeners.auditlog.helper.webhook.WebhookRemoveEventHelper;
-import io.github.eggy03.papertrail.bot.listeners.auditlog.helper.webhook.WebhookUpdateEventHelper;
+package io.github.eggy03.papertrail.bot.listeners.auditlog;
+
+import io.github.eggy03.papertrail.bot.service.auditlog.automod.AutoModerationFlagToChannelEventHelper;
+import io.github.eggy03.papertrail.bot.service.auditlog.automod.AutoModerationMemberTimeoutEventHelper;
+import io.github.eggy03.papertrail.bot.service.auditlog.automod.AutoModerationRuleBlockMessageEventHelper;
+import io.github.eggy03.papertrail.bot.service.auditlog.automod.AutoModerationRuleCreateEventHelper;
+import io.github.eggy03.papertrail.bot.service.auditlog.automod.AutoModerationRuleDeleteEventHelper;
+import io.github.eggy03.papertrail.bot.service.auditlog.automod.AutoModerationRuleUpdateEventHelper;
+import io.github.eggy03.papertrail.bot.service.auditlog.bot.BotAddEventHelper;
+import io.github.eggy03.papertrail.bot.service.auditlog.channel.ChannelCreateEventHelper;
+import io.github.eggy03.papertrail.bot.service.auditlog.channel.ChannelDeleteEventHelper;
+import io.github.eggy03.papertrail.bot.service.auditlog.channel.ChannelOverrideCreateEventHelper;
+import io.github.eggy03.papertrail.bot.service.auditlog.channel.ChannelOverrideDeleteEventHelper;
+import io.github.eggy03.papertrail.bot.service.auditlog.channel.ChannelOverrideUpdateEventHelper;
+import io.github.eggy03.papertrail.bot.service.auditlog.channel.ChannelUpdateEventHelper;
+import io.github.eggy03.papertrail.bot.service.auditlog.channel.VoiceChannelStatusDeleteEventHelper;
+import io.github.eggy03.papertrail.bot.service.auditlog.channel.VoiceChannelStatusUpdateEventHelper;
+import io.github.eggy03.papertrail.bot.service.auditlog.emoji.EmojiCreateEventHelper;
+import io.github.eggy03.papertrail.bot.service.auditlog.emoji.EmojiDeleteEventHelper;
+import io.github.eggy03.papertrail.bot.service.auditlog.emoji.EmojiUpdateEventHelper;
+import io.github.eggy03.papertrail.bot.service.auditlog.generic.GenericAuditLogEventHelper;
+import io.github.eggy03.papertrail.bot.service.auditlog.guild.GuildProfileUpdateEventHelper;
+import io.github.eggy03.papertrail.bot.service.auditlog.guild.GuildUpdateEventHelper;
+import io.github.eggy03.papertrail.bot.service.auditlog.homesettings.HomeSettingsCreateEventHelper;
+import io.github.eggy03.papertrail.bot.service.auditlog.homesettings.HomeSettingsUpdateEventHelper;
+import io.github.eggy03.papertrail.bot.service.auditlog.integration.ApplicationCommandPrivilegesUpdateEventHelper;
+import io.github.eggy03.papertrail.bot.service.auditlog.integration.IntegrationCreateEventHelper;
+import io.github.eggy03.papertrail.bot.service.auditlog.integration.IntegrationDeleteEventHelper;
+import io.github.eggy03.papertrail.bot.service.auditlog.invite.InviteCreateEventHelper;
+import io.github.eggy03.papertrail.bot.service.auditlog.invite.InviteDeleteEventHelper;
+import io.github.eggy03.papertrail.bot.service.auditlog.member.MemberRoleUpdateEventHelper;
+import io.github.eggy03.papertrail.bot.service.auditlog.member.MemberUpdateEventHelper;
+import io.github.eggy03.papertrail.bot.service.auditlog.member.MemberVoiceKickEventHelper;
+import io.github.eggy03.papertrail.bot.service.auditlog.member.MemberVoiceMoveEventHelper;
+import io.github.eggy03.papertrail.bot.service.auditlog.message.MessagePinEventHelper;
+import io.github.eggy03.papertrail.bot.service.auditlog.message.MessageUnpinEventHelper;
+import io.github.eggy03.papertrail.bot.service.auditlog.modactions.BanEventHelper;
+import io.github.eggy03.papertrail.bot.service.auditlog.modactions.KickEventHelper;
+import io.github.eggy03.papertrail.bot.service.auditlog.modactions.UnbanEventHelper;
+import io.github.eggy03.papertrail.bot.service.auditlog.onboarding.OnboardingPromptCreateEventHelper;
+import io.github.eggy03.papertrail.bot.service.auditlog.onboarding.OnboardingPromptDeleteEventHelper;
+import io.github.eggy03.papertrail.bot.service.auditlog.onboarding.OnboardingPromptUpdateEventHelper;
+import io.github.eggy03.papertrail.bot.service.auditlog.onboarding.OnboardingUpdateEventHelper;
+import io.github.eggy03.papertrail.bot.service.auditlog.role.RoleCreateEventHelper;
+import io.github.eggy03.papertrail.bot.service.auditlog.role.RoleDeleteEventHelper;
+import io.github.eggy03.papertrail.bot.service.auditlog.role.RoleUpdateEventHelper;
+import io.github.eggy03.papertrail.bot.service.auditlog.scheduledevent.ScheduledEventCreateEventHelper;
+import io.github.eggy03.papertrail.bot.service.auditlog.scheduledevent.ScheduledEventDeleteEventHelper;
+import io.github.eggy03.papertrail.bot.service.auditlog.scheduledevent.ScheduledEventUpdateEventHelper;
+import io.github.eggy03.papertrail.bot.service.auditlog.soundboard.SoundboardSoundCreateEventHelper;
+import io.github.eggy03.papertrail.bot.service.auditlog.soundboard.SoundboardSoundDeleteEventHelper;
+import io.github.eggy03.papertrail.bot.service.auditlog.soundboard.SoundboardSoundUpdateEventHelper;
+import io.github.eggy03.papertrail.bot.service.auditlog.stage.StageInstanceCreateEventHelper;
+import io.github.eggy03.papertrail.bot.service.auditlog.stage.StageInstanceDeleteEventHelper;
+import io.github.eggy03.papertrail.bot.service.auditlog.stage.StageInstanceUpdateEventHelper;
+import io.github.eggy03.papertrail.bot.service.auditlog.sticker.StickerCreateEventHelper;
+import io.github.eggy03.papertrail.bot.service.auditlog.sticker.StickerDeleteEventHelper;
+import io.github.eggy03.papertrail.bot.service.auditlog.sticker.StickerUpdateEventHelper;
+import io.github.eggy03.papertrail.bot.service.auditlog.thread.ThreadCreateEventHelper;
+import io.github.eggy03.papertrail.bot.service.auditlog.thread.ThreadDeleteEventHelper;
+import io.github.eggy03.papertrail.bot.service.auditlog.thread.ThreadUpdateEventHelper;
+import io.github.eggy03.papertrail.bot.service.auditlog.webhook.WebhookCreateEventHelper;
+import io.github.eggy03.papertrail.bot.service.auditlog.webhook.WebhookRemoveEventHelper;
+import io.github.eggy03.papertrail.bot.service.auditlog.webhook.WebhookUpdateEventHelper;
import io.github.eggy03.papertrail.sdk.client.AuditLogRegistrationClient;
import io.github.eggy03.papertrail.sdk.entity.AuditLogRegistrationEntity;
import lombok.NonNull;
@@ -77,7 +77,7 @@
@Slf4j
@RequiredArgsConstructor
-public class AuditLogEventListener extends ListenerAdapter {
+public class AuditLogListener extends ListenerAdapter {
@NonNull
private final AuditLogRegistrationClient client;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlogsupl/event/guild/GuildBoostEventListener.java b/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlogsupl/GuildBoostEventListener.java
similarity index 83%
rename from src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlogsupl/event/guild/GuildBoostEventListener.java
rename to src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlogsupl/GuildBoostEventListener.java
index 3bb8998..3533cbb 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlogsupl/event/guild/GuildBoostEventListener.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlogsupl/GuildBoostEventListener.java
@@ -1,8 +1,8 @@
-package io.github.eggy03.papertrail.bot.listeners.auditlogsupl.event.guild;
+package io.github.eggy03.papertrail.bot.listeners.auditlogsupl;
-import io.github.eggy03.papertrail.bot.listeners.auditlogsupl.helper.guild.GuildMemberUpdateBoostTimeEventHelper;
-import io.github.eggy03.papertrail.bot.listeners.auditlogsupl.helper.guild.GuildUpdateBoostCountEventHelper;
-import io.github.eggy03.papertrail.bot.listeners.auditlogsupl.helper.guild.GuildUpdateBoostTierEventHelper;
+import io.github.eggy03.papertrail.bot.service.auditlogsupl.GuildMemberUpdateBoostTimeEventHelper;
+import io.github.eggy03.papertrail.bot.service.auditlogsupl.GuildUpdateBoostCountEventHelper;
+import io.github.eggy03.papertrail.bot.service.auditlogsupl.GuildUpdateBoostTierEventHelper;
import io.github.eggy03.papertrail.sdk.client.AuditLogRegistrationClient;
import io.github.eggy03.papertrail.sdk.entity.AuditLogRegistrationEntity;
import lombok.NonNull;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlogsupl/event/guild/GuildMemberJoinAndLeaveEventListener.java b/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlogsupl/GuildMemberJoinAndLeaveEventListener.java
similarity index 86%
rename from src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlogsupl/event/guild/GuildMemberJoinAndLeaveEventListener.java
rename to src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlogsupl/GuildMemberJoinAndLeaveEventListener.java
index 22570c6..7499013 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlogsupl/event/guild/GuildMemberJoinAndLeaveEventListener.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlogsupl/GuildMemberJoinAndLeaveEventListener.java
@@ -1,7 +1,7 @@
-package io.github.eggy03.papertrail.bot.listeners.auditlogsupl.event.guild;
+package io.github.eggy03.papertrail.bot.listeners.auditlogsupl;
-import io.github.eggy03.papertrail.bot.listeners.auditlogsupl.helper.guild.GuildMemberJoinEventHelper;
-import io.github.eggy03.papertrail.bot.listeners.auditlogsupl.helper.guild.GuildMemberRemoveEventHelper;
+import io.github.eggy03.papertrail.bot.service.auditlogsupl.GuildMemberJoinEventHelper;
+import io.github.eggy03.papertrail.bot.service.auditlogsupl.GuildMemberRemoveEventHelper;
import io.github.eggy03.papertrail.sdk.client.AuditLogRegistrationClient;
import io.github.eggy03.papertrail.sdk.entity.AuditLogRegistrationEntity;
import lombok.NonNull;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlogsupl/event/guild/GuildPollEventListener.java b/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlogsupl/GuildPollEventListener.java
similarity index 85%
rename from src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlogsupl/event/guild/GuildPollEventListener.java
rename to src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlogsupl/GuildPollEventListener.java
index 2889419..76cd1c0 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlogsupl/event/guild/GuildPollEventListener.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlogsupl/GuildPollEventListener.java
@@ -1,6 +1,6 @@
-package io.github.eggy03.papertrail.bot.listeners.auditlogsupl.event.guild;
+package io.github.eggy03.papertrail.bot.listeners.auditlogsupl;
-import io.github.eggy03.papertrail.bot.listeners.auditlogsupl.helper.guild.GuildPollEventHelper;
+import io.github.eggy03.papertrail.bot.service.auditlogsupl.GuildPollEventHelper;
import io.github.eggy03.papertrail.sdk.client.AuditLogRegistrationClient;
import io.github.eggy03.papertrail.sdk.entity.AuditLogRegistrationEntity;
import lombok.NonNull;
@@ -12,7 +12,7 @@
import java.util.Optional;
import java.util.concurrent.Executor;
-// guild poll events are mapped to audit log table
+// auditlogsupl poll events are mapped to audit log table
@RequiredArgsConstructor
public class GuildPollEventListener extends ListenerAdapter {
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlogsupl/event/guild/GuildVoiceEventListener.java b/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlogsupl/GuildVoiceEventListener.java
similarity index 87%
rename from src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlogsupl/event/guild/GuildVoiceEventListener.java
rename to src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlogsupl/GuildVoiceEventListener.java
index e3910f6..8232e01 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlogsupl/event/guild/GuildVoiceEventListener.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlogsupl/GuildVoiceEventListener.java
@@ -1,6 +1,6 @@
-package io.github.eggy03.papertrail.bot.listeners.auditlogsupl.event.guild;
+package io.github.eggy03.papertrail.bot.listeners.auditlogsupl;
-import io.github.eggy03.papertrail.bot.listeners.auditlogsupl.helper.guild.GuildVoiceEventHelper;
+import io.github.eggy03.papertrail.bot.service.auditlogsupl.GuildVoiceEventHelper;
import io.github.eggy03.papertrail.sdk.client.AuditLogRegistrationClient;
import io.github.eggy03.papertrail.sdk.entity.AuditLogRegistrationEntity;
import lombok.NonNull;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlogsupl/package-info.java b/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlogsupl/package-info.java
deleted file mode 100644
index 32c3b43..0000000
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlogsupl/package-info.java
+++ /dev/null
@@ -1,12 +0,0 @@
-/**
- * Contains supplementary audit-style event listeners for actions not covered
- * by Discord's native audit log system.
- *
- * These listeners observe events that are audit-relevant (such as guild,
- * thread, or other structural changes) but cannot be derived from
- * {@link net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent} entries.
- *
- * All events in this package log to the same destination and follow the same
- * formatting and conventions as standard audit log listeners and hence, no additional setup is required.
- */
-package io.github.eggy03.papertrail.bot.listeners.auditlogsupl;
\ No newline at end of file
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/command/AuditLogSetupCommandListener.java b/src/main/java/io/github/eggy03/papertrail/bot/listeners/command/AuditLogSetupCommandListener.java
index 36f3410..5466dcf 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/command/AuditLogSetupCommandListener.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/listeners/command/AuditLogSetupCommandListener.java
@@ -44,14 +44,14 @@ private void setAuditLogging(@NonNull SlashCommandInteractionEvent event) {
Guild callerGuild = event.getGuild();
GuildChannel callerChannel = event.getChannel().asTextChannel();
if (callerGuild == null) {
- log.warn("An audit log set command may have been called outside of a guild. This should not happen.");
+ log.warn("An audit log set command may have been called outside of a auditlogsupl. This should not happen.");
return;
}
// acknowledge this interaction before calling the API
event.deferReply().queue();
- // Call the API to register the guild and the channel
+ // Call the API to register the auditlogsupl and the channel
boolean success = client.registerGuild(callerGuild.getId(), callerChannel.getId());
EmbedBuilder eb = new EmbedBuilder();
@@ -62,7 +62,7 @@ private void setAuditLogging(@NonNull SlashCommandInteractionEvent event) {
eb.addField(MarkdownUtil.underline("Registration Success"), MarkdownUtil.codeblock("All audit log info will be logged here"), false);
} else {
eb.setColor(Color.YELLOW);
- eb.addField(MarkdownUtil.underline("Registration Failure"), MarkdownUtil.codeblock("Channel could not be registered. Check if a channel in this guild is already registered for logging."), false);
+ eb.addField(MarkdownUtil.underline("Registration Failure"), MarkdownUtil.codeblock("Channel could not be registered. Check if a channel in this auditlogsupl is already registered for logging."), false);
}
event.getHook().editOriginalEmbeds(eb.build()).queue();
@@ -72,7 +72,7 @@ private void retrieveAuditLoggingChannel(@NonNull SlashCommandInteractionEvent e
Guild callerGuild = event.getGuild();
if (callerGuild == null) {
- log.warn("An audit log view command may have been called outside of a guild. This should not happen.");
+ log.warn("An audit log view command may have been called outside of a auditlogsupl. This should not happen.");
return;
}
@@ -106,14 +106,14 @@ private void unsetAuditLogging(@NonNull SlashCommandInteractionEvent event) {
Guild callerGuild = event.getGuild();
if (callerGuild == null) {
- log.warn("An audit log unset command may have been called outside of a guild. This should not happen.");
+ log.warn("An audit log unset command may have been called outside of a auditlogsupl. This should not happen.");
return;
}
// acknowledge this interaction before calling the API
event.deferReply().queue();
- // Call the API to unregister guild
+ // Call the API to unregister auditlogsupl
boolean success = client.deleteRegisteredGuild(callerGuild.getId());
EmbedBuilder eb = new EmbedBuilder();
@@ -124,7 +124,7 @@ private void unsetAuditLogging(@NonNull SlashCommandInteractionEvent event) {
eb.addField(MarkdownUtil.underline("Removal Success"), MarkdownUtil.codeblock("Channel successfully unset"), false);
} else {
eb.setColor(Color.YELLOW);
- eb.addField(MarkdownUtil.underline("Removal Failure"), MarkdownUtil.codeblock("Channel could not be unset. This may be because no channel has been registered in this guild yet."), false);
+ eb.addField(MarkdownUtil.underline("Removal Failure"), MarkdownUtil.codeblock("Channel could not be unset. This may be because no channel has been registered in this auditlogsupl yet."), false);
}
event.getHook().editOriginalEmbeds(eb.build()).queue();
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/command/DebugCommandListener.java b/src/main/java/io/github/eggy03/papertrail/bot/listeners/command/DebugCommandListener.java
index a73604d..966bfa2 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/command/DebugCommandListener.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/listeners/command/DebugCommandListener.java
@@ -147,7 +147,7 @@ public void onSlashCommandInteraction(@NonNull SlashCommandInteractionEvent even
Guild guild = event.getGuild();
Member member = event.getMember();
if (guild == null || member == null) {
- log.warn("command may have been called outside of a guild");
+ log.warn("command may have been called outside of a auditlogsupl");
return;
}
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/command/MessageLogSetupCommandListener.java b/src/main/java/io/github/eggy03/papertrail/bot/listeners/command/MessageLogSetupCommandListener.java
index 83a80d1..0116520 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/command/MessageLogSetupCommandListener.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/listeners/command/MessageLogSetupCommandListener.java
@@ -44,14 +44,14 @@ private void setMessageLogging(@NonNull SlashCommandInteractionEvent event) {
Guild callerGuild = event.getGuild();
GuildChannel callerChannel = event.getChannel().asTextChannel();
if (callerGuild == null) {
- log.warn("A message log set command may have been called outside of a guild. This should not happen.");
+ log.warn("A message log set command may have been called outside of a auditlogsupl. This should not happen.");
return;
}
// acknowledge this interaction before calling the API
event.deferReply().queue();
- // Call the API to register guild for message logging
+ // Call the API to register auditlogsupl for message logging
boolean success = client.registerGuild(callerGuild.getId(), callerChannel.getId());
EmbedBuilder eb = new EmbedBuilder();
@@ -62,7 +62,7 @@ private void setMessageLogging(@NonNull SlashCommandInteractionEvent event) {
eb.addField(MarkdownUtil.underline("Registration Success"), MarkdownUtil.codeblock("All edited and deleted messages will be logged here"), false);
} else {
eb.setColor(Color.YELLOW);
- eb.addField(MarkdownUtil.underline("Registration Failure"), MarkdownUtil.codeblock("Channel could not be registered. Check if a channel in this guild is already registered for logging."), false);
+ eb.addField(MarkdownUtil.underline("Registration Failure"), MarkdownUtil.codeblock("Channel could not be registered. Check if a channel in this auditlogsupl is already registered for logging."), false);
}
@@ -73,14 +73,14 @@ private void retrieveMessageLoggingChannel(@NonNull SlashCommandInteractionEvent
Guild callerGuild = event.getGuild();
if (callerGuild == null) {
- log.warn("A message log view command may have been called outside of a guild. This should not happen.");
+ log.warn("A message log view command may have been called outside of a auditlogsupl. This should not happen.");
return;
}
// acknowledge this interaction before calling the API
event.deferReply().queue();
- // Call the API to check for registered guild
+ // Call the API to check for registered auditlogsupl
Optional response = client.getRegisteredGuild(callerGuild.getId());
EmbedBuilder eb = new EmbedBuilder();
@@ -106,14 +106,14 @@ private void unsetMessageLogging(@NonNull SlashCommandInteractionEvent event) {
Guild callerGuild = event.getGuild();
if (callerGuild == null) {
- log.warn("A message log unset command may have been called outside of a guild. This should not happen.");
+ log.warn("A message log unset command may have been called outside of a auditlogsupl. This should not happen.");
return;
}
// acknowledge this interaction before calling the API
event.deferReply().queue();
- // Call the API to unregister guild
+ // Call the API to unregister auditlogsupl
boolean success = client.deleteRegisteredGuild(callerGuild.getId());
EmbedBuilder eb = new EmbedBuilder();
@@ -124,7 +124,7 @@ private void unsetMessageLogging(@NonNull SlashCommandInteractionEvent event) {
eb.addField(MarkdownUtil.underline("Removal Success"), MarkdownUtil.codeblock("Channel successfully unset"), false);
} else {
eb.setColor(Color.YELLOW);
- eb.addField(MarkdownUtil.underline("Removal Failure"), MarkdownUtil.codeblock("Channel could not be unset. This may be because no channel has been registered in this guild yet."), false);
+ eb.addField(MarkdownUtil.underline("Removal Failure"), MarkdownUtil.codeblock("Channel could not be unset. This may be because no channel has been registered in this auditlogsupl yet."), false);
}
event.getHook().editOriginalEmbeds(eb.build()).queue();
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/command/ServerStatCommandListener.java b/src/main/java/io/github/eggy03/papertrail/bot/listeners/command/ServerStatCommandListener.java
index f153408..ac5d04c 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/command/ServerStatCommandListener.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/listeners/command/ServerStatCommandListener.java
@@ -71,7 +71,7 @@ public void onSlashCommandInteraction(@NonNull SlashCommandInteractionEvent even
Guild guild = event.getGuild();
if (guild == null) {
- log.warn("Command may have been called outside of a guild");
+ log.warn("Command may have been called outside of a auditlogsupl");
return;
}
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/messagelog/event/MessageLogListener.java b/src/main/java/io/github/eggy03/papertrail/bot/listeners/messagelog/MessageLogListener.java
similarity index 80%
rename from src/main/java/io/github/eggy03/papertrail/bot/listeners/messagelog/event/MessageLogListener.java
rename to src/main/java/io/github/eggy03/papertrail/bot/listeners/messagelog/MessageLogListener.java
index 98d0472..8d51479 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/messagelog/event/MessageLogListener.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/listeners/messagelog/MessageLogListener.java
@@ -1,8 +1,8 @@
-package io.github.eggy03.papertrail.bot.listeners.messagelog.event;
+package io.github.eggy03.papertrail.bot.listeners.messagelog;
-import io.github.eggy03.papertrail.bot.listeners.messagelog.helper.MessageLogMessageDeleteEventHelper;
-import io.github.eggy03.papertrail.bot.listeners.messagelog.helper.MessageLogMessageReceivedEventHelper;
-import io.github.eggy03.papertrail.bot.listeners.messagelog.helper.MessageLogMessageUpdateEventHelper;
+import io.github.eggy03.papertrail.bot.service.messagelog.MessageLogMessageDeleteEventHelper;
+import io.github.eggy03.papertrail.bot.service.messagelog.MessageLogMessageReceivedEventHelper;
+import io.github.eggy03.papertrail.bot.service.messagelog.MessageLogMessageUpdateEventHelper;
import io.github.eggy03.papertrail.sdk.client.MessageLogContentClient;
import io.github.eggy03.papertrail.sdk.client.MessageLogRegistrationClient;
import io.github.eggy03.papertrail.sdk.entity.MessageLogRegistrationEntity;
@@ -41,9 +41,9 @@ public void onMessageReceived(@NonNull MessageReceivedEvent event) {
}
vThreadPool.execute(() -> {
- // get the guild id for which the event was fired
+ // get the auditlogsupl id for which the event was fired
String guildId = event.getGuild().getId();
- // Call the API to see if the guild is registered for Message Logging
+ // Call the API to see if the auditlogsupl is registered for Message Logging
Optional response = registrationClient.getRegisteredGuild(guildId);
response.ifPresent(success ->
MessageLogMessageReceivedEventHelper.saveMessage(event, contentClient)
@@ -59,9 +59,9 @@ public void onMessageUpdate(@NonNull MessageUpdateEvent event) {
}
vThreadPool.execute(() -> {
- // Get the guild id for which the event was fired
+ // Get the auditlogsupl id for which the event was fired
String guildId = event.getGuild().getId();
- // Call the API to see if the guild is registered for Message Logging
+ // Call the API to see if the auditlogsupl is registered for Message Logging
Optional response = registrationClient.getRegisteredGuild(guildId);
response.ifPresent(success -> {
@@ -80,10 +80,10 @@ public void onMessageDelete(@NonNull MessageDeleteEvent event) {
vThreadPool.execute(() -> {
- // Get the guild id for which the event was fired
+ // Get the auditlogsupl id for which the event was fired
String guildId = event.getGuild().getId();
- // Call the API to see if the guild is registered for Message Logging
+ // Call the API to see if the auditlogsupl is registered for Message Logging
Optional response = registrationClient.getRegisteredGuild(guildId);
response.ifPresent(success -> {
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/misc/ActivityUpdateListener.java b/src/main/java/io/github/eggy03/papertrail/bot/listeners/misc/ActivityUpdateListener.java
index cc59daf..2acfb25 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/misc/ActivityUpdateListener.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/listeners/misc/ActivityUpdateListener.java
@@ -28,12 +28,12 @@ public void onReady(@NonNull ReadyEvent event) { // update on cold start
}
@Override
- public void onGuildJoin(@NonNull GuildJoinEvent event) { // update on guild join
+ public void onGuildJoin(@NonNull GuildJoinEvent event) { // update on auditlogsupl join
updateActivity();
}
@Override
- public void onGuildLeave(@NonNull GuildLeaveEvent event) { // update on guild leave
+ public void onGuildLeave(@NonNull GuildLeaveEvent event) { // update on auditlogsupl leave
updateActivity();
}
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/automod/AutoModerationFlagToChannelEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/automod/AutoModerationFlagToChannelEventHelper.java
similarity index 96%
rename from src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/automod/AutoModerationFlagToChannelEventHelper.java
rename to src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/automod/AutoModerationFlagToChannelEventHelper.java
index 8ad1cc7..6d92957 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/automod/AutoModerationFlagToChannelEventHelper.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/automod/AutoModerationFlagToChannelEventHelper.java
@@ -1,4 +1,4 @@
-package io.github.eggy03.papertrail.bot.listeners.auditlog.helper.automod;
+package io.github.eggy03.papertrail.bot.service.auditlog.automod;
import lombok.NonNull;
import lombok.experimental.UtilityClass;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/automod/AutoModerationMemberTimeoutEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/automod/AutoModerationMemberTimeoutEventHelper.java
similarity index 96%
rename from src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/automod/AutoModerationMemberTimeoutEventHelper.java
rename to src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/automod/AutoModerationMemberTimeoutEventHelper.java
index 57c9603..1c99871 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/automod/AutoModerationMemberTimeoutEventHelper.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/automod/AutoModerationMemberTimeoutEventHelper.java
@@ -1,4 +1,4 @@
-package io.github.eggy03.papertrail.bot.listeners.auditlog.helper.automod;
+package io.github.eggy03.papertrail.bot.service.auditlog.automod;
import lombok.NonNull;
import lombok.experimental.UtilityClass;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/automod/AutoModerationRuleBlockMessageEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/automod/AutoModerationRuleBlockMessageEventHelper.java
similarity index 96%
rename from src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/automod/AutoModerationRuleBlockMessageEventHelper.java
rename to src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/automod/AutoModerationRuleBlockMessageEventHelper.java
index 8bdfa15..716ab93 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/automod/AutoModerationRuleBlockMessageEventHelper.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/automod/AutoModerationRuleBlockMessageEventHelper.java
@@ -1,4 +1,4 @@
-package io.github.eggy03.papertrail.bot.listeners.auditlog.helper.automod;
+package io.github.eggy03.papertrail.bot.service.auditlog.automod;
import lombok.NonNull;
import lombok.experimental.UtilityClass;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/automod/AutoModerationRuleCreateEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/automod/AutoModerationRuleCreateEventHelper.java
similarity index 94%
rename from src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/automod/AutoModerationRuleCreateEventHelper.java
rename to src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/automod/AutoModerationRuleCreateEventHelper.java
index 5859df5..4f6b93f 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/automod/AutoModerationRuleCreateEventHelper.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/automod/AutoModerationRuleCreateEventHelper.java
@@ -1,6 +1,6 @@
-package io.github.eggy03.papertrail.bot.listeners.auditlog.helper.automod;
+package io.github.eggy03.papertrail.bot.service.auditlog.automod;
-import io.github.eggy03.papertrail.bot.listeners.auditlog.helper.automod.utils.AutoModUtils;
+import io.github.eggy03.papertrail.bot.service.auditlog.automod.utils.AutoModUtils;
import io.github.eggy03.papertrail.bot.utils.BooleanUtils;
import lombok.NonNull;
import lombok.experimental.UtilityClass;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/automod/AutoModerationRuleDeleteEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/automod/AutoModerationRuleDeleteEventHelper.java
similarity index 96%
rename from src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/automod/AutoModerationRuleDeleteEventHelper.java
rename to src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/automod/AutoModerationRuleDeleteEventHelper.java
index 8d8ebc5..9b429c4 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/automod/AutoModerationRuleDeleteEventHelper.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/automod/AutoModerationRuleDeleteEventHelper.java
@@ -1,4 +1,4 @@
-package io.github.eggy03.papertrail.bot.listeners.auditlog.helper.automod;
+package io.github.eggy03.papertrail.bot.service.auditlog.automod;
import lombok.NonNull;
import lombok.experimental.UtilityClass;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/automod/AutoModerationRuleUpdateEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/automod/AutoModerationRuleUpdateEventHelper.java
similarity index 96%
rename from src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/automod/AutoModerationRuleUpdateEventHelper.java
rename to src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/automod/AutoModerationRuleUpdateEventHelper.java
index 7f71781..2e0dc79 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/automod/AutoModerationRuleUpdateEventHelper.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/automod/AutoModerationRuleUpdateEventHelper.java
@@ -1,4 +1,4 @@
-package io.github.eggy03.papertrail.bot.listeners.auditlog.helper.automod;
+package io.github.eggy03.papertrail.bot.service.auditlog.automod;
import lombok.NonNull;
import lombok.experimental.UtilityClass;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/automod/utils/AutoModUtils.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/automod/utils/AutoModUtils.java
similarity index 93%
rename from src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/automod/utils/AutoModUtils.java
rename to src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/automod/utils/AutoModUtils.java
index 1ce238f..8149bb7 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/automod/utils/AutoModUtils.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/automod/utils/AutoModUtils.java
@@ -1,4 +1,4 @@
-package io.github.eggy03.papertrail.bot.listeners.auditlog.helper.automod.utils;
+package io.github.eggy03.papertrail.bot.service.auditlog.automod.utils;
import io.github.eggy03.papertrail.bot.utils.NumberParseUtils;
import lombok.NonNull;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/bot/BotAddEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/bot/BotAddEventHelper.java
similarity index 96%
rename from src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/bot/BotAddEventHelper.java
rename to src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/bot/BotAddEventHelper.java
index 9e9ea77..c8e296d 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/bot/BotAddEventHelper.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/bot/BotAddEventHelper.java
@@ -1,4 +1,4 @@
-package io.github.eggy03.papertrail.bot.listeners.auditlog.helper.bot;
+package io.github.eggy03.papertrail.bot.service.auditlog.bot;
import lombok.NonNull;
import lombok.experimental.UtilityClass;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/channel/ChannelCreateEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/channel/ChannelCreateEventHelper.java
similarity index 95%
rename from src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/channel/ChannelCreateEventHelper.java
rename to src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/channel/ChannelCreateEventHelper.java
index 917eb3e..b9d44bc 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/channel/ChannelCreateEventHelper.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/channel/ChannelCreateEventHelper.java
@@ -1,6 +1,6 @@
-package io.github.eggy03.papertrail.bot.listeners.auditlog.helper.channel;
+package io.github.eggy03.papertrail.bot.service.auditlog.channel;
-import io.github.eggy03.papertrail.bot.listeners.auditlog.helper.channel.utils.ChannelUtils;
+import io.github.eggy03.papertrail.bot.service.auditlog.channel.utils.ChannelUtils;
import io.github.eggy03.papertrail.bot.utils.BooleanUtils;
import io.github.eggy03.papertrail.bot.utils.DurationUtils;
import lombok.NonNull;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/channel/ChannelDeleteEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/channel/ChannelDeleteEventHelper.java
similarity index 92%
rename from src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/channel/ChannelDeleteEventHelper.java
rename to src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/channel/ChannelDeleteEventHelper.java
index 9e31c1c..ae405b8 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/channel/ChannelDeleteEventHelper.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/channel/ChannelDeleteEventHelper.java
@@ -1,6 +1,6 @@
-package io.github.eggy03.papertrail.bot.listeners.auditlog.helper.channel;
+package io.github.eggy03.papertrail.bot.service.auditlog.channel;
-import io.github.eggy03.papertrail.bot.listeners.auditlog.helper.channel.utils.ChannelUtils;
+import io.github.eggy03.papertrail.bot.service.auditlog.channel.utils.ChannelUtils;
import lombok.NonNull;
import lombok.experimental.UtilityClass;
import lombok.extern.slf4j.Slf4j;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/channel/ChannelOverrideCreateEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/channel/ChannelOverrideCreateEventHelper.java
similarity index 95%
rename from src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/channel/ChannelOverrideCreateEventHelper.java
rename to src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/channel/ChannelOverrideCreateEventHelper.java
index 33f6f8d..7e2eaa8 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/channel/ChannelOverrideCreateEventHelper.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/channel/ChannelOverrideCreateEventHelper.java
@@ -1,6 +1,6 @@
-package io.github.eggy03.papertrail.bot.listeners.auditlog.helper.channel;
+package io.github.eggy03.papertrail.bot.service.auditlog.channel;
-import io.github.eggy03.papertrail.bot.listeners.auditlog.helper.channel.utils.ChannelUtils;
+import io.github.eggy03.papertrail.bot.service.auditlog.channel.utils.ChannelUtils;
import lombok.NonNull;
import lombok.experimental.UtilityClass;
import lombok.extern.slf4j.Slf4j;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/channel/ChannelOverrideDeleteEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/channel/ChannelOverrideDeleteEventHelper.java
similarity index 95%
rename from src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/channel/ChannelOverrideDeleteEventHelper.java
rename to src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/channel/ChannelOverrideDeleteEventHelper.java
index 860dbce..cbe167b 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/channel/ChannelOverrideDeleteEventHelper.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/channel/ChannelOverrideDeleteEventHelper.java
@@ -1,6 +1,6 @@
-package io.github.eggy03.papertrail.bot.listeners.auditlog.helper.channel;
+package io.github.eggy03.papertrail.bot.service.auditlog.channel;
-import io.github.eggy03.papertrail.bot.listeners.auditlog.helper.channel.utils.ChannelUtils;
+import io.github.eggy03.papertrail.bot.service.auditlog.channel.utils.ChannelUtils;
import lombok.NonNull;
import lombok.experimental.UtilityClass;
import lombok.extern.slf4j.Slf4j;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/channel/ChannelOverrideUpdateEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/channel/ChannelOverrideUpdateEventHelper.java
similarity index 96%
rename from src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/channel/ChannelOverrideUpdateEventHelper.java
rename to src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/channel/ChannelOverrideUpdateEventHelper.java
index f3b6f96..e193c6d 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/channel/ChannelOverrideUpdateEventHelper.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/channel/ChannelOverrideUpdateEventHelper.java
@@ -1,6 +1,6 @@
-package io.github.eggy03.papertrail.bot.listeners.auditlog.helper.channel;
+package io.github.eggy03.papertrail.bot.service.auditlog.channel;
-import io.github.eggy03.papertrail.bot.listeners.auditlog.helper.channel.utils.ChannelUtils;
+import io.github.eggy03.papertrail.bot.service.auditlog.channel.utils.ChannelUtils;
import lombok.NonNull;
import lombok.experimental.UtilityClass;
import lombok.extern.slf4j.Slf4j;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/channel/ChannelUpdateEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/channel/ChannelUpdateEventHelper.java
similarity index 97%
rename from src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/channel/ChannelUpdateEventHelper.java
rename to src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/channel/ChannelUpdateEventHelper.java
index 3612974..c4ab24d 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/channel/ChannelUpdateEventHelper.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/channel/ChannelUpdateEventHelper.java
@@ -1,6 +1,6 @@
-package io.github.eggy03.papertrail.bot.listeners.auditlog.helper.channel;
+package io.github.eggy03.papertrail.bot.service.auditlog.channel;
-import io.github.eggy03.papertrail.bot.listeners.auditlog.helper.channel.utils.ChannelUtils;
+import io.github.eggy03.papertrail.bot.service.auditlog.channel.utils.ChannelUtils;
import io.github.eggy03.papertrail.bot.utils.BooleanUtils;
import io.github.eggy03.papertrail.bot.utils.DurationUtils;
import lombok.NonNull;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/channel/VoiceChannelStatusDeleteEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/channel/VoiceChannelStatusDeleteEventHelper.java
similarity index 96%
rename from src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/channel/VoiceChannelStatusDeleteEventHelper.java
rename to src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/channel/VoiceChannelStatusDeleteEventHelper.java
index 1f55661..afb0792 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/channel/VoiceChannelStatusDeleteEventHelper.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/channel/VoiceChannelStatusDeleteEventHelper.java
@@ -1,4 +1,4 @@
-package io.github.eggy03.papertrail.bot.listeners.auditlog.helper.channel;
+package io.github.eggy03.papertrail.bot.service.auditlog.channel;
import lombok.NonNull;
import lombok.experimental.UtilityClass;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/channel/VoiceChannelStatusUpdateEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/channel/VoiceChannelStatusUpdateEventHelper.java
similarity index 96%
rename from src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/channel/VoiceChannelStatusUpdateEventHelper.java
rename to src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/channel/VoiceChannelStatusUpdateEventHelper.java
index 8cf1143..0a2e1eb 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/channel/VoiceChannelStatusUpdateEventHelper.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/channel/VoiceChannelStatusUpdateEventHelper.java
@@ -1,4 +1,4 @@
-package io.github.eggy03.papertrail.bot.listeners.auditlog.helper.channel;
+package io.github.eggy03.papertrail.bot.service.auditlog.channel;
import lombok.NonNull;
import lombok.experimental.UtilityClass;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/channel/utils/ChannelUtils.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/channel/utils/ChannelUtils.java
similarity index 98%
rename from src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/channel/utils/ChannelUtils.java
rename to src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/channel/utils/ChannelUtils.java
index f039a4e..49a692b 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/channel/utils/ChannelUtils.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/channel/utils/ChannelUtils.java
@@ -1,4 +1,4 @@
-package io.github.eggy03.papertrail.bot.listeners.auditlog.helper.channel.utils;
+package io.github.eggy03.papertrail.bot.service.auditlog.channel.utils;
import io.github.eggy03.papertrail.bot.utils.NumberParseUtils;
import lombok.NonNull;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/emoji/EmojiCreateEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/emoji/EmojiCreateEventHelper.java
similarity index 96%
rename from src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/emoji/EmojiCreateEventHelper.java
rename to src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/emoji/EmojiCreateEventHelper.java
index 1ae2a1a..9420ec1 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/emoji/EmojiCreateEventHelper.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/emoji/EmojiCreateEventHelper.java
@@ -1,4 +1,4 @@
-package io.github.eggy03.papertrail.bot.listeners.auditlog.helper.emoji;
+package io.github.eggy03.papertrail.bot.service.auditlog.emoji;
import lombok.NonNull;
import lombok.experimental.UtilityClass;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/emoji/EmojiDeleteEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/emoji/EmojiDeleteEventHelper.java
similarity index 96%
rename from src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/emoji/EmojiDeleteEventHelper.java
rename to src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/emoji/EmojiDeleteEventHelper.java
index 0358294..7c75ff3 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/emoji/EmojiDeleteEventHelper.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/emoji/EmojiDeleteEventHelper.java
@@ -1,4 +1,4 @@
-package io.github.eggy03.papertrail.bot.listeners.auditlog.helper.emoji;
+package io.github.eggy03.papertrail.bot.service.auditlog.emoji;
import lombok.NonNull;
import lombok.experimental.UtilityClass;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/emoji/EmojiUpdateEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/emoji/EmojiUpdateEventHelper.java
similarity index 96%
rename from src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/emoji/EmojiUpdateEventHelper.java
rename to src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/emoji/EmojiUpdateEventHelper.java
index 9f368a7..24261a2 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/emoji/EmojiUpdateEventHelper.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/emoji/EmojiUpdateEventHelper.java
@@ -1,4 +1,4 @@
-package io.github.eggy03.papertrail.bot.listeners.auditlog.helper.emoji;
+package io.github.eggy03.papertrail.bot.service.auditlog.emoji;
import lombok.NonNull;
import lombok.experimental.UtilityClass;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/generic/GenericAuditLogEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/generic/GenericAuditLogEventHelper.java
similarity index 96%
rename from src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/generic/GenericAuditLogEventHelper.java
rename to src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/generic/GenericAuditLogEventHelper.java
index 8a0f9ac..11ef503 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/generic/GenericAuditLogEventHelper.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/generic/GenericAuditLogEventHelper.java
@@ -1,4 +1,4 @@
-package io.github.eggy03.papertrail.bot.listeners.auditlog.helper.generic;
+package io.github.eggy03.papertrail.bot.service.auditlog.generic;
import lombok.NonNull;
import lombok.experimental.UtilityClass;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/guild/GuildProfileUpdateEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/guild/GuildProfileUpdateEventHelper.java
similarity index 97%
rename from src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/guild/GuildProfileUpdateEventHelper.java
rename to src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/guild/GuildProfileUpdateEventHelper.java
index 70a8efc..03a9900 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/guild/GuildProfileUpdateEventHelper.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/guild/GuildProfileUpdateEventHelper.java
@@ -1,4 +1,4 @@
-package io.github.eggy03.papertrail.bot.listeners.auditlog.helper.guild;
+package io.github.eggy03.papertrail.bot.service.auditlog.guild;
import lombok.NonNull;
import lombok.experimental.UtilityClass;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/guild/GuildUpdateEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/guild/GuildUpdateEventHelper.java
similarity index 97%
rename from src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/guild/GuildUpdateEventHelper.java
rename to src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/guild/GuildUpdateEventHelper.java
index f8a1692..41acdce 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/guild/GuildUpdateEventHelper.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/guild/GuildUpdateEventHelper.java
@@ -1,6 +1,6 @@
-package io.github.eggy03.papertrail.bot.listeners.auditlog.helper.guild;
+package io.github.eggy03.papertrail.bot.service.auditlog.guild;
-import io.github.eggy03.papertrail.bot.listeners.auditlog.helper.guild.utils.GuildUtils;
+import io.github.eggy03.papertrail.bot.service.auditlog.guild.utils.GuildUtils;
import io.github.eggy03.papertrail.bot.utils.BooleanUtils;
import io.github.eggy03.papertrail.bot.utils.DurationUtils;
import lombok.NonNull;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/guild/utils/GuildUtils.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/guild/utils/GuildUtils.java
similarity index 98%
rename from src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/guild/utils/GuildUtils.java
rename to src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/guild/utils/GuildUtils.java
index 6fbb6be..20db634 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/guild/utils/GuildUtils.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/guild/utils/GuildUtils.java
@@ -1,4 +1,4 @@
-package io.github.eggy03.papertrail.bot.listeners.auditlog.helper.guild.utils;
+package io.github.eggy03.papertrail.bot.service.auditlog.guild.utils;
import io.github.eggy03.papertrail.bot.utils.NumberParseUtils;
import lombok.NonNull;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/homesettings/HomeSettingsCreateEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/homesettings/HomeSettingsCreateEventHelper.java
similarity index 94%
rename from src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/homesettings/HomeSettingsCreateEventHelper.java
rename to src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/homesettings/HomeSettingsCreateEventHelper.java
index fa2d891..a86d984 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/homesettings/HomeSettingsCreateEventHelper.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/homesettings/HomeSettingsCreateEventHelper.java
@@ -1,4 +1,4 @@
-package io.github.eggy03.papertrail.bot.listeners.auditlog.helper.homesettings;
+package io.github.eggy03.papertrail.bot.service.auditlog.homesettings;
import lombok.NonNull;
import lombok.experimental.UtilityClass;
@@ -30,7 +30,7 @@ public static void format(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull
eb.addField(
MarkdownUtil.underline("More Info"),
- MarkdownUtil.codeblock("To view the created guide, either visit the Server Guide section or the Onboarding section of your guild."),
+ MarkdownUtil.codeblock("To view the created guide, either visit the Server Guide section or the Onboarding section of your auditlogsupl."),
false
);
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/homesettings/HomeSettingsUpdateEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/homesettings/HomeSettingsUpdateEventHelper.java
similarity index 96%
rename from src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/homesettings/HomeSettingsUpdateEventHelper.java
rename to src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/homesettings/HomeSettingsUpdateEventHelper.java
index 2431f1f..a7bad12 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/homesettings/HomeSettingsUpdateEventHelper.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/homesettings/HomeSettingsUpdateEventHelper.java
@@ -1,4 +1,4 @@
-package io.github.eggy03.papertrail.bot.listeners.auditlog.helper.homesettings;
+package io.github.eggy03.papertrail.bot.service.auditlog.homesettings;
import lombok.NonNull;
import lombok.experimental.UtilityClass;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/integration/ApplicationCommandPrivilegesUpdateEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/integration/ApplicationCommandPrivilegesUpdateEventHelper.java
similarity index 95%
rename from src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/integration/ApplicationCommandPrivilegesUpdateEventHelper.java
rename to src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/integration/ApplicationCommandPrivilegesUpdateEventHelper.java
index e734eb2..d2bfe80 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/integration/ApplicationCommandPrivilegesUpdateEventHelper.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/integration/ApplicationCommandPrivilegesUpdateEventHelper.java
@@ -1,4 +1,4 @@
-package io.github.eggy03.papertrail.bot.listeners.auditlog.helper.integration;
+package io.github.eggy03.papertrail.bot.service.auditlog.integration;
import lombok.NonNull;
import lombok.experimental.UtilityClass;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/integration/IntegrationCreateEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/integration/IntegrationCreateEventHelper.java
similarity index 96%
rename from src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/integration/IntegrationCreateEventHelper.java
rename to src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/integration/IntegrationCreateEventHelper.java
index d3e9f97..fae5197 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/integration/IntegrationCreateEventHelper.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/integration/IntegrationCreateEventHelper.java
@@ -1,4 +1,4 @@
-package io.github.eggy03.papertrail.bot.listeners.auditlog.helper.integration;
+package io.github.eggy03.papertrail.bot.service.auditlog.integration;
import lombok.NonNull;
import lombok.experimental.UtilityClass;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/integration/IntegrationDeleteEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/integration/IntegrationDeleteEventHelper.java
similarity index 96%
rename from src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/integration/IntegrationDeleteEventHelper.java
rename to src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/integration/IntegrationDeleteEventHelper.java
index 135cd2f..490dfca 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/integration/IntegrationDeleteEventHelper.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/integration/IntegrationDeleteEventHelper.java
@@ -1,4 +1,4 @@
-package io.github.eggy03.papertrail.bot.listeners.auditlog.helper.integration;
+package io.github.eggy03.papertrail.bot.service.auditlog.integration;
import lombok.NonNull;
import lombok.experimental.UtilityClass;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/invite/InviteCreateEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/invite/InviteCreateEventHelper.java
similarity index 95%
rename from src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/invite/InviteCreateEventHelper.java
rename to src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/invite/InviteCreateEventHelper.java
index 4d61cb3..679a969 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/invite/InviteCreateEventHelper.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/invite/InviteCreateEventHelper.java
@@ -1,6 +1,6 @@
-package io.github.eggy03.papertrail.bot.listeners.auditlog.helper.invite;
+package io.github.eggy03.papertrail.bot.service.auditlog.invite;
-import io.github.eggy03.papertrail.bot.listeners.auditlog.helper.invite.utils.InviteUtils;
+import io.github.eggy03.papertrail.bot.service.auditlog.invite.utils.InviteUtils;
import io.github.eggy03.papertrail.bot.utils.BooleanUtils;
import io.github.eggy03.papertrail.bot.utils.DurationUtils;
import lombok.NonNull;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/invite/InviteDeleteEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/invite/InviteDeleteEventHelper.java
similarity index 95%
rename from src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/invite/InviteDeleteEventHelper.java
rename to src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/invite/InviteDeleteEventHelper.java
index 0089cd7..a9523f9 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/invite/InviteDeleteEventHelper.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/invite/InviteDeleteEventHelper.java
@@ -1,6 +1,6 @@
-package io.github.eggy03.papertrail.bot.listeners.auditlog.helper.invite;
+package io.github.eggy03.papertrail.bot.service.auditlog.invite;
-import io.github.eggy03.papertrail.bot.listeners.auditlog.helper.invite.utils.InviteUtils;
+import io.github.eggy03.papertrail.bot.service.auditlog.invite.utils.InviteUtils;
import io.github.eggy03.papertrail.bot.utils.BooleanUtils;
import lombok.NonNull;
import lombok.experimental.UtilityClass;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/invite/utils/InviteUtils.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/invite/utils/InviteUtils.java
similarity index 97%
rename from src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/invite/utils/InviteUtils.java
rename to src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/invite/utils/InviteUtils.java
index 11bfe04..3c0a62b 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/invite/utils/InviteUtils.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/invite/utils/InviteUtils.java
@@ -1,4 +1,4 @@
-package io.github.eggy03.papertrail.bot.listeners.auditlog.helper.invite.utils;
+package io.github.eggy03.papertrail.bot.service.auditlog.invite.utils;
import io.github.eggy03.papertrail.bot.utils.NumberParseUtils;
import lombok.NonNull;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/member/MemberRoleUpdateEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/member/MemberRoleUpdateEventHelper.java
similarity index 94%
rename from src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/member/MemberRoleUpdateEventHelper.java
rename to src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/member/MemberRoleUpdateEventHelper.java
index 393847b..ed6735a 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/member/MemberRoleUpdateEventHelper.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/member/MemberRoleUpdateEventHelper.java
@@ -1,6 +1,6 @@
-package io.github.eggy03.papertrail.bot.listeners.auditlog.helper.member;
+package io.github.eggy03.papertrail.bot.service.auditlog.member;
-import io.github.eggy03.papertrail.bot.listeners.auditlog.helper.member.utils.MemberUtils;
+import io.github.eggy03.papertrail.bot.service.auditlog.member.utils.MemberUtils;
import lombok.NonNull;
import lombok.experimental.UtilityClass;
import lombok.extern.slf4j.Slf4j;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/member/MemberUpdateEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/member/MemberUpdateEventHelper.java
similarity index 98%
rename from src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/member/MemberUpdateEventHelper.java
rename to src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/member/MemberUpdateEventHelper.java
index 9749cbf..66926d2 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/member/MemberUpdateEventHelper.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/member/MemberUpdateEventHelper.java
@@ -1,4 +1,4 @@
-package io.github.eggy03.papertrail.bot.listeners.auditlog.helper.member;
+package io.github.eggy03.papertrail.bot.service.auditlog.member;
import io.github.eggy03.papertrail.bot.utils.BooleanUtils;
import io.github.eggy03.papertrail.bot.utils.DurationUtils;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/member/MemberVoiceKickEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/member/MemberVoiceKickEventHelper.java
similarity index 88%
rename from src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/member/MemberVoiceKickEventHelper.java
rename to src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/member/MemberVoiceKickEventHelper.java
index c74fcf5..9b3e481 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/member/MemberVoiceKickEventHelper.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/member/MemberVoiceKickEventHelper.java
@@ -1,6 +1,6 @@
-package io.github.eggy03.papertrail.bot.listeners.auditlog.helper.member;
+package io.github.eggy03.papertrail.bot.service.auditlog.member;
-import io.github.eggy03.papertrail.bot.listeners.auditlogsupl.helper.guild.GuildVoiceEventHelper;
+import io.github.eggy03.papertrail.bot.service.auditlogsupl.GuildVoiceEventHelper;
import lombok.NonNull;
import lombok.experimental.UtilityClass;
import lombok.extern.slf4j.Slf4j;
@@ -14,7 +14,7 @@
import java.awt.Color;
/**
- * This helper specifically detects the mod who kicked a member from a Voice Channel
+ * This auditlog specifically detects the mod who kicked a member from a Voice Channel
*
* @see GuildVoiceEventHelper - for member only data regarding voice activities
*/
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/member/MemberVoiceMoveEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/member/MemberVoiceMoveEventHelper.java
similarity index 87%
rename from src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/member/MemberVoiceMoveEventHelper.java
rename to src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/member/MemberVoiceMoveEventHelper.java
index 6950dab..9cd494f 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/member/MemberVoiceMoveEventHelper.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/member/MemberVoiceMoveEventHelper.java
@@ -1,6 +1,6 @@
-package io.github.eggy03.papertrail.bot.listeners.auditlog.helper.member;
+package io.github.eggy03.papertrail.bot.service.auditlog.member;
-import io.github.eggy03.papertrail.bot.listeners.auditlogsupl.helper.guild.GuildVoiceEventHelper;
+import io.github.eggy03.papertrail.bot.service.auditlogsupl.GuildVoiceEventHelper;
import lombok.NonNull;
import lombok.experimental.UtilityClass;
import lombok.extern.slf4j.Slf4j;
@@ -14,7 +14,7 @@
import java.awt.Color;
/**
- * This helper specifically detects the mod who moved a member to a different voice channel
+ * This auditlog specifically detects the mod who moved a member to a different voice channel
*
* @see GuildVoiceEventHelper - for member only data regarding voice activities
*/
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/member/utils/MemberUtils.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/member/utils/MemberUtils.java
similarity index 94%
rename from src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/member/utils/MemberUtils.java
rename to src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/member/utils/MemberUtils.java
index d7451fd..0a27637 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/member/utils/MemberUtils.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/member/utils/MemberUtils.java
@@ -1,4 +1,4 @@
-package io.github.eggy03.papertrail.bot.listeners.auditlog.helper.member.utils;
+package io.github.eggy03.papertrail.bot.service.auditlog.member.utils;
import io.github.eggy03.papertrail.bot.utils.NumberParseUtils;
import lombok.NonNull;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/message/MessagePinEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/message/MessagePinEventHelper.java
similarity index 92%
rename from src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/message/MessagePinEventHelper.java
rename to src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/message/MessagePinEventHelper.java
index a3adb99..5a0a02d 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/message/MessagePinEventHelper.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/message/MessagePinEventHelper.java
@@ -1,6 +1,6 @@
-package io.github.eggy03.papertrail.bot.listeners.auditlog.helper.message;
+package io.github.eggy03.papertrail.bot.service.auditlog.message;
-import io.github.eggy03.papertrail.bot.listeners.auditlog.helper.message.utils.MessageUtils;
+import io.github.eggy03.papertrail.bot.service.auditlog.message.utils.MessageUtils;
import lombok.NonNull;
import lombok.experimental.UtilityClass;
import lombok.extern.slf4j.Slf4j;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/message/MessageUnpinEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/message/MessageUnpinEventHelper.java
similarity index 92%
rename from src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/message/MessageUnpinEventHelper.java
rename to src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/message/MessageUnpinEventHelper.java
index b2857d5..887aed9 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/message/MessageUnpinEventHelper.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/message/MessageUnpinEventHelper.java
@@ -1,6 +1,6 @@
-package io.github.eggy03.papertrail.bot.listeners.auditlog.helper.message;
+package io.github.eggy03.papertrail.bot.service.auditlog.message;
-import io.github.eggy03.papertrail.bot.listeners.auditlog.helper.message.utils.MessageUtils;
+import io.github.eggy03.papertrail.bot.service.auditlog.message.utils.MessageUtils;
import lombok.NonNull;
import lombok.experimental.UtilityClass;
import lombok.extern.slf4j.Slf4j;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/message/utils/MessageUtils.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/message/utils/MessageUtils.java
similarity index 94%
rename from src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/message/utils/MessageUtils.java
rename to src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/message/utils/MessageUtils.java
index 7a3a90f..fffd5de 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/message/utils/MessageUtils.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/message/utils/MessageUtils.java
@@ -1,4 +1,4 @@
-package io.github.eggy03.papertrail.bot.listeners.auditlog.helper.message.utils;
+package io.github.eggy03.papertrail.bot.service.auditlog.message.utils;
import io.github.eggy03.papertrail.bot.utils.NumberParseUtils;
import lombok.NonNull;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/modactions/BanEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/modactions/BanEventHelper.java
similarity index 96%
rename from src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/modactions/BanEventHelper.java
rename to src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/modactions/BanEventHelper.java
index 9e66a1b..1273554 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/modactions/BanEventHelper.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/modactions/BanEventHelper.java
@@ -1,4 +1,4 @@
-package io.github.eggy03.papertrail.bot.listeners.auditlog.helper.modactions;
+package io.github.eggy03.papertrail.bot.service.auditlog.modactions;
import lombok.NonNull;
import lombok.experimental.UtilityClass;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/modactions/KickEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/modactions/KickEventHelper.java
similarity index 96%
rename from src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/modactions/KickEventHelper.java
rename to src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/modactions/KickEventHelper.java
index 18d5a57..dbf275c 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/modactions/KickEventHelper.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/modactions/KickEventHelper.java
@@ -1,4 +1,4 @@
-package io.github.eggy03.papertrail.bot.listeners.auditlog.helper.modactions;
+package io.github.eggy03.papertrail.bot.service.auditlog.modactions;
import lombok.NonNull;
import lombok.experimental.UtilityClass;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/modactions/UnbanEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/modactions/UnbanEventHelper.java
similarity index 96%
rename from src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/modactions/UnbanEventHelper.java
rename to src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/modactions/UnbanEventHelper.java
index 966a575..fe83bd9 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/modactions/UnbanEventHelper.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/modactions/UnbanEventHelper.java
@@ -1,4 +1,4 @@
-package io.github.eggy03.papertrail.bot.listeners.auditlog.helper.modactions;
+package io.github.eggy03.papertrail.bot.service.auditlog.modactions;
import lombok.NonNull;
import lombok.experimental.UtilityClass;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/onboarding/OnboardingPromptCreateEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/onboarding/OnboardingPromptCreateEventHelper.java
similarity index 97%
rename from src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/onboarding/OnboardingPromptCreateEventHelper.java
rename to src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/onboarding/OnboardingPromptCreateEventHelper.java
index 2172fe7..0191aa1 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/onboarding/OnboardingPromptCreateEventHelper.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/onboarding/OnboardingPromptCreateEventHelper.java
@@ -1,4 +1,4 @@
-package io.github.eggy03.papertrail.bot.listeners.auditlog.helper.onboarding;
+package io.github.eggy03.papertrail.bot.service.auditlog.onboarding;
import io.github.eggy03.papertrail.bot.utils.BooleanUtils;
import lombok.NonNull;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/onboarding/OnboardingPromptDeleteEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/onboarding/OnboardingPromptDeleteEventHelper.java
similarity index 97%
rename from src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/onboarding/OnboardingPromptDeleteEventHelper.java
rename to src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/onboarding/OnboardingPromptDeleteEventHelper.java
index 968758d..a356fe4 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/onboarding/OnboardingPromptDeleteEventHelper.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/onboarding/OnboardingPromptDeleteEventHelper.java
@@ -1,4 +1,4 @@
-package io.github.eggy03.papertrail.bot.listeners.auditlog.helper.onboarding;
+package io.github.eggy03.papertrail.bot.service.auditlog.onboarding;
import io.github.eggy03.papertrail.bot.utils.BooleanUtils;
import lombok.NonNull;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/onboarding/OnboardingPromptUpdateEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/onboarding/OnboardingPromptUpdateEventHelper.java
similarity index 97%
rename from src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/onboarding/OnboardingPromptUpdateEventHelper.java
rename to src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/onboarding/OnboardingPromptUpdateEventHelper.java
index 357a0fd..15ff3fd 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/onboarding/OnboardingPromptUpdateEventHelper.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/onboarding/OnboardingPromptUpdateEventHelper.java
@@ -1,4 +1,4 @@
-package io.github.eggy03.papertrail.bot.listeners.auditlog.helper.onboarding;
+package io.github.eggy03.papertrail.bot.service.auditlog.onboarding;
import io.github.eggy03.papertrail.bot.utils.BooleanUtils;
import lombok.NonNull;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/onboarding/OnboardingUpdateEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/onboarding/OnboardingUpdateEventHelper.java
similarity index 95%
rename from src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/onboarding/OnboardingUpdateEventHelper.java
rename to src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/onboarding/OnboardingUpdateEventHelper.java
index d639278..ffabe93 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/onboarding/OnboardingUpdateEventHelper.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/onboarding/OnboardingUpdateEventHelper.java
@@ -1,6 +1,6 @@
-package io.github.eggy03.papertrail.bot.listeners.auditlog.helper.onboarding;
+package io.github.eggy03.papertrail.bot.service.auditlog.onboarding;
-import io.github.eggy03.papertrail.bot.listeners.auditlog.helper.onboarding.utils.OnboardingUtils;
+import io.github.eggy03.papertrail.bot.service.auditlog.onboarding.utils.OnboardingUtils;
import io.github.eggy03.papertrail.bot.utils.BooleanUtils;
import lombok.NonNull;
import lombok.experimental.UtilityClass;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/onboarding/utils/OnboardingUtils.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/onboarding/utils/OnboardingUtils.java
similarity index 95%
rename from src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/onboarding/utils/OnboardingUtils.java
rename to src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/onboarding/utils/OnboardingUtils.java
index b7892e3..77c6674 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/onboarding/utils/OnboardingUtils.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/onboarding/utils/OnboardingUtils.java
@@ -1,4 +1,4 @@
-package io.github.eggy03.papertrail.bot.listeners.auditlog.helper.onboarding.utils;
+package io.github.eggy03.papertrail.bot.service.auditlog.onboarding.utils;
import io.github.eggy03.papertrail.bot.utils.NumberParseUtils;
import lombok.NonNull;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/role/RoleCreateEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/role/RoleCreateEventHelper.java
similarity index 97%
rename from src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/role/RoleCreateEventHelper.java
rename to src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/role/RoleCreateEventHelper.java
index 7b7ad57..75aabc3 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/role/RoleCreateEventHelper.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/role/RoleCreateEventHelper.java
@@ -1,4 +1,4 @@
-package io.github.eggy03.papertrail.bot.listeners.auditlog.helper.role;
+package io.github.eggy03.papertrail.bot.service.auditlog.role;
import lombok.NonNull;
import lombok.experimental.UtilityClass;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/role/RoleDeleteEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/role/RoleDeleteEventHelper.java
similarity index 95%
rename from src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/role/RoleDeleteEventHelper.java
rename to src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/role/RoleDeleteEventHelper.java
index 06fa82e..7fc8646 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/role/RoleDeleteEventHelper.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/role/RoleDeleteEventHelper.java
@@ -1,6 +1,6 @@
-package io.github.eggy03.papertrail.bot.listeners.auditlog.helper.role;
+package io.github.eggy03.papertrail.bot.service.auditlog.role;
-import io.github.eggy03.papertrail.bot.listeners.auditlog.helper.role.utils.RoleUtils;
+import io.github.eggy03.papertrail.bot.service.auditlog.role.utils.RoleUtils;
import io.github.eggy03.papertrail.bot.utils.BooleanUtils;
import lombok.NonNull;
import lombok.experimental.UtilityClass;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/role/RoleUpdateEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/role/RoleUpdateEventHelper.java
similarity index 96%
rename from src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/role/RoleUpdateEventHelper.java
rename to src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/role/RoleUpdateEventHelper.java
index a08c544..e0777ef 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/role/RoleUpdateEventHelper.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/role/RoleUpdateEventHelper.java
@@ -1,6 +1,6 @@
-package io.github.eggy03.papertrail.bot.listeners.auditlog.helper.role;
+package io.github.eggy03.papertrail.bot.service.auditlog.role;
-import io.github.eggy03.papertrail.bot.listeners.auditlog.helper.role.utils.RoleUtils;
+import io.github.eggy03.papertrail.bot.service.auditlog.role.utils.RoleUtils;
import io.github.eggy03.papertrail.bot.utils.BooleanUtils;
import lombok.NonNull;
import lombok.experimental.UtilityClass;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/role/utils/RoleUtils.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/role/utils/RoleUtils.java
similarity index 97%
rename from src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/role/utils/RoleUtils.java
rename to src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/role/utils/RoleUtils.java
index a291126..5162434 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/role/utils/RoleUtils.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/role/utils/RoleUtils.java
@@ -1,4 +1,4 @@
-package io.github.eggy03.papertrail.bot.listeners.auditlog.helper.role.utils;
+package io.github.eggy03.papertrail.bot.service.auditlog.role.utils;
import io.github.eggy03.papertrail.bot.utils.NumberParseUtils;
import lombok.NonNull;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/scheduledevent/ScheduledEventCreateEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/scheduledevent/ScheduledEventCreateEventHelper.java
similarity index 94%
rename from src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/scheduledevent/ScheduledEventCreateEventHelper.java
rename to src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/scheduledevent/ScheduledEventCreateEventHelper.java
index c803ec8..bdcfcbe 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/scheduledevent/ScheduledEventCreateEventHelper.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/scheduledevent/ScheduledEventCreateEventHelper.java
@@ -1,6 +1,6 @@
-package io.github.eggy03.papertrail.bot.listeners.auditlog.helper.scheduledevent;
+package io.github.eggy03.papertrail.bot.service.auditlog.scheduledevent;
-import io.github.eggy03.papertrail.bot.listeners.auditlog.helper.scheduledevent.utils.ScheduledEventUtils;
+import io.github.eggy03.papertrail.bot.service.auditlog.scheduledevent.utils.ScheduledEventUtils;
import lombok.NonNull;
import lombok.experimental.UtilityClass;
import lombok.extern.slf4j.Slf4j;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/scheduledevent/ScheduledEventDeleteEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/scheduledevent/ScheduledEventDeleteEventHelper.java
similarity index 94%
rename from src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/scheduledevent/ScheduledEventDeleteEventHelper.java
rename to src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/scheduledevent/ScheduledEventDeleteEventHelper.java
index 5519554..4387f70 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/scheduledevent/ScheduledEventDeleteEventHelper.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/scheduledevent/ScheduledEventDeleteEventHelper.java
@@ -1,6 +1,6 @@
-package io.github.eggy03.papertrail.bot.listeners.auditlog.helper.scheduledevent;
+package io.github.eggy03.papertrail.bot.service.auditlog.scheduledevent;
-import io.github.eggy03.papertrail.bot.listeners.auditlog.helper.scheduledevent.utils.ScheduledEventUtils;
+import io.github.eggy03.papertrail.bot.service.auditlog.scheduledevent.utils.ScheduledEventUtils;
import lombok.NonNull;
import lombok.experimental.UtilityClass;
import lombok.extern.slf4j.Slf4j;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/scheduledevent/ScheduledEventUpdateEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/scheduledevent/ScheduledEventUpdateEventHelper.java
similarity index 95%
rename from src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/scheduledevent/ScheduledEventUpdateEventHelper.java
rename to src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/scheduledevent/ScheduledEventUpdateEventHelper.java
index f578c90..e1722f9 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/scheduledevent/ScheduledEventUpdateEventHelper.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/scheduledevent/ScheduledEventUpdateEventHelper.java
@@ -1,6 +1,6 @@
-package io.github.eggy03.papertrail.bot.listeners.auditlog.helper.scheduledevent;
+package io.github.eggy03.papertrail.bot.service.auditlog.scheduledevent;
-import io.github.eggy03.papertrail.bot.listeners.auditlog.helper.scheduledevent.utils.ScheduledEventUtils;
+import io.github.eggy03.papertrail.bot.service.auditlog.scheduledevent.utils.ScheduledEventUtils;
import lombok.NonNull;
import lombok.experimental.UtilityClass;
import lombok.extern.slf4j.Slf4j;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/scheduledevent/utils/ScheduledEventUtils.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/scheduledevent/utils/ScheduledEventUtils.java
similarity index 98%
rename from src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/scheduledevent/utils/ScheduledEventUtils.java
rename to src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/scheduledevent/utils/ScheduledEventUtils.java
index 39843ad..8a15dad 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/scheduledevent/utils/ScheduledEventUtils.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/scheduledevent/utils/ScheduledEventUtils.java
@@ -1,4 +1,4 @@
-package io.github.eggy03.papertrail.bot.listeners.auditlog.helper.scheduledevent.utils;
+package io.github.eggy03.papertrail.bot.service.auditlog.scheduledevent.utils;
import io.github.eggy03.papertrail.bot.utils.NumberParseUtils;
import lombok.NonNull;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/soundboard/SoundboardSoundCreateEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/soundboard/SoundboardSoundCreateEventHelper.java
similarity index 93%
rename from src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/soundboard/SoundboardSoundCreateEventHelper.java
rename to src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/soundboard/SoundboardSoundCreateEventHelper.java
index cb8fb9b..21615d5 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/soundboard/SoundboardSoundCreateEventHelper.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/soundboard/SoundboardSoundCreateEventHelper.java
@@ -1,6 +1,6 @@
-package io.github.eggy03.papertrail.bot.listeners.auditlog.helper.soundboard;
+package io.github.eggy03.papertrail.bot.service.auditlog.soundboard;
-import io.github.eggy03.papertrail.bot.listeners.auditlog.helper.soundboard.utils.SoundboardUtils;
+import io.github.eggy03.papertrail.bot.service.auditlog.soundboard.utils.SoundboardUtils;
import lombok.NonNull;
import lombok.experimental.UtilityClass;
import lombok.extern.slf4j.Slf4j;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/soundboard/SoundboardSoundDeleteEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/soundboard/SoundboardSoundDeleteEventHelper.java
similarity index 93%
rename from src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/soundboard/SoundboardSoundDeleteEventHelper.java
rename to src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/soundboard/SoundboardSoundDeleteEventHelper.java
index 0d50e2a..bc8c09a 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/soundboard/SoundboardSoundDeleteEventHelper.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/soundboard/SoundboardSoundDeleteEventHelper.java
@@ -1,6 +1,6 @@
-package io.github.eggy03.papertrail.bot.listeners.auditlog.helper.soundboard;
+package io.github.eggy03.papertrail.bot.service.auditlog.soundboard;
-import io.github.eggy03.papertrail.bot.listeners.auditlog.helper.soundboard.utils.SoundboardUtils;
+import io.github.eggy03.papertrail.bot.service.auditlog.soundboard.utils.SoundboardUtils;
import lombok.NonNull;
import lombok.experimental.UtilityClass;
import lombok.extern.slf4j.Slf4j;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/soundboard/SoundboardSoundUpdateEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/soundboard/SoundboardSoundUpdateEventHelper.java
similarity index 95%
rename from src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/soundboard/SoundboardSoundUpdateEventHelper.java
rename to src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/soundboard/SoundboardSoundUpdateEventHelper.java
index 97f17d9..7240b65 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/soundboard/SoundboardSoundUpdateEventHelper.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/soundboard/SoundboardSoundUpdateEventHelper.java
@@ -1,6 +1,6 @@
-package io.github.eggy03.papertrail.bot.listeners.auditlog.helper.soundboard;
+package io.github.eggy03.papertrail.bot.service.auditlog.soundboard;
-import io.github.eggy03.papertrail.bot.listeners.auditlog.helper.soundboard.utils.SoundboardUtils;
+import io.github.eggy03.papertrail.bot.service.auditlog.soundboard.utils.SoundboardUtils;
import lombok.NonNull;
import lombok.experimental.UtilityClass;
import lombok.extern.slf4j.Slf4j;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/soundboard/utils/SoundboardUtils.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/soundboard/utils/SoundboardUtils.java
similarity index 86%
rename from src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/soundboard/utils/SoundboardUtils.java
rename to src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/soundboard/utils/SoundboardUtils.java
index e50fd6a..093d94f 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/soundboard/utils/SoundboardUtils.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/soundboard/utils/SoundboardUtils.java
@@ -1,4 +1,4 @@
-package io.github.eggy03.papertrail.bot.listeners.auditlog.helper.soundboard.utils;
+package io.github.eggy03.papertrail.bot.service.auditlog.soundboard.utils;
import io.github.eggy03.papertrail.bot.utils.NumberParseUtils;
import lombok.experimental.UtilityClass;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/stage/StageInstanceCreateEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/stage/StageInstanceCreateEventHelper.java
similarity index 93%
rename from src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/stage/StageInstanceCreateEventHelper.java
rename to src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/stage/StageInstanceCreateEventHelper.java
index 5b3e25e..44f4aec 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/stage/StageInstanceCreateEventHelper.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/stage/StageInstanceCreateEventHelper.java
@@ -1,6 +1,6 @@
-package io.github.eggy03.papertrail.bot.listeners.auditlog.helper.stage;
+package io.github.eggy03.papertrail.bot.service.auditlog.stage;
-import io.github.eggy03.papertrail.bot.listeners.auditlog.helper.stage.utils.StageUtils;
+import io.github.eggy03.papertrail.bot.service.auditlog.stage.utils.StageUtils;
import lombok.NonNull;
import lombok.experimental.UtilityClass;
import lombok.extern.slf4j.Slf4j;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/stage/StageInstanceDeleteEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/stage/StageInstanceDeleteEventHelper.java
similarity index 93%
rename from src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/stage/StageInstanceDeleteEventHelper.java
rename to src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/stage/StageInstanceDeleteEventHelper.java
index 399b67f..1add32b 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/stage/StageInstanceDeleteEventHelper.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/stage/StageInstanceDeleteEventHelper.java
@@ -1,6 +1,6 @@
-package io.github.eggy03.papertrail.bot.listeners.auditlog.helper.stage;
+package io.github.eggy03.papertrail.bot.service.auditlog.stage;
-import io.github.eggy03.papertrail.bot.listeners.auditlog.helper.stage.utils.StageUtils;
+import io.github.eggy03.papertrail.bot.service.auditlog.stage.utils.StageUtils;
import lombok.NonNull;
import lombok.experimental.UtilityClass;
import lombok.extern.slf4j.Slf4j;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/stage/StageInstanceUpdateEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/stage/StageInstanceUpdateEventHelper.java
similarity index 94%
rename from src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/stage/StageInstanceUpdateEventHelper.java
rename to src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/stage/StageInstanceUpdateEventHelper.java
index 219c487..e321d62 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/stage/StageInstanceUpdateEventHelper.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/stage/StageInstanceUpdateEventHelper.java
@@ -1,6 +1,6 @@
-package io.github.eggy03.papertrail.bot.listeners.auditlog.helper.stage;
+package io.github.eggy03.papertrail.bot.service.auditlog.stage;
-import io.github.eggy03.papertrail.bot.listeners.auditlog.helper.stage.utils.StageUtils;
+import io.github.eggy03.papertrail.bot.service.auditlog.stage.utils.StageUtils;
import lombok.NonNull;
import lombok.experimental.UtilityClass;
import lombok.extern.slf4j.Slf4j;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/stage/utils/StageUtils.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/stage/utils/StageUtils.java
similarity index 90%
rename from src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/stage/utils/StageUtils.java
rename to src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/stage/utils/StageUtils.java
index 85f9716..edcee3d 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/stage/utils/StageUtils.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/stage/utils/StageUtils.java
@@ -1,4 +1,4 @@
-package io.github.eggy03.papertrail.bot.listeners.auditlog.helper.stage.utils;
+package io.github.eggy03.papertrail.bot.service.auditlog.stage.utils;
import io.github.eggy03.papertrail.bot.utils.NumberParseUtils;
import lombok.experimental.UtilityClass;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/sticker/StickerCreateEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/sticker/StickerCreateEventHelper.java
similarity index 95%
rename from src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/sticker/StickerCreateEventHelper.java
rename to src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/sticker/StickerCreateEventHelper.java
index 6949e4b..e9ef86c 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/sticker/StickerCreateEventHelper.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/sticker/StickerCreateEventHelper.java
@@ -1,6 +1,6 @@
-package io.github.eggy03.papertrail.bot.listeners.auditlog.helper.sticker;
+package io.github.eggy03.papertrail.bot.service.auditlog.sticker;
-import io.github.eggy03.papertrail.bot.listeners.auditlog.helper.sticker.utils.StickerUtils;
+import io.github.eggy03.papertrail.bot.service.auditlog.sticker.utils.StickerUtils;
import lombok.NonNull;
import lombok.experimental.UtilityClass;
import lombok.extern.slf4j.Slf4j;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/sticker/StickerDeleteEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/sticker/StickerDeleteEventHelper.java
similarity index 95%
rename from src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/sticker/StickerDeleteEventHelper.java
rename to src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/sticker/StickerDeleteEventHelper.java
index aafcf0d..64ca7b8 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/sticker/StickerDeleteEventHelper.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/sticker/StickerDeleteEventHelper.java
@@ -1,6 +1,6 @@
-package io.github.eggy03.papertrail.bot.listeners.auditlog.helper.sticker;
+package io.github.eggy03.papertrail.bot.service.auditlog.sticker;
-import io.github.eggy03.papertrail.bot.listeners.auditlog.helper.sticker.utils.StickerUtils;
+import io.github.eggy03.papertrail.bot.service.auditlog.sticker.utils.StickerUtils;
import lombok.NonNull;
import lombok.experimental.UtilityClass;
import lombok.extern.slf4j.Slf4j;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/sticker/StickerUpdateEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/sticker/StickerUpdateEventHelper.java
similarity index 95%
rename from src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/sticker/StickerUpdateEventHelper.java
rename to src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/sticker/StickerUpdateEventHelper.java
index 94ff985..1bf3200 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/sticker/StickerUpdateEventHelper.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/sticker/StickerUpdateEventHelper.java
@@ -1,6 +1,6 @@
-package io.github.eggy03.papertrail.bot.listeners.auditlog.helper.sticker;
+package io.github.eggy03.papertrail.bot.service.auditlog.sticker;
-import io.github.eggy03.papertrail.bot.listeners.auditlog.helper.sticker.utils.StickerUtils;
+import io.github.eggy03.papertrail.bot.service.auditlog.sticker.utils.StickerUtils;
import lombok.NonNull;
import lombok.experimental.UtilityClass;
import lombok.extern.slf4j.Slf4j;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/sticker/utils/StickerUtils.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/sticker/utils/StickerUtils.java
similarity index 79%
rename from src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/sticker/utils/StickerUtils.java
rename to src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/sticker/utils/StickerUtils.java
index ad62903..cae906c 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/sticker/utils/StickerUtils.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/sticker/utils/StickerUtils.java
@@ -1,4 +1,4 @@
-package io.github.eggy03.papertrail.bot.listeners.auditlog.helper.sticker.utils;
+package io.github.eggy03.papertrail.bot.service.auditlog.sticker.utils;
import lombok.NonNull;
import lombok.experimental.UtilityClass;
@@ -20,7 +20,7 @@ public class StickerUtils {
public static String resolveStickerUrl(@NonNull GenericGuildEvent event, @Nullable Object stickerIdObject) {
if (stickerIdObject == null) {
- log.debug("stickerIdObject is null (guild={})", event.getGuild().getId());
+ log.debug("stickerIdObject is null (auditlogsupl={})", event.getGuild().getId());
return FALLBACK_STRING;
}
@@ -28,7 +28,7 @@ public static String resolveStickerUrl(@NonNull GenericGuildEvent event, @Nullab
GuildSticker sticker = event.getGuild().getStickerById(String.valueOf(stickerIdObject));
if (sticker == null) {
- log.debug("sticker not found (stickerIdObject={}, guild={})", stickerIdStr, event.getGuild().getId());
+ log.debug("sticker not found (stickerIdObject={}, auditlogsupl={})", stickerIdStr, event.getGuild().getId());
return stickerIdStr;
}
@@ -43,7 +43,7 @@ public static String resolveStickerUrl(@NonNull GenericGuildEvent event, @Nullab
public static String resolveRelatedEmoji(@NonNull GenericGuildEvent event, @Nullable Object emojiIdObject) {
if (emojiIdObject == null) {
- log.debug("emojiIdObject is null (guild={})", event.getGuild().getId());
+ log.debug("emojiIdObject is null (auditlogsupl={})", event.getGuild().getId());
return FALLBACK_STRING;
}
@@ -54,13 +54,13 @@ public static String resolveRelatedEmoji(@NonNull GenericGuildEvent event, @Null
Emoji emoji = event.getGuild().getEmojiById(emojiIdLong);
if (emoji == null) {
- log.debug("custom emoji not found (emojiIdLong={}, guild={})", emojiIdLong, event.getGuild().getId());
+ log.debug("custom emoji not found (emojiIdLong={}, auditlogsupl={})", emojiIdLong, event.getGuild().getId());
return emojiIdString;
}
return emoji.getFormatted();
} catch (NumberFormatException e) {
- log.debug("value is not numeric, treating as Unicode (value={}, guild={})", emojiIdString, event.getGuild().getId());
+ log.debug("value is not numeric, treating as Unicode (value={}, auditlogsupl={})", emojiIdString, event.getGuild().getId());
return emojiIdString;
}
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/thread/ThreadCreateEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/thread/ThreadCreateEventHelper.java
similarity index 93%
rename from src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/thread/ThreadCreateEventHelper.java
rename to src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/thread/ThreadCreateEventHelper.java
index 797b4b6..cd28dbc 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/thread/ThreadCreateEventHelper.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/thread/ThreadCreateEventHelper.java
@@ -1,7 +1,7 @@
-package io.github.eggy03.papertrail.bot.listeners.auditlog.helper.thread;
+package io.github.eggy03.papertrail.bot.service.auditlog.thread;
-import io.github.eggy03.papertrail.bot.listeners.auditlog.helper.channel.utils.ChannelUtils;
-import io.github.eggy03.papertrail.bot.listeners.auditlog.helper.thread.utils.ThreadUtils;
+import io.github.eggy03.papertrail.bot.service.auditlog.channel.utils.ChannelUtils;
+import io.github.eggy03.papertrail.bot.service.auditlog.thread.utils.ThreadUtils;
import io.github.eggy03.papertrail.bot.utils.BooleanUtils;
import io.github.eggy03.papertrail.bot.utils.DurationUtils;
import lombok.NonNull;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/thread/ThreadDeleteEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/thread/ThreadDeleteEventHelper.java
similarity index 93%
rename from src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/thread/ThreadDeleteEventHelper.java
rename to src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/thread/ThreadDeleteEventHelper.java
index 56bb1e6..4aaf4fd 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/thread/ThreadDeleteEventHelper.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/thread/ThreadDeleteEventHelper.java
@@ -1,7 +1,7 @@
-package io.github.eggy03.papertrail.bot.listeners.auditlog.helper.thread;
+package io.github.eggy03.papertrail.bot.service.auditlog.thread;
-import io.github.eggy03.papertrail.bot.listeners.auditlog.helper.channel.utils.ChannelUtils;
-import io.github.eggy03.papertrail.bot.listeners.auditlog.helper.thread.utils.ThreadUtils;
+import io.github.eggy03.papertrail.bot.service.auditlog.channel.utils.ChannelUtils;
+import io.github.eggy03.papertrail.bot.service.auditlog.thread.utils.ThreadUtils;
import io.github.eggy03.papertrail.bot.utils.BooleanUtils;
import io.github.eggy03.papertrail.bot.utils.DurationUtils;
import lombok.NonNull;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/thread/ThreadUpdateEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/thread/ThreadUpdateEventHelper.java
similarity index 95%
rename from src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/thread/ThreadUpdateEventHelper.java
rename to src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/thread/ThreadUpdateEventHelper.java
index dec7d32..99c4fe9 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/thread/ThreadUpdateEventHelper.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/thread/ThreadUpdateEventHelper.java
@@ -1,7 +1,7 @@
-package io.github.eggy03.papertrail.bot.listeners.auditlog.helper.thread;
+package io.github.eggy03.papertrail.bot.service.auditlog.thread;
-import io.github.eggy03.papertrail.bot.listeners.auditlog.helper.channel.utils.ChannelUtils;
-import io.github.eggy03.papertrail.bot.listeners.auditlog.helper.thread.utils.ThreadUtils;
+import io.github.eggy03.papertrail.bot.service.auditlog.channel.utils.ChannelUtils;
+import io.github.eggy03.papertrail.bot.service.auditlog.thread.utils.ThreadUtils;
import io.github.eggy03.papertrail.bot.utils.BooleanUtils;
import io.github.eggy03.papertrail.bot.utils.DurationUtils;
import lombok.NonNull;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/thread/utils/ThreadUtils.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/thread/utils/ThreadUtils.java
similarity index 89%
rename from src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/thread/utils/ThreadUtils.java
rename to src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/thread/utils/ThreadUtils.java
index 5d16167..ba40bb8 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/thread/utils/ThreadUtils.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/thread/utils/ThreadUtils.java
@@ -1,4 +1,4 @@
-package io.github.eggy03.papertrail.bot.listeners.auditlog.helper.thread.utils;
+package io.github.eggy03.papertrail.bot.service.auditlog.thread.utils;
import io.github.eggy03.papertrail.bot.utils.NumberParseUtils;
import lombok.NonNull;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/webhook/WebhookCreateEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/webhook/WebhookCreateEventHelper.java
similarity index 91%
rename from src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/webhook/WebhookCreateEventHelper.java
rename to src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/webhook/WebhookCreateEventHelper.java
index 51d5b49..4f74318 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/webhook/WebhookCreateEventHelper.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/webhook/WebhookCreateEventHelper.java
@@ -1,7 +1,7 @@
-package io.github.eggy03.papertrail.bot.listeners.auditlog.helper.webhook;
+package io.github.eggy03.papertrail.bot.service.auditlog.webhook;
-import io.github.eggy03.papertrail.bot.listeners.auditlog.helper.guild.utils.GuildUtils;
-import io.github.eggy03.papertrail.bot.listeners.auditlog.helper.webhook.utils.WebhookUtils;
+import io.github.eggy03.papertrail.bot.service.auditlog.guild.utils.GuildUtils;
+import io.github.eggy03.papertrail.bot.service.auditlog.webhook.utils.WebhookUtils;
import lombok.NonNull;
import lombok.experimental.UtilityClass;
import lombok.extern.slf4j.Slf4j;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/webhook/WebhookRemoveEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/webhook/WebhookRemoveEventHelper.java
similarity index 91%
rename from src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/webhook/WebhookRemoveEventHelper.java
rename to src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/webhook/WebhookRemoveEventHelper.java
index 24fdeb6..cfea12a 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/webhook/WebhookRemoveEventHelper.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/webhook/WebhookRemoveEventHelper.java
@@ -1,7 +1,7 @@
-package io.github.eggy03.papertrail.bot.listeners.auditlog.helper.webhook;
+package io.github.eggy03.papertrail.bot.service.auditlog.webhook;
-import io.github.eggy03.papertrail.bot.listeners.auditlog.helper.guild.utils.GuildUtils;
-import io.github.eggy03.papertrail.bot.listeners.auditlog.helper.webhook.utils.WebhookUtils;
+import io.github.eggy03.papertrail.bot.service.auditlog.guild.utils.GuildUtils;
+import io.github.eggy03.papertrail.bot.service.auditlog.webhook.utils.WebhookUtils;
import lombok.NonNull;
import lombok.experimental.UtilityClass;
import lombok.extern.slf4j.Slf4j;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/webhook/WebhookUpdateEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/webhook/WebhookUpdateEventHelper.java
similarity index 93%
rename from src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/webhook/WebhookUpdateEventHelper.java
rename to src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/webhook/WebhookUpdateEventHelper.java
index 0f4b1bf..2b30424 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/webhook/WebhookUpdateEventHelper.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/webhook/WebhookUpdateEventHelper.java
@@ -1,7 +1,7 @@
-package io.github.eggy03.papertrail.bot.listeners.auditlog.helper.webhook;
+package io.github.eggy03.papertrail.bot.service.auditlog.webhook;
-import io.github.eggy03.papertrail.bot.listeners.auditlog.helper.guild.utils.GuildUtils;
-import io.github.eggy03.papertrail.bot.listeners.auditlog.helper.webhook.utils.WebhookUtils;
+import io.github.eggy03.papertrail.bot.service.auditlog.guild.utils.GuildUtils;
+import io.github.eggy03.papertrail.bot.service.auditlog.webhook.utils.WebhookUtils;
import lombok.NonNull;
import lombok.experimental.UtilityClass;
import lombok.extern.slf4j.Slf4j;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/webhook/utils/WebhookUtils.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/webhook/utils/WebhookUtils.java
similarity index 90%
rename from src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/webhook/utils/WebhookUtils.java
rename to src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/webhook/utils/WebhookUtils.java
index 2c0a3f1..202577c 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/helper/webhook/utils/WebhookUtils.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/webhook/utils/WebhookUtils.java
@@ -1,4 +1,4 @@
-package io.github.eggy03.papertrail.bot.listeners.auditlog.helper.webhook.utils;
+package io.github.eggy03.papertrail.bot.service.auditlog.webhook.utils;
import io.github.eggy03.papertrail.bot.utils.NumberParseUtils;
import lombok.NonNull;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlogsupl/helper/guild/GuildMemberJoinEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlogsupl/GuildMemberJoinEventHelper.java
similarity index 96%
rename from src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlogsupl/helper/guild/GuildMemberJoinEventHelper.java
rename to src/main/java/io/github/eggy03/papertrail/bot/service/auditlogsupl/GuildMemberJoinEventHelper.java
index 48f35ce..5eae4e0 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlogsupl/helper/guild/GuildMemberJoinEventHelper.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlogsupl/GuildMemberJoinEventHelper.java
@@ -1,4 +1,4 @@
-package io.github.eggy03.papertrail.bot.listeners.auditlogsupl.helper.guild;
+package io.github.eggy03.papertrail.bot.service.auditlogsupl;
import io.github.eggy03.papertrail.bot.utils.BooleanUtils;
import io.github.eggy03.papertrail.bot.utils.DurationUtils;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlogsupl/helper/guild/GuildMemberRemoveEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlogsupl/GuildMemberRemoveEventHelper.java
similarity index 97%
rename from src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlogsupl/helper/guild/GuildMemberRemoveEventHelper.java
rename to src/main/java/io/github/eggy03/papertrail/bot/service/auditlogsupl/GuildMemberRemoveEventHelper.java
index 30dfd87..90009a8 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlogsupl/helper/guild/GuildMemberRemoveEventHelper.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlogsupl/GuildMemberRemoveEventHelper.java
@@ -1,4 +1,4 @@
-package io.github.eggy03.papertrail.bot.listeners.auditlogsupl.helper.guild;
+package io.github.eggy03.papertrail.bot.service.auditlogsupl;
import io.github.eggy03.papertrail.bot.utils.DurationUtils;
import lombok.NonNull;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlogsupl/helper/guild/GuildMemberUpdateBoostTimeEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlogsupl/GuildMemberUpdateBoostTimeEventHelper.java
similarity index 96%
rename from src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlogsupl/helper/guild/GuildMemberUpdateBoostTimeEventHelper.java
rename to src/main/java/io/github/eggy03/papertrail/bot/service/auditlogsupl/GuildMemberUpdateBoostTimeEventHelper.java
index a2d6380..8057567 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlogsupl/helper/guild/GuildMemberUpdateBoostTimeEventHelper.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlogsupl/GuildMemberUpdateBoostTimeEventHelper.java
@@ -1,4 +1,4 @@
-package io.github.eggy03.papertrail.bot.listeners.auditlogsupl.helper.guild;
+package io.github.eggy03.papertrail.bot.service.auditlogsupl;
import lombok.NonNull;
import lombok.experimental.UtilityClass;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlogsupl/helper/guild/GuildPollEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlogsupl/GuildPollEventHelper.java
similarity index 97%
rename from src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlogsupl/helper/guild/GuildPollEventHelper.java
rename to src/main/java/io/github/eggy03/papertrail/bot/service/auditlogsupl/GuildPollEventHelper.java
index d81ee32..46a709e 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlogsupl/helper/guild/GuildPollEventHelper.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlogsupl/GuildPollEventHelper.java
@@ -1,4 +1,4 @@
-package io.github.eggy03.papertrail.bot.listeners.auditlogsupl.helper.guild;
+package io.github.eggy03.papertrail.bot.service.auditlogsupl;
import io.github.eggy03.papertrail.bot.utils.BooleanUtils;
import lombok.NonNull;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlogsupl/helper/guild/GuildUpdateBoostCountEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlogsupl/GuildUpdateBoostCountEventHelper.java
similarity index 95%
rename from src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlogsupl/helper/guild/GuildUpdateBoostCountEventHelper.java
rename to src/main/java/io/github/eggy03/papertrail/bot/service/auditlogsupl/GuildUpdateBoostCountEventHelper.java
index b3ad6b2..b69f17f 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlogsupl/helper/guild/GuildUpdateBoostCountEventHelper.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlogsupl/GuildUpdateBoostCountEventHelper.java
@@ -1,4 +1,4 @@
-package io.github.eggy03.papertrail.bot.listeners.auditlogsupl.helper.guild;
+package io.github.eggy03.papertrail.bot.service.auditlogsupl;
import lombok.NonNull;
import lombok.experimental.UtilityClass;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlogsupl/helper/guild/GuildUpdateBoostTierEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlogsupl/GuildUpdateBoostTierEventHelper.java
similarity index 96%
rename from src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlogsupl/helper/guild/GuildUpdateBoostTierEventHelper.java
rename to src/main/java/io/github/eggy03/papertrail/bot/service/auditlogsupl/GuildUpdateBoostTierEventHelper.java
index 6a7301b..c3983cf 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlogsupl/helper/guild/GuildUpdateBoostTierEventHelper.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlogsupl/GuildUpdateBoostTierEventHelper.java
@@ -1,4 +1,4 @@
-package io.github.eggy03.papertrail.bot.listeners.auditlogsupl.helper.guild;
+package io.github.eggy03.papertrail.bot.service.auditlogsupl;
import lombok.NonNull;
import lombok.experimental.UtilityClass;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlogsupl/helper/guild/GuildVoiceEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlogsupl/GuildVoiceEventHelper.java
similarity index 97%
rename from src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlogsupl/helper/guild/GuildVoiceEventHelper.java
rename to src/main/java/io/github/eggy03/papertrail/bot/service/auditlogsupl/GuildVoiceEventHelper.java
index 176bf5a..f28bb60 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlogsupl/helper/guild/GuildVoiceEventHelper.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlogsupl/GuildVoiceEventHelper.java
@@ -1,4 +1,4 @@
-package io.github.eggy03.papertrail.bot.listeners.auditlogsupl.helper.guild;
+package io.github.eggy03.papertrail.bot.service.auditlogsupl;
import lombok.NonNull;
import lombok.experimental.UtilityClass;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/messagelog/helper/MessageLogMessageDeleteEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/messagelog/MessageLogMessageDeleteEventHelper.java
similarity index 97%
rename from src/main/java/io/github/eggy03/papertrail/bot/listeners/messagelog/helper/MessageLogMessageDeleteEventHelper.java
rename to src/main/java/io/github/eggy03/papertrail/bot/service/messagelog/MessageLogMessageDeleteEventHelper.java
index 2bb8e5b..f0abf4b 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/messagelog/helper/MessageLogMessageDeleteEventHelper.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/messagelog/MessageLogMessageDeleteEventHelper.java
@@ -1,4 +1,4 @@
-package io.github.eggy03.papertrail.bot.listeners.messagelog.helper;
+package io.github.eggy03.papertrail.bot.service.messagelog;
import com.google.common.base.Splitter;
import io.github.eggy03.papertrail.sdk.client.MessageLogContentClient;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/messagelog/helper/MessageLogMessageReceivedEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/messagelog/MessageLogMessageReceivedEventHelper.java
similarity index 90%
rename from src/main/java/io/github/eggy03/papertrail/bot/listeners/messagelog/helper/MessageLogMessageReceivedEventHelper.java
rename to src/main/java/io/github/eggy03/papertrail/bot/service/messagelog/MessageLogMessageReceivedEventHelper.java
index 417a6bb..88951c3 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/messagelog/helper/MessageLogMessageReceivedEventHelper.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/messagelog/MessageLogMessageReceivedEventHelper.java
@@ -1,4 +1,4 @@
-package io.github.eggy03.papertrail.bot.listeners.messagelog.helper;
+package io.github.eggy03.papertrail.bot.service.messagelog;
import io.github.eggy03.papertrail.sdk.client.MessageLogContentClient;
import lombok.NonNull;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/messagelog/helper/MessageLogMessageUpdateEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/messagelog/MessageLogMessageUpdateEventHelper.java
similarity index 98%
rename from src/main/java/io/github/eggy03/papertrail/bot/listeners/messagelog/helper/MessageLogMessageUpdateEventHelper.java
rename to src/main/java/io/github/eggy03/papertrail/bot/service/messagelog/MessageLogMessageUpdateEventHelper.java
index 230daca..1256dea 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/messagelog/helper/MessageLogMessageUpdateEventHelper.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/messagelog/MessageLogMessageUpdateEventHelper.java
@@ -1,4 +1,4 @@
-package io.github.eggy03.papertrail.bot.listeners.messagelog.helper;
+package io.github.eggy03.papertrail.bot.service.messagelog;
import com.google.common.base.Splitter;
import io.github.eggy03.papertrail.sdk.client.MessageLogContentClient;
From ee68bc708037d4c17a9d620d0bccf66f8d4282b0 Mon Sep 17 00:00:00 2001
From: Egg-03 <111327101+eggy03@users.noreply.github.com>
Date: Fri, 29 May 2026 11:54:55 +0530
Subject: [PATCH 08/66] refactor(automod): consolidate auto-moderation helpers
into a service
- Merge helper classes into `AutoModerationService`
- Move `AutoModUtils` to `utils.auditlog` package
- Refactor `AuditLogListener` to use `@RunOnVirtualThread` and inject the new service
Signed-off-by: Egg-03 <111327101+eggy03@users.noreply.github.com>
---
.../listeners/auditlog/AuditLogListener.java | 39 ++-
.../auditlog/AutoModerationService.java | 240 ++++++++++++++++++
...utoModerationFlagToChannelEventHelper.java | 51 ----
...utoModerationMemberTimeoutEventHelper.java | 51 ----
...ModerationRuleBlockMessageEventHelper.java | 51 ----
.../AutoModerationRuleCreateEventHelper.java | 71 ------
.../AutoModerationRuleDeleteEventHelper.java | 54 ----
.../AutoModerationRuleUpdateEventHelper.java | 52 ----
.../auditlog}/AutoModUtils.java | 2 +-
9 files changed, 258 insertions(+), 353 deletions(-)
create mode 100644 src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/AutoModerationService.java
delete mode 100644 src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/automod/AutoModerationFlagToChannelEventHelper.java
delete mode 100644 src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/automod/AutoModerationMemberTimeoutEventHelper.java
delete mode 100644 src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/automod/AutoModerationRuleBlockMessageEventHelper.java
delete mode 100644 src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/automod/AutoModerationRuleCreateEventHelper.java
delete mode 100644 src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/automod/AutoModerationRuleDeleteEventHelper.java
delete mode 100644 src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/automod/AutoModerationRuleUpdateEventHelper.java
rename src/main/java/io/github/eggy03/papertrail/bot/{service/auditlog/automod/utils => utils/auditlog}/AutoModUtils.java (94%)
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/AuditLogListener.java b/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/AuditLogListener.java
index eab9b76..0569f3d 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/AuditLogListener.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/AuditLogListener.java
@@ -1,11 +1,6 @@
package io.github.eggy03.papertrail.bot.listeners.auditlog;
-import io.github.eggy03.papertrail.bot.service.auditlog.automod.AutoModerationFlagToChannelEventHelper;
-import io.github.eggy03.papertrail.bot.service.auditlog.automod.AutoModerationMemberTimeoutEventHelper;
-import io.github.eggy03.papertrail.bot.service.auditlog.automod.AutoModerationRuleBlockMessageEventHelper;
-import io.github.eggy03.papertrail.bot.service.auditlog.automod.AutoModerationRuleCreateEventHelper;
-import io.github.eggy03.papertrail.bot.service.auditlog.automod.AutoModerationRuleDeleteEventHelper;
-import io.github.eggy03.papertrail.bot.service.auditlog.automod.AutoModerationRuleUpdateEventHelper;
+import io.github.eggy03.papertrail.bot.service.auditlog.AutoModerationService;
import io.github.eggy03.papertrail.bot.service.auditlog.bot.BotAddEventHelper;
import io.github.eggy03.papertrail.bot.service.auditlog.channel.ChannelCreateEventHelper;
import io.github.eggy03.papertrail.bot.service.auditlog.channel.ChannelDeleteEventHelper;
@@ -64,6 +59,8 @@
import io.github.eggy03.papertrail.bot.service.auditlog.webhook.WebhookUpdateEventHelper;
import io.github.eggy03.papertrail.sdk.client.AuditLogRegistrationClient;
import io.github.eggy03.papertrail.sdk.entity.AuditLogRegistrationEntity;
+import io.smallrye.common.annotation.RunOnVirtualThread;
+import jakarta.enterprise.context.ApplicationScoped;
import lombok.NonNull;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@@ -73,25 +70,23 @@
import net.dv8tion.jda.api.hooks.ListenerAdapter;
import java.util.Optional;
-import java.util.concurrent.Executor;
@Slf4j
@RequiredArgsConstructor
+@ApplicationScoped
public class AuditLogListener extends ListenerAdapter {
- @NonNull
- private final AuditLogRegistrationClient client;
+ private final @NonNull AuditLogRegistrationClient client;
+
+ private final @NonNull AutoModerationService autoModerationService;
- @NonNull
- private final Executor vThreadPool;
@Override
+ @RunOnVirtualThread
public void onGuildAuditLogEntryCreate(@NonNull GuildAuditLogEntryCreateEvent event) {
- vThreadPool.execute(() -> {
- // Call the API and see if the event came from a registered Guild
- Optional response = client.getRegisteredGuild(event.getGuild().getId());
- response.ifPresent(success -> auditLogParser(event, success.getChannelId()));
- });
+ // Call the API and see if the event came from a registered Guild
+ Optional response = client.getRegisteredGuild(event.getGuild().getId());
+ response.ifPresent(success -> auditLogParser(event, success.getChannelId()));
}
private void auditLogParser(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
@@ -100,14 +95,14 @@ private void auditLogParser(@NonNull GuildAuditLogEntryCreateEvent event, @NonNu
switch (action) {
case AUTO_MODERATION_FLAG_TO_CHANNEL ->
- AutoModerationFlagToChannelEventHelper.format(event, channelIdToSendTo);
+ autoModerationService.handleFlagToChannelEvent(event, channelIdToSendTo);
case AUTO_MODERATION_MEMBER_TIMEOUT ->
- AutoModerationMemberTimeoutEventHelper.format(event, channelIdToSendTo);
+ autoModerationService.handleMemberTimeoutEvent(event, channelIdToSendTo);
case AUTO_MODERATION_RULE_BLOCK_MESSAGE ->
- AutoModerationRuleBlockMessageEventHelper.format(event, channelIdToSendTo);
- case AUTO_MODERATION_RULE_CREATE -> AutoModerationRuleCreateEventHelper.format(event, channelIdToSendTo);
- case AUTO_MODERATION_RULE_UPDATE -> AutoModerationRuleUpdateEventHelper.format(event, channelIdToSendTo);
- case AUTO_MODERATION_RULE_DELETE -> AutoModerationRuleDeleteEventHelper.format(event, channelIdToSendTo);
+ autoModerationService.handleRuleBlockMessageEvent(event, channelIdToSendTo);
+ case AUTO_MODERATION_RULE_CREATE -> autoModerationService.handleRuleCreateEvent(event, channelIdToSendTo);
+ case AUTO_MODERATION_RULE_UPDATE -> autoModerationService.handleRuleUpdateEvent(event, channelIdToSendTo);
+ case AUTO_MODERATION_RULE_DELETE -> autoModerationService.handleRuleDeleteEvent(event, channelIdToSendTo);
case KICK -> KickEventHelper.format(event, channelIdToSendTo);
case BAN -> BanEventHelper.format(event, channelIdToSendTo);
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/AutoModerationService.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/AutoModerationService.java
new file mode 100644
index 0000000..a522a96
--- /dev/null
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/AutoModerationService.java
@@ -0,0 +1,240 @@
+package io.github.eggy03.papertrail.bot.service.auditlog;
+
+import io.github.eggy03.papertrail.bot.utils.BooleanUtils;
+import io.github.eggy03.papertrail.bot.utils.auditlog.AutoModUtils;
+import jakarta.enterprise.context.ApplicationScoped;
+import lombok.NonNull;
+import lombok.extern.slf4j.Slf4j;
+import net.dv8tion.jda.api.EmbedBuilder;
+import net.dv8tion.jda.api.audit.AuditLogEntry;
+import net.dv8tion.jda.api.entities.User;
+import net.dv8tion.jda.api.entities.automod.AutoModRule;
+import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;
+import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
+import net.dv8tion.jda.api.utils.MarkdownUtil;
+
+import java.awt.Color;
+
+@ApplicationScoped
+@Slf4j
+public class AutoModerationService {
+
+ public void handleFlagToChannelEvent(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
+
+ AuditLogEntry ale = event.getEntry();
+
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("Audit Log Entry | Auto-Mod Event");
+
+ User targetUser = ale.getJDA().getUserById(ale.getTargetId());
+ String targetMention = (targetUser != null ? targetUser.getAsMention() : ale.getTargetId());
+
+ eb.setDescription(MarkdownUtil.quoteBlock("Event: AutoMod Message Flag\nTarget Member: " + targetMention));
+ eb.setColor(Color.YELLOW);
+
+ eb.addField(
+ MarkdownUtil.underline("Additional Info"),
+ MarkdownUtil.codeblock("Flagged message will be available in the channel set to receive AutoMod events."),
+ false
+ );
+
+ eb.setFooter("Audit Log Entry ID: " + ale.getId());
+ eb.setTimestamp(ale.getTimeCreated());
+
+ if (!eb.isValidLength() || eb.isEmpty()) {
+ log.warn("Embed is empty or too long (current length: {}).", eb.length());
+ return;
+ }
+
+ TextChannel sendingChannel = event.getGuild().getTextChannelById(channelIdToSendTo);
+ if (sendingChannel != null && sendingChannel.canTalk()) {
+ sendingChannel.sendMessageEmbeds(eb.build()).queue();
+ }
+ }
+
+ public void handleMemberTimeoutEvent(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
+
+ AuditLogEntry ale = event.getEntry();
+
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("Audit Log Entry | Auto-mod Event");
+
+ User targetUser = ale.getJDA().getUserById(ale.getTargetId());
+ String targetMention = (targetUser != null ? targetUser.getAsMention() : ale.getTargetId());
+
+ eb.setDescription(MarkdownUtil.quoteBlock("Event: AutoMod Member Timeout\nTarget Member: " + targetMention));
+ eb.setColor(Color.MAGENTA);
+
+ eb.addField(
+ MarkdownUtil.underline("Additional Info"),
+ MarkdownUtil.codeblock("Timeout Rule and Reason will be available in the channel set to receive AutoMod events."),
+ false
+ );
+
+ eb.setFooter("Audit Log Entry ID: " + ale.getId());
+ eb.setTimestamp(ale.getTimeCreated());
+
+ if (!eb.isValidLength() || eb.isEmpty()) {
+ log.warn("Embed is empty or too long (current length: {}).", eb.length());
+ return;
+ }
+
+ TextChannel sendingChannel = event.getGuild().getTextChannelById(channelIdToSendTo);
+ if (sendingChannel != null && sendingChannel.canTalk()) {
+ sendingChannel.sendMessageEmbeds(eb.build()).queue();
+ }
+ }
+
+ public void handleRuleBlockMessageEvent(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
+
+ AuditLogEntry ale = event.getEntry();
+
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("Audit Log Entry | Auto-mod Event");
+
+ User targetUser = ale.getJDA().getUserById(ale.getTargetId());
+ String targetMention = (targetUser != null ? targetUser.getAsMention() : ale.getTargetId());
+
+ eb.setDescription(MarkdownUtil.quoteBlock("Event: AutoMod Message Block\nTarget Member: " + targetMention));
+ eb.setColor(Color.ORANGE);
+
+ eb.addField(
+ MarkdownUtil.underline("Additional Info"),
+ MarkdownUtil.codeblock("Blocked message will be available in the channel set to receive AutoMod events."),
+ false
+ );
+
+ eb.setFooter("Audit Log Entry ID: " + ale.getId());
+ eb.setTimestamp(ale.getTimeCreated());
+
+ if (!eb.isValidLength() || eb.isEmpty()) {
+ log.warn("Embed is empty or too long (current length: {}).", eb.length());
+ return;
+ }
+
+ TextChannel sendingChannel = event.getGuild().getTextChannelById(channelIdToSendTo);
+ if (sendingChannel != null && sendingChannel.canTalk()) {
+ sendingChannel.sendMessageEmbeds(eb.build()).queue();
+ }
+ }
+
+ public void handleRuleCreateEvent(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
+
+ AuditLogEntry ale = event.getEntry();
+
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("Audit Log Entry | AutoMod Rule Create");
+
+ User executor = ale.getJDA().getUserById(ale.getUserIdLong());
+ String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
+
+ eb.setDescription(MarkdownUtil.quoteBlock("Rule Created By: " + mentionableExecutor + "\nRule Created For: AutoMod"));
+ eb.setColor(Color.GREEN);
+
+ ale.getChanges().forEach((changeKey, changeValue) -> {
+
+ Object newValue = changeValue.getNewValue();
+
+ switch (changeKey) {
+
+ case "enabled" ->
+ eb.addField(MarkdownUtil.underline("Enabled"), "╰┈➤" + BooleanUtils.formatToYesOrNo(newValue), false);
+
+ case "trigger_type" ->
+ eb.addField(MarkdownUtil.underline("Trigger Type"), "╰┈➤" + AutoModUtils.autoModTriggerTypeResolver(newValue), false);
+
+ case "event_type" ->
+ eb.addField(MarkdownUtil.underline("Event Type"), "╰┈➤" + AutoModUtils.autoModEventTypeResolver(newValue), false);
+
+ case "name" -> eb.addField(MarkdownUtil.underline("AutoMod Rule Name "), "╰┈➤" + newValue, false);
+
+ default -> {
+ // ignore everything else
+ }
+ }
+ });
+
+ eb.addField("Additional Info", MarkdownUtil.codeblock("For more info on trigger metadata, actions, exempt roles and channels, visit Safety Setup in your server"), false);
+ eb.setFooter("Audit Log Entry ID: " + ale.getId());
+ eb.setTimestamp(ale.getTimeCreated());
+
+ if (!eb.isValidLength() || eb.isEmpty()) {
+ log.warn("Embed is empty or too long (current length: {}).", eb.length());
+ return;
+ }
+
+ TextChannel sendingChannel = event.getGuild().getTextChannelById(channelIdToSendTo);
+ if (sendingChannel != null && sendingChannel.canTalk()) {
+ sendingChannel.sendMessageEmbeds(eb.build()).queue();
+ }
+ }
+
+ public void handleRuleDeleteEvent(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
+
+ AuditLogEntry ale = event.getEntry();
+
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("Audit Log Entry | AutoMod Rule Delete");
+
+ User executor = ale.getJDA().getUserById(ale.getUserIdLong());
+ String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
+
+ eb.setDescription(MarkdownUtil.quoteBlock("Rule Deleted By: " + mentionableExecutor + "\nRule Deleted For: AutoMod"));
+ eb.setColor(Color.RED);
+
+ ale.getChanges().forEach((changeKey, changeValue) -> {
+
+ Object oldValue = changeValue.getOldValue();
+
+ if (changeKey.equals("name")) {
+ eb.addField(MarkdownUtil.underline("AutoMod Rule Name"), "╰┈➤" + oldValue, false);
+ }
+ });
+
+ eb.setFooter("Audit Log Entry ID: " + ale.getId());
+ eb.setTimestamp(ale.getTimeCreated());
+
+ if (!eb.isValidLength() || eb.isEmpty()) {
+ log.warn("Embed is empty or too long (current length: {}).", eb.length());
+ return;
+ }
+
+ TextChannel sendingChannel = event.getGuild().getTextChannelById(channelIdToSendTo);
+ if (sendingChannel != null && sendingChannel.canTalk()) {
+ sendingChannel.sendMessageEmbeds(eb.build()).queue();
+ }
+ }
+
+ public void handleRuleUpdateEvent(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
+
+ AuditLogEntry ale = event.getEntry();
+
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("Audit Log Entry | AutoMod Rule Update");
+
+ User executor = ale.getJDA().getUserById(ale.getUserIdLong());
+ String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
+
+ eb.setDescription(MarkdownUtil.quoteBlock("Rule Updated By: " + mentionableExecutor + "\nRule Updated For: AutoMod"));
+ eb.setColor(Color.YELLOW);
+
+ // add name of the rule which got updated
+ AutoModRule rule = ale.getGuild().retrieveAutoModRuleById(ale.getTargetId()).complete();
+ eb.addField(MarkdownUtil.underline("AutoMod Rule Name"), "╰┈➤" + rule.getName(), false);
+
+ eb.addField(MarkdownUtil.underline("Additional Info"), MarkdownUtil.codeblock("For more info on trigger metadata, actions, exempt roles and channel changes, visit Safety Setup in your server"), false);
+
+ eb.setFooter("Audit Log Entry ID: " + ale.getId());
+ eb.setTimestamp(ale.getTimeCreated());
+
+ if (!eb.isValidLength() || eb.isEmpty()) {
+ log.warn("Embed is empty or too long (current length: {}).", eb.length());
+ return;
+ }
+
+ TextChannel sendingChannel = event.getGuild().getTextChannelById(channelIdToSendTo);
+ if (sendingChannel != null && sendingChannel.canTalk()) {
+ sendingChannel.sendMessageEmbeds(eb.build()).queue();
+ }
+ }
+}
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/automod/AutoModerationFlagToChannelEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/automod/AutoModerationFlagToChannelEventHelper.java
deleted file mode 100644
index 6d92957..0000000
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/automod/AutoModerationFlagToChannelEventHelper.java
+++ /dev/null
@@ -1,51 +0,0 @@
-package io.github.eggy03.papertrail.bot.service.auditlog.automod;
-
-import lombok.NonNull;
-import lombok.experimental.UtilityClass;
-import lombok.extern.slf4j.Slf4j;
-import net.dv8tion.jda.api.EmbedBuilder;
-import net.dv8tion.jda.api.audit.AuditLogEntry;
-import net.dv8tion.jda.api.entities.User;
-import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;
-import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
-import net.dv8tion.jda.api.utils.MarkdownUtil;
-
-import java.awt.Color;
-
-@UtilityClass
-@Slf4j
-public class AutoModerationFlagToChannelEventHelper {
-
- public static void format(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
-
- AuditLogEntry ale = event.getEntry();
-
- EmbedBuilder eb = new EmbedBuilder();
- eb.setTitle("Audit Log Entry | Auto-Mod Event");
-
- User targetUser = ale.getJDA().getUserById(ale.getTargetId());
- String targetMention = (targetUser != null ? targetUser.getAsMention() : ale.getTargetId());
-
- eb.setDescription(MarkdownUtil.quoteBlock("Event: AutoMod Message Flag\nTarget Member: " + targetMention));
- eb.setColor(Color.YELLOW);
-
- eb.addField(
- MarkdownUtil.underline("Additional Info"),
- MarkdownUtil.codeblock("Flagged message will be available in the channel set to receive AutoMod events."),
- false
- );
-
- eb.setFooter("Audit Log Entry ID: " + ale.getId());
- eb.setTimestamp(ale.getTimeCreated());
-
- if (!eb.isValidLength() || eb.isEmpty()) {
- log.warn("Embed is empty or too long (current length: {}).", eb.length());
- return;
- }
-
- TextChannel sendingChannel = event.getGuild().getTextChannelById(channelIdToSendTo);
- if (sendingChannel != null && sendingChannel.canTalk()) {
- sendingChannel.sendMessageEmbeds(eb.build()).queue();
- }
- }
-}
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/automod/AutoModerationMemberTimeoutEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/automod/AutoModerationMemberTimeoutEventHelper.java
deleted file mode 100644
index 1c99871..0000000
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/automod/AutoModerationMemberTimeoutEventHelper.java
+++ /dev/null
@@ -1,51 +0,0 @@
-package io.github.eggy03.papertrail.bot.service.auditlog.automod;
-
-import lombok.NonNull;
-import lombok.experimental.UtilityClass;
-import lombok.extern.slf4j.Slf4j;
-import net.dv8tion.jda.api.EmbedBuilder;
-import net.dv8tion.jda.api.audit.AuditLogEntry;
-import net.dv8tion.jda.api.entities.User;
-import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;
-import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
-import net.dv8tion.jda.api.utils.MarkdownUtil;
-
-import java.awt.Color;
-
-@UtilityClass
-@Slf4j
-public class AutoModerationMemberTimeoutEventHelper {
-
- public static void format(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
-
- AuditLogEntry ale = event.getEntry();
-
- EmbedBuilder eb = new EmbedBuilder();
- eb.setTitle("Audit Log Entry | Auto-mod Event");
-
- User targetUser = ale.getJDA().getUserById(ale.getTargetId());
- String targetMention = (targetUser != null ? targetUser.getAsMention() : ale.getTargetId());
-
- eb.setDescription(MarkdownUtil.quoteBlock("Event: AutoMod Member Timeout\nTarget Member: " + targetMention));
- eb.setColor(Color.MAGENTA);
-
- eb.addField(
- MarkdownUtil.underline("Additional Info"),
- MarkdownUtil.codeblock("Timeout Rule and Reason will be available in the channel set to receive AutoMod events."),
- false
- );
-
- eb.setFooter("Audit Log Entry ID: " + ale.getId());
- eb.setTimestamp(ale.getTimeCreated());
-
- if (!eb.isValidLength() || eb.isEmpty()) {
- log.warn("Embed is empty or too long (current length: {}).", eb.length());
- return;
- }
-
- TextChannel sendingChannel = event.getGuild().getTextChannelById(channelIdToSendTo);
- if (sendingChannel != null && sendingChannel.canTalk()) {
- sendingChannel.sendMessageEmbeds(eb.build()).queue();
- }
- }
-}
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/automod/AutoModerationRuleBlockMessageEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/automod/AutoModerationRuleBlockMessageEventHelper.java
deleted file mode 100644
index 716ab93..0000000
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/automod/AutoModerationRuleBlockMessageEventHelper.java
+++ /dev/null
@@ -1,51 +0,0 @@
-package io.github.eggy03.papertrail.bot.service.auditlog.automod;
-
-import lombok.NonNull;
-import lombok.experimental.UtilityClass;
-import lombok.extern.slf4j.Slf4j;
-import net.dv8tion.jda.api.EmbedBuilder;
-import net.dv8tion.jda.api.audit.AuditLogEntry;
-import net.dv8tion.jda.api.entities.User;
-import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;
-import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
-import net.dv8tion.jda.api.utils.MarkdownUtil;
-
-import java.awt.Color;
-
-@UtilityClass
-@Slf4j
-public class AutoModerationRuleBlockMessageEventHelper {
-
- public static void format(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
-
- AuditLogEntry ale = event.getEntry();
-
- EmbedBuilder eb = new EmbedBuilder();
- eb.setTitle("Audit Log Entry | Auto-mod Event");
-
- User targetUser = ale.getJDA().getUserById(ale.getTargetId());
- String targetMention = (targetUser != null ? targetUser.getAsMention() : ale.getTargetId());
-
- eb.setDescription(MarkdownUtil.quoteBlock("Event: AutoMod Message Block\nTarget Member: " + targetMention));
- eb.setColor(Color.ORANGE);
-
- eb.addField(
- MarkdownUtil.underline("Additional Info"),
- MarkdownUtil.codeblock("Blocked message will be available in the channel set to receive AutoMod events."),
- false
- );
-
- eb.setFooter("Audit Log Entry ID: " + ale.getId());
- eb.setTimestamp(ale.getTimeCreated());
-
- if (!eb.isValidLength() || eb.isEmpty()) {
- log.warn("Embed is empty or too long (current length: {}).", eb.length());
- return;
- }
-
- TextChannel sendingChannel = event.getGuild().getTextChannelById(channelIdToSendTo);
- if (sendingChannel != null && sendingChannel.canTalk()) {
- sendingChannel.sendMessageEmbeds(eb.build()).queue();
- }
- }
-}
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/automod/AutoModerationRuleCreateEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/automod/AutoModerationRuleCreateEventHelper.java
deleted file mode 100644
index 4f6b93f..0000000
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/automod/AutoModerationRuleCreateEventHelper.java
+++ /dev/null
@@ -1,71 +0,0 @@
-package io.github.eggy03.papertrail.bot.service.auditlog.automod;
-
-import io.github.eggy03.papertrail.bot.service.auditlog.automod.utils.AutoModUtils;
-import io.github.eggy03.papertrail.bot.utils.BooleanUtils;
-import lombok.NonNull;
-import lombok.experimental.UtilityClass;
-import lombok.extern.slf4j.Slf4j;
-import net.dv8tion.jda.api.EmbedBuilder;
-import net.dv8tion.jda.api.audit.AuditLogEntry;
-import net.dv8tion.jda.api.entities.User;
-import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;
-import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
-import net.dv8tion.jda.api.utils.MarkdownUtil;
-
-import java.awt.Color;
-
-@UtilityClass
-@Slf4j
-public class AutoModerationRuleCreateEventHelper {
-
- public static void format(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
-
- AuditLogEntry ale = event.getEntry();
-
- EmbedBuilder eb = new EmbedBuilder();
- eb.setTitle("Audit Log Entry | AutoMod Rule Create");
-
- User executor = ale.getJDA().getUserById(ale.getUserIdLong());
- String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
-
- eb.setDescription(MarkdownUtil.quoteBlock("Rule Created By: " + mentionableExecutor + "\nRule Created For: AutoMod"));
- eb.setColor(Color.GREEN);
-
- ale.getChanges().forEach((changeKey, changeValue) -> {
-
- Object newValue = changeValue.getNewValue();
-
- switch (changeKey) {
-
- case "enabled" ->
- eb.addField(MarkdownUtil.underline("Enabled"), "╰┈➤" + BooleanUtils.formatToYesOrNo(newValue), false);
-
- case "trigger_type" ->
- eb.addField(MarkdownUtil.underline("Trigger Type"), "╰┈➤" + AutoModUtils.autoModTriggerTypeResolver(newValue), false);
-
- case "event_type" ->
- eb.addField(MarkdownUtil.underline("Event Type"), "╰┈➤" + AutoModUtils.autoModEventTypeResolver(newValue), false);
-
- case "name" -> eb.addField(MarkdownUtil.underline("AutoMod Rule Name "), "╰┈➤" + newValue, false);
-
- default -> {
- // ignore everything else
- }
- }
- });
-
- eb.addField("Additional Info", MarkdownUtil.codeblock("For more info on trigger metadata, actions, exempt roles and channels, visit Safety Setup in your server"), false);
- eb.setFooter("Audit Log Entry ID: " + ale.getId());
- eb.setTimestamp(ale.getTimeCreated());
-
- if (!eb.isValidLength() || eb.isEmpty()) {
- log.warn("Embed is empty or too long (current length: {}).", eb.length());
- return;
- }
-
- TextChannel sendingChannel = event.getGuild().getTextChannelById(channelIdToSendTo);
- if (sendingChannel != null && sendingChannel.canTalk()) {
- sendingChannel.sendMessageEmbeds(eb.build()).queue();
- }
- }
-}
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/automod/AutoModerationRuleDeleteEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/automod/AutoModerationRuleDeleteEventHelper.java
deleted file mode 100644
index 9b429c4..0000000
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/automod/AutoModerationRuleDeleteEventHelper.java
+++ /dev/null
@@ -1,54 +0,0 @@
-package io.github.eggy03.papertrail.bot.service.auditlog.automod;
-
-import lombok.NonNull;
-import lombok.experimental.UtilityClass;
-import lombok.extern.slf4j.Slf4j;
-import net.dv8tion.jda.api.EmbedBuilder;
-import net.dv8tion.jda.api.audit.AuditLogEntry;
-import net.dv8tion.jda.api.entities.User;
-import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;
-import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
-import net.dv8tion.jda.api.utils.MarkdownUtil;
-
-import java.awt.Color;
-
-@UtilityClass
-@Slf4j
-public class AutoModerationRuleDeleteEventHelper {
-
- public static void format(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
-
- AuditLogEntry ale = event.getEntry();
-
- EmbedBuilder eb = new EmbedBuilder();
- eb.setTitle("Audit Log Entry | AutoMod Rule Delete");
-
- User executor = ale.getJDA().getUserById(ale.getUserIdLong());
- String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
-
- eb.setDescription(MarkdownUtil.quoteBlock("Rule Deleted By: " + mentionableExecutor + "\nRule Deleted For: AutoMod"));
- eb.setColor(Color.RED);
-
- ale.getChanges().forEach((changeKey, changeValue) -> {
-
- Object oldValue = changeValue.getOldValue();
-
- if (changeKey.equals("name")) {
- eb.addField(MarkdownUtil.underline("AutoMod Rule Name"), "╰┈➤" + oldValue, false);
- }
- });
-
- eb.setFooter("Audit Log Entry ID: " + ale.getId());
- eb.setTimestamp(ale.getTimeCreated());
-
- if (!eb.isValidLength() || eb.isEmpty()) {
- log.warn("Embed is empty or too long (current length: {}).", eb.length());
- return;
- }
-
- TextChannel sendingChannel = event.getGuild().getTextChannelById(channelIdToSendTo);
- if (sendingChannel != null && sendingChannel.canTalk()) {
- sendingChannel.sendMessageEmbeds(eb.build()).queue();
- }
- }
-}
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/automod/AutoModerationRuleUpdateEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/automod/AutoModerationRuleUpdateEventHelper.java
deleted file mode 100644
index 2e0dc79..0000000
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/automod/AutoModerationRuleUpdateEventHelper.java
+++ /dev/null
@@ -1,52 +0,0 @@
-package io.github.eggy03.papertrail.bot.service.auditlog.automod;
-
-import lombok.NonNull;
-import lombok.experimental.UtilityClass;
-import lombok.extern.slf4j.Slf4j;
-import net.dv8tion.jda.api.EmbedBuilder;
-import net.dv8tion.jda.api.audit.AuditLogEntry;
-import net.dv8tion.jda.api.entities.User;
-import net.dv8tion.jda.api.entities.automod.AutoModRule;
-import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;
-import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
-import net.dv8tion.jda.api.utils.MarkdownUtil;
-
-import java.awt.Color;
-
-@UtilityClass
-@Slf4j
-public class AutoModerationRuleUpdateEventHelper {
-
- public static void format(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
-
- AuditLogEntry ale = event.getEntry();
-
- EmbedBuilder eb = new EmbedBuilder();
- eb.setTitle("Audit Log Entry | AutoMod Rule Update");
-
- User executor = ale.getJDA().getUserById(ale.getUserIdLong());
- String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
-
- eb.setDescription(MarkdownUtil.quoteBlock("Rule Updated By: " + mentionableExecutor + "\nRule Updated For: AutoMod"));
- eb.setColor(Color.YELLOW);
-
- // add name of the rule which got updated
- AutoModRule rule = ale.getGuild().retrieveAutoModRuleById(ale.getTargetId()).complete();
- eb.addField(MarkdownUtil.underline("AutoMod Rule Name"), "╰┈➤" + rule.getName(), false);
-
- eb.addField(MarkdownUtil.underline("Additional Info"), MarkdownUtil.codeblock("For more info on trigger metadata, actions, exempt roles and channel changes, visit Safety Setup in your server"), false);
-
- eb.setFooter("Audit Log Entry ID: " + ale.getId());
- eb.setTimestamp(ale.getTimeCreated());
-
- if (!eb.isValidLength() || eb.isEmpty()) {
- log.warn("Embed is empty or too long (current length: {}).", eb.length());
- return;
- }
-
- TextChannel sendingChannel = event.getGuild().getTextChannelById(channelIdToSendTo);
- if (sendingChannel != null && sendingChannel.canTalk()) {
- sendingChannel.sendMessageEmbeds(eb.build()).queue();
- }
- }
-}
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/automod/utils/AutoModUtils.java b/src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/AutoModUtils.java
similarity index 94%
rename from src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/automod/utils/AutoModUtils.java
rename to src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/AutoModUtils.java
index 8149bb7..d159f77 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/automod/utils/AutoModUtils.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/AutoModUtils.java
@@ -1,4 +1,4 @@
-package io.github.eggy03.papertrail.bot.service.auditlog.automod.utils;
+package io.github.eggy03.papertrail.bot.utils.auditlog;
import io.github.eggy03.papertrail.bot.utils.NumberParseUtils;
import lombok.NonNull;
From dd4d25e347dbd4d7be82162443bbd9117c52ae94 Mon Sep 17 00:00:00 2001
From: Egg-03 <111327101+eggy03@users.noreply.github.com>
Date: Fri, 29 May 2026 13:55:22 +0530
Subject: [PATCH 09/66] refactor(listeners): extract audit log event handling
to new class
- Rename `AuditLogListener` to `AuditLogEventListener`
- Extract the event parsing logic into a new `AuditLogEventHandler` class to improve maintainability and separate concerns
Signed-off-by: Egg-03 <111327101+eggy03@users.noreply.github.com>
---
...istener.java => AuditLogEventHandler.java} | 34 ++++++------------
.../auditlog/AuditLogEventListener.java | 35 +++++++++++++++++++
2 files changed, 45 insertions(+), 24 deletions(-)
rename src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/{AuditLogListener.java => AuditLogEventHandler.java} (91%)
create mode 100644 src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/AuditLogEventListener.java
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/AuditLogListener.java b/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/AuditLogEventHandler.java
similarity index 91%
rename from src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/AuditLogListener.java
rename to src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/AuditLogEventHandler.java
index 0569f3d..64a9b32 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/AuditLogListener.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/AuditLogEventHandler.java
@@ -57,41 +57,27 @@
import io.github.eggy03.papertrail.bot.service.auditlog.webhook.WebhookCreateEventHelper;
import io.github.eggy03.papertrail.bot.service.auditlog.webhook.WebhookRemoveEventHelper;
import io.github.eggy03.papertrail.bot.service.auditlog.webhook.WebhookUpdateEventHelper;
-import io.github.eggy03.papertrail.sdk.client.AuditLogRegistrationClient;
-import io.github.eggy03.papertrail.sdk.entity.AuditLogRegistrationEntity;
-import io.smallrye.common.annotation.RunOnVirtualThread;
import jakarta.enterprise.context.ApplicationScoped;
+import jakarta.inject.Inject;
import lombok.NonNull;
-import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import net.dv8tion.jda.api.audit.ActionType;
-import net.dv8tion.jda.api.audit.AuditLogEntry;
import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
-import net.dv8tion.jda.api.hooks.ListenerAdapter;
-import java.util.Optional;
-
-@Slf4j
-@RequiredArgsConstructor
@ApplicationScoped
-public class AuditLogListener extends ListenerAdapter {
-
- private final @NonNull AuditLogRegistrationClient client;
+@Slf4j
+public class AuditLogEventHandler {
private final @NonNull AutoModerationService autoModerationService;
-
- @Override
- @RunOnVirtualThread
- public void onGuildAuditLogEntryCreate(@NonNull GuildAuditLogEntryCreateEvent event) {
- // Call the API and see if the event came from a registered Guild
- Optional response = client.getRegisteredGuild(event.getGuild().getId());
- response.ifPresent(success -> auditLogParser(event, success.getChannelId()));
+ @Inject
+ public AuditLogEventHandler(@NonNull AutoModerationService autoModerationService) {
+ this.autoModerationService = autoModerationService;
}
- private void auditLogParser(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
- AuditLogEntry ale = event.getEntry();
- ActionType action = ale.getType();
+ public void handleEvent(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
+ ActionType action = event.getEntry().getType();
+
switch (action) {
case AUTO_MODERATION_FLAG_TO_CHANNEL ->
@@ -195,7 +181,7 @@ private void auditLogParser(@NonNull GuildAuditLogEntryCreateEvent event, @NonNu
default -> {
GenericAuditLogEventHelper.format(event, channelIdToSendTo);
- log.warn("The following event is either not covered by JDA's UNKNOWN type or is not implemented by PaperTrail yet {}", ale.getType().name());
+ log.warn("The following event is either not covered by JDA's UNKNOWN type or is not implemented by PaperTrail yet {}", action.name());
}
}
}
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/AuditLogEventListener.java b/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/AuditLogEventListener.java
new file mode 100644
index 0000000..58e90d5
--- /dev/null
+++ b/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/AuditLogEventListener.java
@@ -0,0 +1,35 @@
+package io.github.eggy03.papertrail.bot.listeners.auditlog;
+
+import io.github.eggy03.papertrail.sdk.client.AuditLogRegistrationClient;
+import io.github.eggy03.papertrail.sdk.entity.AuditLogRegistrationEntity;
+import io.smallrye.common.annotation.RunOnVirtualThread;
+import jakarta.enterprise.context.ApplicationScoped;
+import jakarta.inject.Inject;
+import lombok.NonNull;
+import lombok.extern.slf4j.Slf4j;
+import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
+import net.dv8tion.jda.api.hooks.ListenerAdapter;
+
+import java.util.Optional;
+
+@Slf4j
+@ApplicationScoped
+public class AuditLogEventListener extends ListenerAdapter {
+
+ private final @NonNull AuditLogRegistrationClient client;
+ private final @NonNull AuditLogEventHandler handler;
+
+ @Inject
+ public AuditLogEventListener(@NonNull AuditLogRegistrationClient client, @NonNull AuditLogEventHandler handler) {
+ this.client = client;
+ this.handler = handler;
+ }
+
+ @Override
+ @RunOnVirtualThread
+ public void onGuildAuditLogEntryCreate(@NonNull GuildAuditLogEntryCreateEvent event) {
+ // Call the API and see if the event came from a registered Guild
+ Optional response = client.getRegisteredGuild(event.getGuild().getId());
+ response.ifPresent(success -> handler.handleEvent(event, success.getChannelId()));
+ }
+}
\ No newline at end of file
From 286444634b341756e57f18314f2b83d4e1f346d4 Mon Sep 17 00:00:00 2001
From: Egg-03 <111327101+eggy03@users.noreply.github.com>
Date: Fri, 29 May 2026 14:21:34 +0530
Subject: [PATCH 10/66] refactor(auditlog): migrate static helpers to managed
services
- Consolidate static helpers into `ModActionEventHandlerService`
- Rename `AuditLogEventHandler` to `AuditLogEventHandlerDelegator`
- Rename `AutoModerationService` to `AutoModerationEventHandlerService` to align naming
Signed-off-by: Egg-03 <111327101+eggy03@users.noreply.github.com>
---
...ava => AuditLogEventHandlerDelegator.java} | 51 +++---
.../auditlog/AuditLogEventListener.java | 9 +-
...=> AutoModerationEventHandlerService.java} | 2 +-
.../ModActionEventHandlerService.java | 150 ++++++++++++++++++
.../auditlog/bot/BotAddEventHelper.java | 49 ------
.../auditlog/modactions/BanEventHelper.java | 54 -------
.../auditlog/modactions/KickEventHelper.java | 54 -------
.../auditlog/modactions/UnbanEventHelper.java | 51 ------
8 files changed, 184 insertions(+), 236 deletions(-)
rename src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/{AuditLogEventHandler.java => AuditLogEventHandlerDelegator.java} (87%)
rename src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/{AutoModerationService.java => AutoModerationEventHandlerService.java} (99%)
create mode 100644 src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/ModActionEventHandlerService.java
delete mode 100644 src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/bot/BotAddEventHelper.java
delete mode 100644 src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/modactions/BanEventHelper.java
delete mode 100644 src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/modactions/KickEventHelper.java
delete mode 100644 src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/modactions/UnbanEventHelper.java
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/AuditLogEventHandler.java b/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/AuditLogEventHandlerDelegator.java
similarity index 87%
rename from src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/AuditLogEventHandler.java
rename to src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/AuditLogEventHandlerDelegator.java
index 64a9b32..49813f7 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/AuditLogEventHandler.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/AuditLogEventHandlerDelegator.java
@@ -1,7 +1,7 @@
package io.github.eggy03.papertrail.bot.listeners.auditlog;
-import io.github.eggy03.papertrail.bot.service.auditlog.AutoModerationService;
-import io.github.eggy03.papertrail.bot.service.auditlog.bot.BotAddEventHelper;
+import io.github.eggy03.papertrail.bot.service.auditlog.AutoModerationEventHandlerService;
+import io.github.eggy03.papertrail.bot.service.auditlog.ModActionEventHandlerService;
import io.github.eggy03.papertrail.bot.service.auditlog.channel.ChannelCreateEventHelper;
import io.github.eggy03.papertrail.bot.service.auditlog.channel.ChannelDeleteEventHelper;
import io.github.eggy03.papertrail.bot.service.auditlog.channel.ChannelOverrideCreateEventHelper;
@@ -29,9 +29,6 @@
import io.github.eggy03.papertrail.bot.service.auditlog.member.MemberVoiceMoveEventHelper;
import io.github.eggy03.papertrail.bot.service.auditlog.message.MessagePinEventHelper;
import io.github.eggy03.papertrail.bot.service.auditlog.message.MessageUnpinEventHelper;
-import io.github.eggy03.papertrail.bot.service.auditlog.modactions.BanEventHelper;
-import io.github.eggy03.papertrail.bot.service.auditlog.modactions.KickEventHelper;
-import io.github.eggy03.papertrail.bot.service.auditlog.modactions.UnbanEventHelper;
import io.github.eggy03.papertrail.bot.service.auditlog.onboarding.OnboardingPromptCreateEventHelper;
import io.github.eggy03.papertrail.bot.service.auditlog.onboarding.OnboardingPromptDeleteEventHelper;
import io.github.eggy03.papertrail.bot.service.auditlog.onboarding.OnboardingPromptUpdateEventHelper;
@@ -58,22 +55,23 @@
import io.github.eggy03.papertrail.bot.service.auditlog.webhook.WebhookRemoveEventHelper;
import io.github.eggy03.papertrail.bot.service.auditlog.webhook.WebhookUpdateEventHelper;
import jakarta.enterprise.context.ApplicationScoped;
-import jakarta.inject.Inject;
import lombok.NonNull;
+import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import net.dv8tion.jda.api.audit.ActionType;
import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
-@ApplicationScoped
+/**
+ * Determines the {@link ActionType} of {@link GuildAuditLogEntryCreateEvent}
+ * and delegates the event to be handled by the appropriate handling services
+ */
@Slf4j
-public class AuditLogEventHandler {
-
- private final @NonNull AutoModerationService autoModerationService;
+@ApplicationScoped
+@RequiredArgsConstructor
+public class AuditLogEventHandlerDelegator {
- @Inject
- public AuditLogEventHandler(@NonNull AutoModerationService autoModerationService) {
- this.autoModerationService = autoModerationService;
- }
+ private final @NonNull AutoModerationEventHandlerService autoModerationEventHandlerService;
+ private final @NonNull ModActionEventHandlerService modActionEventHandlerService;
public void handleEvent(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
ActionType action = event.getEntry().getType();
@@ -81,19 +79,22 @@ public void handleEvent(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull S
switch (action) {
case AUTO_MODERATION_FLAG_TO_CHANNEL ->
- autoModerationService.handleFlagToChannelEvent(event, channelIdToSendTo);
+ autoModerationEventHandlerService.handleFlagToChannelEvent(event, channelIdToSendTo);
case AUTO_MODERATION_MEMBER_TIMEOUT ->
- autoModerationService.handleMemberTimeoutEvent(event, channelIdToSendTo);
+ autoModerationEventHandlerService.handleMemberTimeoutEvent(event, channelIdToSendTo);
case AUTO_MODERATION_RULE_BLOCK_MESSAGE ->
- autoModerationService.handleRuleBlockMessageEvent(event, channelIdToSendTo);
- case AUTO_MODERATION_RULE_CREATE -> autoModerationService.handleRuleCreateEvent(event, channelIdToSendTo);
- case AUTO_MODERATION_RULE_UPDATE -> autoModerationService.handleRuleUpdateEvent(event, channelIdToSendTo);
- case AUTO_MODERATION_RULE_DELETE -> autoModerationService.handleRuleDeleteEvent(event, channelIdToSendTo);
-
- case KICK -> KickEventHelper.format(event, channelIdToSendTo);
- case BAN -> BanEventHelper.format(event, channelIdToSendTo);
- case UNBAN -> UnbanEventHelper.format(event, channelIdToSendTo);
- case BOT_ADD -> BotAddEventHelper.format(event, channelIdToSendTo);
+ autoModerationEventHandlerService.handleRuleBlockMessageEvent(event, channelIdToSendTo);
+ case AUTO_MODERATION_RULE_CREATE ->
+ autoModerationEventHandlerService.handleRuleCreateEvent(event, channelIdToSendTo);
+ case AUTO_MODERATION_RULE_UPDATE ->
+ autoModerationEventHandlerService.handleRuleUpdateEvent(event, channelIdToSendTo);
+ case AUTO_MODERATION_RULE_DELETE ->
+ autoModerationEventHandlerService.handleRuleDeleteEvent(event, channelIdToSendTo);
+
+ case KICK -> modActionEventHandlerService.handleKickEvent(event, channelIdToSendTo);
+ case BAN -> modActionEventHandlerService.handleBanEvent(event, channelIdToSendTo);
+ case UNBAN -> modActionEventHandlerService.handleUnbanEvent(event, channelIdToSendTo);
+ case BOT_ADD -> modActionEventHandlerService.handleBotAddEvent(event, channelIdToSendTo);
// PRUNE has generic formatting
case CHANNEL_CREATE -> ChannelCreateEventHelper.format(event, channelIdToSendTo);
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/AuditLogEventListener.java b/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/AuditLogEventListener.java
index 58e90d5..f907e72 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/AuditLogEventListener.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/AuditLogEventListener.java
@@ -12,15 +12,20 @@
import java.util.Optional;
+/**
+ * Listens for {@link GuildAuditLogEntryCreateEvent} events that happen in registered guilds
+ * and passes the responsibility of handling them on to {@link AuditLogEventHandlerDelegator}
+ *
+ */
@Slf4j
@ApplicationScoped
public class AuditLogEventListener extends ListenerAdapter {
private final @NonNull AuditLogRegistrationClient client;
- private final @NonNull AuditLogEventHandler handler;
+ private final @NonNull AuditLogEventHandlerDelegator handler;
@Inject
- public AuditLogEventListener(@NonNull AuditLogRegistrationClient client, @NonNull AuditLogEventHandler handler) {
+ public AuditLogEventListener(@NonNull AuditLogRegistrationClient client, @NonNull AuditLogEventHandlerDelegator handler) {
this.client = client;
this.handler = handler;
}
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/AutoModerationService.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/AutoModerationEventHandlerService.java
similarity index 99%
rename from src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/AutoModerationService.java
rename to src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/AutoModerationEventHandlerService.java
index a522a96..70863ca 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/AutoModerationService.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/AutoModerationEventHandlerService.java
@@ -17,7 +17,7 @@
@ApplicationScoped
@Slf4j
-public class AutoModerationService {
+public class AutoModerationEventHandlerService {
public void handleFlagToChannelEvent(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/ModActionEventHandlerService.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/ModActionEventHandlerService.java
new file mode 100644
index 0000000..8df5863
--- /dev/null
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/ModActionEventHandlerService.java
@@ -0,0 +1,150 @@
+package io.github.eggy03.papertrail.bot.service.auditlog;
+
+import jakarta.enterprise.context.ApplicationScoped;
+import lombok.NonNull;
+import lombok.extern.slf4j.Slf4j;
+import net.dv8tion.jda.api.EmbedBuilder;
+import net.dv8tion.jda.api.audit.AuditLogEntry;
+import net.dv8tion.jda.api.entities.User;
+import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;
+import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
+import net.dv8tion.jda.api.utils.MarkdownUtil;
+
+import java.awt.Color;
+
+@ApplicationScoped
+@Slf4j
+public class ModActionEventHandlerService {
+
+ public void handleBanEvent(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
+ AuditLogEntry ale = event.getEntry();
+
+ User moderator = ale.getJDA().getUserById(ale.getUserIdLong());
+ String mentionableModerator = (moderator != null ? moderator.getAsMention() : ale.getUserId());
+ String reasonForBan = ale.getReason() == null ? "No Reason Provided" : ale.getReason();
+
+ // A REST Action is required here because banned members are not cached
+ event.getJDA().retrieveUserById(ale.getTargetId()).queue(bannedUser -> {
+
+ String mentionableBannedUser = bannedUser != null ? bannedUser.getAsMention() : ale.getTargetId();
+
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("Audit Log Entry | Ban Event");
+ eb.setDescription(MarkdownUtil.quoteBlock("A Member Has Been Banned By: " + mentionableModerator));
+ eb.setColor(Color.RED);
+
+ eb.addField(MarkdownUtil.underline("Banned Member"), "╰┈➤" + mentionableBannedUser, false);
+ eb.addField(MarkdownUtil.underline("Ban Reason"), "╰┈➤" + reasonForBan, false);
+
+ eb.setFooter("Audit Log Entry ID: " + ale.getId());
+ eb.setTimestamp(ale.getTimeCreated());
+
+ if (!eb.isValidLength() || eb.isEmpty()) {
+ log.warn("Embed is empty or too long (current length: {}).", eb.length());
+ return;
+ }
+
+ TextChannel sendingChannel = event.getGuild().getTextChannelById(channelIdToSendTo);
+ if (sendingChannel != null && sendingChannel.canTalk()) {
+ sendingChannel.sendMessageEmbeds(eb.build()).queue();
+ }
+ });
+ }
+
+ public void handleKickEvent(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
+ AuditLogEntry ale = event.getEntry();
+
+ User moderator = ale.getJDA().getUserById(ale.getUserIdLong());
+ String mentionableModerator = (moderator != null ? moderator.getAsMention() : ale.getUserId());
+ String reasonForKick = ale.getReason() == null ? "No Reason Provided" : ale.getReason();
+
+ // A REST Action is required here because kicked members are not cached
+ event.getJDA().retrieveUserById(ale.getTargetId()).queue(kickedUser -> {
+
+ String mentionableKickedUser = kickedUser != null ? kickedUser.getAsMention() : ale.getTargetId();
+
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("Audit Log Entry | Kick Event");
+ eb.setDescription(MarkdownUtil.quoteBlock("A Member Has Been Kicked By: " + mentionableModerator));
+ eb.setColor(Color.ORANGE);
+
+ eb.addField(MarkdownUtil.underline("Kicked Member"), "╰┈➤" + mentionableKickedUser, false);
+ eb.addField(MarkdownUtil.underline("Reason"), "╰┈➤" + reasonForKick, false);
+
+ eb.setFooter("Audit Log Entry ID: " + ale.getId());
+ eb.setTimestamp(ale.getTimeCreated());
+
+ if (!eb.isValidLength() || eb.isEmpty()) {
+ log.warn("Embed is empty or too long (current length: {}).", eb.length());
+ return;
+ }
+
+ TextChannel sendingChannel = event.getGuild().getTextChannelById(channelIdToSendTo);
+ if (sendingChannel != null && sendingChannel.canTalk()) {
+ sendingChannel.sendMessageEmbeds(eb.build()).queue();
+ }
+ });
+ }
+
+ public void handleUnbanEvent(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
+ AuditLogEntry ale = event.getEntry();
+
+ User moderator = ale.getJDA().getUserById(ale.getUserIdLong());
+ String mentionableModerator = (moderator != null ? moderator.getAsMention() : ale.getUserId());
+
+ event.getJDA().retrieveUserById(ale.getTargetId()).queue(unbannedUser -> {
+
+ String mentionableUnbannedUser = unbannedUser != null ? unbannedUser.getAsMention() : ale.getTargetId();
+
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("Audit Log Entry | Member Unban Event");
+ eb.setDescription(MarkdownUtil.quoteBlock("A Member Has Been Un-Banned By: " + mentionableModerator));
+ eb.setColor(Color.GREEN);
+
+ eb.addField(MarkdownUtil.underline("Un-banned User"), "╰┈➤" + mentionableUnbannedUser, false);
+
+ eb.setFooter("Audit Log Entry ID: " + ale.getId());
+ eb.setTimestamp(ale.getTimeCreated());
+
+ if (!eb.isValidLength() || eb.isEmpty()) {
+ log.warn("Embed is empty or too long (current length: {}).", eb.length());
+ return;
+ }
+
+ TextChannel sendingChannel = event.getGuild().getTextChannelById(channelIdToSendTo);
+ if (sendingChannel != null && sendingChannel.canTalk()) {
+ sendingChannel.sendMessageEmbeds(eb.build()).queue();
+ }
+ });
+ }
+
+ public void handleBotAddEvent(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
+ AuditLogEntry ale = event.getEntry();
+
+ User executor = ale.getJDA().getUserById(ale.getUserIdLong());
+ String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
+
+ User target = ale.getJDA().getUserById(ale.getTargetIdLong());
+ String mentionableTarget = (target != null ? target.getAsMention() : ale.getTargetId());
+
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("Audit Log Entry | Bot Add Event");
+ eb.setDescription(MarkdownUtil.quoteBlock("Bot Added By: " + mentionableExecutor + "\nBot ID: " + ale.getTargetId()));
+ eb.setColor(Color.CYAN);
+
+ eb.addField(MarkdownUtil.underline("Bot Added"), "╰┈➤" + mentionableTarget, false);
+
+ eb.setFooter("Audit Log Entry ID: " + ale.getId());
+ eb.setTimestamp(ale.getTimeCreated());
+
+ if (!eb.isValidLength() || eb.isEmpty()) {
+ log.warn("Embed is empty or too long (current length: {}).", eb.length());
+ return;
+ }
+
+ TextChannel sendingChannel = event.getGuild().getTextChannelById(channelIdToSendTo);
+ if (sendingChannel != null && sendingChannel.canTalk()) {
+ sendingChannel.sendMessageEmbeds(eb.build()).queue();
+ }
+ }
+}
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/bot/BotAddEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/bot/BotAddEventHelper.java
deleted file mode 100644
index c8e296d..0000000
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/bot/BotAddEventHelper.java
+++ /dev/null
@@ -1,49 +0,0 @@
-package io.github.eggy03.papertrail.bot.service.auditlog.bot;
-
-import lombok.NonNull;
-import lombok.experimental.UtilityClass;
-import lombok.extern.slf4j.Slf4j;
-import net.dv8tion.jda.api.EmbedBuilder;
-import net.dv8tion.jda.api.audit.AuditLogEntry;
-import net.dv8tion.jda.api.entities.User;
-import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;
-import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
-import net.dv8tion.jda.api.utils.MarkdownUtil;
-
-import java.awt.Color;
-
-@UtilityClass
-@Slf4j
-public class BotAddEventHelper {
-
- public static void format(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
-
- AuditLogEntry ale = event.getEntry();
-
- User executor = ale.getJDA().getUserById(ale.getUserIdLong());
- String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
-
- User target = ale.getJDA().getUserById(ale.getTargetIdLong());
- String mentionableTarget = (target != null ? target.getAsMention() : ale.getTargetId());
-
- EmbedBuilder eb = new EmbedBuilder();
- eb.setTitle("Audit Log Entry | Bot Add Event");
- eb.setDescription(MarkdownUtil.quoteBlock("Bot Added By: " + mentionableExecutor + "\nBot ID: " + ale.getTargetId()));
- eb.setColor(Color.CYAN);
-
- eb.addField(MarkdownUtil.underline("Bot Added"), "╰┈➤" + mentionableTarget, false);
-
- eb.setFooter("Audit Log Entry ID: " + ale.getId());
- eb.setTimestamp(ale.getTimeCreated());
-
- if (!eb.isValidLength() || eb.isEmpty()) {
- log.warn("Embed is empty or too long (current length: {}).", eb.length());
- return;
- }
-
- TextChannel sendingChannel = event.getGuild().getTextChannelById(channelIdToSendTo);
- if (sendingChannel != null && sendingChannel.canTalk()) {
- sendingChannel.sendMessageEmbeds(eb.build()).queue();
- }
- }
-}
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/modactions/BanEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/modactions/BanEventHelper.java
deleted file mode 100644
index 1273554..0000000
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/modactions/BanEventHelper.java
+++ /dev/null
@@ -1,54 +0,0 @@
-package io.github.eggy03.papertrail.bot.service.auditlog.modactions;
-
-import lombok.NonNull;
-import lombok.experimental.UtilityClass;
-import lombok.extern.slf4j.Slf4j;
-import net.dv8tion.jda.api.EmbedBuilder;
-import net.dv8tion.jda.api.audit.AuditLogEntry;
-import net.dv8tion.jda.api.entities.User;
-import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;
-import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
-import net.dv8tion.jda.api.utils.MarkdownUtil;
-
-import java.awt.Color;
-
-@UtilityClass
-@Slf4j
-public class BanEventHelper {
-
- public static void format(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
-
- AuditLogEntry ale = event.getEntry();
-
- User moderator = ale.getJDA().getUserById(ale.getUserIdLong());
- String mentionableModerator = (moderator != null ? moderator.getAsMention() : ale.getUserId());
- String reasonForBan = ale.getReason() == null ? "No Reason Provided" : ale.getReason();
-
- // A REST Action is required here because banned members are not cached
- event.getJDA().retrieveUserById(ale.getTargetId()).queue(bannedUser -> {
-
- String mentionableBannedUser = bannedUser != null ? bannedUser.getAsMention() : ale.getTargetId();
-
- EmbedBuilder eb = new EmbedBuilder();
- eb.setTitle("Audit Log Entry | Ban Event");
- eb.setDescription(MarkdownUtil.quoteBlock("A Member Has Been Banned By: " + mentionableModerator));
- eb.setColor(Color.RED);
-
- eb.addField(MarkdownUtil.underline("Banned Member"), "╰┈➤" + mentionableBannedUser, false);
- eb.addField(MarkdownUtil.underline("Ban Reason"), "╰┈➤" + reasonForBan, false);
-
- eb.setFooter("Audit Log Entry ID: " + ale.getId());
- eb.setTimestamp(ale.getTimeCreated());
-
- if (!eb.isValidLength() || eb.isEmpty()) {
- log.warn("Embed is empty or too long (current length: {}).", eb.length());
- return;
- }
-
- TextChannel sendingChannel = event.getGuild().getTextChannelById(channelIdToSendTo);
- if (sendingChannel != null && sendingChannel.canTalk()) {
- sendingChannel.sendMessageEmbeds(eb.build()).queue();
- }
- });
- }
-}
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/modactions/KickEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/modactions/KickEventHelper.java
deleted file mode 100644
index dbf275c..0000000
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/modactions/KickEventHelper.java
+++ /dev/null
@@ -1,54 +0,0 @@
-package io.github.eggy03.papertrail.bot.service.auditlog.modactions;
-
-import lombok.NonNull;
-import lombok.experimental.UtilityClass;
-import lombok.extern.slf4j.Slf4j;
-import net.dv8tion.jda.api.EmbedBuilder;
-import net.dv8tion.jda.api.audit.AuditLogEntry;
-import net.dv8tion.jda.api.entities.User;
-import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;
-import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
-import net.dv8tion.jda.api.utils.MarkdownUtil;
-
-import java.awt.Color;
-
-@UtilityClass
-@Slf4j
-public class KickEventHelper {
-
- public static void format(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
-
- AuditLogEntry ale = event.getEntry();
-
- User moderator = ale.getJDA().getUserById(ale.getUserIdLong());
- String mentionableModerator = (moderator != null ? moderator.getAsMention() : ale.getUserId());
- String reasonForKick = ale.getReason() == null ? "No Reason Provided" : ale.getReason();
-
- // A REST Action is required here because kicked members are not cached
- event.getJDA().retrieveUserById(ale.getTargetId()).queue(kickedUser -> {
-
- String mentionableKickedUser = kickedUser != null ? kickedUser.getAsMention() : ale.getTargetId();
-
- EmbedBuilder eb = new EmbedBuilder();
- eb.setTitle("Audit Log Entry | Kick Event");
- eb.setDescription(MarkdownUtil.quoteBlock("A Member Has Been Kicked By: " + mentionableModerator));
- eb.setColor(Color.ORANGE);
-
- eb.addField(MarkdownUtil.underline("Kicked Member"), "╰┈➤" + mentionableKickedUser, false);
- eb.addField(MarkdownUtil.underline("Reason"), "╰┈➤" + reasonForKick, false);
-
- eb.setFooter("Audit Log Entry ID: " + ale.getId());
- eb.setTimestamp(ale.getTimeCreated());
-
- if (!eb.isValidLength() || eb.isEmpty()) {
- log.warn("Embed is empty or too long (current length: {}).", eb.length());
- return;
- }
-
- TextChannel sendingChannel = event.getGuild().getTextChannelById(channelIdToSendTo);
- if (sendingChannel != null && sendingChannel.canTalk()) {
- sendingChannel.sendMessageEmbeds(eb.build()).queue();
- }
- });
- }
-}
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/modactions/UnbanEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/modactions/UnbanEventHelper.java
deleted file mode 100644
index fe83bd9..0000000
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/modactions/UnbanEventHelper.java
+++ /dev/null
@@ -1,51 +0,0 @@
-package io.github.eggy03.papertrail.bot.service.auditlog.modactions;
-
-import lombok.NonNull;
-import lombok.experimental.UtilityClass;
-import lombok.extern.slf4j.Slf4j;
-import net.dv8tion.jda.api.EmbedBuilder;
-import net.dv8tion.jda.api.audit.AuditLogEntry;
-import net.dv8tion.jda.api.entities.User;
-import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;
-import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
-import net.dv8tion.jda.api.utils.MarkdownUtil;
-
-import java.awt.Color;
-
-@UtilityClass
-@Slf4j
-public class UnbanEventHelper {
-
- public static void format(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
-
- AuditLogEntry ale = event.getEntry();
-
- User moderator = ale.getJDA().getUserById(ale.getUserIdLong());
- String mentionableModerator = (moderator != null ? moderator.getAsMention() : ale.getUserId());
-
- event.getJDA().retrieveUserById(ale.getTargetId()).queue(unbannedUser -> {
-
- String mentionableUnbannedUser = unbannedUser != null ? unbannedUser.getAsMention() : ale.getTargetId();
-
- EmbedBuilder eb = new EmbedBuilder();
- eb.setTitle("Audit Log Entry | Member Unban Event");
- eb.setDescription(MarkdownUtil.quoteBlock("A Member Has Been Un-Banned By: " + mentionableModerator));
- eb.setColor(Color.GREEN);
-
- eb.addField(MarkdownUtil.underline("Un-banned User"), "╰┈➤" + mentionableUnbannedUser, false);
-
- eb.setFooter("Audit Log Entry ID: " + ale.getId());
- eb.setTimestamp(ale.getTimeCreated());
-
- if (!eb.isValidLength() || eb.isEmpty()) {
- log.warn("Embed is empty or too long (current length: {}).", eb.length());
- return;
- }
-
- TextChannel sendingChannel = event.getGuild().getTextChannelById(channelIdToSendTo);
- if (sendingChannel != null && sendingChannel.canTalk()) {
- sendingChannel.sendMessageEmbeds(eb.build()).queue();
- }
- });
- }
-}
From 82b4ca0758ef35b813f9dbf5e7a9f536408bb361 Mon Sep 17 00:00:00 2001
From: Egg-03 <111327101+eggy03@users.noreply.github.com>
Date: Fri, 29 May 2026 16:01:46 +0530
Subject: [PATCH 11/66] revert: 2864446, dd4d25e and ee68bc7
- undo grouping of helpers into services
Signed-off-by: Egg-03 <111327101+eggy03@users.noreply.github.com>
---
.../auditlog/AuditLogEventListener.java | 40 ---
...erDelegator.java => AuditLogListener.java} | 74 ++++--
.../AutoModerationEventHandlerService.java | 240 ------------------
.../ModActionEventHandlerService.java | 150 -----------
...utoModerationFlagToChannelEventHelper.java | 51 ++++
...utoModerationMemberTimeoutEventHelper.java | 51 ++++
...ModerationRuleBlockMessageEventHelper.java | 51 ++++
.../AutoModerationRuleCreateEventHelper.java | 71 ++++++
.../AutoModerationRuleDeleteEventHelper.java | 54 ++++
.../AutoModerationRuleUpdateEventHelper.java | 52 ++++
.../auditlog/automod/utils}/AutoModUtils.java | 2 +-
.../auditlog/bot/BotAddEventHelper.java | 49 ++++
.../auditlog/modactions/BanEventHelper.java | 54 ++++
.../auditlog/modactions/KickEventHelper.java | 54 ++++
.../auditlog/modactions/UnbanEventHelper.java | 51 ++++
15 files changed, 585 insertions(+), 459 deletions(-)
delete mode 100644 src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/AuditLogEventListener.java
rename src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/{AuditLogEventHandlerDelegator.java => AuditLogListener.java} (79%)
delete mode 100644 src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/AutoModerationEventHandlerService.java
delete mode 100644 src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/ModActionEventHandlerService.java
create mode 100644 src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/automod/AutoModerationFlagToChannelEventHelper.java
create mode 100644 src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/automod/AutoModerationMemberTimeoutEventHelper.java
create mode 100644 src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/automod/AutoModerationRuleBlockMessageEventHelper.java
create mode 100644 src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/automod/AutoModerationRuleCreateEventHelper.java
create mode 100644 src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/automod/AutoModerationRuleDeleteEventHelper.java
create mode 100644 src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/automod/AutoModerationRuleUpdateEventHelper.java
rename src/main/java/io/github/eggy03/papertrail/bot/{utils/auditlog => service/auditlog/automod/utils}/AutoModUtils.java (94%)
create mode 100644 src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/bot/BotAddEventHelper.java
create mode 100644 src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/modactions/BanEventHelper.java
create mode 100644 src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/modactions/KickEventHelper.java
create mode 100644 src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/modactions/UnbanEventHelper.java
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/AuditLogEventListener.java b/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/AuditLogEventListener.java
deleted file mode 100644
index f907e72..0000000
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/AuditLogEventListener.java
+++ /dev/null
@@ -1,40 +0,0 @@
-package io.github.eggy03.papertrail.bot.listeners.auditlog;
-
-import io.github.eggy03.papertrail.sdk.client.AuditLogRegistrationClient;
-import io.github.eggy03.papertrail.sdk.entity.AuditLogRegistrationEntity;
-import io.smallrye.common.annotation.RunOnVirtualThread;
-import jakarta.enterprise.context.ApplicationScoped;
-import jakarta.inject.Inject;
-import lombok.NonNull;
-import lombok.extern.slf4j.Slf4j;
-import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
-import net.dv8tion.jda.api.hooks.ListenerAdapter;
-
-import java.util.Optional;
-
-/**
- * Listens for {@link GuildAuditLogEntryCreateEvent} events that happen in registered guilds
- * and passes the responsibility of handling them on to {@link AuditLogEventHandlerDelegator}
- *
- */
-@Slf4j
-@ApplicationScoped
-public class AuditLogEventListener extends ListenerAdapter {
-
- private final @NonNull AuditLogRegistrationClient client;
- private final @NonNull AuditLogEventHandlerDelegator handler;
-
- @Inject
- public AuditLogEventListener(@NonNull AuditLogRegistrationClient client, @NonNull AuditLogEventHandlerDelegator handler) {
- this.client = client;
- this.handler = handler;
- }
-
- @Override
- @RunOnVirtualThread
- public void onGuildAuditLogEntryCreate(@NonNull GuildAuditLogEntryCreateEvent event) {
- // Call the API and see if the event came from a registered Guild
- Optional response = client.getRegisteredGuild(event.getGuild().getId());
- response.ifPresent(success -> handler.handleEvent(event, success.getChannelId()));
- }
-}
\ No newline at end of file
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/AuditLogEventHandlerDelegator.java b/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/AuditLogListener.java
similarity index 79%
rename from src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/AuditLogEventHandlerDelegator.java
rename to src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/AuditLogListener.java
index 49813f7..eab9b76 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/AuditLogEventHandlerDelegator.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/AuditLogListener.java
@@ -1,7 +1,12 @@
package io.github.eggy03.papertrail.bot.listeners.auditlog;
-import io.github.eggy03.papertrail.bot.service.auditlog.AutoModerationEventHandlerService;
-import io.github.eggy03.papertrail.bot.service.auditlog.ModActionEventHandlerService;
+import io.github.eggy03.papertrail.bot.service.auditlog.automod.AutoModerationFlagToChannelEventHelper;
+import io.github.eggy03.papertrail.bot.service.auditlog.automod.AutoModerationMemberTimeoutEventHelper;
+import io.github.eggy03.papertrail.bot.service.auditlog.automod.AutoModerationRuleBlockMessageEventHelper;
+import io.github.eggy03.papertrail.bot.service.auditlog.automod.AutoModerationRuleCreateEventHelper;
+import io.github.eggy03.papertrail.bot.service.auditlog.automod.AutoModerationRuleDeleteEventHelper;
+import io.github.eggy03.papertrail.bot.service.auditlog.automod.AutoModerationRuleUpdateEventHelper;
+import io.github.eggy03.papertrail.bot.service.auditlog.bot.BotAddEventHelper;
import io.github.eggy03.papertrail.bot.service.auditlog.channel.ChannelCreateEventHelper;
import io.github.eggy03.papertrail.bot.service.auditlog.channel.ChannelDeleteEventHelper;
import io.github.eggy03.papertrail.bot.service.auditlog.channel.ChannelOverrideCreateEventHelper;
@@ -29,6 +34,9 @@
import io.github.eggy03.papertrail.bot.service.auditlog.member.MemberVoiceMoveEventHelper;
import io.github.eggy03.papertrail.bot.service.auditlog.message.MessagePinEventHelper;
import io.github.eggy03.papertrail.bot.service.auditlog.message.MessageUnpinEventHelper;
+import io.github.eggy03.papertrail.bot.service.auditlog.modactions.BanEventHelper;
+import io.github.eggy03.papertrail.bot.service.auditlog.modactions.KickEventHelper;
+import io.github.eggy03.papertrail.bot.service.auditlog.modactions.UnbanEventHelper;
import io.github.eggy03.papertrail.bot.service.auditlog.onboarding.OnboardingPromptCreateEventHelper;
import io.github.eggy03.papertrail.bot.service.auditlog.onboarding.OnboardingPromptDeleteEventHelper;
import io.github.eggy03.papertrail.bot.service.auditlog.onboarding.OnboardingPromptUpdateEventHelper;
@@ -54,47 +62,57 @@
import io.github.eggy03.papertrail.bot.service.auditlog.webhook.WebhookCreateEventHelper;
import io.github.eggy03.papertrail.bot.service.auditlog.webhook.WebhookRemoveEventHelper;
import io.github.eggy03.papertrail.bot.service.auditlog.webhook.WebhookUpdateEventHelper;
-import jakarta.enterprise.context.ApplicationScoped;
+import io.github.eggy03.papertrail.sdk.client.AuditLogRegistrationClient;
+import io.github.eggy03.papertrail.sdk.entity.AuditLogRegistrationEntity;
import lombok.NonNull;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import net.dv8tion.jda.api.audit.ActionType;
+import net.dv8tion.jda.api.audit.AuditLogEntry;
import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
+import net.dv8tion.jda.api.hooks.ListenerAdapter;
+
+import java.util.Optional;
+import java.util.concurrent.Executor;
-/**
- * Determines the {@link ActionType} of {@link GuildAuditLogEntryCreateEvent}
- * and delegates the event to be handled by the appropriate handling services
- */
@Slf4j
-@ApplicationScoped
@RequiredArgsConstructor
-public class AuditLogEventHandlerDelegator {
+public class AuditLogListener extends ListenerAdapter {
+
+ @NonNull
+ private final AuditLogRegistrationClient client;
- private final @NonNull AutoModerationEventHandlerService autoModerationEventHandlerService;
- private final @NonNull ModActionEventHandlerService modActionEventHandlerService;
+ @NonNull
+ private final Executor vThreadPool;
- public void handleEvent(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
- ActionType action = event.getEntry().getType();
+ @Override
+ public void onGuildAuditLogEntryCreate(@NonNull GuildAuditLogEntryCreateEvent event) {
+ vThreadPool.execute(() -> {
+ // Call the API and see if the event came from a registered Guild
+ Optional response = client.getRegisteredGuild(event.getGuild().getId());
+ response.ifPresent(success -> auditLogParser(event, success.getChannelId()));
+ });
+ }
+ private void auditLogParser(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
+ AuditLogEntry ale = event.getEntry();
+ ActionType action = ale.getType();
switch (action) {
case AUTO_MODERATION_FLAG_TO_CHANNEL ->
- autoModerationEventHandlerService.handleFlagToChannelEvent(event, channelIdToSendTo);
+ AutoModerationFlagToChannelEventHelper.format(event, channelIdToSendTo);
case AUTO_MODERATION_MEMBER_TIMEOUT ->
- autoModerationEventHandlerService.handleMemberTimeoutEvent(event, channelIdToSendTo);
+ AutoModerationMemberTimeoutEventHelper.format(event, channelIdToSendTo);
case AUTO_MODERATION_RULE_BLOCK_MESSAGE ->
- autoModerationEventHandlerService.handleRuleBlockMessageEvent(event, channelIdToSendTo);
- case AUTO_MODERATION_RULE_CREATE ->
- autoModerationEventHandlerService.handleRuleCreateEvent(event, channelIdToSendTo);
- case AUTO_MODERATION_RULE_UPDATE ->
- autoModerationEventHandlerService.handleRuleUpdateEvent(event, channelIdToSendTo);
- case AUTO_MODERATION_RULE_DELETE ->
- autoModerationEventHandlerService.handleRuleDeleteEvent(event, channelIdToSendTo);
-
- case KICK -> modActionEventHandlerService.handleKickEvent(event, channelIdToSendTo);
- case BAN -> modActionEventHandlerService.handleBanEvent(event, channelIdToSendTo);
- case UNBAN -> modActionEventHandlerService.handleUnbanEvent(event, channelIdToSendTo);
- case BOT_ADD -> modActionEventHandlerService.handleBotAddEvent(event, channelIdToSendTo);
+ AutoModerationRuleBlockMessageEventHelper.format(event, channelIdToSendTo);
+ case AUTO_MODERATION_RULE_CREATE -> AutoModerationRuleCreateEventHelper.format(event, channelIdToSendTo);
+ case AUTO_MODERATION_RULE_UPDATE -> AutoModerationRuleUpdateEventHelper.format(event, channelIdToSendTo);
+ case AUTO_MODERATION_RULE_DELETE -> AutoModerationRuleDeleteEventHelper.format(event, channelIdToSendTo);
+
+ case KICK -> KickEventHelper.format(event, channelIdToSendTo);
+ case BAN -> BanEventHelper.format(event, channelIdToSendTo);
+ case UNBAN -> UnbanEventHelper.format(event, channelIdToSendTo);
+ case BOT_ADD -> BotAddEventHelper.format(event, channelIdToSendTo);
// PRUNE has generic formatting
case CHANNEL_CREATE -> ChannelCreateEventHelper.format(event, channelIdToSendTo);
@@ -182,7 +200,7 @@ public void handleEvent(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull S
default -> {
GenericAuditLogEventHelper.format(event, channelIdToSendTo);
- log.warn("The following event is either not covered by JDA's UNKNOWN type or is not implemented by PaperTrail yet {}", action.name());
+ log.warn("The following event is either not covered by JDA's UNKNOWN type or is not implemented by PaperTrail yet {}", ale.getType().name());
}
}
}
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/AutoModerationEventHandlerService.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/AutoModerationEventHandlerService.java
deleted file mode 100644
index 70863ca..0000000
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/AutoModerationEventHandlerService.java
+++ /dev/null
@@ -1,240 +0,0 @@
-package io.github.eggy03.papertrail.bot.service.auditlog;
-
-import io.github.eggy03.papertrail.bot.utils.BooleanUtils;
-import io.github.eggy03.papertrail.bot.utils.auditlog.AutoModUtils;
-import jakarta.enterprise.context.ApplicationScoped;
-import lombok.NonNull;
-import lombok.extern.slf4j.Slf4j;
-import net.dv8tion.jda.api.EmbedBuilder;
-import net.dv8tion.jda.api.audit.AuditLogEntry;
-import net.dv8tion.jda.api.entities.User;
-import net.dv8tion.jda.api.entities.automod.AutoModRule;
-import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;
-import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
-import net.dv8tion.jda.api.utils.MarkdownUtil;
-
-import java.awt.Color;
-
-@ApplicationScoped
-@Slf4j
-public class AutoModerationEventHandlerService {
-
- public void handleFlagToChannelEvent(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
-
- AuditLogEntry ale = event.getEntry();
-
- EmbedBuilder eb = new EmbedBuilder();
- eb.setTitle("Audit Log Entry | Auto-Mod Event");
-
- User targetUser = ale.getJDA().getUserById(ale.getTargetId());
- String targetMention = (targetUser != null ? targetUser.getAsMention() : ale.getTargetId());
-
- eb.setDescription(MarkdownUtil.quoteBlock("Event: AutoMod Message Flag\nTarget Member: " + targetMention));
- eb.setColor(Color.YELLOW);
-
- eb.addField(
- MarkdownUtil.underline("Additional Info"),
- MarkdownUtil.codeblock("Flagged message will be available in the channel set to receive AutoMod events."),
- false
- );
-
- eb.setFooter("Audit Log Entry ID: " + ale.getId());
- eb.setTimestamp(ale.getTimeCreated());
-
- if (!eb.isValidLength() || eb.isEmpty()) {
- log.warn("Embed is empty or too long (current length: {}).", eb.length());
- return;
- }
-
- TextChannel sendingChannel = event.getGuild().getTextChannelById(channelIdToSendTo);
- if (sendingChannel != null && sendingChannel.canTalk()) {
- sendingChannel.sendMessageEmbeds(eb.build()).queue();
- }
- }
-
- public void handleMemberTimeoutEvent(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
-
- AuditLogEntry ale = event.getEntry();
-
- EmbedBuilder eb = new EmbedBuilder();
- eb.setTitle("Audit Log Entry | Auto-mod Event");
-
- User targetUser = ale.getJDA().getUserById(ale.getTargetId());
- String targetMention = (targetUser != null ? targetUser.getAsMention() : ale.getTargetId());
-
- eb.setDescription(MarkdownUtil.quoteBlock("Event: AutoMod Member Timeout\nTarget Member: " + targetMention));
- eb.setColor(Color.MAGENTA);
-
- eb.addField(
- MarkdownUtil.underline("Additional Info"),
- MarkdownUtil.codeblock("Timeout Rule and Reason will be available in the channel set to receive AutoMod events."),
- false
- );
-
- eb.setFooter("Audit Log Entry ID: " + ale.getId());
- eb.setTimestamp(ale.getTimeCreated());
-
- if (!eb.isValidLength() || eb.isEmpty()) {
- log.warn("Embed is empty or too long (current length: {}).", eb.length());
- return;
- }
-
- TextChannel sendingChannel = event.getGuild().getTextChannelById(channelIdToSendTo);
- if (sendingChannel != null && sendingChannel.canTalk()) {
- sendingChannel.sendMessageEmbeds(eb.build()).queue();
- }
- }
-
- public void handleRuleBlockMessageEvent(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
-
- AuditLogEntry ale = event.getEntry();
-
- EmbedBuilder eb = new EmbedBuilder();
- eb.setTitle("Audit Log Entry | Auto-mod Event");
-
- User targetUser = ale.getJDA().getUserById(ale.getTargetId());
- String targetMention = (targetUser != null ? targetUser.getAsMention() : ale.getTargetId());
-
- eb.setDescription(MarkdownUtil.quoteBlock("Event: AutoMod Message Block\nTarget Member: " + targetMention));
- eb.setColor(Color.ORANGE);
-
- eb.addField(
- MarkdownUtil.underline("Additional Info"),
- MarkdownUtil.codeblock("Blocked message will be available in the channel set to receive AutoMod events."),
- false
- );
-
- eb.setFooter("Audit Log Entry ID: " + ale.getId());
- eb.setTimestamp(ale.getTimeCreated());
-
- if (!eb.isValidLength() || eb.isEmpty()) {
- log.warn("Embed is empty or too long (current length: {}).", eb.length());
- return;
- }
-
- TextChannel sendingChannel = event.getGuild().getTextChannelById(channelIdToSendTo);
- if (sendingChannel != null && sendingChannel.canTalk()) {
- sendingChannel.sendMessageEmbeds(eb.build()).queue();
- }
- }
-
- public void handleRuleCreateEvent(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
-
- AuditLogEntry ale = event.getEntry();
-
- EmbedBuilder eb = new EmbedBuilder();
- eb.setTitle("Audit Log Entry | AutoMod Rule Create");
-
- User executor = ale.getJDA().getUserById(ale.getUserIdLong());
- String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
-
- eb.setDescription(MarkdownUtil.quoteBlock("Rule Created By: " + mentionableExecutor + "\nRule Created For: AutoMod"));
- eb.setColor(Color.GREEN);
-
- ale.getChanges().forEach((changeKey, changeValue) -> {
-
- Object newValue = changeValue.getNewValue();
-
- switch (changeKey) {
-
- case "enabled" ->
- eb.addField(MarkdownUtil.underline("Enabled"), "╰┈➤" + BooleanUtils.formatToYesOrNo(newValue), false);
-
- case "trigger_type" ->
- eb.addField(MarkdownUtil.underline("Trigger Type"), "╰┈➤" + AutoModUtils.autoModTriggerTypeResolver(newValue), false);
-
- case "event_type" ->
- eb.addField(MarkdownUtil.underline("Event Type"), "╰┈➤" + AutoModUtils.autoModEventTypeResolver(newValue), false);
-
- case "name" -> eb.addField(MarkdownUtil.underline("AutoMod Rule Name "), "╰┈➤" + newValue, false);
-
- default -> {
- // ignore everything else
- }
- }
- });
-
- eb.addField("Additional Info", MarkdownUtil.codeblock("For more info on trigger metadata, actions, exempt roles and channels, visit Safety Setup in your server"), false);
- eb.setFooter("Audit Log Entry ID: " + ale.getId());
- eb.setTimestamp(ale.getTimeCreated());
-
- if (!eb.isValidLength() || eb.isEmpty()) {
- log.warn("Embed is empty or too long (current length: {}).", eb.length());
- return;
- }
-
- TextChannel sendingChannel = event.getGuild().getTextChannelById(channelIdToSendTo);
- if (sendingChannel != null && sendingChannel.canTalk()) {
- sendingChannel.sendMessageEmbeds(eb.build()).queue();
- }
- }
-
- public void handleRuleDeleteEvent(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
-
- AuditLogEntry ale = event.getEntry();
-
- EmbedBuilder eb = new EmbedBuilder();
- eb.setTitle("Audit Log Entry | AutoMod Rule Delete");
-
- User executor = ale.getJDA().getUserById(ale.getUserIdLong());
- String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
-
- eb.setDescription(MarkdownUtil.quoteBlock("Rule Deleted By: " + mentionableExecutor + "\nRule Deleted For: AutoMod"));
- eb.setColor(Color.RED);
-
- ale.getChanges().forEach((changeKey, changeValue) -> {
-
- Object oldValue = changeValue.getOldValue();
-
- if (changeKey.equals("name")) {
- eb.addField(MarkdownUtil.underline("AutoMod Rule Name"), "╰┈➤" + oldValue, false);
- }
- });
-
- eb.setFooter("Audit Log Entry ID: " + ale.getId());
- eb.setTimestamp(ale.getTimeCreated());
-
- if (!eb.isValidLength() || eb.isEmpty()) {
- log.warn("Embed is empty or too long (current length: {}).", eb.length());
- return;
- }
-
- TextChannel sendingChannel = event.getGuild().getTextChannelById(channelIdToSendTo);
- if (sendingChannel != null && sendingChannel.canTalk()) {
- sendingChannel.sendMessageEmbeds(eb.build()).queue();
- }
- }
-
- public void handleRuleUpdateEvent(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
-
- AuditLogEntry ale = event.getEntry();
-
- EmbedBuilder eb = new EmbedBuilder();
- eb.setTitle("Audit Log Entry | AutoMod Rule Update");
-
- User executor = ale.getJDA().getUserById(ale.getUserIdLong());
- String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
-
- eb.setDescription(MarkdownUtil.quoteBlock("Rule Updated By: " + mentionableExecutor + "\nRule Updated For: AutoMod"));
- eb.setColor(Color.YELLOW);
-
- // add name of the rule which got updated
- AutoModRule rule = ale.getGuild().retrieveAutoModRuleById(ale.getTargetId()).complete();
- eb.addField(MarkdownUtil.underline("AutoMod Rule Name"), "╰┈➤" + rule.getName(), false);
-
- eb.addField(MarkdownUtil.underline("Additional Info"), MarkdownUtil.codeblock("For more info on trigger metadata, actions, exempt roles and channel changes, visit Safety Setup in your server"), false);
-
- eb.setFooter("Audit Log Entry ID: " + ale.getId());
- eb.setTimestamp(ale.getTimeCreated());
-
- if (!eb.isValidLength() || eb.isEmpty()) {
- log.warn("Embed is empty or too long (current length: {}).", eb.length());
- return;
- }
-
- TextChannel sendingChannel = event.getGuild().getTextChannelById(channelIdToSendTo);
- if (sendingChannel != null && sendingChannel.canTalk()) {
- sendingChannel.sendMessageEmbeds(eb.build()).queue();
- }
- }
-}
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/ModActionEventHandlerService.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/ModActionEventHandlerService.java
deleted file mode 100644
index 8df5863..0000000
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/ModActionEventHandlerService.java
+++ /dev/null
@@ -1,150 +0,0 @@
-package io.github.eggy03.papertrail.bot.service.auditlog;
-
-import jakarta.enterprise.context.ApplicationScoped;
-import lombok.NonNull;
-import lombok.extern.slf4j.Slf4j;
-import net.dv8tion.jda.api.EmbedBuilder;
-import net.dv8tion.jda.api.audit.AuditLogEntry;
-import net.dv8tion.jda.api.entities.User;
-import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;
-import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
-import net.dv8tion.jda.api.utils.MarkdownUtil;
-
-import java.awt.Color;
-
-@ApplicationScoped
-@Slf4j
-public class ModActionEventHandlerService {
-
- public void handleBanEvent(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
- AuditLogEntry ale = event.getEntry();
-
- User moderator = ale.getJDA().getUserById(ale.getUserIdLong());
- String mentionableModerator = (moderator != null ? moderator.getAsMention() : ale.getUserId());
- String reasonForBan = ale.getReason() == null ? "No Reason Provided" : ale.getReason();
-
- // A REST Action is required here because banned members are not cached
- event.getJDA().retrieveUserById(ale.getTargetId()).queue(bannedUser -> {
-
- String mentionableBannedUser = bannedUser != null ? bannedUser.getAsMention() : ale.getTargetId();
-
- EmbedBuilder eb = new EmbedBuilder();
- eb.setTitle("Audit Log Entry | Ban Event");
- eb.setDescription(MarkdownUtil.quoteBlock("A Member Has Been Banned By: " + mentionableModerator));
- eb.setColor(Color.RED);
-
- eb.addField(MarkdownUtil.underline("Banned Member"), "╰┈➤" + mentionableBannedUser, false);
- eb.addField(MarkdownUtil.underline("Ban Reason"), "╰┈➤" + reasonForBan, false);
-
- eb.setFooter("Audit Log Entry ID: " + ale.getId());
- eb.setTimestamp(ale.getTimeCreated());
-
- if (!eb.isValidLength() || eb.isEmpty()) {
- log.warn("Embed is empty or too long (current length: {}).", eb.length());
- return;
- }
-
- TextChannel sendingChannel = event.getGuild().getTextChannelById(channelIdToSendTo);
- if (sendingChannel != null && sendingChannel.canTalk()) {
- sendingChannel.sendMessageEmbeds(eb.build()).queue();
- }
- });
- }
-
- public void handleKickEvent(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
- AuditLogEntry ale = event.getEntry();
-
- User moderator = ale.getJDA().getUserById(ale.getUserIdLong());
- String mentionableModerator = (moderator != null ? moderator.getAsMention() : ale.getUserId());
- String reasonForKick = ale.getReason() == null ? "No Reason Provided" : ale.getReason();
-
- // A REST Action is required here because kicked members are not cached
- event.getJDA().retrieveUserById(ale.getTargetId()).queue(kickedUser -> {
-
- String mentionableKickedUser = kickedUser != null ? kickedUser.getAsMention() : ale.getTargetId();
-
- EmbedBuilder eb = new EmbedBuilder();
- eb.setTitle("Audit Log Entry | Kick Event");
- eb.setDescription(MarkdownUtil.quoteBlock("A Member Has Been Kicked By: " + mentionableModerator));
- eb.setColor(Color.ORANGE);
-
- eb.addField(MarkdownUtil.underline("Kicked Member"), "╰┈➤" + mentionableKickedUser, false);
- eb.addField(MarkdownUtil.underline("Reason"), "╰┈➤" + reasonForKick, false);
-
- eb.setFooter("Audit Log Entry ID: " + ale.getId());
- eb.setTimestamp(ale.getTimeCreated());
-
- if (!eb.isValidLength() || eb.isEmpty()) {
- log.warn("Embed is empty or too long (current length: {}).", eb.length());
- return;
- }
-
- TextChannel sendingChannel = event.getGuild().getTextChannelById(channelIdToSendTo);
- if (sendingChannel != null && sendingChannel.canTalk()) {
- sendingChannel.sendMessageEmbeds(eb.build()).queue();
- }
- });
- }
-
- public void handleUnbanEvent(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
- AuditLogEntry ale = event.getEntry();
-
- User moderator = ale.getJDA().getUserById(ale.getUserIdLong());
- String mentionableModerator = (moderator != null ? moderator.getAsMention() : ale.getUserId());
-
- event.getJDA().retrieveUserById(ale.getTargetId()).queue(unbannedUser -> {
-
- String mentionableUnbannedUser = unbannedUser != null ? unbannedUser.getAsMention() : ale.getTargetId();
-
- EmbedBuilder eb = new EmbedBuilder();
- eb.setTitle("Audit Log Entry | Member Unban Event");
- eb.setDescription(MarkdownUtil.quoteBlock("A Member Has Been Un-Banned By: " + mentionableModerator));
- eb.setColor(Color.GREEN);
-
- eb.addField(MarkdownUtil.underline("Un-banned User"), "╰┈➤" + mentionableUnbannedUser, false);
-
- eb.setFooter("Audit Log Entry ID: " + ale.getId());
- eb.setTimestamp(ale.getTimeCreated());
-
- if (!eb.isValidLength() || eb.isEmpty()) {
- log.warn("Embed is empty or too long (current length: {}).", eb.length());
- return;
- }
-
- TextChannel sendingChannel = event.getGuild().getTextChannelById(channelIdToSendTo);
- if (sendingChannel != null && sendingChannel.canTalk()) {
- sendingChannel.sendMessageEmbeds(eb.build()).queue();
- }
- });
- }
-
- public void handleBotAddEvent(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
- AuditLogEntry ale = event.getEntry();
-
- User executor = ale.getJDA().getUserById(ale.getUserIdLong());
- String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
-
- User target = ale.getJDA().getUserById(ale.getTargetIdLong());
- String mentionableTarget = (target != null ? target.getAsMention() : ale.getTargetId());
-
- EmbedBuilder eb = new EmbedBuilder();
- eb.setTitle("Audit Log Entry | Bot Add Event");
- eb.setDescription(MarkdownUtil.quoteBlock("Bot Added By: " + mentionableExecutor + "\nBot ID: " + ale.getTargetId()));
- eb.setColor(Color.CYAN);
-
- eb.addField(MarkdownUtil.underline("Bot Added"), "╰┈➤" + mentionableTarget, false);
-
- eb.setFooter("Audit Log Entry ID: " + ale.getId());
- eb.setTimestamp(ale.getTimeCreated());
-
- if (!eb.isValidLength() || eb.isEmpty()) {
- log.warn("Embed is empty or too long (current length: {}).", eb.length());
- return;
- }
-
- TextChannel sendingChannel = event.getGuild().getTextChannelById(channelIdToSendTo);
- if (sendingChannel != null && sendingChannel.canTalk()) {
- sendingChannel.sendMessageEmbeds(eb.build()).queue();
- }
- }
-}
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/automod/AutoModerationFlagToChannelEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/automod/AutoModerationFlagToChannelEventHelper.java
new file mode 100644
index 0000000..6d92957
--- /dev/null
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/automod/AutoModerationFlagToChannelEventHelper.java
@@ -0,0 +1,51 @@
+package io.github.eggy03.papertrail.bot.service.auditlog.automod;
+
+import lombok.NonNull;
+import lombok.experimental.UtilityClass;
+import lombok.extern.slf4j.Slf4j;
+import net.dv8tion.jda.api.EmbedBuilder;
+import net.dv8tion.jda.api.audit.AuditLogEntry;
+import net.dv8tion.jda.api.entities.User;
+import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;
+import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
+import net.dv8tion.jda.api.utils.MarkdownUtil;
+
+import java.awt.Color;
+
+@UtilityClass
+@Slf4j
+public class AutoModerationFlagToChannelEventHelper {
+
+ public static void format(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
+
+ AuditLogEntry ale = event.getEntry();
+
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("Audit Log Entry | Auto-Mod Event");
+
+ User targetUser = ale.getJDA().getUserById(ale.getTargetId());
+ String targetMention = (targetUser != null ? targetUser.getAsMention() : ale.getTargetId());
+
+ eb.setDescription(MarkdownUtil.quoteBlock("Event: AutoMod Message Flag\nTarget Member: " + targetMention));
+ eb.setColor(Color.YELLOW);
+
+ eb.addField(
+ MarkdownUtil.underline("Additional Info"),
+ MarkdownUtil.codeblock("Flagged message will be available in the channel set to receive AutoMod events."),
+ false
+ );
+
+ eb.setFooter("Audit Log Entry ID: " + ale.getId());
+ eb.setTimestamp(ale.getTimeCreated());
+
+ if (!eb.isValidLength() || eb.isEmpty()) {
+ log.warn("Embed is empty or too long (current length: {}).", eb.length());
+ return;
+ }
+
+ TextChannel sendingChannel = event.getGuild().getTextChannelById(channelIdToSendTo);
+ if (sendingChannel != null && sendingChannel.canTalk()) {
+ sendingChannel.sendMessageEmbeds(eb.build()).queue();
+ }
+ }
+}
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/automod/AutoModerationMemberTimeoutEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/automod/AutoModerationMemberTimeoutEventHelper.java
new file mode 100644
index 0000000..1c99871
--- /dev/null
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/automod/AutoModerationMemberTimeoutEventHelper.java
@@ -0,0 +1,51 @@
+package io.github.eggy03.papertrail.bot.service.auditlog.automod;
+
+import lombok.NonNull;
+import lombok.experimental.UtilityClass;
+import lombok.extern.slf4j.Slf4j;
+import net.dv8tion.jda.api.EmbedBuilder;
+import net.dv8tion.jda.api.audit.AuditLogEntry;
+import net.dv8tion.jda.api.entities.User;
+import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;
+import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
+import net.dv8tion.jda.api.utils.MarkdownUtil;
+
+import java.awt.Color;
+
+@UtilityClass
+@Slf4j
+public class AutoModerationMemberTimeoutEventHelper {
+
+ public static void format(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
+
+ AuditLogEntry ale = event.getEntry();
+
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("Audit Log Entry | Auto-mod Event");
+
+ User targetUser = ale.getJDA().getUserById(ale.getTargetId());
+ String targetMention = (targetUser != null ? targetUser.getAsMention() : ale.getTargetId());
+
+ eb.setDescription(MarkdownUtil.quoteBlock("Event: AutoMod Member Timeout\nTarget Member: " + targetMention));
+ eb.setColor(Color.MAGENTA);
+
+ eb.addField(
+ MarkdownUtil.underline("Additional Info"),
+ MarkdownUtil.codeblock("Timeout Rule and Reason will be available in the channel set to receive AutoMod events."),
+ false
+ );
+
+ eb.setFooter("Audit Log Entry ID: " + ale.getId());
+ eb.setTimestamp(ale.getTimeCreated());
+
+ if (!eb.isValidLength() || eb.isEmpty()) {
+ log.warn("Embed is empty or too long (current length: {}).", eb.length());
+ return;
+ }
+
+ TextChannel sendingChannel = event.getGuild().getTextChannelById(channelIdToSendTo);
+ if (sendingChannel != null && sendingChannel.canTalk()) {
+ sendingChannel.sendMessageEmbeds(eb.build()).queue();
+ }
+ }
+}
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/automod/AutoModerationRuleBlockMessageEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/automod/AutoModerationRuleBlockMessageEventHelper.java
new file mode 100644
index 0000000..716ab93
--- /dev/null
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/automod/AutoModerationRuleBlockMessageEventHelper.java
@@ -0,0 +1,51 @@
+package io.github.eggy03.papertrail.bot.service.auditlog.automod;
+
+import lombok.NonNull;
+import lombok.experimental.UtilityClass;
+import lombok.extern.slf4j.Slf4j;
+import net.dv8tion.jda.api.EmbedBuilder;
+import net.dv8tion.jda.api.audit.AuditLogEntry;
+import net.dv8tion.jda.api.entities.User;
+import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;
+import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
+import net.dv8tion.jda.api.utils.MarkdownUtil;
+
+import java.awt.Color;
+
+@UtilityClass
+@Slf4j
+public class AutoModerationRuleBlockMessageEventHelper {
+
+ public static void format(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
+
+ AuditLogEntry ale = event.getEntry();
+
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("Audit Log Entry | Auto-mod Event");
+
+ User targetUser = ale.getJDA().getUserById(ale.getTargetId());
+ String targetMention = (targetUser != null ? targetUser.getAsMention() : ale.getTargetId());
+
+ eb.setDescription(MarkdownUtil.quoteBlock("Event: AutoMod Message Block\nTarget Member: " + targetMention));
+ eb.setColor(Color.ORANGE);
+
+ eb.addField(
+ MarkdownUtil.underline("Additional Info"),
+ MarkdownUtil.codeblock("Blocked message will be available in the channel set to receive AutoMod events."),
+ false
+ );
+
+ eb.setFooter("Audit Log Entry ID: " + ale.getId());
+ eb.setTimestamp(ale.getTimeCreated());
+
+ if (!eb.isValidLength() || eb.isEmpty()) {
+ log.warn("Embed is empty or too long (current length: {}).", eb.length());
+ return;
+ }
+
+ TextChannel sendingChannel = event.getGuild().getTextChannelById(channelIdToSendTo);
+ if (sendingChannel != null && sendingChannel.canTalk()) {
+ sendingChannel.sendMessageEmbeds(eb.build()).queue();
+ }
+ }
+}
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/automod/AutoModerationRuleCreateEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/automod/AutoModerationRuleCreateEventHelper.java
new file mode 100644
index 0000000..4f6b93f
--- /dev/null
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/automod/AutoModerationRuleCreateEventHelper.java
@@ -0,0 +1,71 @@
+package io.github.eggy03.papertrail.bot.service.auditlog.automod;
+
+import io.github.eggy03.papertrail.bot.service.auditlog.automod.utils.AutoModUtils;
+import io.github.eggy03.papertrail.bot.utils.BooleanUtils;
+import lombok.NonNull;
+import lombok.experimental.UtilityClass;
+import lombok.extern.slf4j.Slf4j;
+import net.dv8tion.jda.api.EmbedBuilder;
+import net.dv8tion.jda.api.audit.AuditLogEntry;
+import net.dv8tion.jda.api.entities.User;
+import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;
+import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
+import net.dv8tion.jda.api.utils.MarkdownUtil;
+
+import java.awt.Color;
+
+@UtilityClass
+@Slf4j
+public class AutoModerationRuleCreateEventHelper {
+
+ public static void format(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
+
+ AuditLogEntry ale = event.getEntry();
+
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("Audit Log Entry | AutoMod Rule Create");
+
+ User executor = ale.getJDA().getUserById(ale.getUserIdLong());
+ String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
+
+ eb.setDescription(MarkdownUtil.quoteBlock("Rule Created By: " + mentionableExecutor + "\nRule Created For: AutoMod"));
+ eb.setColor(Color.GREEN);
+
+ ale.getChanges().forEach((changeKey, changeValue) -> {
+
+ Object newValue = changeValue.getNewValue();
+
+ switch (changeKey) {
+
+ case "enabled" ->
+ eb.addField(MarkdownUtil.underline("Enabled"), "╰┈➤" + BooleanUtils.formatToYesOrNo(newValue), false);
+
+ case "trigger_type" ->
+ eb.addField(MarkdownUtil.underline("Trigger Type"), "╰┈➤" + AutoModUtils.autoModTriggerTypeResolver(newValue), false);
+
+ case "event_type" ->
+ eb.addField(MarkdownUtil.underline("Event Type"), "╰┈➤" + AutoModUtils.autoModEventTypeResolver(newValue), false);
+
+ case "name" -> eb.addField(MarkdownUtil.underline("AutoMod Rule Name "), "╰┈➤" + newValue, false);
+
+ default -> {
+ // ignore everything else
+ }
+ }
+ });
+
+ eb.addField("Additional Info", MarkdownUtil.codeblock("For more info on trigger metadata, actions, exempt roles and channels, visit Safety Setup in your server"), false);
+ eb.setFooter("Audit Log Entry ID: " + ale.getId());
+ eb.setTimestamp(ale.getTimeCreated());
+
+ if (!eb.isValidLength() || eb.isEmpty()) {
+ log.warn("Embed is empty or too long (current length: {}).", eb.length());
+ return;
+ }
+
+ TextChannel sendingChannel = event.getGuild().getTextChannelById(channelIdToSendTo);
+ if (sendingChannel != null && sendingChannel.canTalk()) {
+ sendingChannel.sendMessageEmbeds(eb.build()).queue();
+ }
+ }
+}
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/automod/AutoModerationRuleDeleteEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/automod/AutoModerationRuleDeleteEventHelper.java
new file mode 100644
index 0000000..9b429c4
--- /dev/null
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/automod/AutoModerationRuleDeleteEventHelper.java
@@ -0,0 +1,54 @@
+package io.github.eggy03.papertrail.bot.service.auditlog.automod;
+
+import lombok.NonNull;
+import lombok.experimental.UtilityClass;
+import lombok.extern.slf4j.Slf4j;
+import net.dv8tion.jda.api.EmbedBuilder;
+import net.dv8tion.jda.api.audit.AuditLogEntry;
+import net.dv8tion.jda.api.entities.User;
+import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;
+import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
+import net.dv8tion.jda.api.utils.MarkdownUtil;
+
+import java.awt.Color;
+
+@UtilityClass
+@Slf4j
+public class AutoModerationRuleDeleteEventHelper {
+
+ public static void format(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
+
+ AuditLogEntry ale = event.getEntry();
+
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("Audit Log Entry | AutoMod Rule Delete");
+
+ User executor = ale.getJDA().getUserById(ale.getUserIdLong());
+ String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
+
+ eb.setDescription(MarkdownUtil.quoteBlock("Rule Deleted By: " + mentionableExecutor + "\nRule Deleted For: AutoMod"));
+ eb.setColor(Color.RED);
+
+ ale.getChanges().forEach((changeKey, changeValue) -> {
+
+ Object oldValue = changeValue.getOldValue();
+
+ if (changeKey.equals("name")) {
+ eb.addField(MarkdownUtil.underline("AutoMod Rule Name"), "╰┈➤" + oldValue, false);
+ }
+ });
+
+ eb.setFooter("Audit Log Entry ID: " + ale.getId());
+ eb.setTimestamp(ale.getTimeCreated());
+
+ if (!eb.isValidLength() || eb.isEmpty()) {
+ log.warn("Embed is empty or too long (current length: {}).", eb.length());
+ return;
+ }
+
+ TextChannel sendingChannel = event.getGuild().getTextChannelById(channelIdToSendTo);
+ if (sendingChannel != null && sendingChannel.canTalk()) {
+ sendingChannel.sendMessageEmbeds(eb.build()).queue();
+ }
+ }
+}
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/automod/AutoModerationRuleUpdateEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/automod/AutoModerationRuleUpdateEventHelper.java
new file mode 100644
index 0000000..2e0dc79
--- /dev/null
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/automod/AutoModerationRuleUpdateEventHelper.java
@@ -0,0 +1,52 @@
+package io.github.eggy03.papertrail.bot.service.auditlog.automod;
+
+import lombok.NonNull;
+import lombok.experimental.UtilityClass;
+import lombok.extern.slf4j.Slf4j;
+import net.dv8tion.jda.api.EmbedBuilder;
+import net.dv8tion.jda.api.audit.AuditLogEntry;
+import net.dv8tion.jda.api.entities.User;
+import net.dv8tion.jda.api.entities.automod.AutoModRule;
+import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;
+import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
+import net.dv8tion.jda.api.utils.MarkdownUtil;
+
+import java.awt.Color;
+
+@UtilityClass
+@Slf4j
+public class AutoModerationRuleUpdateEventHelper {
+
+ public static void format(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
+
+ AuditLogEntry ale = event.getEntry();
+
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("Audit Log Entry | AutoMod Rule Update");
+
+ User executor = ale.getJDA().getUserById(ale.getUserIdLong());
+ String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
+
+ eb.setDescription(MarkdownUtil.quoteBlock("Rule Updated By: " + mentionableExecutor + "\nRule Updated For: AutoMod"));
+ eb.setColor(Color.YELLOW);
+
+ // add name of the rule which got updated
+ AutoModRule rule = ale.getGuild().retrieveAutoModRuleById(ale.getTargetId()).complete();
+ eb.addField(MarkdownUtil.underline("AutoMod Rule Name"), "╰┈➤" + rule.getName(), false);
+
+ eb.addField(MarkdownUtil.underline("Additional Info"), MarkdownUtil.codeblock("For more info on trigger metadata, actions, exempt roles and channel changes, visit Safety Setup in your server"), false);
+
+ eb.setFooter("Audit Log Entry ID: " + ale.getId());
+ eb.setTimestamp(ale.getTimeCreated());
+
+ if (!eb.isValidLength() || eb.isEmpty()) {
+ log.warn("Embed is empty or too long (current length: {}).", eb.length());
+ return;
+ }
+
+ TextChannel sendingChannel = event.getGuild().getTextChannelById(channelIdToSendTo);
+ if (sendingChannel != null && sendingChannel.canTalk()) {
+ sendingChannel.sendMessageEmbeds(eb.build()).queue();
+ }
+ }
+}
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/AutoModUtils.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/automod/utils/AutoModUtils.java
similarity index 94%
rename from src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/AutoModUtils.java
rename to src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/automod/utils/AutoModUtils.java
index d159f77..8149bb7 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/AutoModUtils.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/automod/utils/AutoModUtils.java
@@ -1,4 +1,4 @@
-package io.github.eggy03.papertrail.bot.utils.auditlog;
+package io.github.eggy03.papertrail.bot.service.auditlog.automod.utils;
import io.github.eggy03.papertrail.bot.utils.NumberParseUtils;
import lombok.NonNull;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/bot/BotAddEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/bot/BotAddEventHelper.java
new file mode 100644
index 0000000..c8e296d
--- /dev/null
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/bot/BotAddEventHelper.java
@@ -0,0 +1,49 @@
+package io.github.eggy03.papertrail.bot.service.auditlog.bot;
+
+import lombok.NonNull;
+import lombok.experimental.UtilityClass;
+import lombok.extern.slf4j.Slf4j;
+import net.dv8tion.jda.api.EmbedBuilder;
+import net.dv8tion.jda.api.audit.AuditLogEntry;
+import net.dv8tion.jda.api.entities.User;
+import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;
+import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
+import net.dv8tion.jda.api.utils.MarkdownUtil;
+
+import java.awt.Color;
+
+@UtilityClass
+@Slf4j
+public class BotAddEventHelper {
+
+ public static void format(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
+
+ AuditLogEntry ale = event.getEntry();
+
+ User executor = ale.getJDA().getUserById(ale.getUserIdLong());
+ String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
+
+ User target = ale.getJDA().getUserById(ale.getTargetIdLong());
+ String mentionableTarget = (target != null ? target.getAsMention() : ale.getTargetId());
+
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("Audit Log Entry | Bot Add Event");
+ eb.setDescription(MarkdownUtil.quoteBlock("Bot Added By: " + mentionableExecutor + "\nBot ID: " + ale.getTargetId()));
+ eb.setColor(Color.CYAN);
+
+ eb.addField(MarkdownUtil.underline("Bot Added"), "╰┈➤" + mentionableTarget, false);
+
+ eb.setFooter("Audit Log Entry ID: " + ale.getId());
+ eb.setTimestamp(ale.getTimeCreated());
+
+ if (!eb.isValidLength() || eb.isEmpty()) {
+ log.warn("Embed is empty or too long (current length: {}).", eb.length());
+ return;
+ }
+
+ TextChannel sendingChannel = event.getGuild().getTextChannelById(channelIdToSendTo);
+ if (sendingChannel != null && sendingChannel.canTalk()) {
+ sendingChannel.sendMessageEmbeds(eb.build()).queue();
+ }
+ }
+}
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/modactions/BanEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/modactions/BanEventHelper.java
new file mode 100644
index 0000000..1273554
--- /dev/null
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/modactions/BanEventHelper.java
@@ -0,0 +1,54 @@
+package io.github.eggy03.papertrail.bot.service.auditlog.modactions;
+
+import lombok.NonNull;
+import lombok.experimental.UtilityClass;
+import lombok.extern.slf4j.Slf4j;
+import net.dv8tion.jda.api.EmbedBuilder;
+import net.dv8tion.jda.api.audit.AuditLogEntry;
+import net.dv8tion.jda.api.entities.User;
+import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;
+import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
+import net.dv8tion.jda.api.utils.MarkdownUtil;
+
+import java.awt.Color;
+
+@UtilityClass
+@Slf4j
+public class BanEventHelper {
+
+ public static void format(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
+
+ AuditLogEntry ale = event.getEntry();
+
+ User moderator = ale.getJDA().getUserById(ale.getUserIdLong());
+ String mentionableModerator = (moderator != null ? moderator.getAsMention() : ale.getUserId());
+ String reasonForBan = ale.getReason() == null ? "No Reason Provided" : ale.getReason();
+
+ // A REST Action is required here because banned members are not cached
+ event.getJDA().retrieveUserById(ale.getTargetId()).queue(bannedUser -> {
+
+ String mentionableBannedUser = bannedUser != null ? bannedUser.getAsMention() : ale.getTargetId();
+
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("Audit Log Entry | Ban Event");
+ eb.setDescription(MarkdownUtil.quoteBlock("A Member Has Been Banned By: " + mentionableModerator));
+ eb.setColor(Color.RED);
+
+ eb.addField(MarkdownUtil.underline("Banned Member"), "╰┈➤" + mentionableBannedUser, false);
+ eb.addField(MarkdownUtil.underline("Ban Reason"), "╰┈➤" + reasonForBan, false);
+
+ eb.setFooter("Audit Log Entry ID: " + ale.getId());
+ eb.setTimestamp(ale.getTimeCreated());
+
+ if (!eb.isValidLength() || eb.isEmpty()) {
+ log.warn("Embed is empty or too long (current length: {}).", eb.length());
+ return;
+ }
+
+ TextChannel sendingChannel = event.getGuild().getTextChannelById(channelIdToSendTo);
+ if (sendingChannel != null && sendingChannel.canTalk()) {
+ sendingChannel.sendMessageEmbeds(eb.build()).queue();
+ }
+ });
+ }
+}
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/modactions/KickEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/modactions/KickEventHelper.java
new file mode 100644
index 0000000..dbf275c
--- /dev/null
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/modactions/KickEventHelper.java
@@ -0,0 +1,54 @@
+package io.github.eggy03.papertrail.bot.service.auditlog.modactions;
+
+import lombok.NonNull;
+import lombok.experimental.UtilityClass;
+import lombok.extern.slf4j.Slf4j;
+import net.dv8tion.jda.api.EmbedBuilder;
+import net.dv8tion.jda.api.audit.AuditLogEntry;
+import net.dv8tion.jda.api.entities.User;
+import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;
+import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
+import net.dv8tion.jda.api.utils.MarkdownUtil;
+
+import java.awt.Color;
+
+@UtilityClass
+@Slf4j
+public class KickEventHelper {
+
+ public static void format(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
+
+ AuditLogEntry ale = event.getEntry();
+
+ User moderator = ale.getJDA().getUserById(ale.getUserIdLong());
+ String mentionableModerator = (moderator != null ? moderator.getAsMention() : ale.getUserId());
+ String reasonForKick = ale.getReason() == null ? "No Reason Provided" : ale.getReason();
+
+ // A REST Action is required here because kicked members are not cached
+ event.getJDA().retrieveUserById(ale.getTargetId()).queue(kickedUser -> {
+
+ String mentionableKickedUser = kickedUser != null ? kickedUser.getAsMention() : ale.getTargetId();
+
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("Audit Log Entry | Kick Event");
+ eb.setDescription(MarkdownUtil.quoteBlock("A Member Has Been Kicked By: " + mentionableModerator));
+ eb.setColor(Color.ORANGE);
+
+ eb.addField(MarkdownUtil.underline("Kicked Member"), "╰┈➤" + mentionableKickedUser, false);
+ eb.addField(MarkdownUtil.underline("Reason"), "╰┈➤" + reasonForKick, false);
+
+ eb.setFooter("Audit Log Entry ID: " + ale.getId());
+ eb.setTimestamp(ale.getTimeCreated());
+
+ if (!eb.isValidLength() || eb.isEmpty()) {
+ log.warn("Embed is empty or too long (current length: {}).", eb.length());
+ return;
+ }
+
+ TextChannel sendingChannel = event.getGuild().getTextChannelById(channelIdToSendTo);
+ if (sendingChannel != null && sendingChannel.canTalk()) {
+ sendingChannel.sendMessageEmbeds(eb.build()).queue();
+ }
+ });
+ }
+}
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/modactions/UnbanEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/modactions/UnbanEventHelper.java
new file mode 100644
index 0000000..fe83bd9
--- /dev/null
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/modactions/UnbanEventHelper.java
@@ -0,0 +1,51 @@
+package io.github.eggy03.papertrail.bot.service.auditlog.modactions;
+
+import lombok.NonNull;
+import lombok.experimental.UtilityClass;
+import lombok.extern.slf4j.Slf4j;
+import net.dv8tion.jda.api.EmbedBuilder;
+import net.dv8tion.jda.api.audit.AuditLogEntry;
+import net.dv8tion.jda.api.entities.User;
+import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;
+import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
+import net.dv8tion.jda.api.utils.MarkdownUtil;
+
+import java.awt.Color;
+
+@UtilityClass
+@Slf4j
+public class UnbanEventHelper {
+
+ public static void format(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
+
+ AuditLogEntry ale = event.getEntry();
+
+ User moderator = ale.getJDA().getUserById(ale.getUserIdLong());
+ String mentionableModerator = (moderator != null ? moderator.getAsMention() : ale.getUserId());
+
+ event.getJDA().retrieveUserById(ale.getTargetId()).queue(unbannedUser -> {
+
+ String mentionableUnbannedUser = unbannedUser != null ? unbannedUser.getAsMention() : ale.getTargetId();
+
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("Audit Log Entry | Member Unban Event");
+ eb.setDescription(MarkdownUtil.quoteBlock("A Member Has Been Un-Banned By: " + mentionableModerator));
+ eb.setColor(Color.GREEN);
+
+ eb.addField(MarkdownUtil.underline("Un-banned User"), "╰┈➤" + mentionableUnbannedUser, false);
+
+ eb.setFooter("Audit Log Entry ID: " + ale.getId());
+ eb.setTimestamp(ale.getTimeCreated());
+
+ if (!eb.isValidLength() || eb.isEmpty()) {
+ log.warn("Embed is empty or too long (current length: {}).", eb.length());
+ return;
+ }
+
+ TextChannel sendingChannel = event.getGuild().getTextChannelById(channelIdToSendTo);
+ if (sendingChannel != null && sendingChannel.canTalk()) {
+ sendingChannel.sendMessageEmbeds(eb.build()).queue();
+ }
+ });
+ }
+}
From 1b3ad288266c26c1bbd4a13e47c4589d225926e7 Mon Sep 17 00:00:00 2001
From: Egg-03 <111327101+eggy03@users.noreply.github.com>
Date: Fri, 29 May 2026 17:02:56 +0530
Subject: [PATCH 12/66] refactor(auditlog): restructure audit log event
handling
- Replace `AuditLogListener` with `AuditLogEntryEventListener` and `AbstractAuditLogEntryEventHandler`
- Decouple event routing from handling to support multiple CDI-based handlers
- Use `@RunOnVirtualThread` for virtual thread execution
Signed-off-by: Egg-03 <111327101+eggy03@users.noreply.github.com>
---
.../AbstractAuditLogEntryEventHandler.java | 324 ++++++++++++++++++
.../auditlog/AuditLogEntryEventListener.java | 47 +++
.../listeners/auditlog/AuditLogListener.java | 207 -----------
3 files changed, 371 insertions(+), 207 deletions(-)
create mode 100644 src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/AbstractAuditLogEntryEventHandler.java
create mode 100644 src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/AuditLogEntryEventListener.java
delete mode 100644 src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/AuditLogListener.java
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/AbstractAuditLogEntryEventHandler.java b/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/AbstractAuditLogEntryEventHandler.java
new file mode 100644
index 0000000..d8773ba
--- /dev/null
+++ b/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/AbstractAuditLogEntryEventHandler.java
@@ -0,0 +1,324 @@
+package io.github.eggy03.papertrail.bot.listeners.auditlog;
+
+import lombok.NonNull;
+import net.dv8tion.jda.api.audit.ActionType;
+import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
+
+public abstract class AbstractAuditLogEntryEventHandler {
+
+ public void onAutoModerationFlagToChannel(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
+ }
+
+ public void onAutoModerationMemberTimeout(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
+ }
+
+ public void onAutoModerationRuleBlockMessage(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
+ }
+
+ public void onAutoModerationRuleCreate(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
+ }
+
+ public void onAutoModerationRuleUpdate(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
+ }
+
+ public void onAutoModerationRuleDelete(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
+ }
+
+ public void onKick(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
+ }
+
+ public void onPrune(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
+ }
+
+ public void onBan(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
+ }
+
+ public void onUnban(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
+ }
+
+ public void onBotAdd(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
+ }
+
+ public void onChannelCreate(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
+ }
+
+ public void onChannelUpdate(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
+ }
+
+ public void onChannelDelete(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
+ }
+
+ public void onChannelOverrideCreate(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
+ }
+
+ public void onChannelOverrideUpdate(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
+ }
+
+ public void onChannelOverrideDelete(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
+ }
+
+ public void onRoleCreate(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
+ }
+
+ public void onRoleUpdate(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
+ }
+
+ public void onRoleDelete(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
+ }
+
+ public void onEmojiCreate(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
+ }
+
+ public void onEmojiUpdate(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
+ }
+
+ public void onEmojiDelete(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
+ }
+
+ public void onStickerCreate(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
+ }
+
+ public void onStickerUpdate(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
+ }
+
+ public void onStickerDelete(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
+ }
+
+ public void onGuildUpdate(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
+ }
+
+ public void onGuildProfileUpdate(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
+ }
+
+ public void onIntegrationCreate(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
+ }
+
+ public void onIntegrationUpdate(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
+ }
+
+ public void onIntegrationDelete(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
+ }
+
+ public void onApplicationCommandPrivilegesUpdate(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
+ }
+
+ public void onInviteCreate(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
+ }
+
+ public void onInviteUpdate(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
+ }
+
+ public void onInviteDelete(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
+ }
+
+ public void onMemberRoleUpdate(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
+ }
+
+ public void onMemberUpdate(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
+ }
+
+ public void onMemberVoiceKick(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
+ }
+
+ public void onMemberVoiceMove(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
+ }
+
+ public void onMessagePin(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
+ }
+
+ public void onMessageUnpin(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
+ }
+
+ public void onScheduledEventCreate(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
+ }
+
+ public void onScheduledEventUpdate(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
+ }
+
+ public void onScheduledEventDelete(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
+ }
+
+ public void onStageInstanceCreate(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
+ }
+
+ public void onStageInstanceUpdate(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
+ }
+
+ public void onStageInstanceDelete(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
+ }
+
+ public void onThreadCreate(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
+ }
+
+ public void onThreadUpdate(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
+ }
+
+ public void onThreadDelete(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
+ }
+
+ public void onVoiceChannelStatusUpdate(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
+ }
+
+ public void onVoiceChannelStatusDelete(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
+ }
+
+ public void onWebhookCreate(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
+ }
+
+ public void onWebhookUpdate(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
+ }
+
+ public void onWebhookDelete(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
+ }
+
+ public void onSoundboardSoundCreate(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
+ }
+
+ public void onSoundboardSoundUpdate(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
+ }
+
+ public void onSoundboardSoundDelete(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
+ }
+
+ public void onOnboardingCreate(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
+ }
+
+ public void onOnboardingUpdate(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
+ }
+
+ public void onOnboardingPromptCreate(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
+ }
+
+ public void onOnboardingPromptUpdate(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
+ }
+
+ public void onOnboardingPromptDelete(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
+ }
+
+ public void onHomeSettingsCreate(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
+ }
+
+ public void onHomeSettingsUpdate(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
+ }
+
+ public void onMessageBulkDelete(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
+ }
+
+ public void onMessageCreate(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
+ }
+
+ public void onMessageUpdate(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
+ }
+
+ public void onMessageDelete(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
+ }
+
+ public void onUnknownEvent(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
+ }
+
+ public void onUnimplementedEvent(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
+ }
+
+ final void handleEvent(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
+ ActionType action = event.getEntry().getType();
+
+ switch (action) {
+ case AUTO_MODERATION_FLAG_TO_CHANNEL -> onAutoModerationFlagToChannel(event, channelIdToSendTo);
+ case AUTO_MODERATION_MEMBER_TIMEOUT -> onAutoModerationMemberTimeout(event, channelIdToSendTo);
+ case AUTO_MODERATION_RULE_BLOCK_MESSAGE -> onAutoModerationRuleBlockMessage(event, channelIdToSendTo);
+ case AUTO_MODERATION_RULE_CREATE -> onAutoModerationRuleCreate(event, channelIdToSendTo);
+ case AUTO_MODERATION_RULE_UPDATE -> onAutoModerationRuleUpdate(event, channelIdToSendTo);
+ case AUTO_MODERATION_RULE_DELETE -> onAutoModerationRuleDelete(event, channelIdToSendTo);
+
+ case KICK -> onKick(event, channelIdToSendTo);
+ case PRUNE -> onPrune(event, channelIdToSendTo); // never happened to trigger
+ case BAN -> onBan(event, channelIdToSendTo);
+ case UNBAN -> onUnban(event, channelIdToSendTo);
+ case BOT_ADD -> onBotAdd(event, channelIdToSendTo);
+
+ case CHANNEL_CREATE -> onChannelCreate(event, channelIdToSendTo);
+ case CHANNEL_UPDATE -> onChannelUpdate(event, channelIdToSendTo);
+ case CHANNEL_DELETE -> onChannelDelete(event, channelIdToSendTo);
+ case CHANNEL_OVERRIDE_CREATE -> onChannelOverrideCreate(event, channelIdToSendTo);
+ case CHANNEL_OVERRIDE_UPDATE -> onChannelOverrideUpdate(event, channelIdToSendTo);
+ case CHANNEL_OVERRIDE_DELETE -> onChannelOverrideDelete(event, channelIdToSendTo);
+
+ case ROLE_CREATE -> onRoleCreate(event, channelIdToSendTo);
+ case ROLE_UPDATE -> onRoleUpdate(event, channelIdToSendTo);
+ case ROLE_DELETE -> onRoleDelete(event, channelIdToSendTo);
+
+ case EMOJI_CREATE -> onEmojiCreate(event, channelIdToSendTo);
+ case EMOJI_UPDATE -> onEmojiUpdate(event, channelIdToSendTo);
+ case EMOJI_DELETE -> onEmojiDelete(event, channelIdToSendTo);
+
+ case STICKER_CREATE -> onStickerCreate(event, channelIdToSendTo);
+ case STICKER_UPDATE -> onStickerUpdate(event, channelIdToSendTo);
+ case STICKER_DELETE -> onStickerDelete(event, channelIdToSendTo);
+
+ case GUILD_UPDATE -> onGuildUpdate(event, channelIdToSendTo);
+ case GUILD_PROFILE_UPDATE -> onGuildProfileUpdate(event, channelIdToSendTo);
+
+ case INTEGRATION_CREATE -> onIntegrationCreate(event, channelIdToSendTo);
+ case INTEGRATION_UPDATE -> onIntegrationUpdate(event, channelIdToSendTo); // never triggers
+ case INTEGRATION_DELETE -> onIntegrationDelete(event, channelIdToSendTo);
+ case APPLICATION_COMMAND_PRIVILEGES_UPDATE ->
+ onApplicationCommandPrivilegesUpdate(event, channelIdToSendTo);
+
+ case INVITE_CREATE -> onInviteCreate(event, channelIdToSendTo);
+ case INVITE_UPDATE -> onInviteUpdate(event, channelIdToSendTo); // never triggers
+ case INVITE_DELETE -> onInviteDelete(event, channelIdToSendTo);
+
+ case MEMBER_ROLE_UPDATE -> onMemberRoleUpdate(event, channelIdToSendTo);
+ case MEMBER_UPDATE -> onMemberUpdate(event, channelIdToSendTo);
+
+ case MEMBER_VOICE_KICK -> onMemberVoiceKick(event, channelIdToSendTo);
+ case MEMBER_VOICE_MOVE -> onMemberVoiceMove(event, channelIdToSendTo);
+
+ case MESSAGE_PIN -> onMessagePin(event, channelIdToSendTo);
+ case MESSAGE_UNPIN -> onMessageUnpin(event, channelIdToSendTo);
+
+ // these seemingly don't trigger properly, or are unreliable
+ case MESSAGE_BULK_DELETE -> onMessageBulkDelete(event, channelIdToSendTo);
+ case MESSAGE_CREATE -> onMessageCreate(event, channelIdToSendTo);
+ case MESSAGE_DELETE -> onMessageDelete(event, channelIdToSendTo);
+ case MESSAGE_UPDATE -> onMessageUpdate(event, channelIdToSendTo);
+
+ case SCHEDULED_EVENT_CREATE -> onScheduledEventCreate(event, channelIdToSendTo);
+ case SCHEDULED_EVENT_UPDATE -> onScheduledEventUpdate(event, channelIdToSendTo);
+ case SCHEDULED_EVENT_DELETE -> onScheduledEventDelete(event, channelIdToSendTo);
+
+ case STAGE_INSTANCE_CREATE -> onStageInstanceCreate(event, channelIdToSendTo);
+ case STAGE_INSTANCE_UPDATE -> onStageInstanceUpdate(event, channelIdToSendTo);
+ case STAGE_INSTANCE_DELETE -> onStageInstanceDelete(event, channelIdToSendTo);
+
+ case THREAD_CREATE -> onThreadCreate(event, channelIdToSendTo);
+ case THREAD_UPDATE -> onThreadUpdate(event, channelIdToSendTo);
+ case THREAD_DELETE -> onThreadDelete(event, channelIdToSendTo);
+
+ case VOICE_CHANNEL_STATUS_UPDATE -> onVoiceChannelStatusUpdate(event, channelIdToSendTo);
+ case VOICE_CHANNEL_STATUS_DELETE -> onVoiceChannelStatusDelete(event, channelIdToSendTo);
+
+ case WEBHOOK_CREATE -> onWebhookCreate(event, channelIdToSendTo);
+ case WEBHOOK_UPDATE -> onWebhookUpdate(event, channelIdToSendTo);
+ case WEBHOOK_REMOVE -> onWebhookDelete(event, channelIdToSendTo);
+
+ case SOUNDBOARD_SOUND_CREATE -> onSoundboardSoundCreate(event, channelIdToSendTo);
+ case SOUNDBOARD_SOUND_UPDATE -> onSoundboardSoundUpdate(event, channelIdToSendTo);
+ case SOUNDBOARD_SOUND_DELETE -> onSoundboardSoundDelete(event, channelIdToSendTo);
+
+ case ONBOARDING_CREATE -> onOnboardingCreate(event, channelIdToSendTo); // unreliable
+ case ONBOARDING_UPDATE -> onOnboardingUpdate(event, channelIdToSendTo);
+
+ case ONBOARDING_PROMPT_CREATE -> onOnboardingPromptCreate(event, channelIdToSendTo);
+ case ONBOARDING_PROMPT_UPDATE -> onOnboardingPromptUpdate(event, channelIdToSendTo);
+ case ONBOARDING_PROMPT_DELETE -> onOnboardingPromptDelete(event, channelIdToSendTo);
+
+ case HOME_SETTINGS_CREATE -> onHomeSettingsCreate(event, channelIdToSendTo);
+ case HOME_SETTINGS_UPDATE -> onHomeSettingsUpdate(event, channelIdToSendTo);
+
+ case UNKNOWN -> onUnknownEvent(event, channelIdToSendTo);
+
+ default -> onUnimplementedEvent(event, channelIdToSendTo);
+ }
+ }
+}
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/AuditLogEntryEventListener.java b/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/AuditLogEntryEventListener.java
new file mode 100644
index 0000000..1d3054b
--- /dev/null
+++ b/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/AuditLogEntryEventListener.java
@@ -0,0 +1,47 @@
+package io.github.eggy03.papertrail.bot.listeners.auditlog;
+
+import io.github.eggy03.papertrail.sdk.client.AuditLogRegistrationClient;
+import io.github.eggy03.papertrail.sdk.entity.AuditLogRegistrationEntity;
+import io.smallrye.common.annotation.RunOnVirtualThread;
+import jakarta.enterprise.context.ApplicationScoped;
+import jakarta.enterprise.inject.Instance;
+import jakarta.inject.Inject;
+import lombok.NonNull;
+import lombok.extern.slf4j.Slf4j;
+import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
+import net.dv8tion.jda.api.hooks.ListenerAdapter;
+
+import java.util.Optional;
+
+/**
+ * Listens for {@link GuildAuditLogEntryCreateEvent} events that happen in registered guilds
+ * and passes the responsibility of handling them on to {@link AbstractAuditLogEntryEventHandler}
+ *
+ */
+@Slf4j
+@ApplicationScoped
+public final class AuditLogEntryEventListener extends ListenerAdapter {
+
+ private final @NonNull AuditLogRegistrationClient client;
+ private final @NonNull Instance eventHandlerInstance;
+
+ @Inject
+ public AuditLogEntryEventListener(@NonNull AuditLogRegistrationClient client, @NonNull Instance eventHandlerInstance) {
+ this.client = client;
+ this.eventHandlerInstance = eventHandlerInstance;
+ }
+
+ @Override
+ @RunOnVirtualThread
+ public void onGuildAuditLogEntryCreate(@NonNull GuildAuditLogEntryCreateEvent event) {
+ // Call the API and see if the event came from a registered Guild
+ Optional response = client.getRegisteredGuild(event.getGuild().getId());
+
+ response.ifPresent(success ->
+ eventHandlerInstance.forEach(handler ->
+ handler.handleEvent(event, success.getChannelId())
+ )
+ );
+ }
+
+}
\ No newline at end of file
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/AuditLogListener.java b/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/AuditLogListener.java
deleted file mode 100644
index eab9b76..0000000
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/AuditLogListener.java
+++ /dev/null
@@ -1,207 +0,0 @@
-package io.github.eggy03.papertrail.bot.listeners.auditlog;
-
-import io.github.eggy03.papertrail.bot.service.auditlog.automod.AutoModerationFlagToChannelEventHelper;
-import io.github.eggy03.papertrail.bot.service.auditlog.automod.AutoModerationMemberTimeoutEventHelper;
-import io.github.eggy03.papertrail.bot.service.auditlog.automod.AutoModerationRuleBlockMessageEventHelper;
-import io.github.eggy03.papertrail.bot.service.auditlog.automod.AutoModerationRuleCreateEventHelper;
-import io.github.eggy03.papertrail.bot.service.auditlog.automod.AutoModerationRuleDeleteEventHelper;
-import io.github.eggy03.papertrail.bot.service.auditlog.automod.AutoModerationRuleUpdateEventHelper;
-import io.github.eggy03.papertrail.bot.service.auditlog.bot.BotAddEventHelper;
-import io.github.eggy03.papertrail.bot.service.auditlog.channel.ChannelCreateEventHelper;
-import io.github.eggy03.papertrail.bot.service.auditlog.channel.ChannelDeleteEventHelper;
-import io.github.eggy03.papertrail.bot.service.auditlog.channel.ChannelOverrideCreateEventHelper;
-import io.github.eggy03.papertrail.bot.service.auditlog.channel.ChannelOverrideDeleteEventHelper;
-import io.github.eggy03.papertrail.bot.service.auditlog.channel.ChannelOverrideUpdateEventHelper;
-import io.github.eggy03.papertrail.bot.service.auditlog.channel.ChannelUpdateEventHelper;
-import io.github.eggy03.papertrail.bot.service.auditlog.channel.VoiceChannelStatusDeleteEventHelper;
-import io.github.eggy03.papertrail.bot.service.auditlog.channel.VoiceChannelStatusUpdateEventHelper;
-import io.github.eggy03.papertrail.bot.service.auditlog.emoji.EmojiCreateEventHelper;
-import io.github.eggy03.papertrail.bot.service.auditlog.emoji.EmojiDeleteEventHelper;
-import io.github.eggy03.papertrail.bot.service.auditlog.emoji.EmojiUpdateEventHelper;
-import io.github.eggy03.papertrail.bot.service.auditlog.generic.GenericAuditLogEventHelper;
-import io.github.eggy03.papertrail.bot.service.auditlog.guild.GuildProfileUpdateEventHelper;
-import io.github.eggy03.papertrail.bot.service.auditlog.guild.GuildUpdateEventHelper;
-import io.github.eggy03.papertrail.bot.service.auditlog.homesettings.HomeSettingsCreateEventHelper;
-import io.github.eggy03.papertrail.bot.service.auditlog.homesettings.HomeSettingsUpdateEventHelper;
-import io.github.eggy03.papertrail.bot.service.auditlog.integration.ApplicationCommandPrivilegesUpdateEventHelper;
-import io.github.eggy03.papertrail.bot.service.auditlog.integration.IntegrationCreateEventHelper;
-import io.github.eggy03.papertrail.bot.service.auditlog.integration.IntegrationDeleteEventHelper;
-import io.github.eggy03.papertrail.bot.service.auditlog.invite.InviteCreateEventHelper;
-import io.github.eggy03.papertrail.bot.service.auditlog.invite.InviteDeleteEventHelper;
-import io.github.eggy03.papertrail.bot.service.auditlog.member.MemberRoleUpdateEventHelper;
-import io.github.eggy03.papertrail.bot.service.auditlog.member.MemberUpdateEventHelper;
-import io.github.eggy03.papertrail.bot.service.auditlog.member.MemberVoiceKickEventHelper;
-import io.github.eggy03.papertrail.bot.service.auditlog.member.MemberVoiceMoveEventHelper;
-import io.github.eggy03.papertrail.bot.service.auditlog.message.MessagePinEventHelper;
-import io.github.eggy03.papertrail.bot.service.auditlog.message.MessageUnpinEventHelper;
-import io.github.eggy03.papertrail.bot.service.auditlog.modactions.BanEventHelper;
-import io.github.eggy03.papertrail.bot.service.auditlog.modactions.KickEventHelper;
-import io.github.eggy03.papertrail.bot.service.auditlog.modactions.UnbanEventHelper;
-import io.github.eggy03.papertrail.bot.service.auditlog.onboarding.OnboardingPromptCreateEventHelper;
-import io.github.eggy03.papertrail.bot.service.auditlog.onboarding.OnboardingPromptDeleteEventHelper;
-import io.github.eggy03.papertrail.bot.service.auditlog.onboarding.OnboardingPromptUpdateEventHelper;
-import io.github.eggy03.papertrail.bot.service.auditlog.onboarding.OnboardingUpdateEventHelper;
-import io.github.eggy03.papertrail.bot.service.auditlog.role.RoleCreateEventHelper;
-import io.github.eggy03.papertrail.bot.service.auditlog.role.RoleDeleteEventHelper;
-import io.github.eggy03.papertrail.bot.service.auditlog.role.RoleUpdateEventHelper;
-import io.github.eggy03.papertrail.bot.service.auditlog.scheduledevent.ScheduledEventCreateEventHelper;
-import io.github.eggy03.papertrail.bot.service.auditlog.scheduledevent.ScheduledEventDeleteEventHelper;
-import io.github.eggy03.papertrail.bot.service.auditlog.scheduledevent.ScheduledEventUpdateEventHelper;
-import io.github.eggy03.papertrail.bot.service.auditlog.soundboard.SoundboardSoundCreateEventHelper;
-import io.github.eggy03.papertrail.bot.service.auditlog.soundboard.SoundboardSoundDeleteEventHelper;
-import io.github.eggy03.papertrail.bot.service.auditlog.soundboard.SoundboardSoundUpdateEventHelper;
-import io.github.eggy03.papertrail.bot.service.auditlog.stage.StageInstanceCreateEventHelper;
-import io.github.eggy03.papertrail.bot.service.auditlog.stage.StageInstanceDeleteEventHelper;
-import io.github.eggy03.papertrail.bot.service.auditlog.stage.StageInstanceUpdateEventHelper;
-import io.github.eggy03.papertrail.bot.service.auditlog.sticker.StickerCreateEventHelper;
-import io.github.eggy03.papertrail.bot.service.auditlog.sticker.StickerDeleteEventHelper;
-import io.github.eggy03.papertrail.bot.service.auditlog.sticker.StickerUpdateEventHelper;
-import io.github.eggy03.papertrail.bot.service.auditlog.thread.ThreadCreateEventHelper;
-import io.github.eggy03.papertrail.bot.service.auditlog.thread.ThreadDeleteEventHelper;
-import io.github.eggy03.papertrail.bot.service.auditlog.thread.ThreadUpdateEventHelper;
-import io.github.eggy03.papertrail.bot.service.auditlog.webhook.WebhookCreateEventHelper;
-import io.github.eggy03.papertrail.bot.service.auditlog.webhook.WebhookRemoveEventHelper;
-import io.github.eggy03.papertrail.bot.service.auditlog.webhook.WebhookUpdateEventHelper;
-import io.github.eggy03.papertrail.sdk.client.AuditLogRegistrationClient;
-import io.github.eggy03.papertrail.sdk.entity.AuditLogRegistrationEntity;
-import lombok.NonNull;
-import lombok.RequiredArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-import net.dv8tion.jda.api.audit.ActionType;
-import net.dv8tion.jda.api.audit.AuditLogEntry;
-import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
-import net.dv8tion.jda.api.hooks.ListenerAdapter;
-
-import java.util.Optional;
-import java.util.concurrent.Executor;
-
-@Slf4j
-@RequiredArgsConstructor
-public class AuditLogListener extends ListenerAdapter {
-
- @NonNull
- private final AuditLogRegistrationClient client;
-
- @NonNull
- private final Executor vThreadPool;
-
- @Override
- public void onGuildAuditLogEntryCreate(@NonNull GuildAuditLogEntryCreateEvent event) {
- vThreadPool.execute(() -> {
- // Call the API and see if the event came from a registered Guild
- Optional response = client.getRegisteredGuild(event.getGuild().getId());
- response.ifPresent(success -> auditLogParser(event, success.getChannelId()));
- });
- }
-
- private void auditLogParser(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
- AuditLogEntry ale = event.getEntry();
- ActionType action = ale.getType();
- switch (action) {
-
- case AUTO_MODERATION_FLAG_TO_CHANNEL ->
- AutoModerationFlagToChannelEventHelper.format(event, channelIdToSendTo);
- case AUTO_MODERATION_MEMBER_TIMEOUT ->
- AutoModerationMemberTimeoutEventHelper.format(event, channelIdToSendTo);
- case AUTO_MODERATION_RULE_BLOCK_MESSAGE ->
- AutoModerationRuleBlockMessageEventHelper.format(event, channelIdToSendTo);
- case AUTO_MODERATION_RULE_CREATE -> AutoModerationRuleCreateEventHelper.format(event, channelIdToSendTo);
- case AUTO_MODERATION_RULE_UPDATE -> AutoModerationRuleUpdateEventHelper.format(event, channelIdToSendTo);
- case AUTO_MODERATION_RULE_DELETE -> AutoModerationRuleDeleteEventHelper.format(event, channelIdToSendTo);
-
- case KICK -> KickEventHelper.format(event, channelIdToSendTo);
- case BAN -> BanEventHelper.format(event, channelIdToSendTo);
- case UNBAN -> UnbanEventHelper.format(event, channelIdToSendTo);
- case BOT_ADD -> BotAddEventHelper.format(event, channelIdToSendTo);
- // PRUNE has generic formatting
-
- case CHANNEL_CREATE -> ChannelCreateEventHelper.format(event, channelIdToSendTo);
- case CHANNEL_UPDATE -> ChannelUpdateEventHelper.format(event, channelIdToSendTo);
- case CHANNEL_DELETE -> ChannelDeleteEventHelper.format(event, channelIdToSendTo);
- case CHANNEL_OVERRIDE_CREATE -> ChannelOverrideCreateEventHelper.format(event, channelIdToSendTo);
- case CHANNEL_OVERRIDE_UPDATE -> ChannelOverrideUpdateEventHelper.format(event, channelIdToSendTo);
- case CHANNEL_OVERRIDE_DELETE -> ChannelOverrideDeleteEventHelper.format(event, channelIdToSendTo);
-
- case ROLE_CREATE -> RoleCreateEventHelper.format(event, channelIdToSendTo);
- case ROLE_UPDATE -> RoleUpdateEventHelper.format(event, channelIdToSendTo);
- case ROLE_DELETE -> RoleDeleteEventHelper.format(event, channelIdToSendTo);
-
- case EMOJI_CREATE -> EmojiCreateEventHelper.format(event, channelIdToSendTo);
- case EMOJI_UPDATE -> EmojiUpdateEventHelper.format(event, channelIdToSendTo);
- case EMOJI_DELETE -> EmojiDeleteEventHelper.format(event, channelIdToSendTo);
-
- case STICKER_CREATE -> StickerCreateEventHelper.format(event, channelIdToSendTo);
- case STICKER_UPDATE -> StickerUpdateEventHelper.format(event, channelIdToSendTo);
- case STICKER_DELETE -> StickerDeleteEventHelper.format(event, channelIdToSendTo);
-
- case GUILD_UPDATE -> GuildUpdateEventHelper.format(event, channelIdToSendTo);
- case GUILD_PROFILE_UPDATE -> GuildProfileUpdateEventHelper.format(event, channelIdToSendTo);
-
- case INTEGRATION_CREATE -> IntegrationCreateEventHelper.format(event, channelIdToSendTo);
- case INTEGRATION_DELETE -> IntegrationDeleteEventHelper.format(event, channelIdToSendTo);
- case APPLICATION_COMMAND_PRIVILEGES_UPDATE ->
- ApplicationCommandPrivilegesUpdateEventHelper.format(event, channelIdToSendTo);
- // INTEGRATION_UPDATE has generic formatting
-
- case INVITE_CREATE -> InviteCreateEventHelper.format(event, channelIdToSendTo);
- case INVITE_DELETE -> InviteDeleteEventHelper.format(event, channelIdToSendTo);
- // INVITE_UPDATE has generic formatting
-
- case MEMBER_ROLE_UPDATE -> MemberRoleUpdateEventHelper.format(event, channelIdToSendTo);
- case MEMBER_UPDATE -> MemberUpdateEventHelper.format(event, channelIdToSendTo);
-
- case MEMBER_VOICE_KICK -> MemberVoiceKickEventHelper.format(event, channelIdToSendTo);
- case MEMBER_VOICE_MOVE -> MemberVoiceMoveEventHelper.format(event, channelIdToSendTo);
-
- case MESSAGE_PIN -> MessagePinEventHelper.format(event, channelIdToSendTo);
- case MESSAGE_UNPIN -> MessageUnpinEventHelper.format(event, channelIdToSendTo);
-
- case SCHEDULED_EVENT_CREATE -> ScheduledEventCreateEventHelper.format(event, channelIdToSendTo);
- case SCHEDULED_EVENT_UPDATE -> ScheduledEventUpdateEventHelper.format(event, channelIdToSendTo);
- case SCHEDULED_EVENT_DELETE -> ScheduledEventDeleteEventHelper.format(event, channelIdToSendTo);
-
- case STAGE_INSTANCE_CREATE -> StageInstanceCreateEventHelper.format(event, channelIdToSendTo);
- case STAGE_INSTANCE_UPDATE -> StageInstanceUpdateEventHelper.format(event, channelIdToSendTo);
- case STAGE_INSTANCE_DELETE -> StageInstanceDeleteEventHelper.format(event, channelIdToSendTo);
-
- case THREAD_CREATE -> ThreadCreateEventHelper.format(event, channelIdToSendTo);
- case THREAD_UPDATE -> ThreadUpdateEventHelper.format(event, channelIdToSendTo);
- case THREAD_DELETE -> ThreadDeleteEventHelper.format(event, channelIdToSendTo);
-
- case VOICE_CHANNEL_STATUS_DELETE -> VoiceChannelStatusDeleteEventHelper.format(event, channelIdToSendTo);
- case VOICE_CHANNEL_STATUS_UPDATE -> VoiceChannelStatusUpdateEventHelper.format(event, channelIdToSendTo);
-
- case WEBHOOK_CREATE -> WebhookCreateEventHelper.format(event, channelIdToSendTo);
- case WEBHOOK_UPDATE -> WebhookUpdateEventHelper.format(event, channelIdToSendTo);
- case WEBHOOK_REMOVE -> WebhookRemoveEventHelper.format(event, channelIdToSendTo);
-
- case SOUNDBOARD_SOUND_CREATE -> SoundboardSoundCreateEventHelper.format(event, channelIdToSendTo);
- case SOUNDBOARD_SOUND_UPDATE -> SoundboardSoundUpdateEventHelper.format(event, channelIdToSendTo);
- case SOUNDBOARD_SOUND_DELETE -> SoundboardSoundDeleteEventHelper.format(event, channelIdToSendTo);
-
- case ONBOARDING_UPDATE -> OnboardingUpdateEventHelper.format(event, channelIdToSendTo);
- case ONBOARDING_PROMPT_CREATE -> OnboardingPromptCreateEventHelper.format(event, channelIdToSendTo);
- case ONBOARDING_PROMPT_UPDATE -> OnboardingPromptUpdateEventHelper.format(event, channelIdToSendTo);
- case ONBOARDING_PROMPT_DELETE -> OnboardingPromptDeleteEventHelper.format(event, channelIdToSendTo);
-
- case HOME_SETTINGS_CREATE -> HomeSettingsCreateEventHelper.format(event, channelIdToSendTo);
- case HOME_SETTINGS_UPDATE -> HomeSettingsUpdateEventHelper.format(event, channelIdToSendTo);
-
- // these seemingly don't trigger properly, or are unreliable
- case MESSAGE_BULK_DELETE,
- MESSAGE_CREATE,
- MESSAGE_DELETE,
- MESSAGE_UPDATE -> GenericAuditLogEventHelper.format(event, channelIdToSendTo);
-
- // except UNKNOWN, the rest have never been seen to be triggered
- case PRUNE, INTEGRATION_UPDATE,
- INVITE_UPDATE, ONBOARDING_CREATE,
- UNKNOWN -> GenericAuditLogEventHelper.format(event, channelIdToSendTo);
-
- default -> {
- GenericAuditLogEventHelper.format(event, channelIdToSendTo);
- log.warn("The following event is either not covered by JDA's UNKNOWN type or is not implemented by PaperTrail yet {}", ale.getType().name());
- }
- }
- }
-}
From 88d3d6dfaa08d15c84666bf41de31bec5138bbc7 Mon Sep 17 00:00:00 2001
From: Egg-03 <111327101+eggy03@users.noreply.github.com>
Date: Fri, 29 May 2026 20:26:28 +0530
Subject: [PATCH 13/66] refactor(auditlog): rename abstract audit log event
handler
- Rename `AbstractAuditLogEntryEventHandler` to `AuditLogEntryEventHandler`
- Change visibility of `handleEvent` from package-private to `public`
- Add detailed Javadocs explaining the multicast-style event routing
Signed-off-by: Egg-03 <111327101+eggy03@users.noreply.github.com>
---
...er.java => AuditLogEntryEventHandler.java} | 93 ++++++++++++++++++-
.../auditlog/AuditLogEntryEventListener.java | 31 ++++++-
2 files changed, 118 insertions(+), 6 deletions(-)
rename src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/{AbstractAuditLogEntryEventHandler.java => AuditLogEntryEventHandler.java} (84%)
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/AbstractAuditLogEntryEventHandler.java b/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/AuditLogEntryEventHandler.java
similarity index 84%
rename from src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/AbstractAuditLogEntryEventHandler.java
rename to src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/AuditLogEntryEventHandler.java
index d8773ba..c74a684 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/AbstractAuditLogEntryEventHandler.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/AuditLogEntryEventHandler.java
@@ -4,7 +4,79 @@
import net.dv8tion.jda.api.audit.ActionType;
import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
-public abstract class AbstractAuditLogEntryEventHandler {
+/**
+ *
+ * An abstract class for routing {@link GuildAuditLogEntryCreateEvent}
+ * to it's appropriate handlers.
+ * The routing is determined by {@link #handleEvent(GuildAuditLogEntryCreateEvent, String)}
+ *
+ *
+ *
+ * Subclasses may override only the event handlers they require
+ * method determines which handler method to invoke.
+ *
+ *
+ *
+ * If multiple subclasses extending this class are registered as CDI beans and are iterated
+ * through {@code Instance}, each handler
+ * instance will independently receive the event simultaneously.
+ *
+ *
+ *
+ * For example, if two subclasses override {@code onBan()}, both overridden
+ * methods will execute when a ban event is processed, assuming both handler
+ * instances are iterated and invoked.
+ *
+ *
+ *
+ * The design philosophy is inspired from JDA's {@link net.dv8tion.jda.api.hooks.ListenerAdapter}
+ *
+ *
+ *
+ * Example usage:
+ *
+ *
+ * {@code
+ * @ApplicationScoped
+ * public class MyHandler extends AuditLogEntryEventHandler {
+ *
+ * @Override
+ * public void onBan(@NonNull GuildAuditLogEntryCreateEvent event,
+ * @NonNull String channelIdToSendTo) {
+ * // your logic here
+ * }
+ * }
+ * }
+ *
+ *
+ * Calling {@code handleEvent(...)} on {@code MyHandler} will automatically
+ * route the event to the overridden {@code onBan()} method when the
+ * incoming {@link ActionType} is {@code BAN}.
+ *
+ *
+ *
+ * Multiple handler beans may also extend this class simultaneously.
+ * These handlers can be dynamically resolved and iterated using:
+ *
+ *
+ * {@code
+ * @Inject
+ * Instance eventHandlerInstance;
+ *
+ * eventHandlerInstance.forEach(handler -> handler.handleEvent(...))
+ * }
+ *
+ *
+ * Each handler instance may then independently receive and process the
+ * same audit log event through {@code handleEvent(...)}.
+ *
+ *
+ *
+ * A concrete implementation of this pattern can be seen in
+ * {@link AuditLogEntryEventListener}.
+ *
+ */
+public abstract class AuditLogEntryEventHandler {
public void onAutoModerationFlagToChannel(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
}
@@ -219,7 +291,24 @@ public void onUnknownEvent(@NonNull GuildAuditLogEntryCreateEvent event, @NonNul
public void onUnimplementedEvent(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
}
- final void handleEvent(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
+ /**
+ *
+ * Routes a {@link GuildAuditLogEntryCreateEvent} to its corresponding
+ * event handler method based on the {@link ActionType} of the audit log entry.
+ *
+ *
+ *
+ * Each event handler method can be overridden multiple times
+ *
+ *
+ *
+ * This method is marked as {@code final} and cannot be overridden
+ *
+ *
+ * @param event the audit log event received from JDA
+ * @param channelIdToSendTo the target channel ID where the event should be processed or sent
+ */
+ public final void handleEvent(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
ActionType action = event.getEntry().getType();
switch (action) {
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/AuditLogEntryEventListener.java b/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/AuditLogEntryEventListener.java
index 1d3054b..a826924 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/AuditLogEntryEventListener.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/AuditLogEntryEventListener.java
@@ -14,19 +14,42 @@
import java.util.Optional;
/**
- * Listens for {@link GuildAuditLogEntryCreateEvent} events that happen in registered guilds
- * and passes the responsibility of handling them on to {@link AbstractAuditLogEntryEventHandler}
+ * Listener responsible for receiving {@link GuildAuditLogEntryCreateEvent}
+ * events from JDA and delegating them to all registered
+ * {@link AuditLogEntryEventHandler} CDI beans.
*
+ *
+ * Before dispatching the event, the listener verifies that the guild
+ * is registered through {@link AuditLogRegistrationClient}.
+ *
+ *
+ *
+ * Event handlers are resolved dynamically using
+ * {@code Instance}, allowing multiple
+ * independent handler implementations to process the same audit log event.
+ *
+ *
+ *
+ * Each discovered handler instance will receive the event through
+ * {@link AuditLogEntryEventHandler#handleEvent(GuildAuditLogEntryCreateEvent, String)}.
+ * This enables a multicast-style event processing pipeline where multiple
+ * handler beans may react to the same audit log action independently.
+ *
+ *
+ *
+ * Event processing is executed on a virtual thread via
+ * {@link RunOnVirtualThread}.
+ *
*/
@Slf4j
@ApplicationScoped
public final class AuditLogEntryEventListener extends ListenerAdapter {
private final @NonNull AuditLogRegistrationClient client;
- private final @NonNull Instance eventHandlerInstance;
+ private final @NonNull Instance eventHandlerInstance;
@Inject
- public AuditLogEntryEventListener(@NonNull AuditLogRegistrationClient client, @NonNull Instance eventHandlerInstance) {
+ public AuditLogEntryEventListener(@NonNull AuditLogRegistrationClient client, @NonNull Instance eventHandlerInstance) {
this.client = client;
this.eventHandlerInstance = eventHandlerInstance;
}
From 0034060c27158208046c5be7e1a8ab1b7da398f7 Mon Sep 17 00:00:00 2001
From: Egg-03 <111327101+eggy03@users.noreply.github.com>
Date: Fri, 29 May 2026 20:29:53 +0530
Subject: [PATCH 14/66] refactor(listeners): remove virtual thread annotations
from listeners
- Remove `@RunOnVirtualThread` and `@Blocking` annotations from `SelfKickListener.java` and `AuditLogEntryEventListener.java`
- Clean up unused imports and Javadoc references to virtual threads
Signed-off-by: Egg-03 <111327101+eggy03@users.noreply.github.com>
---
.../bot/listeners/auditlog/AuditLogEntryEventListener.java | 7 -------
.../papertrail/bot/listeners/misc/SelfKickListener.java | 4 ----
2 files changed, 11 deletions(-)
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/AuditLogEntryEventListener.java b/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/AuditLogEntryEventListener.java
index a826924..a567fd4 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/AuditLogEntryEventListener.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/AuditLogEntryEventListener.java
@@ -2,7 +2,6 @@
import io.github.eggy03.papertrail.sdk.client.AuditLogRegistrationClient;
import io.github.eggy03.papertrail.sdk.entity.AuditLogRegistrationEntity;
-import io.smallrye.common.annotation.RunOnVirtualThread;
import jakarta.enterprise.context.ApplicationScoped;
import jakarta.enterprise.inject.Instance;
import jakarta.inject.Inject;
@@ -35,11 +34,6 @@
* This enables a multicast-style event processing pipeline where multiple
* handler beans may react to the same audit log action independently.
*
- *
- *
- * Event processing is executed on a virtual thread via
- * {@link RunOnVirtualThread}.
- *
*/
@Slf4j
@ApplicationScoped
@@ -55,7 +49,6 @@ public AuditLogEntryEventListener(@NonNull AuditLogRegistrationClient client, @N
}
@Override
- @RunOnVirtualThread
public void onGuildAuditLogEntryCreate(@NonNull GuildAuditLogEntryCreateEvent event) {
// Call the API and see if the event came from a registered Guild
Optional response = client.getRegisteredGuild(event.getGuild().getId());
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/misc/SelfKickListener.java b/src/main/java/io/github/eggy03/papertrail/bot/listeners/misc/SelfKickListener.java
index 16e4aa5..5fad245 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/misc/SelfKickListener.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/listeners/misc/SelfKickListener.java
@@ -2,8 +2,6 @@
import io.github.eggy03.papertrail.sdk.client.AuditLogRegistrationClient;
import io.github.eggy03.papertrail.sdk.client.MessageLogRegistrationClient;
-import io.smallrye.common.annotation.Blocking;
-import io.smallrye.common.annotation.RunOnVirtualThread;
import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Inject;
import lombok.NonNull;
@@ -30,8 +28,6 @@ public SelfKickListener(@NonNull AuditLogRegistrationClient auditLogRegistration
}
@Override
- @Blocking
- @RunOnVirtualThread
public void onGuildLeave(@NonNull GuildLeaveEvent event) {
Guild leftGuild = event.getGuild();
auditLogRegistrationClient.deleteRegisteredGuild(leftGuild.getId());
From b29e4c0da27d266b3c2c4d32e267b0c0de268237 Mon Sep 17 00:00:00 2001
From: Egg-03 <111327101+eggy03@users.noreply.github.com>
Date: Sat, 30 May 2026 07:31:04 +0530
Subject: [PATCH 15/66] refactor(auditlog): simplify event routing and rename
handler classes
- Rename `AuditLogEntryEventListener` to `GuildAuditLogEntryEventListener`
- Rename `AuditLogEntryEventHandler` to `GuildAuditLogEntryCreateEventHandler`
- Remove `channelIdToSendTo` parameter and registration check
Signed-off-by: Egg-03 <111327101+eggy03@users.noreply.github.com>
---
.../auditlog/AuditLogEntryEventHandler.java | 413 -----------------
.../auditlog/AuditLogEntryEventListener.java | 63 ---
.../GuildAuditLogEntryCreateEventHandler.java | 422 ++++++++++++++++++
.../GuildAuditLogEntryEventListener.java | 45 ++
4 files changed, 467 insertions(+), 476 deletions(-)
delete mode 100644 src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/AuditLogEntryEventHandler.java
delete mode 100644 src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/AuditLogEntryEventListener.java
create mode 100644 src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/GuildAuditLogEntryCreateEventHandler.java
create mode 100644 src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/GuildAuditLogEntryEventListener.java
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/AuditLogEntryEventHandler.java b/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/AuditLogEntryEventHandler.java
deleted file mode 100644
index c74a684..0000000
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/AuditLogEntryEventHandler.java
+++ /dev/null
@@ -1,413 +0,0 @@
-package io.github.eggy03.papertrail.bot.listeners.auditlog;
-
-import lombok.NonNull;
-import net.dv8tion.jda.api.audit.ActionType;
-import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
-
-/**
- *
- * An abstract class for routing {@link GuildAuditLogEntryCreateEvent}
- * to it's appropriate handlers.
- * The routing is determined by {@link #handleEvent(GuildAuditLogEntryCreateEvent, String)}
- *
- *
- *
- * Subclasses may override only the event handlers they require
- * method determines which handler method to invoke.
- *
- *
- *
- * If multiple subclasses extending this class are registered as CDI beans and are iterated
- * through {@code Instance}, each handler
- * instance will independently receive the event simultaneously.
- *
- *
- *
- * For example, if two subclasses override {@code onBan()}, both overridden
- * methods will execute when a ban event is processed, assuming both handler
- * instances are iterated and invoked.
- *
- *
- *
- * The design philosophy is inspired from JDA's {@link net.dv8tion.jda.api.hooks.ListenerAdapter}
- *
- *
- *
- * Example usage:
- *
- *
- * {@code
- * @ApplicationScoped
- * public class MyHandler extends AuditLogEntryEventHandler {
- *
- * @Override
- * public void onBan(@NonNull GuildAuditLogEntryCreateEvent event,
- * @NonNull String channelIdToSendTo) {
- * // your logic here
- * }
- * }
- * }
- *
- *
- * Calling {@code handleEvent(...)} on {@code MyHandler} will automatically
- * route the event to the overridden {@code onBan()} method when the
- * incoming {@link ActionType} is {@code BAN}.
- *
- *
- *
- * Multiple handler beans may also extend this class simultaneously.
- * These handlers can be dynamically resolved and iterated using:
- *
- *
- * {@code
- * @Inject
- * Instance eventHandlerInstance;
- *
- * eventHandlerInstance.forEach(handler -> handler.handleEvent(...))
- * }
- *
- *
- * Each handler instance may then independently receive and process the
- * same audit log event through {@code handleEvent(...)}.
- *
- *
- *
- * A concrete implementation of this pattern can be seen in
- * {@link AuditLogEntryEventListener}.
- *
- */
-public abstract class AuditLogEntryEventHandler {
-
- public void onAutoModerationFlagToChannel(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
- }
-
- public void onAutoModerationMemberTimeout(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
- }
-
- public void onAutoModerationRuleBlockMessage(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
- }
-
- public void onAutoModerationRuleCreate(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
- }
-
- public void onAutoModerationRuleUpdate(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
- }
-
- public void onAutoModerationRuleDelete(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
- }
-
- public void onKick(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
- }
-
- public void onPrune(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
- }
-
- public void onBan(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
- }
-
- public void onUnban(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
- }
-
- public void onBotAdd(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
- }
-
- public void onChannelCreate(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
- }
-
- public void onChannelUpdate(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
- }
-
- public void onChannelDelete(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
- }
-
- public void onChannelOverrideCreate(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
- }
-
- public void onChannelOverrideUpdate(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
- }
-
- public void onChannelOverrideDelete(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
- }
-
- public void onRoleCreate(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
- }
-
- public void onRoleUpdate(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
- }
-
- public void onRoleDelete(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
- }
-
- public void onEmojiCreate(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
- }
-
- public void onEmojiUpdate(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
- }
-
- public void onEmojiDelete(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
- }
-
- public void onStickerCreate(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
- }
-
- public void onStickerUpdate(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
- }
-
- public void onStickerDelete(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
- }
-
- public void onGuildUpdate(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
- }
-
- public void onGuildProfileUpdate(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
- }
-
- public void onIntegrationCreate(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
- }
-
- public void onIntegrationUpdate(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
- }
-
- public void onIntegrationDelete(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
- }
-
- public void onApplicationCommandPrivilegesUpdate(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
- }
-
- public void onInviteCreate(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
- }
-
- public void onInviteUpdate(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
- }
-
- public void onInviteDelete(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
- }
-
- public void onMemberRoleUpdate(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
- }
-
- public void onMemberUpdate(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
- }
-
- public void onMemberVoiceKick(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
- }
-
- public void onMemberVoiceMove(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
- }
-
- public void onMessagePin(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
- }
-
- public void onMessageUnpin(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
- }
-
- public void onScheduledEventCreate(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
- }
-
- public void onScheduledEventUpdate(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
- }
-
- public void onScheduledEventDelete(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
- }
-
- public void onStageInstanceCreate(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
- }
-
- public void onStageInstanceUpdate(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
- }
-
- public void onStageInstanceDelete(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
- }
-
- public void onThreadCreate(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
- }
-
- public void onThreadUpdate(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
- }
-
- public void onThreadDelete(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
- }
-
- public void onVoiceChannelStatusUpdate(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
- }
-
- public void onVoiceChannelStatusDelete(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
- }
-
- public void onWebhookCreate(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
- }
-
- public void onWebhookUpdate(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
- }
-
- public void onWebhookDelete(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
- }
-
- public void onSoundboardSoundCreate(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
- }
-
- public void onSoundboardSoundUpdate(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
- }
-
- public void onSoundboardSoundDelete(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
- }
-
- public void onOnboardingCreate(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
- }
-
- public void onOnboardingUpdate(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
- }
-
- public void onOnboardingPromptCreate(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
- }
-
- public void onOnboardingPromptUpdate(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
- }
-
- public void onOnboardingPromptDelete(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
- }
-
- public void onHomeSettingsCreate(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
- }
-
- public void onHomeSettingsUpdate(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
- }
-
- public void onMessageBulkDelete(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
- }
-
- public void onMessageCreate(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
- }
-
- public void onMessageUpdate(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
- }
-
- public void onMessageDelete(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
- }
-
- public void onUnknownEvent(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
- }
-
- public void onUnimplementedEvent(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
- }
-
- /**
- *
- * Routes a {@link GuildAuditLogEntryCreateEvent} to its corresponding
- * event handler method based on the {@link ActionType} of the audit log entry.
- *
- *
- *
- * Each event handler method can be overridden multiple times
- *
- *
- *
- * This method is marked as {@code final} and cannot be overridden
- *
- *
- * @param event the audit log event received from JDA
- * @param channelIdToSendTo the target channel ID where the event should be processed or sent
- */
- public final void handleEvent(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
- ActionType action = event.getEntry().getType();
-
- switch (action) {
- case AUTO_MODERATION_FLAG_TO_CHANNEL -> onAutoModerationFlagToChannel(event, channelIdToSendTo);
- case AUTO_MODERATION_MEMBER_TIMEOUT -> onAutoModerationMemberTimeout(event, channelIdToSendTo);
- case AUTO_MODERATION_RULE_BLOCK_MESSAGE -> onAutoModerationRuleBlockMessage(event, channelIdToSendTo);
- case AUTO_MODERATION_RULE_CREATE -> onAutoModerationRuleCreate(event, channelIdToSendTo);
- case AUTO_MODERATION_RULE_UPDATE -> onAutoModerationRuleUpdate(event, channelIdToSendTo);
- case AUTO_MODERATION_RULE_DELETE -> onAutoModerationRuleDelete(event, channelIdToSendTo);
-
- case KICK -> onKick(event, channelIdToSendTo);
- case PRUNE -> onPrune(event, channelIdToSendTo); // never happened to trigger
- case BAN -> onBan(event, channelIdToSendTo);
- case UNBAN -> onUnban(event, channelIdToSendTo);
- case BOT_ADD -> onBotAdd(event, channelIdToSendTo);
-
- case CHANNEL_CREATE -> onChannelCreate(event, channelIdToSendTo);
- case CHANNEL_UPDATE -> onChannelUpdate(event, channelIdToSendTo);
- case CHANNEL_DELETE -> onChannelDelete(event, channelIdToSendTo);
- case CHANNEL_OVERRIDE_CREATE -> onChannelOverrideCreate(event, channelIdToSendTo);
- case CHANNEL_OVERRIDE_UPDATE -> onChannelOverrideUpdate(event, channelIdToSendTo);
- case CHANNEL_OVERRIDE_DELETE -> onChannelOverrideDelete(event, channelIdToSendTo);
-
- case ROLE_CREATE -> onRoleCreate(event, channelIdToSendTo);
- case ROLE_UPDATE -> onRoleUpdate(event, channelIdToSendTo);
- case ROLE_DELETE -> onRoleDelete(event, channelIdToSendTo);
-
- case EMOJI_CREATE -> onEmojiCreate(event, channelIdToSendTo);
- case EMOJI_UPDATE -> onEmojiUpdate(event, channelIdToSendTo);
- case EMOJI_DELETE -> onEmojiDelete(event, channelIdToSendTo);
-
- case STICKER_CREATE -> onStickerCreate(event, channelIdToSendTo);
- case STICKER_UPDATE -> onStickerUpdate(event, channelIdToSendTo);
- case STICKER_DELETE -> onStickerDelete(event, channelIdToSendTo);
-
- case GUILD_UPDATE -> onGuildUpdate(event, channelIdToSendTo);
- case GUILD_PROFILE_UPDATE -> onGuildProfileUpdate(event, channelIdToSendTo);
-
- case INTEGRATION_CREATE -> onIntegrationCreate(event, channelIdToSendTo);
- case INTEGRATION_UPDATE -> onIntegrationUpdate(event, channelIdToSendTo); // never triggers
- case INTEGRATION_DELETE -> onIntegrationDelete(event, channelIdToSendTo);
- case APPLICATION_COMMAND_PRIVILEGES_UPDATE ->
- onApplicationCommandPrivilegesUpdate(event, channelIdToSendTo);
-
- case INVITE_CREATE -> onInviteCreate(event, channelIdToSendTo);
- case INVITE_UPDATE -> onInviteUpdate(event, channelIdToSendTo); // never triggers
- case INVITE_DELETE -> onInviteDelete(event, channelIdToSendTo);
-
- case MEMBER_ROLE_UPDATE -> onMemberRoleUpdate(event, channelIdToSendTo);
- case MEMBER_UPDATE -> onMemberUpdate(event, channelIdToSendTo);
-
- case MEMBER_VOICE_KICK -> onMemberVoiceKick(event, channelIdToSendTo);
- case MEMBER_VOICE_MOVE -> onMemberVoiceMove(event, channelIdToSendTo);
-
- case MESSAGE_PIN -> onMessagePin(event, channelIdToSendTo);
- case MESSAGE_UNPIN -> onMessageUnpin(event, channelIdToSendTo);
-
- // these seemingly don't trigger properly, or are unreliable
- case MESSAGE_BULK_DELETE -> onMessageBulkDelete(event, channelIdToSendTo);
- case MESSAGE_CREATE -> onMessageCreate(event, channelIdToSendTo);
- case MESSAGE_DELETE -> onMessageDelete(event, channelIdToSendTo);
- case MESSAGE_UPDATE -> onMessageUpdate(event, channelIdToSendTo);
-
- case SCHEDULED_EVENT_CREATE -> onScheduledEventCreate(event, channelIdToSendTo);
- case SCHEDULED_EVENT_UPDATE -> onScheduledEventUpdate(event, channelIdToSendTo);
- case SCHEDULED_EVENT_DELETE -> onScheduledEventDelete(event, channelIdToSendTo);
-
- case STAGE_INSTANCE_CREATE -> onStageInstanceCreate(event, channelIdToSendTo);
- case STAGE_INSTANCE_UPDATE -> onStageInstanceUpdate(event, channelIdToSendTo);
- case STAGE_INSTANCE_DELETE -> onStageInstanceDelete(event, channelIdToSendTo);
-
- case THREAD_CREATE -> onThreadCreate(event, channelIdToSendTo);
- case THREAD_UPDATE -> onThreadUpdate(event, channelIdToSendTo);
- case THREAD_DELETE -> onThreadDelete(event, channelIdToSendTo);
-
- case VOICE_CHANNEL_STATUS_UPDATE -> onVoiceChannelStatusUpdate(event, channelIdToSendTo);
- case VOICE_CHANNEL_STATUS_DELETE -> onVoiceChannelStatusDelete(event, channelIdToSendTo);
-
- case WEBHOOK_CREATE -> onWebhookCreate(event, channelIdToSendTo);
- case WEBHOOK_UPDATE -> onWebhookUpdate(event, channelIdToSendTo);
- case WEBHOOK_REMOVE -> onWebhookDelete(event, channelIdToSendTo);
-
- case SOUNDBOARD_SOUND_CREATE -> onSoundboardSoundCreate(event, channelIdToSendTo);
- case SOUNDBOARD_SOUND_UPDATE -> onSoundboardSoundUpdate(event, channelIdToSendTo);
- case SOUNDBOARD_SOUND_DELETE -> onSoundboardSoundDelete(event, channelIdToSendTo);
-
- case ONBOARDING_CREATE -> onOnboardingCreate(event, channelIdToSendTo); // unreliable
- case ONBOARDING_UPDATE -> onOnboardingUpdate(event, channelIdToSendTo);
-
- case ONBOARDING_PROMPT_CREATE -> onOnboardingPromptCreate(event, channelIdToSendTo);
- case ONBOARDING_PROMPT_UPDATE -> onOnboardingPromptUpdate(event, channelIdToSendTo);
- case ONBOARDING_PROMPT_DELETE -> onOnboardingPromptDelete(event, channelIdToSendTo);
-
- case HOME_SETTINGS_CREATE -> onHomeSettingsCreate(event, channelIdToSendTo);
- case HOME_SETTINGS_UPDATE -> onHomeSettingsUpdate(event, channelIdToSendTo);
-
- case UNKNOWN -> onUnknownEvent(event, channelIdToSendTo);
-
- default -> onUnimplementedEvent(event, channelIdToSendTo);
- }
- }
-}
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/AuditLogEntryEventListener.java b/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/AuditLogEntryEventListener.java
deleted file mode 100644
index a567fd4..0000000
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/AuditLogEntryEventListener.java
+++ /dev/null
@@ -1,63 +0,0 @@
-package io.github.eggy03.papertrail.bot.listeners.auditlog;
-
-import io.github.eggy03.papertrail.sdk.client.AuditLogRegistrationClient;
-import io.github.eggy03.papertrail.sdk.entity.AuditLogRegistrationEntity;
-import jakarta.enterprise.context.ApplicationScoped;
-import jakarta.enterprise.inject.Instance;
-import jakarta.inject.Inject;
-import lombok.NonNull;
-import lombok.extern.slf4j.Slf4j;
-import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
-import net.dv8tion.jda.api.hooks.ListenerAdapter;
-
-import java.util.Optional;
-
-/**
- * Listener responsible for receiving {@link GuildAuditLogEntryCreateEvent}
- * events from JDA and delegating them to all registered
- * {@link AuditLogEntryEventHandler} CDI beans.
- *
- *
- * Before dispatching the event, the listener verifies that the guild
- * is registered through {@link AuditLogRegistrationClient}.
- *
- *
- *
- * Event handlers are resolved dynamically using
- * {@code Instance}, allowing multiple
- * independent handler implementations to process the same audit log event.
- *
- *
- *
- * Each discovered handler instance will receive the event through
- * {@link AuditLogEntryEventHandler#handleEvent(GuildAuditLogEntryCreateEvent, String)}.
- * This enables a multicast-style event processing pipeline where multiple
- * handler beans may react to the same audit log action independently.
- *
- */
-@Slf4j
-@ApplicationScoped
-public final class AuditLogEntryEventListener extends ListenerAdapter {
-
- private final @NonNull AuditLogRegistrationClient client;
- private final @NonNull Instance eventHandlerInstance;
-
- @Inject
- public AuditLogEntryEventListener(@NonNull AuditLogRegistrationClient client, @NonNull Instance eventHandlerInstance) {
- this.client = client;
- this.eventHandlerInstance = eventHandlerInstance;
- }
-
- @Override
- public void onGuildAuditLogEntryCreate(@NonNull GuildAuditLogEntryCreateEvent event) {
- // Call the API and see if the event came from a registered Guild
- Optional response = client.getRegisteredGuild(event.getGuild().getId());
-
- response.ifPresent(success ->
- eventHandlerInstance.forEach(handler ->
- handler.handleEvent(event, success.getChannelId())
- )
- );
- }
-
-}
\ No newline at end of file
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/GuildAuditLogEntryCreateEventHandler.java b/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/GuildAuditLogEntryCreateEventHandler.java
new file mode 100644
index 0000000..68429a7
--- /dev/null
+++ b/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/GuildAuditLogEntryCreateEventHandler.java
@@ -0,0 +1,422 @@
+package io.github.eggy03.papertrail.bot.listeners.auditlog;
+
+import lombok.NonNull;
+import net.dv8tion.jda.api.audit.ActionType;
+import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
+
+/**
+ *
+ * Abstract base class for routing {@link GuildAuditLogEntryCreateEvent}
+ * instances to their appropriate handler methods.
+ * Routing is performed by
+ * {@link #handleEvent(GuildAuditLogEntryCreateEvent)}.
+ *
+ *
+ *
+ * {@link GuildAuditLogEntryCreateEvent} is emitted for all actions that
+ * appear in a Discord guild's audit log. The specific audit log action
+ * (e.g. BAN, KICK, UNBAN) can be determined from {@link ActionType}.
+ * This class exposes overridable methods for each supported
+ * {@link ActionType}, allowing subclasses to implement only the handlers
+ * they are interested in.
+ *
+ *
+ *
+ * Subclasses may override only the event handlers they require. The
+ * {@code handleEvent(...)} method is responsible for determining which
+ * handler method should be invoked for a given audit log action.
+ *
+ *
+ *
+ * If multiple subclasses are registered as CDI beans and are iterated
+ * through {@code Instance}, each handler
+ * instance will independently receive and process the event.
+ *
+ *
+ *
+ * For example, if two subclasses override {@code onBan()}, both
+ * implementations will be executed when a BAN audit log event is
+ * processed, assuming both handler instances are iterated and invoked.
+ *
+ *
+ *
+ * The design philosophy is inspired by JDA's
+ * {@link net.dv8tion.jda.api.hooks.ListenerAdapter}, providing a simple
+ * inheritance-based mechanism for handling only the events that are
+ * relevant to a particular implementation.
+ *
+ *
+ *
+ * Example usage:
+ *
+ *
+ * {@code
+ * @ApplicationScoped
+ * public class MyHandler extends GuildAuditLogEntryCreateEventHandler {
+ *
+ * @Override
+ * public void onBan(@NonNull GuildAuditLogEntryCreateEvent event,
+ * @NonNull String channelIdToSendTo) {
+ * // your logic here
+ * }
+ * }
+ * }
+ *
+ *
+ * Calling {@code handleEvent(...)} on {@code MyHandler} will
+ * automatically route BAN audit log events to the overridden
+ * {@code onBan()} method.
+ *
+ *
+ *
+ * Multiple handler beans may also extend this class simultaneously.
+ * These handlers can be dynamically resolved and iterated using:
+ *
+ *
+ * {@code
+ * @Inject
+ * Instance eventHandlerInstance;
+ *
+ * eventHandlerInstance.forEach(handler ->
+ * handler.handleEvent(event)
+ * );
+ * }
+ *
+ *
+ * A concrete example of this pattern can be found in
+ * {@link GuildAuditLogEntryEventListener}.
+ *
+ */
+public abstract class GuildAuditLogEntryCreateEventHandler {
+
+ public void onAutoModerationFlagToChannel(@NonNull GuildAuditLogEntryCreateEvent event) {
+ }
+
+ public void onAutoModerationMemberTimeout(@NonNull GuildAuditLogEntryCreateEvent event) {
+ }
+
+ public void onAutoModerationRuleBlockMessage(@NonNull GuildAuditLogEntryCreateEvent event) {
+ }
+
+ public void onAutoModerationRuleCreate(@NonNull GuildAuditLogEntryCreateEvent event) {
+ }
+
+ public void onAutoModerationRuleUpdate(@NonNull GuildAuditLogEntryCreateEvent event) {
+ }
+
+ public void onAutoModerationRuleDelete(@NonNull GuildAuditLogEntryCreateEvent event) {
+ }
+
+ public void onKick(@NonNull GuildAuditLogEntryCreateEvent event) {
+ }
+
+ public void onPrune(@NonNull GuildAuditLogEntryCreateEvent event) {
+ }
+
+ public void onBan(@NonNull GuildAuditLogEntryCreateEvent event) {
+ }
+
+ public void onUnban(@NonNull GuildAuditLogEntryCreateEvent event) {
+ }
+
+ public void onBotAdd(@NonNull GuildAuditLogEntryCreateEvent event) {
+ }
+
+ public void onChannelCreate(@NonNull GuildAuditLogEntryCreateEvent event) {
+ }
+
+ public void onChannelUpdate(@NonNull GuildAuditLogEntryCreateEvent event) {
+ }
+
+ public void onChannelDelete(@NonNull GuildAuditLogEntryCreateEvent event) {
+ }
+
+ public void onChannelOverrideCreate(@NonNull GuildAuditLogEntryCreateEvent event) {
+ }
+
+ public void onChannelOverrideUpdate(@NonNull GuildAuditLogEntryCreateEvent event) {
+ }
+
+ public void onChannelOverrideDelete(@NonNull GuildAuditLogEntryCreateEvent event) {
+ }
+
+ public void onRoleCreate(@NonNull GuildAuditLogEntryCreateEvent event) {
+ }
+
+ public void onRoleUpdate(@NonNull GuildAuditLogEntryCreateEvent event) {
+ }
+
+ public void onRoleDelete(@NonNull GuildAuditLogEntryCreateEvent event) {
+ }
+
+ public void onEmojiCreate(@NonNull GuildAuditLogEntryCreateEvent event) {
+ }
+
+ public void onEmojiUpdate(@NonNull GuildAuditLogEntryCreateEvent event) {
+ }
+
+ public void onEmojiDelete(@NonNull GuildAuditLogEntryCreateEvent event) {
+ }
+
+ public void onStickerCreate(@NonNull GuildAuditLogEntryCreateEvent event) {
+ }
+
+ public void onStickerUpdate(@NonNull GuildAuditLogEntryCreateEvent event) {
+ }
+
+ public void onStickerDelete(@NonNull GuildAuditLogEntryCreateEvent event) {
+ }
+
+ public void onGuildUpdate(@NonNull GuildAuditLogEntryCreateEvent event) {
+ }
+
+ public void onGuildProfileUpdate(@NonNull GuildAuditLogEntryCreateEvent event) {
+ }
+
+ public void onIntegrationCreate(@NonNull GuildAuditLogEntryCreateEvent event) {
+ }
+
+ public void onIntegrationUpdate(@NonNull GuildAuditLogEntryCreateEvent event) {
+ }
+
+ public void onIntegrationDelete(@NonNull GuildAuditLogEntryCreateEvent event) {
+ }
+
+ public void onApplicationCommandPrivilegesUpdate(@NonNull GuildAuditLogEntryCreateEvent event) {
+ }
+
+ public void onInviteCreate(@NonNull GuildAuditLogEntryCreateEvent event) {
+ }
+
+ public void onInviteUpdate(@NonNull GuildAuditLogEntryCreateEvent event) {
+ }
+
+ public void onInviteDelete(@NonNull GuildAuditLogEntryCreateEvent event) {
+ }
+
+ public void onMemberRoleUpdate(@NonNull GuildAuditLogEntryCreateEvent event) {
+ }
+
+ public void onMemberUpdate(@NonNull GuildAuditLogEntryCreateEvent event) {
+ }
+
+ public void onMemberVoiceKick(@NonNull GuildAuditLogEntryCreateEvent event) {
+ }
+
+ public void onMemberVoiceMove(@NonNull GuildAuditLogEntryCreateEvent event) {
+ }
+
+ public void onMessagePin(@NonNull GuildAuditLogEntryCreateEvent event) {
+ }
+
+ public void onMessageUnpin(@NonNull GuildAuditLogEntryCreateEvent event) {
+ }
+
+ public void onScheduledEventCreate(@NonNull GuildAuditLogEntryCreateEvent event) {
+ }
+
+ public void onScheduledEventUpdate(@NonNull GuildAuditLogEntryCreateEvent event) {
+ }
+
+ public void onScheduledEventDelete(@NonNull GuildAuditLogEntryCreateEvent event) {
+ }
+
+ public void onStageInstanceCreate(@NonNull GuildAuditLogEntryCreateEvent event) {
+ }
+
+ public void onStageInstanceUpdate(@NonNull GuildAuditLogEntryCreateEvent event) {
+ }
+
+ public void onStageInstanceDelete(@NonNull GuildAuditLogEntryCreateEvent event) {
+ }
+
+ public void onThreadCreate(@NonNull GuildAuditLogEntryCreateEvent event) {
+ }
+
+ public void onThreadUpdate(@NonNull GuildAuditLogEntryCreateEvent event) {
+ }
+
+ public void onThreadDelete(@NonNull GuildAuditLogEntryCreateEvent event) {
+ }
+
+ public void onVoiceChannelStatusUpdate(@NonNull GuildAuditLogEntryCreateEvent event) {
+ }
+
+ public void onVoiceChannelStatusDelete(@NonNull GuildAuditLogEntryCreateEvent event) {
+ }
+
+ public void onWebhookCreate(@NonNull GuildAuditLogEntryCreateEvent event) {
+ }
+
+ public void onWebhookUpdate(@NonNull GuildAuditLogEntryCreateEvent event) {
+ }
+
+ public void onWebhookDelete(@NonNull GuildAuditLogEntryCreateEvent event) {
+ }
+
+ public void onSoundboardSoundCreate(@NonNull GuildAuditLogEntryCreateEvent event) {
+ }
+
+ public void onSoundboardSoundUpdate(@NonNull GuildAuditLogEntryCreateEvent event) {
+ }
+
+ public void onSoundboardSoundDelete(@NonNull GuildAuditLogEntryCreateEvent event) {
+ }
+
+ public void onOnboardingCreate(@NonNull GuildAuditLogEntryCreateEvent event) {
+ }
+
+ public void onOnboardingUpdate(@NonNull GuildAuditLogEntryCreateEvent event) {
+ }
+
+ public void onOnboardingPromptCreate(@NonNull GuildAuditLogEntryCreateEvent event) {
+ }
+
+ public void onOnboardingPromptUpdate(@NonNull GuildAuditLogEntryCreateEvent event) {
+ }
+
+ public void onOnboardingPromptDelete(@NonNull GuildAuditLogEntryCreateEvent event) {
+ }
+
+ public void onHomeSettingsCreate(@NonNull GuildAuditLogEntryCreateEvent event) {
+ }
+
+ public void onHomeSettingsUpdate(@NonNull GuildAuditLogEntryCreateEvent event) {
+ }
+
+ public void onMessageBulkDelete(@NonNull GuildAuditLogEntryCreateEvent event) {
+ }
+
+ public void onMessageCreate(@NonNull GuildAuditLogEntryCreateEvent event) {
+ }
+
+ public void onMessageUpdate(@NonNull GuildAuditLogEntryCreateEvent event) {
+ }
+
+ public void onMessageDelete(@NonNull GuildAuditLogEntryCreateEvent event) {
+ }
+
+ public void onUnknownEvent(@NonNull GuildAuditLogEntryCreateEvent event) {
+ }
+
+ public void onUnimplementedEvent(@NonNull GuildAuditLogEntryCreateEvent event) {
+ }
+
+ /**
+ *
+ * Routes a {@link GuildAuditLogEntryCreateEvent} to its corresponding
+ * event handler method based on the {@link ActionType} of the audit log entry.
+ *
+ *
+ *
+ * Each event handler method can be overridden multiple times
+ *
+ *
+ *
+ * This method is marked as {@code final} and cannot be overridden
+ *
+ *
+ * @param event the audit log event received from JDA
+ */
+ public final void handleEvent(@NonNull GuildAuditLogEntryCreateEvent event) {
+ ActionType action = event.getEntry().getType();
+
+ switch (action) {
+ case AUTO_MODERATION_FLAG_TO_CHANNEL -> onAutoModerationFlagToChannel(event);
+ case AUTO_MODERATION_MEMBER_TIMEOUT -> onAutoModerationMemberTimeout(event);
+ case AUTO_MODERATION_RULE_BLOCK_MESSAGE -> onAutoModerationRuleBlockMessage(event);
+ case AUTO_MODERATION_RULE_CREATE -> onAutoModerationRuleCreate(event);
+ case AUTO_MODERATION_RULE_UPDATE -> onAutoModerationRuleUpdate(event);
+ case AUTO_MODERATION_RULE_DELETE -> onAutoModerationRuleDelete(event);
+
+ case KICK -> onKick(event);
+ case PRUNE -> onPrune(event); // never happened to trigger
+ case BAN -> onBan(event);
+ case UNBAN -> onUnban(event);
+ case BOT_ADD -> onBotAdd(event);
+
+ case CHANNEL_CREATE -> onChannelCreate(event);
+ case CHANNEL_UPDATE -> onChannelUpdate(event);
+ case CHANNEL_DELETE -> onChannelDelete(event);
+ case CHANNEL_OVERRIDE_CREATE -> onChannelOverrideCreate(event);
+ case CHANNEL_OVERRIDE_UPDATE -> onChannelOverrideUpdate(event);
+ case CHANNEL_OVERRIDE_DELETE -> onChannelOverrideDelete(event);
+
+ case ROLE_CREATE -> onRoleCreate(event);
+ case ROLE_UPDATE -> onRoleUpdate(event);
+ case ROLE_DELETE -> onRoleDelete(event);
+
+ case EMOJI_CREATE -> onEmojiCreate(event);
+ case EMOJI_UPDATE -> onEmojiUpdate(event);
+ case EMOJI_DELETE -> onEmojiDelete(event);
+
+ case STICKER_CREATE -> onStickerCreate(event);
+ case STICKER_UPDATE -> onStickerUpdate(event);
+ case STICKER_DELETE -> onStickerDelete(event);
+
+ case GUILD_UPDATE -> onGuildUpdate(event);
+ case GUILD_PROFILE_UPDATE -> onGuildProfileUpdate(event);
+
+ case INTEGRATION_CREATE -> onIntegrationCreate(event);
+ case INTEGRATION_UPDATE -> onIntegrationUpdate(event); // never triggers
+ case INTEGRATION_DELETE -> onIntegrationDelete(event);
+ case APPLICATION_COMMAND_PRIVILEGES_UPDATE -> onApplicationCommandPrivilegesUpdate(event);
+
+ case INVITE_CREATE -> onInviteCreate(event);
+ case INVITE_UPDATE -> onInviteUpdate(event); // never triggers
+ case INVITE_DELETE -> onInviteDelete(event);
+
+ case MEMBER_ROLE_UPDATE -> onMemberRoleUpdate(event);
+ case MEMBER_UPDATE -> onMemberUpdate(event);
+
+ case MEMBER_VOICE_KICK -> onMemberVoiceKick(event);
+ case MEMBER_VOICE_MOVE -> onMemberVoiceMove(event);
+
+ case MESSAGE_PIN -> onMessagePin(event);
+ case MESSAGE_UNPIN -> onMessageUnpin(event);
+
+ // these seemingly don't trigger properly, or are unreliable
+ case MESSAGE_BULK_DELETE -> onMessageBulkDelete(event);
+ case MESSAGE_CREATE -> onMessageCreate(event);
+ case MESSAGE_DELETE -> onMessageDelete(event);
+ case MESSAGE_UPDATE -> onMessageUpdate(event);
+
+ case SCHEDULED_EVENT_CREATE -> onScheduledEventCreate(event);
+ case SCHEDULED_EVENT_UPDATE -> onScheduledEventUpdate(event);
+ case SCHEDULED_EVENT_DELETE -> onScheduledEventDelete(event);
+
+ case STAGE_INSTANCE_CREATE -> onStageInstanceCreate(event);
+ case STAGE_INSTANCE_UPDATE -> onStageInstanceUpdate(event);
+ case STAGE_INSTANCE_DELETE -> onStageInstanceDelete(event);
+
+ case THREAD_CREATE -> onThreadCreate(event);
+ case THREAD_UPDATE -> onThreadUpdate(event);
+ case THREAD_DELETE -> onThreadDelete(event);
+
+ case VOICE_CHANNEL_STATUS_UPDATE -> onVoiceChannelStatusUpdate(event);
+ case VOICE_CHANNEL_STATUS_DELETE -> onVoiceChannelStatusDelete(event);
+
+ case WEBHOOK_CREATE -> onWebhookCreate(event);
+ case WEBHOOK_UPDATE -> onWebhookUpdate(event);
+ case WEBHOOK_REMOVE -> onWebhookDelete(event);
+
+ case SOUNDBOARD_SOUND_CREATE -> onSoundboardSoundCreate(event);
+ case SOUNDBOARD_SOUND_UPDATE -> onSoundboardSoundUpdate(event);
+ case SOUNDBOARD_SOUND_DELETE -> onSoundboardSoundDelete(event);
+
+ case ONBOARDING_CREATE -> onOnboardingCreate(event); // unreliable
+ case ONBOARDING_UPDATE -> onOnboardingUpdate(event);
+
+ case ONBOARDING_PROMPT_CREATE -> onOnboardingPromptCreate(event);
+ case ONBOARDING_PROMPT_UPDATE -> onOnboardingPromptUpdate(event);
+ case ONBOARDING_PROMPT_DELETE -> onOnboardingPromptDelete(event);
+
+ case HOME_SETTINGS_CREATE -> onHomeSettingsCreate(event);
+ case HOME_SETTINGS_UPDATE -> onHomeSettingsUpdate(event);
+
+ case UNKNOWN -> onUnknownEvent(event);
+
+ default -> onUnimplementedEvent(event);
+ }
+ }
+}
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/GuildAuditLogEntryEventListener.java b/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/GuildAuditLogEntryEventListener.java
new file mode 100644
index 0000000..5567502
--- /dev/null
+++ b/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/GuildAuditLogEntryEventListener.java
@@ -0,0 +1,45 @@
+package io.github.eggy03.papertrail.bot.listeners.auditlog;
+
+import jakarta.enterprise.context.ApplicationScoped;
+import jakarta.enterprise.inject.Instance;
+import jakarta.inject.Inject;
+import lombok.NonNull;
+import lombok.extern.slf4j.Slf4j;
+import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
+import net.dv8tion.jda.api.hooks.ListenerAdapter;
+
+/**
+ * Listener responsible for receiving {@link GuildAuditLogEntryCreateEvent}
+ * events from JDA and delegating them to all registered
+ * {@link GuildAuditLogEntryCreateEventHandler} CDI beans.
+ *
+ *
+ * Event handlers are resolved dynamically using
+ * {@code Instance}, allowing multiple
+ * independent handler implementations to process the same audit log event.
+ *
+ *
+ *
+ * Each discovered handler instance will receive the event through
+ * {@link GuildAuditLogEntryCreateEventHandler#handleEvent(GuildAuditLogEntryCreateEvent)}.
+ * This enables a multicast-style event processing pipeline where multiple
+ * handler beans may react to the same audit log action independently.
+ *
+ */
+@Slf4j
+@ApplicationScoped
+public final class GuildAuditLogEntryEventListener extends ListenerAdapter {
+
+ private final @NonNull Instance guildAuditLogEntryCreateEventHandlers;
+
+ @Inject
+ public GuildAuditLogEntryEventListener(@NonNull Instance guildAuditLogEntryCreateEventHandlers) {
+ this.guildAuditLogEntryCreateEventHandlers = guildAuditLogEntryCreateEventHandlers;
+ }
+
+ @Override
+ public void onGuildAuditLogEntryCreate(@NonNull GuildAuditLogEntryCreateEvent event) {
+ guildAuditLogEntryCreateEventHandlers.forEach(handler -> handler.handleEvent(event));
+ }
+
+}
\ No newline at end of file
From 19cadbba470514855c0d14c4109e65a50072aa78 Mon Sep 17 00:00:00 2001
From: Egg-03 <111327101+eggy03@users.noreply.github.com>
Date: Sat, 30 May 2026 09:04:39 +0530
Subject: [PATCH 16/66] refactor(automod): merge helpers into
`AutoModEventHandler`
- merge six helper classes into `AutoModEventHandler`
- move `AutoModUtils` to the utility package
Signed-off-by: Egg-03 <111327101+eggy03@users.noreply.github.com>
---
.../service/auditlog/AutoModEventHandler.java | 250 ++++++++++++++++++
...utoModerationFlagToChannelEventHelper.java | 51 ----
...utoModerationMemberTimeoutEventHelper.java | 51 ----
...ModerationRuleBlockMessageEventHelper.java | 51 ----
.../AutoModerationRuleCreateEventHelper.java | 71 -----
.../AutoModerationRuleDeleteEventHelper.java | 54 ----
.../AutoModerationRuleUpdateEventHelper.java | 52 ----
.../auditlog}/AutoModUtils.java | 2 +-
8 files changed, 251 insertions(+), 331 deletions(-)
create mode 100644 src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/AutoModEventHandler.java
delete mode 100644 src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/automod/AutoModerationFlagToChannelEventHelper.java
delete mode 100644 src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/automod/AutoModerationMemberTimeoutEventHelper.java
delete mode 100644 src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/automod/AutoModerationRuleBlockMessageEventHelper.java
delete mode 100644 src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/automod/AutoModerationRuleCreateEventHelper.java
delete mode 100644 src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/automod/AutoModerationRuleDeleteEventHelper.java
delete mode 100644 src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/automod/AutoModerationRuleUpdateEventHelper.java
rename src/main/java/io/github/eggy03/papertrail/bot/{service/auditlog/automod/utils => utils/auditlog}/AutoModUtils.java (94%)
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/AutoModEventHandler.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/AutoModEventHandler.java
new file mode 100644
index 0000000..debae63
--- /dev/null
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/AutoModEventHandler.java
@@ -0,0 +1,250 @@
+package io.github.eggy03.papertrail.bot.service.auditlog;
+
+import io.github.eggy03.papertrail.bot.listeners.auditlog.GuildAuditLogEntryCreateEventHandler;
+import io.github.eggy03.papertrail.bot.utils.BooleanUtils;
+import io.github.eggy03.papertrail.bot.utils.auditlog.AutoModUtils;
+import io.github.eggy03.papertrail.sdk.client.AuditLogRegistrationClient;
+import io.github.eggy03.papertrail.sdk.entity.AuditLogRegistrationEntity;
+import jakarta.enterprise.context.ApplicationScoped;
+import jakarta.inject.Inject;
+import lombok.NonNull;
+import lombok.extern.slf4j.Slf4j;
+import net.dv8tion.jda.api.EmbedBuilder;
+import net.dv8tion.jda.api.audit.AuditLogEntry;
+import net.dv8tion.jda.api.entities.User;
+import net.dv8tion.jda.api.entities.automod.AutoModRule;
+import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;
+import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
+import net.dv8tion.jda.api.utils.MarkdownUtil;
+import org.apache.commons.lang3.StringUtils;
+
+import java.awt.Color;
+
+@ApplicationScoped
+@Slf4j
+@SuppressWarnings("java:S1192")
+public final class AutoModEventHandler extends GuildAuditLogEntryCreateEventHandler {
+
+ private final @NonNull AuditLogRegistrationClient client;
+
+ @Inject
+ public AutoModEventHandler(@NonNull AuditLogRegistrationClient client) {
+ this.client = client;
+ }
+
+ @NonNull
+ private String getRegisteredGuildChannel(@NonNull String guildId) {
+ return client.getRegisteredGuild(guildId)
+ .map(AuditLogRegistrationEntity::getChannelId).orElse(StringUtils.EMPTY);
+
+ }
+
+ private void performChecksThenBuildAndSendEmbed(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull EmbedBuilder embedBuilder, @NonNull String channelIdToSendTo) {
+ if (!embedBuilder.isValidLength() || embedBuilder.isEmpty()) {
+ log.warn("Embed is empty or too long (current length: {}).", embedBuilder.length());
+ return;
+ }
+
+ TextChannel sendingChannel = event.getGuild().getTextChannelById(channelIdToSendTo);
+ if (sendingChannel != null && sendingChannel.canTalk()) {
+ sendingChannel.sendMessageEmbeds(embedBuilder.build()).queue();
+ }
+ }
+
+ @Override
+ public void onAutoModerationFlagToChannel(@NonNull GuildAuditLogEntryCreateEvent event) {
+
+ String channelIdToSendTo = getRegisteredGuildChannel(event.getGuild().getId());
+ if (channelIdToSendTo.isBlank()) return;
+
+ AuditLogEntry ale = event.getEntry();
+
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("Audit Log Entry | Auto-Mod Event");
+
+ User targetUser = ale.getJDA().getUserById(ale.getTargetId());
+ String targetMention = (targetUser != null ? targetUser.getAsMention() : ale.getTargetId());
+
+ eb.setDescription(MarkdownUtil.quoteBlock("Event: AutoMod Message Flag\nTarget Member: " + targetMention));
+ eb.setColor(Color.YELLOW);
+
+ eb.addField(
+ MarkdownUtil.underline("Additional Info"),
+ MarkdownUtil.codeblock("Flagged message will be available in the channel set to receive AutoMod events."),
+ false
+ );
+
+ eb.setFooter("Audit Log Entry ID: " + ale.getId());
+ eb.setTimestamp(ale.getTimeCreated());
+
+ performChecksThenBuildAndSendEmbed(event, eb, channelIdToSendTo);
+
+ }
+
+ @Override
+ public void onAutoModerationMemberTimeout(@NonNull GuildAuditLogEntryCreateEvent event) {
+
+ String channelIdToSendTo = getRegisteredGuildChannel(event.getGuild().getId());
+ if (channelIdToSendTo.isBlank()) return;
+
+ AuditLogEntry ale = event.getEntry();
+
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("Audit Log Entry | Auto-mod Event");
+
+ User targetUser = ale.getJDA().getUserById(ale.getTargetId());
+ String targetMention = (targetUser != null ? targetUser.getAsMention() : ale.getTargetId());
+
+ eb.setDescription(MarkdownUtil.quoteBlock("Event: AutoMod Member Timeout\nTarget Member: " + targetMention));
+ eb.setColor(Color.MAGENTA);
+
+ eb.addField(
+ MarkdownUtil.underline("Additional Info"),
+ MarkdownUtil.codeblock("Timeout Rule and Reason will be available in the channel set to receive AutoMod events."),
+ false
+ );
+
+ eb.setFooter("Audit Log Entry ID: " + ale.getId());
+ eb.setTimestamp(ale.getTimeCreated());
+
+ performChecksThenBuildAndSendEmbed(event, eb, channelIdToSendTo);
+ }
+
+ @Override
+ public void onAutoModerationRuleBlockMessage(@NonNull GuildAuditLogEntryCreateEvent event) {
+
+ String channelIdToSendTo = getRegisteredGuildChannel(event.getGuild().getId());
+ if (channelIdToSendTo.isBlank()) return;
+
+ AuditLogEntry ale = event.getEntry();
+
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("Audit Log Entry | Auto-mod Event");
+
+ User targetUser = ale.getJDA().getUserById(ale.getTargetId());
+ String targetMention = (targetUser != null ? targetUser.getAsMention() : ale.getTargetId());
+
+ eb.setDescription(MarkdownUtil.quoteBlock("Event: AutoMod Message Block\nTarget Member: " + targetMention));
+ eb.setColor(Color.ORANGE);
+
+ eb.addField(
+ MarkdownUtil.underline("Additional Info"),
+ MarkdownUtil.codeblock("Blocked message will be available in the channel set to receive AutoMod events."),
+ false
+ );
+
+ eb.setFooter("Audit Log Entry ID: " + ale.getId());
+ eb.setTimestamp(ale.getTimeCreated());
+
+ performChecksThenBuildAndSendEmbed(event, eb, channelIdToSendTo);
+
+ }
+
+ @Override
+ public void onAutoModerationRuleCreate(@NonNull GuildAuditLogEntryCreateEvent event) {
+
+ String channelIdToSendTo = getRegisteredGuildChannel(event.getGuild().getId());
+ if (channelIdToSendTo.isBlank()) return;
+
+ AuditLogEntry ale = event.getEntry();
+
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("Audit Log Entry | AutoMod Rule Create");
+
+ User executor = ale.getJDA().getUserById(ale.getUserIdLong());
+ String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
+
+ eb.setDescription(MarkdownUtil.quoteBlock("Rule Created By: " + mentionableExecutor + "\nRule Created For: AutoMod"));
+ eb.setColor(Color.GREEN);
+
+ ale.getChanges().forEach((changeKey, changeValue) -> {
+
+ Object newValue = changeValue.getNewValue();
+
+ switch (changeKey) {
+
+ case "enabled" ->
+ eb.addField(MarkdownUtil.underline("Enabled"), "╰┈➤" + BooleanUtils.formatToYesOrNo(newValue), false);
+
+ case "trigger_type" ->
+ eb.addField(MarkdownUtil.underline("Trigger Type"), "╰┈➤" + AutoModUtils.autoModTriggerTypeResolver(newValue), false);
+
+ case "event_type" ->
+ eb.addField(MarkdownUtil.underline("Event Type"), "╰┈➤" + AutoModUtils.autoModEventTypeResolver(newValue), false);
+
+ case "name" -> eb.addField(MarkdownUtil.underline("AutoMod Rule Name "), "╰┈➤" + newValue, false);
+
+ default -> {
+ // ignore everything else
+ }
+ }
+ });
+
+ eb.addField("Additional Info", MarkdownUtil.codeblock("For more info on trigger metadata, actions, exempt roles and channels, visit Safety Setup in your server"), false);
+ eb.setFooter("Audit Log Entry ID: " + ale.getId());
+ eb.setTimestamp(ale.getTimeCreated());
+
+ performChecksThenBuildAndSendEmbed(event, eb, channelIdToSendTo);
+ }
+
+ @Override
+ public void onAutoModerationRuleUpdate(@NonNull GuildAuditLogEntryCreateEvent event) {
+
+ String channelIdToSendTo = getRegisteredGuildChannel(event.getGuild().getId());
+ if (channelIdToSendTo.isBlank()) return;
+
+ AuditLogEntry ale = event.getEntry();
+
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("Audit Log Entry | AutoMod Rule Update");
+
+ User executor = ale.getJDA().getUserById(ale.getUserIdLong());
+ String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
+
+ eb.setDescription(MarkdownUtil.quoteBlock("Rule Updated By: " + mentionableExecutor + "\nRule Updated For: AutoMod"));
+ eb.setColor(Color.YELLOW);
+
+ // add name of the rule which got updated
+ AutoModRule rule = ale.getGuild().retrieveAutoModRuleById(ale.getTargetId()).complete();
+ eb.addField(MarkdownUtil.underline("AutoMod Rule Name"), "╰┈➤" + rule.getName(), false);
+
+ eb.addField(MarkdownUtil.underline("Additional Info"), MarkdownUtil.codeblock("For more info on trigger metadata, actions, exempt roles and channel changes, visit Safety Setup in your server"), false);
+
+ eb.setFooter("Audit Log Entry ID: " + ale.getId());
+ eb.setTimestamp(ale.getTimeCreated());
+
+ performChecksThenBuildAndSendEmbed(event, eb, channelIdToSendTo);
+ }
+
+ @Override
+ public void onAutoModerationRuleDelete(@NonNull GuildAuditLogEntryCreateEvent event) {
+
+ String channelIdToSendTo = getRegisteredGuildChannel(event.getGuild().getId());
+ if (channelIdToSendTo.isBlank()) return;
+
+ AuditLogEntry ale = event.getEntry();
+
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("Audit Log Entry | AutoMod Rule Delete");
+
+ User executor = ale.getJDA().getUserById(ale.getUserIdLong());
+ String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
+
+ eb.setDescription(MarkdownUtil.quoteBlock("Rule Deleted By: " + mentionableExecutor + "\nRule Deleted For: AutoMod"));
+ eb.setColor(Color.RED);
+
+ ale.getChanges().forEach((changeKey, changeValue) -> {
+
+ Object oldValue = changeValue.getOldValue();
+
+ if (changeKey.equals("name")) {
+ eb.addField(MarkdownUtil.underline("AutoMod Rule Name"), "╰┈➤" + oldValue, false);
+ }
+ });
+
+ eb.setFooter("Audit Log Entry ID: " + ale.getId());
+ eb.setTimestamp(ale.getTimeCreated());
+
+ performChecksThenBuildAndSendEmbed(event, eb, channelIdToSendTo);
+ }
+}
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/automod/AutoModerationFlagToChannelEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/automod/AutoModerationFlagToChannelEventHelper.java
deleted file mode 100644
index 6d92957..0000000
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/automod/AutoModerationFlagToChannelEventHelper.java
+++ /dev/null
@@ -1,51 +0,0 @@
-package io.github.eggy03.papertrail.bot.service.auditlog.automod;
-
-import lombok.NonNull;
-import lombok.experimental.UtilityClass;
-import lombok.extern.slf4j.Slf4j;
-import net.dv8tion.jda.api.EmbedBuilder;
-import net.dv8tion.jda.api.audit.AuditLogEntry;
-import net.dv8tion.jda.api.entities.User;
-import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;
-import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
-import net.dv8tion.jda.api.utils.MarkdownUtil;
-
-import java.awt.Color;
-
-@UtilityClass
-@Slf4j
-public class AutoModerationFlagToChannelEventHelper {
-
- public static void format(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
-
- AuditLogEntry ale = event.getEntry();
-
- EmbedBuilder eb = new EmbedBuilder();
- eb.setTitle("Audit Log Entry | Auto-Mod Event");
-
- User targetUser = ale.getJDA().getUserById(ale.getTargetId());
- String targetMention = (targetUser != null ? targetUser.getAsMention() : ale.getTargetId());
-
- eb.setDescription(MarkdownUtil.quoteBlock("Event: AutoMod Message Flag\nTarget Member: " + targetMention));
- eb.setColor(Color.YELLOW);
-
- eb.addField(
- MarkdownUtil.underline("Additional Info"),
- MarkdownUtil.codeblock("Flagged message will be available in the channel set to receive AutoMod events."),
- false
- );
-
- eb.setFooter("Audit Log Entry ID: " + ale.getId());
- eb.setTimestamp(ale.getTimeCreated());
-
- if (!eb.isValidLength() || eb.isEmpty()) {
- log.warn("Embed is empty or too long (current length: {}).", eb.length());
- return;
- }
-
- TextChannel sendingChannel = event.getGuild().getTextChannelById(channelIdToSendTo);
- if (sendingChannel != null && sendingChannel.canTalk()) {
- sendingChannel.sendMessageEmbeds(eb.build()).queue();
- }
- }
-}
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/automod/AutoModerationMemberTimeoutEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/automod/AutoModerationMemberTimeoutEventHelper.java
deleted file mode 100644
index 1c99871..0000000
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/automod/AutoModerationMemberTimeoutEventHelper.java
+++ /dev/null
@@ -1,51 +0,0 @@
-package io.github.eggy03.papertrail.bot.service.auditlog.automod;
-
-import lombok.NonNull;
-import lombok.experimental.UtilityClass;
-import lombok.extern.slf4j.Slf4j;
-import net.dv8tion.jda.api.EmbedBuilder;
-import net.dv8tion.jda.api.audit.AuditLogEntry;
-import net.dv8tion.jda.api.entities.User;
-import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;
-import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
-import net.dv8tion.jda.api.utils.MarkdownUtil;
-
-import java.awt.Color;
-
-@UtilityClass
-@Slf4j
-public class AutoModerationMemberTimeoutEventHelper {
-
- public static void format(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
-
- AuditLogEntry ale = event.getEntry();
-
- EmbedBuilder eb = new EmbedBuilder();
- eb.setTitle("Audit Log Entry | Auto-mod Event");
-
- User targetUser = ale.getJDA().getUserById(ale.getTargetId());
- String targetMention = (targetUser != null ? targetUser.getAsMention() : ale.getTargetId());
-
- eb.setDescription(MarkdownUtil.quoteBlock("Event: AutoMod Member Timeout\nTarget Member: " + targetMention));
- eb.setColor(Color.MAGENTA);
-
- eb.addField(
- MarkdownUtil.underline("Additional Info"),
- MarkdownUtil.codeblock("Timeout Rule and Reason will be available in the channel set to receive AutoMod events."),
- false
- );
-
- eb.setFooter("Audit Log Entry ID: " + ale.getId());
- eb.setTimestamp(ale.getTimeCreated());
-
- if (!eb.isValidLength() || eb.isEmpty()) {
- log.warn("Embed is empty or too long (current length: {}).", eb.length());
- return;
- }
-
- TextChannel sendingChannel = event.getGuild().getTextChannelById(channelIdToSendTo);
- if (sendingChannel != null && sendingChannel.canTalk()) {
- sendingChannel.sendMessageEmbeds(eb.build()).queue();
- }
- }
-}
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/automod/AutoModerationRuleBlockMessageEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/automod/AutoModerationRuleBlockMessageEventHelper.java
deleted file mode 100644
index 716ab93..0000000
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/automod/AutoModerationRuleBlockMessageEventHelper.java
+++ /dev/null
@@ -1,51 +0,0 @@
-package io.github.eggy03.papertrail.bot.service.auditlog.automod;
-
-import lombok.NonNull;
-import lombok.experimental.UtilityClass;
-import lombok.extern.slf4j.Slf4j;
-import net.dv8tion.jda.api.EmbedBuilder;
-import net.dv8tion.jda.api.audit.AuditLogEntry;
-import net.dv8tion.jda.api.entities.User;
-import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;
-import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
-import net.dv8tion.jda.api.utils.MarkdownUtil;
-
-import java.awt.Color;
-
-@UtilityClass
-@Slf4j
-public class AutoModerationRuleBlockMessageEventHelper {
-
- public static void format(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
-
- AuditLogEntry ale = event.getEntry();
-
- EmbedBuilder eb = new EmbedBuilder();
- eb.setTitle("Audit Log Entry | Auto-mod Event");
-
- User targetUser = ale.getJDA().getUserById(ale.getTargetId());
- String targetMention = (targetUser != null ? targetUser.getAsMention() : ale.getTargetId());
-
- eb.setDescription(MarkdownUtil.quoteBlock("Event: AutoMod Message Block\nTarget Member: " + targetMention));
- eb.setColor(Color.ORANGE);
-
- eb.addField(
- MarkdownUtil.underline("Additional Info"),
- MarkdownUtil.codeblock("Blocked message will be available in the channel set to receive AutoMod events."),
- false
- );
-
- eb.setFooter("Audit Log Entry ID: " + ale.getId());
- eb.setTimestamp(ale.getTimeCreated());
-
- if (!eb.isValidLength() || eb.isEmpty()) {
- log.warn("Embed is empty or too long (current length: {}).", eb.length());
- return;
- }
-
- TextChannel sendingChannel = event.getGuild().getTextChannelById(channelIdToSendTo);
- if (sendingChannel != null && sendingChannel.canTalk()) {
- sendingChannel.sendMessageEmbeds(eb.build()).queue();
- }
- }
-}
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/automod/AutoModerationRuleCreateEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/automod/AutoModerationRuleCreateEventHelper.java
deleted file mode 100644
index 4f6b93f..0000000
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/automod/AutoModerationRuleCreateEventHelper.java
+++ /dev/null
@@ -1,71 +0,0 @@
-package io.github.eggy03.papertrail.bot.service.auditlog.automod;
-
-import io.github.eggy03.papertrail.bot.service.auditlog.automod.utils.AutoModUtils;
-import io.github.eggy03.papertrail.bot.utils.BooleanUtils;
-import lombok.NonNull;
-import lombok.experimental.UtilityClass;
-import lombok.extern.slf4j.Slf4j;
-import net.dv8tion.jda.api.EmbedBuilder;
-import net.dv8tion.jda.api.audit.AuditLogEntry;
-import net.dv8tion.jda.api.entities.User;
-import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;
-import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
-import net.dv8tion.jda.api.utils.MarkdownUtil;
-
-import java.awt.Color;
-
-@UtilityClass
-@Slf4j
-public class AutoModerationRuleCreateEventHelper {
-
- public static void format(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
-
- AuditLogEntry ale = event.getEntry();
-
- EmbedBuilder eb = new EmbedBuilder();
- eb.setTitle("Audit Log Entry | AutoMod Rule Create");
-
- User executor = ale.getJDA().getUserById(ale.getUserIdLong());
- String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
-
- eb.setDescription(MarkdownUtil.quoteBlock("Rule Created By: " + mentionableExecutor + "\nRule Created For: AutoMod"));
- eb.setColor(Color.GREEN);
-
- ale.getChanges().forEach((changeKey, changeValue) -> {
-
- Object newValue = changeValue.getNewValue();
-
- switch (changeKey) {
-
- case "enabled" ->
- eb.addField(MarkdownUtil.underline("Enabled"), "╰┈➤" + BooleanUtils.formatToYesOrNo(newValue), false);
-
- case "trigger_type" ->
- eb.addField(MarkdownUtil.underline("Trigger Type"), "╰┈➤" + AutoModUtils.autoModTriggerTypeResolver(newValue), false);
-
- case "event_type" ->
- eb.addField(MarkdownUtil.underline("Event Type"), "╰┈➤" + AutoModUtils.autoModEventTypeResolver(newValue), false);
-
- case "name" -> eb.addField(MarkdownUtil.underline("AutoMod Rule Name "), "╰┈➤" + newValue, false);
-
- default -> {
- // ignore everything else
- }
- }
- });
-
- eb.addField("Additional Info", MarkdownUtil.codeblock("For more info on trigger metadata, actions, exempt roles and channels, visit Safety Setup in your server"), false);
- eb.setFooter("Audit Log Entry ID: " + ale.getId());
- eb.setTimestamp(ale.getTimeCreated());
-
- if (!eb.isValidLength() || eb.isEmpty()) {
- log.warn("Embed is empty or too long (current length: {}).", eb.length());
- return;
- }
-
- TextChannel sendingChannel = event.getGuild().getTextChannelById(channelIdToSendTo);
- if (sendingChannel != null && sendingChannel.canTalk()) {
- sendingChannel.sendMessageEmbeds(eb.build()).queue();
- }
- }
-}
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/automod/AutoModerationRuleDeleteEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/automod/AutoModerationRuleDeleteEventHelper.java
deleted file mode 100644
index 9b429c4..0000000
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/automod/AutoModerationRuleDeleteEventHelper.java
+++ /dev/null
@@ -1,54 +0,0 @@
-package io.github.eggy03.papertrail.bot.service.auditlog.automod;
-
-import lombok.NonNull;
-import lombok.experimental.UtilityClass;
-import lombok.extern.slf4j.Slf4j;
-import net.dv8tion.jda.api.EmbedBuilder;
-import net.dv8tion.jda.api.audit.AuditLogEntry;
-import net.dv8tion.jda.api.entities.User;
-import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;
-import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
-import net.dv8tion.jda.api.utils.MarkdownUtil;
-
-import java.awt.Color;
-
-@UtilityClass
-@Slf4j
-public class AutoModerationRuleDeleteEventHelper {
-
- public static void format(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
-
- AuditLogEntry ale = event.getEntry();
-
- EmbedBuilder eb = new EmbedBuilder();
- eb.setTitle("Audit Log Entry | AutoMod Rule Delete");
-
- User executor = ale.getJDA().getUserById(ale.getUserIdLong());
- String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
-
- eb.setDescription(MarkdownUtil.quoteBlock("Rule Deleted By: " + mentionableExecutor + "\nRule Deleted For: AutoMod"));
- eb.setColor(Color.RED);
-
- ale.getChanges().forEach((changeKey, changeValue) -> {
-
- Object oldValue = changeValue.getOldValue();
-
- if (changeKey.equals("name")) {
- eb.addField(MarkdownUtil.underline("AutoMod Rule Name"), "╰┈➤" + oldValue, false);
- }
- });
-
- eb.setFooter("Audit Log Entry ID: " + ale.getId());
- eb.setTimestamp(ale.getTimeCreated());
-
- if (!eb.isValidLength() || eb.isEmpty()) {
- log.warn("Embed is empty or too long (current length: {}).", eb.length());
- return;
- }
-
- TextChannel sendingChannel = event.getGuild().getTextChannelById(channelIdToSendTo);
- if (sendingChannel != null && sendingChannel.canTalk()) {
- sendingChannel.sendMessageEmbeds(eb.build()).queue();
- }
- }
-}
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/automod/AutoModerationRuleUpdateEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/automod/AutoModerationRuleUpdateEventHelper.java
deleted file mode 100644
index 2e0dc79..0000000
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/automod/AutoModerationRuleUpdateEventHelper.java
+++ /dev/null
@@ -1,52 +0,0 @@
-package io.github.eggy03.papertrail.bot.service.auditlog.automod;
-
-import lombok.NonNull;
-import lombok.experimental.UtilityClass;
-import lombok.extern.slf4j.Slf4j;
-import net.dv8tion.jda.api.EmbedBuilder;
-import net.dv8tion.jda.api.audit.AuditLogEntry;
-import net.dv8tion.jda.api.entities.User;
-import net.dv8tion.jda.api.entities.automod.AutoModRule;
-import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;
-import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
-import net.dv8tion.jda.api.utils.MarkdownUtil;
-
-import java.awt.Color;
-
-@UtilityClass
-@Slf4j
-public class AutoModerationRuleUpdateEventHelper {
-
- public static void format(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
-
- AuditLogEntry ale = event.getEntry();
-
- EmbedBuilder eb = new EmbedBuilder();
- eb.setTitle("Audit Log Entry | AutoMod Rule Update");
-
- User executor = ale.getJDA().getUserById(ale.getUserIdLong());
- String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
-
- eb.setDescription(MarkdownUtil.quoteBlock("Rule Updated By: " + mentionableExecutor + "\nRule Updated For: AutoMod"));
- eb.setColor(Color.YELLOW);
-
- // add name of the rule which got updated
- AutoModRule rule = ale.getGuild().retrieveAutoModRuleById(ale.getTargetId()).complete();
- eb.addField(MarkdownUtil.underline("AutoMod Rule Name"), "╰┈➤" + rule.getName(), false);
-
- eb.addField(MarkdownUtil.underline("Additional Info"), MarkdownUtil.codeblock("For more info on trigger metadata, actions, exempt roles and channel changes, visit Safety Setup in your server"), false);
-
- eb.setFooter("Audit Log Entry ID: " + ale.getId());
- eb.setTimestamp(ale.getTimeCreated());
-
- if (!eb.isValidLength() || eb.isEmpty()) {
- log.warn("Embed is empty or too long (current length: {}).", eb.length());
- return;
- }
-
- TextChannel sendingChannel = event.getGuild().getTextChannelById(channelIdToSendTo);
- if (sendingChannel != null && sendingChannel.canTalk()) {
- sendingChannel.sendMessageEmbeds(eb.build()).queue();
- }
- }
-}
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/automod/utils/AutoModUtils.java b/src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/AutoModUtils.java
similarity index 94%
rename from src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/automod/utils/AutoModUtils.java
rename to src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/AutoModUtils.java
index 8149bb7..d159f77 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/automod/utils/AutoModUtils.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/AutoModUtils.java
@@ -1,4 +1,4 @@
-package io.github.eggy03.papertrail.bot.service.auditlog.automod.utils;
+package io.github.eggy03.papertrail.bot.utils.auditlog;
import io.github.eggy03.papertrail.bot.utils.NumberParseUtils;
import lombok.NonNull;
From 2219bcff555dfd5139ea85208c8e7f0dcfed0086 Mon Sep 17 00:00:00 2001
From: Egg-03 <111327101+eggy03@users.noreply.github.com>
Date: Sat, 30 May 2026 11:42:04 +0530
Subject: [PATCH 17/66] refactor(nodactions): merge helpers into
`ModActionEventHandler`
- merge five helper classes into `ModActionEventHandler`
Signed-off-by: Egg-03 <111327101+eggy03@users.noreply.github.com>
---
.../auditlog/ModActionEventHandler.java | 173 ++++++++++++++++++
.../auditlog/bot/BotAddEventHelper.java | 49 -----
.../auditlog/modactions/BanEventHelper.java | 54 ------
.../auditlog/modactions/KickEventHelper.java | 54 ------
.../auditlog/modactions/UnbanEventHelper.java | 51 ------
5 files changed, 173 insertions(+), 208 deletions(-)
create mode 100644 src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/ModActionEventHandler.java
delete mode 100644 src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/bot/BotAddEventHelper.java
delete mode 100644 src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/modactions/BanEventHelper.java
delete mode 100644 src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/modactions/KickEventHelper.java
delete mode 100644 src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/modactions/UnbanEventHelper.java
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/ModActionEventHandler.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/ModActionEventHandler.java
new file mode 100644
index 0000000..3582d2a
--- /dev/null
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/ModActionEventHandler.java
@@ -0,0 +1,173 @@
+package io.github.eggy03.papertrail.bot.service.auditlog;
+
+import io.github.eggy03.papertrail.bot.listeners.auditlog.GuildAuditLogEntryCreateEventHandler;
+import io.github.eggy03.papertrail.sdk.client.AuditLogRegistrationClient;
+import io.github.eggy03.papertrail.sdk.entity.AuditLogRegistrationEntity;
+import jakarta.enterprise.context.ApplicationScoped;
+import jakarta.inject.Inject;
+import lombok.NonNull;
+import lombok.extern.slf4j.Slf4j;
+import net.dv8tion.jda.api.EmbedBuilder;
+import net.dv8tion.jda.api.audit.AuditLogEntry;
+import net.dv8tion.jda.api.entities.User;
+import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;
+import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
+import net.dv8tion.jda.api.utils.MarkdownUtil;
+import org.apache.commons.lang3.StringUtils;
+
+import java.awt.Color;
+
+@ApplicationScoped
+@Slf4j
+@SuppressWarnings("java:S1192")
+public class ModActionEventHandler extends GuildAuditLogEntryCreateEventHandler {
+
+ private final @NonNull AuditLogRegistrationClient client;
+
+ @Inject
+ public ModActionEventHandler(@NonNull AuditLogRegistrationClient client) {
+ this.client = client;
+ }
+
+ @NonNull
+ private String getRegisteredGuildChannel(@NonNull String guildId) {
+ return client.getRegisteredGuild(guildId)
+ .map(AuditLogRegistrationEntity::getChannelId).orElse(StringUtils.EMPTY);
+
+ }
+
+ private void performChecksThenBuildAndSendEmbed(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull EmbedBuilder embedBuilder, @NonNull String channelIdToSendTo) {
+ if (!embedBuilder.isValidLength() || embedBuilder.isEmpty()) {
+ log.warn("Embed is empty or too long (current length: {}).", embedBuilder.length());
+ return;
+ }
+
+ TextChannel sendingChannel = event.getGuild().getTextChannelById(channelIdToSendTo);
+ if (sendingChannel != null && sendingChannel.canTalk()) {
+ sendingChannel.sendMessageEmbeds(embedBuilder.build()).queue();
+ }
+ }
+
+ @Override
+ public void onKick(@NonNull GuildAuditLogEntryCreateEvent event) {
+ String channelIdToSendTo = getRegisteredGuildChannel(event.getGuild().getId());
+ if (channelIdToSendTo.isBlank()) return;
+
+ AuditLogEntry ale = event.getEntry();
+
+ User moderator = ale.getJDA().getUserById(ale.getUserIdLong());
+ String mentionableModerator = (moderator != null ? moderator.getAsMention() : ale.getUserId());
+ String reasonForKick = ale.getReason() == null ? "No Reason Provided" : ale.getReason();
+
+ // A REST Action is required here because kicked members are not cached
+ event.getJDA().retrieveUserById(ale.getTargetId()).queue(kickedUser -> {
+
+ String mentionableKickedUser = kickedUser != null ? kickedUser.getAsMention() : ale.getTargetId();
+
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("Audit Log Entry | Kick Event");
+ eb.setDescription(MarkdownUtil.quoteBlock("A Member Has Been Kicked By: " + mentionableModerator));
+ eb.setColor(Color.ORANGE);
+
+ eb.addField(MarkdownUtil.underline("Kicked Member"), "╰┈➤" + mentionableKickedUser, false);
+ eb.addField(MarkdownUtil.underline("Reason"), "╰┈➤" + reasonForKick, false);
+
+ eb.setFooter("Audit Log Entry ID: " + ale.getId());
+ eb.setTimestamp(ale.getTimeCreated());
+
+ performChecksThenBuildAndSendEmbed(event, eb, channelIdToSendTo);
+
+ });
+ }
+
+ @Override
+ public void onBan(@NonNull GuildAuditLogEntryCreateEvent event) {
+ String channelIdToSendTo = getRegisteredGuildChannel(event.getGuild().getId());
+ if (channelIdToSendTo.isBlank()) return;
+
+ AuditLogEntry ale = event.getEntry();
+
+ User moderator = ale.getJDA().getUserById(ale.getUserIdLong());
+ String mentionableModerator = (moderator != null ? moderator.getAsMention() : ale.getUserId());
+ String reasonForBan = ale.getReason() == null ? "No Reason Provided" : ale.getReason();
+
+ // A REST Action is required here because banned members are not cached
+ event.getJDA().retrieveUserById(ale.getTargetId()).queue(bannedUser -> {
+
+ String mentionableBannedUser = bannedUser != null ? bannedUser.getAsMention() : ale.getTargetId();
+
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("Audit Log Entry | Ban Event");
+ eb.setDescription(MarkdownUtil.quoteBlock("A Member Has Been Banned By: " + mentionableModerator));
+ eb.setColor(Color.RED);
+
+ eb.addField(MarkdownUtil.underline("Banned Member"), "╰┈➤" + mentionableBannedUser, false);
+ eb.addField(MarkdownUtil.underline("Ban Reason"), "╰┈➤" + reasonForBan, false);
+
+ eb.setFooter("Audit Log Entry ID: " + ale.getId());
+ eb.setTimestamp(ale.getTimeCreated());
+
+ performChecksThenBuildAndSendEmbed(event, eb, channelIdToSendTo);
+ });
+ }
+
+ @Override
+ public void onUnban(@NonNull GuildAuditLogEntryCreateEvent event) {
+ String channelIdToSendTo = getRegisteredGuildChannel(event.getGuild().getId());
+ if (channelIdToSendTo.isBlank()) return;
+
+ AuditLogEntry ale = event.getEntry();
+
+ User moderator = ale.getJDA().getUserById(ale.getUserIdLong());
+ String mentionableModerator = (moderator != null ? moderator.getAsMention() : ale.getUserId());
+
+ event.getJDA().retrieveUserById(ale.getTargetId()).queue(unbannedUser -> {
+
+ String mentionableUnbannedUser = unbannedUser != null ? unbannedUser.getAsMention() : ale.getTargetId();
+
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("Audit Log Entry | Member Unban Event");
+ eb.setDescription(MarkdownUtil.quoteBlock("A Member Has Been Un-Banned By: " + mentionableModerator));
+ eb.setColor(Color.GREEN);
+
+ eb.addField(MarkdownUtil.underline("Un-banned User"), "╰┈➤" + mentionableUnbannedUser, false);
+
+ eb.setFooter("Audit Log Entry ID: " + ale.getId());
+ eb.setTimestamp(ale.getTimeCreated());
+
+ performChecksThenBuildAndSendEmbed(event, eb, channelIdToSendTo);
+ });
+ }
+
+ @Override
+ public void onBotAdd(@NonNull GuildAuditLogEntryCreateEvent event) {
+ String channelIdToSendTo = getRegisteredGuildChannel(event.getGuild().getId());
+ if (channelIdToSendTo.isBlank()) return;
+
+ AuditLogEntry ale = event.getEntry();
+
+ User executor = ale.getJDA().getUserById(ale.getUserIdLong());
+ String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
+
+ User target = ale.getJDA().getUserById(ale.getTargetIdLong());
+ String mentionableTarget = (target != null ? target.getAsMention() : ale.getTargetId());
+
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("Audit Log Entry | Bot Add Event");
+ eb.setDescription(MarkdownUtil.quoteBlock("Bot Added By: " + mentionableExecutor + "\nBot ID: " + ale.getTargetId()));
+ eb.setColor(Color.CYAN);
+
+ eb.addField(MarkdownUtil.underline("Bot Added"), "╰┈➤" + mentionableTarget, false);
+
+ eb.setFooter("Audit Log Entry ID: " + ale.getId());
+ eb.setTimestamp(ale.getTimeCreated());
+
+ performChecksThenBuildAndSendEmbed(event, eb, channelIdToSendTo);
+ }
+
+ @Override
+ public void onPrune(@NonNull GuildAuditLogEntryCreateEvent event) {
+ // I have never seen a prune event trigger yet
+ log.warn("Unimplemented Prune Event Detected\n{}", event.getEntry().getChanges());
+ }
+}
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/bot/BotAddEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/bot/BotAddEventHelper.java
deleted file mode 100644
index c8e296d..0000000
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/bot/BotAddEventHelper.java
+++ /dev/null
@@ -1,49 +0,0 @@
-package io.github.eggy03.papertrail.bot.service.auditlog.bot;
-
-import lombok.NonNull;
-import lombok.experimental.UtilityClass;
-import lombok.extern.slf4j.Slf4j;
-import net.dv8tion.jda.api.EmbedBuilder;
-import net.dv8tion.jda.api.audit.AuditLogEntry;
-import net.dv8tion.jda.api.entities.User;
-import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;
-import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
-import net.dv8tion.jda.api.utils.MarkdownUtil;
-
-import java.awt.Color;
-
-@UtilityClass
-@Slf4j
-public class BotAddEventHelper {
-
- public static void format(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
-
- AuditLogEntry ale = event.getEntry();
-
- User executor = ale.getJDA().getUserById(ale.getUserIdLong());
- String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
-
- User target = ale.getJDA().getUserById(ale.getTargetIdLong());
- String mentionableTarget = (target != null ? target.getAsMention() : ale.getTargetId());
-
- EmbedBuilder eb = new EmbedBuilder();
- eb.setTitle("Audit Log Entry | Bot Add Event");
- eb.setDescription(MarkdownUtil.quoteBlock("Bot Added By: " + mentionableExecutor + "\nBot ID: " + ale.getTargetId()));
- eb.setColor(Color.CYAN);
-
- eb.addField(MarkdownUtil.underline("Bot Added"), "╰┈➤" + mentionableTarget, false);
-
- eb.setFooter("Audit Log Entry ID: " + ale.getId());
- eb.setTimestamp(ale.getTimeCreated());
-
- if (!eb.isValidLength() || eb.isEmpty()) {
- log.warn("Embed is empty or too long (current length: {}).", eb.length());
- return;
- }
-
- TextChannel sendingChannel = event.getGuild().getTextChannelById(channelIdToSendTo);
- if (sendingChannel != null && sendingChannel.canTalk()) {
- sendingChannel.sendMessageEmbeds(eb.build()).queue();
- }
- }
-}
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/modactions/BanEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/modactions/BanEventHelper.java
deleted file mode 100644
index 1273554..0000000
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/modactions/BanEventHelper.java
+++ /dev/null
@@ -1,54 +0,0 @@
-package io.github.eggy03.papertrail.bot.service.auditlog.modactions;
-
-import lombok.NonNull;
-import lombok.experimental.UtilityClass;
-import lombok.extern.slf4j.Slf4j;
-import net.dv8tion.jda.api.EmbedBuilder;
-import net.dv8tion.jda.api.audit.AuditLogEntry;
-import net.dv8tion.jda.api.entities.User;
-import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;
-import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
-import net.dv8tion.jda.api.utils.MarkdownUtil;
-
-import java.awt.Color;
-
-@UtilityClass
-@Slf4j
-public class BanEventHelper {
-
- public static void format(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
-
- AuditLogEntry ale = event.getEntry();
-
- User moderator = ale.getJDA().getUserById(ale.getUserIdLong());
- String mentionableModerator = (moderator != null ? moderator.getAsMention() : ale.getUserId());
- String reasonForBan = ale.getReason() == null ? "No Reason Provided" : ale.getReason();
-
- // A REST Action is required here because banned members are not cached
- event.getJDA().retrieveUserById(ale.getTargetId()).queue(bannedUser -> {
-
- String mentionableBannedUser = bannedUser != null ? bannedUser.getAsMention() : ale.getTargetId();
-
- EmbedBuilder eb = new EmbedBuilder();
- eb.setTitle("Audit Log Entry | Ban Event");
- eb.setDescription(MarkdownUtil.quoteBlock("A Member Has Been Banned By: " + mentionableModerator));
- eb.setColor(Color.RED);
-
- eb.addField(MarkdownUtil.underline("Banned Member"), "╰┈➤" + mentionableBannedUser, false);
- eb.addField(MarkdownUtil.underline("Ban Reason"), "╰┈➤" + reasonForBan, false);
-
- eb.setFooter("Audit Log Entry ID: " + ale.getId());
- eb.setTimestamp(ale.getTimeCreated());
-
- if (!eb.isValidLength() || eb.isEmpty()) {
- log.warn("Embed is empty or too long (current length: {}).", eb.length());
- return;
- }
-
- TextChannel sendingChannel = event.getGuild().getTextChannelById(channelIdToSendTo);
- if (sendingChannel != null && sendingChannel.canTalk()) {
- sendingChannel.sendMessageEmbeds(eb.build()).queue();
- }
- });
- }
-}
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/modactions/KickEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/modactions/KickEventHelper.java
deleted file mode 100644
index dbf275c..0000000
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/modactions/KickEventHelper.java
+++ /dev/null
@@ -1,54 +0,0 @@
-package io.github.eggy03.papertrail.bot.service.auditlog.modactions;
-
-import lombok.NonNull;
-import lombok.experimental.UtilityClass;
-import lombok.extern.slf4j.Slf4j;
-import net.dv8tion.jda.api.EmbedBuilder;
-import net.dv8tion.jda.api.audit.AuditLogEntry;
-import net.dv8tion.jda.api.entities.User;
-import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;
-import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
-import net.dv8tion.jda.api.utils.MarkdownUtil;
-
-import java.awt.Color;
-
-@UtilityClass
-@Slf4j
-public class KickEventHelper {
-
- public static void format(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
-
- AuditLogEntry ale = event.getEntry();
-
- User moderator = ale.getJDA().getUserById(ale.getUserIdLong());
- String mentionableModerator = (moderator != null ? moderator.getAsMention() : ale.getUserId());
- String reasonForKick = ale.getReason() == null ? "No Reason Provided" : ale.getReason();
-
- // A REST Action is required here because kicked members are not cached
- event.getJDA().retrieveUserById(ale.getTargetId()).queue(kickedUser -> {
-
- String mentionableKickedUser = kickedUser != null ? kickedUser.getAsMention() : ale.getTargetId();
-
- EmbedBuilder eb = new EmbedBuilder();
- eb.setTitle("Audit Log Entry | Kick Event");
- eb.setDescription(MarkdownUtil.quoteBlock("A Member Has Been Kicked By: " + mentionableModerator));
- eb.setColor(Color.ORANGE);
-
- eb.addField(MarkdownUtil.underline("Kicked Member"), "╰┈➤" + mentionableKickedUser, false);
- eb.addField(MarkdownUtil.underline("Reason"), "╰┈➤" + reasonForKick, false);
-
- eb.setFooter("Audit Log Entry ID: " + ale.getId());
- eb.setTimestamp(ale.getTimeCreated());
-
- if (!eb.isValidLength() || eb.isEmpty()) {
- log.warn("Embed is empty or too long (current length: {}).", eb.length());
- return;
- }
-
- TextChannel sendingChannel = event.getGuild().getTextChannelById(channelIdToSendTo);
- if (sendingChannel != null && sendingChannel.canTalk()) {
- sendingChannel.sendMessageEmbeds(eb.build()).queue();
- }
- });
- }
-}
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/modactions/UnbanEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/modactions/UnbanEventHelper.java
deleted file mode 100644
index fe83bd9..0000000
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/modactions/UnbanEventHelper.java
+++ /dev/null
@@ -1,51 +0,0 @@
-package io.github.eggy03.papertrail.bot.service.auditlog.modactions;
-
-import lombok.NonNull;
-import lombok.experimental.UtilityClass;
-import lombok.extern.slf4j.Slf4j;
-import net.dv8tion.jda.api.EmbedBuilder;
-import net.dv8tion.jda.api.audit.AuditLogEntry;
-import net.dv8tion.jda.api.entities.User;
-import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;
-import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
-import net.dv8tion.jda.api.utils.MarkdownUtil;
-
-import java.awt.Color;
-
-@UtilityClass
-@Slf4j
-public class UnbanEventHelper {
-
- public static void format(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
-
- AuditLogEntry ale = event.getEntry();
-
- User moderator = ale.getJDA().getUserById(ale.getUserIdLong());
- String mentionableModerator = (moderator != null ? moderator.getAsMention() : ale.getUserId());
-
- event.getJDA().retrieveUserById(ale.getTargetId()).queue(unbannedUser -> {
-
- String mentionableUnbannedUser = unbannedUser != null ? unbannedUser.getAsMention() : ale.getTargetId();
-
- EmbedBuilder eb = new EmbedBuilder();
- eb.setTitle("Audit Log Entry | Member Unban Event");
- eb.setDescription(MarkdownUtil.quoteBlock("A Member Has Been Un-Banned By: " + mentionableModerator));
- eb.setColor(Color.GREEN);
-
- eb.addField(MarkdownUtil.underline("Un-banned User"), "╰┈➤" + mentionableUnbannedUser, false);
-
- eb.setFooter("Audit Log Entry ID: " + ale.getId());
- eb.setTimestamp(ale.getTimeCreated());
-
- if (!eb.isValidLength() || eb.isEmpty()) {
- log.warn("Embed is empty or too long (current length: {}).", eb.length());
- return;
- }
-
- TextChannel sendingChannel = event.getGuild().getTextChannelById(channelIdToSendTo);
- if (sendingChannel != null && sendingChannel.canTalk()) {
- sendingChannel.sendMessageEmbeds(eb.build()).queue();
- }
- });
- }
-}
From 14da4a8be8e88ddaff76abb862d609121cf3a7cc Mon Sep 17 00:00:00 2001
From: Egg-03 <111327101+eggy03@users.noreply.github.com>
Date: Sat, 30 May 2026 11:42:40 +0530
Subject: [PATCH 18/66] docs(auditlog): document unknown and unimplemented
event handlers
- Add Javadoc to `onUnknownEvent` and `onUnimplementedEvent` in `GuildAuditLogEntryCreateEventHandler.java`
- Clarify the purpose of these handlers for unknown and unimplemented `ActionType`s
Signed-off-by: Egg-03 <111327101+eggy03@users.noreply.github.com>
---
.../auditlog/GuildAuditLogEntryCreateEventHandler.java | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/GuildAuditLogEntryCreateEventHandler.java b/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/GuildAuditLogEntryCreateEventHandler.java
index 68429a7..5548aeb 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/GuildAuditLogEntryCreateEventHandler.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlog/GuildAuditLogEntryCreateEventHandler.java
@@ -296,9 +296,15 @@ public void onMessageUpdate(@NonNull GuildAuditLogEntryCreateEvent event) {
public void onMessageDelete(@NonNull GuildAuditLogEntryCreateEvent event) {
}
+ /**
+ * For {@link ActionType} not fully known by JDA yet
+ */
public void onUnknownEvent(@NonNull GuildAuditLogEntryCreateEvent event) {
}
+ /**
+ * For {@link ActionType}s which are defined but not implemented by PaperTrail
+ */
public void onUnimplementedEvent(@NonNull GuildAuditLogEntryCreateEvent event) {
}
From d52e3d488073f90cce130709373fea2ab4c77ced Mon Sep 17 00:00:00 2001
From: Egg-03 <111327101+eggy03@users.noreply.github.com>
Date: Sat, 30 May 2026 19:03:08 +0530
Subject: [PATCH 19/66] refactor(channelevents): merge helpers into three
handlers
- merge eight helper classes from channel subpackage into `ChannelEventHandler`, `ChannelOverrideEventHandler` and `VoiceChannelStatusEventHandler`
- move `ChannelUtils` to the utility package (affects Thread helpers)
Signed-off-by: Egg-03 <111327101+eggy03@users.noreply.github.com>
---
...ntHelper.java => ChannelEventHandler.java} | 155 ++++++++++--
.../auditlog/ChannelOverrideEventHandler.java | 235 ++++++++++++++++++
.../VoiceChannelStatusEventHandler.java | 118 +++++++++
.../channel/ChannelCreateEventHelper.java | 87 -------
.../channel/ChannelDeleteEventHelper.java | 62 -----
.../ChannelOverrideCreateEventHelper.java | 75 ------
.../ChannelOverrideDeleteEventHelper.java | 76 ------
.../ChannelOverrideUpdateEventHelper.java | 107 --------
.../VoiceChannelStatusDeleteEventHelper.java | 56 -----
.../VoiceChannelStatusUpdateEventHelper.java | 59 -----
.../thread/ThreadCreateEventHelper.java | 2 +-
.../thread/ThreadDeleteEventHelper.java | 2 +-
.../thread/ThreadUpdateEventHelper.java | 2 +-
.../auditlog}/ChannelUtils.java | 2 +-
14 files changed, 497 insertions(+), 541 deletions(-)
rename src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/{channel/ChannelUpdateEventHelper.java => ChannelEventHandler.java} (51%)
create mode 100644 src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/ChannelOverrideEventHandler.java
create mode 100644 src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/VoiceChannelStatusEventHandler.java
delete mode 100644 src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/channel/ChannelCreateEventHelper.java
delete mode 100644 src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/channel/ChannelDeleteEventHelper.java
delete mode 100644 src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/channel/ChannelOverrideCreateEventHelper.java
delete mode 100644 src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/channel/ChannelOverrideDeleteEventHelper.java
delete mode 100644 src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/channel/ChannelOverrideUpdateEventHelper.java
delete mode 100644 src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/channel/VoiceChannelStatusDeleteEventHelper.java
delete mode 100644 src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/channel/VoiceChannelStatusUpdateEventHelper.java
rename src/main/java/io/github/eggy03/papertrail/bot/{service/auditlog/channel/utils => utils/auditlog}/ChannelUtils.java (98%)
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/channel/ChannelUpdateEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/ChannelEventHandler.java
similarity index 51%
rename from src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/channel/ChannelUpdateEventHelper.java
rename to src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/ChannelEventHandler.java
index c4ab24d..46f6fee 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/channel/ChannelUpdateEventHelper.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/ChannelEventHandler.java
@@ -1,10 +1,14 @@
-package io.github.eggy03.papertrail.bot.service.auditlog.channel;
+package io.github.eggy03.papertrail.bot.service.auditlog;
-import io.github.eggy03.papertrail.bot.service.auditlog.channel.utils.ChannelUtils;
+import io.github.eggy03.papertrail.bot.listeners.auditlog.GuildAuditLogEntryCreateEventHandler;
import io.github.eggy03.papertrail.bot.utils.BooleanUtils;
import io.github.eggy03.papertrail.bot.utils.DurationUtils;
+import io.github.eggy03.papertrail.bot.utils.auditlog.ChannelUtils;
+import io.github.eggy03.papertrail.sdk.client.AuditLogRegistrationClient;
+import io.github.eggy03.papertrail.sdk.entity.AuditLogRegistrationEntity;
+import jakarta.enterprise.context.ApplicationScoped;
+import jakarta.inject.Inject;
import lombok.NonNull;
-import lombok.experimental.UtilityClass;
import lombok.extern.slf4j.Slf4j;
import net.dv8tion.jda.api.EmbedBuilder;
import net.dv8tion.jda.api.audit.AuditLogEntry;
@@ -13,14 +17,105 @@
import net.dv8tion.jda.api.entities.channel.middleman.GuildChannel;
import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
import net.dv8tion.jda.api.utils.MarkdownUtil;
+import org.apache.commons.lang3.StringUtils;
import java.awt.Color;
-@UtilityClass
+@ApplicationScoped
@Slf4j
-public class ChannelUpdateEventHelper {
+@SuppressWarnings("java:S1192")
+public class ChannelEventHandler extends GuildAuditLogEntryCreateEventHandler {
- public static void format(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
+ private final @NonNull AuditLogRegistrationClient client;
+
+ @Inject
+ public ChannelEventHandler(@NonNull AuditLogRegistrationClient client) {
+ this.client = client;
+ }
+
+ @NonNull
+ private String getRegisteredGuildChannel(@NonNull String guildId) {
+ return client.getRegisteredGuild(guildId)
+ .map(AuditLogRegistrationEntity::getChannelId).orElse(StringUtils.EMPTY);
+
+ }
+
+ private void performChecksThenBuildAndSendEmbed(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull EmbedBuilder embedBuilder, @NonNull String channelIdToSendTo) {
+ if (!embedBuilder.isValidLength() || embedBuilder.isEmpty()) {
+ log.warn("Embed is empty or too long (current length: {}).", embedBuilder.length());
+ return;
+ }
+
+ TextChannel sendingChannel = event.getGuild().getTextChannelById(channelIdToSendTo);
+ if (sendingChannel != null && sendingChannel.canTalk()) {
+ sendingChannel.sendMessageEmbeds(embedBuilder.build()).queue();
+ }
+ }
+
+ @Override
+ public void onChannelCreate(@NonNull GuildAuditLogEntryCreateEvent event) {
+ String channelIdToSendTo = getRegisteredGuildChannel(event.getGuild().getId());
+ if (channelIdToSendTo.isBlank()) return;
+
+ AuditLogEntry ale = event.getEntry();
+
+ User executor = ale.getJDA().getUserById(ale.getUserIdLong());
+ String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
+
+ GuildChannel targetChannel = ale.getGuild().getGuildChannelById(ale.getTargetId());
+ String targetChannelMention = (targetChannel != null ? targetChannel.getAsMention() : ale.getTargetId());
+
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("Audit Log Entry | Channel Create Event");
+
+ eb.setDescription(MarkdownUtil.quoteBlock("Channel Created By: " + mentionableExecutor + "\nTarget Channel: " + targetChannelMention));
+ eb.setColor(Color.GREEN);
+
+ ale.getChanges().forEach((changeKey, changeValue) -> {
+
+ Object oldValue = changeValue.getOldValue();
+ Object newValue = changeValue.getNewValue();
+
+ switch (changeKey) {
+ case "user_limit" ->
+ eb.addField(MarkdownUtil.underline("User Limit"), "╰┈➤" + ChannelUtils.resolveVoiceChannelUserLimit(newValue), false);
+
+ case "rate_limit_per_user" ->
+ eb.addField(MarkdownUtil.underline("Slow Mode"), "╰┈➤" + DurationUtils.formatSeconds(newValue), false);
+
+ case "type" ->
+ eb.addField(MarkdownUtil.underline("Channel Type"), "╰┈➤" + ChannelUtils.resolveChannelType(newValue), false);
+
+ case "nsfw" ->
+ eb.addField(MarkdownUtil.underline("Is NSFW"), "╰┈➤" + BooleanUtils.formatToYesOrNo(newValue), false);
+
+ case "name" -> eb.addField(MarkdownUtil.underline("Channel Name"), "╰┈➤" + newValue, false);
+
+ case "bitrate" ->
+ eb.addField(MarkdownUtil.underline("Voice Channel Bitrate"), "╰┈➤" + ChannelUtils.resolveVoiceChannelBitrate(newValue), false);
+
+ case "permission_overwrites", "flags", "template", "available_tags" -> {
+ // the first two are for all types of channels and may stay empty during creation events
+ // the second two are forum only cases which stay empty during creation
+ }
+
+ default -> {
+ eb.addField("Unimplemented Change Key", changeKey, false);
+ log.info("Unimplemented Change Key for Channel Create: {}\nOLD_VALUE: {}\nNEW_VALUE: {}", changeKey, oldValue, newValue);
+ }
+ }
+ });
+
+ eb.setFooter("Audit Log Entry ID: " + ale.getId());
+ eb.setTimestamp(ale.getTimeCreated());
+
+ performChecksThenBuildAndSendEmbed(event, eb, channelIdToSendTo);
+ }
+
+ @Override
+ public void onChannelUpdate(@NonNull GuildAuditLogEntryCreateEvent event) {
+ String channelIdToSendTo = getRegisteredGuildChannel(event.getGuild().getId());
+ if (channelIdToSendTo.isBlank()) return;
AuditLogEntry ale = event.getEntry();
@@ -118,7 +213,7 @@ public static void format(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull
default -> {
eb.addField("Unimplemented Change Key", changeKey, false);
- log.info("Unimplemented Change Key: {}\nOLD_VALUE: {}\nNEW_VALUE: {}", changeKey, oldValue, newValue);
+ log.info("Unimplemented Change Key for Channel Update: {}\nOLD_VALUE: {}\nNEW_VALUE: {}", changeKey, oldValue, newValue);
}
}
@@ -127,14 +222,44 @@ public static void format(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull
eb.setFooter("Audit Log Entry ID: " + ale.getId());
eb.setTimestamp(ale.getTimeCreated());
- if (!eb.isValidLength() || eb.isEmpty()) {
- log.warn("Embed is empty or too long (current length: {}).", eb.length());
- return;
- }
+ performChecksThenBuildAndSendEmbed(event, eb, channelIdToSendTo);
+ }
- TextChannel sendingChannel = event.getGuild().getTextChannelById(channelIdToSendTo);
- if (sendingChannel != null && sendingChannel.canTalk()) {
- sendingChannel.sendMessageEmbeds(eb.build()).queue();
- }
+ @Override
+ public void onChannelDelete(@NonNull GuildAuditLogEntryCreateEvent event) {
+ String channelIdToSendTo = getRegisteredGuildChannel(event.getGuild().getId());
+ if (channelIdToSendTo.isBlank()) return;
+
+ AuditLogEntry ale = event.getEntry();
+
+ User executor = ale.getJDA().getUserById(ale.getUserIdLong());
+ String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
+
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("Audit Log Entry | Channel Delete Event");
+
+ eb.setDescription(MarkdownUtil.quoteBlock("Channel Deleted By: " + mentionableExecutor + "\nTarget Channel ID: " + ale.getTargetId()));
+ eb.setColor(Color.RED);
+
+ ale.getChanges().forEach((changeKey, changeValue) -> {
+
+ Object oldValue = changeValue.getOldValue();
+
+ switch (changeKey) {
+ case "name" -> eb.addField(MarkdownUtil.underline("Name"), "╰┈➤" + oldValue, false);
+
+ case "type" ->
+ eb.addField(MarkdownUtil.underline("Type"), "╰┈➤" + ChannelUtils.resolveChannelType(oldValue), false);
+
+ default -> {
+ // omit all other fields
+ }
+ }
+ });
+
+ eb.setFooter("Audit Log Entry ID: " + ale.getId());
+ eb.setTimestamp(ale.getTimeCreated());
+
+ performChecksThenBuildAndSendEmbed(event, eb, channelIdToSendTo);
}
}
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/ChannelOverrideEventHandler.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/ChannelOverrideEventHandler.java
new file mode 100644
index 0000000..6bb18b4
--- /dev/null
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/ChannelOverrideEventHandler.java
@@ -0,0 +1,235 @@
+package io.github.eggy03.papertrail.bot.service.auditlog;
+
+import io.github.eggy03.papertrail.bot.listeners.auditlog.GuildAuditLogEntryCreateEventHandler;
+import io.github.eggy03.papertrail.bot.utils.auditlog.ChannelUtils;
+import io.github.eggy03.papertrail.sdk.client.AuditLogRegistrationClient;
+import io.github.eggy03.papertrail.sdk.entity.AuditLogRegistrationEntity;
+import jakarta.enterprise.context.ApplicationScoped;
+import jakarta.inject.Inject;
+import lombok.NonNull;
+import lombok.extern.slf4j.Slf4j;
+import net.dv8tion.jda.api.EmbedBuilder;
+import net.dv8tion.jda.api.audit.AuditLogEntry;
+import net.dv8tion.jda.api.entities.Member;
+import net.dv8tion.jda.api.entities.Role;
+import net.dv8tion.jda.api.entities.User;
+import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;
+import net.dv8tion.jda.api.entities.channel.middleman.GuildChannel;
+import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
+import net.dv8tion.jda.api.utils.MarkdownUtil;
+import org.apache.commons.lang3.StringUtils;
+
+import java.awt.Color;
+
+@ApplicationScoped
+@Slf4j
+@SuppressWarnings("java:S1192")
+public class ChannelOverrideEventHandler extends GuildAuditLogEntryCreateEventHandler {
+
+ private final @NonNull AuditLogRegistrationClient client;
+
+ @Inject
+ public ChannelOverrideEventHandler(@NonNull AuditLogRegistrationClient client) {
+ this.client = client;
+ }
+
+ @NonNull
+ private String getRegisteredGuildChannel(@NonNull String guildId) {
+ return client.getRegisteredGuild(guildId)
+ .map(AuditLogRegistrationEntity::getChannelId).orElse(StringUtils.EMPTY);
+
+ }
+
+ private void performChecksThenBuildAndSendEmbed(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull EmbedBuilder embedBuilder, @NonNull String channelIdToSendTo) {
+ if (!embedBuilder.isValidLength() || embedBuilder.isEmpty()) {
+ log.warn("Embed is empty or too long (current length: {}).", embedBuilder.length());
+ return;
+ }
+
+ TextChannel sendingChannel = event.getGuild().getTextChannelById(channelIdToSendTo);
+ if (sendingChannel != null && sendingChannel.canTalk()) {
+ sendingChannel.sendMessageEmbeds(embedBuilder.build()).queue();
+ }
+ }
+
+ @Override
+ public void onChannelOverrideCreate(@NonNull GuildAuditLogEntryCreateEvent event) {
+ String channelIdToSendTo = getRegisteredGuildChannel(event.getGuild().getId());
+ if (channelIdToSendTo.isBlank()) return;
+
+ AuditLogEntry ale = event.getEntry();
+
+ User executor = ale.getJDA().getUserById(ale.getUserIdLong());
+ String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
+
+ GuildChannel targetChannel = event.getGuild().getGuildChannelById(ale.getTargetId());
+ String targetChannelMention = (targetChannel != null ? targetChannel.getAsMention() : ale.getTargetId());
+
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("Audit Log Entry | Channel Override Create");
+ eb.setDescription(MarkdownUtil.quoteBlock("Override Created By: " + mentionableExecutor + "\nTarget Channel: " + targetChannelMention));
+ eb.setColor(Color.GREEN);
+
+ ale.getChanges().forEach((changeKey, changeValue) -> {
+ Object oldValue = changeValue.getOldValue();
+ Object newValue = changeValue.getNewValue();
+
+ switch (changeKey) {
+
+ case "type" ->
+ eb.addField(MarkdownUtil.underline("Override Type"), "╰┈➤" + ChannelUtils.resolveChannelOverrideTargetType(newValue), false);
+
+ case "deny" ->
+ eb.addField(MarkdownUtil.underline("Denied Permissions"), ChannelUtils.resolveChannelOverridePermissions(newValue, "❌"), false);
+ case "allow" ->
+ eb.addField(MarkdownUtil.underline("Allowed Permissions"), ChannelUtils.resolveChannelOverridePermissions(newValue, "✅"), false);
+
+ // id exposes the member/role id which for which the channel permissions are overridden
+ // only one member/role permission id is fetched per loop
+ case "id" ->
+ eb.addField(MarkdownUtil.underline("Target Member/Role"), "╰┈➤" + ChannelUtils.autoResolveMemberOrRole(newValue, event), false);
+
+ default -> {
+ eb.addField("Unimplemented Change Key", changeKey, false);
+ log.info("Unimplemented Change Key for Channel Override Create: {}\nOLD_VALUE: {}\nNEW_VALUE: {}", changeKey, oldValue, newValue);
+ }
+ }
+ });
+
+ eb.setFooter("Audit Log Entry ID: " + ale.getId());
+ eb.setTimestamp(ale.getTimeCreated());
+
+
+ performChecksThenBuildAndSendEmbed(event, eb, channelIdToSendTo);
+ }
+
+ @Override
+ public void onChannelOverrideUpdate(@NonNull GuildAuditLogEntryCreateEvent event) {
+ String channelIdToSendTo = getRegisteredGuildChannel(event.getGuild().getId());
+ if (channelIdToSendTo.isBlank()) return;
+
+ AuditLogEntry ale = event.getEntry();
+
+ User executor = ale.getJDA().getUserById(ale.getUserIdLong());
+ String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
+
+ GuildChannel targetChannel = event.getGuild().getGuildChannelById(ale.getTargetId());
+ String targetChannelMention = (targetChannel != null ? targetChannel.getAsMention() : ale.getTargetId());
+
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("Audit Log Entry | Channel Override Update");
+ eb.setDescription(MarkdownUtil.quoteBlock("Override Updated By: " + mentionableExecutor + "\nTarget Channel: " + targetChannelMention));
+ eb.setColor(Color.YELLOW);
+
+ eb.addField(MarkdownUtil.underline("Override Type"), "╰┈➤" + ChannelUtils.resolveChannelOverrideTargetType(ale.getOptionByName("type")), false);
+ eb.addField(MarkdownUtil.underline("Permissions Overridden For"), "╰┈➤" + getTargetRoleOrMember(ale, event), false);
+
+ ale.getChanges().forEach((changeKey, changeValue) -> {
+
+ Object oldValue = changeValue.getOldValue();
+ Object newValue = changeValue.getNewValue();
+
+ switch (changeKey) {
+
+ case "deny" ->
+ eb.addField(MarkdownUtil.underline("Denied Permissions"), ChannelUtils.resolveChannelOverridePermissions(newValue, "❌"), false);
+ case "allow" ->
+ eb.addField(MarkdownUtil.underline("Allowed Permissions"), ChannelUtils.resolveChannelOverridePermissions(newValue, "✅"), false);
+
+ default -> {
+ eb.addField("Unimplemented Change Key", changeKey, false);
+ log.info("Unimplemented Change Key for Channel Override Update: {}\nOLD_VALUE: {}\nNEW_VALUE: {}", changeKey, oldValue, newValue);
+ }
+
+ }
+ });
+
+ eb.setFooter("Audit Log Entry ID: " + ale.getId());
+ eb.setTimestamp(ale.getTimeCreated());
+
+ performChecksThenBuildAndSendEmbed(event, eb, channelIdToSendTo);
+ }
+
+ @Override
+ public void onChannelOverrideDelete(@NonNull GuildAuditLogEntryCreateEvent event) {
+ String channelIdToSendTo = getRegisteredGuildChannel(event.getGuild().getId());
+ if (channelIdToSendTo.isBlank()) return;
+
+ AuditLogEntry ale = event.getEntry();
+
+ User executor = ale.getJDA().getUserById(ale.getUserIdLong());
+ String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
+
+ GuildChannel targetChannel = event.getGuild().getGuildChannelById(ale.getTargetId());
+ String targetChannelMention = (targetChannel != null ? targetChannel.getAsMention() : ale.getTargetId());
+
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("Audit Log Entry | Channel Override Delete");
+
+ eb.setDescription(MarkdownUtil.quoteBlock("Override Deleted By: " + mentionableExecutor + "\nTarget Channel: " + targetChannelMention));
+ eb.setColor(Color.RED);
+
+ ale.getChanges().forEach((changeKey, changeValue) -> {
+ Object oldValue = changeValue.getOldValue();
+ Object newValue = changeValue.getNewValue();
+
+ switch (changeKey) {
+
+ case "type" ->
+ eb.addField(MarkdownUtil.underline("Override Type"), "╰┈➤" + ChannelUtils.resolveChannelOverrideTargetType(oldValue), false);
+
+ case "deny" ->
+ eb.addField(MarkdownUtil.underline("Denied Permissions"), ChannelUtils.resolveChannelOverridePermissions(oldValue, "❌"), false);
+ case "allow" ->
+ eb.addField(MarkdownUtil.underline("Allowed Permissions"), ChannelUtils.resolveChannelOverridePermissions(oldValue, "✅"), false);
+
+ // id exposes the member/role id which for which the channel permissions are overridden
+ // only one member/role permission id is fetched per loop
+ case "id" ->
+ eb.addField(MarkdownUtil.underline("Target Member/Role"), "╰┈➤" + ChannelUtils.autoResolveMemberOrRole(oldValue, event), false);
+
+ default -> {
+ eb.addField("Unimplemented Change Key", changeKey, false);
+ log.info("Unimplemented Change Key for Channel Override Delete: {}\nOLD_VALUE: {}\nNEW_VALUE: {}", changeKey, oldValue, newValue);
+ }
+ }
+ });
+
+ eb.setFooter("Audit Log Entry ID: " + ale.getId());
+ eb.setTimestamp(ale.getTimeCreated());
+
+ performChecksThenBuildAndSendEmbed(event, eb, channelIdToSendTo);
+ }
+
+ // ALE changes do not expose the id and type keys in case of override updates
+ // therefore, this hacky method is required
+ // IDK why channel override updates don't show this info
+ @NonNull
+ private String getTargetRoleOrMember(@NonNull AuditLogEntry ale, @NonNull GuildAuditLogEntryCreateEvent event) {
+
+ String overriddenId = ale.getOptionByName("id"); // id of the member or role
+ String overriddenType = ale.getOptionByName("type"); // type that determines if the ID is that of a role or a member
+
+ if (overriddenId == null)
+ return "Member or Role ID is null";
+
+ return switch (overriddenType) {
+
+ case "0" -> {
+ // It’s a role
+ Role role = event.getGuild().getRoleById(overriddenId);
+ yield role != null ? role.getAsMention() : overriddenId;
+ }
+
+ case "1" -> {
+ // It's a member
+ Member member = event.getGuild().getMemberById(overriddenId);
+ yield member != null ? member.getAsMention() : overriddenId;
+ }
+
+ case null -> "Override Type is null";
+ default -> "Unimplemented Override Type: " + overriddenType;
+
+ };
+ }
+}
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/VoiceChannelStatusEventHandler.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/VoiceChannelStatusEventHandler.java
new file mode 100644
index 0000000..5d4abcb
--- /dev/null
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/VoiceChannelStatusEventHandler.java
@@ -0,0 +1,118 @@
+package io.github.eggy03.papertrail.bot.service.auditlog;
+
+import io.github.eggy03.papertrail.bot.listeners.auditlog.GuildAuditLogEntryCreateEventHandler;
+import io.github.eggy03.papertrail.sdk.client.AuditLogRegistrationClient;
+import io.github.eggy03.papertrail.sdk.entity.AuditLogRegistrationEntity;
+import jakarta.enterprise.context.ApplicationScoped;
+import jakarta.inject.Inject;
+import lombok.NonNull;
+import lombok.extern.slf4j.Slf4j;
+import net.dv8tion.jda.api.EmbedBuilder;
+import net.dv8tion.jda.api.audit.AuditLogEntry;
+import net.dv8tion.jda.api.entities.User;
+import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;
+import net.dv8tion.jda.api.entities.channel.middleman.GuildChannel;
+import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
+import net.dv8tion.jda.api.utils.MarkdownUtil;
+import org.apache.commons.lang3.StringUtils;
+
+import java.awt.Color;
+
+@ApplicationScoped
+@Slf4j
+@SuppressWarnings("java:S1192")
+public class VoiceChannelStatusEventHandler extends GuildAuditLogEntryCreateEventHandler {
+
+ private final @NonNull AuditLogRegistrationClient client;
+
+ @Inject
+ public VoiceChannelStatusEventHandler(@NonNull AuditLogRegistrationClient client) {
+ this.client = client;
+ }
+
+ @NonNull
+ private String getRegisteredGuildChannel(@NonNull String guildId) {
+ return client.getRegisteredGuild(guildId)
+ .map(AuditLogRegistrationEntity::getChannelId).orElse(StringUtils.EMPTY);
+
+ }
+
+ private void performChecksThenBuildAndSendEmbed(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull EmbedBuilder embedBuilder, @NonNull String channelIdToSendTo) {
+ if (!embedBuilder.isValidLength() || embedBuilder.isEmpty()) {
+ log.warn("Embed is empty or too long (current length: {}).", embedBuilder.length());
+ return;
+ }
+
+ TextChannel sendingChannel = event.getGuild().getTextChannelById(channelIdToSendTo);
+ if (sendingChannel != null && sendingChannel.canTalk()) {
+ sendingChannel.sendMessageEmbeds(embedBuilder.build()).queue();
+ }
+ }
+
+ @Override
+ public void onVoiceChannelStatusUpdate(@NonNull GuildAuditLogEntryCreateEvent event) {
+ String channelIdToSendTo = getRegisteredGuildChannel(event.getGuild().getId());
+ if (channelIdToSendTo.isBlank()) return;
+
+ AuditLogEntry ale = event.getEntry();
+
+ User executor = ale.getJDA().getUserById(ale.getUserId());
+ String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
+
+ GuildChannel targetChannel = ale.getJDA().getGuildChannelById(ale.getTargetId());
+ String mentionableTargetChannel = (targetChannel != null ? targetChannel.getAsMention() : ale.getTargetId());
+
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("Audit Log Entry | Voice Channel Status Update");
+
+ eb.setDescription("A voice channel status has been updated");
+ eb.setColor(Color.YELLOW);
+
+ eb.addField(
+ MarkdownUtil.underline("Details"),
+ MarkdownUtil.quoteBlock(
+ "Status Updated By: " + mentionableExecutor + "\n" +
+ "Target Channel: " + mentionableTargetChannel + "\n" +
+ "Updated Status: " + ale.getOptionByName("status")
+ ),
+ false
+ );
+
+ eb.setFooter("Audit Log Entry ID: " + ale.getId());
+ eb.setTimestamp(ale.getTimeCreated());
+
+ performChecksThenBuildAndSendEmbed(event, eb, channelIdToSendTo);
+ }
+
+ @Override
+ public void onVoiceChannelStatusDelete(@NonNull GuildAuditLogEntryCreateEvent event) {
+ String channelIdToSendTo = getRegisteredGuildChannel(event.getGuild().getId());
+ if (channelIdToSendTo.isBlank()) return;
+
+ AuditLogEntry ale = event.getEntry();
+
+ User executor = ale.getJDA().getUserById(ale.getUserId());
+ String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
+
+ GuildChannel targetChannel = ale.getJDA().getGuildChannelById(ale.getTargetId());
+ String mentionableTargetChannel = (targetChannel != null ? targetChannel.getAsMention() : ale.getTargetId());
+
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("Audit Log Entry | Voice Channel Status Delete");
+
+ eb.setDescription("A voice channel status has been reset");
+ eb.setColor(Color.ORANGE);
+
+ // status deletes dont contain the deleted status content
+ eb.addField(
+ MarkdownUtil.underline("Details"),
+ MarkdownUtil.quoteBlock("Status Reset By: " + mentionableExecutor + "\n" + "Target Channel: " + mentionableTargetChannel),
+ false
+ );
+
+ eb.setFooter("Audit Log Entry ID: " + ale.getId());
+ eb.setTimestamp(ale.getTimeCreated());
+
+ performChecksThenBuildAndSendEmbed(event, eb, channelIdToSendTo);
+ }
+}
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/channel/ChannelCreateEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/channel/ChannelCreateEventHelper.java
deleted file mode 100644
index b9d44bc..0000000
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/channel/ChannelCreateEventHelper.java
+++ /dev/null
@@ -1,87 +0,0 @@
-package io.github.eggy03.papertrail.bot.service.auditlog.channel;
-
-import io.github.eggy03.papertrail.bot.service.auditlog.channel.utils.ChannelUtils;
-import io.github.eggy03.papertrail.bot.utils.BooleanUtils;
-import io.github.eggy03.papertrail.bot.utils.DurationUtils;
-import lombok.NonNull;
-import lombok.experimental.UtilityClass;
-import lombok.extern.slf4j.Slf4j;
-import net.dv8tion.jda.api.EmbedBuilder;
-import net.dv8tion.jda.api.audit.AuditLogEntry;
-import net.dv8tion.jda.api.entities.User;
-import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;
-import net.dv8tion.jda.api.entities.channel.middleman.GuildChannel;
-import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
-import net.dv8tion.jda.api.utils.MarkdownUtil;
-
-import java.awt.Color;
-
-@UtilityClass
-@Slf4j
-public class ChannelCreateEventHelper {
-
- public static void format(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
-
- AuditLogEntry ale = event.getEntry();
-
- User executor = ale.getJDA().getUserById(ale.getUserIdLong());
- String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
-
- GuildChannel targetChannel = ale.getGuild().getGuildChannelById(ale.getTargetId());
- String targetChannelMention = (targetChannel != null ? targetChannel.getAsMention() : ale.getTargetId());
-
- EmbedBuilder eb = new EmbedBuilder();
- eb.setTitle("Audit Log Entry | Channel Create Event");
-
- eb.setDescription(MarkdownUtil.quoteBlock("Channel Created By: " + mentionableExecutor + "\nTarget Channel: " + targetChannelMention));
- eb.setColor(Color.GREEN);
-
- ale.getChanges().forEach((changeKey, changeValue) -> {
-
- Object oldValue = changeValue.getOldValue();
- Object newValue = changeValue.getNewValue();
-
- switch (changeKey) {
- case "user_limit" ->
- eb.addField(MarkdownUtil.underline("User Limit"), "╰┈➤" + ChannelUtils.resolveVoiceChannelUserLimit(newValue), false);
-
- case "rate_limit_per_user" ->
- eb.addField(MarkdownUtil.underline("Slow Mode"), "╰┈➤" + DurationUtils.formatSeconds(newValue), false);
-
- case "type" ->
- eb.addField(MarkdownUtil.underline("Channel Type"), "╰┈➤" + ChannelUtils.resolveChannelType(newValue), false);
-
- case "nsfw" ->
- eb.addField(MarkdownUtil.underline("Is NSFW"), "╰┈➤" + BooleanUtils.formatToYesOrNo(newValue), false);
-
- case "name" -> eb.addField(MarkdownUtil.underline("Channel Name"), "╰┈➤" + newValue, false);
-
- case "bitrate" ->
- eb.addField(MarkdownUtil.underline("Voice Channel Bitrate"), "╰┈➤" + ChannelUtils.resolveVoiceChannelBitrate(newValue), false);
-
- case "permission_overwrites", "flags", "template", "available_tags" -> {
- // the first two are for all types of channels and may stay empty during creation events
- // the second two are forum only cases which stay empty during creation
- }
-
- default -> {
- eb.addField("Unimplemented Change Key", changeKey, false);
- log.info("Unimplemented Change Key: {}\nOLD_VALUE: {}\nNEW_VALUE: {}", changeKey, oldValue, newValue);
- }
- }
- });
-
- eb.setFooter("Audit Log Entry ID: " + ale.getId());
- eb.setTimestamp(ale.getTimeCreated());
-
- if (!eb.isValidLength() || eb.isEmpty()) {
- log.warn("Embed is empty or too long (current length: {}).", eb.length());
- return;
- }
-
- TextChannel sendingChannel = event.getGuild().getTextChannelById(channelIdToSendTo);
- if (sendingChannel != null && sendingChannel.canTalk()) {
- sendingChannel.sendMessageEmbeds(eb.build()).queue();
- }
- }
-}
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/channel/ChannelDeleteEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/channel/ChannelDeleteEventHelper.java
deleted file mode 100644
index ae405b8..0000000
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/channel/ChannelDeleteEventHelper.java
+++ /dev/null
@@ -1,62 +0,0 @@
-package io.github.eggy03.papertrail.bot.service.auditlog.channel;
-
-import io.github.eggy03.papertrail.bot.service.auditlog.channel.utils.ChannelUtils;
-import lombok.NonNull;
-import lombok.experimental.UtilityClass;
-import lombok.extern.slf4j.Slf4j;
-import net.dv8tion.jda.api.EmbedBuilder;
-import net.dv8tion.jda.api.audit.AuditLogEntry;
-import net.dv8tion.jda.api.entities.User;
-import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;
-import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
-import net.dv8tion.jda.api.utils.MarkdownUtil;
-
-import java.awt.Color;
-
-@UtilityClass
-@Slf4j
-public class ChannelDeleteEventHelper {
-
- public static void format(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
-
- AuditLogEntry ale = event.getEntry();
-
- User executor = ale.getJDA().getUserById(ale.getUserIdLong());
- String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
-
- EmbedBuilder eb = new EmbedBuilder();
- eb.setTitle("Audit Log Entry | Channel Delete Event");
-
- eb.setDescription(MarkdownUtil.quoteBlock("Channel Deleted By: " + mentionableExecutor + "\nTarget Channel ID: " + ale.getTargetId()));
- eb.setColor(Color.RED);
-
- ale.getChanges().forEach((changeKey, changeValue) -> {
-
- Object oldValue = changeValue.getOldValue();
-
- switch (changeKey) {
- case "name" -> eb.addField(MarkdownUtil.underline("Name"), "╰┈➤" + oldValue, false);
-
- case "type" ->
- eb.addField(MarkdownUtil.underline("Type"), "╰┈➤" + ChannelUtils.resolveChannelType(oldValue), false);
-
- default -> {
- // omit all other fields
- }
- }
- });
-
- eb.setFooter("Audit Log Entry ID: " + ale.getId());
- eb.setTimestamp(ale.getTimeCreated());
-
- if (!eb.isValidLength() || eb.isEmpty()) {
- log.warn("Embed is empty or too long (current length: {}).", eb.length());
- return;
- }
-
- TextChannel sendingChannel = event.getGuild().getTextChannelById(channelIdToSendTo);
- if (sendingChannel != null && sendingChannel.canTalk()) {
- sendingChannel.sendMessageEmbeds(eb.build()).queue();
- }
- }
-}
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/channel/ChannelOverrideCreateEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/channel/ChannelOverrideCreateEventHelper.java
deleted file mode 100644
index 7e2eaa8..0000000
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/channel/ChannelOverrideCreateEventHelper.java
+++ /dev/null
@@ -1,75 +0,0 @@
-package io.github.eggy03.papertrail.bot.service.auditlog.channel;
-
-import io.github.eggy03.papertrail.bot.service.auditlog.channel.utils.ChannelUtils;
-import lombok.NonNull;
-import lombok.experimental.UtilityClass;
-import lombok.extern.slf4j.Slf4j;
-import net.dv8tion.jda.api.EmbedBuilder;
-import net.dv8tion.jda.api.audit.AuditLogEntry;
-import net.dv8tion.jda.api.entities.User;
-import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;
-import net.dv8tion.jda.api.entities.channel.middleman.GuildChannel;
-import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
-import net.dv8tion.jda.api.utils.MarkdownUtil;
-
-import java.awt.Color;
-
-@UtilityClass
-@Slf4j
-public class ChannelOverrideCreateEventHelper {
-
- public static void format(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
-
- AuditLogEntry ale = event.getEntry();
-
- User executor = ale.getJDA().getUserById(ale.getUserIdLong());
- String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
-
- GuildChannel targetChannel = event.getGuild().getGuildChannelById(ale.getTargetId());
- String targetChannelMention = (targetChannel != null ? targetChannel.getAsMention() : ale.getTargetId());
-
- EmbedBuilder eb = new EmbedBuilder();
- eb.setTitle("Audit Log Entry | Channel Override Create");
- eb.setDescription(MarkdownUtil.quoteBlock("Override Created By: " + mentionableExecutor + "\nTarget Channel: " + targetChannelMention));
- eb.setColor(Color.GREEN);
-
- ale.getChanges().forEach((changeKey, changeValue) -> {
- Object oldValue = changeValue.getOldValue();
- Object newValue = changeValue.getNewValue();
-
- switch (changeKey) {
-
- case "type" ->
- eb.addField(MarkdownUtil.underline("Override Type"), "╰┈➤" + ChannelUtils.resolveChannelOverrideTargetType(newValue), false);
-
- case "deny" ->
- eb.addField(MarkdownUtil.underline("Denied Permissions"), ChannelUtils.resolveChannelOverridePermissions(newValue, "❌"), false);
- case "allow" ->
- eb.addField(MarkdownUtil.underline("Allowed Permissions"), ChannelUtils.resolveChannelOverridePermissions(newValue, "✅"), false);
-
- // id exposes the member/role id which for which the channel permissions are overridden
- // only one member/role permission id is fetched per loop
- case "id" ->
- eb.addField(MarkdownUtil.underline("Target Member/Role"), "╰┈➤" + ChannelUtils.autoResolveMemberOrRole(newValue, event), false);
-
- default -> {
- eb.addField("Unimplemented Change Key", changeKey, false);
- log.info("Unimplemented Change Key: {}\nOLD_VALUE: {}\nNEW_VALUE: {}", changeKey, oldValue, newValue);
- }
- }
- });
-
- eb.setFooter("Audit Log Entry ID: " + ale.getId());
- eb.setTimestamp(ale.getTimeCreated());
-
- if (!eb.isValidLength() || eb.isEmpty()) {
- log.warn("Embed is empty or too long (current length: {}).", eb.length());
- return;
- }
-
- TextChannel sendingChannel = event.getGuild().getTextChannelById(channelIdToSendTo);
- if (sendingChannel != null && sendingChannel.canTalk()) {
- sendingChannel.sendMessageEmbeds(eb.build()).queue();
- }
- }
-}
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/channel/ChannelOverrideDeleteEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/channel/ChannelOverrideDeleteEventHelper.java
deleted file mode 100644
index cbe167b..0000000
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/channel/ChannelOverrideDeleteEventHelper.java
+++ /dev/null
@@ -1,76 +0,0 @@
-package io.github.eggy03.papertrail.bot.service.auditlog.channel;
-
-import io.github.eggy03.papertrail.bot.service.auditlog.channel.utils.ChannelUtils;
-import lombok.NonNull;
-import lombok.experimental.UtilityClass;
-import lombok.extern.slf4j.Slf4j;
-import net.dv8tion.jda.api.EmbedBuilder;
-import net.dv8tion.jda.api.audit.AuditLogEntry;
-import net.dv8tion.jda.api.entities.User;
-import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;
-import net.dv8tion.jda.api.entities.channel.middleman.GuildChannel;
-import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
-import net.dv8tion.jda.api.utils.MarkdownUtil;
-
-import java.awt.Color;
-
-@UtilityClass
-@Slf4j
-public class ChannelOverrideDeleteEventHelper {
-
- public static void format(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
-
- AuditLogEntry ale = event.getEntry();
-
- User executor = ale.getJDA().getUserById(ale.getUserIdLong());
- String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
-
- GuildChannel targetChannel = event.getGuild().getGuildChannelById(ale.getTargetId());
- String targetChannelMention = (targetChannel != null ? targetChannel.getAsMention() : ale.getTargetId());
-
- EmbedBuilder eb = new EmbedBuilder();
- eb.setTitle("Audit Log Entry | Channel Override Delete");
-
- eb.setDescription(MarkdownUtil.quoteBlock("Override Deleted By: " + mentionableExecutor + "\nTarget Channel: " + targetChannelMention));
- eb.setColor(Color.RED);
-
- ale.getChanges().forEach((changeKey, changeValue) -> {
- Object oldValue = changeValue.getOldValue();
- Object newValue = changeValue.getNewValue();
-
- switch (changeKey) {
-
- case "type" ->
- eb.addField(MarkdownUtil.underline("Override Type"), "╰┈➤" + ChannelUtils.resolveChannelOverrideTargetType(oldValue), false);
-
- case "deny" ->
- eb.addField(MarkdownUtil.underline("Denied Permissions"), ChannelUtils.resolveChannelOverridePermissions(oldValue, "❌"), false);
- case "allow" ->
- eb.addField(MarkdownUtil.underline("Allowed Permissions"), ChannelUtils.resolveChannelOverridePermissions(oldValue, "✅"), false);
-
- // id exposes the member/role id which for which the channel permissions are overridden
- // only one member/role permission id is fetched per loop
- case "id" ->
- eb.addField(MarkdownUtil.underline("Target Member/Role"), "╰┈➤" + ChannelUtils.autoResolveMemberOrRole(oldValue, event), false);
-
- default -> {
- eb.addField("Unimplemented Change Key", changeKey, false);
- log.info("Unimplemented Change Key: {}\nOLD_VALUE: {}\nNEW_VALUE: {}", changeKey, oldValue, newValue);
- }
- }
- });
-
- eb.setFooter("Audit Log Entry ID: " + ale.getId());
- eb.setTimestamp(ale.getTimeCreated());
-
- if (!eb.isValidLength() || eb.isEmpty()) {
- log.warn("Embed is empty or too long (current length: {}).", eb.length());
- return;
- }
-
- TextChannel sendingChannel = event.getGuild().getTextChannelById(channelIdToSendTo);
- if (sendingChannel != null && sendingChannel.canTalk()) {
- sendingChannel.sendMessageEmbeds(eb.build()).queue();
- }
- }
-}
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/channel/ChannelOverrideUpdateEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/channel/ChannelOverrideUpdateEventHelper.java
deleted file mode 100644
index e193c6d..0000000
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/channel/ChannelOverrideUpdateEventHelper.java
+++ /dev/null
@@ -1,107 +0,0 @@
-package io.github.eggy03.papertrail.bot.service.auditlog.channel;
-
-import io.github.eggy03.papertrail.bot.service.auditlog.channel.utils.ChannelUtils;
-import lombok.NonNull;
-import lombok.experimental.UtilityClass;
-import lombok.extern.slf4j.Slf4j;
-import net.dv8tion.jda.api.EmbedBuilder;
-import net.dv8tion.jda.api.audit.AuditLogEntry;
-import net.dv8tion.jda.api.entities.Member;
-import net.dv8tion.jda.api.entities.Role;
-import net.dv8tion.jda.api.entities.User;
-import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;
-import net.dv8tion.jda.api.entities.channel.middleman.GuildChannel;
-import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
-import net.dv8tion.jda.api.utils.MarkdownUtil;
-import org.jetbrains.annotations.NotNull;
-
-import java.awt.Color;
-
-@UtilityClass
-@Slf4j
-public class ChannelOverrideUpdateEventHelper {
-
- public static void format(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
-
- AuditLogEntry ale = event.getEntry();
-
- User executor = ale.getJDA().getUserById(ale.getUserIdLong());
- String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
-
- GuildChannel targetChannel = event.getGuild().getGuildChannelById(ale.getTargetId());
- String targetChannelMention = (targetChannel != null ? targetChannel.getAsMention() : ale.getTargetId());
-
- EmbedBuilder eb = new EmbedBuilder();
- eb.setTitle("Audit Log Entry | Channel Override Update");
- eb.setDescription(MarkdownUtil.quoteBlock("Override Updated By: " + mentionableExecutor + "\nTarget Channel: " + targetChannelMention));
- eb.setColor(Color.YELLOW);
-
- eb.addField(MarkdownUtil.underline("Override Type"), "╰┈➤" + ChannelUtils.resolveChannelOverrideTargetType(ale.getOptionByName("type")), false);
- eb.addField(MarkdownUtil.underline("Permissions Overridden For"), "╰┈➤" + getTargetRoleOrMember(ale, event), false);
-
- ale.getChanges().forEach((changeKey, changeValue) -> {
-
- Object oldValue = changeValue.getOldValue();
- Object newValue = changeValue.getNewValue();
-
- switch (changeKey) {
-
- case "deny" ->
- eb.addField(MarkdownUtil.underline("Denied Permissions"), ChannelUtils.resolveChannelOverridePermissions(newValue, "❌"), false);
- case "allow" ->
- eb.addField(MarkdownUtil.underline("Allowed Permissions"), ChannelUtils.resolveChannelOverridePermissions(newValue, "✅"), false);
-
- default -> {
- eb.addField("Unimplemented Change Key", changeKey, false);
- log.info("Unimplemented Change Key: {}\nOLD_VALUE: {}\nNEW_VALUE: {}", changeKey, oldValue, newValue);
- }
-
- }
- });
-
- eb.setFooter("Audit Log Entry ID: " + ale.getId());
- eb.setTimestamp(ale.getTimeCreated());
-
- if (!eb.isValidLength() || eb.isEmpty()) {
- log.warn("Embed is empty or too long (current length: {}).", eb.length());
- return;
- }
-
- TextChannel sendingChannel = event.getGuild().getTextChannelById(channelIdToSendTo);
- if (sendingChannel != null && sendingChannel.canTalk()) {
- sendingChannel.sendMessageEmbeds(eb.build()).queue();
- }
- }
-
- // ALE changes do not expose the id and type keys in case of override updates
- // therefore, this hacky method is required
- // IDK why channel override updates don't show this info
- @NotNull
- private static String getTargetRoleOrMember(@NonNull AuditLogEntry ale, @NonNull GuildAuditLogEntryCreateEvent event) {
-
- String overriddenId = ale.getOptionByName("id"); // id of the member or role
- String overriddenType = ale.getOptionByName("type"); // type that determines if the ID is that of a role or a member
-
- if (overriddenId == null)
- return "Member or Role ID is null";
-
- return switch (overriddenType) {
-
- case "0" -> {
- // It’s a role
- Role role = event.getGuild().getRoleById(overriddenId);
- yield role != null ? role.getAsMention() : overriddenId;
- }
-
- case "1" -> {
- // It's a member
- Member member = event.getGuild().getMemberById(overriddenId);
- yield member != null ? member.getAsMention() : overriddenId;
- }
-
- case null -> "Override Type is null";
- default -> "Unimplemented Override Type: " + overriddenType;
-
- };
- }
-}
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/channel/VoiceChannelStatusDeleteEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/channel/VoiceChannelStatusDeleteEventHelper.java
deleted file mode 100644
index afb0792..0000000
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/channel/VoiceChannelStatusDeleteEventHelper.java
+++ /dev/null
@@ -1,56 +0,0 @@
-package io.github.eggy03.papertrail.bot.service.auditlog.channel;
-
-import lombok.NonNull;
-import lombok.experimental.UtilityClass;
-import lombok.extern.slf4j.Slf4j;
-import net.dv8tion.jda.api.EmbedBuilder;
-import net.dv8tion.jda.api.audit.AuditLogEntry;
-import net.dv8tion.jda.api.entities.User;
-import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;
-import net.dv8tion.jda.api.entities.channel.middleman.GuildChannel;
-import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
-import net.dv8tion.jda.api.utils.MarkdownUtil;
-
-import java.awt.Color;
-
-@UtilityClass
-@Slf4j
-public class VoiceChannelStatusDeleteEventHelper {
-
- public static void format(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
-
- AuditLogEntry ale = event.getEntry();
-
- User executor = ale.getJDA().getUserById(ale.getUserId());
- String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
-
- GuildChannel targetChannel = ale.getJDA().getGuildChannelById(ale.getTargetId());
- String mentionableTargetChannel = (targetChannel != null ? targetChannel.getAsMention() : ale.getTargetId());
-
- EmbedBuilder eb = new EmbedBuilder();
- eb.setTitle("Audit Log Entry | Voice Channel Status Delete");
-
- eb.setDescription("A voice channel status has been reset");
- eb.setColor(Color.ORANGE);
-
- // status deletes dont contain the deleted status content
- eb.addField(
- MarkdownUtil.underline("Details"),
- MarkdownUtil.quoteBlock("Status Reset By: " + mentionableExecutor + "\n" + "Target Channel: " + mentionableTargetChannel),
- false
- );
-
- eb.setFooter("Audit Log Entry ID: " + ale.getId());
- eb.setTimestamp(ale.getTimeCreated());
-
- if (!eb.isValidLength() || eb.isEmpty()) {
- log.warn("Embed is empty or too long (current length: {}).", eb.length());
- return;
- }
-
- TextChannel sendingChannel = event.getGuild().getTextChannelById(channelIdToSendTo);
- if (sendingChannel != null && sendingChannel.canTalk()) {
- sendingChannel.sendMessageEmbeds(eb.build()).queue();
- }
- }
-}
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/channel/VoiceChannelStatusUpdateEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/channel/VoiceChannelStatusUpdateEventHelper.java
deleted file mode 100644
index 0a2e1eb..0000000
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/channel/VoiceChannelStatusUpdateEventHelper.java
+++ /dev/null
@@ -1,59 +0,0 @@
-package io.github.eggy03.papertrail.bot.service.auditlog.channel;
-
-import lombok.NonNull;
-import lombok.experimental.UtilityClass;
-import lombok.extern.slf4j.Slf4j;
-import net.dv8tion.jda.api.EmbedBuilder;
-import net.dv8tion.jda.api.audit.AuditLogEntry;
-import net.dv8tion.jda.api.entities.User;
-import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;
-import net.dv8tion.jda.api.entities.channel.middleman.GuildChannel;
-import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
-import net.dv8tion.jda.api.utils.MarkdownUtil;
-
-import java.awt.Color;
-
-@UtilityClass
-@Slf4j
-public class VoiceChannelStatusUpdateEventHelper {
-
- public static void format(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
-
- AuditLogEntry ale = event.getEntry();
-
- User executor = ale.getJDA().getUserById(ale.getUserId());
- String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
-
- GuildChannel targetChannel = ale.getJDA().getGuildChannelById(ale.getTargetId());
- String mentionableTargetChannel = (targetChannel != null ? targetChannel.getAsMention() : ale.getTargetId());
-
- EmbedBuilder eb = new EmbedBuilder();
- eb.setTitle("Audit Log Entry | Voice Channel Status Update");
-
- eb.setDescription("A voice channel status has been updated");
- eb.setColor(Color.YELLOW);
-
- eb.addField(
- MarkdownUtil.underline("Details"),
- MarkdownUtil.quoteBlock(
- "Status Updated By: " + mentionableExecutor + "\n" +
- "Target Channel: " + mentionableTargetChannel + "\n" +
- "Updated Status: " + ale.getOptionByName("status")
- ),
- false
- );
-
- eb.setFooter("Audit Log Entry ID: " + ale.getId());
- eb.setTimestamp(ale.getTimeCreated());
-
- if (!eb.isValidLength() || eb.isEmpty()) {
- log.warn("Embed is empty or too long (current length: {}).", eb.length());
- return;
- }
-
- TextChannel sendingChannel = event.getGuild().getTextChannelById(channelIdToSendTo);
- if (sendingChannel != null && sendingChannel.canTalk()) {
- sendingChannel.sendMessageEmbeds(eb.build()).queue();
- }
- }
-}
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/thread/ThreadCreateEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/thread/ThreadCreateEventHelper.java
index cd28dbc..c43c150 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/thread/ThreadCreateEventHelper.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/thread/ThreadCreateEventHelper.java
@@ -1,9 +1,9 @@
package io.github.eggy03.papertrail.bot.service.auditlog.thread;
-import io.github.eggy03.papertrail.bot.service.auditlog.channel.utils.ChannelUtils;
import io.github.eggy03.papertrail.bot.service.auditlog.thread.utils.ThreadUtils;
import io.github.eggy03.papertrail.bot.utils.BooleanUtils;
import io.github.eggy03.papertrail.bot.utils.DurationUtils;
+import io.github.eggy03.papertrail.bot.utils.auditlog.ChannelUtils;
import lombok.NonNull;
import lombok.experimental.UtilityClass;
import lombok.extern.slf4j.Slf4j;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/thread/ThreadDeleteEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/thread/ThreadDeleteEventHelper.java
index 4aaf4fd..c609896 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/thread/ThreadDeleteEventHelper.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/thread/ThreadDeleteEventHelper.java
@@ -1,9 +1,9 @@
package io.github.eggy03.papertrail.bot.service.auditlog.thread;
-import io.github.eggy03.papertrail.bot.service.auditlog.channel.utils.ChannelUtils;
import io.github.eggy03.papertrail.bot.service.auditlog.thread.utils.ThreadUtils;
import io.github.eggy03.papertrail.bot.utils.BooleanUtils;
import io.github.eggy03.papertrail.bot.utils.DurationUtils;
+import io.github.eggy03.papertrail.bot.utils.auditlog.ChannelUtils;
import lombok.NonNull;
import lombok.experimental.UtilityClass;
import lombok.extern.slf4j.Slf4j;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/thread/ThreadUpdateEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/thread/ThreadUpdateEventHelper.java
index 99c4fe9..68f377c 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/thread/ThreadUpdateEventHelper.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/thread/ThreadUpdateEventHelper.java
@@ -1,9 +1,9 @@
package io.github.eggy03.papertrail.bot.service.auditlog.thread;
-import io.github.eggy03.papertrail.bot.service.auditlog.channel.utils.ChannelUtils;
import io.github.eggy03.papertrail.bot.service.auditlog.thread.utils.ThreadUtils;
import io.github.eggy03.papertrail.bot.utils.BooleanUtils;
import io.github.eggy03.papertrail.bot.utils.DurationUtils;
+import io.github.eggy03.papertrail.bot.utils.auditlog.ChannelUtils;
import lombok.NonNull;
import lombok.experimental.UtilityClass;
import lombok.extern.slf4j.Slf4j;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/channel/utils/ChannelUtils.java b/src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/ChannelUtils.java
similarity index 98%
rename from src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/channel/utils/ChannelUtils.java
rename to src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/ChannelUtils.java
index 49a692b..79d369c 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/channel/utils/ChannelUtils.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/ChannelUtils.java
@@ -1,4 +1,4 @@
-package io.github.eggy03.papertrail.bot.service.auditlog.channel.utils;
+package io.github.eggy03.papertrail.bot.utils.auditlog;
import io.github.eggy03.papertrail.bot.utils.NumberParseUtils;
import lombok.NonNull;
From 2bd3647da25524c5fe05d0be227c01226cf21f5c Mon Sep 17 00:00:00 2001
From: Egg-03 <111327101+eggy03@users.noreply.github.com>
Date: Sat, 30 May 2026 19:34:40 +0530
Subject: [PATCH 20/66] refactor(threadevents): merge helpers into
ThreadEventHandler
- merge three helper classes from thread subpackage into `ThreadEventHandler`
- move `ThreadUtils` to the utility package
Signed-off-by: Egg-03 <111327101+eggy03@users.noreply.github.com>
---
.../service/auditlog/ThreadEventHandler.java | 248 ++++++++++++++++++
.../thread/ThreadCreateEventHelper.java | 88 -------
.../thread/ThreadDeleteEventHelper.java | 85 ------
.../thread/ThreadUpdateEventHelper.java | 103 --------
.../utils => utils/auditlog}/ThreadUtils.java | 2 +-
5 files changed, 249 insertions(+), 277 deletions(-)
create mode 100644 src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/ThreadEventHandler.java
delete mode 100644 src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/thread/ThreadCreateEventHelper.java
delete mode 100644 src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/thread/ThreadDeleteEventHelper.java
delete mode 100644 src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/thread/ThreadUpdateEventHelper.java
rename src/main/java/io/github/eggy03/papertrail/bot/{service/auditlog/thread/utils => utils/auditlog}/ThreadUtils.java (90%)
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/ThreadEventHandler.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/ThreadEventHandler.java
new file mode 100644
index 0000000..924801e
--- /dev/null
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/ThreadEventHandler.java
@@ -0,0 +1,248 @@
+package io.github.eggy03.papertrail.bot.service.auditlog;
+
+import io.github.eggy03.papertrail.bot.listeners.auditlog.GuildAuditLogEntryCreateEventHandler;
+import io.github.eggy03.papertrail.bot.utils.BooleanUtils;
+import io.github.eggy03.papertrail.bot.utils.DurationUtils;
+import io.github.eggy03.papertrail.bot.utils.auditlog.ChannelUtils;
+import io.github.eggy03.papertrail.bot.utils.auditlog.ThreadUtils;
+import io.github.eggy03.papertrail.sdk.client.AuditLogRegistrationClient;
+import io.github.eggy03.papertrail.sdk.entity.AuditLogRegistrationEntity;
+import jakarta.enterprise.context.ApplicationScoped;
+import jakarta.inject.Inject;
+import lombok.NonNull;
+import lombok.extern.slf4j.Slf4j;
+import net.dv8tion.jda.api.EmbedBuilder;
+import net.dv8tion.jda.api.audit.AuditLogEntry;
+import net.dv8tion.jda.api.entities.User;
+import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;
+import net.dv8tion.jda.api.entities.channel.concrete.ThreadChannel;
+import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
+import net.dv8tion.jda.api.utils.MarkdownUtil;
+import org.apache.commons.lang3.StringUtils;
+
+import java.awt.Color;
+
+@ApplicationScoped
+@Slf4j
+@SuppressWarnings("java:S1192")
+public class ThreadEventHandler extends GuildAuditLogEntryCreateEventHandler {
+
+ private final @NonNull AuditLogRegistrationClient client;
+
+ @Inject
+ public ThreadEventHandler(@NonNull AuditLogRegistrationClient client) {
+ this.client = client;
+ }
+
+ @NonNull
+ private String getRegisteredGuildChannel(@NonNull String guildId) {
+ return client.getRegisteredGuild(guildId)
+ .map(AuditLogRegistrationEntity::getChannelId).orElse(StringUtils.EMPTY);
+
+ }
+
+ private void performChecksThenBuildAndSendEmbed(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull EmbedBuilder embedBuilder, @NonNull String channelIdToSendTo) {
+ if (!embedBuilder.isValidLength() || embedBuilder.isEmpty()) {
+ log.warn("Embed is empty or too long (current length: {}).", embedBuilder.length());
+ return;
+ }
+
+ TextChannel sendingChannel = event.getGuild().getTextChannelById(channelIdToSendTo);
+ if (sendingChannel != null && sendingChannel.canTalk()) {
+ sendingChannel.sendMessageEmbeds(embedBuilder.build()).queue();
+ }
+ }
+
+ @Override
+ public void onThreadCreate(@NonNull GuildAuditLogEntryCreateEvent event) {
+ String channelIdToSendTo = getRegisteredGuildChannel(event.getGuild().getId());
+ if (channelIdToSendTo.isBlank()) return;
+
+ AuditLogEntry ale = event.getEntry();
+
+ User executor = ale.getJDA().getUserById(ale.getUserIdLong());
+ String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
+
+ ThreadChannel targetThread = event.getGuild().getThreadChannelById(ale.getTargetId());
+ String mentionableTargetThread = (targetThread != null ? targetThread.getAsMention() : ale.getTargetId());
+
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("Audit Log Entry | Thread Create Event");
+ eb.setDescription(MarkdownUtil.quoteBlock("Thread Created By: " + mentionableExecutor + "\nTarget Thread: " + mentionableTargetThread));
+ eb.setColor(Color.GREEN);
+
+ ale.getChanges().forEach((changeKey, changeValue) -> {
+ Object oldValue = changeValue.getOldValue();
+ Object newValue = changeValue.getNewValue();
+
+ switch (changeKey) {
+
+ case "locked" ->
+ eb.addField(MarkdownUtil.underline("Is Locked"), "╰┈➤" + BooleanUtils.formatToYesOrNo(newValue), false);
+
+ case "auto_archive_duration" ->
+ eb.addField(MarkdownUtil.underline("Auto Archive Duration"), "╰┈➤" + ThreadUtils.resolveAutoArchiveDuration(newValue), false);
+
+ case "rate_limit_per_user" ->
+ eb.addField(MarkdownUtil.underline("Slow Mode Limit"), "╰┈➤" + DurationUtils.formatSeconds(newValue), false);
+
+ case "type" ->
+ eb.addField(MarkdownUtil.underline("Thread Type"), "╰┈➤" + ChannelUtils.resolveChannelType(newValue), false);
+
+ case "archived" ->
+ eb.addField(MarkdownUtil.underline("Archived"), "╰┈➤" + BooleanUtils.formatToYesOrNo(newValue), false);
+
+ case "flags" -> {
+ // skip
+ }
+ case "invitable" ->
+ eb.addField(MarkdownUtil.underline("Invitable"), "╰┈➤" + BooleanUtils.formatToYesOrNo(newValue), false);
+
+ case "name" -> eb.addField(MarkdownUtil.underline("Thread Name"), "╰┈➤" + newValue, false);
+
+ default -> {
+ eb.addField("Unimplemented Change Key", changeKey, false);
+ log.info("Unimplemented Change Key on Thread Create: {}\nOLD_VALUE: {}\nNEW_VALUE: {}", changeKey, oldValue, newValue);
+ }
+ }
+ });
+
+ eb.setFooter("Audit Log Entry ID: " + ale.getId());
+ eb.setTimestamp(ale.getTimeCreated());
+
+ performChecksThenBuildAndSendEmbed(event, eb, channelIdToSendTo);
+ }
+
+ @Override
+ public void onThreadUpdate(@NonNull GuildAuditLogEntryCreateEvent event) {
+ String channelIdToSendTo = getRegisteredGuildChannel(event.getGuild().getId());
+ if (channelIdToSendTo.isBlank()) return;
+
+ AuditLogEntry ale = event.getEntry();
+
+ User executor = ale.getJDA().getUserById(ale.getUserIdLong());
+ String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
+
+ ThreadChannel targetThread = event.getGuild().getThreadChannelById(ale.getTargetId());
+ String mentionableTargetThread = (targetThread != null ? targetThread.getAsMention() : ale.getTargetId());
+
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("Audit Log Entry | Thread Update Event");
+ eb.setDescription(MarkdownUtil.quoteBlock("Thread Updated By: " + mentionableExecutor + "\nTarget Thread: " + mentionableTargetThread));
+ eb.setColor(Color.YELLOW);
+
+
+ ale.getChanges().forEach((changeKey, changeValue) -> {
+ Object oldValue = changeValue.getOldValue();
+ Object newValue = changeValue.getNewValue();
+
+ switch (changeKey) {
+
+ case "locked" -> {
+ eb.addField(MarkdownUtil.underline("Was Locked"), "╰┈➤" + BooleanUtils.formatToYesOrNo(oldValue), true);
+ eb.addField(MarkdownUtil.underline("Is Locked"), "╰┈➤" + BooleanUtils.formatToYesOrNo(newValue), true);
+ eb.addBlankField(true);
+ }
+ case "auto_archive_duration" -> {
+ eb.addField(MarkdownUtil.underline("Old Auto Archive Duration"), "╰┈➤" + ThreadUtils.resolveAutoArchiveDuration(oldValue), true);
+ eb.addField(MarkdownUtil.underline("New Auto Archive Duration"), "╰┈➤" + ThreadUtils.resolveAutoArchiveDuration(newValue), true);
+ eb.addBlankField(true);
+ }
+ case "rate_limit_per_user" -> {
+ eb.addField(MarkdownUtil.underline("Old Slow Mode Limit"), "╰┈➤" + DurationUtils.formatSeconds(oldValue), true);
+ eb.addField(MarkdownUtil.underline("New Slow Mode Limit"), "╰┈➤" + DurationUtils.formatSeconds(newValue), true);
+ eb.addBlankField(true);
+ }
+ case "type" -> {
+ eb.addField(MarkdownUtil.underline("Old Thread Type"), "╰┈➤" + ChannelUtils.resolveChannelType(oldValue), true);
+ eb.addField(MarkdownUtil.underline("New Thread Type"), "╰┈➤" + ChannelUtils.resolveChannelType(newValue), true);
+ eb.addBlankField(true);
+ }
+ case "archived" -> {
+ eb.addField(MarkdownUtil.underline("Old Archive Status"), "╰┈➤" + BooleanUtils.formatToEnabledOrDisabled(oldValue), true);
+ eb.addField(MarkdownUtil.underline("New Archive Status"), "╰┈➤" + BooleanUtils.formatToEnabledOrDisabled(newValue), true);
+ eb.addBlankField(true);
+ }
+ case "flags" -> eb.addField(MarkdownUtil.underline("Flags"), "╰┈➤Thread flags were updated", false);
+
+ case "invitable" -> {
+ eb.addField(MarkdownUtil.underline("Was Invitable"), "╰┈➤" + BooleanUtils.formatToYesOrNo(oldValue), true);
+ eb.addField(MarkdownUtil.underline("Is Invitable"), "╰┈➤" + BooleanUtils.formatToYesOrNo(newValue), true);
+ eb.addBlankField(true);
+ }
+ case "name" -> {
+ eb.addField(MarkdownUtil.underline("Old Thread Name"), "╰┈➤" + oldValue, true);
+ eb.addField(MarkdownUtil.underline("New Thread Name"), "╰┈➤" + newValue, true);
+ eb.addBlankField(true);
+ }
+ default -> {
+ eb.addField("Unimplemented Change Key", changeKey, false);
+ log.info("Unimplemented Change Key on Thread Update: {}\nOLD_VALUE: {}\nNEW_VALUE: {}", changeKey, oldValue, newValue);
+ }
+ }
+ });
+
+ eb.setFooter("Audit Log Entry ID: " + ale.getId());
+ eb.setTimestamp(ale.getTimeCreated());
+
+ performChecksThenBuildAndSendEmbed(event, eb, channelIdToSendTo);
+ }
+
+ @Override
+ public void onThreadDelete(@NonNull GuildAuditLogEntryCreateEvent event) {
+ String channelIdToSendTo = getRegisteredGuildChannel(event.getGuild().getId());
+ if (channelIdToSendTo.isBlank()) return;
+
+ AuditLogEntry ale = event.getEntry();
+
+ User executor = ale.getJDA().getUserById(ale.getUserIdLong());
+ String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
+
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("Audit Log Entry | Thread Delete Event");
+ eb.setDescription(MarkdownUtil.quoteBlock("Thread Deleted By: " + mentionableExecutor + "\nTarget Thread ID: " + ale.getTargetId()));
+ eb.setColor(Color.RED);
+
+ ale.getChanges().forEach((changeKey, changeValue) -> {
+ Object oldValue = changeValue.getOldValue();
+ Object newValue = changeValue.getNewValue();
+
+ switch (changeKey) {
+
+ case "locked" ->
+ eb.addField(MarkdownUtil.underline("Was Locked"), "╰┈➤" + BooleanUtils.formatToYesOrNo(oldValue), false);
+
+ case "auto_archive_duration" ->
+ eb.addField(MarkdownUtil.underline("Auto Archive Duration"), "╰┈➤" + ThreadUtils.resolveAutoArchiveDuration(oldValue), false);
+
+ case "rate_limit_per_user" ->
+ eb.addField(MarkdownUtil.underline("Slow Mode Limit"), "╰┈➤" + DurationUtils.formatSeconds(oldValue), false);
+
+ case "type" ->
+ eb.addField(MarkdownUtil.underline("Thread Type"), "╰┈➤" + ChannelUtils.resolveChannelType(oldValue), false);
+
+ case "archived" ->
+ eb.addField(MarkdownUtil.underline("Archived"), "╰┈➤" + BooleanUtils.formatToYesOrNo(oldValue), false);
+
+ case "flags" -> {
+ // skip
+ }
+
+ case "invitable" ->
+ eb.addField(MarkdownUtil.underline("Invitable"), "╰┈➤" + BooleanUtils.formatToYesOrNo(oldValue), false);
+
+ case "name" -> eb.addField(MarkdownUtil.underline("Thread Name"), "╰┈➤" + oldValue, false);
+
+ default -> {
+ eb.addField("Unimplemented Change Key", changeKey, false);
+ log.info("Unimplemented Change Key on Thread Delete: {}\nOLD_VALUE: {}\nNEW_VALUE: {}", changeKey, oldValue, newValue);
+ }
+ }
+ });
+
+ eb.setFooter("Audit Log Entry ID: " + ale.getId());
+ eb.setTimestamp(ale.getTimeCreated());
+
+ performChecksThenBuildAndSendEmbed(event, eb, channelIdToSendTo);
+ }
+}
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/thread/ThreadCreateEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/thread/ThreadCreateEventHelper.java
deleted file mode 100644
index c43c150..0000000
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/thread/ThreadCreateEventHelper.java
+++ /dev/null
@@ -1,88 +0,0 @@
-package io.github.eggy03.papertrail.bot.service.auditlog.thread;
-
-import io.github.eggy03.papertrail.bot.service.auditlog.thread.utils.ThreadUtils;
-import io.github.eggy03.papertrail.bot.utils.BooleanUtils;
-import io.github.eggy03.papertrail.bot.utils.DurationUtils;
-import io.github.eggy03.papertrail.bot.utils.auditlog.ChannelUtils;
-import lombok.NonNull;
-import lombok.experimental.UtilityClass;
-import lombok.extern.slf4j.Slf4j;
-import net.dv8tion.jda.api.EmbedBuilder;
-import net.dv8tion.jda.api.audit.AuditLogEntry;
-import net.dv8tion.jda.api.entities.User;
-import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;
-import net.dv8tion.jda.api.entities.channel.concrete.ThreadChannel;
-import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
-import net.dv8tion.jda.api.utils.MarkdownUtil;
-
-import java.awt.Color;
-
-@UtilityClass
-@Slf4j
-public class ThreadCreateEventHelper {
-
- public static void format(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
-
- AuditLogEntry ale = event.getEntry();
-
- User executor = ale.getJDA().getUserById(ale.getUserIdLong());
- String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
-
- ThreadChannel targetThread = event.getGuild().getThreadChannelById(ale.getTargetId());
- String mentionableTargetThread = (targetThread != null ? targetThread.getAsMention() : ale.getTargetId());
-
- EmbedBuilder eb = new EmbedBuilder();
- eb.setTitle("Audit Log Entry | Thread Create Event");
- eb.setDescription(MarkdownUtil.quoteBlock("Thread Created By: " + mentionableExecutor + "\nTarget Thread: " + mentionableTargetThread));
- eb.setColor(Color.GREEN);
-
- ale.getChanges().forEach((changeKey, changeValue) -> {
- Object oldValue = changeValue.getOldValue();
- Object newValue = changeValue.getNewValue();
-
- switch (changeKey) {
-
- case "locked" ->
- eb.addField(MarkdownUtil.underline("Is Locked"), "╰┈➤" + BooleanUtils.formatToYesOrNo(newValue), false);
-
- case "auto_archive_duration" ->
- eb.addField(MarkdownUtil.underline("Auto Archive Duration"), "╰┈➤" + ThreadUtils.resolveAutoArchiveDuration(newValue), false);
-
- case "rate_limit_per_user" ->
- eb.addField(MarkdownUtil.underline("Slow Mode Limit"), "╰┈➤" + DurationUtils.formatSeconds(newValue), false);
-
- case "type" ->
- eb.addField(MarkdownUtil.underline("Thread Type"), "╰┈➤" + ChannelUtils.resolveChannelType(newValue), false);
-
- case "archived" ->
- eb.addField(MarkdownUtil.underline("Archived"), "╰┈➤" + BooleanUtils.formatToYesOrNo(newValue), false);
-
- case "flags" -> {
- // skip
- }
- case "invitable" ->
- eb.addField(MarkdownUtil.underline("Invitable"), "╰┈➤" + BooleanUtils.formatToYesOrNo(newValue), false);
-
- case "name" -> eb.addField(MarkdownUtil.underline("Thread Name"), "╰┈➤" + newValue, false);
-
- default -> {
- eb.addField("Unimplemented Change Key", changeKey, false);
- log.info("Unimplemented Change Key: {}\nOLD_VALUE: {}\nNEW_VALUE: {}", changeKey, oldValue, newValue);
- }
- }
- });
-
- eb.setFooter("Audit Log Entry ID: " + ale.getId());
- eb.setTimestamp(ale.getTimeCreated());
-
- if (!eb.isValidLength() || eb.isEmpty()) {
- log.warn("Embed is empty or too long (current length: {}).", eb.length());
- return;
- }
-
- TextChannel sendingChannel = event.getGuild().getTextChannelById(channelIdToSendTo);
- if (sendingChannel != null && sendingChannel.canTalk()) {
- sendingChannel.sendMessageEmbeds(eb.build()).queue();
- }
- }
-}
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/thread/ThreadDeleteEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/thread/ThreadDeleteEventHelper.java
deleted file mode 100644
index c609896..0000000
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/thread/ThreadDeleteEventHelper.java
+++ /dev/null
@@ -1,85 +0,0 @@
-package io.github.eggy03.papertrail.bot.service.auditlog.thread;
-
-import io.github.eggy03.papertrail.bot.service.auditlog.thread.utils.ThreadUtils;
-import io.github.eggy03.papertrail.bot.utils.BooleanUtils;
-import io.github.eggy03.papertrail.bot.utils.DurationUtils;
-import io.github.eggy03.papertrail.bot.utils.auditlog.ChannelUtils;
-import lombok.NonNull;
-import lombok.experimental.UtilityClass;
-import lombok.extern.slf4j.Slf4j;
-import net.dv8tion.jda.api.EmbedBuilder;
-import net.dv8tion.jda.api.audit.AuditLogEntry;
-import net.dv8tion.jda.api.entities.User;
-import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;
-import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
-import net.dv8tion.jda.api.utils.MarkdownUtil;
-
-import java.awt.Color;
-
-@UtilityClass
-@Slf4j
-public class ThreadDeleteEventHelper {
-
- public static void format(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
-
- AuditLogEntry ale = event.getEntry();
-
- User executor = ale.getJDA().getUserById(ale.getUserIdLong());
- String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
-
- EmbedBuilder eb = new EmbedBuilder();
- eb.setTitle("Audit Log Entry | Thread Delete Event");
- eb.setDescription(MarkdownUtil.quoteBlock("Thread Deleted By: " + mentionableExecutor + "\nTarget Thread ID: " + ale.getTargetId()));
- eb.setColor(Color.RED);
-
- ale.getChanges().forEach((changeKey, changeValue) -> {
- Object oldValue = changeValue.getOldValue();
- Object newValue = changeValue.getNewValue();
-
- switch (changeKey) {
-
- case "locked" ->
- eb.addField(MarkdownUtil.underline("Was Locked"), "╰┈➤" + BooleanUtils.formatToYesOrNo(oldValue), false);
-
- case "auto_archive_duration" ->
- eb.addField(MarkdownUtil.underline("Auto Archive Duration"), "╰┈➤" + ThreadUtils.resolveAutoArchiveDuration(oldValue), false);
-
- case "rate_limit_per_user" ->
- eb.addField(MarkdownUtil.underline("Slow Mode Limit"), "╰┈➤" + DurationUtils.formatSeconds(oldValue), false);
-
- case "type" ->
- eb.addField(MarkdownUtil.underline("Thread Type"), "╰┈➤" + ChannelUtils.resolveChannelType(oldValue), false);
-
- case "archived" ->
- eb.addField(MarkdownUtil.underline("Archived"), "╰┈➤" + BooleanUtils.formatToYesOrNo(oldValue), false);
-
- case "flags" -> {
- // skip
- }
-
- case "invitable" ->
- eb.addField(MarkdownUtil.underline("Invitable"), "╰┈➤" + BooleanUtils.formatToYesOrNo(oldValue), false);
-
- case "name" -> eb.addField(MarkdownUtil.underline("Thread Name"), "╰┈➤" + oldValue, false);
-
- default -> {
- eb.addField("Unimplemented Change Key", changeKey, false);
- log.info("Unimplemented Change Key: {}\nOLD_VALUE: {}\nNEW_VALUE: {}", changeKey, oldValue, newValue);
- }
- }
- });
-
- eb.setFooter("Audit Log Entry ID: " + ale.getId());
- eb.setTimestamp(ale.getTimeCreated());
-
- if (!eb.isValidLength() || eb.isEmpty()) {
- log.warn("Embed is empty or too long (current length: {}).", eb.length());
- return;
- }
-
- TextChannel sendingChannel = event.getGuild().getTextChannelById(channelIdToSendTo);
- if (sendingChannel != null && sendingChannel.canTalk()) {
- sendingChannel.sendMessageEmbeds(eb.build()).queue();
- }
- }
-}
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/thread/ThreadUpdateEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/thread/ThreadUpdateEventHelper.java
deleted file mode 100644
index 68f377c..0000000
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/thread/ThreadUpdateEventHelper.java
+++ /dev/null
@@ -1,103 +0,0 @@
-package io.github.eggy03.papertrail.bot.service.auditlog.thread;
-
-import io.github.eggy03.papertrail.bot.service.auditlog.thread.utils.ThreadUtils;
-import io.github.eggy03.papertrail.bot.utils.BooleanUtils;
-import io.github.eggy03.papertrail.bot.utils.DurationUtils;
-import io.github.eggy03.papertrail.bot.utils.auditlog.ChannelUtils;
-import lombok.NonNull;
-import lombok.experimental.UtilityClass;
-import lombok.extern.slf4j.Slf4j;
-import net.dv8tion.jda.api.EmbedBuilder;
-import net.dv8tion.jda.api.audit.AuditLogEntry;
-import net.dv8tion.jda.api.entities.User;
-import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;
-import net.dv8tion.jda.api.entities.channel.concrete.ThreadChannel;
-import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
-import net.dv8tion.jda.api.utils.MarkdownUtil;
-
-import java.awt.Color;
-
-@UtilityClass
-@Slf4j
-public class ThreadUpdateEventHelper {
-
- public static void format(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
-
- AuditLogEntry ale = event.getEntry();
-
- User executor = ale.getJDA().getUserById(ale.getUserIdLong());
- String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
-
- ThreadChannel targetThread = event.getGuild().getThreadChannelById(ale.getTargetId());
- String mentionableTargetThread = (targetThread != null ? targetThread.getAsMention() : ale.getTargetId());
-
- EmbedBuilder eb = new EmbedBuilder();
- eb.setTitle("Audit Log Entry | Thread Update Event");
- eb.setDescription(MarkdownUtil.quoteBlock("Thread Updated By: " + mentionableExecutor + "\nTarget Thread: " + mentionableTargetThread));
- eb.setColor(Color.YELLOW);
-
-
- ale.getChanges().forEach((changeKey, changeValue) -> {
- Object oldValue = changeValue.getOldValue();
- Object newValue = changeValue.getNewValue();
-
- switch (changeKey) {
-
- case "locked" -> {
- eb.addField(MarkdownUtil.underline("Was Locked"), "╰┈➤" + BooleanUtils.formatToYesOrNo(oldValue), true);
- eb.addField(MarkdownUtil.underline("Is Locked"), "╰┈➤" + BooleanUtils.formatToYesOrNo(newValue), true);
- eb.addBlankField(true);
- }
- case "auto_archive_duration" -> {
- eb.addField(MarkdownUtil.underline("Old Auto Archive Duration"), "╰┈➤" + ThreadUtils.resolveAutoArchiveDuration(oldValue), true);
- eb.addField(MarkdownUtil.underline("New Auto Archive Duration"), "╰┈➤" + ThreadUtils.resolveAutoArchiveDuration(newValue), true);
- eb.addBlankField(true);
- }
- case "rate_limit_per_user" -> {
- eb.addField(MarkdownUtil.underline("Old Slow Mode Limit"), "╰┈➤" + DurationUtils.formatSeconds(oldValue), true);
- eb.addField(MarkdownUtil.underline("New Slow Mode Limit"), "╰┈➤" + DurationUtils.formatSeconds(newValue), true);
- eb.addBlankField(true);
- }
- case "type" -> {
- eb.addField(MarkdownUtil.underline("Old Thread Type"), "╰┈➤" + ChannelUtils.resolveChannelType(oldValue), true);
- eb.addField(MarkdownUtil.underline("New Thread Type"), "╰┈➤" + ChannelUtils.resolveChannelType(newValue), true);
- eb.addBlankField(true);
- }
- case "archived" -> {
- eb.addField(MarkdownUtil.underline("Old Archive Status"), "╰┈➤" + BooleanUtils.formatToEnabledOrDisabled(oldValue), true);
- eb.addField(MarkdownUtil.underline("New Archive Status"), "╰┈➤" + BooleanUtils.formatToEnabledOrDisabled(newValue), true);
- eb.addBlankField(true);
- }
- case "flags" -> eb.addField(MarkdownUtil.underline("Flags"), "╰┈➤Thread flags were updated", false);
-
- case "invitable" -> {
- eb.addField(MarkdownUtil.underline("Was Invitable"), "╰┈➤" + BooleanUtils.formatToYesOrNo(oldValue), true);
- eb.addField(MarkdownUtil.underline("Is Invitable"), "╰┈➤" + BooleanUtils.formatToYesOrNo(newValue), true);
- eb.addBlankField(true);
- }
- case "name" -> {
- eb.addField(MarkdownUtil.underline("Old Thread Name"), "╰┈➤" + oldValue, true);
- eb.addField(MarkdownUtil.underline("New Thread Name"), "╰┈➤" + newValue, true);
- eb.addBlankField(true);
- }
- default -> {
- eb.addField("Unimplemented Change Key", changeKey, false);
- log.info("Unimplemented Change Key: {}\nOLD_VALUE: {}\nNEW_VALUE: {}", changeKey, oldValue, newValue);
- }
- }
- });
-
- eb.setFooter("Audit Log Entry ID: " + ale.getId());
- eb.setTimestamp(ale.getTimeCreated());
-
- if (!eb.isValidLength() || eb.isEmpty()) {
- log.warn("Embed is empty or too long (current length: {}).", eb.length());
- return;
- }
-
- TextChannel sendingChannel = event.getGuild().getTextChannelById(channelIdToSendTo);
- if (sendingChannel != null && sendingChannel.canTalk()) {
- sendingChannel.sendMessageEmbeds(eb.build()).queue();
- }
- }
-}
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/thread/utils/ThreadUtils.java b/src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/ThreadUtils.java
similarity index 90%
rename from src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/thread/utils/ThreadUtils.java
rename to src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/ThreadUtils.java
index ba40bb8..7c89b73 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/thread/utils/ThreadUtils.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/ThreadUtils.java
@@ -1,4 +1,4 @@
-package io.github.eggy03.papertrail.bot.service.auditlog.thread.utils;
+package io.github.eggy03.papertrail.bot.utils.auditlog;
import io.github.eggy03.papertrail.bot.utils.NumberParseUtils;
import lombok.NonNull;
From 07dcdf8c1be1beef1772594de617db6ef73a36ae Mon Sep 17 00:00:00 2001
From: Egg-03 <111327101+eggy03@users.noreply.github.com>
Date: Sun, 31 May 2026 09:19:28 +0530
Subject: [PATCH 21/66] refactor(roleevents): merge helpers into
RoleEventHandler
- merge three helper classes from thread subpackage into `RoleEventHandler`
- move `RoleUtils` to the utility package
Signed-off-by: Egg-03 <111327101+eggy03@users.noreply.github.com>
---
.../service/auditlog/RoleEventHandler.java | 226 ++++++++++++++++++
.../auditlog/role/RoleCreateEventHelper.java | 70 ------
.../auditlog/role/RoleDeleteEventHelper.java | 77 ------
.../auditlog/role/RoleUpdateEventHelper.java | 101 --------
.../utils => utils/auditlog}/RoleUtils.java | 2 +-
5 files changed, 227 insertions(+), 249 deletions(-)
create mode 100644 src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/RoleEventHandler.java
delete mode 100644 src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/role/RoleCreateEventHelper.java
delete mode 100644 src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/role/RoleDeleteEventHelper.java
delete mode 100644 src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/role/RoleUpdateEventHelper.java
rename src/main/java/io/github/eggy03/papertrail/bot/{service/auditlog/role/utils => utils/auditlog}/RoleUtils.java (97%)
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/RoleEventHandler.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/RoleEventHandler.java
new file mode 100644
index 0000000..6f91f88
--- /dev/null
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/RoleEventHandler.java
@@ -0,0 +1,226 @@
+package io.github.eggy03.papertrail.bot.service.auditlog;
+
+import io.github.eggy03.papertrail.bot.listeners.auditlog.GuildAuditLogEntryCreateEventHandler;
+import io.github.eggy03.papertrail.bot.utils.BooleanUtils;
+import io.github.eggy03.papertrail.bot.utils.auditlog.RoleUtils;
+import io.github.eggy03.papertrail.sdk.client.AuditLogRegistrationClient;
+import io.github.eggy03.papertrail.sdk.entity.AuditLogRegistrationEntity;
+import jakarta.enterprise.context.ApplicationScoped;
+import jakarta.inject.Inject;
+import lombok.NonNull;
+import lombok.extern.slf4j.Slf4j;
+import net.dv8tion.jda.api.EmbedBuilder;
+import net.dv8tion.jda.api.audit.AuditLogEntry;
+import net.dv8tion.jda.api.entities.Role;
+import net.dv8tion.jda.api.entities.User;
+import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;
+import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
+import net.dv8tion.jda.api.utils.MarkdownUtil;
+import org.apache.commons.lang3.StringUtils;
+
+import java.awt.Color;
+
+@ApplicationScoped
+@Slf4j
+@SuppressWarnings("java:S1192")
+public class RoleEventHandler extends GuildAuditLogEntryCreateEventHandler {
+
+ private final @NonNull AuditLogRegistrationClient client;
+
+ @Inject
+ public RoleEventHandler(@NonNull AuditLogRegistrationClient client) {
+ this.client = client;
+ }
+
+ @NonNull
+ private String getRegisteredGuildChannel(@NonNull String guildId) {
+ return client.getRegisteredGuild(guildId)
+ .map(AuditLogRegistrationEntity::getChannelId).orElse(StringUtils.EMPTY);
+
+ }
+
+ private void performChecksThenBuildAndSendEmbed(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull EmbedBuilder embedBuilder, @NonNull String channelIdToSendTo) {
+ if (!embedBuilder.isValidLength() || embedBuilder.isEmpty()) {
+ log.warn("Embed is empty or too long (current length: {}).", embedBuilder.length());
+ return;
+ }
+
+ TextChannel sendingChannel = event.getGuild().getTextChannelById(channelIdToSendTo);
+ if (sendingChannel != null && sendingChannel.canTalk()) {
+ sendingChannel.sendMessageEmbeds(embedBuilder.build()).queue();
+ }
+ }
+
+ @Override
+ public void onRoleCreate(@NonNull GuildAuditLogEntryCreateEvent event) {
+ String channelIdToSendTo = getRegisteredGuildChannel(event.getGuild().getId());
+ if (channelIdToSendTo.isBlank()) return;
+
+ AuditLogEntry ale = event.getEntry();
+
+ User executor = ale.getJDA().getUserById(ale.getUserId());
+ String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
+
+ Role targetRole = ale.getJDA().getRoleById(ale.getTargetId());
+ String mentionableTargetRole = (targetRole != null ? targetRole.getAsMention() : ale.getTargetId());
+
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("Audit Log Entry | Role Create Event");
+ eb.setDescription(MarkdownUtil.quoteBlock("Role Created By: " + mentionableExecutor + "\nTarget Role: " + mentionableTargetRole));
+ eb.setColor(Color.GREEN);
+
+ ale.getChanges().forEach((changeKey, changeValue) -> {
+
+ Object oldValue = changeValue.getOldValue();
+ Object newValue = changeValue.getNewValue();
+
+ switch (changeKey) {
+
+ case "name" -> eb.addField(MarkdownUtil.underline("Role Name"), "╰┈➤" + newValue, false);
+
+ case "colors", "hoist", "color", "permissions", "mentionable" -> {
+ /* discord for some reason shows the following to be default/null even
+ * when you set them during the creation of the role itself
+ * and delegates them to ROLE_UPDATE event
+ */
+ }
+ default -> {
+ eb.addField("Unimplemented Change Key", changeKey, false);
+ log.info("Unimplemented Change Key on Role Create: {}\nOLD_VALUE: {}\nNEW_VALUE: {}", changeKey, oldValue, newValue);
+ }
+ }
+ });
+
+ eb.setFooter("Audit Log Entry ID: " + ale.getId());
+ eb.setTimestamp(ale.getTimeCreated());
+
+ performChecksThenBuildAndSendEmbed(event, eb, channelIdToSendTo);
+ }
+
+ @Override
+ public void onRoleUpdate(@NonNull GuildAuditLogEntryCreateEvent event) {
+ String channelIdToSendTo = getRegisteredGuildChannel(event.getGuild().getId());
+ if (channelIdToSendTo.isBlank()) return;
+
+ AuditLogEntry ale = event.getEntry();
+
+ User executor = ale.getJDA().getUserById(ale.getUserId());
+ String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
+
+ Role targetRole = ale.getJDA().getRoleById(ale.getTargetId());
+ String mentionableTargetRole = (targetRole != null ? targetRole.getAsMention() : ale.getTargetId());
+
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("Audit Log Entry | Role Update Event");
+ eb.setDescription(MarkdownUtil.quoteBlock("Role Updated By: " + mentionableExecutor + "\nTarget Role: " + mentionableTargetRole));
+ eb.setColor(Color.YELLOW);
+
+ ale.getChanges().forEach((changeKey, changeValue) -> {
+
+ Object oldValue = changeValue.getOldValue();
+ Object newValue = changeValue.getNewValue();
+
+ switch (changeKey) {
+
+ case "name" -> {
+ eb.addField(MarkdownUtil.underline("Old Role Name"), "╰┈➤" + oldValue, true);
+ eb.addField(MarkdownUtil.underline("New Role Name"), "╰┈➤" + newValue, true);
+ eb.addBlankField(true);
+ }
+
+ case "hoist" -> {
+ eb.addField(MarkdownUtil.underline("Old Display Separately"), "╰┈➤" + BooleanUtils.formatToYesOrNo(oldValue), true);
+ eb.addField(MarkdownUtil.underline("New Display Separately"), "╰┈➤" + BooleanUtils.formatToYesOrNo(newValue), true);
+ eb.addBlankField(true);
+ }
+
+ case "color" -> {
+ eb.addField(MarkdownUtil.underline("Old Color"), "╰┈➤" + RoleUtils.formatToHex(oldValue), true);
+ eb.addField(MarkdownUtil.underline("New Color"), "╰┈➤" + RoleUtils.formatToHex(newValue), true);
+ eb.addBlankField(true);
+ }
+
+ case "permissions" -> {
+ eb.addField(MarkdownUtil.underline("Old Role Permissions"), RoleUtils.resolveRolePermissions(oldValue, "✅"), true);
+ eb.addField(MarkdownUtil.underline("New Role Permissions"), RoleUtils.resolveRolePermissions(newValue, "✅"), true);
+ eb.addBlankField(true);
+ }
+
+ case "mentionable" -> {
+ eb.addField(MarkdownUtil.underline("Old Mentionable"), "╰┈➤" + BooleanUtils.formatToYesOrNo(oldValue), true);
+ eb.addField(MarkdownUtil.underline("New Mentionable"), "╰┈➤" + BooleanUtils.formatToYesOrNo(newValue), true);
+ eb.addBlankField(true);
+ }
+
+ case "colors" -> {
+ eb.addField(MarkdownUtil.underline("Old Gradient Color System"), RoleUtils.formatGradientToHex(oldValue), true);
+ eb.addField(MarkdownUtil.underline("New Gradient Color System"), RoleUtils.formatGradientToHex(newValue), true);
+ eb.addBlankField(true);
+ }
+
+ default -> {
+ eb.addField("Unimplemented Change Key", changeKey, false);
+ log.info("Unimplemented Change Key on Role Update: {}\nOLD_VALUE: {}\nNEW_VALUE: {}", changeKey, oldValue, newValue);
+ }
+
+ }
+ });
+
+ eb.setFooter("Audit Log Entry ID: " + ale.getId());
+ eb.setTimestamp(ale.getTimeCreated());
+
+ performChecksThenBuildAndSendEmbed(event, eb, channelIdToSendTo);
+ }
+
+ @Override
+ public void onRoleDelete(@NonNull GuildAuditLogEntryCreateEvent event) {
+ String channelIdToSendTo = getRegisteredGuildChannel(event.getGuild().getId());
+ if (channelIdToSendTo.isBlank()) return;
+
+ AuditLogEntry ale = event.getEntry();
+
+ User executor = ale.getJDA().getUserById(ale.getUserId());
+ String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
+
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("Audit Log Entry | Role Delete Event");
+ eb.setDescription(MarkdownUtil.quoteBlock("Role Deleted By: " + mentionableExecutor + "\nTarget Role ID: " + ale.getTargetId()));
+ eb.setColor(Color.RED);
+
+ ale.getChanges().forEach((changeKey, changeValue) -> {
+ Object oldValue = changeValue.getOldValue();
+ Object newValue = changeValue.getNewValue();
+
+ switch (changeKey) {
+
+ case "name" -> eb.addField(MarkdownUtil.underline("Role Name"), "╰┈➤" + oldValue, false);
+
+ case "hoist" ->
+ eb.addField(MarkdownUtil.underline("Display Separately"), "╰┈➤" + BooleanUtils.formatToYesOrNo(oldValue), false);
+
+ case "color" ->
+ eb.addField(MarkdownUtil.underline("Color"), "╰┈➤" + RoleUtils.formatToHex(oldValue), false);
+
+ case "permissions" ->
+ eb.addField(MarkdownUtil.underline("Role Permissions"), RoleUtils.resolveRolePermissions(oldValue, "✅"), false);
+
+ case "mentionable" ->
+ eb.addField(MarkdownUtil.underline("Mentionable"), "╰┈➤" + BooleanUtils.formatToYesOrNo(oldValue), false);
+
+ case "colors" ->
+ eb.addField(MarkdownUtil.underline("Gradient Color System"), RoleUtils.formatGradientToHex(oldValue), false);
+
+ default -> {
+ eb.addField("Unimplemented Change Key", changeKey, false);
+ log.info("Unimplemented Change Key on Role Delete: {}\nOLD_VALUE: {}\nNEW_VALUE: {}", changeKey, oldValue, newValue);
+ }
+ }
+
+ });
+
+ eb.setFooter("Audit Log Entry ID: " + ale.getId());
+ eb.setTimestamp(ale.getTimeCreated());
+
+ performChecksThenBuildAndSendEmbed(event, eb, channelIdToSendTo);
+ }
+}
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/role/RoleCreateEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/role/RoleCreateEventHelper.java
deleted file mode 100644
index 75aabc3..0000000
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/role/RoleCreateEventHelper.java
+++ /dev/null
@@ -1,70 +0,0 @@
-package io.github.eggy03.papertrail.bot.service.auditlog.role;
-
-import lombok.NonNull;
-import lombok.experimental.UtilityClass;
-import lombok.extern.slf4j.Slf4j;
-import net.dv8tion.jda.api.EmbedBuilder;
-import net.dv8tion.jda.api.audit.AuditLogEntry;
-import net.dv8tion.jda.api.entities.Role;
-import net.dv8tion.jda.api.entities.User;
-import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;
-import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
-import net.dv8tion.jda.api.utils.MarkdownUtil;
-
-import java.awt.Color;
-
-@UtilityClass
-@Slf4j
-public class RoleCreateEventHelper {
-
- public static void format(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
-
- AuditLogEntry ale = event.getEntry();
-
- User executor = ale.getJDA().getUserById(ale.getUserId());
- String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
-
- Role targetRole = ale.getJDA().getRoleById(ale.getTargetId());
- String mentionableTargetRole = (targetRole != null ? targetRole.getAsMention() : ale.getTargetId());
-
- EmbedBuilder eb = new EmbedBuilder();
- eb.setTitle("Audit Log Entry | Role Create Event");
- eb.setDescription(MarkdownUtil.quoteBlock("Role Created By: " + mentionableExecutor + "\nTarget Role: " + mentionableTargetRole));
- eb.setColor(Color.GREEN);
-
- ale.getChanges().forEach((changeKey, changeValue) -> {
-
- Object oldValue = changeValue.getOldValue();
- Object newValue = changeValue.getNewValue();
-
- switch (changeKey) {
-
- case "name" -> eb.addField(MarkdownUtil.underline("Role Name"), "╰┈➤" + newValue, false);
-
- case "colors", "hoist", "color", "permissions", "mentionable" -> {
- /* discord for some reason shows the following to be default/null even
- * when you set them during the creation of the role itself
- * and delegates them to ROLE_UPDATE event
- */
- }
- default -> {
- eb.addField("Unimplemented Change Key", changeKey, false);
- log.info("Unimplemented Change Key: {}\nOLD_VALUE: {}\nNEW_VALUE: {}", changeKey, oldValue, newValue);
- }
- }
- });
-
- eb.setFooter("Audit Log Entry ID: " + ale.getId());
- eb.setTimestamp(ale.getTimeCreated());
-
- if (!eb.isValidLength() || eb.isEmpty()) {
- log.warn("Embed is empty or too long (current length: {}).", eb.length());
- return;
- }
-
- TextChannel sendingChannel = event.getGuild().getTextChannelById(channelIdToSendTo);
- if (sendingChannel != null && sendingChannel.canTalk()) {
- sendingChannel.sendMessageEmbeds(eb.build()).queue();
- }
- }
-}
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/role/RoleDeleteEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/role/RoleDeleteEventHelper.java
deleted file mode 100644
index 7fc8646..0000000
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/role/RoleDeleteEventHelper.java
+++ /dev/null
@@ -1,77 +0,0 @@
-package io.github.eggy03.papertrail.bot.service.auditlog.role;
-
-import io.github.eggy03.papertrail.bot.service.auditlog.role.utils.RoleUtils;
-import io.github.eggy03.papertrail.bot.utils.BooleanUtils;
-import lombok.NonNull;
-import lombok.experimental.UtilityClass;
-import lombok.extern.slf4j.Slf4j;
-import net.dv8tion.jda.api.EmbedBuilder;
-import net.dv8tion.jda.api.audit.AuditLogEntry;
-import net.dv8tion.jda.api.entities.User;
-import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;
-import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
-import net.dv8tion.jda.api.utils.MarkdownUtil;
-
-import java.awt.Color;
-
-@UtilityClass
-@Slf4j
-public class RoleDeleteEventHelper {
-
- public static void format(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
-
- AuditLogEntry ale = event.getEntry();
-
- User executor = ale.getJDA().getUserById(ale.getUserId());
- String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
-
- EmbedBuilder eb = new EmbedBuilder();
- eb.setTitle("Audit Log Entry | Role Delete Event");
- eb.setDescription(MarkdownUtil.quoteBlock("Role Deleted By: " + mentionableExecutor + "\nTarget Role ID: " + ale.getTargetId()));
- eb.setColor(Color.RED);
-
- ale.getChanges().forEach((changeKey, changeValue) -> {
- Object oldValue = changeValue.getOldValue();
- Object newValue = changeValue.getNewValue();
-
- switch (changeKey) {
-
- case "name" -> eb.addField(MarkdownUtil.underline("Role Name"), "╰┈➤" + oldValue, false);
-
- case "hoist" ->
- eb.addField(MarkdownUtil.underline("Display Separately"), "╰┈➤" + BooleanUtils.formatToYesOrNo(oldValue), false);
-
- case "color" ->
- eb.addField(MarkdownUtil.underline("Color"), "╰┈➤" + RoleUtils.formatToHex(oldValue), false);
-
- case "permissions" ->
- eb.addField(MarkdownUtil.underline("Role Permissions"), RoleUtils.resolveRolePermissions(oldValue, "✅"), false);
-
- case "mentionable" ->
- eb.addField(MarkdownUtil.underline("Mentionable"), "╰┈➤" + BooleanUtils.formatToYesOrNo(oldValue), false);
-
- case "colors" ->
- eb.addField(MarkdownUtil.underline("Gradient Color System"), RoleUtils.formatGradientToHex(oldValue), false);
-
- default -> {
- eb.addField("Unimplemented Change Key", changeKey, false);
- log.info("Unimplemented Change Key: {}\nOLD_VALUE: {}\nNEW_VALUE: {}", changeKey, oldValue, newValue);
- }
- }
-
- });
-
- eb.setFooter("Audit Log Entry ID: " + ale.getId());
- eb.setTimestamp(ale.getTimeCreated());
-
- if (!eb.isValidLength() || eb.isEmpty()) {
- log.warn("Embed is empty or too long (current length: {}).", eb.length());
- return;
- }
-
- TextChannel sendingChannel = event.getGuild().getTextChannelById(channelIdToSendTo);
- if (sendingChannel != null && sendingChannel.canTalk()) {
- sendingChannel.sendMessageEmbeds(eb.build()).queue();
- }
- }
-}
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/role/RoleUpdateEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/role/RoleUpdateEventHelper.java
deleted file mode 100644
index e0777ef..0000000
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/role/RoleUpdateEventHelper.java
+++ /dev/null
@@ -1,101 +0,0 @@
-package io.github.eggy03.papertrail.bot.service.auditlog.role;
-
-import io.github.eggy03.papertrail.bot.service.auditlog.role.utils.RoleUtils;
-import io.github.eggy03.papertrail.bot.utils.BooleanUtils;
-import lombok.NonNull;
-import lombok.experimental.UtilityClass;
-import lombok.extern.slf4j.Slf4j;
-import net.dv8tion.jda.api.EmbedBuilder;
-import net.dv8tion.jda.api.audit.AuditLogEntry;
-import net.dv8tion.jda.api.entities.Role;
-import net.dv8tion.jda.api.entities.User;
-import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;
-import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
-import net.dv8tion.jda.api.utils.MarkdownUtil;
-
-import java.awt.Color;
-
-@UtilityClass
-@Slf4j
-public class RoleUpdateEventHelper {
-
- public static void format(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
-
- AuditLogEntry ale = event.getEntry();
-
- User executor = ale.getJDA().getUserById(ale.getUserId());
- String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
-
- Role targetRole = ale.getJDA().getRoleById(ale.getTargetId());
- String mentionableTargetRole = (targetRole != null ? targetRole.getAsMention() : ale.getTargetId());
-
- EmbedBuilder eb = new EmbedBuilder();
- eb.setTitle("Audit Log Entry | Role Update Event");
- eb.setDescription(MarkdownUtil.quoteBlock("Role Updated By: " + mentionableExecutor + "\nTarget Role: " + mentionableTargetRole));
- eb.setColor(Color.YELLOW);
-
- ale.getChanges().forEach((changeKey, changeValue) -> {
-
- Object oldValue = changeValue.getOldValue();
- Object newValue = changeValue.getNewValue();
-
- switch (changeKey) {
-
- case "name" -> {
- eb.addField(MarkdownUtil.underline("Old Role Name"), "╰┈➤" + oldValue, true);
- eb.addField(MarkdownUtil.underline("New Role Name"), "╰┈➤" + newValue, true);
- eb.addBlankField(true);
- }
-
- case "hoist" -> {
- eb.addField(MarkdownUtil.underline("Old Display Separately"), "╰┈➤" + BooleanUtils.formatToYesOrNo(oldValue), true);
- eb.addField(MarkdownUtil.underline("New Display Separately"), "╰┈➤" + BooleanUtils.formatToYesOrNo(newValue), true);
- eb.addBlankField(true);
- }
-
- case "color" -> {
- eb.addField(MarkdownUtil.underline("Old Color"), "╰┈➤" + RoleUtils.formatToHex(oldValue), true);
- eb.addField(MarkdownUtil.underline("New Color"), "╰┈➤" + RoleUtils.formatToHex(newValue), true);
- eb.addBlankField(true);
- }
-
- case "permissions" -> {
- eb.addField(MarkdownUtil.underline("Old Role Permissions"), RoleUtils.resolveRolePermissions(oldValue, "✅"), true);
- eb.addField(MarkdownUtil.underline("New Role Permissions"), RoleUtils.resolveRolePermissions(newValue, "✅"), true);
- eb.addBlankField(true);
- }
-
- case "mentionable" -> {
- eb.addField(MarkdownUtil.underline("Old Mentionable"), "╰┈➤" + BooleanUtils.formatToYesOrNo(oldValue), true);
- eb.addField(MarkdownUtil.underline("New Mentionable"), "╰┈➤" + BooleanUtils.formatToYesOrNo(newValue), true);
- eb.addBlankField(true);
- }
-
- case "colors" -> {
- eb.addField(MarkdownUtil.underline("Old Gradient Color System"), RoleUtils.formatGradientToHex(oldValue), true);
- eb.addField(MarkdownUtil.underline("New Gradient Color System"), RoleUtils.formatGradientToHex(newValue), true);
- eb.addBlankField(true);
- }
-
- default -> {
- eb.addField("Unimplemented Change Key", changeKey, false);
- log.info("Unimplemented Change Key: {}\nOLD_VALUE: {}\nNEW_VALUE: {}", changeKey, oldValue, newValue);
- }
-
- }
- });
-
- eb.setFooter("Audit Log Entry ID: " + ale.getId());
- eb.setTimestamp(ale.getTimeCreated());
-
- if (!eb.isValidLength() || eb.isEmpty()) {
- log.warn("Embed is empty or too long (current length: {}).", eb.length());
- return;
- }
-
- TextChannel sendingChannel = event.getGuild().getTextChannelById(channelIdToSendTo);
- if (sendingChannel != null && sendingChannel.canTalk()) {
- sendingChannel.sendMessageEmbeds(eb.build()).queue();
- }
- }
-}
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/role/utils/RoleUtils.java b/src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/RoleUtils.java
similarity index 97%
rename from src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/role/utils/RoleUtils.java
rename to src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/RoleUtils.java
index 5162434..ba3e208 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/role/utils/RoleUtils.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/RoleUtils.java
@@ -1,4 +1,4 @@
-package io.github.eggy03.papertrail.bot.service.auditlog.role.utils;
+package io.github.eggy03.papertrail.bot.utils.auditlog;
import io.github.eggy03.papertrail.bot.utils.NumberParseUtils;
import lombok.NonNull;
From 7f224105ff8cab1cf61d27cc072047e6bec0e676 Mon Sep 17 00:00:00 2001
From: Egg-03 <111327101+eggy03@users.noreply.github.com>
Date: Sun, 31 May 2026 09:27:50 +0530
Subject: [PATCH 22/66] refactor(emojievents): merge helpers into
EmojiEventHandler
- merge three helper classes from thread subpackage into `EmojiEventHandler`
Signed-off-by: Egg-03 <111327101+eggy03@users.noreply.github.com>
---
.../service/auditlog/EmojiEventHandler.java | 156 ++++++++++++++++++
.../emoji/EmojiCreateEventHelper.java | 58 -------
.../emoji/EmojiDeleteEventHelper.java | 58 -------
.../emoji/EmojiUpdateEventHelper.java | 59 -------
4 files changed, 156 insertions(+), 175 deletions(-)
create mode 100644 src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/EmojiEventHandler.java
delete mode 100644 src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/emoji/EmojiCreateEventHelper.java
delete mode 100644 src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/emoji/EmojiDeleteEventHelper.java
delete mode 100644 src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/emoji/EmojiUpdateEventHelper.java
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/EmojiEventHandler.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/EmojiEventHandler.java
new file mode 100644
index 0000000..7775844
--- /dev/null
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/EmojiEventHandler.java
@@ -0,0 +1,156 @@
+package io.github.eggy03.papertrail.bot.service.auditlog;
+
+import io.github.eggy03.papertrail.bot.listeners.auditlog.GuildAuditLogEntryCreateEventHandler;
+import io.github.eggy03.papertrail.sdk.client.AuditLogRegistrationClient;
+import io.github.eggy03.papertrail.sdk.entity.AuditLogRegistrationEntity;
+import jakarta.enterprise.context.ApplicationScoped;
+import jakarta.inject.Inject;
+import lombok.NonNull;
+import lombok.extern.slf4j.Slf4j;
+import net.dv8tion.jda.api.EmbedBuilder;
+import net.dv8tion.jda.api.audit.AuditLogEntry;
+import net.dv8tion.jda.api.entities.User;
+import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;
+import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
+import net.dv8tion.jda.api.utils.MarkdownUtil;
+import org.apache.commons.lang3.StringUtils;
+
+import java.awt.Color;
+
+@ApplicationScoped
+@Slf4j
+@SuppressWarnings("java:S1192")
+public class EmojiEventHandler extends GuildAuditLogEntryCreateEventHandler {
+
+ private final @NonNull AuditLogRegistrationClient client;
+
+ @Inject
+ public EmojiEventHandler(@NonNull AuditLogRegistrationClient client) {
+ this.client = client;
+ }
+
+ @NonNull
+ private String getRegisteredGuildChannel(@NonNull String guildId) {
+ return client.getRegisteredGuild(guildId)
+ .map(AuditLogRegistrationEntity::getChannelId).orElse(StringUtils.EMPTY);
+
+ }
+
+ private void performChecksThenBuildAndSendEmbed(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull EmbedBuilder embedBuilder, @NonNull String channelIdToSendTo) {
+ if (!embedBuilder.isValidLength() || embedBuilder.isEmpty()) {
+ log.warn("Embed is empty or too long (current length: {}).", embedBuilder.length());
+ return;
+ }
+
+ TextChannel sendingChannel = event.getGuild().getTextChannelById(channelIdToSendTo);
+ if (sendingChannel != null && sendingChannel.canTalk()) {
+ sendingChannel.sendMessageEmbeds(embedBuilder.build()).queue();
+ }
+ }
+
+ @Override
+ public void onEmojiCreate(@NonNull GuildAuditLogEntryCreateEvent event) {
+ String channelIdToSendTo = getRegisteredGuildChannel(event.getGuild().getId());
+ if (channelIdToSendTo.isBlank()) return;
+
+ AuditLogEntry ale = event.getEntry();
+
+ User executor = ale.getJDA().getUserById(ale.getUserIdLong());
+ String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
+
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("Audit Log Entry | Emoji Create Event");
+ eb.setDescription(MarkdownUtil.quoteBlock("Emoji Created By: " + mentionableExecutor));
+ eb.setColor(Color.GREEN);
+
+ ale.getChanges().forEach((changeKey, changeValue) -> {
+
+ Object oldValue = changeValue.getOldValue();
+ Object newValue = changeValue.getNewValue();
+
+ if (changeKey.equals("name")) {
+ eb.addField(MarkdownUtil.underline("Emoji Name"), "╰┈➤" + newValue, false);
+ eb.addField(MarkdownUtil.underline("Emoji"), "╰┈➤" + "<:" + newValue + ":" + ale.getTargetId() + ">", false); // ale's TargetID retrieves the ID of the created emoji
+ } else {
+ eb.addField("Unimplemented Change Key", changeKey, false);
+ log.info("Unimplemented Change Key on Emoji Create: {}\nOLD_VALUE: {}\nNEW_VALUE: {}", changeKey, oldValue, newValue);
+ }
+ });
+
+ eb.setFooter("Audit Log Entry ID: " + ale.getId());
+ eb.setTimestamp(ale.getTimeCreated());
+
+ performChecksThenBuildAndSendEmbed(event, eb, channelIdToSendTo);
+ }
+
+ @Override
+ public void onEmojiUpdate(@NonNull GuildAuditLogEntryCreateEvent event) {
+ String channelIdToSendTo = getRegisteredGuildChannel(event.getGuild().getId());
+ if (channelIdToSendTo.isBlank()) return;
+
+ AuditLogEntry ale = event.getEntry();
+
+ User executor = ale.getJDA().getUserById(ale.getUserIdLong());
+ String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
+
+
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("Audit Log Entry | Emoji Update Event");
+ eb.setDescription(MarkdownUtil.quoteBlock("Emoji Updated By: " + mentionableExecutor));
+ eb.setColor(Color.YELLOW);
+
+ ale.getChanges().forEach((changeKey, changeValue) -> {
+
+ Object oldValue = changeValue.getOldValue();
+ Object newValue = changeValue.getNewValue();
+
+ if (changeKey.equals("name")) {
+ eb.addField(MarkdownUtil.underline("Emoji Name Updated"), "╰┈➤" + "From " + oldValue + " to " + newValue, false);
+ eb.addField(MarkdownUtil.underline("Target Emoji"), "╰┈➤" + "<:" + newValue + ":" + ale.getTargetId() + ">", false);
+ } else {
+ eb.addField("Unimplemented Change Key", changeKey, false);
+ log.info("Unimplemented Change Key on Emoji Update: {}\nOLD_VALUE: {}\nNEW_VALUE: {}", changeKey, oldValue, newValue);
+ }
+ });
+
+ eb.setFooter("Audit Log Entry ID: " + ale.getId());
+ eb.setTimestamp(ale.getTimeCreated());
+
+ performChecksThenBuildAndSendEmbed(event, eb, channelIdToSendTo);
+ }
+
+ @Override
+ public void onEmojiDelete(@NonNull GuildAuditLogEntryCreateEvent event) {
+ String channelIdToSendTo = getRegisteredGuildChannel(event.getGuild().getId());
+ if (channelIdToSendTo.isBlank()) return;
+
+ AuditLogEntry ale = event.getEntry();
+
+ User executor = ale.getJDA().getUserById(ale.getUserIdLong());
+ String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
+
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("Audit Log Entry | Emoji Delete Event");
+ eb.setDescription(MarkdownUtil.quoteBlock("Emoji Deleted By: " + mentionableExecutor));
+ eb.setColor(Color.RED);
+
+ ale.getChanges().forEach((changeKey, changeValue) -> {
+
+ Object oldValue = changeValue.getOldValue();
+ Object newValue = changeValue.getNewValue();
+
+ if (changeKey.equals("name")) {
+ eb.addField(MarkdownUtil.underline("Emoji Name"), "╰┈➤" + oldValue, false);
+ } else {
+ eb.addField("Unimplemented Change Key", changeKey, false);
+ log.info("Unimplemented Change Key on Emoji Delete: {}\nOLD_VALUE: {}\nNEW_VALUE: {}", changeKey, oldValue, newValue);
+ }
+ });
+ eb.addField("Deleted Emoji ID", "╰┈➤" + ale.getTargetId(), false);
+
+ eb.setFooter("Audit Log Entry ID: " + ale.getId());
+ eb.setTimestamp(ale.getTimeCreated());
+
+ performChecksThenBuildAndSendEmbed(event, eb, channelIdToSendTo);
+ }
+}
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/emoji/EmojiCreateEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/emoji/EmojiCreateEventHelper.java
deleted file mode 100644
index 9420ec1..0000000
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/emoji/EmojiCreateEventHelper.java
+++ /dev/null
@@ -1,58 +0,0 @@
-package io.github.eggy03.papertrail.bot.service.auditlog.emoji;
-
-import lombok.NonNull;
-import lombok.experimental.UtilityClass;
-import lombok.extern.slf4j.Slf4j;
-import net.dv8tion.jda.api.EmbedBuilder;
-import net.dv8tion.jda.api.audit.AuditLogEntry;
-import net.dv8tion.jda.api.entities.User;
-import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;
-import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
-import net.dv8tion.jda.api.utils.MarkdownUtil;
-
-import java.awt.Color;
-
-@UtilityClass
-@Slf4j
-public class EmojiCreateEventHelper {
-
- public static void format(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
-
- AuditLogEntry ale = event.getEntry();
-
- User executor = ale.getJDA().getUserById(ale.getUserIdLong());
- String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
-
- EmbedBuilder eb = new EmbedBuilder();
- eb.setTitle("Audit Log Entry | Emoji Create Event");
- eb.setDescription(MarkdownUtil.quoteBlock("Emoji Created By: " + mentionableExecutor));
- eb.setColor(Color.GREEN);
-
- ale.getChanges().forEach((changeKey, changeValue) -> {
-
- Object oldValue = changeValue.getOldValue();
- Object newValue = changeValue.getNewValue();
-
- if (changeKey.equals("name")) {
- eb.addField(MarkdownUtil.underline("Emoji Name"), "╰┈➤" + newValue, false);
- eb.addField(MarkdownUtil.underline("Emoji"), "╰┈➤" + "<:" + newValue + ":" + ale.getTargetId() + ">", false); // ale's TargetID retrieves the ID of the created emoji
- } else {
- eb.addField("Unimplemented Change Key", changeKey, false);
- log.info("Unimplemented Change Key: {}\nOLD_VALUE: {}\nNEW_VALUE: {}", changeKey, oldValue, newValue);
- }
- });
-
- eb.setFooter("Audit Log Entry ID: " + ale.getId());
- eb.setTimestamp(ale.getTimeCreated());
-
- if (!eb.isValidLength() || eb.isEmpty()) {
- log.warn("Embed is empty or too long (current length: {}).", eb.length());
- return;
- }
-
- TextChannel sendingChannel = event.getGuild().getTextChannelById(channelIdToSendTo);
- if (sendingChannel != null && sendingChannel.canTalk()) {
- sendingChannel.sendMessageEmbeds(eb.build()).queue();
- }
- }
-}
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/emoji/EmojiDeleteEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/emoji/EmojiDeleteEventHelper.java
deleted file mode 100644
index 7c75ff3..0000000
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/emoji/EmojiDeleteEventHelper.java
+++ /dev/null
@@ -1,58 +0,0 @@
-package io.github.eggy03.papertrail.bot.service.auditlog.emoji;
-
-import lombok.NonNull;
-import lombok.experimental.UtilityClass;
-import lombok.extern.slf4j.Slf4j;
-import net.dv8tion.jda.api.EmbedBuilder;
-import net.dv8tion.jda.api.audit.AuditLogEntry;
-import net.dv8tion.jda.api.entities.User;
-import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;
-import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
-import net.dv8tion.jda.api.utils.MarkdownUtil;
-
-import java.awt.Color;
-
-@UtilityClass
-@Slf4j
-public class EmojiDeleteEventHelper {
-
- public static void format(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
-
- AuditLogEntry ale = event.getEntry();
-
- User executor = ale.getJDA().getUserById(ale.getUserIdLong());
- String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
-
- EmbedBuilder eb = new EmbedBuilder();
- eb.setTitle("Audit Log Entry | Emoji Delete Event");
- eb.setDescription(MarkdownUtil.quoteBlock("Emoji Deleted By: " + mentionableExecutor));
- eb.setColor(Color.RED);
-
- ale.getChanges().forEach((changeKey, changeValue) -> {
-
- Object oldValue = changeValue.getOldValue();
- Object newValue = changeValue.getNewValue();
-
- if (changeKey.equals("name")) {
- eb.addField(MarkdownUtil.underline("Emoji Name"), "╰┈➤" + oldValue, false);
- } else {
- eb.addField("Unimplemented Change Key", changeKey, false);
- log.info("Unimplemented Change Key: {}\nOLD_VALUE: {}\nNEW_VALUE: {}", changeKey, oldValue, newValue);
- }
- });
- eb.addField("Deleted Emoji ID", "╰┈➤" + ale.getTargetId(), false);
-
- eb.setFooter("Audit Log Entry ID: " + ale.getId());
- eb.setTimestamp(ale.getTimeCreated());
-
- if (!eb.isValidLength() || eb.isEmpty()) {
- log.warn("Embed is empty or too long (current length: {}).", eb.length());
- return;
- }
-
- TextChannel sendingChannel = event.getGuild().getTextChannelById(channelIdToSendTo);
- if (sendingChannel != null && sendingChannel.canTalk()) {
- sendingChannel.sendMessageEmbeds(eb.build()).queue();
- }
- }
-}
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/emoji/EmojiUpdateEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/emoji/EmojiUpdateEventHelper.java
deleted file mode 100644
index 24261a2..0000000
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/emoji/EmojiUpdateEventHelper.java
+++ /dev/null
@@ -1,59 +0,0 @@
-package io.github.eggy03.papertrail.bot.service.auditlog.emoji;
-
-import lombok.NonNull;
-import lombok.experimental.UtilityClass;
-import lombok.extern.slf4j.Slf4j;
-import net.dv8tion.jda.api.EmbedBuilder;
-import net.dv8tion.jda.api.audit.AuditLogEntry;
-import net.dv8tion.jda.api.entities.User;
-import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;
-import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
-import net.dv8tion.jda.api.utils.MarkdownUtil;
-
-import java.awt.Color;
-
-@UtilityClass
-@Slf4j
-public class EmojiUpdateEventHelper {
-
- public static void format(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
-
- AuditLogEntry ale = event.getEntry();
-
- User executor = ale.getJDA().getUserById(ale.getUserIdLong());
- String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
-
-
- EmbedBuilder eb = new EmbedBuilder();
- eb.setTitle("Audit Log Entry | Emoji Update Event");
- eb.setDescription(MarkdownUtil.quoteBlock("Emoji Updated By: " + mentionableExecutor));
- eb.setColor(Color.YELLOW);
-
- ale.getChanges().forEach((changeKey, changeValue) -> {
-
- Object oldValue = changeValue.getOldValue();
- Object newValue = changeValue.getNewValue();
-
- if (changeKey.equals("name")) {
- eb.addField(MarkdownUtil.underline("Emoji Name Updated"), "╰┈➤" + "From " + oldValue + " to " + newValue, false);
- eb.addField(MarkdownUtil.underline("Target Emoji"), "╰┈➤" + "<:" + newValue + ":" + ale.getTargetId() + ">", false);
- } else {
- eb.addField("Unimplemented Change Key", changeKey, false);
- log.info("Unimplemented Change Key: {}\nOLD_VALUE: {}\nNEW_VALUE: {}", changeKey, oldValue, newValue);
- }
- });
-
- eb.setFooter("Audit Log Entry ID: " + ale.getId());
- eb.setTimestamp(ale.getTimeCreated());
-
- if (!eb.isValidLength() || eb.isEmpty()) {
- log.warn("Embed is empty or too long (current length: {}).", eb.length());
- return;
- }
-
- TextChannel sendingChannel = event.getGuild().getTextChannelById(channelIdToSendTo);
- if (sendingChannel != null && sendingChannel.canTalk()) {
- sendingChannel.sendMessageEmbeds(eb.build()).queue();
- }
- }
-}
From e57443df7836aa5d69e6760ccc30f9fac3d21e29 Mon Sep 17 00:00:00 2001
From: Egg-03 <111327101+eggy03@users.noreply.github.com>
Date: Sun, 31 May 2026 09:43:32 +0530
Subject: [PATCH 23/66] refactor(stickerevents): merge helpers into
StickerEventHandler
- merge three helper classes from thread subpackage into `StickerEventHandler`
- move `StickerUtils` to the utility package
Signed-off-by: Egg-03 <111327101+eggy03@users.noreply.github.com>
---
.../service/auditlog/StickerEventHandler.java | 202 ++++++++++++++++++
.../sticker/StickerCreateEventHelper.java | 73 -------
.../sticker/StickerDeleteEventHelper.java | 73 -------
.../sticker/StickerUpdateEventHelper.java | 79 -------
.../auditlog}/StickerUtils.java | 4 +-
5 files changed, 204 insertions(+), 227 deletions(-)
create mode 100644 src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/StickerEventHandler.java
delete mode 100644 src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/sticker/StickerCreateEventHelper.java
delete mode 100644 src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/sticker/StickerDeleteEventHelper.java
delete mode 100644 src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/sticker/StickerUpdateEventHelper.java
rename src/main/java/io/github/eggy03/papertrail/bot/{service/auditlog/sticker/utils => utils/auditlog}/StickerUtils.java (95%)
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/StickerEventHandler.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/StickerEventHandler.java
new file mode 100644
index 0000000..4b55074
--- /dev/null
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/StickerEventHandler.java
@@ -0,0 +1,202 @@
+package io.github.eggy03.papertrail.bot.service.auditlog;
+
+import io.github.eggy03.papertrail.bot.listeners.auditlog.GuildAuditLogEntryCreateEventHandler;
+import io.github.eggy03.papertrail.bot.utils.auditlog.StickerUtils;
+import io.github.eggy03.papertrail.sdk.client.AuditLogRegistrationClient;
+import io.github.eggy03.papertrail.sdk.entity.AuditLogRegistrationEntity;
+import jakarta.enterprise.context.ApplicationScoped;
+import jakarta.inject.Inject;
+import lombok.NonNull;
+import lombok.extern.slf4j.Slf4j;
+import net.dv8tion.jda.api.EmbedBuilder;
+import net.dv8tion.jda.api.audit.AuditLogEntry;
+import net.dv8tion.jda.api.entities.User;
+import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;
+import net.dv8tion.jda.api.entities.sticker.GuildSticker;
+import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
+import net.dv8tion.jda.api.utils.MarkdownUtil;
+import org.apache.commons.lang3.StringUtils;
+
+import java.awt.Color;
+
+@ApplicationScoped
+@Slf4j
+@SuppressWarnings("java:S1192")
+public class StickerEventHandler extends GuildAuditLogEntryCreateEventHandler {
+
+ private final @NonNull AuditLogRegistrationClient client;
+
+ @Inject
+ public StickerEventHandler(@NonNull AuditLogRegistrationClient client) {
+ this.client = client;
+ }
+
+ @NonNull
+ private String getRegisteredGuildChannel(@NonNull String guildId) {
+ return client.getRegisteredGuild(guildId)
+ .map(AuditLogRegistrationEntity::getChannelId).orElse(StringUtils.EMPTY);
+
+ }
+
+ private void performChecksThenBuildAndSendEmbed(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull EmbedBuilder embedBuilder, @NonNull String channelIdToSendTo) {
+ if (!embedBuilder.isValidLength() || embedBuilder.isEmpty()) {
+ log.warn("Embed is empty or too long (current length: {}).", embedBuilder.length());
+ return;
+ }
+
+ TextChannel sendingChannel = event.getGuild().getTextChannelById(channelIdToSendTo);
+ if (sendingChannel != null && sendingChannel.canTalk()) {
+ sendingChannel.sendMessageEmbeds(embedBuilder.build()).queue();
+ }
+ }
+
+ @Override
+ public void onStickerCreate(@NonNull GuildAuditLogEntryCreateEvent event) {
+ String channelIdToSendTo = getRegisteredGuildChannel(event.getGuild().getId());
+ if (channelIdToSendTo.isBlank()) return;
+
+ AuditLogEntry ale = event.getEntry();
+
+ User executor = ale.getJDA().getUserById(ale.getUserIdLong());
+ String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
+
+ GuildSticker sticker = event.getGuild().getStickerById(ale.getTargetId());
+ String mentionableSticker = (sticker != null ? sticker.getName() : ale.getTargetId());
+
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("Audit Log Entry | Sticker Create Event");
+ eb.setDescription(MarkdownUtil.quoteBlock("Sticker Created By: " + mentionableExecutor + "\nCreated Sticker: " + mentionableSticker));
+ eb.setColor(Color.GREEN);
+
+ ale.getChanges().forEach((changeKey, changeValue) -> {
+ Object oldValue = changeValue.getOldValue();
+ Object newValue = changeValue.getNewValue();
+
+ switch (changeKey) {
+ case "format_type", "type", "asset", "available", "guild_id" -> {
+ // skip
+ }
+ case "id" -> {
+ eb.addField(MarkdownUtil.underline("Sticker ID"), "╰┈➤" + newValue, false);
+ eb.addField(MarkdownUtil.underline("Sticker Link"), "╰┈➤" + StickerUtils.resolveStickerUrl(event, newValue), false);
+ }
+ case "tags" ->
+ eb.addField(MarkdownUtil.underline("Related Emoji"), "╰┈➤" + StickerUtils.resolveRelatedEmoji(event, newValue), false);
+ case "description" -> eb.addField(MarkdownUtil.underline("Description"), "╰┈➤" + newValue, false);
+ case "name" -> eb.addField(MarkdownUtil.underline("Sticker Name"), "╰┈➤" + newValue, false);
+
+ default -> {
+ eb.addField("Unimplemented Change Key", changeKey, false);
+ log.info("Unimplemented Change Key on Sticker Create: {}\nOLD_VALUE: {}\nNEW_VALUE: {}", changeKey, oldValue, newValue);
+ }
+ }
+ });
+
+ eb.setFooter("Audit Log Entry ID: " + ale.getId());
+ eb.setTimestamp(ale.getTimeCreated());
+
+ performChecksThenBuildAndSendEmbed(event, eb, channelIdToSendTo);
+ }
+
+ @Override
+ public void onStickerUpdate(@NonNull GuildAuditLogEntryCreateEvent event) {
+ String channelIdToSendTo = getRegisteredGuildChannel(event.getGuild().getId());
+ if (channelIdToSendTo.isBlank()) return;
+
+ AuditLogEntry ale = event.getEntry();
+
+ User executor = ale.getJDA().getUserById(ale.getUserIdLong());
+ String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
+
+ GuildSticker sticker = event.getGuild().getStickerById(ale.getTargetId());
+ String mentionableSticker = (sticker != null ? sticker.getName() : ale.getTargetId());
+
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("Audit Log Entry | Sticker Update Event");
+ eb.setDescription(MarkdownUtil.quoteBlock("Sticker Updated By: " + mentionableExecutor + "\nUpdated Sticker: " + mentionableSticker));
+ eb.setColor(Color.YELLOW);
+
+ ale.getChanges().forEach((changeKey, changeValue) -> {
+ Object oldValue = changeValue.getOldValue();
+ Object newValue = changeValue.getNewValue();
+
+ switch (changeKey) {
+ case "format_type", "type", "asset", "available", "guild_id", "id" -> {
+ // skip
+ }
+ case "tags" -> {
+ eb.addField(MarkdownUtil.underline("Old Related Emoji"), "╰┈➤" + StickerUtils.resolveRelatedEmoji(event, oldValue), true);
+ eb.addField(MarkdownUtil.underline("New Related Emoji"), "╰┈➤" + StickerUtils.resolveRelatedEmoji(event, newValue), true);
+ eb.addBlankField(true);
+ }
+ case "description" -> {
+ eb.addField(MarkdownUtil.underline("Old Description"), "╰┈➤" + oldValue, true);
+ eb.addField(MarkdownUtil.underline("New Description"), "╰┈➤" + newValue, true);
+ eb.addBlankField(true);
+ }
+ case "name" -> {
+ eb.addField(MarkdownUtil.underline("Old Sticker Name"), "╰┈➤" + oldValue, true);
+ eb.addField(MarkdownUtil.underline("New Sticker Name"), "╰┈➤" + newValue, true);
+ eb.addBlankField(true);
+ }
+ default -> {
+ eb.addField("Unimplemented Change Key", changeKey, false);
+ log.info("Unimplemented Change Key on Sticker Update: {}\nOLD_VALUE: {}\nNEW_VALUE: {}", changeKey, oldValue, newValue);
+ }
+ }
+ });
+
+ eb.setFooter("Audit Log Entry ID: " + ale.getId());
+ eb.setTimestamp(ale.getTimeCreated());
+
+ performChecksThenBuildAndSendEmbed(event, eb, channelIdToSendTo);
+ }
+
+ @Override
+ public void onStickerDelete(@NonNull GuildAuditLogEntryCreateEvent event) {
+ String channelIdToSendTo = getRegisteredGuildChannel(event.getGuild().getId());
+ if (channelIdToSendTo.isBlank()) return;
+
+ AuditLogEntry ale = event.getEntry();
+
+ User executor = ale.getJDA().getUserById(ale.getUserIdLong());
+ String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
+
+ GuildSticker sticker = event.getGuild().getStickerById(ale.getTargetId());
+ String mentionableSticker = (sticker != null ? sticker.getName() : ale.getTargetId());
+
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("Audit Log Entry | Sticker Delete Event");
+ eb.setDescription(MarkdownUtil.quoteBlock("Sticker Deleted By: " + mentionableExecutor + "\nDeleted Sticker ID: " + mentionableSticker));
+ eb.setColor(Color.RED);
+
+ ale.getChanges().forEach((changeKey, changeValue) -> {
+ Object oldValue = changeValue.getOldValue();
+ Object newValue = changeValue.getNewValue();
+
+ switch (changeKey) {
+ case "format_type", "type", "asset", "available", "guild_id" -> {
+ // skip
+ }
+ case "id" -> {
+ eb.addField(MarkdownUtil.underline("Sticker ID"), "╰┈➤" + oldValue, false);
+ eb.addField(MarkdownUtil.underline("Sticker Link"), "╰┈➤" + StickerUtils.resolveStickerUrl(event, oldValue), false);
+ }
+ case "tags" ->
+ eb.addField(MarkdownUtil.underline("Related Emoji"), "╰┈➤" + StickerUtils.resolveRelatedEmoji(event, oldValue), false);
+ case "description" -> eb.addField(MarkdownUtil.underline("Description"), "╰┈➤" + oldValue, false);
+ case "name" -> eb.addField(MarkdownUtil.underline("Sticker Name"), "╰┈➤" + oldValue, false);
+
+ default -> {
+ eb.addField("Unimplemented Change Key", changeKey, false);
+ log.info("Unimplemented Change Key on Sticker Delete: {}\nOLD_VALUE: {}\nNEW_VALUE: {}", changeKey, oldValue, newValue);
+ }
+ }
+ });
+
+ eb.setFooter("Audit Log Entry ID: " + ale.getId());
+ eb.setTimestamp(ale.getTimeCreated());
+
+ performChecksThenBuildAndSendEmbed(event, eb, channelIdToSendTo);
+ }
+}
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/sticker/StickerCreateEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/sticker/StickerCreateEventHelper.java
deleted file mode 100644
index e9ef86c..0000000
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/sticker/StickerCreateEventHelper.java
+++ /dev/null
@@ -1,73 +0,0 @@
-package io.github.eggy03.papertrail.bot.service.auditlog.sticker;
-
-import io.github.eggy03.papertrail.bot.service.auditlog.sticker.utils.StickerUtils;
-import lombok.NonNull;
-import lombok.experimental.UtilityClass;
-import lombok.extern.slf4j.Slf4j;
-import net.dv8tion.jda.api.EmbedBuilder;
-import net.dv8tion.jda.api.audit.AuditLogEntry;
-import net.dv8tion.jda.api.entities.User;
-import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;
-import net.dv8tion.jda.api.entities.sticker.GuildSticker;
-import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
-import net.dv8tion.jda.api.utils.MarkdownUtil;
-
-import java.awt.Color;
-
-@UtilityClass
-@Slf4j
-public class StickerCreateEventHelper {
-
- public static void format(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
-
- AuditLogEntry ale = event.getEntry();
-
- User executor = ale.getJDA().getUserById(ale.getUserIdLong());
- String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
-
- GuildSticker sticker = event.getGuild().getStickerById(ale.getTargetId());
- String mentionableSticker = (sticker != null ? sticker.getName() : ale.getTargetId());
-
- EmbedBuilder eb = new EmbedBuilder();
- eb.setTitle("Audit Log Entry | Sticker Create Event");
- eb.setDescription(MarkdownUtil.quoteBlock("Sticker Created By: " + mentionableExecutor + "\nCreated Sticker: " + mentionableSticker));
- eb.setColor(Color.GREEN);
-
- ale.getChanges().forEach((changeKey, changeValue) -> {
- Object oldValue = changeValue.getOldValue();
- Object newValue = changeValue.getNewValue();
-
- switch (changeKey) {
- case "format_type", "type", "asset", "available", "guild_id" -> {
- // skip
- }
- case "id" -> {
- eb.addField(MarkdownUtil.underline("Sticker ID"), "╰┈➤" + newValue, false);
- eb.addField(MarkdownUtil.underline("Sticker Link"), "╰┈➤" + StickerUtils.resolveStickerUrl(event, newValue), false);
- }
- case "tags" ->
- eb.addField(MarkdownUtil.underline("Related Emoji"), "╰┈➤" + StickerUtils.resolveRelatedEmoji(event, newValue), false);
- case "description" -> eb.addField(MarkdownUtil.underline("Description"), "╰┈➤" + newValue, false);
- case "name" -> eb.addField(MarkdownUtil.underline("Sticker Name"), "╰┈➤" + newValue, false);
-
- default -> {
- eb.addField("Unimplemented Change Key", changeKey, false);
- log.info("Unimplemented Change Key: {}\nOLD_VALUE: {}\nNEW_VALUE: {}", changeKey, oldValue, newValue);
- }
- }
- });
-
- eb.setFooter("Audit Log Entry ID: " + ale.getId());
- eb.setTimestamp(ale.getTimeCreated());
-
- if (!eb.isValidLength() || eb.isEmpty()) {
- log.warn("Embed is empty or too long (current length: {}).", eb.length());
- return;
- }
-
- TextChannel sendingChannel = event.getGuild().getTextChannelById(channelIdToSendTo);
- if (sendingChannel != null && sendingChannel.canTalk()) {
- sendingChannel.sendMessageEmbeds(eb.build()).queue();
- }
- }
-}
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/sticker/StickerDeleteEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/sticker/StickerDeleteEventHelper.java
deleted file mode 100644
index 64ca7b8..0000000
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/sticker/StickerDeleteEventHelper.java
+++ /dev/null
@@ -1,73 +0,0 @@
-package io.github.eggy03.papertrail.bot.service.auditlog.sticker;
-
-import io.github.eggy03.papertrail.bot.service.auditlog.sticker.utils.StickerUtils;
-import lombok.NonNull;
-import lombok.experimental.UtilityClass;
-import lombok.extern.slf4j.Slf4j;
-import net.dv8tion.jda.api.EmbedBuilder;
-import net.dv8tion.jda.api.audit.AuditLogEntry;
-import net.dv8tion.jda.api.entities.User;
-import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;
-import net.dv8tion.jda.api.entities.sticker.GuildSticker;
-import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
-import net.dv8tion.jda.api.utils.MarkdownUtil;
-
-import java.awt.Color;
-
-@UtilityClass
-@Slf4j
-public class StickerDeleteEventHelper {
-
- public static void format(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
-
- AuditLogEntry ale = event.getEntry();
-
- User executor = ale.getJDA().getUserById(ale.getUserIdLong());
- String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
-
- GuildSticker sticker = event.getGuild().getStickerById(ale.getTargetId());
- String mentionableSticker = (sticker != null ? sticker.getName() : ale.getTargetId());
-
- EmbedBuilder eb = new EmbedBuilder();
- eb.setTitle("Audit Log Entry | Sticker Delete Event");
- eb.setDescription(MarkdownUtil.quoteBlock("Sticker Deleted By: " + mentionableExecutor + "\nDeleted Sticker ID: " + mentionableSticker));
- eb.setColor(Color.RED);
-
- ale.getChanges().forEach((changeKey, changeValue) -> {
- Object oldValue = changeValue.getOldValue();
- Object newValue = changeValue.getNewValue();
-
- switch (changeKey) {
- case "format_type", "type", "asset", "available", "guild_id" -> {
- // skip
- }
- case "id" -> {
- eb.addField(MarkdownUtil.underline("Sticker ID"), "╰┈➤" + oldValue, false);
- eb.addField(MarkdownUtil.underline("Sticker Link"), "╰┈➤" + StickerUtils.resolveStickerUrl(event, oldValue), false);
- }
- case "tags" ->
- eb.addField(MarkdownUtil.underline("Related Emoji"), "╰┈➤" + StickerUtils.resolveRelatedEmoji(event, oldValue), false);
- case "description" -> eb.addField(MarkdownUtil.underline("Description"), "╰┈➤" + oldValue, false);
- case "name" -> eb.addField(MarkdownUtil.underline("Sticker Name"), "╰┈➤" + oldValue, false);
-
- default -> {
- eb.addField("Unimplemented Change Key", changeKey, false);
- log.info("Unimplemented Change Key: {}\nOLD_VALUE: {}\nNEW_VALUE: {}", changeKey, oldValue, newValue);
- }
- }
- });
-
- eb.setFooter("Audit Log Entry ID: " + ale.getId());
- eb.setTimestamp(ale.getTimeCreated());
-
- if (!eb.isValidLength() || eb.isEmpty()) {
- log.warn("Embed is empty or too long (current length: {}).", eb.length());
- return;
- }
-
- TextChannel sendingChannel = event.getGuild().getTextChannelById(channelIdToSendTo);
- if (sendingChannel != null && sendingChannel.canTalk()) {
- sendingChannel.sendMessageEmbeds(eb.build()).queue();
- }
- }
-}
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/sticker/StickerUpdateEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/sticker/StickerUpdateEventHelper.java
deleted file mode 100644
index 1bf3200..0000000
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/sticker/StickerUpdateEventHelper.java
+++ /dev/null
@@ -1,79 +0,0 @@
-package io.github.eggy03.papertrail.bot.service.auditlog.sticker;
-
-import io.github.eggy03.papertrail.bot.service.auditlog.sticker.utils.StickerUtils;
-import lombok.NonNull;
-import lombok.experimental.UtilityClass;
-import lombok.extern.slf4j.Slf4j;
-import net.dv8tion.jda.api.EmbedBuilder;
-import net.dv8tion.jda.api.audit.AuditLogEntry;
-import net.dv8tion.jda.api.entities.User;
-import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;
-import net.dv8tion.jda.api.entities.sticker.GuildSticker;
-import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
-import net.dv8tion.jda.api.utils.MarkdownUtil;
-
-import java.awt.Color;
-
-@UtilityClass
-@Slf4j
-public class StickerUpdateEventHelper {
-
- public static void format(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
-
- AuditLogEntry ale = event.getEntry();
-
- User executor = ale.getJDA().getUserById(ale.getUserIdLong());
- String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
-
- GuildSticker sticker = event.getGuild().getStickerById(ale.getTargetId());
- String mentionableSticker = (sticker != null ? sticker.getName() : ale.getTargetId());
-
- EmbedBuilder eb = new EmbedBuilder();
- eb.setTitle("Audit Log Entry | Sticker Update Event");
- eb.setDescription(MarkdownUtil.quoteBlock("Sticker Updated By: " + mentionableExecutor + "\nUpdated Sticker: " + mentionableSticker));
- eb.setColor(Color.YELLOW);
-
- ale.getChanges().forEach((changeKey, changeValue) -> {
- Object oldValue = changeValue.getOldValue();
- Object newValue = changeValue.getNewValue();
-
- switch (changeKey) {
- case "format_type", "type", "asset", "available", "guild_id", "id" -> {
- // skip
- }
- case "tags" -> {
- eb.addField(MarkdownUtil.underline("Old Related Emoji"), "╰┈➤" + StickerUtils.resolveRelatedEmoji(event, oldValue), true);
- eb.addField(MarkdownUtil.underline("New Related Emoji"), "╰┈➤" + StickerUtils.resolveRelatedEmoji(event, newValue), true);
- eb.addBlankField(true);
- }
- case "description" -> {
- eb.addField(MarkdownUtil.underline("Old Description"), "╰┈➤" + oldValue, true);
- eb.addField(MarkdownUtil.underline("New Description"), "╰┈➤" + newValue, true);
- eb.addBlankField(true);
- }
- case "name" -> {
- eb.addField(MarkdownUtil.underline("Old Sticker Name"), "╰┈➤" + oldValue, true);
- eb.addField(MarkdownUtil.underline("New Sticker Name"), "╰┈➤" + newValue, true);
- eb.addBlankField(true);
- }
- default -> {
- eb.addField("Unimplemented Change Key", changeKey, false);
- log.info("Unimplemented Change Key: {}\nOLD_VALUE: {}\nNEW_VALUE: {}", changeKey, oldValue, newValue);
- }
- }
- });
-
- eb.setFooter("Audit Log Entry ID: " + ale.getId());
- eb.setTimestamp(ale.getTimeCreated());
-
- if (!eb.isValidLength() || eb.isEmpty()) {
- log.warn("Embed is empty or too long (current length: {}).", eb.length());
- return;
- }
-
- TextChannel sendingChannel = event.getGuild().getTextChannelById(channelIdToSendTo);
- if (sendingChannel != null && sendingChannel.canTalk()) {
- sendingChannel.sendMessageEmbeds(eb.build()).queue();
- }
- }
-}
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/sticker/utils/StickerUtils.java b/src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/StickerUtils.java
similarity index 95%
rename from src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/sticker/utils/StickerUtils.java
rename to src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/StickerUtils.java
index cae906c..e5ad699 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/sticker/utils/StickerUtils.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/StickerUtils.java
@@ -1,4 +1,4 @@
-package io.github.eggy03.papertrail.bot.service.auditlog.sticker.utils;
+package io.github.eggy03.papertrail.bot.utils.auditlog;
import lombok.NonNull;
import lombok.experimental.UtilityClass;
@@ -59,7 +59,7 @@ public static String resolveRelatedEmoji(@NonNull GenericGuildEvent event, @Null
}
return emoji.getFormatted();
- } catch (NumberFormatException e) {
+ } catch (NumberFormatException _) {
log.debug("value is not numeric, treating as Unicode (value={}, auditlogsupl={})", emojiIdString, event.getGuild().getId());
return emojiIdString;
}
From 6e98a61fb511911950e130deaf39804975a40675 Mon Sep 17 00:00:00 2001
From: Egg-03 <111327101+eggy03@users.noreply.github.com>
Date: Sun, 31 May 2026 09:54:42 +0530
Subject: [PATCH 24/66] feat(auditlog): implement basic logging for prune
events
- Implement basic embed logging for prune events in `ModActionEventHandler.java`
- Send a placeholder embed notification with an implementation notice when a prune event occurs
Signed-off-by: Egg-03 <111327101+eggy03@users.noreply.github.com>
---
.../auditlog/ModActionEventHandler.java | 21 ++++++++++++++++++-
1 file changed, 20 insertions(+), 1 deletion(-)
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/ModActionEventHandler.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/ModActionEventHandler.java
index 3582d2a..0921583 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/ModActionEventHandler.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/ModActionEventHandler.java
@@ -168,6 +168,25 @@ public void onBotAdd(@NonNull GuildAuditLogEntryCreateEvent event) {
@Override
public void onPrune(@NonNull GuildAuditLogEntryCreateEvent event) {
// I have never seen a prune event trigger yet
- log.warn("Unimplemented Prune Event Detected\n{}", event.getEntry().getChanges());
+ log.warn("Prune Event Detected\n{}", event.getEntry().getChanges());
+
+ String channelIdToSendTo = getRegisteredGuildChannel(event.getGuild().getId());
+ if (channelIdToSendTo.isBlank()) return;
+
+ AuditLogEntry ale = event.getEntry();
+
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("Audit Log Entry | Prune Event");
+ eb.setColor(Color.LIGHT_GRAY);
+
+ String implementationNotice = "We do not have sufficient payload data to log the changes in a PRUNE Event."
+ .concat(" A proper implementation might happen in future releases");
+
+ eb.addField("Implementation Notice", MarkdownUtil.codeblock(implementationNotice), false);
+
+ eb.setFooter("Audit Log Entry ID: " + ale.getId());
+ eb.setTimestamp(ale.getTimeCreated());
+
+ performChecksThenBuildAndSendEmbed(event, eb, channelIdToSendTo);
}
}
From e65f183004478d3e6a27c0479785b1269cbed8fa Mon Sep 17 00:00:00 2001
From: Egg-03 <111327101+eggy03@users.noreply.github.com>
Date: Sun, 31 May 2026 11:23:15 +0530
Subject: [PATCH 25/66] refactor(guildupdateevents): merge helpers into
GuildUpdateEventHandler
- merge three helper classes from thread subpackage into `GuildUpdateEventHandler`
- move `GuildUtils` to the utility package
Signed-off-by: Egg-03 <111327101+eggy03@users.noreply.github.com>
---
...lper.java => GuildUpdateEventHandler.java} | 91 ++++++++++++++++---
.../guild/GuildProfileUpdateEventHelper.java | 57 ------------
.../utils => utils/auditlog}/GuildUtils.java | 2 +-
3 files changed, 77 insertions(+), 73 deletions(-)
rename src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/{guild/GuildUpdateEventHelper.java => GuildUpdateEventHandler.java} (60%)
delete mode 100644 src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/guild/GuildProfileUpdateEventHelper.java
rename src/main/java/io/github/eggy03/papertrail/bot/{service/auditlog/guild/utils => utils/auditlog}/GuildUtils.java (98%)
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/guild/GuildUpdateEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/GuildUpdateEventHandler.java
similarity index 60%
rename from src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/guild/GuildUpdateEventHelper.java
rename to src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/GuildUpdateEventHandler.java
index 41acdce..defedc0 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/guild/GuildUpdateEventHelper.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/GuildUpdateEventHandler.java
@@ -1,10 +1,14 @@
-package io.github.eggy03.papertrail.bot.service.auditlog.guild;
+package io.github.eggy03.papertrail.bot.service.auditlog;
-import io.github.eggy03.papertrail.bot.service.auditlog.guild.utils.GuildUtils;
+import io.github.eggy03.papertrail.bot.listeners.auditlog.GuildAuditLogEntryCreateEventHandler;
import io.github.eggy03.papertrail.bot.utils.BooleanUtils;
import io.github.eggy03.papertrail.bot.utils.DurationUtils;
+import io.github.eggy03.papertrail.bot.utils.auditlog.GuildUtils;
+import io.github.eggy03.papertrail.sdk.client.AuditLogRegistrationClient;
+import io.github.eggy03.papertrail.sdk.entity.AuditLogRegistrationEntity;
+import jakarta.enterprise.context.ApplicationScoped;
+import jakarta.inject.Inject;
import lombok.NonNull;
-import lombok.experimental.UtilityClass;
import lombok.extern.slf4j.Slf4j;
import net.dv8tion.jda.api.EmbedBuilder;
import net.dv8tion.jda.api.audit.AuditLogEntry;
@@ -12,14 +16,45 @@
import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;
import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
import net.dv8tion.jda.api.utils.MarkdownUtil;
+import org.apache.commons.lang3.StringUtils;
import java.awt.Color;
-@UtilityClass
+@ApplicationScoped
@Slf4j
-public class GuildUpdateEventHelper {
+@SuppressWarnings("java:S1192")
+public class GuildUpdateEventHandler extends GuildAuditLogEntryCreateEventHandler {
- public static void format(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
+ private final @NonNull AuditLogRegistrationClient client;
+
+ @Inject
+ public GuildUpdateEventHandler(@NonNull AuditLogRegistrationClient client) {
+ this.client = client;
+ }
+
+ @NonNull
+ private String getRegisteredGuildChannel(@NonNull String guildId) {
+ return client.getRegisteredGuild(guildId)
+ .map(AuditLogRegistrationEntity::getChannelId).orElse(StringUtils.EMPTY);
+
+ }
+
+ private void performChecksThenBuildAndSendEmbed(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull EmbedBuilder embedBuilder, @NonNull String channelIdToSendTo) {
+ if (!embedBuilder.isValidLength() || embedBuilder.isEmpty()) {
+ log.warn("Embed is empty or too long (current length: {}).", embedBuilder.length());
+ return;
+ }
+
+ TextChannel sendingChannel = event.getGuild().getTextChannelById(channelIdToSendTo);
+ if (sendingChannel != null && sendingChannel.canTalk()) {
+ sendingChannel.sendMessageEmbeds(embedBuilder.build()).queue();
+ }
+ }
+
+ @Override
+ public void onGuildUpdate(@NonNull GuildAuditLogEntryCreateEvent event) {
+ String channelIdToSendTo = getRegisteredGuildChannel(event.getGuild().getId());
+ if (channelIdToSendTo.isBlank()) return;
AuditLogEntry ale = event.getEntry();
@@ -99,7 +134,7 @@ public static void format(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull
default -> {
eb.addField("Unimplemented Change Key", changeKey, false);
- log.info("Unimplemented Change Key: {}\nOLD_VALUE: {}\nNEW_VALUE: {}", changeKey, oldValue, newValue);
+ log.info("Unimplemented Change Key for Guild Update: {}\nOLD_VALUE: {}\nNEW_VALUE: {}", changeKey, oldValue, newValue);
}
}
});
@@ -107,14 +142,40 @@ public static void format(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull
eb.setFooter("Audit Log Entry ID: " + ale.getId());
eb.setTimestamp(ale.getTimeCreated());
- if (!eb.isValidLength() || eb.isEmpty()) {
- log.warn("Embed is empty or too long (current length: {}).", eb.length());
- return;
- }
+ performChecksThenBuildAndSendEmbed(event, eb, channelIdToSendTo);
+ }
- TextChannel sendingChannel = event.getGuild().getTextChannelById(channelIdToSendTo);
- if (sendingChannel != null && sendingChannel.canTalk()) {
- sendingChannel.sendMessageEmbeds(eb.build()).queue();
- }
+ @Override
+ public void onGuildProfileUpdate(@NonNull GuildAuditLogEntryCreateEvent event) {
+ String channelIdToSendTo = getRegisteredGuildChannel(event.getGuild().getId());
+ if (channelIdToSendTo.isBlank()) return;
+
+ AuditLogEntry ale = event.getEntry();
+
+ User executor = ale.getJDA().getUserById(ale.getUserIdLong());
+ String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
+
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("Audit Log Entry | Guild Profile Update Event");
+ eb.setDescription(MarkdownUtil.quoteBlock("Guild Profile Updated By: " + mentionableExecutor + "\nTarget Guild: " + event.getGuild().getName()));
+ eb.setColor(Color.PINK);
+
+ ale.getChanges().keySet().forEach(key -> {
+ switch (key) {
+ case "traits" ->
+ eb.addField(MarkdownUtil.underline("Server Traits"), "╰┈➤Server Traits have been updated", false);
+ case "visibility" ->
+ eb.addField(MarkdownUtil.underline("Visibility"), "╰┈➤Profile Visibility has been changed", false);
+ case "brand_color_primary" ->
+ eb.addField(MarkdownUtil.underline("Banner Color"), "╰┈➤Banner Color has been updated", false);
+ case "game_application_ids" ->
+ eb.addField(MarkdownUtil.underline("Games"), "╰┈➤Games have been updated", false);
+ default -> eb.addField(MarkdownUtil.underline(key), "╰┈➤" + key + " has/have been updated", false);
+ }
+ });
+ eb.setFooter("Audit Log Entry ID: " + ale.getId());
+ eb.setTimestamp(ale.getTimeCreated());
+
+ performChecksThenBuildAndSendEmbed(event, eb, channelIdToSendTo);
}
}
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/guild/GuildProfileUpdateEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/guild/GuildProfileUpdateEventHelper.java
deleted file mode 100644
index 03a9900..0000000
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/guild/GuildProfileUpdateEventHelper.java
+++ /dev/null
@@ -1,57 +0,0 @@
-package io.github.eggy03.papertrail.bot.service.auditlog.guild;
-
-import lombok.NonNull;
-import lombok.experimental.UtilityClass;
-import lombok.extern.slf4j.Slf4j;
-import net.dv8tion.jda.api.EmbedBuilder;
-import net.dv8tion.jda.api.audit.AuditLogEntry;
-import net.dv8tion.jda.api.entities.User;
-import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;
-import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
-import net.dv8tion.jda.api.utils.MarkdownUtil;
-
-import java.awt.Color;
-
-@UtilityClass
-@Slf4j
-public class GuildProfileUpdateEventHelper {
-
- public static void format(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
-
- AuditLogEntry ale = event.getEntry();
-
- User executor = ale.getJDA().getUserById(ale.getUserIdLong());
- String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
-
- EmbedBuilder eb = new EmbedBuilder();
- eb.setTitle("Audit Log Entry | Guild Profile Update Event");
- eb.setDescription(MarkdownUtil.quoteBlock("Guild Profile Updated By: " + mentionableExecutor + "\nTarget Guild: " + event.getGuild().getName()));
- eb.setColor(Color.PINK);
-
- ale.getChanges().keySet().forEach(key -> {
- switch (key) {
- case "traits" ->
- eb.addField(MarkdownUtil.underline("Server Traits"), "╰┈➤Server Traits have been updated", false);
- case "visibility" ->
- eb.addField(MarkdownUtil.underline("Visibility"), "╰┈➤Profile Visibility has been changed", false);
- case "brand_color_primary" ->
- eb.addField(MarkdownUtil.underline("Banner Color"), "╰┈➤Banner Color has been updated", false);
- case "game_application_ids" ->
- eb.addField(MarkdownUtil.underline("Games"), "╰┈➤Games have been updated", false);
- default -> eb.addField(MarkdownUtil.underline(key), "╰┈➤" + key + " has/have been updated", false);
- }
- });
- eb.setFooter("Audit Log Entry ID: " + ale.getId());
- eb.setTimestamp(ale.getTimeCreated());
-
- if (!eb.isValidLength() || eb.isEmpty()) {
- log.warn("Embed is empty or too long (current length: {}).", eb.length());
- return;
- }
-
- TextChannel sendingChannel = event.getGuild().getTextChannelById(channelIdToSendTo);
- if (sendingChannel != null && sendingChannel.canTalk()) {
- sendingChannel.sendMessageEmbeds(eb.build()).queue();
- }
- }
-}
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/guild/utils/GuildUtils.java b/src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/GuildUtils.java
similarity index 98%
rename from src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/guild/utils/GuildUtils.java
rename to src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/GuildUtils.java
index 20db634..bae9499 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/guild/utils/GuildUtils.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/GuildUtils.java
@@ -1,4 +1,4 @@
-package io.github.eggy03.papertrail.bot.service.auditlog.guild.utils;
+package io.github.eggy03.papertrail.bot.utils.auditlog;
import io.github.eggy03.papertrail.bot.utils.NumberParseUtils;
import lombok.NonNull;
From b3cd6e7692b21b269975fd8e831ccef387d5ce62 Mon Sep 17 00:00:00 2001
From: Egg-03 <111327101+eggy03@users.noreply.github.com>
Date: Sun, 31 May 2026 11:25:36 +0530
Subject: [PATCH 26/66] refactor(homesettingseevents): merge helpers into
HomeSettingsEventHandler
- merge three helper classes from thread subpackage into `HomeSettingsEventHandler`
Signed-off-by: Egg-03 <111327101+eggy03@users.noreply.github.com>
---
.../auditlog/HomeSettingsEventHandler.java | 110 ++++++++++++++++++
.../HomeSettingsCreateEventHelper.java | 51 --------
.../HomeSettingsUpdateEventHelper.java | 57 ---------
3 files changed, 110 insertions(+), 108 deletions(-)
create mode 100644 src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/HomeSettingsEventHandler.java
delete mode 100644 src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/homesettings/HomeSettingsCreateEventHelper.java
delete mode 100644 src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/homesettings/HomeSettingsUpdateEventHelper.java
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/HomeSettingsEventHandler.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/HomeSettingsEventHandler.java
new file mode 100644
index 0000000..5e67325
--- /dev/null
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/HomeSettingsEventHandler.java
@@ -0,0 +1,110 @@
+package io.github.eggy03.papertrail.bot.service.auditlog;
+
+import io.github.eggy03.papertrail.bot.listeners.auditlog.GuildAuditLogEntryCreateEventHandler;
+import io.github.eggy03.papertrail.sdk.client.AuditLogRegistrationClient;
+import io.github.eggy03.papertrail.sdk.entity.AuditLogRegistrationEntity;
+import jakarta.enterprise.context.ApplicationScoped;
+import jakarta.inject.Inject;
+import lombok.NonNull;
+import lombok.extern.slf4j.Slf4j;
+import net.dv8tion.jda.api.EmbedBuilder;
+import net.dv8tion.jda.api.audit.AuditLogEntry;
+import net.dv8tion.jda.api.entities.User;
+import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;
+import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
+import net.dv8tion.jda.api.utils.MarkdownUtil;
+import org.apache.commons.lang3.StringUtils;
+
+import java.awt.Color;
+
+@ApplicationScoped
+@Slf4j
+@SuppressWarnings("java:S1192")
+public class HomeSettingsEventHandler extends GuildAuditLogEntryCreateEventHandler {
+
+ private final @NonNull AuditLogRegistrationClient client;
+
+ @Inject
+ public HomeSettingsEventHandler(@NonNull AuditLogRegistrationClient client) {
+ this.client = client;
+ }
+
+ @NonNull
+ private String getRegisteredGuildChannel(@NonNull String guildId) {
+ return client.getRegisteredGuild(guildId)
+ .map(AuditLogRegistrationEntity::getChannelId).orElse(StringUtils.EMPTY);
+
+ }
+
+ private void performChecksThenBuildAndSendEmbed(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull EmbedBuilder embedBuilder, @NonNull String channelIdToSendTo) {
+ if (!embedBuilder.isValidLength() || embedBuilder.isEmpty()) {
+ log.warn("Embed is empty or too long (current length: {}).", embedBuilder.length());
+ return;
+ }
+
+ TextChannel sendingChannel = event.getGuild().getTextChannelById(channelIdToSendTo);
+ if (sendingChannel != null && sendingChannel.canTalk()) {
+ sendingChannel.sendMessageEmbeds(embedBuilder.build()).queue();
+ }
+ }
+
+ @Override
+ public void onHomeSettingsCreate(@NonNull GuildAuditLogEntryCreateEvent event) {
+ String channelIdToSendTo = getRegisteredGuildChannel(event.getGuild().getId());
+ if (channelIdToSendTo.isBlank()) return;
+
+ AuditLogEntry ale = event.getEntry();
+
+ User executor = ale.getJDA().getUserById(ale.getUserIdLong());
+ String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
+
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("Audit Log Entry | Server Guide Create Event");
+ eb.setDescription(MarkdownUtil.quoteBlock("Server Guide Created By: " + mentionableExecutor));
+ eb.setColor(Color.GREEN);
+
+ eb.addField(
+ MarkdownUtil.underline("More Info"),
+ MarkdownUtil.codeblock("To view the created guide, either visit the Server Guide section or the Onboarding section of your auditlogsupl."),
+ false
+ );
+
+ eb.setFooter("Audit Log Entry ID: " + ale.getId());
+ eb.setTimestamp(ale.getTimeCreated());
+
+ performChecksThenBuildAndSendEmbed(event, eb, channelIdToSendTo);
+ }
+
+ @Override
+ public void onHomeSettingsUpdate(@NonNull GuildAuditLogEntryCreateEvent event) {
+ String channelIdToSendTo = getRegisteredGuildChannel(event.getGuild().getId());
+ if (channelIdToSendTo.isBlank()) return;
+
+ AuditLogEntry ale = event.getEntry();
+
+ User executor = ale.getJDA().getUserById(ale.getUserIdLong());
+ String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
+
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("Audit Log Entry | Server Guide Update Event");
+ eb.setDescription(MarkdownUtil.quoteBlock("Server Guide Updated By: " + mentionableExecutor));
+ eb.setColor(Color.YELLOW);
+
+ ale.getChanges().keySet().forEach(key -> {
+ switch (key) {
+ case "welcome_message" ->
+ eb.addField(MarkdownUtil.underline("Welcome Message"), "╰┈➤Welcome Message has been updated", false);
+ case "resource_channels" ->
+ eb.addField(MarkdownUtil.underline("Resources"), "╰┈➤Resources have been updated", false);
+ case "new_member_actions" ->
+ eb.addField(MarkdownUtil.underline("New Member Join To-Do"), "╰┈➤Interactive Actions have been updated", false);
+ default -> eb.addField(MarkdownUtil.underline(key), "╰┈➤" + key + " has/have been updated", false);
+ }
+ });
+
+ eb.setFooter("Audit Log Entry ID: " + ale.getId());
+ eb.setTimestamp(ale.getTimeCreated());
+
+ performChecksThenBuildAndSendEmbed(event, eb, channelIdToSendTo);
+ }
+}
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/homesettings/HomeSettingsCreateEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/homesettings/HomeSettingsCreateEventHelper.java
deleted file mode 100644
index a86d984..0000000
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/homesettings/HomeSettingsCreateEventHelper.java
+++ /dev/null
@@ -1,51 +0,0 @@
-package io.github.eggy03.papertrail.bot.service.auditlog.homesettings;
-
-import lombok.NonNull;
-import lombok.experimental.UtilityClass;
-import lombok.extern.slf4j.Slf4j;
-import net.dv8tion.jda.api.EmbedBuilder;
-import net.dv8tion.jda.api.audit.AuditLogEntry;
-import net.dv8tion.jda.api.entities.User;
-import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;
-import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
-import net.dv8tion.jda.api.utils.MarkdownUtil;
-
-import java.awt.Color;
-
-@UtilityClass
-@Slf4j
-public class HomeSettingsCreateEventHelper {
-
- public static void format(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
-
- AuditLogEntry ale = event.getEntry();
-
- User executor = ale.getJDA().getUserById(ale.getUserIdLong());
- String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
-
- EmbedBuilder eb = new EmbedBuilder();
- eb.setTitle("Audit Log Entry | Server Guide Create Event");
- eb.setDescription(MarkdownUtil.quoteBlock("Server Guide Created By: " + mentionableExecutor));
- eb.setColor(Color.GREEN);
-
- eb.addField(
- MarkdownUtil.underline("More Info"),
- MarkdownUtil.codeblock("To view the created guide, either visit the Server Guide section or the Onboarding section of your auditlogsupl."),
- false
- );
-
- eb.setFooter("Audit Log Entry ID: " + ale.getId());
- eb.setTimestamp(ale.getTimeCreated());
-
- if (!eb.isValidLength() || eb.isEmpty()) {
- log.warn("Embed is empty or too long (current length: {}).", eb.length());
- return;
- }
-
- TextChannel sendingChannel = event.getGuild().getTextChannelById(channelIdToSendTo);
- if (sendingChannel != null && sendingChannel.canTalk()) {
- sendingChannel.sendMessageEmbeds(eb.build()).queue();
- }
-
- }
-}
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/homesettings/HomeSettingsUpdateEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/homesettings/HomeSettingsUpdateEventHelper.java
deleted file mode 100644
index a7bad12..0000000
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/homesettings/HomeSettingsUpdateEventHelper.java
+++ /dev/null
@@ -1,57 +0,0 @@
-package io.github.eggy03.papertrail.bot.service.auditlog.homesettings;
-
-import lombok.NonNull;
-import lombok.experimental.UtilityClass;
-import lombok.extern.slf4j.Slf4j;
-import net.dv8tion.jda.api.EmbedBuilder;
-import net.dv8tion.jda.api.audit.AuditLogEntry;
-import net.dv8tion.jda.api.entities.User;
-import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;
-import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
-import net.dv8tion.jda.api.utils.MarkdownUtil;
-
-import java.awt.Color;
-
-@UtilityClass
-@Slf4j
-public class HomeSettingsUpdateEventHelper {
-
- public static void format(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
-
- AuditLogEntry ale = event.getEntry();
-
- User executor = ale.getJDA().getUserById(ale.getUserIdLong());
- String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
-
- EmbedBuilder eb = new EmbedBuilder();
- eb.setTitle("Audit Log Entry | Server Guide Update Event");
- eb.setDescription(MarkdownUtil.quoteBlock("Server Guide Updated By: " + mentionableExecutor));
- eb.setColor(Color.YELLOW);
-
- ale.getChanges().keySet().forEach(key -> {
- switch (key) {
- case "welcome_message" ->
- eb.addField(MarkdownUtil.underline("Welcome Message"), "╰┈➤Welcome Message has been updated", false);
- case "resource_channels" ->
- eb.addField(MarkdownUtil.underline("Resources"), "╰┈➤Resources have been updated", false);
- case "new_member_actions" ->
- eb.addField(MarkdownUtil.underline("New Member Join To-Do"), "╰┈➤Interactive Actions have been updated", false);
- default -> eb.addField(MarkdownUtil.underline(key), "╰┈➤" + key + " has/have been updated", false);
- }
- });
-
- eb.setFooter("Audit Log Entry ID: " + ale.getId());
- eb.setTimestamp(ale.getTimeCreated());
-
- if (!eb.isValidLength() || eb.isEmpty()) {
- log.warn("Embed is empty or too long (current length: {}).", eb.length());
- return;
- }
-
- TextChannel sendingChannel = event.getGuild().getTextChannelById(channelIdToSendTo);
- if (sendingChannel != null && sendingChannel.canTalk()) {
- sendingChannel.sendMessageEmbeds(eb.build()).queue();
- }
-
- }
-}
From b16bf2b63a75c6d7abdfc4c71d3840e1d89ee39d Mon Sep 17 00:00:00 2001
From: Egg-03 <111327101+eggy03@users.noreply.github.com>
Date: Sun, 31 May 2026 11:28:42 +0530
Subject: [PATCH 27/66] refactor(webhookevents): merge helpers into
WebhookEventHandler
- merge three helper classes from thread subpackage into `WebhookEventHandler`
- move `WebhookUtils` to the utility package
Signed-off-by: Egg-03 <111327101+eggy03@users.noreply.github.com>
---
.../service/auditlog/WebhookEventHandler.java | 195 ++++++++++++++++++
.../webhook/WebhookCreateEventHelper.java | 68 ------
.../webhook/WebhookRemoveEventHelper.java | 68 ------
.../webhook/WebhookUpdateEventHelper.java | 83 --------
.../auditlog}/WebhookUtils.java | 2 +-
5 files changed, 196 insertions(+), 220 deletions(-)
create mode 100644 src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/WebhookEventHandler.java
delete mode 100644 src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/webhook/WebhookCreateEventHelper.java
delete mode 100644 src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/webhook/WebhookRemoveEventHelper.java
delete mode 100644 src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/webhook/WebhookUpdateEventHelper.java
rename src/main/java/io/github/eggy03/papertrail/bot/{service/auditlog/webhook/utils => utils/auditlog}/WebhookUtils.java (91%)
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/WebhookEventHandler.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/WebhookEventHandler.java
new file mode 100644
index 0000000..e6cc767
--- /dev/null
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/WebhookEventHandler.java
@@ -0,0 +1,195 @@
+package io.github.eggy03.papertrail.bot.service.auditlog;
+
+import io.github.eggy03.papertrail.bot.listeners.auditlog.GuildAuditLogEntryCreateEventHandler;
+import io.github.eggy03.papertrail.bot.utils.auditlog.GuildUtils;
+import io.github.eggy03.papertrail.bot.utils.auditlog.WebhookUtils;
+import io.github.eggy03.papertrail.sdk.client.AuditLogRegistrationClient;
+import io.github.eggy03.papertrail.sdk.entity.AuditLogRegistrationEntity;
+import jakarta.enterprise.context.ApplicationScoped;
+import jakarta.inject.Inject;
+import lombok.NonNull;
+import lombok.extern.slf4j.Slf4j;
+import net.dv8tion.jda.api.EmbedBuilder;
+import net.dv8tion.jda.api.audit.AuditLogEntry;
+import net.dv8tion.jda.api.entities.User;
+import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;
+import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
+import net.dv8tion.jda.api.utils.MarkdownUtil;
+import org.apache.commons.lang3.StringUtils;
+
+import java.awt.Color;
+
+@ApplicationScoped
+@Slf4j
+@SuppressWarnings("java:S1192")
+public class WebhookEventHandler extends GuildAuditLogEntryCreateEventHandler {
+
+ private final @NonNull AuditLogRegistrationClient client;
+
+ @Inject
+ public WebhookEventHandler(@NonNull AuditLogRegistrationClient client) {
+ this.client = client;
+ }
+
+ @NonNull
+ private String getRegisteredGuildChannel(@NonNull String guildId) {
+ return client.getRegisteredGuild(guildId)
+ .map(AuditLogRegistrationEntity::getChannelId).orElse(StringUtils.EMPTY);
+
+ }
+
+ private void performChecksThenBuildAndSendEmbed(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull EmbedBuilder embedBuilder, @NonNull String channelIdToSendTo) {
+ if (!embedBuilder.isValidLength() || embedBuilder.isEmpty()) {
+ log.warn("Embed is empty or too long (current length: {}).", embedBuilder.length());
+ return;
+ }
+
+ TextChannel sendingChannel = event.getGuild().getTextChannelById(channelIdToSendTo);
+ if (sendingChannel != null && sendingChannel.canTalk()) {
+ sendingChannel.sendMessageEmbeds(embedBuilder.build()).queue();
+ }
+ }
+
+ @Override
+ public void onWebhookCreate(@NonNull GuildAuditLogEntryCreateEvent event) {
+ String channelIdToSendTo = getRegisteredGuildChannel(event.getGuild().getId());
+ if (channelIdToSendTo.isBlank()) return;
+
+ AuditLogEntry ale = event.getEntry();
+
+ User executor = ale.getJDA().getUserById(ale.getUserIdLong());
+ String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
+
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("Audit Log Entry | Webhook Create Event");
+ eb.setDescription(MarkdownUtil.quoteBlock("Webhook Created By: " + mentionableExecutor));
+ eb.setColor(Color.GREEN);
+
+ ale.getChanges().forEach((changeKey, changeValue) -> {
+ Object oldValue = changeValue.getOldValue();
+ Object newValue = changeValue.getNewValue();
+
+ switch (changeKey) {
+
+ case "type" ->
+ eb.addField(MarkdownUtil.underline("Webhook Type"), "╰┈➤" + WebhookUtils.resolveWebhookEventType(newValue), false);
+ case "avatar_hash" -> {
+ // skip
+ }
+ case "channel_id" ->
+ eb.addField(MarkdownUtil.underline("Channel"), "╰┈➤" + GuildUtils.resolveMentionableChannel(newValue, event), false);
+ case "name" -> eb.addField(MarkdownUtil.underline("Webhook Name"), "╰┈➤" + newValue, false);
+ case "application_id" -> eb.addField(MarkdownUtil.underline("Application ID"), "╰┈➤" + newValue, false);
+ default -> {
+ eb.addField("Unimplemented Change Key", changeKey, false);
+ log.info("Unimplemented Change Key on Webhook Create: {}\nOLD_VALUE: {}\nNEW_VALUE: {}", changeKey, oldValue, newValue);
+ }
+ }
+ });
+
+ eb.setFooter("Audit Log Entry ID: " + ale.getId());
+ eb.setTimestamp(ale.getTimeCreated());
+
+ performChecksThenBuildAndSendEmbed(event, eb, channelIdToSendTo);
+ }
+
+ @Override
+ public void onWebhookUpdate(@NonNull GuildAuditLogEntryCreateEvent event) {
+ String channelIdToSendTo = getRegisteredGuildChannel(event.getGuild().getId());
+ if (channelIdToSendTo.isBlank()) return;
+
+ AuditLogEntry ale = event.getEntry();
+
+ User executor = ale.getJDA().getUserById(ale.getUserIdLong());
+ String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
+
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("Audit Log Entry | Webhook Update Event");
+ eb.setDescription(MarkdownUtil.quoteBlock("Webhook Updated By: " + mentionableExecutor));
+ eb.setColor(Color.YELLOW);
+
+ ale.getChanges().forEach((changeKey, changeValue) -> {
+ Object oldValue = changeValue.getOldValue();
+ Object newValue = changeValue.getNewValue();
+
+ switch (changeKey) {
+
+ case "type" -> {
+ eb.addField(MarkdownUtil.underline("Old Webhook Type"), "╰┈➤" + WebhookUtils.resolveWebhookEventType(oldValue), true);
+ eb.addField(MarkdownUtil.underline("New Webhook Type"), "╰┈➤" + WebhookUtils.resolveWebhookEventType(newValue), true);
+ eb.addBlankField(true);
+ }
+ case "avatar_hash" ->
+ eb.addField(MarkdownUtil.underline("Avatar"), "╰┈➤Avatar has been updated", false);
+
+ case "channel_id" -> {
+ eb.addField(MarkdownUtil.underline("Old Channel"), "╰┈➤" + GuildUtils.resolveMentionableChannel(oldValue, event), true);
+ eb.addField(MarkdownUtil.underline("New Channel"), "╰┈➤" + GuildUtils.resolveMentionableChannel(newValue, event), true);
+ eb.addBlankField(true);
+ }
+ case "name" -> {
+ eb.addField(MarkdownUtil.underline("Old Webhook Name"), "╰┈➤" + oldValue, true);
+ eb.addField(MarkdownUtil.underline("New Webhook Name"), "╰┈➤" + newValue, true);
+ eb.addBlankField(true);
+ }
+ case "application_id" -> {
+ eb.addField(MarkdownUtil.underline("Old Application ID"), "╰┈➤" + oldValue, true);
+ eb.addField(MarkdownUtil.underline("New Application ID"), "╰┈➤" + newValue, true);
+ eb.addBlankField(true);
+ }
+ default -> {
+ eb.addField("Unimplemented Change Key", changeKey, false);
+ log.info("Unimplemented Change Key on Webhook Update: {}\nOLD_VALUE: {}\nNEW_VALUE: {}", changeKey, oldValue, newValue);
+ }
+ }
+ });
+
+ eb.setFooter("Audit Log Entry ID: " + ale.getId());
+ eb.setTimestamp(ale.getTimeCreated());
+
+ performChecksThenBuildAndSendEmbed(event, eb, channelIdToSendTo);
+ }
+
+ @Override
+ public void onWebhookDelete(@NonNull GuildAuditLogEntryCreateEvent event) {
+ String channelIdToSendTo = getRegisteredGuildChannel(event.getGuild().getId());
+ if (channelIdToSendTo.isBlank()) return;
+
+ AuditLogEntry ale = event.getEntry();
+
+ User executor = ale.getJDA().getUserById(ale.getUserIdLong());
+ String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
+
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("Audit Log Entry | Webhook Remove Event");
+ eb.setDescription(MarkdownUtil.quoteBlock("Webhook Removed By: " + mentionableExecutor));
+ eb.setColor(Color.RED);
+
+ ale.getChanges().forEach((changeKey, changeValue) -> {
+ Object oldValue = changeValue.getOldValue();
+ Object newValue = changeValue.getNewValue();
+
+ switch (changeKey) {
+
+ case "type" ->
+ eb.addField(MarkdownUtil.underline("Webhook Type"), "╰┈➤" + WebhookUtils.resolveWebhookEventType(oldValue), false);
+ case "avatar_hash" -> {
+ // skip
+ }
+ case "channel_id" ->
+ eb.addField(MarkdownUtil.underline("Channel"), "╰┈➤" + GuildUtils.resolveMentionableChannel(oldValue, event), false);
+ case "name" -> eb.addField(MarkdownUtil.underline("Webhook Name"), "╰┈➤" + oldValue, false);
+ case "application_id" -> eb.addField(MarkdownUtil.underline("Application ID"), "╰┈➤" + oldValue, false);
+ default -> {
+ eb.addField("Unimplemented Change Key", changeKey, false);
+ log.info("Unimplemented Change Key on Webhook Remove: {}\nOLD_VALUE: {}\nNEW_VALUE: {}", changeKey, oldValue, newValue);
+ }
+ }
+ });
+
+ eb.setFooter("Audit Log Entry ID: " + ale.getId());
+ eb.setTimestamp(ale.getTimeCreated());
+
+ performChecksThenBuildAndSendEmbed(event, eb, channelIdToSendTo);
+ }
+}
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/webhook/WebhookCreateEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/webhook/WebhookCreateEventHelper.java
deleted file mode 100644
index 4f74318..0000000
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/webhook/WebhookCreateEventHelper.java
+++ /dev/null
@@ -1,68 +0,0 @@
-package io.github.eggy03.papertrail.bot.service.auditlog.webhook;
-
-import io.github.eggy03.papertrail.bot.service.auditlog.guild.utils.GuildUtils;
-import io.github.eggy03.papertrail.bot.service.auditlog.webhook.utils.WebhookUtils;
-import lombok.NonNull;
-import lombok.experimental.UtilityClass;
-import lombok.extern.slf4j.Slf4j;
-import net.dv8tion.jda.api.EmbedBuilder;
-import net.dv8tion.jda.api.audit.AuditLogEntry;
-import net.dv8tion.jda.api.entities.User;
-import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;
-import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
-import net.dv8tion.jda.api.utils.MarkdownUtil;
-
-import java.awt.Color;
-
-@UtilityClass
-@Slf4j
-public class WebhookCreateEventHelper {
-
- public static void format(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
-
- AuditLogEntry ale = event.getEntry();
-
- User executor = ale.getJDA().getUserById(ale.getUserIdLong());
- String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
-
- EmbedBuilder eb = new EmbedBuilder();
- eb.setTitle("Audit Log Entry | Webhook Create Event");
- eb.setDescription(MarkdownUtil.quoteBlock("Webhook Created By: " + mentionableExecutor));
- eb.setColor(Color.GREEN);
-
- ale.getChanges().forEach((changeKey, changeValue) -> {
- Object oldValue = changeValue.getOldValue();
- Object newValue = changeValue.getNewValue();
-
- switch (changeKey) {
-
- case "type" ->
- eb.addField(MarkdownUtil.underline("Webhook Type"), "╰┈➤" + WebhookUtils.resolveWebhookEventType(newValue), false);
- case "avatar_hash" -> {
- // skip
- }
- case "channel_id" ->
- eb.addField(MarkdownUtil.underline("Channel"), "╰┈➤" + GuildUtils.resolveMentionableChannel(newValue, event), false);
- case "name" -> eb.addField(MarkdownUtil.underline("Webhook Name"), "╰┈➤" + newValue, false);
- case "application_id" -> eb.addField(MarkdownUtil.underline("Application ID"), "╰┈➤" + newValue, false);
- default -> {
- eb.addField("Unimplemented Change Key", changeKey, false);
- log.info("Unimplemented Change Key: {}\nOLD_VALUE: {}\nNEW_VALUE: {}", changeKey, oldValue, newValue);
- }
- }
- });
-
- eb.setFooter("Audit Log Entry ID: " + ale.getId());
- eb.setTimestamp(ale.getTimeCreated());
-
- if (!eb.isValidLength() || eb.isEmpty()) {
- log.warn("Embed is empty or too long (current length: {}).", eb.length());
- return;
- }
-
- TextChannel sendingChannel = event.getGuild().getTextChannelById(channelIdToSendTo);
- if (sendingChannel != null && sendingChannel.canTalk()) {
- sendingChannel.sendMessageEmbeds(eb.build()).queue();
- }
- }
-}
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/webhook/WebhookRemoveEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/webhook/WebhookRemoveEventHelper.java
deleted file mode 100644
index cfea12a..0000000
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/webhook/WebhookRemoveEventHelper.java
+++ /dev/null
@@ -1,68 +0,0 @@
-package io.github.eggy03.papertrail.bot.service.auditlog.webhook;
-
-import io.github.eggy03.papertrail.bot.service.auditlog.guild.utils.GuildUtils;
-import io.github.eggy03.papertrail.bot.service.auditlog.webhook.utils.WebhookUtils;
-import lombok.NonNull;
-import lombok.experimental.UtilityClass;
-import lombok.extern.slf4j.Slf4j;
-import net.dv8tion.jda.api.EmbedBuilder;
-import net.dv8tion.jda.api.audit.AuditLogEntry;
-import net.dv8tion.jda.api.entities.User;
-import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;
-import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
-import net.dv8tion.jda.api.utils.MarkdownUtil;
-
-import java.awt.Color;
-
-@UtilityClass
-@Slf4j
-public class WebhookRemoveEventHelper {
-
- public static void format(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
-
- AuditLogEntry ale = event.getEntry();
-
- User executor = ale.getJDA().getUserById(ale.getUserIdLong());
- String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
-
- EmbedBuilder eb = new EmbedBuilder();
- eb.setTitle("Audit Log Entry | Webhook Remove Event");
- eb.setDescription(MarkdownUtil.quoteBlock("Webhook Removed By: " + mentionableExecutor));
- eb.setColor(Color.RED);
-
- ale.getChanges().forEach((changeKey, changeValue) -> {
- Object oldValue = changeValue.getOldValue();
- Object newValue = changeValue.getNewValue();
-
- switch (changeKey) {
-
- case "type" ->
- eb.addField(MarkdownUtil.underline("Webhook Type"), "╰┈➤" + WebhookUtils.resolveWebhookEventType(oldValue), false);
- case "avatar_hash" -> {
- // skip
- }
- case "channel_id" ->
- eb.addField(MarkdownUtil.underline("Channel"), "╰┈➤" + GuildUtils.resolveMentionableChannel(oldValue, event), false);
- case "name" -> eb.addField(MarkdownUtil.underline("Webhook Name"), "╰┈➤" + oldValue, false);
- case "application_id" -> eb.addField(MarkdownUtil.underline("Application ID"), "╰┈➤" + oldValue, false);
- default -> {
- eb.addField("Unimplemented Change Key", changeKey, false);
- log.info("Unimplemented Change Key: {}\nOLD_VALUE: {}\nNEW_VALUE: {}", changeKey, oldValue, newValue);
- }
- }
- });
-
- eb.setFooter("Audit Log Entry ID: " + ale.getId());
- eb.setTimestamp(ale.getTimeCreated());
-
- if (!eb.isValidLength() || eb.isEmpty()) {
- log.warn("Embed is empty or too long (current length: {}).", eb.length());
- return;
- }
-
- TextChannel sendingChannel = event.getGuild().getTextChannelById(channelIdToSendTo);
- if (sendingChannel != null && sendingChannel.canTalk()) {
- sendingChannel.sendMessageEmbeds(eb.build()).queue();
- }
- }
-}
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/webhook/WebhookUpdateEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/webhook/WebhookUpdateEventHelper.java
deleted file mode 100644
index 2b30424..0000000
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/webhook/WebhookUpdateEventHelper.java
+++ /dev/null
@@ -1,83 +0,0 @@
-package io.github.eggy03.papertrail.bot.service.auditlog.webhook;
-
-import io.github.eggy03.papertrail.bot.service.auditlog.guild.utils.GuildUtils;
-import io.github.eggy03.papertrail.bot.service.auditlog.webhook.utils.WebhookUtils;
-import lombok.NonNull;
-import lombok.experimental.UtilityClass;
-import lombok.extern.slf4j.Slf4j;
-import net.dv8tion.jda.api.EmbedBuilder;
-import net.dv8tion.jda.api.audit.AuditLogEntry;
-import net.dv8tion.jda.api.entities.User;
-import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;
-import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
-import net.dv8tion.jda.api.utils.MarkdownUtil;
-
-import java.awt.Color;
-
-@UtilityClass
-@Slf4j
-public class WebhookUpdateEventHelper {
-
- public static void format(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
-
- AuditLogEntry ale = event.getEntry();
-
- User executor = ale.getJDA().getUserById(ale.getUserIdLong());
- String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
-
- EmbedBuilder eb = new EmbedBuilder();
- eb.setTitle("Audit Log Entry | Webhook Update Event");
- eb.setDescription(MarkdownUtil.quoteBlock("Webhook Updated By: " + mentionableExecutor));
- eb.setColor(Color.YELLOW);
-
- ale.getChanges().forEach((changeKey, changeValue) -> {
- Object oldValue = changeValue.getOldValue();
- Object newValue = changeValue.getNewValue();
-
- switch (changeKey) {
-
- case "type" -> {
- eb.addField(MarkdownUtil.underline("Old Webhook Type"), "╰┈➤" + WebhookUtils.resolveWebhookEventType(oldValue), true);
- eb.addField(MarkdownUtil.underline("New Webhook Type"), "╰┈➤" + WebhookUtils.resolveWebhookEventType(newValue), true);
- eb.addBlankField(true);
- }
- case "avatar_hash" ->
- eb.addField(MarkdownUtil.underline("Avatar"), "╰┈➤Avatar has been updated", false);
-
- case "channel_id" -> {
- eb.addField(MarkdownUtil.underline("Old Channel"), "╰┈➤" + GuildUtils.resolveMentionableChannel(oldValue, event), true);
- eb.addField(MarkdownUtil.underline("New Channel"), "╰┈➤" + GuildUtils.resolveMentionableChannel(newValue, event), true);
- eb.addBlankField(true);
- }
- case "name" -> {
- eb.addField(MarkdownUtil.underline("Old Webhook Name"), "╰┈➤" + oldValue, true);
- eb.addField(MarkdownUtil.underline("New Webhook Name"), "╰┈➤" + newValue, true);
- eb.addBlankField(true);
- }
- case "application_id" -> {
- eb.addField(MarkdownUtil.underline("Old Application ID"), "╰┈➤" + oldValue, true);
- eb.addField(MarkdownUtil.underline("New Application ID"), "╰┈➤" + newValue, true);
- eb.addBlankField(true);
- }
- default -> {
- eb.addField("Unimplemented Change Key", changeKey, false);
- log.info("Unimplemented Change Key: {}\nOLD_VALUE: {}\nNEW_VALUE: {}", changeKey, oldValue, newValue);
- }
- }
- });
-
- eb.setFooter("Audit Log Entry ID: " + ale.getId());
- eb.setTimestamp(ale.getTimeCreated());
-
- if (!eb.isValidLength() || eb.isEmpty()) {
- log.warn("Embed is empty or too long (current length: {}).", eb.length());
- return;
- }
-
- TextChannel sendingChannel = event.getGuild().getTextChannelById(channelIdToSendTo);
- if (sendingChannel != null && sendingChannel.canTalk()) {
- sendingChannel.sendMessageEmbeds(eb.build()).queue();
- }
- }
-
-}
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/webhook/utils/WebhookUtils.java b/src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/WebhookUtils.java
similarity index 91%
rename from src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/webhook/utils/WebhookUtils.java
rename to src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/WebhookUtils.java
index 202577c..7e24f31 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/webhook/utils/WebhookUtils.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/WebhookUtils.java
@@ -1,4 +1,4 @@
-package io.github.eggy03.papertrail.bot.service.auditlog.webhook.utils;
+package io.github.eggy03.papertrail.bot.utils.auditlog;
import io.github.eggy03.papertrail.bot.utils.NumberParseUtils;
import lombok.NonNull;
From da626bac31b93f521f6441933211f882f4317f4a Mon Sep 17 00:00:00 2001
From: Egg-03 <111327101+eggy03@users.noreply.github.com>
Date: Sun, 31 May 2026 11:39:35 +0530
Subject: [PATCH 28/66] refactor(integrationevents): merge helpers into
IntegrationEventHandler
- merge three helper classes from thread subpackage into `IntegrationEventHandler`
Signed-off-by: Egg-03 <111327101+eggy03@users.noreply.github.com>
---
.../auditlog/IntegrationEventHandler.java | 172 ++++++++++++++++++
...ionCommandPrivilegesUpdateEventHelper.java | 46 -----
.../IntegrationCreateEventHelper.java | 60 ------
.../IntegrationDeleteEventHelper.java | 59 ------
4 files changed, 172 insertions(+), 165 deletions(-)
create mode 100644 src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/IntegrationEventHandler.java
delete mode 100644 src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/integration/ApplicationCommandPrivilegesUpdateEventHelper.java
delete mode 100644 src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/integration/IntegrationCreateEventHelper.java
delete mode 100644 src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/integration/IntegrationDeleteEventHelper.java
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/IntegrationEventHandler.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/IntegrationEventHandler.java
new file mode 100644
index 0000000..62bf559
--- /dev/null
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/IntegrationEventHandler.java
@@ -0,0 +1,172 @@
+package io.github.eggy03.papertrail.bot.service.auditlog;
+
+import io.github.eggy03.papertrail.bot.listeners.auditlog.GuildAuditLogEntryCreateEventHandler;
+import io.github.eggy03.papertrail.sdk.client.AuditLogRegistrationClient;
+import io.github.eggy03.papertrail.sdk.entity.AuditLogRegistrationEntity;
+import jakarta.enterprise.context.ApplicationScoped;
+import jakarta.inject.Inject;
+import lombok.NonNull;
+import lombok.extern.slf4j.Slf4j;
+import net.dv8tion.jda.api.EmbedBuilder;
+import net.dv8tion.jda.api.audit.AuditLogEntry;
+import net.dv8tion.jda.api.entities.User;
+import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;
+import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
+import net.dv8tion.jda.api.utils.MarkdownUtil;
+import org.apache.commons.lang3.StringUtils;
+
+import java.awt.Color;
+
+@ApplicationScoped
+@Slf4j
+@SuppressWarnings("java:S1192")
+public class IntegrationEventHandler extends GuildAuditLogEntryCreateEventHandler {
+
+ private final @NonNull AuditLogRegistrationClient client;
+
+ @Inject
+ public IntegrationEventHandler(@NonNull AuditLogRegistrationClient client) {
+ this.client = client;
+ }
+
+ @NonNull
+ private String getRegisteredGuildChannel(@NonNull String guildId) {
+ return client.getRegisteredGuild(guildId)
+ .map(AuditLogRegistrationEntity::getChannelId).orElse(StringUtils.EMPTY);
+
+ }
+
+ private void performChecksThenBuildAndSendEmbed(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull EmbedBuilder embedBuilder, @NonNull String channelIdToSendTo) {
+ if (!embedBuilder.isValidLength() || embedBuilder.isEmpty()) {
+ log.warn("Embed is empty or too long (current length: {}).", embedBuilder.length());
+ return;
+ }
+
+ TextChannel sendingChannel = event.getGuild().getTextChannelById(channelIdToSendTo);
+ if (sendingChannel != null && sendingChannel.canTalk()) {
+ sendingChannel.sendMessageEmbeds(embedBuilder.build()).queue();
+ }
+ }
+
+ @Override
+ public void onIntegrationCreate(@NonNull GuildAuditLogEntryCreateEvent event) {
+ String channelIdToSendTo = getRegisteredGuildChannel(event.getGuild().getId());
+ if (channelIdToSendTo.isBlank()) return;
+
+ AuditLogEntry ale = event.getEntry();
+
+ User executor = ale.getJDA().getUserById(ale.getUserIdLong());
+ String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
+
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("Audit Log Entry | Integration Create Event");
+ eb.setDescription(MarkdownUtil.quoteBlock("Integration Created By: " + mentionableExecutor));
+ eb.setColor(Color.PINK);
+
+ ale.getChanges().forEach((changeKey, changeValue) -> {
+
+ Object oldValue = changeValue.getOldValue();
+ Object newValue = changeValue.getNewValue();
+
+ switch (changeKey) {
+ case "type" -> eb.addField(MarkdownUtil.underline("Integration Type"), "╰┈➤" + newValue, false);
+ case "name" -> eb.addField(MarkdownUtil.underline("Integration Name"), "╰┈➤" + newValue, false);
+
+ default -> {
+ eb.addField("Unimplemented Change Key", changeKey, false);
+ log.info("Unimplemented Change Key on Integration Delete: {}\nOLD_VALUE: {}\nNEW_VALUE: {}", changeKey, oldValue, newValue);
+ }
+ }
+ });
+
+ eb.setFooter("Audit Log Entry ID: " + ale.getId());
+ eb.setTimestamp(ale.getTimeCreated());
+
+ performChecksThenBuildAndSendEmbed(event, eb, channelIdToSendTo);
+ }
+
+ @Override
+ public void onIntegrationUpdate(@NonNull GuildAuditLogEntryCreateEvent event) {
+
+ log.warn("Integration Update Event Detected. Implement this sometime later\n{}", event.getEntry().getChanges());
+
+ String channelIdToSendTo = getRegisteredGuildChannel(event.getGuild().getId());
+ if (channelIdToSendTo.isBlank()) return;
+
+ AuditLogEntry ale = event.getEntry();
+
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("Audit Log Entry | Integration Update Event");
+ eb.setColor(Color.LIGHT_GRAY);
+
+ String implementationNotice = "We do not have sufficient data to log the changes in an INTEGRATION_UPDATE Event."
+ .concat(" A proper implementation might happen in future releases");
+
+ eb.addField("Implementation Notice", MarkdownUtil.codeblock(implementationNotice), false);
+
+ eb.setFooter("Audit Log Entry ID: " + ale.getId());
+ eb.setTimestamp(ale.getTimeCreated());
+
+
+ performChecksThenBuildAndSendEmbed(event, eb, channelIdToSendTo);
+ }
+
+ @Override
+ public void onIntegrationDelete(@NonNull GuildAuditLogEntryCreateEvent event) {
+ String channelIdToSendTo = getRegisteredGuildChannel(event.getGuild().getId());
+ if (channelIdToSendTo.isBlank()) return;
+
+ AuditLogEntry ale = event.getEntry();
+
+ User executor = ale.getJDA().getUserById(ale.getUserIdLong());
+ String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
+
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("Audit Log Entry | Integration Delete Event");
+ eb.setDescription(MarkdownUtil.quoteBlock("Integration Deleted By: " + mentionableExecutor));
+ eb.setColor(Color.MAGENTA);
+
+ ale.getChanges().forEach((changeKey, changeValue) -> {
+ Object oldValue = changeValue.getOldValue();
+ Object newValue = changeValue.getNewValue();
+
+ switch (changeKey) {
+ case "type" -> eb.addField(MarkdownUtil.underline("Integration Type"), "╰┈➤" + oldValue, false);
+ case "name" -> eb.addField(MarkdownUtil.underline("Integration Name"), "╰┈➤" + oldValue, false);
+
+ default -> {
+ eb.addField("Unimplemented Change Key", changeKey, false);
+ log.info("Unimplemented Change Key on Integration Delete: {}\nOLD_VALUE: {}\nNEW_VALUE: {}", changeKey, oldValue, newValue);
+ }
+ }
+ });
+
+ eb.setFooter("Audit Log Entry ID: " + ale.getId());
+ eb.setTimestamp(ale.getTimeCreated());
+
+ performChecksThenBuildAndSendEmbed(event, eb, channelIdToSendTo);
+ }
+
+ @Override
+ public void onApplicationCommandPrivilegesUpdate(@NonNull GuildAuditLogEntryCreateEvent event) {
+ String channelIdToSendTo = getRegisteredGuildChannel(event.getGuild().getId());
+ if (channelIdToSendTo.isBlank()) return;
+
+ AuditLogEntry ale = event.getEntry();
+
+ User executor = ale.getJDA().getUserById(ale.getUserIdLong());
+ String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
+
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("Audit Log Entry | Application Command Privilege Update");
+ eb.setDescription(MarkdownUtil.quoteBlock("Application Command Privilege Updated By: " + mentionableExecutor));
+ eb.setColor(Color.PINK);
+
+ eb.addField(MarkdownUtil.underline("More Info"), MarkdownUtil.codeblock("To know more about what changes were made, visit the Integrations section"), false);
+
+ eb.setFooter("Audit Log Entry ID: " + ale.getId());
+ eb.setTimestamp(ale.getTimeCreated());
+
+ performChecksThenBuildAndSendEmbed(event, eb, channelIdToSendTo);
+ }
+}
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/integration/ApplicationCommandPrivilegesUpdateEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/integration/ApplicationCommandPrivilegesUpdateEventHelper.java
deleted file mode 100644
index d2bfe80..0000000
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/integration/ApplicationCommandPrivilegesUpdateEventHelper.java
+++ /dev/null
@@ -1,46 +0,0 @@
-package io.github.eggy03.papertrail.bot.service.auditlog.integration;
-
-import lombok.NonNull;
-import lombok.experimental.UtilityClass;
-import lombok.extern.slf4j.Slf4j;
-import net.dv8tion.jda.api.EmbedBuilder;
-import net.dv8tion.jda.api.audit.AuditLogEntry;
-import net.dv8tion.jda.api.entities.User;
-import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;
-import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
-import net.dv8tion.jda.api.utils.MarkdownUtil;
-
-import java.awt.Color;
-
-@UtilityClass
-@Slf4j
-public class ApplicationCommandPrivilegesUpdateEventHelper {
-
- public static void format(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
-
- AuditLogEntry ale = event.getEntry();
-
- User executor = ale.getJDA().getUserById(ale.getUserIdLong());
- String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
-
- EmbedBuilder eb = new EmbedBuilder();
- eb.setTitle("Audit Log Entry | Application Command Privilege Update");
- eb.setDescription(MarkdownUtil.quoteBlock("Application Command Privilege Updated By: " + mentionableExecutor));
- eb.setColor(Color.PINK);
-
- eb.addField(MarkdownUtil.underline("More Info"), MarkdownUtil.codeblock("To know more about what changes were made, visit the Integrations section"), false);
-
- eb.setFooter("Audit Log Entry ID: " + ale.getId());
- eb.setTimestamp(ale.getTimeCreated());
-
- if (!eb.isValidLength() || eb.isEmpty()) {
- log.warn("Embed is empty or too long (current length: {}).", eb.length());
- return;
- }
-
- TextChannel sendingChannel = event.getGuild().getTextChannelById(channelIdToSendTo);
- if (sendingChannel != null && sendingChannel.canTalk()) {
- sendingChannel.sendMessageEmbeds(eb.build()).queue();
- }
- }
-}
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/integration/IntegrationCreateEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/integration/IntegrationCreateEventHelper.java
deleted file mode 100644
index fae5197..0000000
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/integration/IntegrationCreateEventHelper.java
+++ /dev/null
@@ -1,60 +0,0 @@
-package io.github.eggy03.papertrail.bot.service.auditlog.integration;
-
-import lombok.NonNull;
-import lombok.experimental.UtilityClass;
-import lombok.extern.slf4j.Slf4j;
-import net.dv8tion.jda.api.EmbedBuilder;
-import net.dv8tion.jda.api.audit.AuditLogEntry;
-import net.dv8tion.jda.api.entities.User;
-import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;
-import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
-import net.dv8tion.jda.api.utils.MarkdownUtil;
-
-import java.awt.Color;
-
-@UtilityClass
-@Slf4j
-public class IntegrationCreateEventHelper {
-
- public static void format(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
-
- AuditLogEntry ale = event.getEntry();
-
- User executor = ale.getJDA().getUserById(ale.getUserIdLong());
- String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
-
- EmbedBuilder eb = new EmbedBuilder();
- eb.setTitle("Audit Log Entry | Integration Create Event");
- eb.setDescription(MarkdownUtil.quoteBlock("Integration Created By: " + mentionableExecutor));
- eb.setColor(Color.PINK);
-
- ale.getChanges().forEach((changeKey, changeValue) -> {
-
- Object oldValue = changeValue.getOldValue();
- Object newValue = changeValue.getNewValue();
-
- switch (changeKey) {
- case "type" -> eb.addField(MarkdownUtil.underline("Integration Type"), "╰┈➤" + newValue, false);
- case "name" -> eb.addField(MarkdownUtil.underline("Integration Name"), "╰┈➤" + newValue, false);
-
- default -> {
- eb.addField("Unimplemented Change Key", changeKey, false);
- log.info("Unimplemented Change Key: {}\nOLD_VALUE: {}\nNEW_VALUE: {}", changeKey, oldValue, newValue);
- }
- }
- });
-
- eb.setFooter("Audit Log Entry ID: " + ale.getId());
- eb.setTimestamp(ale.getTimeCreated());
-
- if (!eb.isValidLength() || eb.isEmpty()) {
- log.warn("Embed is empty or too long (current length: {}).", eb.length());
- return;
- }
-
- TextChannel sendingChannel = event.getGuild().getTextChannelById(channelIdToSendTo);
- if (sendingChannel != null && sendingChannel.canTalk()) {
- sendingChannel.sendMessageEmbeds(eb.build()).queue();
- }
- }
-}
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/integration/IntegrationDeleteEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/integration/IntegrationDeleteEventHelper.java
deleted file mode 100644
index 490dfca..0000000
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/integration/IntegrationDeleteEventHelper.java
+++ /dev/null
@@ -1,59 +0,0 @@
-package io.github.eggy03.papertrail.bot.service.auditlog.integration;
-
-import lombok.NonNull;
-import lombok.experimental.UtilityClass;
-import lombok.extern.slf4j.Slf4j;
-import net.dv8tion.jda.api.EmbedBuilder;
-import net.dv8tion.jda.api.audit.AuditLogEntry;
-import net.dv8tion.jda.api.entities.User;
-import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;
-import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
-import net.dv8tion.jda.api.utils.MarkdownUtil;
-
-import java.awt.Color;
-
-@UtilityClass
-@Slf4j
-public class IntegrationDeleteEventHelper {
-
- public static void format(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
-
- AuditLogEntry ale = event.getEntry();
-
- User executor = ale.getJDA().getUserById(ale.getUserIdLong());
- String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
-
- EmbedBuilder eb = new EmbedBuilder();
- eb.setTitle("Audit Log Entry | Integration Delete Event");
- eb.setDescription(MarkdownUtil.quoteBlock("Integration Deleted By: " + mentionableExecutor));
- eb.setColor(Color.MAGENTA);
-
- ale.getChanges().forEach((changeKey, changeValue) -> {
- Object oldValue = changeValue.getOldValue();
- Object newValue = changeValue.getNewValue();
-
- switch (changeKey) {
- case "type" -> eb.addField(MarkdownUtil.underline("Integration Type"), "╰┈➤" + oldValue, false);
- case "name" -> eb.addField(MarkdownUtil.underline("Integration Name"), "╰┈➤" + oldValue, false);
-
- default -> {
- eb.addField("Unimplemented Change Key", changeKey, false);
- log.info("Unimplemented Change Key: {}\nOLD_VALUE: {}\nNEW_VALUE: {}", changeKey, oldValue, newValue);
- }
- }
- });
-
- eb.setFooter("Audit Log Entry ID: " + ale.getId());
- eb.setTimestamp(ale.getTimeCreated());
-
- if (!eb.isValidLength() || eb.isEmpty()) {
- log.warn("Embed is empty or too long (current length: {}).", eb.length());
- return;
- }
-
- TextChannel sendingChannel = event.getGuild().getTextChannelById(channelIdToSendTo);
- if (sendingChannel != null && sendingChannel.canTalk()) {
- sendingChannel.sendMessageEmbeds(eb.build()).queue();
- }
- }
-}
From d335d9274a53d5a4eee16c548b66838441dddd95 Mon Sep 17 00:00:00 2001
From: Egg-03 <111327101+eggy03@users.noreply.github.com>
Date: Sun, 31 May 2026 11:49:47 +0530
Subject: [PATCH 29/66] refactor(inviteevents): merge helpers into
InviteEventHandler
- merge two helper classes from thread subpackage into `InviteEventHandler`
- move `InviteUtils` to the utility package
Signed-off-by: Egg-03 <111327101+eggy03@users.noreply.github.com>
---
.../service/auditlog/InviteEventHandler.java | 193 ++++++++++++++++++
.../invite/InviteCreateEventHelper.java | 87 --------
.../invite/InviteDeleteEventHelper.java | 81 --------
.../utils => utils/auditlog}/InviteUtils.java | 2 +-
4 files changed, 194 insertions(+), 169 deletions(-)
create mode 100644 src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/InviteEventHandler.java
delete mode 100644 src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/invite/InviteCreateEventHelper.java
delete mode 100644 src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/invite/InviteDeleteEventHelper.java
rename src/main/java/io/github/eggy03/papertrail/bot/{service/auditlog/invite/utils => utils/auditlog}/InviteUtils.java (97%)
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/InviteEventHandler.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/InviteEventHandler.java
new file mode 100644
index 0000000..0cdd59f
--- /dev/null
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/InviteEventHandler.java
@@ -0,0 +1,193 @@
+package io.github.eggy03.papertrail.bot.service.auditlog;
+
+import io.github.eggy03.papertrail.bot.listeners.auditlog.GuildAuditLogEntryCreateEventHandler;
+import io.github.eggy03.papertrail.bot.utils.BooleanUtils;
+import io.github.eggy03.papertrail.bot.utils.DurationUtils;
+import io.github.eggy03.papertrail.bot.utils.auditlog.InviteUtils;
+import io.github.eggy03.papertrail.sdk.client.AuditLogRegistrationClient;
+import io.github.eggy03.papertrail.sdk.entity.AuditLogRegistrationEntity;
+import jakarta.enterprise.context.ApplicationScoped;
+import jakarta.inject.Inject;
+import lombok.NonNull;
+import lombok.extern.slf4j.Slf4j;
+import net.dv8tion.jda.api.EmbedBuilder;
+import net.dv8tion.jda.api.audit.AuditLogEntry;
+import net.dv8tion.jda.api.entities.User;
+import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;
+import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
+import net.dv8tion.jda.api.utils.MarkdownUtil;
+import org.apache.commons.lang3.StringUtils;
+
+import java.awt.Color;
+
+@ApplicationScoped
+@Slf4j
+@SuppressWarnings("java:S1192")
+public class InviteEventHandler extends GuildAuditLogEntryCreateEventHandler {
+
+ private final @NonNull AuditLogRegistrationClient client;
+
+ @Inject
+ public InviteEventHandler(@NonNull AuditLogRegistrationClient client) {
+ this.client = client;
+ }
+
+ @NonNull
+ private String getRegisteredGuildChannel(@NonNull String guildId) {
+ return client.getRegisteredGuild(guildId)
+ .map(AuditLogRegistrationEntity::getChannelId).orElse(StringUtils.EMPTY);
+
+ }
+
+ private void performChecksThenBuildAndSendEmbed(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull EmbedBuilder embedBuilder, @NonNull String channelIdToSendTo) {
+ if (!embedBuilder.isValidLength() || embedBuilder.isEmpty()) {
+ log.warn("Embed is empty or too long (current length: {}).", embedBuilder.length());
+ return;
+ }
+
+ TextChannel sendingChannel = event.getGuild().getTextChannelById(channelIdToSendTo);
+ if (sendingChannel != null && sendingChannel.canTalk()) {
+ sendingChannel.sendMessageEmbeds(embedBuilder.build()).queue();
+ }
+ }
+
+ @Override
+ public void onInviteCreate(@NonNull GuildAuditLogEntryCreateEvent event) {
+ String channelIdToSendTo = getRegisteredGuildChannel(event.getGuild().getId());
+ if (channelIdToSendTo.isBlank()) return;
+
+ AuditLogEntry ale = event.getEntry();
+
+ User executor = ale.getJDA().getUserById(ale.getUserIdLong());
+ String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
+
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("Audit Log Entry | Invite Create Event");
+
+ eb.setDescription(MarkdownUtil.quoteBlock("Invite Created By: " + mentionableExecutor));
+ eb.setColor(Color.CYAN);
+
+ ale.getChanges().forEach((changeKey, changeValue) -> {
+
+ Object oldValue = changeValue.getOldValue();
+ Object newValue = changeValue.getNewValue();
+
+ switch (changeKey) {
+
+ case "code" -> eb.addField(MarkdownUtil.underline("Invite Code"), "╰┈➤" + newValue, false);
+
+ case "inviter_id" ->
+ eb.addField(MarkdownUtil.underline("Invite Created By"), "╰┈➤" + InviteUtils.resolveInviter(newValue, event), false);
+
+ case "temporary" ->
+ eb.addField(MarkdownUtil.underline("Is Temporary"), "╰┈➤" + BooleanUtils.formatToYesOrNo(newValue), false);
+
+ case "max_uses" ->
+ eb.addField(MarkdownUtil.underline("Max Uses"), "╰┈➤" + InviteUtils.resolveMaxUses(newValue), false);
+
+ case "uses", "flags" -> {
+ // ignore
+ }
+
+ case "role_ids" ->
+ eb.addField(MarkdownUtil.underline("Roles Attached"), "╰┈➤" + InviteUtils.resolveInviteRoleList(event, newValue), false);
+
+ case "max_age" ->
+ eb.addField(MarkdownUtil.underline("Expires After"), "╰┈➤" + DurationUtils.formatSeconds(newValue), false);
+
+ case "channel_id" ->
+ eb.addField(MarkdownUtil.underline("Invite Channel"), "╰┈➤" + InviteUtils.resolveInviteChannel(newValue, event), false);
+
+ default -> {
+ eb.addField("Unimplemented Change Key", changeKey, false);
+ log.info("Unimplemented Change Key on Invite Create: {}\nOLD_VALUE: {}\nNEW_VALUE: {}", changeKey, oldValue, newValue);
+ }
+ }
+ });
+
+ eb.setFooter("Audit Log Entry ID: " + ale.getId());
+ eb.setTimestamp(ale.getTimeCreated());
+
+ performChecksThenBuildAndSendEmbed(event, eb, channelIdToSendTo);
+ }
+
+ @Override
+ public void onInviteUpdate(@NonNull GuildAuditLogEntryCreateEvent event) {
+ log.warn("Invite Update Event Detected. Implement this sometime later\n{}", event.getEntry().getChanges());
+
+ String channelIdToSendTo = getRegisteredGuildChannel(event.getGuild().getId());
+ if (channelIdToSendTo.isBlank()) return;
+
+ AuditLogEntry ale = event.getEntry();
+
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("Audit Log Entry | Invite Update Event");
+ eb.setColor(Color.LIGHT_GRAY);
+
+ String implementationNotice = "We do not have sufficient data to log the changes in an INVITE_UPDATE Event."
+ .concat(" A proper implementation might happen in future releases");
+
+ eb.addField("Implementation Notice", MarkdownUtil.codeblock(implementationNotice), false);
+
+ eb.setFooter("Audit Log Entry ID: " + ale.getId());
+ eb.setTimestamp(ale.getTimeCreated());
+
+ performChecksThenBuildAndSendEmbed(event, eb, channelIdToSendTo);
+ }
+
+ @Override
+ public void onInviteDelete(@NonNull GuildAuditLogEntryCreateEvent event) {
+ String channelIdToSendTo = getRegisteredGuildChannel(event.getGuild().getId());
+ if (channelIdToSendTo.isBlank()) return;
+
+ AuditLogEntry ale = event.getEntry();
+
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("Audit Log Entry | Invite Delete Event");
+
+ User executor = ale.getJDA().getUserById(ale.getUserIdLong());
+ String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
+
+ eb.setDescription(MarkdownUtil.quoteBlock("Invite Deleted By: " + mentionableExecutor));
+ eb.setColor(Color.BLUE);
+
+ ale.getChanges().forEach((changeKey, changeValue) -> {
+ Object oldValue = changeValue.getOldValue();
+ Object newValue = changeValue.getNewValue();
+
+ switch (changeKey) {
+
+ case "code" -> eb.addField(MarkdownUtil.underline("Deleted Invite Code"), "╰┈➤" + oldValue, false);
+
+ case "inviter_id" ->
+ eb.addField(MarkdownUtil.underline("Invite Deleted By"), "╰┈➤" + InviteUtils.resolveInviter(oldValue, event), false);
+
+ case "temporary" ->
+ eb.addField(MarkdownUtil.underline("Was Temporary"), "╰┈➤" + BooleanUtils.formatToYesOrNo(oldValue), false);
+
+ case "max_uses", "flags", "max_age" -> {
+ // ignore
+ }
+
+ case "role_ids" ->
+ eb.addField(MarkdownUtil.underline("Roles Attached"), "╰┈➤" + InviteUtils.resolveInviteRoleList(event, oldValue), false);
+
+ case "uses" -> eb.addField(MarkdownUtil.underline("Use Count"), "╰┈➤" + oldValue, false);
+
+ case "channel_id" ->
+ eb.addField(MarkdownUtil.underline("Invite Channel"), "╰┈➤" + InviteUtils.resolveInviteChannel(oldValue, event), false);
+
+ default -> {
+ eb.addField("Unimplemented Change Key", changeKey, false);
+ log.info("Unimplemented Change Key on Invite Delete: {}\nOLD_VALUE: {}\nNEW_VALUE: {}", changeKey, oldValue, newValue);
+ }
+
+ }
+ });
+
+ eb.setFooter("Audit Log Entry ID: " + ale.getId());
+ eb.setTimestamp(ale.getTimeCreated());
+
+ performChecksThenBuildAndSendEmbed(event, eb, channelIdToSendTo);
+ }
+}
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/invite/InviteCreateEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/invite/InviteCreateEventHelper.java
deleted file mode 100644
index 679a969..0000000
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/invite/InviteCreateEventHelper.java
+++ /dev/null
@@ -1,87 +0,0 @@
-package io.github.eggy03.papertrail.bot.service.auditlog.invite;
-
-import io.github.eggy03.papertrail.bot.service.auditlog.invite.utils.InviteUtils;
-import io.github.eggy03.papertrail.bot.utils.BooleanUtils;
-import io.github.eggy03.papertrail.bot.utils.DurationUtils;
-import lombok.NonNull;
-import lombok.experimental.UtilityClass;
-import lombok.extern.slf4j.Slf4j;
-import net.dv8tion.jda.api.EmbedBuilder;
-import net.dv8tion.jda.api.audit.AuditLogEntry;
-import net.dv8tion.jda.api.entities.User;
-import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;
-import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
-import net.dv8tion.jda.api.utils.MarkdownUtil;
-
-import java.awt.Color;
-
-@UtilityClass
-@Slf4j
-public class InviteCreateEventHelper {
-
- public static void format(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
-
- AuditLogEntry ale = event.getEntry();
-
- User executor = ale.getJDA().getUserById(ale.getUserIdLong());
- String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
-
- EmbedBuilder eb = new EmbedBuilder();
- eb.setTitle("Audit Log Entry | Invite Create Event");
-
- eb.setDescription(MarkdownUtil.quoteBlock("Invite Created By: " + mentionableExecutor));
- eb.setColor(Color.CYAN);
-
- ale.getChanges().forEach((changeKey, changeValue) -> {
-
- Object oldValue = changeValue.getOldValue();
- Object newValue = changeValue.getNewValue();
-
- switch (changeKey) {
-
- case "code" -> eb.addField(MarkdownUtil.underline("Invite Code"), "╰┈➤" + newValue, false);
-
- case "inviter_id" ->
- eb.addField(MarkdownUtil.underline("Invite Created By"), "╰┈➤" + InviteUtils.resolveInviter(newValue, event), false);
-
- case "temporary" ->
- eb.addField(MarkdownUtil.underline("Is Temporary"), "╰┈➤" + BooleanUtils.formatToYesOrNo(newValue), false);
-
- case "max_uses" ->
- eb.addField(MarkdownUtil.underline("Max Uses"), "╰┈➤" + InviteUtils.resolveMaxUses(newValue), false);
-
- case "uses", "flags" -> {
- // ignore
- }
-
- case "role_ids" ->
- eb.addField(MarkdownUtil.underline("Roles Attached"), "╰┈➤" + InviteUtils.resolveInviteRoleList(event, newValue), false);
-
- case "max_age" ->
- eb.addField(MarkdownUtil.underline("Expires After"), "╰┈➤" + DurationUtils.formatSeconds(newValue), false);
-
- case "channel_id" ->
- eb.addField(MarkdownUtil.underline("Invite Channel"), "╰┈➤" + InviteUtils.resolveInviteChannel(newValue, event), false);
-
- default -> {
- eb.addField("Unimplemented Change Key", changeKey, false);
- log.info("Unimplemented Change Key: {}\nOLD_VALUE: {}\nNEW_VALUE: {}", changeKey, oldValue, newValue);
- }
- }
- });
-
- eb.setFooter("Audit Log Entry ID: " + ale.getId());
- eb.setTimestamp(ale.getTimeCreated());
-
- if (!eb.isValidLength() || eb.isEmpty()) {
- log.warn("Embed is empty or too long (current length: {}).", eb.length());
- return;
- }
-
- TextChannel sendingChannel = event.getGuild().getTextChannelById(channelIdToSendTo);
- if (sendingChannel != null && sendingChannel.canTalk()) {
- sendingChannel.sendMessageEmbeds(eb.build()).queue();
- }
-
- }
-}
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/invite/InviteDeleteEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/invite/InviteDeleteEventHelper.java
deleted file mode 100644
index a9523f9..0000000
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/invite/InviteDeleteEventHelper.java
+++ /dev/null
@@ -1,81 +0,0 @@
-package io.github.eggy03.papertrail.bot.service.auditlog.invite;
-
-import io.github.eggy03.papertrail.bot.service.auditlog.invite.utils.InviteUtils;
-import io.github.eggy03.papertrail.bot.utils.BooleanUtils;
-import lombok.NonNull;
-import lombok.experimental.UtilityClass;
-import lombok.extern.slf4j.Slf4j;
-import net.dv8tion.jda.api.EmbedBuilder;
-import net.dv8tion.jda.api.audit.AuditLogEntry;
-import net.dv8tion.jda.api.entities.User;
-import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;
-import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
-import net.dv8tion.jda.api.utils.MarkdownUtil;
-
-import java.awt.Color;
-
-@UtilityClass
-@Slf4j
-public class InviteDeleteEventHelper {
-
- public static void format(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
-
- AuditLogEntry ale = event.getEntry();
-
- EmbedBuilder eb = new EmbedBuilder();
- eb.setTitle("Audit Log Entry | Invite Delete Event");
-
- User executor = ale.getJDA().getUserById(ale.getUserIdLong());
- String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
-
- eb.setDescription(MarkdownUtil.quoteBlock("Invite Deleted By: " + mentionableExecutor));
- eb.setColor(Color.BLUE);
-
- ale.getChanges().forEach((changeKey, changeValue) -> {
- Object oldValue = changeValue.getOldValue();
- Object newValue = changeValue.getNewValue();
-
- switch (changeKey) {
-
- case "code" -> eb.addField(MarkdownUtil.underline("Deleted Invite Code"), "╰┈➤" + oldValue, false);
-
- case "inviter_id" ->
- eb.addField(MarkdownUtil.underline("Invite Deleted By"), "╰┈➤" + InviteUtils.resolveInviter(oldValue, event), false);
-
- case "temporary" ->
- eb.addField(MarkdownUtil.underline("Was Temporary"), "╰┈➤" + BooleanUtils.formatToYesOrNo(oldValue), false);
-
- case "max_uses", "flags", "max_age" -> {
- // ignore
- }
-
- case "role_ids" ->
- eb.addField(MarkdownUtil.underline("Roles Attached"), "╰┈➤" + InviteUtils.resolveInviteRoleList(event, oldValue), false);
-
- case "uses" -> eb.addField(MarkdownUtil.underline("Use Count"), "╰┈➤" + oldValue, false);
-
- case "channel_id" ->
- eb.addField(MarkdownUtil.underline("Invite Channel"), "╰┈➤" + InviteUtils.resolveInviteChannel(oldValue, event), false);
-
- default -> {
- eb.addField("Unimplemented Change Key", changeKey, false);
- log.info("Unimplemented Change Key: {}\nOLD_VALUE: {}\nNEW_VALUE: {}", changeKey, oldValue, newValue);
- }
-
- }
- });
-
- eb.setFooter("Audit Log Entry ID: " + ale.getId());
- eb.setTimestamp(ale.getTimeCreated());
-
- if (!eb.isValidLength() || eb.isEmpty()) {
- log.warn("Embed is empty or too long (current length: {}).", eb.length());
- return;
- }
-
- TextChannel sendingChannel = event.getGuild().getTextChannelById(channelIdToSendTo);
- if (sendingChannel != null && sendingChannel.canTalk()) {
- sendingChannel.sendMessageEmbeds(eb.build()).queue();
- }
- }
-}
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/invite/utils/InviteUtils.java b/src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/InviteUtils.java
similarity index 97%
rename from src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/invite/utils/InviteUtils.java
rename to src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/InviteUtils.java
index 3c0a62b..e26c514 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/invite/utils/InviteUtils.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/InviteUtils.java
@@ -1,4 +1,4 @@
-package io.github.eggy03.papertrail.bot.service.auditlog.invite.utils;
+package io.github.eggy03.papertrail.bot.utils.auditlog;
import io.github.eggy03.papertrail.bot.utils.NumberParseUtils;
import lombok.NonNull;
From 4336b027ed8f686b256e706517dc0b9f8f921c6d Mon Sep 17 00:00:00 2001
From: Egg-03 <111327101+eggy03@users.noreply.github.com>
Date: Sun, 31 May 2026 11:57:44 +0530
Subject: [PATCH 30/66] refactor(memberstatusevents): merge helpers into
MemberStatusEventHandler
- merge four helper classes from thread subpackage into `MemberStatusEventHandler`
- move `MemberStatusUtils` to the utility package
Signed-off-by: Egg-03 <111327101+eggy03@users.noreply.github.com>
---
.../auditlog/MemberStatusEventHandler.java | 208 ++++++++++++++++++
.../member/MemberRoleUpdateEventHelper.java | 69 ------
.../member/MemberUpdateEventHelper.java | 110 ---------
.../member/MemberVoiceKickEventHelper.java | 52 -----
.../member/MemberVoiceMoveEventHelper.java | 52 -----
.../utils => utils/auditlog}/MemberUtils.java | 23 +-
6 files changed, 230 insertions(+), 284 deletions(-)
create mode 100644 src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/MemberStatusEventHandler.java
delete mode 100644 src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/member/MemberRoleUpdateEventHelper.java
delete mode 100644 src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/member/MemberUpdateEventHelper.java
delete mode 100644 src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/member/MemberVoiceKickEventHelper.java
delete mode 100644 src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/member/MemberVoiceMoveEventHelper.java
rename src/main/java/io/github/eggy03/papertrail/bot/{service/auditlog/member/utils => utils/auditlog}/MemberUtils.java (55%)
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/MemberStatusEventHandler.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/MemberStatusEventHandler.java
new file mode 100644
index 0000000..38fc21e
--- /dev/null
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/MemberStatusEventHandler.java
@@ -0,0 +1,208 @@
+package io.github.eggy03.papertrail.bot.service.auditlog;
+
+import io.github.eggy03.papertrail.bot.listeners.auditlog.GuildAuditLogEntryCreateEventHandler;
+import io.github.eggy03.papertrail.bot.utils.BooleanUtils;
+import io.github.eggy03.papertrail.bot.utils.DurationUtils;
+import io.github.eggy03.papertrail.bot.utils.auditlog.MemberUtils;
+import io.github.eggy03.papertrail.sdk.client.AuditLogRegistrationClient;
+import io.github.eggy03.papertrail.sdk.entity.AuditLogRegistrationEntity;
+import jakarta.enterprise.context.ApplicationScoped;
+import jakarta.inject.Inject;
+import lombok.NonNull;
+import lombok.extern.slf4j.Slf4j;
+import net.dv8tion.jda.api.EmbedBuilder;
+import net.dv8tion.jda.api.audit.AuditLogEntry;
+import net.dv8tion.jda.api.entities.User;
+import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;
+import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
+import net.dv8tion.jda.api.utils.MarkdownUtil;
+import org.apache.commons.lang3.StringUtils;
+
+import java.awt.Color;
+
+@ApplicationScoped
+@Slf4j
+@SuppressWarnings("java:S1192")
+public class MemberStatusEventHandler extends GuildAuditLogEntryCreateEventHandler {
+
+ private final @NonNull AuditLogRegistrationClient client;
+
+ @Inject
+ public MemberStatusEventHandler(@NonNull AuditLogRegistrationClient client) {
+ this.client = client;
+ }
+
+ @NonNull
+ private String getRegisteredGuildChannel(@NonNull String guildId) {
+ return client.getRegisteredGuild(guildId)
+ .map(AuditLogRegistrationEntity::getChannelId).orElse(StringUtils.EMPTY);
+
+ }
+
+ private void performChecksThenBuildAndSendEmbed(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull EmbedBuilder embedBuilder, @NonNull String channelIdToSendTo) {
+ if (!embedBuilder.isValidLength() || embedBuilder.isEmpty()) {
+ log.warn("Embed is empty or too long (current length: {}).", embedBuilder.length());
+ return;
+ }
+
+ TextChannel sendingChannel = event.getGuild().getTextChannelById(channelIdToSendTo);
+ if (sendingChannel != null && sendingChannel.canTalk()) {
+ sendingChannel.sendMessageEmbeds(embedBuilder.build()).queue();
+ }
+ }
+
+ @Override
+ public void onMemberUpdate(@NonNull GuildAuditLogEntryCreateEvent event) {
+ String channelIdToSendTo = getRegisteredGuildChannel(event.getGuild().getId());
+ if (channelIdToSendTo.isBlank()) return;
+
+ AuditLogEntry ale = event.getEntry();
+
+ User executor = ale.getJDA().getUserById(ale.getUserIdLong());
+ String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
+
+ User targetUser = ale.getJDA().getUserById(ale.getTargetIdLong());
+ String mentionableTargetUser = (targetUser != null ? targetUser.getAsMention() : ale.getTargetId());
+
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("Audit Log Entry | Member Update Event");
+ eb.setDescription(MarkdownUtil.quoteBlock("Executor: " + mentionableExecutor + "\nTarget: " + mentionableTargetUser));
+ eb.setColor(Color.CYAN);
+
+ if (targetUser != null)
+ eb.setThumbnail(targetUser.getEffectiveAvatarUrl());
+
+ ale.getChanges().forEach((changeKey, changeValue) -> {
+ Object oldValue = changeValue.getOldValue();
+ Object newValue = changeValue.getNewValue();
+
+ switch (changeKey) {
+
+ case "communication_disabled_until" -> {
+ if (newValue == null) {
+ eb.setColor(Color.GREEN);
+ eb.addField(MarkdownUtil.underline("Timeout Lifted"), "╰┈➤ Timeout has been removed", false);
+ } else {
+ eb.setColor(Color.YELLOW);
+ eb.addField(MarkdownUtil.underline("Timeout Received"), "╰┈➤ Member has received a timeout", false);
+ eb.addField(MarkdownUtil.underline("Timeout Ends On"), "╰┈➤" + DurationUtils.isoToLocalTimeCounter(newValue), false);
+ eb.addField(MarkdownUtil.underline("Timeout Reason"), "╰┈➤" + (ale.getReason() != null ? ale.getReason() : "No Reason Provided"), false);
+ }
+ }
+ case "nick" ->
+ eb.addField(MarkdownUtil.underline("Nickname Update"), MemberUtils.resolveNickNameChanges(oldValue, newValue), false);
+
+ case "mute" ->
+ eb.addField(MarkdownUtil.underline("Is Muted in VC"), "╰┈➤" + BooleanUtils.formatToYesOrNo(newValue), false);
+
+ case "deaf" ->
+ eb.addField(MarkdownUtil.underline("Is Deafened in VC"), "╰┈➤" + BooleanUtils.formatToYesOrNo(newValue), false);
+
+ case "bypasses_verification" ->
+ eb.addField(MarkdownUtil.underline("Bypass Verification"), "╰┈➤" + BooleanUtils.formatToEnabledOrDisabled(newValue), false);
+
+ default -> {
+ eb.addField("Unimplemented Change Key", changeKey, false);
+ log.info("Unimplemented Change Key on Member Update: {}\nOLD_VALUE: {}\nNEW_VALUE: {}", changeKey, oldValue, newValue);
+ }
+ }
+ });
+
+ eb.setFooter("Audit Log Entry ID: " + ale.getId());
+ eb.setTimestamp(ale.getTimeCreated());
+
+ performChecksThenBuildAndSendEmbed(event, eb, channelIdToSendTo);
+ }
+
+ @Override
+ public void onMemberRoleUpdate(@NonNull GuildAuditLogEntryCreateEvent event) {
+ String channelIdToSendTo = getRegisteredGuildChannel(event.getGuild().getId());
+ if (channelIdToSendTo.isBlank()) return;
+
+ AuditLogEntry ale = event.getEntry();
+
+ User executor = ale.getJDA().getUserById(ale.getUserIdLong());
+ String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
+
+ User targetUser = ale.getJDA().getUserById(ale.getTargetIdLong());
+ String mentionableTargetUser = (targetUser != null ? targetUser.getAsMention() : ale.getTargetId());
+
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("Audit Log Entry | Member Role Update");
+ eb.setDescription(MarkdownUtil.quoteBlock("Executor: " + mentionableExecutor + "\nTarget: " + mentionableTargetUser));
+ eb.setColor(Color.YELLOW);
+
+ if (targetUser != null)
+ eb.setThumbnail(targetUser.getEffectiveAvatarUrl());
+
+ ale.getChanges().forEach((changeKey, changeValue) -> {
+ Object oldValue = changeValue.getOldValue();
+ Object newValue = changeValue.getNewValue();
+
+ switch (changeKey) {
+ case "$add" ->
+ eb.addField(MarkdownUtil.underline("✅ Role(s) Added"), "╰┈➤" + MemberUtils.parseRoleListMap(event, newValue), false);
+
+ case "$remove" ->
+ eb.addField(MarkdownUtil.underline("❌ Role(s) Removed"), "╰┈➤" + MemberUtils.parseRoleListMap(event, newValue), false);
+
+ default -> {
+ eb.addField("Unimplemented Change Key", changeKey, false);
+ log.info("Unimplemented Change Key on Member Role Update: {}\nOLD_VALUE: {}\nNEW_VALUE: {}", changeKey, oldValue, newValue);
+ }
+ }
+ });
+
+ eb.setFooter("Audit Log Entry ID: " + ale.getId());
+ eb.setTimestamp(ale.getTimeCreated());
+
+ performChecksThenBuildAndSendEmbed(event, eb, channelIdToSendTo);
+ }
+
+ // the audit log does not expose much information regarding member vc move and kick events
+ // therefore GuildVoiceEventListener has been created to know about channels the target has been moved or kicked from
+ @Override
+ public void onMemberVoiceKick(@NonNull GuildAuditLogEntryCreateEvent event) {
+
+ String channelIdToSendTo = getRegisteredGuildChannel(event.getGuild().getId());
+ if (channelIdToSendTo.isBlank()) return;
+
+ AuditLogEntry ale = event.getEntry();
+
+ User executor = ale.getJDA().getUserById(ale.getUserId());
+ String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
+
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("Audit Log Entry | Member Voice Kick Event");
+ eb.setDescription(MarkdownUtil.quoteBlock("Member Kicked From a Voice Channel\n By: " + mentionableExecutor));
+ eb.setColor(Color.RED);
+
+ eb.setFooter("Audit Log Entry ID: " + ale.getId());
+ eb.setTimestamp(ale.getTimeCreated());
+
+ performChecksThenBuildAndSendEmbed(event, eb, channelIdToSendTo);
+ }
+
+ // the audit log does not expose much information regarding member vc move and kick events
+ // therefore GuildVoiceEventListener has been created to know about channels the target has been moved or kicked from
+ @Override
+ public void onMemberVoiceMove(@NonNull GuildAuditLogEntryCreateEvent event) {
+ String channelIdToSendTo = getRegisteredGuildChannel(event.getGuild().getId());
+ if (channelIdToSendTo.isBlank()) return;
+
+ AuditLogEntry ale = event.getEntry();
+
+ User executor = ale.getJDA().getUserById(ale.getUserId());
+ String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
+
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("Audit Log Entry | Member Voice Move Event");
+ eb.setDescription(MarkdownUtil.quoteBlock("Member Moved To A Different Voice Channel\n By: " + mentionableExecutor));
+ eb.setColor(Color.YELLOW);
+
+ eb.setFooter("Audit Log Entry ID: " + ale.getId());
+ eb.setTimestamp(ale.getTimeCreated());
+
+ performChecksThenBuildAndSendEmbed(event, eb, channelIdToSendTo);
+ }
+}
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/member/MemberRoleUpdateEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/member/MemberRoleUpdateEventHelper.java
deleted file mode 100644
index ed6735a..0000000
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/member/MemberRoleUpdateEventHelper.java
+++ /dev/null
@@ -1,69 +0,0 @@
-package io.github.eggy03.papertrail.bot.service.auditlog.member;
-
-import io.github.eggy03.papertrail.bot.service.auditlog.member.utils.MemberUtils;
-import lombok.NonNull;
-import lombok.experimental.UtilityClass;
-import lombok.extern.slf4j.Slf4j;
-import net.dv8tion.jda.api.EmbedBuilder;
-import net.dv8tion.jda.api.audit.AuditLogEntry;
-import net.dv8tion.jda.api.entities.User;
-import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;
-import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
-import net.dv8tion.jda.api.utils.MarkdownUtil;
-
-import java.awt.Color;
-
-@UtilityClass
-@Slf4j
-public class MemberRoleUpdateEventHelper {
-
- public static void format(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
-
- AuditLogEntry ale = event.getEntry();
-
- User executor = ale.getJDA().getUserById(ale.getUserIdLong());
- String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
-
- User targetUser = ale.getJDA().getUserById(ale.getTargetIdLong());
- String mentionableTargetUser = (targetUser != null ? targetUser.getAsMention() : ale.getTargetId());
-
- EmbedBuilder eb = new EmbedBuilder();
- eb.setTitle("Audit Log Entry | Member Role Update");
- eb.setDescription(MarkdownUtil.quoteBlock("Executor: " + mentionableExecutor + "\nTarget: " + mentionableTargetUser));
- eb.setColor(Color.YELLOW);
-
- if (targetUser != null)
- eb.setThumbnail(targetUser.getEffectiveAvatarUrl());
-
- ale.getChanges().forEach((changeKey, changeValue) -> {
- Object oldValue = changeValue.getOldValue();
- Object newValue = changeValue.getNewValue();
-
- switch (changeKey) {
- case "$add" ->
- eb.addField(MarkdownUtil.underline("✅ Role(s) Added"), "╰┈➤" + MemberUtils.parseRoleListMap(event, newValue), false);
-
- case "$remove" ->
- eb.addField(MarkdownUtil.underline("❌ Role(s) Removed"), "╰┈➤" + MemberUtils.parseRoleListMap(event, newValue), false);
-
- default -> {
- eb.addField("Unimplemented Change Key", changeKey, false);
- log.info("Unimplemented Change Key: {}\nOLD_VALUE: {}\nNEW_VALUE: {}", changeKey, oldValue, newValue);
- }
- }
- });
-
- eb.setFooter("Audit Log Entry ID: " + ale.getId());
- eb.setTimestamp(ale.getTimeCreated());
-
- if (!eb.isValidLength() || eb.isEmpty()) {
- log.warn("Embed is empty or too long (current length: {}).", eb.length());
- return;
- }
-
- TextChannel sendingChannel = event.getGuild().getTextChannelById(channelIdToSendTo);
- if (sendingChannel != null && sendingChannel.canTalk()) {
- sendingChannel.sendMessageEmbeds(eb.build()).queue();
- }
- }
-}
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/member/MemberUpdateEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/member/MemberUpdateEventHelper.java
deleted file mode 100644
index 66926d2..0000000
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/member/MemberUpdateEventHelper.java
+++ /dev/null
@@ -1,110 +0,0 @@
-package io.github.eggy03.papertrail.bot.service.auditlog.member;
-
-import io.github.eggy03.papertrail.bot.utils.BooleanUtils;
-import io.github.eggy03.papertrail.bot.utils.DurationUtils;
-import lombok.NonNull;
-import lombok.experimental.UtilityClass;
-import lombok.extern.slf4j.Slf4j;
-import net.dv8tion.jda.api.EmbedBuilder;
-import net.dv8tion.jda.api.audit.AuditLogEntry;
-import net.dv8tion.jda.api.entities.User;
-import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;
-import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
-import net.dv8tion.jda.api.utils.MarkdownUtil;
-import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
-
-import java.awt.Color;
-
-@UtilityClass
-@Slf4j
-public class MemberUpdateEventHelper {
-
- public static void format(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
-
- AuditLogEntry ale = event.getEntry();
-
- User executor = ale.getJDA().getUserById(ale.getUserIdLong());
- String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
-
- User targetUser = ale.getJDA().getUserById(ale.getTargetIdLong());
- String mentionableTargetUser = (targetUser != null ? targetUser.getAsMention() : ale.getTargetId());
-
- EmbedBuilder eb = new EmbedBuilder();
- eb.setTitle("Audit Log Entry | Member Update Event");
- eb.setDescription(MarkdownUtil.quoteBlock("Executor: " + mentionableExecutor + "\nTarget: " + mentionableTargetUser));
- eb.setColor(Color.CYAN);
-
- if (targetUser != null)
- eb.setThumbnail(targetUser.getEffectiveAvatarUrl());
-
- ale.getChanges().forEach((changeKey, changeValue) -> {
- Object oldValue = changeValue.getOldValue();
- Object newValue = changeValue.getNewValue();
-
- switch (changeKey) {
-
- case "communication_disabled_until" -> {
- if (newValue == null) {
- eb.setColor(Color.GREEN);
- eb.addField(MarkdownUtil.underline("Timeout Lifted"), "╰┈➤ Timeout has been removed", false);
- } else {
- eb.setColor(Color.YELLOW);
- eb.addField(MarkdownUtil.underline("Timeout Received"), "╰┈➤ Member has received a timeout", false);
- eb.addField(MarkdownUtil.underline("Timeout Ends On"), "╰┈➤" + DurationUtils.isoToLocalTimeCounter(newValue), false);
- eb.addField(MarkdownUtil.underline("Timeout Reason"), "╰┈➤" + (ale.getReason() != null ? ale.getReason() : "No Reason Provided"), false);
- }
- }
- case "nick" ->
- eb.addField(MarkdownUtil.underline("Nickname Update"), resolveNickNameChanges(oldValue, newValue), false);
-
- case "mute" ->
- eb.addField(MarkdownUtil.underline("Is Muted in VC"), "╰┈➤" + BooleanUtils.formatToYesOrNo(newValue), false);
-
- case "deaf" ->
- eb.addField(MarkdownUtil.underline("Is Deafened in VC"), "╰┈➤" + BooleanUtils.formatToYesOrNo(newValue), false);
-
- case "bypasses_verification" ->
- eb.addField(MarkdownUtil.underline("Bypass Verification"), "╰┈➤" + BooleanUtils.formatToEnabledOrDisabled(newValue), false);
-
- default -> {
- eb.addField("Unimplemented Change Key", changeKey, false);
- log.info("Unimplemented Change Key: {}\nOLD_VALUE: {}\nNEW_VALUE: {}", changeKey, oldValue, newValue);
- }
- }
- });
-
- eb.setFooter("Audit Log Entry ID: " + ale.getId());
- eb.setTimestamp(ale.getTimeCreated());
-
- if (!eb.isValidLength() || eb.isEmpty()) {
- log.warn("Embed is empty or too long (current length: {}).", eb.length());
- return;
- }
-
- TextChannel sendingChannel = event.getGuild().getTextChannelById(channelIdToSendTo);
- if (sendingChannel != null && sendingChannel.canTalk()) {
- sendingChannel.sendMessageEmbeds(eb.build()).queue();
- }
- }
-
- @NotNull
- @SuppressWarnings("all")
- private static String resolveNickNameChanges(@Nullable Object oldNickValue, @Nullable Object newNickValue) {
-
- if (oldNickValue == null && newNickValue != null) { // change from global name to a new nickname in the server
- return "Added Nickname: " + MarkdownUtil.underline(newNickValue.toString());
- }
-
- if (oldNickValue != null && newNickValue == null) { // change to the global name from having a nickname
- return "Reset Nickname From: " + MarkdownUtil.underline(oldNickValue.toString());
- }
-
- if (oldNickValue != null && newNickValue != null) { // changing from one nick to another
- return "Changed Nickname From: " + MarkdownUtil.underline(oldNickValue.toString()) + " to: " + MarkdownUtil.underline(newNickValue.toString());
- }
-
- // both shouldn't be null which indicates that names couldn't be fetched from the event
- return MarkdownUtil.underline("Changes could not be resolved!");
- }
-}
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/member/MemberVoiceKickEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/member/MemberVoiceKickEventHelper.java
deleted file mode 100644
index 9b3e481..0000000
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/member/MemberVoiceKickEventHelper.java
+++ /dev/null
@@ -1,52 +0,0 @@
-package io.github.eggy03.papertrail.bot.service.auditlog.member;
-
-import io.github.eggy03.papertrail.bot.service.auditlogsupl.GuildVoiceEventHelper;
-import lombok.NonNull;
-import lombok.experimental.UtilityClass;
-import lombok.extern.slf4j.Slf4j;
-import net.dv8tion.jda.api.EmbedBuilder;
-import net.dv8tion.jda.api.audit.AuditLogEntry;
-import net.dv8tion.jda.api.entities.User;
-import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;
-import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
-import net.dv8tion.jda.api.utils.MarkdownUtil;
-
-import java.awt.Color;
-
-/**
- * This auditlog specifically detects the mod who kicked a member from a Voice Channel
- *
- * @see GuildVoiceEventHelper - for member only data regarding voice activities
- */
-@UtilityClass
-@Slf4j
-public class MemberVoiceKickEventHelper {
-
- // the audit log does not expose much information regarding member vc move and kick events
- // therefore GuildVoiceEventListener has been created to know about channels the target has been moved or kicked from
- public static void format(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
-
- AuditLogEntry ale = event.getEntry();
-
- User executor = ale.getJDA().getUserById(ale.getUserId());
- String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
-
- EmbedBuilder eb = new EmbedBuilder();
- eb.setTitle("Audit Log Entry | Member Voice Kick Event");
- eb.setDescription(MarkdownUtil.quoteBlock("Member Kicked From a Voice Channel\n By: " + mentionableExecutor));
- eb.setColor(Color.RED);
-
- eb.setFooter("Audit Log Entry ID: " + ale.getId());
- eb.setTimestamp(ale.getTimeCreated());
-
- if (!eb.isValidLength() || eb.isEmpty()) {
- log.warn("Embed is empty or too long (current length: {}).", eb.length());
- return;
- }
-
- TextChannel sendingChannel = event.getGuild().getTextChannelById(channelIdToSendTo);
- if (sendingChannel != null && sendingChannel.canTalk()) {
- sendingChannel.sendMessageEmbeds(eb.build()).queue();
- }
- }
-}
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/member/MemberVoiceMoveEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/member/MemberVoiceMoveEventHelper.java
deleted file mode 100644
index 9cd494f..0000000
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/member/MemberVoiceMoveEventHelper.java
+++ /dev/null
@@ -1,52 +0,0 @@
-package io.github.eggy03.papertrail.bot.service.auditlog.member;
-
-import io.github.eggy03.papertrail.bot.service.auditlogsupl.GuildVoiceEventHelper;
-import lombok.NonNull;
-import lombok.experimental.UtilityClass;
-import lombok.extern.slf4j.Slf4j;
-import net.dv8tion.jda.api.EmbedBuilder;
-import net.dv8tion.jda.api.audit.AuditLogEntry;
-import net.dv8tion.jda.api.entities.User;
-import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;
-import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
-import net.dv8tion.jda.api.utils.MarkdownUtil;
-
-import java.awt.Color;
-
-/**
- * This auditlog specifically detects the mod who moved a member to a different voice channel
- *
- * @see GuildVoiceEventHelper - for member only data regarding voice activities
- */
-@UtilityClass
-@Slf4j
-public class MemberVoiceMoveEventHelper {
-
- // the audit log does not expose much information regarding member vc move and kick events
- // therefore GuildVoiceEventListener has been created to know about channels the target has been moved or kicked from
- public static void format(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
-
- AuditLogEntry ale = event.getEntry();
-
- User executor = ale.getJDA().getUserById(ale.getUserId());
- String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
-
- EmbedBuilder eb = new EmbedBuilder();
- eb.setTitle("Audit Log Entry | Member Voice Move Event");
- eb.setDescription(MarkdownUtil.quoteBlock("Member Moved To A Different Voice Channel\n By: " + mentionableExecutor));
- eb.setColor(Color.YELLOW);
-
- eb.setFooter("Audit Log Entry ID: " + ale.getId());
- eb.setTimestamp(ale.getTimeCreated());
-
- if (!eb.isValidLength() || eb.isEmpty()) {
- log.warn("Embed is empty or too long (current length: {}).", eb.length());
- return;
- }
-
- TextChannel sendingChannel = event.getGuild().getTextChannelById(channelIdToSendTo);
- if (sendingChannel != null && sendingChannel.canTalk()) {
- sendingChannel.sendMessageEmbeds(eb.build()).queue();
- }
- }
-}
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/member/utils/MemberUtils.java b/src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/MemberUtils.java
similarity index 55%
rename from src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/member/utils/MemberUtils.java
rename to src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/MemberUtils.java
index 0a27637..3a8c88c 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/member/utils/MemberUtils.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/MemberUtils.java
@@ -1,4 +1,4 @@
-package io.github.eggy03.papertrail.bot.service.auditlog.member.utils;
+package io.github.eggy03.papertrail.bot.utils.auditlog;
import io.github.eggy03.papertrail.bot.utils.NumberParseUtils;
import lombok.NonNull;
@@ -6,6 +6,7 @@
import lombok.extern.slf4j.Slf4j;
import net.dv8tion.jda.api.entities.Role;
import net.dv8tion.jda.api.events.guild.GenericGuildEvent;
+import net.dv8tion.jda.api.utils.MarkdownUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -40,4 +41,24 @@ public static String parseRoleListMap(@NonNull GenericGuildEvent event, @Nullabl
.collect(Collectors.joining(" "));
}
+
+ @NotNull
+ @SuppressWarnings("all")
+ public static String resolveNickNameChanges(@Nullable Object oldNickValue, @Nullable Object newNickValue) {
+
+ if (oldNickValue == null && newNickValue != null) { // change from global name to a new nickname in the server
+ return "Added Nickname: " + MarkdownUtil.underline(newNickValue.toString());
+ }
+
+ if (oldNickValue != null && newNickValue == null) { // change to the global name from having a nickname
+ return "Reset Nickname From: " + MarkdownUtil.underline(oldNickValue.toString());
+ }
+
+ if (oldNickValue != null && newNickValue != null) { // changing from one nick to another
+ return "Changed Nickname From: " + MarkdownUtil.underline(oldNickValue.toString()) + " to: " + MarkdownUtil.underline(newNickValue.toString());
+ }
+
+ // both shouldn't be null which indicates that names couldn't be fetched from the event
+ return MarkdownUtil.underline("Changes could not be resolved!");
+ }
}
From bb7bb41788efedb797f2fce52d9127d627ba3a2c Mon Sep 17 00:00:00 2001
From: Egg-03 <111327101+eggy03@users.noreply.github.com>
Date: Sun, 31 May 2026 12:06:42 +0530
Subject: [PATCH 31/66] feat(auditlog): add message event handler for audit
logs
- Add `MessageEventHandler` to handle message audit log events
- Send embed logs for message delete and bulk delete events
- Skip create and update events as they are handled by `MessageLogListener`
Signed-off-by: Egg-03 <111327101+eggy03@users.noreply.github.com>
---
.../service/auditlog/MessageEventHandler.java | 104 ++++++++++++++++++
1 file changed, 104 insertions(+)
create mode 100644 src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/MessageEventHandler.java
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/MessageEventHandler.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/MessageEventHandler.java
new file mode 100644
index 0000000..c50bf7f
--- /dev/null
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/MessageEventHandler.java
@@ -0,0 +1,104 @@
+package io.github.eggy03.papertrail.bot.service.auditlog;
+
+import io.github.eggy03.papertrail.bot.listeners.auditlog.GuildAuditLogEntryCreateEventHandler;
+import io.github.eggy03.papertrail.sdk.client.AuditLogRegistrationClient;
+import io.github.eggy03.papertrail.sdk.entity.AuditLogRegistrationEntity;
+import jakarta.enterprise.context.ApplicationScoped;
+import jakarta.inject.Inject;
+import lombok.NonNull;
+import lombok.extern.slf4j.Slf4j;
+import net.dv8tion.jda.api.EmbedBuilder;
+import net.dv8tion.jda.api.audit.AuditLogEntry;
+import net.dv8tion.jda.api.entities.User;
+import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;
+import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
+import net.dv8tion.jda.api.utils.MarkdownUtil;
+import org.apache.commons.lang3.StringUtils;
+
+import java.awt.Color;
+
+@ApplicationScoped
+@Slf4j
+@SuppressWarnings("java:S1192")
+public class MessageEventHandler extends GuildAuditLogEntryCreateEventHandler {
+
+ private final @NonNull AuditLogRegistrationClient client;
+
+ @Inject
+ public MessageEventHandler(@NonNull AuditLogRegistrationClient client) {
+ this.client = client;
+ }
+
+ @NonNull
+ private String getRegisteredGuildChannel(@NonNull String guildId) {
+ return client.getRegisteredGuild(guildId)
+ .map(AuditLogRegistrationEntity::getChannelId).orElse(StringUtils.EMPTY);
+
+ }
+
+ private void performChecksThenBuildAndSendEmbed(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull EmbedBuilder embedBuilder, @NonNull String channelIdToSendTo) {
+ if (!embedBuilder.isValidLength() || embedBuilder.isEmpty()) {
+ log.warn("Embed is empty or too long (current length: {}).", embedBuilder.length());
+ return;
+ }
+
+ TextChannel sendingChannel = event.getGuild().getTextChannelById(channelIdToSendTo);
+ if (sendingChannel != null && sendingChannel.canTalk()) {
+ sendingChannel.sendMessageEmbeds(embedBuilder.build()).queue();
+ }
+ }
+
+ // for the following four events, audit log does not expose much information
+ // a custom implementation to log edits and deletes of messages is found in MessageLogListener
+ @Override
+ public void onMessageCreate(@NonNull GuildAuditLogEntryCreateEvent event) {
+ // do nothing (these never trigger)
+ }
+
+ @Override
+ public void onMessageUpdate(@NonNull GuildAuditLogEntryCreateEvent event) {
+ // do nothing (these never trigger)
+ }
+
+ @Override
+ public void onMessageDelete(@NonNull GuildAuditLogEntryCreateEvent event) {
+ String channelIdToSendTo = getRegisteredGuildChannel(event.getGuild().getId());
+ if (channelIdToSendTo.isBlank()) return;
+
+ AuditLogEntry ale = event.getEntry();
+
+ User executor = ale.getJDA().getUserById(ale.getUserIdLong());
+ String mentionableExecutor = executor != null ? executor.getAsMention() : ale.getUserId();
+
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("Audit Log Entry | Message Delete Event");
+ eb.setDescription(MarkdownUtil.quoteBlock("Executor: " + mentionableExecutor));
+ eb.setColor(Color.LIGHT_GRAY);
+
+ eb.setFooter("Audit Log Entry ID: " + ale.getId());
+ eb.setTimestamp(ale.getTimeCreated());
+
+ performChecksThenBuildAndSendEmbed(event, eb, channelIdToSendTo);
+ }
+
+ @Override
+ public void onMessageBulkDelete(@NonNull GuildAuditLogEntryCreateEvent event) {
+ String channelIdToSendTo = getRegisteredGuildChannel(event.getGuild().getId());
+ if (channelIdToSendTo.isBlank()) return;
+
+ AuditLogEntry ale = event.getEntry();
+
+ User executor = ale.getJDA().getUserById(ale.getUserIdLong());
+ String mentionableExecutor = executor != null ? executor.getAsMention() : ale.getUserId();
+
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("Audit Log Entry | Bulk Message Delete Event");
+ eb.setDescription(MarkdownUtil.quoteBlock("Executor: " + mentionableExecutor));
+ eb.setColor(Color.LIGHT_GRAY);
+
+ eb.setFooter("Audit Log Entry ID: " + ale.getId());
+ eb.setTimestamp(ale.getTimeCreated());
+
+ performChecksThenBuildAndSendEmbed(event, eb, channelIdToSendTo);
+ }
+}
From 69080837865d1a5591ad005404fbfbd77d4bf55d Mon Sep 17 00:00:00 2001
From: Egg-03 <111327101+eggy03@users.noreply.github.com>
Date: Sun, 31 May 2026 12:10:02 +0530
Subject: [PATCH 32/66] refactor(messagepinevents): merge helpers into
MessagePinEventHandler
- merge three helper classes from message subpackage into `MessagePinEventHandler`
- move `MessageUtils` to the utility package
Signed-off-by: Egg-03 <111327101+eggy03@users.noreply.github.com>
---
.../auditlog/MessagePinEventHandler.java | 113 ++++++++++++++++++
.../message/MessagePinEventHelper.java | 56 ---------
.../message/MessageUnpinEventHelper.java | 55 ---------
.../auditlog}/MessageUtils.java | 2 +-
4 files changed, 114 insertions(+), 112 deletions(-)
create mode 100644 src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/MessagePinEventHandler.java
delete mode 100644 src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/message/MessagePinEventHelper.java
delete mode 100644 src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/message/MessageUnpinEventHelper.java
rename src/main/java/io/github/eggy03/papertrail/bot/{service/auditlog/message/utils => utils/auditlog}/MessageUtils.java (94%)
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/MessagePinEventHandler.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/MessagePinEventHandler.java
new file mode 100644
index 0000000..4673bef
--- /dev/null
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/MessagePinEventHandler.java
@@ -0,0 +1,113 @@
+package io.github.eggy03.papertrail.bot.service.auditlog;
+
+import io.github.eggy03.papertrail.bot.listeners.auditlog.GuildAuditLogEntryCreateEventHandler;
+import io.github.eggy03.papertrail.bot.utils.auditlog.MessageUtils;
+import io.github.eggy03.papertrail.sdk.client.AuditLogRegistrationClient;
+import io.github.eggy03.papertrail.sdk.entity.AuditLogRegistrationEntity;
+import jakarta.enterprise.context.ApplicationScoped;
+import jakarta.inject.Inject;
+import lombok.NonNull;
+import lombok.extern.slf4j.Slf4j;
+import net.dv8tion.jda.api.EmbedBuilder;
+import net.dv8tion.jda.api.audit.AuditLogEntry;
+import net.dv8tion.jda.api.entities.User;
+import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;
+import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
+import net.dv8tion.jda.api.utils.MarkdownUtil;
+import org.apache.commons.lang3.StringUtils;
+
+import java.awt.Color;
+
+@ApplicationScoped
+@Slf4j
+@SuppressWarnings("java:S1192")
+public class MessagePinEventHandler extends GuildAuditLogEntryCreateEventHandler {
+
+ private final @NonNull AuditLogRegistrationClient client;
+
+ @Inject
+ public MessagePinEventHandler(@NonNull AuditLogRegistrationClient client) {
+ this.client = client;
+ }
+
+ @NonNull
+ private String getRegisteredGuildChannel(@NonNull String guildId) {
+ return client.getRegisteredGuild(guildId)
+ .map(AuditLogRegistrationEntity::getChannelId).orElse(StringUtils.EMPTY);
+
+ }
+
+ private void performChecksThenBuildAndSendEmbed(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull EmbedBuilder embedBuilder, @NonNull String channelIdToSendTo) {
+ if (!embedBuilder.isValidLength() || embedBuilder.isEmpty()) {
+ log.warn("Embed is empty or too long (current length: {}).", embedBuilder.length());
+ return;
+ }
+
+ TextChannel sendingChannel = event.getGuild().getTextChannelById(channelIdToSendTo);
+ if (sendingChannel != null && sendingChannel.canTalk()) {
+ sendingChannel.sendMessageEmbeds(embedBuilder.build()).queue();
+ }
+ }
+
+ @Override
+ public void onMessagePin(@NonNull GuildAuditLogEntryCreateEvent event) {
+ String channelIdToSendTo = getRegisteredGuildChannel(event.getGuild().getId());
+ if (channelIdToSendTo.isBlank()) return;
+
+ AuditLogEntry ale = event.getEntry();
+
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("Audit Log Entry | Message Pin Event");
+
+ User executor = ale.getJDA().getUserById(ale.getUserId());
+ String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
+
+ User target = ale.getJDA().getUserById(ale.getTargetId());
+ String mentionableTarget = (target != null ? target.getAsMention() : ale.getTargetId());
+
+ eb.setDescription(MarkdownUtil.quoteBlock("Message Pinned By: " + mentionableExecutor + "\nMessage Author: " + mentionableTarget));
+ eb.setColor(Color.PINK);
+
+ eb.addField(
+ MarkdownUtil.underline("Pinned Message Jump URL"),
+ MessageUtils.resolveMessageJumpUrlFromId(ale.getOptionByName("channel_id"), ale.getOptionByName("message_id"), event),
+ false
+ );
+
+ eb.setFooter("Audit Log Entry ID: " + ale.getId());
+ eb.setTimestamp(ale.getTimeCreated());
+
+ performChecksThenBuildAndSendEmbed(event, eb, channelIdToSendTo);
+ }
+
+ @Override
+ public void onMessageUnpin(@NonNull GuildAuditLogEntryCreateEvent event) {
+ String channelIdToSendTo = getRegisteredGuildChannel(event.getGuild().getId());
+ if (channelIdToSendTo.isBlank()) return;
+
+ AuditLogEntry ale = event.getEntry();
+
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("Audit Log Entry | Message Unpin Event");
+
+ User executor = ale.getJDA().getUserById(ale.getUserId());
+ String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
+
+ User target = ale.getJDA().getUserById(ale.getTargetId());
+ String mentionableTarget = (target != null ? target.getAsMention() : ale.getTargetId());
+
+ eb.setDescription(MarkdownUtil.quoteBlock("Message Un-Pinned By: " + mentionableExecutor + "\nMessage Author: " + mentionableTarget));
+ eb.setColor(Color.MAGENTA);
+
+ eb.addField(
+ MarkdownUtil.underline("Un-Pinned Message Jump URL"),
+ MessageUtils.resolveMessageJumpUrlFromId(ale.getOptionByName("channel_id"), ale.getOptionByName("message_id"), event),
+ false
+ );
+
+ eb.setFooter("Audit Log Entry ID: " + ale.getId());
+ eb.setTimestamp(ale.getTimeCreated());
+
+ performChecksThenBuildAndSendEmbed(event, eb, channelIdToSendTo);
+ }
+}
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/message/MessagePinEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/message/MessagePinEventHelper.java
deleted file mode 100644
index 5a0a02d..0000000
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/message/MessagePinEventHelper.java
+++ /dev/null
@@ -1,56 +0,0 @@
-package io.github.eggy03.papertrail.bot.service.auditlog.message;
-
-import io.github.eggy03.papertrail.bot.service.auditlog.message.utils.MessageUtils;
-import lombok.NonNull;
-import lombok.experimental.UtilityClass;
-import lombok.extern.slf4j.Slf4j;
-import net.dv8tion.jda.api.EmbedBuilder;
-import net.dv8tion.jda.api.audit.AuditLogEntry;
-import net.dv8tion.jda.api.entities.User;
-import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;
-import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
-import net.dv8tion.jda.api.utils.MarkdownUtil;
-
-import java.awt.Color;
-
-@UtilityClass
-@Slf4j
-public class MessagePinEventHelper {
-
- public static void format(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
-
- AuditLogEntry ale = event.getEntry();
-
- EmbedBuilder eb = new EmbedBuilder();
- eb.setTitle("Audit Log Entry | Message Pin Event");
-
- User executor = ale.getJDA().getUserById(ale.getUserId());
- String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
-
- User target = ale.getJDA().getUserById(ale.getTargetId());
- String mentionableTarget = (target != null ? target.getAsMention() : ale.getTargetId());
-
- eb.setDescription(MarkdownUtil.quoteBlock("Message Pinned By: " + mentionableExecutor + "\nMessage Author: " + mentionableTarget));
- eb.setColor(Color.PINK);
-
- eb.addField(
- MarkdownUtil.underline("Pinned Message Jump URL"),
- MessageUtils.resolveMessageJumpUrlFromId(ale.getOptionByName("channel_id"), ale.getOptionByName("message_id"), event),
- false
- );
-
- eb.setFooter("Audit Log Entry ID: " + ale.getId());
- eb.setTimestamp(ale.getTimeCreated());
-
- if (!eb.isValidLength() || eb.isEmpty()) {
- log.warn("Embed is empty or too long (current length: {}).", eb.length());
- return;
- }
-
- TextChannel sendingChannel = event.getGuild().getTextChannelById(channelIdToSendTo);
- if (sendingChannel != null && sendingChannel.canTalk()) {
- sendingChannel.sendMessageEmbeds(eb.build()).queue();
- }
- }
-
-}
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/message/MessageUnpinEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/message/MessageUnpinEventHelper.java
deleted file mode 100644
index 887aed9..0000000
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/message/MessageUnpinEventHelper.java
+++ /dev/null
@@ -1,55 +0,0 @@
-package io.github.eggy03.papertrail.bot.service.auditlog.message;
-
-import io.github.eggy03.papertrail.bot.service.auditlog.message.utils.MessageUtils;
-import lombok.NonNull;
-import lombok.experimental.UtilityClass;
-import lombok.extern.slf4j.Slf4j;
-import net.dv8tion.jda.api.EmbedBuilder;
-import net.dv8tion.jda.api.audit.AuditLogEntry;
-import net.dv8tion.jda.api.entities.User;
-import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;
-import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
-import net.dv8tion.jda.api.utils.MarkdownUtil;
-
-import java.awt.Color;
-
-@UtilityClass
-@Slf4j
-public class MessageUnpinEventHelper {
-
- public static void format(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
-
- AuditLogEntry ale = event.getEntry();
-
- EmbedBuilder eb = new EmbedBuilder();
- eb.setTitle("Audit Log Entry | Message Unpin Event");
-
- User executor = ale.getJDA().getUserById(ale.getUserId());
- String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
-
- User target = ale.getJDA().getUserById(ale.getTargetId());
- String mentionableTarget = (target != null ? target.getAsMention() : ale.getTargetId());
-
- eb.setDescription(MarkdownUtil.quoteBlock("Message Un-Pinned By: " + mentionableExecutor + "\nMessage Author: " + mentionableTarget));
- eb.setColor(Color.MAGENTA);
-
- eb.addField(
- MarkdownUtil.underline("Un-Pinned Message Jump URL"),
- MessageUtils.resolveMessageJumpUrlFromId(ale.getOptionByName("channel_id"), ale.getOptionByName("message_id"), event),
- false
- );
-
- eb.setFooter("Audit Log Entry ID: " + ale.getId());
- eb.setTimestamp(ale.getTimeCreated());
-
- if (!eb.isValidLength() || eb.isEmpty()) {
- log.warn("Embed is empty or too long (current length: {}).", eb.length());
- return;
- }
-
- TextChannel sendingChannel = event.getGuild().getTextChannelById(channelIdToSendTo);
- if (sendingChannel != null && sendingChannel.canTalk()) {
- sendingChannel.sendMessageEmbeds(eb.build()).queue();
- }
- }
-}
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/message/utils/MessageUtils.java b/src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/MessageUtils.java
similarity index 94%
rename from src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/message/utils/MessageUtils.java
rename to src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/MessageUtils.java
index fffd5de..f75d75a 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/message/utils/MessageUtils.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/MessageUtils.java
@@ -1,4 +1,4 @@
-package io.github.eggy03.papertrail.bot.service.auditlog.message.utils;
+package io.github.eggy03.papertrail.bot.utils.auditlog;
import io.github.eggy03.papertrail.bot.utils.NumberParseUtils;
import lombok.NonNull;
From 744dbf91e2ed895b3cb853e5b34ebd19ac2188f7 Mon Sep 17 00:00:00 2001
From: Egg-03 <111327101+eggy03@users.noreply.github.com>
Date: Sun, 31 May 2026 12:23:29 +0530
Subject: [PATCH 33/66] refactor(onboardingevents): migrate onboarding helpers
to two handlers
Signed-off-by: Egg-03 <111327101+eggy03@users.noreply.github.com>
---
...elper.java => OnboardingEventHandler.java} | 84 +++++--
.../OnboardingPromptEventHandler.java | 217 ++++++++++++++++++
.../OnboardingPromptCreateEventHelper.java | 78 -------
.../OnboardingPromptDeleteEventHelper.java | 75 ------
.../OnboardingPromptUpdateEventHelper.java | 86 -------
.../auditlog}/OnboardingUtils.java | 2 +-
6 files changed, 286 insertions(+), 256 deletions(-)
rename src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/{onboarding/OnboardingUpdateEventHelper.java => OnboardingEventHandler.java} (51%)
create mode 100644 src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/OnboardingPromptEventHandler.java
delete mode 100644 src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/onboarding/OnboardingPromptCreateEventHelper.java
delete mode 100644 src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/onboarding/OnboardingPromptDeleteEventHelper.java
delete mode 100644 src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/onboarding/OnboardingPromptUpdateEventHelper.java
rename src/main/java/io/github/eggy03/papertrail/bot/{service/auditlog/onboarding/utils => utils/auditlog}/OnboardingUtils.java (95%)
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/onboarding/OnboardingUpdateEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/OnboardingEventHandler.java
similarity index 51%
rename from src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/onboarding/OnboardingUpdateEventHelper.java
rename to src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/OnboardingEventHandler.java
index ffabe93..2a2f4ad 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/onboarding/OnboardingUpdateEventHelper.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/OnboardingEventHandler.java
@@ -1,9 +1,13 @@
-package io.github.eggy03.papertrail.bot.service.auditlog.onboarding;
+package io.github.eggy03.papertrail.bot.service.auditlog;
-import io.github.eggy03.papertrail.bot.service.auditlog.onboarding.utils.OnboardingUtils;
+import io.github.eggy03.papertrail.bot.listeners.auditlog.GuildAuditLogEntryCreateEventHandler;
import io.github.eggy03.papertrail.bot.utils.BooleanUtils;
+import io.github.eggy03.papertrail.bot.utils.auditlog.OnboardingUtils;
+import io.github.eggy03.papertrail.sdk.client.AuditLogRegistrationClient;
+import io.github.eggy03.papertrail.sdk.entity.AuditLogRegistrationEntity;
+import jakarta.enterprise.context.ApplicationScoped;
+import jakarta.inject.Inject;
import lombok.NonNull;
-import lombok.experimental.UtilityClass;
import lombok.extern.slf4j.Slf4j;
import net.dv8tion.jda.api.EmbedBuilder;
import net.dv8tion.jda.api.audit.AuditLogEntry;
@@ -12,14 +16,70 @@
import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;
import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
import net.dv8tion.jda.api.utils.MarkdownUtil;
+import org.apache.commons.lang3.StringUtils;
import java.awt.Color;
-@UtilityClass
+@ApplicationScoped
@Slf4j
-public class OnboardingUpdateEventHelper {
+@SuppressWarnings("java:S1192")
+public class OnboardingEventHandler extends GuildAuditLogEntryCreateEventHandler {
- public static void format(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
+ private final @NonNull AuditLogRegistrationClient client;
+
+ @Inject
+ public OnboardingEventHandler(@NonNull AuditLogRegistrationClient client) {
+ this.client = client;
+ }
+
+ @NonNull
+ private String getRegisteredGuildChannel(@NonNull String guildId) {
+ return client.getRegisteredGuild(guildId)
+ .map(AuditLogRegistrationEntity::getChannelId).orElse(StringUtils.EMPTY);
+
+ }
+
+ private void performChecksThenBuildAndSendEmbed(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull EmbedBuilder embedBuilder, @NonNull String channelIdToSendTo) {
+ if (!embedBuilder.isValidLength() || embedBuilder.isEmpty()) {
+ log.warn("Embed is empty or too long (current length: {}).", embedBuilder.length());
+ return;
+ }
+
+ TextChannel sendingChannel = event.getGuild().getTextChannelById(channelIdToSendTo);
+ if (sendingChannel != null && sendingChannel.canTalk()) {
+ sendingChannel.sendMessageEmbeds(embedBuilder.build()).queue();
+ }
+ }
+
+ @Override
+ public void onOnboardingCreate(@NonNull GuildAuditLogEntryCreateEvent event) {
+ log.warn("Onboarding Create Event Detected. Implement this sometime later\n{}", event.getEntry().getChanges());
+
+ String channelIdToSendTo = getRegisteredGuildChannel(event.getGuild().getId());
+ if (channelIdToSendTo.isBlank()) return;
+
+ AuditLogEntry ale = event.getEntry();
+
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("Audit Log Entry | Onboarding Create Event");
+ eb.setColor(Color.LIGHT_GRAY);
+
+ String implementationNotice = "We do not have sufficient data to log the changes in an ONBOARDING_CREATE Event."
+ .concat("That is because, even for Onboarding creations, ONBOARDING_UPDATE is fired")
+ .concat(" A proper implementation might happen in future releases if this event is fired");
+
+ eb.addField("Implementation Notice", MarkdownUtil.codeblock(implementationNotice), false);
+
+ eb.setFooter("Audit Log Entry ID: " + ale.getId());
+ eb.setTimestamp(ale.getTimeCreated());
+
+ performChecksThenBuildAndSendEmbed(event, eb, channelIdToSendTo);
+ }
+
+ @Override
+ public void onOnboardingUpdate(@NonNull GuildAuditLogEntryCreateEvent event) {
+ String channelIdToSendTo = getRegisteredGuildChannel(event.getGuild().getId());
+ if (channelIdToSendTo.isBlank()) return;
AuditLogEntry ale = event.getEntry();
@@ -63,7 +123,7 @@ public static void format(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull
default -> {
eb.addField("Unimplemented Change Key", changeKey, false);
- log.info("Unimplemented Change Key: {}\nOLD_VALUE: {}\nNEW_VALUE: {}", changeKey, oldValue, newValue);
+ log.info("Unimplemented Change Key on Onboarding Update: {}\nOLD_VALUE: {}\nNEW_VALUE: {}", changeKey, oldValue, newValue);
}
}
@@ -72,14 +132,6 @@ public static void format(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull
eb.setFooter("Audit Log Entry ID: " + ale.getId());
eb.setTimestamp(ale.getTimeCreated());
- if (!eb.isValidLength() || eb.isEmpty()) {
- log.warn("Embed is empty or too long (current length: {}).", eb.length());
- return;
- }
-
- TextChannel sendingChannel = event.getGuild().getTextChannelById(channelIdToSendTo);
- if (sendingChannel != null && sendingChannel.canTalk()) {
- sendingChannel.sendMessageEmbeds(eb.build()).queue();
- }
+ performChecksThenBuildAndSendEmbed(event, eb, channelIdToSendTo);
}
}
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/OnboardingPromptEventHandler.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/OnboardingPromptEventHandler.java
new file mode 100644
index 0000000..d889544
--- /dev/null
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/OnboardingPromptEventHandler.java
@@ -0,0 +1,217 @@
+package io.github.eggy03.papertrail.bot.service.auditlog;
+
+import io.github.eggy03.papertrail.bot.listeners.auditlog.GuildAuditLogEntryCreateEventHandler;
+import io.github.eggy03.papertrail.bot.utils.BooleanUtils;
+import io.github.eggy03.papertrail.sdk.client.AuditLogRegistrationClient;
+import io.github.eggy03.papertrail.sdk.entity.AuditLogRegistrationEntity;
+import jakarta.enterprise.context.ApplicationScoped;
+import jakarta.inject.Inject;
+import lombok.NonNull;
+import lombok.extern.slf4j.Slf4j;
+import net.dv8tion.jda.api.EmbedBuilder;
+import net.dv8tion.jda.api.audit.AuditLogEntry;
+import net.dv8tion.jda.api.entities.User;
+import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;
+import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
+import net.dv8tion.jda.api.utils.MarkdownUtil;
+import org.apache.commons.lang3.StringUtils;
+
+import java.awt.Color;
+
+@ApplicationScoped
+@Slf4j
+@SuppressWarnings("java:S1192")
+public class OnboardingPromptEventHandler extends GuildAuditLogEntryCreateEventHandler {
+
+ private final @NonNull AuditLogRegistrationClient client;
+
+ @Inject
+ public OnboardingPromptEventHandler(@NonNull AuditLogRegistrationClient client) {
+ this.client = client;
+ }
+
+ @NonNull
+ private String getRegisteredGuildChannel(@NonNull String guildId) {
+ return client.getRegisteredGuild(guildId)
+ .map(AuditLogRegistrationEntity::getChannelId).orElse(StringUtils.EMPTY);
+
+ }
+
+ private void performChecksThenBuildAndSendEmbed(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull EmbedBuilder embedBuilder, @NonNull String channelIdToSendTo) {
+ if (!embedBuilder.isValidLength() || embedBuilder.isEmpty()) {
+ log.warn("Embed is empty or too long (current length: {}).", embedBuilder.length());
+ return;
+ }
+
+ TextChannel sendingChannel = event.getGuild().getTextChannelById(channelIdToSendTo);
+ if (sendingChannel != null && sendingChannel.canTalk()) {
+ sendingChannel.sendMessageEmbeds(embedBuilder.build()).queue();
+ }
+ }
+
+ @Override
+ public void onOnboardingPromptCreate(@NonNull GuildAuditLogEntryCreateEvent event) {
+ String channelIdToSendTo = getRegisteredGuildChannel(event.getGuild().getId());
+ if (channelIdToSendTo.isBlank()) return;
+
+ AuditLogEntry ale = event.getEntry();
+
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("Audit Log Entry | Onboarding Prompt Create Event");
+
+ User executor = ale.getJDA().getUserById(ale.getUserId());
+ String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getTargetId());
+
+ eb.setDescription(MarkdownUtil.quoteBlock("Onboarding Prompt Created By: " + mentionableExecutor));
+ eb.setColor(Color.GREEN);
+
+ ale.getChanges().forEach((changeKey, changeValue) -> {
+
+ Object oldValue = changeValue.getOldValue();
+ Object newValue = changeValue.getNewValue();
+
+ switch (changeKey) {
+ case "single_select" ->
+ eb.addField(MarkdownUtil.underline("Single Selection Mode"), BooleanUtils.formatToYesOrNo(newValue), false);
+
+ case "required" ->
+ eb.addField(MarkdownUtil.underline("Is Required"), BooleanUtils.formatToYesOrNo(newValue), false);
+
+ case "type", "id" -> {
+ // skip
+ }
+
+ case "title" -> eb.addField(MarkdownUtil.underline("Question Title"), String.valueOf(newValue), false);
+
+ case "options" ->
+ eb.addField(MarkdownUtil.underline("Question Options"), "Review the options in Onboarding Settings", false);
+
+ case "in_onboarding" ->
+ eb.addField(MarkdownUtil.underline("Is a Pre-Join Question"), BooleanUtils.formatToYesOrNo(newValue), false);
+
+ default -> {
+ eb.addField("Unimplemented Change Key", changeKey, false);
+ log.info("Unimplemented Change Key on Onboarding Prompt Create: {}\nOLD_VALUE: {}\nNEW_VALUE: {}", changeKey, oldValue, newValue);
+ }
+ }
+
+ });
+
+ eb.setFooter("Audit Log Entry ID: " + ale.getId());
+ eb.setTimestamp(ale.getTimeCreated());
+
+ performChecksThenBuildAndSendEmbed(event, eb, channelIdToSendTo);
+ }
+
+ @Override
+ public void onOnboardingPromptUpdate(@NonNull GuildAuditLogEntryCreateEvent event) {
+ String channelIdToSendTo = getRegisteredGuildChannel(event.getGuild().getId());
+ if (channelIdToSendTo.isBlank()) return;
+
+ AuditLogEntry ale = event.getEntry();
+
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("Audit Log Entry | Onboarding Prompt Update Event");
+
+ User executor = ale.getJDA().getUserById(ale.getUserId());
+ String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getTargetId());
+
+ eb.setDescription(MarkdownUtil.quoteBlock("Onboarding Prompt Updated By: " + mentionableExecutor));
+ eb.setColor(Color.YELLOW);
+
+ ale.getChanges().forEach((changeKey, changeValue) -> {
+
+ Object oldValue = changeValue.getOldValue();
+ Object newValue = changeValue.getNewValue();
+
+ switch (changeKey) {
+ case "single_select" -> {
+ eb.addField(MarkdownUtil.underline("Old Single Selection Mode"), BooleanUtils.formatToYesOrNo(oldValue), false);
+ eb.addField(MarkdownUtil.underline("New Single Selection Mode"), BooleanUtils.formatToYesOrNo(newValue), false);
+ }
+
+ case "required" -> {
+ eb.addField(MarkdownUtil.underline("Was Required"), BooleanUtils.formatToYesOrNo(oldValue), false);
+ eb.addField(MarkdownUtil.underline("Is Required"), BooleanUtils.formatToYesOrNo(newValue), false);
+ }
+
+ case "type", "id" -> {
+ // skip
+ }
+
+ case "title" -> {
+ eb.addField(MarkdownUtil.underline("Old Question Title"), String.valueOf(oldValue), false);
+ eb.addField(MarkdownUtil.underline("New Question Title"), String.valueOf(newValue), false);
+ }
+
+ case "options" ->
+ eb.addField(MarkdownUtil.underline("Question Options"), "Review the changed options in Onboarding Settings", false);
+
+ case "in_onboarding" -> {
+ eb.addField(MarkdownUtil.underline("Was a Pre-Join Question"), BooleanUtils.formatToYesOrNo(oldValue), false);
+ eb.addField(MarkdownUtil.underline("Is a Pre-Join Question"), BooleanUtils.formatToYesOrNo(newValue), false);
+ }
+
+ default -> {
+ eb.addField("Unimplemented Change Key", changeKey, false);
+ log.info("Unimplemented Change Key on Onboarding Prompt Update: {}\nOLD_VALUE: {}\nNEW_VALUE: {}", changeKey, oldValue, newValue);
+ }
+ }
+ });
+
+ eb.setFooter("Audit Log Entry ID: " + ale.getId());
+ eb.setTimestamp(ale.getTimeCreated());
+
+ performChecksThenBuildAndSendEmbed(event, eb, channelIdToSendTo);
+ }
+
+ @Override
+ public void onOnboardingPromptDelete(@NonNull GuildAuditLogEntryCreateEvent event) {
+ String channelIdToSendTo = getRegisteredGuildChannel(event.getGuild().getId());
+ if (channelIdToSendTo.isBlank()) return;
+
+ AuditLogEntry ale = event.getEntry();
+
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("Audit Log Entry | Onboarding Prompt Delete Event");
+
+ User executor = ale.getJDA().getUserById(ale.getUserId());
+ String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getTargetId());
+
+ eb.setDescription(MarkdownUtil.quoteBlock("Onboarding Prompt Deleted By: " + mentionableExecutor));
+ eb.setColor(Color.RED);
+
+ ale.getChanges().forEach((changeKey, changeValue) -> {
+
+ Object oldValue = changeValue.getOldValue();
+ Object newValue = changeValue.getNewValue();
+
+ switch (changeKey) {
+
+ case "single_select" ->
+ eb.addField(MarkdownUtil.underline("Single Selection Mode"), BooleanUtils.formatToYesOrNo(oldValue), false);
+
+ case "required" ->
+ eb.addField(MarkdownUtil.underline("Was Required"), BooleanUtils.formatToYesOrNo(oldValue), false);
+
+ case "type", "id", "options" -> {
+ // skip
+ }
+ case "title" -> eb.addField(MarkdownUtil.underline("Question Title"), String.valueOf(oldValue), false);
+
+ case "in_onboarding" ->
+ eb.addField(MarkdownUtil.underline("Was a Pre-Join Question"), BooleanUtils.formatToYesOrNo(oldValue), false);
+
+ default -> {
+ eb.addField("Unimplemented Change Key", changeKey, false);
+ log.info("Unimplemented Change Key on Onboarding Prompt Delete: {}\nOLD_VALUE: {}\nNEW_VALUE: {}", changeKey, oldValue, newValue);
+ }
+ }
+ });
+
+ eb.setFooter("Audit Log Entry ID: " + ale.getId());
+ eb.setTimestamp(ale.getTimeCreated());
+
+ performChecksThenBuildAndSendEmbed(event, eb, channelIdToSendTo);
+ }
+}
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/onboarding/OnboardingPromptCreateEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/onboarding/OnboardingPromptCreateEventHelper.java
deleted file mode 100644
index 0191aa1..0000000
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/onboarding/OnboardingPromptCreateEventHelper.java
+++ /dev/null
@@ -1,78 +0,0 @@
-package io.github.eggy03.papertrail.bot.service.auditlog.onboarding;
-
-import io.github.eggy03.papertrail.bot.utils.BooleanUtils;
-import lombok.NonNull;
-import lombok.experimental.UtilityClass;
-import lombok.extern.slf4j.Slf4j;
-import net.dv8tion.jda.api.EmbedBuilder;
-import net.dv8tion.jda.api.audit.AuditLogEntry;
-import net.dv8tion.jda.api.entities.User;
-import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;
-import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
-import net.dv8tion.jda.api.utils.MarkdownUtil;
-
-import java.awt.Color;
-
-@UtilityClass
-@Slf4j
-public class OnboardingPromptCreateEventHelper {
-
- public static void format(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
-
- AuditLogEntry ale = event.getEntry();
-
- EmbedBuilder eb = new EmbedBuilder();
- eb.setTitle("Audit Log Entry | Onboarding Prompt Create Event");
-
- User executor = ale.getJDA().getUserById(ale.getUserId());
- String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getTargetId());
-
- eb.setDescription(MarkdownUtil.quoteBlock("Onboarding Prompt Created By: " + mentionableExecutor));
- eb.setColor(Color.GREEN);
-
- ale.getChanges().forEach((changeKey, changeValue) -> {
-
- Object oldValue = changeValue.getOldValue();
- Object newValue = changeValue.getNewValue();
-
- switch (changeKey) {
- case "single_select" ->
- eb.addField(MarkdownUtil.underline("Single Selection Mode"), BooleanUtils.formatToYesOrNo(newValue), false);
-
- case "required" ->
- eb.addField(MarkdownUtil.underline("Is Required"), BooleanUtils.formatToYesOrNo(newValue), false);
-
- case "type", "id" -> {
- // skip
- }
-
- case "title" -> eb.addField(MarkdownUtil.underline("Question Title"), String.valueOf(newValue), false);
-
- case "options" ->
- eb.addField(MarkdownUtil.underline("Question Options"), "Review the options in Onboarding Settings", false);
-
- case "in_onboarding" ->
- eb.addField(MarkdownUtil.underline("Is a Pre-Join Question"), BooleanUtils.formatToYesOrNo(newValue), false);
-
- default -> {
- eb.addField("Unimplemented Change Key", changeKey, false);
- log.info("Unimplemented Change Key: {}\nOLD_VALUE: {}\nNEW_VALUE: {}", changeKey, oldValue, newValue);
- }
- }
-
- });
-
- eb.setFooter("Audit Log Entry ID: " + ale.getId());
- eb.setTimestamp(ale.getTimeCreated());
-
- if (!eb.isValidLength() || eb.isEmpty()) {
- log.warn("Embed is empty or too long (current length: {}).", eb.length());
- return;
- }
-
- TextChannel sendingChannel = event.getGuild().getTextChannelById(channelIdToSendTo);
- if (sendingChannel != null && sendingChannel.canTalk()) {
- sendingChannel.sendMessageEmbeds(eb.build()).queue();
- }
- }
-}
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/onboarding/OnboardingPromptDeleteEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/onboarding/OnboardingPromptDeleteEventHelper.java
deleted file mode 100644
index a356fe4..0000000
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/onboarding/OnboardingPromptDeleteEventHelper.java
+++ /dev/null
@@ -1,75 +0,0 @@
-package io.github.eggy03.papertrail.bot.service.auditlog.onboarding;
-
-import io.github.eggy03.papertrail.bot.utils.BooleanUtils;
-import lombok.NonNull;
-import lombok.experimental.UtilityClass;
-import lombok.extern.slf4j.Slf4j;
-import net.dv8tion.jda.api.EmbedBuilder;
-import net.dv8tion.jda.api.audit.AuditLogEntry;
-import net.dv8tion.jda.api.entities.User;
-import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;
-import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
-import net.dv8tion.jda.api.utils.MarkdownUtil;
-
-import java.awt.Color;
-
-@UtilityClass
-@Slf4j
-public class OnboardingPromptDeleteEventHelper {
-
- public static void format(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
-
- AuditLogEntry ale = event.getEntry();
-
- EmbedBuilder eb = new EmbedBuilder();
- eb.setTitle("Audit Log Entry | Onboarding Prompt Delete Event");
-
- User executor = ale.getJDA().getUserById(ale.getUserId());
- String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getTargetId());
-
- eb.setDescription(MarkdownUtil.quoteBlock("Onboarding Prompt Deleted By: " + mentionableExecutor));
- eb.setColor(Color.RED);
-
- ale.getChanges().forEach((changeKey, changeValue) -> {
-
- Object oldValue = changeValue.getOldValue();
- Object newValue = changeValue.getNewValue();
-
- switch (changeKey) {
-
- case "single_select" ->
- eb.addField(MarkdownUtil.underline("Single Selection Mode"), BooleanUtils.formatToYesOrNo(oldValue), false);
-
- case "required" ->
- eb.addField(MarkdownUtil.underline("Was Required"), BooleanUtils.formatToYesOrNo(oldValue), false);
-
- case "type", "id", "options" -> {
- // skip
- }
- case "title" -> eb.addField(MarkdownUtil.underline("Question Title"), String.valueOf(oldValue), false);
-
- case "in_onboarding" ->
- eb.addField(MarkdownUtil.underline("Was a Pre-Join Question"), BooleanUtils.formatToYesOrNo(oldValue), false);
-
- default -> {
- eb.addField("Unimplemented Change Key", changeKey, false);
- log.info("Unimplemented Change Key: {}\nOLD_VALUE: {}\nNEW_VALUE: {}", changeKey, oldValue, newValue);
- }
- }
- });
-
- eb.setFooter("Audit Log Entry ID: " + ale.getId());
- eb.setTimestamp(ale.getTimeCreated());
-
- if (!eb.isValidLength() || eb.isEmpty()) {
- log.warn("Embed is empty or too long (current length: {}).", eb.length());
- return;
- }
-
- TextChannel sendingChannel = event.getGuild().getTextChannelById(channelIdToSendTo);
- if (sendingChannel != null && sendingChannel.canTalk()) {
- sendingChannel.sendMessageEmbeds(eb.build()).queue();
- }
- }
-
-}
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/onboarding/OnboardingPromptUpdateEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/onboarding/OnboardingPromptUpdateEventHelper.java
deleted file mode 100644
index 15ff3fd..0000000
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/onboarding/OnboardingPromptUpdateEventHelper.java
+++ /dev/null
@@ -1,86 +0,0 @@
-package io.github.eggy03.papertrail.bot.service.auditlog.onboarding;
-
-import io.github.eggy03.papertrail.bot.utils.BooleanUtils;
-import lombok.NonNull;
-import lombok.experimental.UtilityClass;
-import lombok.extern.slf4j.Slf4j;
-import net.dv8tion.jda.api.EmbedBuilder;
-import net.dv8tion.jda.api.audit.AuditLogEntry;
-import net.dv8tion.jda.api.entities.User;
-import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;
-import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
-import net.dv8tion.jda.api.utils.MarkdownUtil;
-
-import java.awt.Color;
-
-@UtilityClass
-@Slf4j
-public class OnboardingPromptUpdateEventHelper {
-
- public static void format(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
-
- AuditLogEntry ale = event.getEntry();
-
- EmbedBuilder eb = new EmbedBuilder();
- eb.setTitle("Audit Log Entry | Onboarding Prompt Update Event");
-
- User executor = ale.getJDA().getUserById(ale.getUserId());
- String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getTargetId());
-
- eb.setDescription(MarkdownUtil.quoteBlock("Onboarding Prompt Updated By: " + mentionableExecutor));
- eb.setColor(Color.YELLOW);
-
- ale.getChanges().forEach((changeKey, changeValue) -> {
-
- Object oldValue = changeValue.getOldValue();
- Object newValue = changeValue.getNewValue();
-
- switch (changeKey) {
- case "single_select" -> {
- eb.addField(MarkdownUtil.underline("Old Single Selection Mode"), BooleanUtils.formatToYesOrNo(oldValue), false);
- eb.addField(MarkdownUtil.underline("New Single Selection Mode"), BooleanUtils.formatToYesOrNo(newValue), false);
- }
-
- case "required" -> {
- eb.addField(MarkdownUtil.underline("Was Required"), BooleanUtils.formatToYesOrNo(oldValue), false);
- eb.addField(MarkdownUtil.underline("Is Required"), BooleanUtils.formatToYesOrNo(newValue), false);
- }
-
- case "type", "id" -> {
- // skip
- }
-
- case "title" -> {
- eb.addField(MarkdownUtil.underline("Old Question Title"), String.valueOf(oldValue), false);
- eb.addField(MarkdownUtil.underline("New Question Title"), String.valueOf(newValue), false);
- }
-
- case "options" ->
- eb.addField(MarkdownUtil.underline("Question Options"), "Review the changed options in Onboarding Settings", false);
-
- case "in_onboarding" -> {
- eb.addField(MarkdownUtil.underline("Was a Pre-Join Question"), BooleanUtils.formatToYesOrNo(oldValue), false);
- eb.addField(MarkdownUtil.underline("Is a Pre-Join Question"), BooleanUtils.formatToYesOrNo(newValue), false);
- }
-
- default -> {
- eb.addField("Unimplemented Change Key", changeKey, false);
- log.info("Unimplemented Change Key: {}\nOLD_VALUE: {}\nNEW_VALUE: {}", changeKey, oldValue, newValue);
- }
- }
- });
-
- eb.setFooter("Audit Log Entry ID: " + ale.getId());
- eb.setTimestamp(ale.getTimeCreated());
-
- if (!eb.isValidLength() || eb.isEmpty()) {
- log.warn("Embed is empty or too long (current length: {}).", eb.length());
- return;
- }
-
- TextChannel sendingChannel = event.getGuild().getTextChannelById(channelIdToSendTo);
- if (sendingChannel != null && sendingChannel.canTalk()) {
- sendingChannel.sendMessageEmbeds(eb.build()).queue();
- }
- }
-}
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/onboarding/utils/OnboardingUtils.java b/src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/OnboardingUtils.java
similarity index 95%
rename from src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/onboarding/utils/OnboardingUtils.java
rename to src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/OnboardingUtils.java
index 77c6674..04ede5c 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/onboarding/utils/OnboardingUtils.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/OnboardingUtils.java
@@ -1,4 +1,4 @@
-package io.github.eggy03.papertrail.bot.service.auditlog.onboarding.utils;
+package io.github.eggy03.papertrail.bot.utils.auditlog;
import io.github.eggy03.papertrail.bot.utils.NumberParseUtils;
import lombok.NonNull;
From a3ad549cea9aa32bf9c267c69a10dacb3f93a599 Mon Sep 17 00:00:00 2001
From: Egg-03 <111327101+eggy03@users.noreply.github.com>
Date: Sun, 31 May 2026 12:28:08 +0530
Subject: [PATCH 34/66] refactor(scheduledevents): merge helpers into
ScheduledEventEventHandler
- merge three helper classes from scheduledevent subpackage into `ScheduledEventEventHandler`
- move `ScheduledEvent` to the utility package
Signed-off-by: Egg-03 <111327101+eggy03@users.noreply.github.com>
---
.../auditlog/ScheduledEventHandler.java | 206 ++++++++++++++++++
.../ScheduledEventCreateEventHelper.java | 67 ------
.../ScheduledEventDeleteEventHelper.java | 67 ------
.../ScheduledEventUpdateEventHelper.java | 91 --------
.../utils/ScheduledEventUtils.java | 120 ----------
.../utils/auditlog/ScheduledEventUtils.java | 37 ++++
6 files changed, 243 insertions(+), 345 deletions(-)
create mode 100644 src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/ScheduledEventHandler.java
delete mode 100644 src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/scheduledevent/ScheduledEventCreateEventHelper.java
delete mode 100644 src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/scheduledevent/ScheduledEventDeleteEventHelper.java
delete mode 100644 src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/scheduledevent/ScheduledEventUpdateEventHelper.java
delete mode 100644 src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/scheduledevent/utils/ScheduledEventUtils.java
create mode 100644 src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/ScheduledEventUtils.java
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/ScheduledEventHandler.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/ScheduledEventHandler.java
new file mode 100644
index 0000000..a7bcbd4
--- /dev/null
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/ScheduledEventHandler.java
@@ -0,0 +1,206 @@
+package io.github.eggy03.papertrail.bot.service.auditlog;
+
+import io.github.eggy03.papertrail.bot.listeners.auditlog.GuildAuditLogEntryCreateEventHandler;
+import io.github.eggy03.papertrail.bot.utils.auditlog.ScheduledEventUtils;
+import io.github.eggy03.papertrail.sdk.client.AuditLogRegistrationClient;
+import io.github.eggy03.papertrail.sdk.entity.AuditLogRegistrationEntity;
+import jakarta.enterprise.context.ApplicationScoped;
+import jakarta.inject.Inject;
+import lombok.NonNull;
+import lombok.extern.slf4j.Slf4j;
+import net.dv8tion.jda.api.EmbedBuilder;
+import net.dv8tion.jda.api.audit.AuditLogEntry;
+import net.dv8tion.jda.api.entities.User;
+import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;
+import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
+import net.dv8tion.jda.api.utils.MarkdownUtil;
+import org.apache.commons.lang3.StringUtils;
+
+import java.awt.Color;
+
+@ApplicationScoped
+@Slf4j
+@SuppressWarnings("java:S1192")
+public class ScheduledEventHandler extends GuildAuditLogEntryCreateEventHandler {
+
+ private final @NonNull AuditLogRegistrationClient client;
+
+ @Inject
+ public ScheduledEventHandler(@NonNull AuditLogRegistrationClient client) {
+ this.client = client;
+ }
+
+ @NonNull
+ private String getRegisteredGuildChannel(@NonNull String guildId) {
+ return client.getRegisteredGuild(guildId)
+ .map(AuditLogRegistrationEntity::getChannelId).orElse(StringUtils.EMPTY);
+
+ }
+
+ private void performChecksThenBuildAndSendEmbed(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull EmbedBuilder embedBuilder, @NonNull String channelIdToSendTo) {
+ if (!embedBuilder.isValidLength() || embedBuilder.isEmpty()) {
+ log.warn("Embed is empty or too long (current length: {}).", embedBuilder.length());
+ return;
+ }
+
+ TextChannel sendingChannel = event.getGuild().getTextChannelById(channelIdToSendTo);
+ if (sendingChannel != null && sendingChannel.canTalk()) {
+ sendingChannel.sendMessageEmbeds(embedBuilder.build()).queue();
+ }
+ }
+
+ @Override
+ public void onScheduledEventCreate(@NonNull GuildAuditLogEntryCreateEvent event) {
+ String channelIdToSendTo = getRegisteredGuildChannel(event.getGuild().getId());
+ if (channelIdToSendTo.isBlank()) return;
+
+ AuditLogEntry ale = event.getEntry();
+
+ User executor = ale.getJDA().getUserById(ale.getUserIdLong());
+ String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
+
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("Audit Log Entry | Scheduled Event Create Event");
+ eb.setDescription(MarkdownUtil.quoteBlock("Scheduled Event Created By: " + mentionableExecutor));
+ eb.setColor(Color.GREEN);
+
+ ale.getChanges().forEach((changeKey, changeValue) -> {
+ Object oldValue = changeValue.getOldValue();
+ Object newValue = changeValue.getNewValue();
+
+ switch (changeKey) {
+ case "entity_type" ->
+ eb.addField(MarkdownUtil.underline("Event Type"), "╰┈➤" + ScheduledEventUtils.resolveEventType(newValue), false);
+ case "name" -> eb.addField(MarkdownUtil.underline("Event Name"), "╰┈➤" + newValue, false);
+ case "description" -> eb.addField(MarkdownUtil.underline("Event Description"), "╰┈➤" + newValue, false);
+ case "status" ->
+ eb.addField(MarkdownUtil.underline("Event Status"), "╰┈➤" + ScheduledEventUtils.resolveStatusType(newValue), false);
+ case "location" -> eb.addField(MarkdownUtil.underline("Event Location"), "╰┈➤" + newValue, false);
+ case "privacy_level", "image_hash", "channel_id", "recurrence_rule" -> {
+ // skip
+ }
+ default -> {
+ eb.addField("Unimplemented Change Key", changeKey, false);
+ log.info("Unimplemented Change Key on Scheduled Event Create: {}\nOLD_VALUE: {}\nNEW_VALUE: {}", changeKey, oldValue, newValue);
+ }
+ }
+ });
+
+ eb.setFooter("Audit Log Entry ID: " + ale.getId());
+ eb.setTimestamp(ale.getTimeCreated());
+
+
+ performChecksThenBuildAndSendEmbed(event, eb, channelIdToSendTo);
+ }
+
+ @Override
+ public void onScheduledEventUpdate(@NonNull GuildAuditLogEntryCreateEvent event) {
+ String channelIdToSendTo = getRegisteredGuildChannel(event.getGuild().getId());
+ if (channelIdToSendTo.isBlank()) return;
+
+ AuditLogEntry ale = event.getEntry();
+
+ User executor = ale.getJDA().getUserById(ale.getUserIdLong());
+ String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
+
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("Audit Log Entry | Scheduled Event Update Event");
+ eb.setDescription(MarkdownUtil.quoteBlock("Scheduled Event Updated By: " + mentionableExecutor));
+ eb.setColor(Color.YELLOW);
+
+ ale.getChanges().forEach((changeKey, changeValue) -> {
+ Object oldValue = changeValue.getOldValue();
+ Object newValue = changeValue.getNewValue();
+
+ switch (changeKey) {
+ case "entity_type" -> {
+ eb.addField(MarkdownUtil.underline("Old Event Type"), "╰┈➤" + ScheduledEventUtils.resolveEventType(oldValue), true);
+ eb.addField(MarkdownUtil.underline("New Event Type"), "╰┈➤" + ScheduledEventUtils.resolveEventType(newValue), true);
+ eb.addBlankField(true);
+ }
+ case "name" -> {
+ eb.addField(MarkdownUtil.underline("Old Event Name"), "╰┈➤" + oldValue, true);
+ eb.addField(MarkdownUtil.underline("New Event Name"), "╰┈➤" + newValue, true);
+ eb.addBlankField(true);
+ }
+ case "description" -> {
+ eb.addField(MarkdownUtil.underline("Old Event Description"), "╰┈➤" + oldValue, true);
+ eb.addField(MarkdownUtil.underline("New Event Description"), "╰┈➤" + newValue, true);
+ eb.addBlankField(true);
+ }
+ case "status" -> {
+ eb.addField(MarkdownUtil.underline("Old Event Status"), "╰┈➤" + ScheduledEventUtils.resolveStatusType(oldValue), true);
+ eb.addField(MarkdownUtil.underline("New Event Status"), "╰┈➤" + ScheduledEventUtils.resolveStatusType(newValue), true);
+ eb.addBlankField(true);
+ }
+ case "location" -> {
+ eb.addField(MarkdownUtil.underline("Event Location"), "╰┈➤" + oldValue, true);
+ eb.addField(MarkdownUtil.underline("Event Location"), "╰┈➤" + newValue, true);
+ eb.addBlankField(true);
+ }
+ case "privacy_level" ->
+ eb.addField(MarkdownUtil.underline("Privacy"), "╰┈➤Event privacy has been updated", false);
+ case "image_hash" ->
+ eb.addField(MarkdownUtil.underline("Image"), "╰┈➤Event Image has been updated", false);
+ case "channel_id" ->
+ eb.addField(MarkdownUtil.underline("Channel"), "╰┈➤Event Channel has been updated", false);
+ case "recurrence_rule" ->
+ eb.addField(MarkdownUtil.underline("Recurrence Rule"), "╰┈➤Recurrence Rule has been updated", false);
+
+ default -> {
+ eb.addField("Unimplemented Change Key", changeKey, false);
+ log.info("Unimplemented Change Key on Scheduled Event Update: {}\nOLD_VALUE: {}\nNEW_VALUE: {}", changeKey, oldValue, newValue);
+ }
+ }
+ });
+
+ eb.setFooter("Audit Log Entry ID: " + ale.getId());
+ eb.setTimestamp(ale.getTimeCreated());
+
+
+ performChecksThenBuildAndSendEmbed(event, eb, channelIdToSendTo);
+ }
+
+ @Override
+ public void onScheduledEventDelete(@NonNull GuildAuditLogEntryCreateEvent event) {
+ String channelIdToSendTo = getRegisteredGuildChannel(event.getGuild().getId());
+ if (channelIdToSendTo.isBlank()) return;
+
+ AuditLogEntry ale = event.getEntry();
+
+ User executor = ale.getJDA().getUserById(ale.getUserIdLong());
+ String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
+
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("Audit Log Entry | Scheduled Event Delete Event");
+ eb.setDescription(MarkdownUtil.quoteBlock("Scheduled Event Deleted By: " + mentionableExecutor));
+ eb.setColor(Color.RED);
+
+ ale.getChanges().forEach((changeKey, changeValue) -> {
+ Object oldValue = changeValue.getOldValue();
+ Object newValue = changeValue.getNewValue();
+
+ switch (changeKey) {
+ case "entity_type" ->
+ eb.addField(MarkdownUtil.underline("Event Type"), "╰┈➤" + ScheduledEventUtils.resolveEventType(oldValue), false);
+ case "name" -> eb.addField(MarkdownUtil.underline("Event Name"), "╰┈➤" + oldValue, false);
+ case "description" -> eb.addField(MarkdownUtil.underline("Event Description"), "╰┈➤" + oldValue, false);
+ case "status" ->
+ eb.addField(MarkdownUtil.underline("Event Status"), "╰┈➤" + ScheduledEventUtils.resolveStatusType(oldValue), false);
+ case "location" -> eb.addField(MarkdownUtil.underline("Event Location"), "╰┈➤" + oldValue, false);
+ case "privacy_level", "image_hash", "channel_id", "recurrence_rule" -> {
+ // skip
+ }
+ default -> {
+ eb.addField("Unimplemented Change Key", changeKey, false);
+ log.info("Unimplemented Change Key on Scheduled Event Delete: {}\nOLD_VALUE: {}\nNEW_VALUE: {}", changeKey, oldValue, newValue);
+ }
+ }
+ });
+
+ eb.setFooter("Audit Log Entry ID: " + ale.getId());
+ eb.setTimestamp(ale.getTimeCreated());
+
+ performChecksThenBuildAndSendEmbed(event, eb, channelIdToSendTo);
+ }
+}
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/scheduledevent/ScheduledEventCreateEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/scheduledevent/ScheduledEventCreateEventHelper.java
deleted file mode 100644
index bdcfcbe..0000000
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/scheduledevent/ScheduledEventCreateEventHelper.java
+++ /dev/null
@@ -1,67 +0,0 @@
-package io.github.eggy03.papertrail.bot.service.auditlog.scheduledevent;
-
-import io.github.eggy03.papertrail.bot.service.auditlog.scheduledevent.utils.ScheduledEventUtils;
-import lombok.NonNull;
-import lombok.experimental.UtilityClass;
-import lombok.extern.slf4j.Slf4j;
-import net.dv8tion.jda.api.EmbedBuilder;
-import net.dv8tion.jda.api.audit.AuditLogEntry;
-import net.dv8tion.jda.api.entities.User;
-import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;
-import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
-import net.dv8tion.jda.api.utils.MarkdownUtil;
-
-import java.awt.Color;
-
-@UtilityClass
-@Slf4j
-public class ScheduledEventCreateEventHelper {
-
- public static void format(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
-
- AuditLogEntry ale = event.getEntry();
-
- User executor = ale.getJDA().getUserById(ale.getUserIdLong());
- String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
-
- EmbedBuilder eb = new EmbedBuilder();
- eb.setTitle("Audit Log Entry | Scheduled Event Create Event");
- eb.setDescription(MarkdownUtil.quoteBlock("Scheduled Event Created By: " + mentionableExecutor));
- eb.setColor(Color.GREEN);
-
- ale.getChanges().forEach((changeKey, changeValue) -> {
- Object oldValue = changeValue.getOldValue();
- Object newValue = changeValue.getNewValue();
-
- switch (changeKey) {
- case "entity_type" ->
- eb.addField(MarkdownUtil.underline("Event Type"), "╰┈➤" + ScheduledEventUtils.resolveEventType(newValue), false);
- case "name" -> eb.addField(MarkdownUtil.underline("Event Name"), "╰┈➤" + newValue, false);
- case "description" -> eb.addField(MarkdownUtil.underline("Event Description"), "╰┈➤" + newValue, false);
- case "status" ->
- eb.addField(MarkdownUtil.underline("Event Status"), "╰┈➤" + ScheduledEventUtils.resolveStatusType(newValue), false);
- case "location" -> eb.addField(MarkdownUtil.underline("Event Location"), "╰┈➤" + newValue, false);
- case "privacy_level", "image_hash", "channel_id", "recurrence_rule" -> {
- // skip
- }
- default -> {
- eb.addField("Unimplemented Change Key", changeKey, false);
- log.info("Unimplemented Change Key: {}\nOLD_VALUE: {}\nNEW_VALUE: {}", changeKey, oldValue, newValue);
- }
- }
- });
-
- eb.setFooter("Audit Log Entry ID: " + ale.getId());
- eb.setTimestamp(ale.getTimeCreated());
-
- if (!eb.isValidLength() || eb.isEmpty()) {
- log.warn("Embed is empty or too long (current length: {}).", eb.length());
- return;
- }
-
- TextChannel sendingChannel = event.getGuild().getTextChannelById(channelIdToSendTo);
- if (sendingChannel != null && sendingChannel.canTalk()) {
- sendingChannel.sendMessageEmbeds(eb.build()).queue();
- }
- }
-}
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/scheduledevent/ScheduledEventDeleteEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/scheduledevent/ScheduledEventDeleteEventHelper.java
deleted file mode 100644
index 4387f70..0000000
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/scheduledevent/ScheduledEventDeleteEventHelper.java
+++ /dev/null
@@ -1,67 +0,0 @@
-package io.github.eggy03.papertrail.bot.service.auditlog.scheduledevent;
-
-import io.github.eggy03.papertrail.bot.service.auditlog.scheduledevent.utils.ScheduledEventUtils;
-import lombok.NonNull;
-import lombok.experimental.UtilityClass;
-import lombok.extern.slf4j.Slf4j;
-import net.dv8tion.jda.api.EmbedBuilder;
-import net.dv8tion.jda.api.audit.AuditLogEntry;
-import net.dv8tion.jda.api.entities.User;
-import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;
-import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
-import net.dv8tion.jda.api.utils.MarkdownUtil;
-
-import java.awt.Color;
-
-@UtilityClass
-@Slf4j
-public class ScheduledEventDeleteEventHelper {
-
- public static void format(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
-
- AuditLogEntry ale = event.getEntry();
-
- User executor = ale.getJDA().getUserById(ale.getUserIdLong());
- String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
-
- EmbedBuilder eb = new EmbedBuilder();
- eb.setTitle("Audit Log Entry | Scheduled Event Delete Event");
- eb.setDescription(MarkdownUtil.quoteBlock("Scheduled Event Deleted By: " + mentionableExecutor));
- eb.setColor(Color.RED);
-
- ale.getChanges().forEach((changeKey, changeValue) -> {
- Object oldValue = changeValue.getOldValue();
- Object newValue = changeValue.getNewValue();
-
- switch (changeKey) {
- case "entity_type" ->
- eb.addField(MarkdownUtil.underline("Event Type"), "╰┈➤" + ScheduledEventUtils.resolveEventType(oldValue), false);
- case "name" -> eb.addField(MarkdownUtil.underline("Event Name"), "╰┈➤" + oldValue, false);
- case "description" -> eb.addField(MarkdownUtil.underline("Event Description"), "╰┈➤" + oldValue, false);
- case "status" ->
- eb.addField(MarkdownUtil.underline("Event Status"), "╰┈➤" + ScheduledEventUtils.resolveStatusType(oldValue), false);
- case "location" -> eb.addField(MarkdownUtil.underline("Event Location"), "╰┈➤" + oldValue, false);
- case "privacy_level", "image_hash", "channel_id", "recurrence_rule" -> {
- // skip
- }
- default -> {
- eb.addField("Unimplemented Change Key", changeKey, false);
- log.info("Unimplemented Change Key: {}\nOLD_VALUE: {}\nNEW_VALUE: {}", changeKey, oldValue, newValue);
- }
- }
- });
-
- eb.setFooter("Audit Log Entry ID: " + ale.getId());
- eb.setTimestamp(ale.getTimeCreated());
-
- if (!eb.isValidLength() || eb.isEmpty()) {
- log.warn("Embed is empty or too long (current length: {}).", eb.length());
- return;
- }
-
- TextChannel sendingChannel = event.getGuild().getTextChannelById(channelIdToSendTo);
- if (sendingChannel != null && sendingChannel.canTalk()) {
- sendingChannel.sendMessageEmbeds(eb.build()).queue();
- }
- }
-}
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/scheduledevent/ScheduledEventUpdateEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/scheduledevent/ScheduledEventUpdateEventHelper.java
deleted file mode 100644
index e1722f9..0000000
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/scheduledevent/ScheduledEventUpdateEventHelper.java
+++ /dev/null
@@ -1,91 +0,0 @@
-package io.github.eggy03.papertrail.bot.service.auditlog.scheduledevent;
-
-import io.github.eggy03.papertrail.bot.service.auditlog.scheduledevent.utils.ScheduledEventUtils;
-import lombok.NonNull;
-import lombok.experimental.UtilityClass;
-import lombok.extern.slf4j.Slf4j;
-import net.dv8tion.jda.api.EmbedBuilder;
-import net.dv8tion.jda.api.audit.AuditLogEntry;
-import net.dv8tion.jda.api.entities.User;
-import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;
-import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
-import net.dv8tion.jda.api.utils.MarkdownUtil;
-
-import java.awt.Color;
-
-@UtilityClass
-@Slf4j
-public class ScheduledEventUpdateEventHelper {
-
- public static void format(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
-
- AuditLogEntry ale = event.getEntry();
-
- User executor = ale.getJDA().getUserById(ale.getUserIdLong());
- String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
-
- EmbedBuilder eb = new EmbedBuilder();
- eb.setTitle("Audit Log Entry | Scheduled Event Update Event");
- eb.setDescription(MarkdownUtil.quoteBlock("Scheduled Event Updated By: " + mentionableExecutor));
- eb.setColor(Color.YELLOW);
-
- ale.getChanges().forEach((changeKey, changeValue) -> {
- Object oldValue = changeValue.getOldValue();
- Object newValue = changeValue.getNewValue();
-
- switch (changeKey) {
- case "entity_type" -> {
- eb.addField(MarkdownUtil.underline("Old Event Type"), "╰┈➤" + ScheduledEventUtils.resolveEventType(oldValue), true);
- eb.addField(MarkdownUtil.underline("New Event Type"), "╰┈➤" + ScheduledEventUtils.resolveEventType(newValue), true);
- eb.addBlankField(true);
- }
- case "name" -> {
- eb.addField(MarkdownUtil.underline("Old Event Name"), "╰┈➤" + oldValue, true);
- eb.addField(MarkdownUtil.underline("New Event Name"), "╰┈➤" + newValue, true);
- eb.addBlankField(true);
- }
- case "description" -> {
- eb.addField(MarkdownUtil.underline("Old Event Description"), "╰┈➤" + oldValue, true);
- eb.addField(MarkdownUtil.underline("New Event Description"), "╰┈➤" + newValue, true);
- eb.addBlankField(true);
- }
- case "status" -> {
- eb.addField(MarkdownUtil.underline("Old Event Status"), "╰┈➤" + ScheduledEventUtils.resolveStatusType(oldValue), true);
- eb.addField(MarkdownUtil.underline("New Event Status"), "╰┈➤" + ScheduledEventUtils.resolveStatusType(newValue), true);
- eb.addBlankField(true);
- }
- case "location" -> {
- eb.addField(MarkdownUtil.underline("Event Location"), "╰┈➤" + oldValue, true);
- eb.addField(MarkdownUtil.underline("Event Location"), "╰┈➤" + newValue, true);
- eb.addBlankField(true);
- }
- case "privacy_level" ->
- eb.addField(MarkdownUtil.underline("Privacy"), "╰┈➤Event privacy has been updated", false);
- case "image_hash" ->
- eb.addField(MarkdownUtil.underline("Image"), "╰┈➤Event Image has been updated", false);
- case "channel_id" ->
- eb.addField(MarkdownUtil.underline("Channel"), "╰┈➤Event Channel has been updated", false);
- case "recurrence_rule" ->
- eb.addField(MarkdownUtil.underline("Recurrence Rule"), "╰┈➤Recurrence Rule has been updated", false);
-
- default -> {
- eb.addField("Unimplemented Change Key", changeKey, false);
- log.info("Unimplemented Change Key: {}\nOLD_VALUE: {}\nNEW_VALUE: {}", changeKey, oldValue, newValue);
- }
- }
- });
-
- eb.setFooter("Audit Log Entry ID: " + ale.getId());
- eb.setTimestamp(ale.getTimeCreated());
-
- if (!eb.isValidLength() || eb.isEmpty()) {
- log.warn("Embed is empty or too long (current length: {}).", eb.length());
- return;
- }
-
- TextChannel sendingChannel = event.getGuild().getTextChannelById(channelIdToSendTo);
- if (sendingChannel != null && sendingChannel.canTalk()) {
- sendingChannel.sendMessageEmbeds(eb.build()).queue();
- }
- }
-}
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/scheduledevent/utils/ScheduledEventUtils.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/scheduledevent/utils/ScheduledEventUtils.java
deleted file mode 100644
index 8a15dad..0000000
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/scheduledevent/utils/ScheduledEventUtils.java
+++ /dev/null
@@ -1,120 +0,0 @@
-package io.github.eggy03.papertrail.bot.service.auditlog.scheduledevent.utils;
-
-import io.github.eggy03.papertrail.bot.utils.NumberParseUtils;
-import lombok.NonNull;
-import lombok.experimental.UtilityClass;
-import lombok.extern.slf4j.Slf4j;
-import net.dv8tion.jda.api.entities.ScheduledEvent;
-import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
-
-import java.util.Map;
-
-@UtilityClass
-@Slf4j
-public class ScheduledEventUtils {
-
- @NonNull
- public static final String FALLBACK_STRING = "N/A";
-
- @NotNull
- public static String resolveEventType(@Nullable Object eventTypeInteger) {
-
- Integer eventType = NumberParseUtils.parseInt(eventTypeInteger);
- if (eventType == null)
- return FALLBACK_STRING;
-
- return ScheduledEvent.Type.fromKey(eventType).name();
-
- }
-
- @NotNull
- public static String resolveStatusType(@Nullable Object eventTypeInteger) {
- Integer eventType = NumberParseUtils.parseInt(eventTypeInteger);
- if (eventType == null)
- return FALLBACK_STRING;
-
- return ScheduledEvent.Status.fromKey(eventType).name();
- }
-
-
- /**
- * @deprecated
- */
- @NotNull
- @Deprecated(forRemoval = true)
- public static String resolveRecurrenceRules(@Nullable Object recurrenceRuleStructure) {
-
- if (recurrenceRuleStructure == null) {
- log.debug("recurrence rule object was null");
- return FALLBACK_STRING;
- }
-
- StringBuilder stringBuilder = new StringBuilder();
- if (recurrenceRuleStructure instanceof Map, ?> recurrenceRuleMap) {
-
- stringBuilder.append("**_Start Time of Interval_**")
- .append(System.lineSeparator())
- .append("╰┈➤")
- .append(recurrenceRuleMap.get("start"))
- .append(System.lineSeparator());
-
- stringBuilder.append("**_End Time of Interval_**")
- .append(System.lineSeparator())
- .append("╰┈➤")
- .append(recurrenceRuleMap.get("end"))
- .append(System.lineSeparator());
-
- stringBuilder.append("**_Frequency of Interval_**")
- .append(System.lineSeparator())
- .append("╰┈➤")
- .append(recurrenceRuleMap.get("frequency"))
- .append(System.lineSeparator());
-
- stringBuilder.append("**_Spacing between events_**")
- .append(System.lineSeparator())
- .append("╰┈➤")
- .append(recurrenceRuleMap.get("interval"))
- .append(System.lineSeparator());
-
- stringBuilder.append("**_Weekday Recurrence_**")
- .append(System.lineSeparator())
- .append("╰┈➤")
- .append(recurrenceRuleMap.get("by_weekday"))
- .append(System.lineSeparator());
-
- stringBuilder.append("**_Specific days within a weekday to recur on_**")
- .append(System.lineSeparator())
- .append("╰┈➤")
- .append(recurrenceRuleMap.get("by_n_weekday"))
- .append(System.lineSeparator());
-
- stringBuilder.append("**_Monthly Recurrence_**")
- .append(System.lineSeparator())
- .append("╰┈➤")
- .append(recurrenceRuleMap.get("by_month"))
- .append(System.lineSeparator());
-
- stringBuilder.append("**_Specific days within a month to recur on_**")
- .append(System.lineSeparator())
- .append("╰┈➤")
- .append(recurrenceRuleMap.get("by_month_day"))
- .append(System.lineSeparator());
-
- stringBuilder.append("**_Set of days within a year to recur on_**")
- .append(System.lineSeparator())
- .append("╰┈➤")
- .append(recurrenceRuleMap.get("by_year_day"))
- .append(System.lineSeparator());
-
- stringBuilder.append("**_Event to be repeated_**")
- .append(System.lineSeparator())
- .append("╰┈➤")
- .append(recurrenceRuleMap.get("count"));
-
- } else
- log.debug("Recurrence rule object was not an instance of a map, value: {}", recurrenceRuleStructure);
-
- return stringBuilder.toString().trim();
- }
-}
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/ScheduledEventUtils.java b/src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/ScheduledEventUtils.java
new file mode 100644
index 0000000..b50d598
--- /dev/null
+++ b/src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/ScheduledEventUtils.java
@@ -0,0 +1,37 @@
+package io.github.eggy03.papertrail.bot.utils.auditlog;
+
+import io.github.eggy03.papertrail.bot.utils.NumberParseUtils;
+import lombok.NonNull;
+import lombok.experimental.UtilityClass;
+import lombok.extern.slf4j.Slf4j;
+import net.dv8tion.jda.api.entities.ScheduledEvent;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+@UtilityClass
+@Slf4j
+public class ScheduledEventUtils {
+
+ @NonNull
+ public static final String FALLBACK_STRING = "N/A";
+
+ @NotNull
+ public static String resolveEventType(@Nullable Object eventTypeInteger) {
+
+ Integer eventType = NumberParseUtils.parseInt(eventTypeInteger);
+ if (eventType == null)
+ return FALLBACK_STRING;
+
+ return ScheduledEvent.Type.fromKey(eventType).name();
+
+ }
+
+ @NotNull
+ public static String resolveStatusType(@Nullable Object eventTypeInteger) {
+ Integer eventType = NumberParseUtils.parseInt(eventTypeInteger);
+ if (eventType == null)
+ return FALLBACK_STRING;
+
+ return ScheduledEvent.Status.fromKey(eventType).name();
+ }
+}
From 45ff37bea536613c74fcb5c65441016753422498 Mon Sep 17 00:00:00 2001
From: Egg-03 <111327101+eggy03@users.noreply.github.com>
Date: Sun, 31 May 2026 12:31:13 +0530
Subject: [PATCH 35/66] refactor(stageinstanceevents): merge helpers into
StageInstanceEventHandler
- merge three helper classes from stage subpackage into `StageInstanceEventHandler`
- move `StageInstanceUtils` to the utility package
Signed-off-by: Egg-03 <111327101+eggy03@users.noreply.github.com>
---
.../auditlog/StageInstanceEventHandler.java | 170 ++++++++++++++++++
.../stage/StageInstanceCreateEventHelper.java | 62 -------
.../stage/StageInstanceDeleteEventHelper.java | 61 -------
.../stage/StageInstanceUpdateEventHelper.java | 68 -------
.../utils => utils/auditlog}/StageUtils.java | 2 +-
5 files changed, 171 insertions(+), 192 deletions(-)
create mode 100644 src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/StageInstanceEventHandler.java
delete mode 100644 src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/stage/StageInstanceCreateEventHelper.java
delete mode 100644 src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/stage/StageInstanceDeleteEventHelper.java
delete mode 100644 src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/stage/StageInstanceUpdateEventHelper.java
rename src/main/java/io/github/eggy03/papertrail/bot/{service/auditlog/stage/utils => utils/auditlog}/StageUtils.java (91%)
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/StageInstanceEventHandler.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/StageInstanceEventHandler.java
new file mode 100644
index 0000000..521793b
--- /dev/null
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/StageInstanceEventHandler.java
@@ -0,0 +1,170 @@
+package io.github.eggy03.papertrail.bot.service.auditlog;
+
+import io.github.eggy03.papertrail.bot.listeners.auditlog.GuildAuditLogEntryCreateEventHandler;
+import io.github.eggy03.papertrail.bot.utils.auditlog.StageUtils;
+import io.github.eggy03.papertrail.sdk.client.AuditLogRegistrationClient;
+import io.github.eggy03.papertrail.sdk.entity.AuditLogRegistrationEntity;
+import jakarta.enterprise.context.ApplicationScoped;
+import jakarta.inject.Inject;
+import lombok.NonNull;
+import lombok.extern.slf4j.Slf4j;
+import net.dv8tion.jda.api.EmbedBuilder;
+import net.dv8tion.jda.api.audit.AuditLogEntry;
+import net.dv8tion.jda.api.entities.User;
+import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;
+import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
+import net.dv8tion.jda.api.utils.MarkdownUtil;
+import org.apache.commons.lang3.StringUtils;
+
+import java.awt.Color;
+
+@ApplicationScoped
+@Slf4j
+@SuppressWarnings("java:S1192")
+public class StageInstanceEventHandler extends GuildAuditLogEntryCreateEventHandler {
+
+ private final @NonNull AuditLogRegistrationClient client;
+
+ @Inject
+ public StageInstanceEventHandler(@NonNull AuditLogRegistrationClient client) {
+ this.client = client;
+ }
+
+ @NonNull
+ private String getRegisteredGuildChannel(@NonNull String guildId) {
+ return client.getRegisteredGuild(guildId)
+ .map(AuditLogRegistrationEntity::getChannelId).orElse(StringUtils.EMPTY);
+
+ }
+
+ private void performChecksThenBuildAndSendEmbed(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull EmbedBuilder embedBuilder, @NonNull String channelIdToSendTo) {
+ if (!embedBuilder.isValidLength() || embedBuilder.isEmpty()) {
+ log.warn("Embed is empty or too long (current length: {}).", embedBuilder.length());
+ return;
+ }
+
+ TextChannel sendingChannel = event.getGuild().getTextChannelById(channelIdToSendTo);
+ if (sendingChannel != null && sendingChannel.canTalk()) {
+ sendingChannel.sendMessageEmbeds(embedBuilder.build()).queue();
+ }
+ }
+
+ @Override
+ public void onStageInstanceCreate(@NonNull GuildAuditLogEntryCreateEvent event) {
+ String channelIdToSendTo = getRegisteredGuildChannel(event.getGuild().getId());
+ if (channelIdToSendTo.isBlank()) return;
+
+ AuditLogEntry ale = event.getEntry();
+
+ User executor = ale.getJDA().getUserById(ale.getUserIdLong());
+ String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
+
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("Audit Log Entry | Stage Instance Create Event");
+ eb.setDescription(MarkdownUtil.quoteBlock("Stage Instance Created By: " + mentionableExecutor));
+ eb.setColor(Color.GREEN);
+
+ ale.getChanges().forEach((changeKey, changeValue) -> {
+ Object oldValue = changeValue.getOldValue();
+ Object newValue = changeValue.getNewValue();
+
+ switch (changeKey) {
+ case "topic" -> eb.addField(MarkdownUtil.underline("Stage Topic"), "╰┈➤" + newValue, false);
+
+ case "privacy_level" ->
+ eb.addField(MarkdownUtil.underline("Stage Privacy"), "╰┈➤" + StageUtils.resolveStagePrivacyLevel(newValue), false);
+
+ default -> {
+ eb.addField("Unimplemented Change Key", changeKey, false);
+ log.info("Unimplemented Change Key on Stage Instance Create: {}\nOLD_VALUE: {}\nNEW_VALUE: {}", changeKey, oldValue, newValue);
+ }
+ }
+ });
+
+ eb.setFooter("Audit Log Entry ID: " + ale.getId());
+ eb.setTimestamp(ale.getTimeCreated());
+
+ performChecksThenBuildAndSendEmbed(event, eb, channelIdToSendTo);
+ }
+
+ @Override
+ public void onStageInstanceUpdate(@NonNull GuildAuditLogEntryCreateEvent event) {
+ String channelIdToSendTo = getRegisteredGuildChannel(event.getGuild().getId());
+ if (channelIdToSendTo.isBlank()) return;
+
+ AuditLogEntry ale = event.getEntry();
+
+ User executor = ale.getJDA().getUserById(ale.getUserIdLong());
+ String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
+
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("Audit Log Entry | Stage Instance Update Event");
+ eb.setDescription(MarkdownUtil.quoteBlock("Stage Instance Updated By: " + mentionableExecutor));
+ eb.setColor(Color.YELLOW);
+
+ ale.getChanges().forEach((changeKey, changeValue) -> {
+ Object oldValue = changeValue.getOldValue();
+ Object newValue = changeValue.getNewValue();
+
+ switch (changeKey) {
+ case "topic" -> {
+ eb.addField(MarkdownUtil.underline("Old Stage Topic"), "╰┈➤" + oldValue, true);
+ eb.addField(MarkdownUtil.underline("New Stage Topic"), "╰┈➤" + newValue, true);
+ eb.addBlankField(true);
+ }
+ case "privacy_level" -> {
+ eb.addField(MarkdownUtil.underline("Old Stage Privacy"), "╰┈➤" + StageUtils.resolveStagePrivacyLevel(oldValue), true);
+ eb.addField(MarkdownUtil.underline("New Stage Privacy"), "╰┈➤" + StageUtils.resolveStagePrivacyLevel(newValue), true);
+ eb.addBlankField(true);
+ }
+
+ default -> {
+ eb.addField("Unimplemented Change Key", changeKey, false);
+ log.info("Unimplemented Change Key on Stage Instance Update: {}\nOLD_VALUE: {}\nNEW_VALUE: {}", changeKey, oldValue, newValue);
+ }
+ }
+ });
+
+ eb.setFooter("Audit Log Entry ID: " + ale.getId());
+ eb.setTimestamp(ale.getTimeCreated());
+
+ performChecksThenBuildAndSendEmbed(event, eb, channelIdToSendTo);
+ }
+
+ @Override
+ public void onStageInstanceDelete(@NonNull GuildAuditLogEntryCreateEvent event) {
+ String channelIdToSendTo = getRegisteredGuildChannel(event.getGuild().getId());
+ if (channelIdToSendTo.isBlank()) return;
+
+ AuditLogEntry ale = event.getEntry();
+
+ User executor = ale.getJDA().getUserById(ale.getUserIdLong());
+ String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
+
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("Audit Log Entry | Stage Instance Delete Event");
+ eb.setDescription(MarkdownUtil.quoteBlock("Stage Instance Deleted By: " + mentionableExecutor));
+ eb.setColor(Color.RED);
+
+ ale.getChanges().forEach((changeKey, changeValue) -> {
+ Object oldValue = changeValue.getOldValue();
+ Object newValue = changeValue.getNewValue();
+
+ switch (changeKey) {
+ case "topic" -> eb.addField(MarkdownUtil.underline("Stage Topic"), "╰┈➤" + oldValue, false);
+
+ case "privacy_level" ->
+ eb.addField(MarkdownUtil.underline("Stage Privacy"), "╰┈➤" + StageUtils.resolveStagePrivacyLevel(oldValue), false);
+
+ default -> {
+ eb.addField("Unimplemented Change Key", changeKey, false);
+ log.info("Unimplemented Change Key on Stage Instance Delete: {}\nOLD_VALUE: {}\nNEW_VALUE: {}", changeKey, oldValue, newValue);
+ }
+ }
+ });
+ eb.setFooter("Audit Log Entry ID: " + ale.getId());
+ eb.setTimestamp(ale.getTimeCreated());
+
+ performChecksThenBuildAndSendEmbed(event, eb, channelIdToSendTo);
+ }
+}
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/stage/StageInstanceCreateEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/stage/StageInstanceCreateEventHelper.java
deleted file mode 100644
index 44f4aec..0000000
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/stage/StageInstanceCreateEventHelper.java
+++ /dev/null
@@ -1,62 +0,0 @@
-package io.github.eggy03.papertrail.bot.service.auditlog.stage;
-
-import io.github.eggy03.papertrail.bot.service.auditlog.stage.utils.StageUtils;
-import lombok.NonNull;
-import lombok.experimental.UtilityClass;
-import lombok.extern.slf4j.Slf4j;
-import net.dv8tion.jda.api.EmbedBuilder;
-import net.dv8tion.jda.api.audit.AuditLogEntry;
-import net.dv8tion.jda.api.entities.User;
-import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;
-import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
-import net.dv8tion.jda.api.utils.MarkdownUtil;
-
-import java.awt.Color;
-
-@UtilityClass
-@Slf4j
-public class StageInstanceCreateEventHelper {
-
- public static void format(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
-
- AuditLogEntry ale = event.getEntry();
-
- User executor = ale.getJDA().getUserById(ale.getUserIdLong());
- String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
-
- EmbedBuilder eb = new EmbedBuilder();
- eb.setTitle("Audit Log Entry | Stage Instance Create Event");
- eb.setDescription(MarkdownUtil.quoteBlock("Stage Instance Created By: " + mentionableExecutor));
- eb.setColor(Color.GREEN);
-
- ale.getChanges().forEach((changeKey, changeValue) -> {
- Object oldValue = changeValue.getOldValue();
- Object newValue = changeValue.getNewValue();
-
- switch (changeKey) {
- case "topic" -> eb.addField(MarkdownUtil.underline("Stage Topic"), "╰┈➤" + newValue, false);
-
- case "privacy_level" ->
- eb.addField(MarkdownUtil.underline("Stage Privacy"), "╰┈➤" + StageUtils.resolveStagePrivacyLevel(newValue), false);
-
- default -> {
- eb.addField("Unimplemented Change Key", changeKey, false);
- log.info("Unimplemented Change Key: {}\nOLD_VALUE: {}\nNEW_VALUE: {}", changeKey, oldValue, newValue);
- }
- }
- });
-
- eb.setFooter("Audit Log Entry ID: " + ale.getId());
- eb.setTimestamp(ale.getTimeCreated());
-
- if (!eb.isValidLength() || eb.isEmpty()) {
- log.warn("Embed is empty or too long (current length: {}).", eb.length());
- return;
- }
-
- TextChannel sendingChannel = event.getGuild().getTextChannelById(channelIdToSendTo);
- if (sendingChannel != null && sendingChannel.canTalk()) {
- sendingChannel.sendMessageEmbeds(eb.build()).queue();
- }
- }
-}
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/stage/StageInstanceDeleteEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/stage/StageInstanceDeleteEventHelper.java
deleted file mode 100644
index 1add32b..0000000
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/stage/StageInstanceDeleteEventHelper.java
+++ /dev/null
@@ -1,61 +0,0 @@
-package io.github.eggy03.papertrail.bot.service.auditlog.stage;
-
-import io.github.eggy03.papertrail.bot.service.auditlog.stage.utils.StageUtils;
-import lombok.NonNull;
-import lombok.experimental.UtilityClass;
-import lombok.extern.slf4j.Slf4j;
-import net.dv8tion.jda.api.EmbedBuilder;
-import net.dv8tion.jda.api.audit.AuditLogEntry;
-import net.dv8tion.jda.api.entities.User;
-import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;
-import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
-import net.dv8tion.jda.api.utils.MarkdownUtil;
-
-import java.awt.Color;
-
-@UtilityClass
-@Slf4j
-public class StageInstanceDeleteEventHelper {
-
- public static void format(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
-
- AuditLogEntry ale = event.getEntry();
-
- User executor = ale.getJDA().getUserById(ale.getUserIdLong());
- String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
-
- EmbedBuilder eb = new EmbedBuilder();
- eb.setTitle("Audit Log Entry | Stage Instance Delete Event");
- eb.setDescription(MarkdownUtil.quoteBlock("Stage Instance Deleted By: " + mentionableExecutor));
- eb.setColor(Color.RED);
-
- ale.getChanges().forEach((changeKey, changeValue) -> {
- Object oldValue = changeValue.getOldValue();
- Object newValue = changeValue.getNewValue();
-
- switch (changeKey) {
- case "topic" -> eb.addField(MarkdownUtil.underline("Stage Topic"), "╰┈➤" + oldValue, false);
-
- case "privacy_level" ->
- eb.addField(MarkdownUtil.underline("Stage Privacy"), "╰┈➤" + StageUtils.resolveStagePrivacyLevel(oldValue), false);
-
- default -> {
- eb.addField("Unimplemented Change Key", changeKey, false);
- log.info("Unimplemented Change Key: {}\nOLD_VALUE: {}\nNEW_VALUE: {}", changeKey, oldValue, newValue);
- }
- }
- });
- eb.setFooter("Audit Log Entry ID: " + ale.getId());
- eb.setTimestamp(ale.getTimeCreated());
-
- if (!eb.isValidLength() || eb.isEmpty()) {
- log.warn("Embed is empty or too long (current length: {}).", eb.length());
- return;
- }
-
- TextChannel sendingChannel = event.getGuild().getTextChannelById(channelIdToSendTo);
- if (sendingChannel != null && sendingChannel.canTalk()) {
- sendingChannel.sendMessageEmbeds(eb.build()).queue();
- }
- }
-}
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/stage/StageInstanceUpdateEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/stage/StageInstanceUpdateEventHelper.java
deleted file mode 100644
index e321d62..0000000
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/stage/StageInstanceUpdateEventHelper.java
+++ /dev/null
@@ -1,68 +0,0 @@
-package io.github.eggy03.papertrail.bot.service.auditlog.stage;
-
-import io.github.eggy03.papertrail.bot.service.auditlog.stage.utils.StageUtils;
-import lombok.NonNull;
-import lombok.experimental.UtilityClass;
-import lombok.extern.slf4j.Slf4j;
-import net.dv8tion.jda.api.EmbedBuilder;
-import net.dv8tion.jda.api.audit.AuditLogEntry;
-import net.dv8tion.jda.api.entities.User;
-import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;
-import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
-import net.dv8tion.jda.api.utils.MarkdownUtil;
-
-import java.awt.Color;
-
-@UtilityClass
-@Slf4j
-public class StageInstanceUpdateEventHelper {
-
- public static void format(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
-
- AuditLogEntry ale = event.getEntry();
-
- User executor = ale.getJDA().getUserById(ale.getUserIdLong());
- String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
-
- EmbedBuilder eb = new EmbedBuilder();
- eb.setTitle("Audit Log Entry | Stage Instance Update Event");
- eb.setDescription(MarkdownUtil.quoteBlock("Stage Instance Updated By: " + mentionableExecutor));
- eb.setColor(Color.YELLOW);
-
- ale.getChanges().forEach((changeKey, changeValue) -> {
- Object oldValue = changeValue.getOldValue();
- Object newValue = changeValue.getNewValue();
-
- switch (changeKey) {
- case "topic" -> {
- eb.addField(MarkdownUtil.underline("Old Stage Topic"), "╰┈➤" + oldValue, true);
- eb.addField(MarkdownUtil.underline("New Stage Topic"), "╰┈➤" + newValue, true);
- eb.addBlankField(true);
- }
- case "privacy_level" -> {
- eb.addField(MarkdownUtil.underline("Old Stage Privacy"), "╰┈➤" + StageUtils.resolveStagePrivacyLevel(oldValue), true);
- eb.addField(MarkdownUtil.underline("New Stage Privacy"), "╰┈➤" + StageUtils.resolveStagePrivacyLevel(newValue), true);
- eb.addBlankField(true);
- }
-
- default -> {
- eb.addField("Unimplemented Change Key", changeKey, false);
- log.info("Unimplemented Change Key: {}\nOLD_VALUE: {}\nNEW_VALUE: {}", changeKey, oldValue, newValue);
- }
- }
- });
-
- eb.setFooter("Audit Log Entry ID: " + ale.getId());
- eb.setTimestamp(ale.getTimeCreated());
-
- if (!eb.isValidLength() || eb.isEmpty()) {
- log.warn("Embed is empty or too long (current length: {}).", eb.length());
- return;
- }
-
- TextChannel sendingChannel = event.getGuild().getTextChannelById(channelIdToSendTo);
- if (sendingChannel != null && sendingChannel.canTalk()) {
- sendingChannel.sendMessageEmbeds(eb.build()).queue();
- }
- }
-}
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/stage/utils/StageUtils.java b/src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/StageUtils.java
similarity index 91%
rename from src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/stage/utils/StageUtils.java
rename to src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/StageUtils.java
index edcee3d..75f4a50 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/stage/utils/StageUtils.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/StageUtils.java
@@ -1,4 +1,4 @@
-package io.github.eggy03.papertrail.bot.service.auditlog.stage.utils;
+package io.github.eggy03.papertrail.bot.utils.auditlog;
import io.github.eggy03.papertrail.bot.utils.NumberParseUtils;
import lombok.experimental.UtilityClass;
From 337581302919eda9ad1aaf80702d452dc6db487b Mon Sep 17 00:00:00 2001
From: Egg-03 <111327101+eggy03@users.noreply.github.com>
Date: Sun, 31 May 2026 12:33:46 +0530
Subject: [PATCH 36/66] refactor(soundboardevents): merge helpers into
SoundboardEventHandler
- merge three helper classes from soundboard subpackage into `SoundboardEventHandler`
- move `SoundboardUtils` to the utility package
Signed-off-by: Egg-03 <111327101+eggy03@users.noreply.github.com>
---
.../auditlog/SoundboardEventHandler.java | 201 ++++++++++++++++++
.../SoundboardSoundCreateEventHelper.java | 71 -------
.../SoundboardSoundDeleteEventHelper.java | 71 -------
.../SoundboardSoundUpdateEventHelper.java | 80 -------
.../auditlog}/SoundboardUtils.java | 2 +-
5 files changed, 202 insertions(+), 223 deletions(-)
create mode 100644 src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/SoundboardEventHandler.java
delete mode 100644 src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/soundboard/SoundboardSoundCreateEventHelper.java
delete mode 100644 src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/soundboard/SoundboardSoundDeleteEventHelper.java
delete mode 100644 src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/soundboard/SoundboardSoundUpdateEventHelper.java
rename src/main/java/io/github/eggy03/papertrail/bot/{service/auditlog/soundboard/utils => utils/auditlog}/SoundboardUtils.java (88%)
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/SoundboardEventHandler.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/SoundboardEventHandler.java
new file mode 100644
index 0000000..5e1dcf3
--- /dev/null
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/SoundboardEventHandler.java
@@ -0,0 +1,201 @@
+package io.github.eggy03.papertrail.bot.service.auditlog;
+
+import io.github.eggy03.papertrail.bot.listeners.auditlog.GuildAuditLogEntryCreateEventHandler;
+import io.github.eggy03.papertrail.bot.utils.auditlog.SoundboardUtils;
+import io.github.eggy03.papertrail.sdk.client.AuditLogRegistrationClient;
+import io.github.eggy03.papertrail.sdk.entity.AuditLogRegistrationEntity;
+import jakarta.enterprise.context.ApplicationScoped;
+import jakarta.inject.Inject;
+import lombok.NonNull;
+import lombok.extern.slf4j.Slf4j;
+import net.dv8tion.jda.api.EmbedBuilder;
+import net.dv8tion.jda.api.audit.AuditLogEntry;
+import net.dv8tion.jda.api.entities.User;
+import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;
+import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
+import net.dv8tion.jda.api.utils.MarkdownUtil;
+import org.apache.commons.lang3.StringUtils;
+
+import java.awt.Color;
+
+@ApplicationScoped
+@Slf4j
+@SuppressWarnings("java:S1192")
+public class SoundboardEventHandler extends GuildAuditLogEntryCreateEventHandler {
+
+ private final @NonNull AuditLogRegistrationClient client;
+
+ @Inject
+ public SoundboardEventHandler(@NonNull AuditLogRegistrationClient client) {
+ this.client = client;
+ }
+
+ @NonNull
+ private String getRegisteredGuildChannel(@NonNull String guildId) {
+ return client.getRegisteredGuild(guildId)
+ .map(AuditLogRegistrationEntity::getChannelId).orElse(StringUtils.EMPTY);
+
+ }
+
+ private void performChecksThenBuildAndSendEmbed(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull EmbedBuilder embedBuilder, @NonNull String channelIdToSendTo) {
+ if (!embedBuilder.isValidLength() || embedBuilder.isEmpty()) {
+ log.warn("Embed is empty or too long (current length: {}).", embedBuilder.length());
+ return;
+ }
+
+ TextChannel sendingChannel = event.getGuild().getTextChannelById(channelIdToSendTo);
+ if (sendingChannel != null && sendingChannel.canTalk()) {
+ sendingChannel.sendMessageEmbeds(embedBuilder.build()).queue();
+ }
+ }
+
+ @Override
+ public void onSoundboardSoundCreate(@NonNull GuildAuditLogEntryCreateEvent event) {
+ String channelIdToSendTo = getRegisteredGuildChannel(event.getGuild().getId());
+ if (channelIdToSendTo.isBlank()) return;
+
+ AuditLogEntry ale = event.getEntry();
+
+ User executor = ale.getJDA().getUserById(ale.getUserIdLong());
+ String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
+
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("Audit Log Entry | Soundboard Sound Create Event");
+ eb.setDescription(MarkdownUtil.quoteBlock("Sound Item Added By: " + mentionableExecutor));
+ eb.setColor(Color.GREEN);
+
+ ale.getChanges().forEach((changeKey, changeValue) -> {
+
+ Object oldValue = changeValue.getOldValue();
+ Object newValue = changeValue.getNewValue();
+
+ switch (changeKey) {
+
+ case "user_id", "sound_id", "id", "guild_id", "available" -> {
+ // skip
+ }
+ case "volume" ->
+ eb.addField(MarkdownUtil.underline("Volume"), "╰┈➤" + SoundboardUtils.resolveVolumePercentage(newValue), false);
+
+ case "emoji_name" -> eb.addField(MarkdownUtil.underline("Related Emoji"), "╰┈➤" + newValue, false);
+
+ case "emoji_id" -> eb.addField(MarkdownUtil.underline("Related Emoji ID"), "╰┈➤" + newValue, false);
+
+ case "name" -> eb.addField(MarkdownUtil.underline("Sound Item Name"), "╰┈➤" + newValue, false);
+
+ default -> {
+ eb.addField("Unimplemented Change Key", changeKey, false);
+ log.info("Unimplemented Change Key on Soundboard Sound Create: {}\nOLD_VALUE: {}\nNEW_VALUE: {}", changeKey, oldValue, newValue);
+ }
+ }
+ });
+
+ eb.setFooter("Audit Log Entry ID: " + ale.getId());
+ eb.setTimestamp(ale.getTimeCreated());
+
+ performChecksThenBuildAndSendEmbed(event, eb, channelIdToSendTo);
+ }
+
+ @Override
+ public void onSoundboardSoundUpdate(@NonNull GuildAuditLogEntryCreateEvent event) {
+ String channelIdToSendTo = getRegisteredGuildChannel(event.getGuild().getId());
+ if (channelIdToSendTo.isBlank()) return;
+
+ AuditLogEntry ale = event.getEntry();
+
+ User executor = ale.getJDA().getUserById(ale.getUserIdLong());
+ String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
+
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("Audit Log Entry | Soundboard Sound Update Event");
+ eb.setDescription(MarkdownUtil.quoteBlock("Sound Item Updated By: " + mentionableExecutor));
+ eb.setColor(Color.YELLOW);
+
+ ale.getChanges().forEach((changeKey, changeValue) -> {
+ Object oldValue = changeValue.getOldValue();
+ Object newValue = changeValue.getNewValue();
+
+ switch (changeKey) {
+ case "user_id", "sound_id", "id", "guild_id", "available" -> {
+ // skip
+ }
+ case "volume" -> {
+ eb.addField(MarkdownUtil.underline("Old Volume"), "╰┈➤" + SoundboardUtils.resolveVolumePercentage(oldValue), true);
+ eb.addField(MarkdownUtil.underline("New Volume"), "╰┈➤" + SoundboardUtils.resolveVolumePercentage(newValue), true);
+ eb.addBlankField(true);
+ }
+ case "emoji_name" -> {
+ eb.addField(MarkdownUtil.underline("Old Related Emoji"), "╰┈➤" + oldValue, true);
+ eb.addField(MarkdownUtil.underline("New Related Emoji"), "╰┈➤" + newValue, true);
+ eb.addBlankField(true);
+ }
+ case "emoji_id" -> {
+ eb.addField(MarkdownUtil.underline("Old Related Emoji ID"), "╰┈➤" + oldValue, true);
+ eb.addField(MarkdownUtil.underline("New Related Emoji ID"), "╰┈➤" + newValue, true);
+ eb.addBlankField(true);
+ }
+ case "name" -> {
+ eb.addField(MarkdownUtil.underline("Old Sound Item Name"), "╰┈➤" + oldValue, true);
+ eb.addField(MarkdownUtil.underline("New Sound Item Name"), "╰┈➤" + newValue, true);
+ eb.addBlankField(true);
+ }
+ default -> {
+ eb.addField("Unimplemented Change Key", changeKey, false);
+ log.info("Unimplemented Change Key on Soundboard Sound Update: {}\nOLD_VALUE: {}\nNEW_VALUE: {}", changeKey, oldValue, newValue);
+ }
+ }
+ });
+
+ eb.setFooter("Audit Log Entry ID: " + ale.getId());
+ eb.setTimestamp(ale.getTimeCreated());
+
+ performChecksThenBuildAndSendEmbed(event, eb, channelIdToSendTo);
+ }
+
+ @Override
+ public void onSoundboardSoundDelete(@NonNull GuildAuditLogEntryCreateEvent event) {
+ String channelIdToSendTo = getRegisteredGuildChannel(event.getGuild().getId());
+ if (channelIdToSendTo.isBlank()) return;
+
+ AuditLogEntry ale = event.getEntry();
+
+ User executor = ale.getJDA().getUserById(ale.getUserIdLong());
+ String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
+
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("Audit Log Entry | Soundboard Sound Delete Event");
+ eb.setDescription(MarkdownUtil.quoteBlock("Sound Item Deleted By: " + mentionableExecutor));
+ eb.setColor(Color.RED);
+
+ ale.getChanges().forEach((changeKey, changeValue) -> {
+
+ Object oldValue = changeValue.getOldValue();
+ Object newValue = changeValue.getNewValue();
+
+ switch (changeKey) {
+
+ case "user_id", "sound_id", "id", "guild_id", "available" -> {
+ // skip
+ }
+ case "volume" ->
+ eb.addField(MarkdownUtil.underline("Volume"), "╰┈➤" + SoundboardUtils.resolveVolumePercentage(oldValue), false);
+
+ case "emoji_name" -> eb.addField(MarkdownUtil.underline("Related Emoji"), "╰┈➤" + oldValue, false);
+
+ case "emoji_id" -> eb.addField(MarkdownUtil.underline("Related Emoji ID"), "╰┈➤" + oldValue, false);
+
+ case "name" -> eb.addField(MarkdownUtil.underline("Sound Item Name"), "╰┈➤" + oldValue, false);
+
+ default -> {
+ eb.addField("Unimplemented Change Key", changeKey, false);
+ log.info("Unimplemented Change Key on Soundboard Sound Delete: {}\nOLD_VALUE: {}\nNEW_VALUE: {}", changeKey, oldValue, newValue);
+ }
+ }
+ });
+
+ eb.setFooter("Audit Log Entry ID: " + ale.getId());
+ eb.setTimestamp(ale.getTimeCreated());
+
+ performChecksThenBuildAndSendEmbed(event, eb, channelIdToSendTo);
+ }
+}
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/soundboard/SoundboardSoundCreateEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/soundboard/SoundboardSoundCreateEventHelper.java
deleted file mode 100644
index 21615d5..0000000
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/soundboard/SoundboardSoundCreateEventHelper.java
+++ /dev/null
@@ -1,71 +0,0 @@
-package io.github.eggy03.papertrail.bot.service.auditlog.soundboard;
-
-import io.github.eggy03.papertrail.bot.service.auditlog.soundboard.utils.SoundboardUtils;
-import lombok.NonNull;
-import lombok.experimental.UtilityClass;
-import lombok.extern.slf4j.Slf4j;
-import net.dv8tion.jda.api.EmbedBuilder;
-import net.dv8tion.jda.api.audit.AuditLogEntry;
-import net.dv8tion.jda.api.entities.User;
-import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;
-import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
-import net.dv8tion.jda.api.utils.MarkdownUtil;
-
-import java.awt.Color;
-
-@UtilityClass
-@Slf4j
-public class SoundboardSoundCreateEventHelper {
-
- public static void format(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
-
- AuditLogEntry ale = event.getEntry();
-
- User executor = ale.getJDA().getUserById(ale.getUserIdLong());
- String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
-
- EmbedBuilder eb = new EmbedBuilder();
- eb.setTitle("Audit Log Entry | Soundboard Sound Create Event");
- eb.setDescription(MarkdownUtil.quoteBlock("Sound Item Added By: " + mentionableExecutor));
- eb.setColor(Color.GREEN);
-
- ale.getChanges().forEach((changeKey, changeValue) -> {
-
- Object oldValue = changeValue.getOldValue();
- Object newValue = changeValue.getNewValue();
-
- switch (changeKey) {
-
- case "user_id", "sound_id", "id", "guild_id", "available" -> {
- // skip
- }
- case "volume" ->
- eb.addField(MarkdownUtil.underline("Volume"), "╰┈➤" + SoundboardUtils.resolveVolumePercentage(newValue), false);
-
- case "emoji_name" -> eb.addField(MarkdownUtil.underline("Related Emoji"), "╰┈➤" + newValue, false);
-
- case "emoji_id" -> eb.addField(MarkdownUtil.underline("Related Emoji ID"), "╰┈➤" + newValue, false);
-
- case "name" -> eb.addField(MarkdownUtil.underline("Sound Item Name"), "╰┈➤" + newValue, false);
-
- default -> {
- eb.addField("Unimplemented Change Key", changeKey, false);
- log.info("Unimplemented Change Key: {}\nOLD_VALUE: {}\nNEW_VALUE: {}", changeKey, oldValue, newValue);
- }
- }
- });
-
- eb.setFooter("Audit Log Entry ID: " + ale.getId());
- eb.setTimestamp(ale.getTimeCreated());
-
- if (!eb.isValidLength() || eb.isEmpty()) {
- log.warn("Embed is empty or too long (current length: {}).", eb.length());
- return;
- }
-
- TextChannel sendingChannel = event.getGuild().getTextChannelById(channelIdToSendTo);
- if (sendingChannel != null && sendingChannel.canTalk()) {
- sendingChannel.sendMessageEmbeds(eb.build()).queue();
- }
- }
-}
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/soundboard/SoundboardSoundDeleteEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/soundboard/SoundboardSoundDeleteEventHelper.java
deleted file mode 100644
index bc8c09a..0000000
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/soundboard/SoundboardSoundDeleteEventHelper.java
+++ /dev/null
@@ -1,71 +0,0 @@
-package io.github.eggy03.papertrail.bot.service.auditlog.soundboard;
-
-import io.github.eggy03.papertrail.bot.service.auditlog.soundboard.utils.SoundboardUtils;
-import lombok.NonNull;
-import lombok.experimental.UtilityClass;
-import lombok.extern.slf4j.Slf4j;
-import net.dv8tion.jda.api.EmbedBuilder;
-import net.dv8tion.jda.api.audit.AuditLogEntry;
-import net.dv8tion.jda.api.entities.User;
-import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;
-import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
-import net.dv8tion.jda.api.utils.MarkdownUtil;
-
-import java.awt.Color;
-
-@UtilityClass
-@Slf4j
-public class SoundboardSoundDeleteEventHelper {
-
- public static void format(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
-
- AuditLogEntry ale = event.getEntry();
-
- User executor = ale.getJDA().getUserById(ale.getUserIdLong());
- String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
-
- EmbedBuilder eb = new EmbedBuilder();
- eb.setTitle("Audit Log Entry | Soundboard Sound Delete Event");
- eb.setDescription(MarkdownUtil.quoteBlock("Sound Item Deleted By: " + mentionableExecutor));
- eb.setColor(Color.RED);
-
- ale.getChanges().forEach((changeKey, changeValue) -> {
-
- Object oldValue = changeValue.getOldValue();
- Object newValue = changeValue.getNewValue();
-
- switch (changeKey) {
-
- case "user_id", "sound_id", "id", "guild_id", "available" -> {
- // skip
- }
- case "volume" ->
- eb.addField(MarkdownUtil.underline("Volume"), "╰┈➤" + SoundboardUtils.resolveVolumePercentage(oldValue), false);
-
- case "emoji_name" -> eb.addField(MarkdownUtil.underline("Related Emoji"), "╰┈➤" + oldValue, false);
-
- case "emoji_id" -> eb.addField(MarkdownUtil.underline("Related Emoji ID"), "╰┈➤" + oldValue, false);
-
- case "name" -> eb.addField(MarkdownUtil.underline("Sound Item Name"), "╰┈➤" + oldValue, false);
-
- default -> {
- eb.addField("Unimplemented Change Key", changeKey, false);
- log.info("Unimplemented Change Key: {}\nOLD_VALUE: {}\nNEW_VALUE: {}", changeKey, oldValue, newValue);
- }
- }
- });
-
- eb.setFooter("Audit Log Entry ID: " + ale.getId());
- eb.setTimestamp(ale.getTimeCreated());
-
- if (!eb.isValidLength() || eb.isEmpty()) {
- log.warn("Embed is empty or too long (current length: {}).", eb.length());
- return;
- }
-
- TextChannel sendingChannel = event.getGuild().getTextChannelById(channelIdToSendTo);
- if (sendingChannel != null && sendingChannel.canTalk()) {
- sendingChannel.sendMessageEmbeds(eb.build()).queue();
- }
- }
-}
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/soundboard/SoundboardSoundUpdateEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/soundboard/SoundboardSoundUpdateEventHelper.java
deleted file mode 100644
index 7240b65..0000000
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/soundboard/SoundboardSoundUpdateEventHelper.java
+++ /dev/null
@@ -1,80 +0,0 @@
-package io.github.eggy03.papertrail.bot.service.auditlog.soundboard;
-
-import io.github.eggy03.papertrail.bot.service.auditlog.soundboard.utils.SoundboardUtils;
-import lombok.NonNull;
-import lombok.experimental.UtilityClass;
-import lombok.extern.slf4j.Slf4j;
-import net.dv8tion.jda.api.EmbedBuilder;
-import net.dv8tion.jda.api.audit.AuditLogEntry;
-import net.dv8tion.jda.api.entities.User;
-import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;
-import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
-import net.dv8tion.jda.api.utils.MarkdownUtil;
-
-import java.awt.Color;
-
-@UtilityClass
-@Slf4j
-public class SoundboardSoundUpdateEventHelper {
-
- public static void format(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
-
- AuditLogEntry ale = event.getEntry();
-
- User executor = ale.getJDA().getUserById(ale.getUserIdLong());
- String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
-
- EmbedBuilder eb = new EmbedBuilder();
- eb.setTitle("Audit Log Entry | Soundboard Sound Update Event");
- eb.setDescription(MarkdownUtil.quoteBlock("Sound Item Updated By: " + mentionableExecutor));
- eb.setColor(Color.YELLOW);
-
- ale.getChanges().forEach((changeKey, changeValue) -> {
- Object oldValue = changeValue.getOldValue();
- Object newValue = changeValue.getNewValue();
-
- switch (changeKey) {
- case "user_id", "sound_id", "id", "guild_id", "available" -> {
- // skip
- }
- case "volume" -> {
- eb.addField(MarkdownUtil.underline("Old Volume"), "╰┈➤" + SoundboardUtils.resolveVolumePercentage(oldValue), true);
- eb.addField(MarkdownUtil.underline("New Volume"), "╰┈➤" + SoundboardUtils.resolveVolumePercentage(newValue), true);
- eb.addBlankField(true);
- }
- case "emoji_name" -> {
- eb.addField(MarkdownUtil.underline("Old Related Emoji"), "╰┈➤" + oldValue, true);
- eb.addField(MarkdownUtil.underline("New Related Emoji"), "╰┈➤" + newValue, true);
- eb.addBlankField(true);
- }
- case "emoji_id" -> {
- eb.addField(MarkdownUtil.underline("Old Related Emoji ID"), "╰┈➤" + oldValue, true);
- eb.addField(MarkdownUtil.underline("New Related Emoji ID"), "╰┈➤" + newValue, true);
- eb.addBlankField(true);
- }
- case "name" -> {
- eb.addField(MarkdownUtil.underline("Old Sound Item Name"), "╰┈➤" + oldValue, true);
- eb.addField(MarkdownUtil.underline("New Sound Item Name"), "╰┈➤" + newValue, true);
- eb.addBlankField(true);
- }
- default -> {
- eb.addField("Unimplemented Change Key", changeKey, false);
- log.info("Unimplemented Change Key: {}\nOLD_VALUE: {}\nNEW_VALUE: {}", changeKey, oldValue, newValue);
- }
- }
- });
-
- eb.setFooter("Audit Log Entry ID: " + ale.getId());
- eb.setTimestamp(ale.getTimeCreated());
-
- if (!eb.isValidLength() || eb.isEmpty()) {
- log.warn("Embed is empty or too long (current length: {}).", eb.length());
- return;
- }
-
- TextChannel sendingChannel = event.getGuild().getTextChannelById(channelIdToSendTo);
- if (sendingChannel != null && sendingChannel.canTalk()) {
- sendingChannel.sendMessageEmbeds(eb.build()).queue();
- }
- }
-}
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/soundboard/utils/SoundboardUtils.java b/src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/SoundboardUtils.java
similarity index 88%
rename from src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/soundboard/utils/SoundboardUtils.java
rename to src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/SoundboardUtils.java
index 093d94f..a67900f 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/soundboard/utils/SoundboardUtils.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/SoundboardUtils.java
@@ -1,4 +1,4 @@
-package io.github.eggy03.papertrail.bot.service.auditlog.soundboard.utils;
+package io.github.eggy03.papertrail.bot.utils.auditlog;
import io.github.eggy03.papertrail.bot.utils.NumberParseUtils;
import lombok.experimental.UtilityClass;
From 9658dfeb0f2a6b9ec51998d5327af9641d79cccd Mon Sep 17 00:00:00 2001
From: Egg-03 <111327101+eggy03@users.noreply.github.com>
Date: Sun, 31 May 2026 12:42:00 +0530
Subject: [PATCH 37/66] refactor(auditlog): replace generic helper with event
handlers
- Rename `GenericAuditLogEventHelper.java` to `UnknownEventHandler.java`
- Add `UnimplementedEventHandler.java` for unimplemented events
- Extend `GuildAuditLogEntryCreateEventHandler` to enable dependency injection
Signed-off-by: Egg-03 <111327101+eggy03@users.noreply.github.com>
---
.../auditlog/UnimplementedEventHandler.java | 19 +++++
.../service/auditlog/UnknownEventHandler.java | 81 +++++++++++++++++++
.../generic/GenericAuditLogEventHelper.java | 56 -------------
3 files changed, 100 insertions(+), 56 deletions(-)
create mode 100644 src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/UnimplementedEventHandler.java
create mode 100644 src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/UnknownEventHandler.java
delete mode 100644 src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/generic/GenericAuditLogEventHelper.java
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/UnimplementedEventHandler.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/UnimplementedEventHandler.java
new file mode 100644
index 0000000..682fee9
--- /dev/null
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/UnimplementedEventHandler.java
@@ -0,0 +1,19 @@
+package io.github.eggy03.papertrail.bot.service.auditlog;
+
+import io.github.eggy03.papertrail.bot.listeners.auditlog.GuildAuditLogEntryCreateEventHandler;
+import jakarta.enterprise.context.ApplicationScoped;
+import lombok.NonNull;
+import lombok.extern.slf4j.Slf4j;
+import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
+
+// for action types not implemented by PaperTrail yet
+@ApplicationScoped
+@Slf4j
+@SuppressWarnings("java:S1192")
+public class UnimplementedEventHandler extends GuildAuditLogEntryCreateEventHandler {
+
+ @Override
+ public void onUnimplementedEvent(@NonNull GuildAuditLogEntryCreateEvent event) {
+ log.warn("Unimplemented Action Type: {} with Target Type: {}", event.getEntry().getType(), event.getEntry().getType().getTargetType());
+ }
+}
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/UnknownEventHandler.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/UnknownEventHandler.java
new file mode 100644
index 0000000..6eb84af
--- /dev/null
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/UnknownEventHandler.java
@@ -0,0 +1,81 @@
+package io.github.eggy03.papertrail.bot.service.auditlog;
+
+import io.github.eggy03.papertrail.bot.listeners.auditlog.GuildAuditLogEntryCreateEventHandler;
+import io.github.eggy03.papertrail.sdk.client.AuditLogRegistrationClient;
+import io.github.eggy03.papertrail.sdk.entity.AuditLogRegistrationEntity;
+import jakarta.enterprise.context.ApplicationScoped;
+import jakarta.inject.Inject;
+import lombok.NonNull;
+import lombok.extern.slf4j.Slf4j;
+import net.dv8tion.jda.api.EmbedBuilder;
+import net.dv8tion.jda.api.audit.AuditLogEntry;
+import net.dv8tion.jda.api.entities.User;
+import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;
+import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
+import net.dv8tion.jda.api.utils.MarkdownUtil;
+import org.apache.commons.lang3.StringUtils;
+
+import java.awt.Color;
+
+// for events not defined by JDA
+@ApplicationScoped
+@Slf4j
+@SuppressWarnings("java:S1192")
+public class UnknownEventHandler extends GuildAuditLogEntryCreateEventHandler {
+
+ private final @NonNull AuditLogRegistrationClient client;
+
+ @Inject
+ public UnknownEventHandler(@NonNull AuditLogRegistrationClient client) {
+ this.client = client;
+ }
+
+ @NonNull
+ private String getRegisteredGuildChannel(@NonNull String guildId) {
+ return client.getRegisteredGuild(guildId)
+ .map(AuditLogRegistrationEntity::getChannelId).orElse(StringUtils.EMPTY);
+
+ }
+
+ private void performChecksThenBuildAndSendEmbed(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull EmbedBuilder embedBuilder, @NonNull String channelIdToSendTo) {
+ if (!embedBuilder.isValidLength() || embedBuilder.isEmpty()) {
+ log.warn("Embed is empty or too long (current length: {}).", embedBuilder.length());
+ return;
+ }
+
+ TextChannel sendingChannel = event.getGuild().getTextChannelById(channelIdToSendTo);
+ if (sendingChannel != null && sendingChannel.canTalk()) {
+ sendingChannel.sendMessageEmbeds(embedBuilder.build()).queue();
+ }
+ }
+
+ @Override
+ public void onUnknownEvent(@NonNull GuildAuditLogEntryCreateEvent event) {
+
+ String channelIdToSendTo = getRegisteredGuildChannel(event.getGuild().getId());
+ if (channelIdToSendTo.isBlank()) return;
+
+ AuditLogEntry ale = event.getEntry();
+
+ User executor = ale.getJDA().getUserById(ale.getUserIdLong());
+ String mentionableExecutor = executor != null ? executor.getAsMention() : ale.getUserId();
+
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("Audit Log Entry | Generic Event");
+ eb.setDescription(MarkdownUtil.quoteBlock("Executor: " + mentionableExecutor));
+ eb.setColor(Color.LIGHT_GRAY);
+
+ eb.addField(MarkdownUtil.underline("Action Type"), MarkdownUtil.codeblock(ale.getType().toString()), true);
+ eb.addField(MarkdownUtil.underline("Target Type"), MarkdownUtil.codeblock(ale.getTargetType().toString()), true);
+
+ ale.getChanges().forEach((changeKey, changeValue) ->
+ eb.addField(
+ MarkdownUtil.underline(changeKey),
+ MarkdownUtil.codeblock("OLD VALUE\n" + changeValue.getOldValue() + "\nNEW VALUE\n" + changeValue.getNewValue()),
+ false
+ )
+ );
+
+ performChecksThenBuildAndSendEmbed(event, eb, channelIdToSendTo);
+ }
+}
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/generic/GenericAuditLogEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/generic/GenericAuditLogEventHelper.java
deleted file mode 100644
index 11ef503..0000000
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/generic/GenericAuditLogEventHelper.java
+++ /dev/null
@@ -1,56 +0,0 @@
-package io.github.eggy03.papertrail.bot.service.auditlog.generic;
-
-import lombok.NonNull;
-import lombok.experimental.UtilityClass;
-import lombok.extern.slf4j.Slf4j;
-import net.dv8tion.jda.api.EmbedBuilder;
-import net.dv8tion.jda.api.audit.AuditLogEntry;
-import net.dv8tion.jda.api.entities.User;
-import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;
-import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
-import net.dv8tion.jda.api.utils.MarkdownUtil;
-
-import java.awt.Color;
-
-// for events not defined by JDA yet or not implemented by papertrail
-@UtilityClass
-@Slf4j
-public class GenericAuditLogEventHelper {
-
- public static void format(@NonNull GuildAuditLogEntryCreateEvent event, @NonNull String channelIdToSendTo) {
-
- AuditLogEntry ale = event.getEntry();
-
- User executor = ale.getJDA().getUserById(ale.getUserIdLong());
- String mentionableExecutor = executor != null ? executor.getAsMention() : ale.getUserId();
-
- EmbedBuilder eb = new EmbedBuilder();
- eb.setTitle("Audit Log Entry | Generic Event");
- eb.setDescription(MarkdownUtil.quoteBlock("Executor: " + mentionableExecutor));
- eb.setColor(Color.LIGHT_GRAY);
-
- eb.addField(MarkdownUtil.underline("Action Type"), MarkdownUtil.codeblock(ale.getType().toString()), true);
- eb.addField(MarkdownUtil.underline("Target Type"), MarkdownUtil.codeblock(ale.getTargetType().toString()), true);
-
- ale.getChanges()
- .forEach((changeKey, changeValue) ->
- eb.addField(
- MarkdownUtil.underline(changeKey),
- MarkdownUtil.codeblock("OLD VALUE\n" + changeValue.getOldValue() + "\nNEW VALUE\n" + changeValue.getNewValue()),
- false
- )
- );
-
-
-
- if (!eb.isValidLength() || eb.isEmpty()) {
- log.warn("Embed is empty or too long (current length: {}).", eb.length());
- return;
- }
-
- TextChannel sendingChannel = event.getGuild().getTextChannelById(channelIdToSendTo);
- if (sendingChannel != null && sendingChannel.canTalk()) {
- sendingChannel.sendMessageEmbeds(eb.build()).queue();
- }
- }
-}
From fabd683d4b2f70595ba9ed181c0b35053129f2a8 Mon Sep 17 00:00:00 2001
From: Egg-03 <111327101+eggy03@users.noreply.github.com>
Date: Sun, 31 May 2026 12:48:33 +0530
Subject: [PATCH 38/66] refactor(auditlog): clarify implementation notices and
fix log message
- Clarify implementation notices in `IntegrationEventHandler.java`, `InviteEventHandler.java`, and `OnboardingEventHandler.java`
- Fix log message in `IntegrationEventHandler.java` to correctly reference "Create" instead of "Delete"
Signed-off-by: Egg-03 <111327101+eggy03@users.noreply.github.com>
---
.../bot/service/auditlog/IntegrationEventHandler.java | 5 ++---
.../papertrail/bot/service/auditlog/InviteEventHandler.java | 5 +++--
.../bot/service/auditlog/OnboardingEventHandler.java | 4 ++--
3 files changed, 7 insertions(+), 7 deletions(-)
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/IntegrationEventHandler.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/IntegrationEventHandler.java
index 62bf559..bca2169 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/IntegrationEventHandler.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/IntegrationEventHandler.java
@@ -74,7 +74,7 @@ public void onIntegrationCreate(@NonNull GuildAuditLogEntryCreateEvent event) {
default -> {
eb.addField("Unimplemented Change Key", changeKey, false);
- log.info("Unimplemented Change Key on Integration Delete: {}\nOLD_VALUE: {}\nNEW_VALUE: {}", changeKey, oldValue, newValue);
+ log.info("Unimplemented Change Key on Integration Create: {}\nOLD_VALUE: {}\nNEW_VALUE: {}", changeKey, oldValue, newValue);
}
}
});
@@ -100,14 +100,13 @@ public void onIntegrationUpdate(@NonNull GuildAuditLogEntryCreateEvent event) {
eb.setColor(Color.LIGHT_GRAY);
String implementationNotice = "We do not have sufficient data to log the changes in an INTEGRATION_UPDATE Event."
- .concat(" A proper implementation might happen in future releases");
+ .concat(" A proper implementation might happen in future releases if such an event is fired consistently.");
eb.addField("Implementation Notice", MarkdownUtil.codeblock(implementationNotice), false);
eb.setFooter("Audit Log Entry ID: " + ale.getId());
eb.setTimestamp(ale.getTimeCreated());
-
performChecksThenBuildAndSendEmbed(event, eb, channelIdToSendTo);
}
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/InviteEventHandler.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/InviteEventHandler.java
index 0cdd59f..2ee27e2 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/InviteEventHandler.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/InviteEventHandler.java
@@ -124,8 +124,9 @@ public void onInviteUpdate(@NonNull GuildAuditLogEntryCreateEvent event) {
eb.setTitle("Audit Log Entry | Invite Update Event");
eb.setColor(Color.LIGHT_GRAY);
- String implementationNotice = "We do not have sufficient data to log the changes in an INVITE_UPDATE Event."
- .concat(" A proper implementation might happen in future releases");
+ String implementationNotice = "We do not have sufficient data to log the changes in an INVITE_UPDATE Event"
+ .concat(" because invites seem to be immutable at the moment, which causes this event to not be fired.")
+ .concat(" A proper implementation might happen in future releases if such an event is fired consistently.");
eb.addField("Implementation Notice", MarkdownUtil.codeblock(implementationNotice), false);
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/OnboardingEventHandler.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/OnboardingEventHandler.java
index 2a2f4ad..cf5156b 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/OnboardingEventHandler.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/OnboardingEventHandler.java
@@ -65,8 +65,8 @@ public void onOnboardingCreate(@NonNull GuildAuditLogEntryCreateEvent event) {
eb.setColor(Color.LIGHT_GRAY);
String implementationNotice = "We do not have sufficient data to log the changes in an ONBOARDING_CREATE Event."
- .concat("That is because, even for Onboarding creations, ONBOARDING_UPDATE is fired")
- .concat(" A proper implementation might happen in future releases if this event is fired");
+ .concat(" That is because, even for Onboarding creations, ONBOARDING_UPDATE is fired instead.")
+ .concat(" A proper implementation might happen in future releases if such an event is fired consistently.");
eb.addField("Implementation Notice", MarkdownUtil.codeblock(implementationNotice), false);
From 726d735246e9db173b6e34f2349de6ca7bf49a0c Mon Sep 17 00:00:00 2001
From: Egg-03 <111327101+eggy03@users.noreply.github.com>
Date: Sun, 31 May 2026 13:43:12 +0530
Subject: [PATCH 39/66] refactor: make classes final and update bean provider
annotations
- Mark utility, listener, and service classes as `final` to prevent inheritance
- Add `@Contract`, `@NonNull`, and `@ApplicationScoped` to `PaperTrailSdkBeanProvider`
Signed-off-by: Egg-03 <111327101+eggy03@users.noreply.github.com>
---
.../eggy03/papertrail/bot/BootstrapService.java | 2 +-
.../io/github/eggy03/papertrail/bot/Start.java | 2 +-
.../bot/bean/PaperTrailSdkBeanProvider.java | 15 +++++++++++----
.../papertrail/bot/constant/ProjectInfo.java | 2 +-
.../auditlogsupl/GuildBoostEventListener.java | 2 +-
.../GuildMemberJoinAndLeaveEventListener.java | 2 +-
.../auditlogsupl/GuildPollEventListener.java | 2 +-
.../auditlogsupl/GuildVoiceEventListener.java | 2 +-
.../command/AuditLogSetupCommandListener.java | 2 +-
.../BotSetupInstructionCommandListener.java | 2 +-
.../listeners/command/DebugCommandListener.java | 2 +-
.../command/MessageLogSetupCommandListener.java | 2 +-
.../command/ServerStatCommandListener.java | 2 +-
.../listeners/messagelog/MessageLogListener.java | 2 +-
.../listeners/misc/ActivityUpdateListener.java | 2 +-
.../bot/listeners/misc/SelfKickListener.java | 2 +-
.../misc/SlashCommandRegistrationListener.java | 2 +-
.../bot/service/auditlog/ChannelEventHandler.java | 2 +-
.../auditlog/ChannelOverrideEventHandler.java | 2 +-
.../bot/service/auditlog/EmojiEventHandler.java | 2 +-
.../service/auditlog/GuildUpdateEventHandler.java | 2 +-
.../auditlog/HomeSettingsEventHandler.java | 2 +-
.../service/auditlog/IntegrationEventHandler.java | 2 +-
.../bot/service/auditlog/InviteEventHandler.java | 2 +-
.../auditlog/MemberStatusEventHandler.java | 2 +-
.../bot/service/auditlog/MessageEventHandler.java | 2 +-
.../service/auditlog/MessagePinEventHandler.java | 2 +-
.../service/auditlog/ModActionEventHandler.java | 2 +-
.../service/auditlog/OnboardingEventHandler.java | 2 +-
.../auditlog/OnboardingPromptEventHandler.java | 2 +-
.../bot/service/auditlog/RoleEventHandler.java | 2 +-
.../service/auditlog/ScheduledEventHandler.java | 2 +-
.../service/auditlog/SoundboardEventHandler.java | 2 +-
.../auditlog/StageInstanceEventHandler.java | 2 +-
.../bot/service/auditlog/StickerEventHandler.java | 2 +-
.../bot/service/auditlog/ThreadEventHandler.java | 2 +-
.../auditlog/UnimplementedEventHandler.java | 2 +-
.../bot/service/auditlog/UnknownEventHandler.java | 2 +-
.../auditlog/VoiceChannelStatusEventHandler.java | 2 +-
.../bot/service/auditlog/WebhookEventHandler.java | 2 +-
.../auditlogsupl/GuildMemberJoinEventHelper.java | 2 +-
.../GuildMemberRemoveEventHelper.java | 2 +-
.../GuildMemberUpdateBoostTimeEventHelper.java | 2 +-
.../auditlogsupl/GuildPollEventHelper.java | 2 +-
.../GuildUpdateBoostCountEventHelper.java | 2 +-
.../GuildUpdateBoostTierEventHelper.java | 2 +-
.../auditlogsupl/GuildVoiceEventHelper.java | 2 +-
.../MessageLogMessageDeleteEventHelper.java | 2 +-
.../MessageLogMessageReceivedEventHelper.java | 2 +-
.../MessageLogMessageUpdateEventHelper.java | 2 +-
.../eggy03/papertrail/bot/utils/BooleanUtils.java | 2 +-
.../papertrail/bot/utils/DurationUtils.java | 2 +-
.../papertrail/bot/utils/NumberParseUtils.java | 2 +-
.../bot/utils/auditlog/AutoModUtils.java | 2 +-
.../bot/utils/auditlog/ChannelUtils.java | 2 +-
.../papertrail/bot/utils/auditlog/GuildUtils.java | 2 +-
.../bot/utils/auditlog/InviteUtils.java | 2 +-
.../bot/utils/auditlog/MemberUtils.java | 2 +-
.../bot/utils/auditlog/MessageUtils.java | 2 +-
.../bot/utils/auditlog/OnboardingUtils.java | 2 +-
.../papertrail/bot/utils/auditlog/RoleUtils.java | 2 +-
.../bot/utils/auditlog/ScheduledEventUtils.java | 2 +-
.../bot/utils/auditlog/SoundboardUtils.java | 2 +-
.../papertrail/bot/utils/auditlog/StageUtils.java | 2 +-
.../bot/utils/auditlog/StickerUtils.java | 2 +-
.../bot/utils/auditlog/ThreadUtils.java | 2 +-
.../bot/utils/auditlog/WebhookUtils.java | 2 +-
67 files changed, 77 insertions(+), 70 deletions(-)
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/BootstrapService.java b/src/main/java/io/github/eggy03/papertrail/bot/BootstrapService.java
index bdd4186..32a440c 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/BootstrapService.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/BootstrapService.java
@@ -20,7 +20,7 @@
@ApplicationScoped
@Startup
-public class BootstrapService {
+public final class BootstrapService {
private final @NonNull String discordToken;
private final @NonNull Integer minShardId;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/Start.java b/src/main/java/io/github/eggy03/papertrail/bot/Start.java
index c03e72f..14b3fe6 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/Start.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/Start.java
@@ -4,7 +4,7 @@
import io.quarkus.runtime.annotations.QuarkusMain;
@QuarkusMain
-public class Start {
+public final class Start {
static void main(String... args) {
Quarkus.run(args);
}
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/bean/PaperTrailSdkBeanProvider.java b/src/main/java/io/github/eggy03/papertrail/bot/bean/PaperTrailSdkBeanProvider.java
index 6f01d5b..2e42776 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/bean/PaperTrailSdkBeanProvider.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/bean/PaperTrailSdkBeanProvider.java
@@ -8,9 +8,10 @@
import jakarta.inject.Inject;
import lombok.NonNull;
import org.eclipse.microprofile.config.inject.ConfigProperty;
+import org.jetbrains.annotations.Contract;
@ApplicationScoped
-public class PaperTrailSdkBeanProvider {
+public final class PaperTrailSdkBeanProvider {
private final @NonNull String apiUrl;
@@ -19,18 +20,24 @@ public PaperTrailSdkBeanProvider(@ConfigProperty(name = "api.url") @NonNull Stri
this.apiUrl = apiUrl;
}
+ @Contract(" -> new")
@Produces
- public AuditLogRegistrationClient auditLogRegistrationClient() {
+ @ApplicationScoped
+ public @NonNull AuditLogRegistrationClient auditLogRegistrationClient() {
return new AuditLogRegistrationClient(apiUrl);
}
+ @Contract(" -> new")
@Produces
- public MessageLogRegistrationClient messageLogRegistrationClient() {
+ @ApplicationScoped
+ public @NonNull MessageLogRegistrationClient messageLogRegistrationClient() {
return new MessageLogRegistrationClient(apiUrl);
}
+ @Contract(" -> new")
@Produces
- public MessageLogContentClient messageLogContentClient() {
+ @ApplicationScoped
+ public @NonNull MessageLogContentClient messageLogContentClient() {
return new MessageLogContentClient(apiUrl);
}
}
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/constant/ProjectInfo.java b/src/main/java/io/github/eggy03/papertrail/bot/constant/ProjectInfo.java
index ad5e68c..bd74e91 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/constant/ProjectInfo.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/constant/ProjectInfo.java
@@ -4,7 +4,7 @@
import lombok.experimental.UtilityClass;
@UtilityClass
-public class ProjectInfo {
+public final class ProjectInfo {
@NonNull
public static final String APPNAME = "PaperTrail";
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlogsupl/GuildBoostEventListener.java b/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlogsupl/GuildBoostEventListener.java
index 3533cbb..c528bd6 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlogsupl/GuildBoostEventListener.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlogsupl/GuildBoostEventListener.java
@@ -17,7 +17,7 @@
// Experimental
@RequiredArgsConstructor
-public class GuildBoostEventListener extends ListenerAdapter {
+public final class GuildBoostEventListener extends ListenerAdapter {
@NonNull
private final AuditLogRegistrationClient client;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlogsupl/GuildMemberJoinAndLeaveEventListener.java b/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlogsupl/GuildMemberJoinAndLeaveEventListener.java
index 7499013..0b3a289 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlogsupl/GuildMemberJoinAndLeaveEventListener.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlogsupl/GuildMemberJoinAndLeaveEventListener.java
@@ -16,7 +16,7 @@
// this event is not properly logged in the audit logs, hence the usage of JDA's listener is preferred
// this event is logged in the same channel where the audit log events are logged
@RequiredArgsConstructor
-public class GuildMemberJoinAndLeaveEventListener extends ListenerAdapter {
+public final class GuildMemberJoinAndLeaveEventListener extends ListenerAdapter {
@NonNull
private final AuditLogRegistrationClient client;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlogsupl/GuildPollEventListener.java b/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlogsupl/GuildPollEventListener.java
index 76cd1c0..227bc03 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlogsupl/GuildPollEventListener.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlogsupl/GuildPollEventListener.java
@@ -14,7 +14,7 @@
// auditlogsupl poll events are mapped to audit log table
@RequiredArgsConstructor
-public class GuildPollEventListener extends ListenerAdapter {
+public final class GuildPollEventListener extends ListenerAdapter {
@NonNull
private final AuditLogRegistrationClient client;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlogsupl/GuildVoiceEventListener.java b/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlogsupl/GuildVoiceEventListener.java
index 8232e01..5c6de1d 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlogsupl/GuildVoiceEventListener.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlogsupl/GuildVoiceEventListener.java
@@ -14,7 +14,7 @@
// this event is not properly logged in the audit logs, hence the usage of JDA's listener is preferred
// this event is logged in the same channel where the audit log events are logged
@RequiredArgsConstructor
-public class GuildVoiceEventListener extends ListenerAdapter {
+public final class GuildVoiceEventListener extends ListenerAdapter {
@NonNull
private final AuditLogRegistrationClient client;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/command/AuditLogSetupCommandListener.java b/src/main/java/io/github/eggy03/papertrail/bot/listeners/command/AuditLogSetupCommandListener.java
index 5466dcf..c103ddc 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/command/AuditLogSetupCommandListener.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/listeners/command/AuditLogSetupCommandListener.java
@@ -17,7 +17,7 @@
@Slf4j
@RequiredArgsConstructor
-public class AuditLogSetupCommandListener extends ListenerAdapter {
+public final class AuditLogSetupCommandListener extends ListenerAdapter {
@NonNull
private final AuditLogRegistrationClient client;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/command/BotSetupInstructionCommandListener.java b/src/main/java/io/github/eggy03/papertrail/bot/listeners/command/BotSetupInstructionCommandListener.java
index 8267d1d..48e746a 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/command/BotSetupInstructionCommandListener.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/listeners/command/BotSetupInstructionCommandListener.java
@@ -10,7 +10,7 @@
import java.awt.Color;
import java.time.Instant;
-public class BotSetupInstructionCommandListener extends ListenerAdapter {
+public final class BotSetupInstructionCommandListener extends ListenerAdapter {
@Override
public void onSlashCommandInteraction(@NonNull SlashCommandInteractionEvent event) {
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/command/DebugCommandListener.java b/src/main/java/io/github/eggy03/papertrail/bot/listeners/command/DebugCommandListener.java
index 966bfa2..7475ea6 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/command/DebugCommandListener.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/listeners/command/DebugCommandListener.java
@@ -27,7 +27,7 @@
@Slf4j
@RequiredArgsConstructor
-public class DebugCommandListener extends ListenerAdapter {
+public final class DebugCommandListener extends ListenerAdapter {
@NonNull
private final ExecutorService vThreadPool;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/command/MessageLogSetupCommandListener.java b/src/main/java/io/github/eggy03/papertrail/bot/listeners/command/MessageLogSetupCommandListener.java
index 0116520..83afc5c 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/command/MessageLogSetupCommandListener.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/listeners/command/MessageLogSetupCommandListener.java
@@ -17,7 +17,7 @@
@Slf4j
@RequiredArgsConstructor
-public class MessageLogSetupCommandListener extends ListenerAdapter {
+public final class MessageLogSetupCommandListener extends ListenerAdapter {
@NonNull
private final MessageLogRegistrationClient client;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/command/ServerStatCommandListener.java b/src/main/java/io/github/eggy03/papertrail/bot/listeners/command/ServerStatCommandListener.java
index ac5d04c..6891844 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/command/ServerStatCommandListener.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/listeners/command/ServerStatCommandListener.java
@@ -16,7 +16,7 @@
import java.util.List;
@Slf4j
-public class ServerStatCommandListener extends ListenerAdapter {
+public final class ServerStatCommandListener extends ListenerAdapter {
@NotNull
private String getMemberAndBotCount(@NonNull Guild guild) {
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/messagelog/MessageLogListener.java b/src/main/java/io/github/eggy03/papertrail/bot/listeners/messagelog/MessageLogListener.java
index 8d51479..6ebe9cc 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/messagelog/MessageLogListener.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/listeners/messagelog/MessageLogListener.java
@@ -19,7 +19,7 @@
@Slf4j
@RequiredArgsConstructor
-public class MessageLogListener extends ListenerAdapter {
+public final class MessageLogListener extends ListenerAdapter {
@NonNull
private final MessageLogRegistrationClient registrationClient;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/misc/ActivityUpdateListener.java b/src/main/java/io/github/eggy03/papertrail/bot/listeners/misc/ActivityUpdateListener.java
index 2acfb25..1c4a159 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/misc/ActivityUpdateListener.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/listeners/misc/ActivityUpdateListener.java
@@ -12,7 +12,7 @@
import net.dv8tion.jda.api.sharding.ShardManager;
@ApplicationScoped
-public class ActivityUpdateListener extends ListenerAdapter {
+public final class ActivityUpdateListener extends ListenerAdapter {
@NonNull
private final ShardManager manager;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/misc/SelfKickListener.java b/src/main/java/io/github/eggy03/papertrail/bot/listeners/misc/SelfKickListener.java
index 5fad245..dae62e7 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/misc/SelfKickListener.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/listeners/misc/SelfKickListener.java
@@ -13,7 +13,7 @@
* This class will have methods that unregister the log channels from the database after the bot has been kicked
*/
@ApplicationScoped
-public class SelfKickListener extends ListenerAdapter {
+public final class SelfKickListener extends ListenerAdapter {
@NonNull
private final AuditLogRegistrationClient auditLogRegistrationClient;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/misc/SlashCommandRegistrationListener.java b/src/main/java/io/github/eggy03/papertrail/bot/listeners/misc/SlashCommandRegistrationListener.java
index 66643c4..1995887 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/misc/SlashCommandRegistrationListener.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/listeners/misc/SlashCommandRegistrationListener.java
@@ -15,7 +15,7 @@
* Registers all the slash commands places throughout the code on startup
*/
@ApplicationScoped
-public class SlashCommandRegistrationListener extends ListenerAdapter {
+public final class SlashCommandRegistrationListener extends ListenerAdapter {
@Override
public void onReady(@NonNull ReadyEvent event) {
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/ChannelEventHandler.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/ChannelEventHandler.java
index 46f6fee..90df40e 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/ChannelEventHandler.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/ChannelEventHandler.java
@@ -24,7 +24,7 @@
@ApplicationScoped
@Slf4j
@SuppressWarnings("java:S1192")
-public class ChannelEventHandler extends GuildAuditLogEntryCreateEventHandler {
+public final class ChannelEventHandler extends GuildAuditLogEntryCreateEventHandler {
private final @NonNull AuditLogRegistrationClient client;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/ChannelOverrideEventHandler.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/ChannelOverrideEventHandler.java
index 6bb18b4..4aa6727 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/ChannelOverrideEventHandler.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/ChannelOverrideEventHandler.java
@@ -24,7 +24,7 @@
@ApplicationScoped
@Slf4j
@SuppressWarnings("java:S1192")
-public class ChannelOverrideEventHandler extends GuildAuditLogEntryCreateEventHandler {
+public final class ChannelOverrideEventHandler extends GuildAuditLogEntryCreateEventHandler {
private final @NonNull AuditLogRegistrationClient client;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/EmojiEventHandler.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/EmojiEventHandler.java
index 7775844..c610956 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/EmojiEventHandler.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/EmojiEventHandler.java
@@ -20,7 +20,7 @@
@ApplicationScoped
@Slf4j
@SuppressWarnings("java:S1192")
-public class EmojiEventHandler extends GuildAuditLogEntryCreateEventHandler {
+public final class EmojiEventHandler extends GuildAuditLogEntryCreateEventHandler {
private final @NonNull AuditLogRegistrationClient client;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/GuildUpdateEventHandler.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/GuildUpdateEventHandler.java
index defedc0..2f6bab0 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/GuildUpdateEventHandler.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/GuildUpdateEventHandler.java
@@ -23,7 +23,7 @@
@ApplicationScoped
@Slf4j
@SuppressWarnings("java:S1192")
-public class GuildUpdateEventHandler extends GuildAuditLogEntryCreateEventHandler {
+public final class GuildUpdateEventHandler extends GuildAuditLogEntryCreateEventHandler {
private final @NonNull AuditLogRegistrationClient client;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/HomeSettingsEventHandler.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/HomeSettingsEventHandler.java
index 5e67325..f48dbe4 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/HomeSettingsEventHandler.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/HomeSettingsEventHandler.java
@@ -20,7 +20,7 @@
@ApplicationScoped
@Slf4j
@SuppressWarnings("java:S1192")
-public class HomeSettingsEventHandler extends GuildAuditLogEntryCreateEventHandler {
+public final class HomeSettingsEventHandler extends GuildAuditLogEntryCreateEventHandler {
private final @NonNull AuditLogRegistrationClient client;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/IntegrationEventHandler.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/IntegrationEventHandler.java
index bca2169..a1c22db 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/IntegrationEventHandler.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/IntegrationEventHandler.java
@@ -20,7 +20,7 @@
@ApplicationScoped
@Slf4j
@SuppressWarnings("java:S1192")
-public class IntegrationEventHandler extends GuildAuditLogEntryCreateEventHandler {
+public final class IntegrationEventHandler extends GuildAuditLogEntryCreateEventHandler {
private final @NonNull AuditLogRegistrationClient client;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/InviteEventHandler.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/InviteEventHandler.java
index 2ee27e2..4f6fa4b 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/InviteEventHandler.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/InviteEventHandler.java
@@ -23,7 +23,7 @@
@ApplicationScoped
@Slf4j
@SuppressWarnings("java:S1192")
-public class InviteEventHandler extends GuildAuditLogEntryCreateEventHandler {
+public final class InviteEventHandler extends GuildAuditLogEntryCreateEventHandler {
private final @NonNull AuditLogRegistrationClient client;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/MemberStatusEventHandler.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/MemberStatusEventHandler.java
index 38fc21e..4602d1d 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/MemberStatusEventHandler.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/MemberStatusEventHandler.java
@@ -23,7 +23,7 @@
@ApplicationScoped
@Slf4j
@SuppressWarnings("java:S1192")
-public class MemberStatusEventHandler extends GuildAuditLogEntryCreateEventHandler {
+public final class MemberStatusEventHandler extends GuildAuditLogEntryCreateEventHandler {
private final @NonNull AuditLogRegistrationClient client;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/MessageEventHandler.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/MessageEventHandler.java
index c50bf7f..933eab6 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/MessageEventHandler.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/MessageEventHandler.java
@@ -20,7 +20,7 @@
@ApplicationScoped
@Slf4j
@SuppressWarnings("java:S1192")
-public class MessageEventHandler extends GuildAuditLogEntryCreateEventHandler {
+public final class MessageEventHandler extends GuildAuditLogEntryCreateEventHandler {
private final @NonNull AuditLogRegistrationClient client;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/MessagePinEventHandler.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/MessagePinEventHandler.java
index 4673bef..da4d8d0 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/MessagePinEventHandler.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/MessagePinEventHandler.java
@@ -21,7 +21,7 @@
@ApplicationScoped
@Slf4j
@SuppressWarnings("java:S1192")
-public class MessagePinEventHandler extends GuildAuditLogEntryCreateEventHandler {
+public final class MessagePinEventHandler extends GuildAuditLogEntryCreateEventHandler {
private final @NonNull AuditLogRegistrationClient client;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/ModActionEventHandler.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/ModActionEventHandler.java
index 0921583..a5b25f3 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/ModActionEventHandler.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/ModActionEventHandler.java
@@ -20,7 +20,7 @@
@ApplicationScoped
@Slf4j
@SuppressWarnings("java:S1192")
-public class ModActionEventHandler extends GuildAuditLogEntryCreateEventHandler {
+public final class ModActionEventHandler extends GuildAuditLogEntryCreateEventHandler {
private final @NonNull AuditLogRegistrationClient client;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/OnboardingEventHandler.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/OnboardingEventHandler.java
index cf5156b..2568e4e 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/OnboardingEventHandler.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/OnboardingEventHandler.java
@@ -23,7 +23,7 @@
@ApplicationScoped
@Slf4j
@SuppressWarnings("java:S1192")
-public class OnboardingEventHandler extends GuildAuditLogEntryCreateEventHandler {
+public final class OnboardingEventHandler extends GuildAuditLogEntryCreateEventHandler {
private final @NonNull AuditLogRegistrationClient client;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/OnboardingPromptEventHandler.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/OnboardingPromptEventHandler.java
index d889544..9ec72e4 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/OnboardingPromptEventHandler.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/OnboardingPromptEventHandler.java
@@ -21,7 +21,7 @@
@ApplicationScoped
@Slf4j
@SuppressWarnings("java:S1192")
-public class OnboardingPromptEventHandler extends GuildAuditLogEntryCreateEventHandler {
+public final class OnboardingPromptEventHandler extends GuildAuditLogEntryCreateEventHandler {
private final @NonNull AuditLogRegistrationClient client;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/RoleEventHandler.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/RoleEventHandler.java
index 6f91f88..ec9d5a1 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/RoleEventHandler.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/RoleEventHandler.java
@@ -23,7 +23,7 @@
@ApplicationScoped
@Slf4j
@SuppressWarnings("java:S1192")
-public class RoleEventHandler extends GuildAuditLogEntryCreateEventHandler {
+public final class RoleEventHandler extends GuildAuditLogEntryCreateEventHandler {
private final @NonNull AuditLogRegistrationClient client;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/ScheduledEventHandler.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/ScheduledEventHandler.java
index a7bcbd4..e2e1612 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/ScheduledEventHandler.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/ScheduledEventHandler.java
@@ -21,7 +21,7 @@
@ApplicationScoped
@Slf4j
@SuppressWarnings("java:S1192")
-public class ScheduledEventHandler extends GuildAuditLogEntryCreateEventHandler {
+public final class ScheduledEventHandler extends GuildAuditLogEntryCreateEventHandler {
private final @NonNull AuditLogRegistrationClient client;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/SoundboardEventHandler.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/SoundboardEventHandler.java
index 5e1dcf3..8560d79 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/SoundboardEventHandler.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/SoundboardEventHandler.java
@@ -21,7 +21,7 @@
@ApplicationScoped
@Slf4j
@SuppressWarnings("java:S1192")
-public class SoundboardEventHandler extends GuildAuditLogEntryCreateEventHandler {
+public final class SoundboardEventHandler extends GuildAuditLogEntryCreateEventHandler {
private final @NonNull AuditLogRegistrationClient client;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/StageInstanceEventHandler.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/StageInstanceEventHandler.java
index 521793b..ac508af 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/StageInstanceEventHandler.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/StageInstanceEventHandler.java
@@ -21,7 +21,7 @@
@ApplicationScoped
@Slf4j
@SuppressWarnings("java:S1192")
-public class StageInstanceEventHandler extends GuildAuditLogEntryCreateEventHandler {
+public final class StageInstanceEventHandler extends GuildAuditLogEntryCreateEventHandler {
private final @NonNull AuditLogRegistrationClient client;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/StickerEventHandler.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/StickerEventHandler.java
index 4b55074..38a78fb 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/StickerEventHandler.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/StickerEventHandler.java
@@ -22,7 +22,7 @@
@ApplicationScoped
@Slf4j
@SuppressWarnings("java:S1192")
-public class StickerEventHandler extends GuildAuditLogEntryCreateEventHandler {
+public final class StickerEventHandler extends GuildAuditLogEntryCreateEventHandler {
private final @NonNull AuditLogRegistrationClient client;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/ThreadEventHandler.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/ThreadEventHandler.java
index 924801e..672a6bc 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/ThreadEventHandler.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/ThreadEventHandler.java
@@ -25,7 +25,7 @@
@ApplicationScoped
@Slf4j
@SuppressWarnings("java:S1192")
-public class ThreadEventHandler extends GuildAuditLogEntryCreateEventHandler {
+public final class ThreadEventHandler extends GuildAuditLogEntryCreateEventHandler {
private final @NonNull AuditLogRegistrationClient client;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/UnimplementedEventHandler.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/UnimplementedEventHandler.java
index 682fee9..6ce74a8 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/UnimplementedEventHandler.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/UnimplementedEventHandler.java
@@ -10,7 +10,7 @@
@ApplicationScoped
@Slf4j
@SuppressWarnings("java:S1192")
-public class UnimplementedEventHandler extends GuildAuditLogEntryCreateEventHandler {
+public final class UnimplementedEventHandler extends GuildAuditLogEntryCreateEventHandler {
@Override
public void onUnimplementedEvent(@NonNull GuildAuditLogEntryCreateEvent event) {
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/UnknownEventHandler.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/UnknownEventHandler.java
index 6eb84af..bc8834f 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/UnknownEventHandler.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/UnknownEventHandler.java
@@ -21,7 +21,7 @@
@ApplicationScoped
@Slf4j
@SuppressWarnings("java:S1192")
-public class UnknownEventHandler extends GuildAuditLogEntryCreateEventHandler {
+public final class UnknownEventHandler extends GuildAuditLogEntryCreateEventHandler {
private final @NonNull AuditLogRegistrationClient client;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/VoiceChannelStatusEventHandler.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/VoiceChannelStatusEventHandler.java
index 5d4abcb..45e2bf3 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/VoiceChannelStatusEventHandler.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/VoiceChannelStatusEventHandler.java
@@ -21,7 +21,7 @@
@ApplicationScoped
@Slf4j
@SuppressWarnings("java:S1192")
-public class VoiceChannelStatusEventHandler extends GuildAuditLogEntryCreateEventHandler {
+public final class VoiceChannelStatusEventHandler extends GuildAuditLogEntryCreateEventHandler {
private final @NonNull AuditLogRegistrationClient client;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/WebhookEventHandler.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/WebhookEventHandler.java
index e6cc767..4ce2f4e 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/WebhookEventHandler.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/WebhookEventHandler.java
@@ -22,7 +22,7 @@
@ApplicationScoped
@Slf4j
@SuppressWarnings("java:S1192")
-public class WebhookEventHandler extends GuildAuditLogEntryCreateEventHandler {
+public final class WebhookEventHandler extends GuildAuditLogEntryCreateEventHandler {
private final @NonNull AuditLogRegistrationClient client;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlogsupl/GuildMemberJoinEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlogsupl/GuildMemberJoinEventHelper.java
index 5eae4e0..2fb8192 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlogsupl/GuildMemberJoinEventHelper.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlogsupl/GuildMemberJoinEventHelper.java
@@ -17,7 +17,7 @@
@UtilityClass
@Slf4j
-public class GuildMemberJoinEventHelper {
+public final class GuildMemberJoinEventHelper {
public static void format(@NonNull GuildMemberJoinEvent event, @NonNull String channelIdToSendTo) {
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlogsupl/GuildMemberRemoveEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlogsupl/GuildMemberRemoveEventHelper.java
index 90009a8..330fdee 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlogsupl/GuildMemberRemoveEventHelper.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlogsupl/GuildMemberRemoveEventHelper.java
@@ -18,7 +18,7 @@
@UtilityClass
@Slf4j
-public class GuildMemberRemoveEventHelper {
+public final class GuildMemberRemoveEventHelper {
public static void format(@NonNull GuildMemberRemoveEvent event, @NonNull String channelIdToSendTo) {
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlogsupl/GuildMemberUpdateBoostTimeEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlogsupl/GuildMemberUpdateBoostTimeEventHelper.java
index 8057567..18d06a4 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlogsupl/GuildMemberUpdateBoostTimeEventHelper.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlogsupl/GuildMemberUpdateBoostTimeEventHelper.java
@@ -16,7 +16,7 @@
@UtilityClass
@Slf4j
-public class GuildMemberUpdateBoostTimeEventHelper {
+public final class GuildMemberUpdateBoostTimeEventHelper {
public static void format(@NonNull GuildMemberUpdateBoostTimeEvent event, @NonNull String channelIdToSendTo) {
Member member = event.getMember();
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlogsupl/GuildPollEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlogsupl/GuildPollEventHelper.java
index 46a709e..c22bbbc 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlogsupl/GuildPollEventHelper.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlogsupl/GuildPollEventHelper.java
@@ -16,7 +16,7 @@
@UtilityClass
@Slf4j
-public class GuildPollEventHelper {
+public final class GuildPollEventHelper {
public static void format(@NonNull MessageReceivedEvent event, @NonNull MessagePoll messagePoll, @NonNull String channelIdToSendTo) {
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlogsupl/GuildUpdateBoostCountEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlogsupl/GuildUpdateBoostCountEventHelper.java
index b69f17f..402ebd5 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlogsupl/GuildUpdateBoostCountEventHelper.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlogsupl/GuildUpdateBoostCountEventHelper.java
@@ -14,7 +14,7 @@
@UtilityClass
@Slf4j
-public class GuildUpdateBoostCountEventHelper {
+public final class GuildUpdateBoostCountEventHelper {
public static void format(@NonNull GuildUpdateBoostCountEvent event, @NonNull String channelIdToSendTo) {
Guild guild = event.getGuild();
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlogsupl/GuildUpdateBoostTierEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlogsupl/GuildUpdateBoostTierEventHelper.java
index c3983cf..11ae726 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlogsupl/GuildUpdateBoostTierEventHelper.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlogsupl/GuildUpdateBoostTierEventHelper.java
@@ -14,7 +14,7 @@
@UtilityClass
@Slf4j
-public class GuildUpdateBoostTierEventHelper {
+public final class GuildUpdateBoostTierEventHelper {
public static void format(@NonNull GuildUpdateBoostTierEvent event, @NonNull String channelIdToSendTo) {
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlogsupl/GuildVoiceEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlogsupl/GuildVoiceEventHelper.java
index f28bb60..c4bf197 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlogsupl/GuildVoiceEventHelper.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlogsupl/GuildVoiceEventHelper.java
@@ -15,7 +15,7 @@
@UtilityClass
@Slf4j
-public class GuildVoiceEventHelper {
+public final class GuildVoiceEventHelper {
public static void format(@NonNull GuildVoiceUpdateEvent event, @NonNull String channelIdToSendTo) {
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/messagelog/MessageLogMessageDeleteEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/messagelog/MessageLogMessageDeleteEventHelper.java
index f0abf4b..83bc415 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/messagelog/MessageLogMessageDeleteEventHelper.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/messagelog/MessageLogMessageDeleteEventHelper.java
@@ -19,7 +19,7 @@
@UtilityClass
@Slf4j
-public class MessageLogMessageDeleteEventHelper {
+public final class MessageLogMessageDeleteEventHelper {
public static void deleteMessage(@NonNull MessageDeleteEvent event, @NonNull MessageLogContentClient client, @NonNull String deletedMessageId, @NonNull String channelIdToSendTo) {
// fetch the old message object from the API
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/messagelog/MessageLogMessageReceivedEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/messagelog/MessageLogMessageReceivedEventHelper.java
index 88951c3..437b48b 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/messagelog/MessageLogMessageReceivedEventHelper.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/messagelog/MessageLogMessageReceivedEventHelper.java
@@ -6,7 +6,7 @@
import net.dv8tion.jda.api.events.message.MessageReceivedEvent;
@UtilityClass
-public class MessageLogMessageReceivedEventHelper {
+public final class MessageLogMessageReceivedEventHelper {
public static void saveMessage(@NonNull MessageReceivedEvent event, @NonNull MessageLogContentClient client) {
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/messagelog/MessageLogMessageUpdateEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/messagelog/MessageLogMessageUpdateEventHelper.java
index 1256dea..fbbf12b 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/messagelog/MessageLogMessageUpdateEventHelper.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/messagelog/MessageLogMessageUpdateEventHelper.java
@@ -18,7 +18,7 @@
@UtilityClass
@Slf4j
-public class MessageLogMessageUpdateEventHelper {
+public final class MessageLogMessageUpdateEventHelper {
public static void updateMessage(@NonNull MessageUpdateEvent event, @NonNull MessageLogContentClient client, @NonNull String updatedMessageId, @NonNull String channelIdToSendTo) {
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/utils/BooleanUtils.java b/src/main/java/io/github/eggy03/papertrail/bot/utils/BooleanUtils.java
index a4f3264..721aa84 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/utils/BooleanUtils.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/utils/BooleanUtils.java
@@ -6,7 +6,7 @@
import org.jetbrains.annotations.Nullable;
@UtilityClass
-public class BooleanUtils {
+public final class BooleanUtils {
@NonNull
private static final String FALLBACK_STRING = "N/A";
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/utils/DurationUtils.java b/src/main/java/io/github/eggy03/papertrail/bot/utils/DurationUtils.java
index 36825fd..03eede0 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/utils/DurationUtils.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/utils/DurationUtils.java
@@ -12,7 +12,7 @@
@UtilityClass
@Slf4j
-public class DurationUtils {
+public final class DurationUtils {
@NonNull
private static final String FALLBACK_STRING = "N/A";
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/utils/NumberParseUtils.java b/src/main/java/io/github/eggy03/papertrail/bot/utils/NumberParseUtils.java
index 760b3e9..c3b90b6 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/utils/NumberParseUtils.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/utils/NumberParseUtils.java
@@ -10,7 +10,7 @@
@UtilityClass
@Slf4j
-public class NumberParseUtils {
+public final class NumberParseUtils {
@Nullable
public static Long parseLong(@Nullable Object possibleLongValue) {
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/AutoModUtils.java b/src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/AutoModUtils.java
index d159f77..df72134 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/AutoModUtils.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/AutoModUtils.java
@@ -9,7 +9,7 @@
import org.jetbrains.annotations.Nullable;
@UtilityClass
-public class AutoModUtils {
+public final class AutoModUtils {
@NonNull
public static final String FALLBACK_STRING = "N/A";
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/ChannelUtils.java b/src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/ChannelUtils.java
index 79d369c..41692ea 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/ChannelUtils.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/ChannelUtils.java
@@ -16,7 +16,7 @@
@UtilityClass
@Slf4j
-public class ChannelUtils {
+public final class ChannelUtils {
@NonNull
public static final String FALLBACK_STRING = "N/A";
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/GuildUtils.java b/src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/GuildUtils.java
index bae9499..bcb0671 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/GuildUtils.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/GuildUtils.java
@@ -12,7 +12,7 @@
import org.jetbrains.annotations.Nullable;
@UtilityClass
-public class GuildUtils {
+public final class GuildUtils {
@NonNull
private static final String FALLBACK_STRING = "N/A";
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/InviteUtils.java b/src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/InviteUtils.java
index e26c514..9386af9 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/InviteUtils.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/InviteUtils.java
@@ -16,7 +16,7 @@
import java.util.stream.Collectors;
@UtilityClass
-public class InviteUtils {
+public final class InviteUtils {
public static final String FALLBACK_STRING = "N/A";
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/MemberUtils.java b/src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/MemberUtils.java
index 3a8c88c..f328a45 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/MemberUtils.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/MemberUtils.java
@@ -17,7 +17,7 @@
@UtilityClass
@Slf4j
-public class MemberUtils {
+public final class MemberUtils {
@NonNull
public static final String FALLBACK_STRING = "N/A";
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/MessageUtils.java b/src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/MessageUtils.java
index f75d75a..c28a984 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/MessageUtils.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/MessageUtils.java
@@ -11,7 +11,7 @@
import org.jetbrains.annotations.Nullable;
@UtilityClass
-public class MessageUtils {
+public final class MessageUtils {
private static final String FALLBACK_STRING = "N/A";
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/OnboardingUtils.java b/src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/OnboardingUtils.java
index 04ede5c..d25c1be 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/OnboardingUtils.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/OnboardingUtils.java
@@ -15,7 +15,7 @@
@UtilityClass
@Slf4j
-public class OnboardingUtils {
+public final class OnboardingUtils {
@NonNull
public static final String FALLBACK_STRING = "N/A";
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/RoleUtils.java b/src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/RoleUtils.java
index ba3e208..9fc50d7 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/RoleUtils.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/RoleUtils.java
@@ -14,7 +14,7 @@
@UtilityClass
@Slf4j
-public class RoleUtils {
+public final class RoleUtils {
@NonNull
private static final String FALLBACK_STRING = "N/A";
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/ScheduledEventUtils.java b/src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/ScheduledEventUtils.java
index b50d598..7cf0812 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/ScheduledEventUtils.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/ScheduledEventUtils.java
@@ -10,7 +10,7 @@
@UtilityClass
@Slf4j
-public class ScheduledEventUtils {
+public final class ScheduledEventUtils {
@NonNull
public static final String FALLBACK_STRING = "N/A";
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/SoundboardUtils.java b/src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/SoundboardUtils.java
index a67900f..c2aec4d 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/SoundboardUtils.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/SoundboardUtils.java
@@ -8,7 +8,7 @@
import java.math.RoundingMode;
@UtilityClass
-public class SoundboardUtils {
+public final class SoundboardUtils {
@NotNull
public static String resolveVolumePercentage(@Nullable Object decimalVolume) {
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/StageUtils.java b/src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/StageUtils.java
index 75f4a50..70f1da5 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/StageUtils.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/StageUtils.java
@@ -7,7 +7,7 @@
import org.jetbrains.annotations.Nullable;
@UtilityClass
-public class StageUtils {
+public final class StageUtils {
@NotNull
public static String resolveStagePrivacyLevel(@Nullable Object stagePrivacyLevelInteger) {
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/StickerUtils.java b/src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/StickerUtils.java
index e5ad699..26b08fe 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/StickerUtils.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/StickerUtils.java
@@ -11,7 +11,7 @@
@UtilityClass
@Slf4j
-public class StickerUtils {
+public final class StickerUtils {
@NonNull
public static final String FALLBACK_STRING = "N/A";
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/ThreadUtils.java b/src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/ThreadUtils.java
index 7c89b73..987a4f4 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/ThreadUtils.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/ThreadUtils.java
@@ -8,7 +8,7 @@
import org.jetbrains.annotations.Nullable;
@UtilityClass
-public class ThreadUtils {
+public final class ThreadUtils {
@NonNull
public static final String FALLBACK_STRING = "N/A";
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/WebhookUtils.java b/src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/WebhookUtils.java
index 7e24f31..6e5812b 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/WebhookUtils.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/WebhookUtils.java
@@ -9,7 +9,7 @@
@UtilityClass
@Slf4j
-public class WebhookUtils {
+public final class WebhookUtils {
@NonNull
public static final String FALLBACK_STRING = "N/A";
From ec49224813f432a8e2f3fe4279f399fe5fdcd139 Mon Sep 17 00:00:00 2001
From: Egg-03 <111327101+eggy03@users.noreply.github.com>
Date: Sun, 31 May 2026 14:13:28 +0530
Subject: [PATCH 40/66] refactor(guild): rename auditlogsupl and messagelog
packages
- Rename `auditlogsupl` package to `guild` and `messagelog` to `message`
- Replace occurrences of "auditlogsupl" with "guild" in logs, comments, and embeds to correct terminology
Signed-off-by: Egg-03 <111327101+eggy03@users.noreply.github.com>
---
.../command/AuditLogSetupCommandListener.java | 14 ++++++-------
.../command/DebugCommandListener.java | 2 +-
.../MessageLogSetupCommandListener.java | 16 +++++++--------
.../command/ServerStatCommandListener.java | 2 +-
.../GuildBoostEventListener.java | 8 ++++----
.../GuildMemberJoinAndLeaveEventListener.java | 6 +++---
.../GuildPollEventListener.java | 6 +++---
.../GuildVoiceEventListener.java | 4 ++--
.../MessageLogListener.java | 20 +++++++++----------
.../misc/ActivityUpdateListener.java | 4 ++--
.../auditlog/HomeSettingsEventHandler.java | 2 +-
.../GuildMemberJoinEventHelper.java | 2 +-
.../GuildMemberRemoveEventHelper.java | 2 +-
...GuildMemberUpdateBoostTimeEventHelper.java | 2 +-
.../GuildPollEventHelper.java | 2 +-
.../GuildUpdateBoostCountEventHelper.java | 2 +-
.../GuildUpdateBoostTierEventHelper.java | 2 +-
.../GuildVoiceEventHelper.java | 2 +-
.../MessageLogMessageDeleteEventHelper.java | 2 +-
.../MessageLogMessageReceivedEventHelper.java | 2 +-
.../MessageLogMessageUpdateEventHelper.java | 2 +-
.../bot/utils/auditlog/StickerUtils.java | 10 +++++-----
22 files changed, 57 insertions(+), 57 deletions(-)
rename src/main/java/io/github/eggy03/papertrail/bot/listeners/{auditlogsupl => guild}/GuildBoostEventListener.java (85%)
rename src/main/java/io/github/eggy03/papertrail/bot/listeners/{auditlogsupl => guild}/GuildMemberJoinAndLeaveEventListener.java (88%)
rename src/main/java/io/github/eggy03/papertrail/bot/listeners/{auditlogsupl => guild}/GuildPollEventListener.java (86%)
rename src/main/java/io/github/eggy03/papertrail/bot/listeners/{auditlogsupl => guild}/GuildVoiceEventListener.java (89%)
rename src/main/java/io/github/eggy03/papertrail/bot/listeners/{messagelog => message}/MessageLogListener.java (80%)
rename src/main/java/io/github/eggy03/papertrail/bot/service/{auditlogsupl => guild}/GuildMemberJoinEventHelper.java (97%)
rename src/main/java/io/github/eggy03/papertrail/bot/service/{auditlogsupl => guild}/GuildMemberRemoveEventHelper.java (97%)
rename src/main/java/io/github/eggy03/papertrail/bot/service/{auditlogsupl => guild}/GuildMemberUpdateBoostTimeEventHelper.java (97%)
rename src/main/java/io/github/eggy03/papertrail/bot/service/{auditlogsupl => guild}/GuildPollEventHelper.java (97%)
rename src/main/java/io/github/eggy03/papertrail/bot/service/{auditlogsupl => guild}/GuildUpdateBoostCountEventHelper.java (96%)
rename src/main/java/io/github/eggy03/papertrail/bot/service/{auditlogsupl => guild}/GuildUpdateBoostTierEventHelper.java (97%)
rename src/main/java/io/github/eggy03/papertrail/bot/service/{auditlogsupl => guild}/GuildVoiceEventHelper.java (97%)
rename src/main/java/io/github/eggy03/papertrail/bot/service/{messagelog => message}/MessageLogMessageDeleteEventHelper.java (97%)
rename src/main/java/io/github/eggy03/papertrail/bot/service/{messagelog => message}/MessageLogMessageReceivedEventHelper.java (91%)
rename src/main/java/io/github/eggy03/papertrail/bot/service/{messagelog => message}/MessageLogMessageUpdateEventHelper.java (98%)
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/command/AuditLogSetupCommandListener.java b/src/main/java/io/github/eggy03/papertrail/bot/listeners/command/AuditLogSetupCommandListener.java
index c103ddc..5664749 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/command/AuditLogSetupCommandListener.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/listeners/command/AuditLogSetupCommandListener.java
@@ -44,14 +44,14 @@ private void setAuditLogging(@NonNull SlashCommandInteractionEvent event) {
Guild callerGuild = event.getGuild();
GuildChannel callerChannel = event.getChannel().asTextChannel();
if (callerGuild == null) {
- log.warn("An audit log set command may have been called outside of a auditlogsupl. This should not happen.");
+ log.warn("An audit log set command may have been called outside of a guild. This should not happen.");
return;
}
// acknowledge this interaction before calling the API
event.deferReply().queue();
- // Call the API to register the auditlogsupl and the channel
+ // Call the API to register the guild and the channel
boolean success = client.registerGuild(callerGuild.getId(), callerChannel.getId());
EmbedBuilder eb = new EmbedBuilder();
@@ -62,7 +62,7 @@ private void setAuditLogging(@NonNull SlashCommandInteractionEvent event) {
eb.addField(MarkdownUtil.underline("Registration Success"), MarkdownUtil.codeblock("All audit log info will be logged here"), false);
} else {
eb.setColor(Color.YELLOW);
- eb.addField(MarkdownUtil.underline("Registration Failure"), MarkdownUtil.codeblock("Channel could not be registered. Check if a channel in this auditlogsupl is already registered for logging."), false);
+ eb.addField(MarkdownUtil.underline("Registration Failure"), MarkdownUtil.codeblock("Channel could not be registered. Check if a channel in this guild is already registered for logging."), false);
}
event.getHook().editOriginalEmbeds(eb.build()).queue();
@@ -72,7 +72,7 @@ private void retrieveAuditLoggingChannel(@NonNull SlashCommandInteractionEvent e
Guild callerGuild = event.getGuild();
if (callerGuild == null) {
- log.warn("An audit log view command may have been called outside of a auditlogsupl. This should not happen.");
+ log.warn("An audit log view command may have been called outside of a guild. This should not happen.");
return;
}
@@ -106,14 +106,14 @@ private void unsetAuditLogging(@NonNull SlashCommandInteractionEvent event) {
Guild callerGuild = event.getGuild();
if (callerGuild == null) {
- log.warn("An audit log unset command may have been called outside of a auditlogsupl. This should not happen.");
+ log.warn("An audit log unset command may have been called outside of a guild. This should not happen.");
return;
}
// acknowledge this interaction before calling the API
event.deferReply().queue();
- // Call the API to unregister auditlogsupl
+ // Call the API to unregister guild
boolean success = client.deleteRegisteredGuild(callerGuild.getId());
EmbedBuilder eb = new EmbedBuilder();
@@ -124,7 +124,7 @@ private void unsetAuditLogging(@NonNull SlashCommandInteractionEvent event) {
eb.addField(MarkdownUtil.underline("Removal Success"), MarkdownUtil.codeblock("Channel successfully unset"), false);
} else {
eb.setColor(Color.YELLOW);
- eb.addField(MarkdownUtil.underline("Removal Failure"), MarkdownUtil.codeblock("Channel could not be unset. This may be because no channel has been registered in this auditlogsupl yet."), false);
+ eb.addField(MarkdownUtil.underline("Removal Failure"), MarkdownUtil.codeblock("Channel could not be unset. This may be because no channel has been registered in this guild yet."), false);
}
event.getHook().editOriginalEmbeds(eb.build()).queue();
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/command/DebugCommandListener.java b/src/main/java/io/github/eggy03/papertrail/bot/listeners/command/DebugCommandListener.java
index 7475ea6..22dfa78 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/command/DebugCommandListener.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/listeners/command/DebugCommandListener.java
@@ -147,7 +147,7 @@ public void onSlashCommandInteraction(@NonNull SlashCommandInteractionEvent even
Guild guild = event.getGuild();
Member member = event.getMember();
if (guild == null || member == null) {
- log.warn("command may have been called outside of a auditlogsupl");
+ log.warn("command may have been called outside of a guild");
return;
}
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/command/MessageLogSetupCommandListener.java b/src/main/java/io/github/eggy03/papertrail/bot/listeners/command/MessageLogSetupCommandListener.java
index 83afc5c..41f18db 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/command/MessageLogSetupCommandListener.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/listeners/command/MessageLogSetupCommandListener.java
@@ -44,14 +44,14 @@ private void setMessageLogging(@NonNull SlashCommandInteractionEvent event) {
Guild callerGuild = event.getGuild();
GuildChannel callerChannel = event.getChannel().asTextChannel();
if (callerGuild == null) {
- log.warn("A message log set command may have been called outside of a auditlogsupl. This should not happen.");
+ log.warn("A message log set command may have been called outside of a guild. This should not happen.");
return;
}
// acknowledge this interaction before calling the API
event.deferReply().queue();
- // Call the API to register auditlogsupl for message logging
+ // Call the API to register guild for message logging
boolean success = client.registerGuild(callerGuild.getId(), callerChannel.getId());
EmbedBuilder eb = new EmbedBuilder();
@@ -62,7 +62,7 @@ private void setMessageLogging(@NonNull SlashCommandInteractionEvent event) {
eb.addField(MarkdownUtil.underline("Registration Success"), MarkdownUtil.codeblock("All edited and deleted messages will be logged here"), false);
} else {
eb.setColor(Color.YELLOW);
- eb.addField(MarkdownUtil.underline("Registration Failure"), MarkdownUtil.codeblock("Channel could not be registered. Check if a channel in this auditlogsupl is already registered for logging."), false);
+ eb.addField(MarkdownUtil.underline("Registration Failure"), MarkdownUtil.codeblock("Channel could not be registered. Check if a channel in this guild is already registered for logging."), false);
}
@@ -73,14 +73,14 @@ private void retrieveMessageLoggingChannel(@NonNull SlashCommandInteractionEvent
Guild callerGuild = event.getGuild();
if (callerGuild == null) {
- log.warn("A message log view command may have been called outside of a auditlogsupl. This should not happen.");
+ log.warn("A message log view command may have been called outside of a guild. This should not happen.");
return;
}
// acknowledge this interaction before calling the API
event.deferReply().queue();
- // Call the API to check for registered auditlogsupl
+ // Call the API to check for registered guild
Optional response = client.getRegisteredGuild(callerGuild.getId());
EmbedBuilder eb = new EmbedBuilder();
@@ -106,14 +106,14 @@ private void unsetMessageLogging(@NonNull SlashCommandInteractionEvent event) {
Guild callerGuild = event.getGuild();
if (callerGuild == null) {
- log.warn("A message log unset command may have been called outside of a auditlogsupl. This should not happen.");
+ log.warn("A message log unset command may have been called outside of a guild. This should not happen.");
return;
}
// acknowledge this interaction before calling the API
event.deferReply().queue();
- // Call the API to unregister auditlogsupl
+ // Call the API to unregister guild
boolean success = client.deleteRegisteredGuild(callerGuild.getId());
EmbedBuilder eb = new EmbedBuilder();
@@ -124,7 +124,7 @@ private void unsetMessageLogging(@NonNull SlashCommandInteractionEvent event) {
eb.addField(MarkdownUtil.underline("Removal Success"), MarkdownUtil.codeblock("Channel successfully unset"), false);
} else {
eb.setColor(Color.YELLOW);
- eb.addField(MarkdownUtil.underline("Removal Failure"), MarkdownUtil.codeblock("Channel could not be unset. This may be because no channel has been registered in this auditlogsupl yet."), false);
+ eb.addField(MarkdownUtil.underline("Removal Failure"), MarkdownUtil.codeblock("Channel could not be unset. This may be because no channel has been registered in this guild yet."), false);
}
event.getHook().editOriginalEmbeds(eb.build()).queue();
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/command/ServerStatCommandListener.java b/src/main/java/io/github/eggy03/papertrail/bot/listeners/command/ServerStatCommandListener.java
index 6891844..43e5262 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/command/ServerStatCommandListener.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/listeners/command/ServerStatCommandListener.java
@@ -71,7 +71,7 @@ public void onSlashCommandInteraction(@NonNull SlashCommandInteractionEvent even
Guild guild = event.getGuild();
if (guild == null) {
- log.warn("Command may have been called outside of a auditlogsupl");
+ log.warn("Command may have been called outside of a guild");
return;
}
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlogsupl/GuildBoostEventListener.java b/src/main/java/io/github/eggy03/papertrail/bot/listeners/guild/GuildBoostEventListener.java
similarity index 85%
rename from src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlogsupl/GuildBoostEventListener.java
rename to src/main/java/io/github/eggy03/papertrail/bot/listeners/guild/GuildBoostEventListener.java
index c528bd6..bbcdcd0 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlogsupl/GuildBoostEventListener.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/listeners/guild/GuildBoostEventListener.java
@@ -1,8 +1,8 @@
-package io.github.eggy03.papertrail.bot.listeners.auditlogsupl;
+package io.github.eggy03.papertrail.bot.listeners.guild;
-import io.github.eggy03.papertrail.bot.service.auditlogsupl.GuildMemberUpdateBoostTimeEventHelper;
-import io.github.eggy03.papertrail.bot.service.auditlogsupl.GuildUpdateBoostCountEventHelper;
-import io.github.eggy03.papertrail.bot.service.auditlogsupl.GuildUpdateBoostTierEventHelper;
+import io.github.eggy03.papertrail.bot.service.guild.GuildMemberUpdateBoostTimeEventHelper;
+import io.github.eggy03.papertrail.bot.service.guild.GuildUpdateBoostCountEventHelper;
+import io.github.eggy03.papertrail.bot.service.guild.GuildUpdateBoostTierEventHelper;
import io.github.eggy03.papertrail.sdk.client.AuditLogRegistrationClient;
import io.github.eggy03.papertrail.sdk.entity.AuditLogRegistrationEntity;
import lombok.NonNull;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlogsupl/GuildMemberJoinAndLeaveEventListener.java b/src/main/java/io/github/eggy03/papertrail/bot/listeners/guild/GuildMemberJoinAndLeaveEventListener.java
similarity index 88%
rename from src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlogsupl/GuildMemberJoinAndLeaveEventListener.java
rename to src/main/java/io/github/eggy03/papertrail/bot/listeners/guild/GuildMemberJoinAndLeaveEventListener.java
index 0b3a289..cfa33b9 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlogsupl/GuildMemberJoinAndLeaveEventListener.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/listeners/guild/GuildMemberJoinAndLeaveEventListener.java
@@ -1,7 +1,7 @@
-package io.github.eggy03.papertrail.bot.listeners.auditlogsupl;
+package io.github.eggy03.papertrail.bot.listeners.guild;
-import io.github.eggy03.papertrail.bot.service.auditlogsupl.GuildMemberJoinEventHelper;
-import io.github.eggy03.papertrail.bot.service.auditlogsupl.GuildMemberRemoveEventHelper;
+import io.github.eggy03.papertrail.bot.service.guild.GuildMemberJoinEventHelper;
+import io.github.eggy03.papertrail.bot.service.guild.GuildMemberRemoveEventHelper;
import io.github.eggy03.papertrail.sdk.client.AuditLogRegistrationClient;
import io.github.eggy03.papertrail.sdk.entity.AuditLogRegistrationEntity;
import lombok.NonNull;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlogsupl/GuildPollEventListener.java b/src/main/java/io/github/eggy03/papertrail/bot/listeners/guild/GuildPollEventListener.java
similarity index 86%
rename from src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlogsupl/GuildPollEventListener.java
rename to src/main/java/io/github/eggy03/papertrail/bot/listeners/guild/GuildPollEventListener.java
index 227bc03..123a4e5 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlogsupl/GuildPollEventListener.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/listeners/guild/GuildPollEventListener.java
@@ -1,6 +1,6 @@
-package io.github.eggy03.papertrail.bot.listeners.auditlogsupl;
+package io.github.eggy03.papertrail.bot.listeners.guild;
-import io.github.eggy03.papertrail.bot.service.auditlogsupl.GuildPollEventHelper;
+import io.github.eggy03.papertrail.bot.service.guild.GuildPollEventHelper;
import io.github.eggy03.papertrail.sdk.client.AuditLogRegistrationClient;
import io.github.eggy03.papertrail.sdk.entity.AuditLogRegistrationEntity;
import lombok.NonNull;
@@ -12,7 +12,7 @@
import java.util.Optional;
import java.util.concurrent.Executor;
-// auditlogsupl poll events are mapped to audit log table
+// guild poll events are mapped to audit log table
@RequiredArgsConstructor
public final class GuildPollEventListener extends ListenerAdapter {
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlogsupl/GuildVoiceEventListener.java b/src/main/java/io/github/eggy03/papertrail/bot/listeners/guild/GuildVoiceEventListener.java
similarity index 89%
rename from src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlogsupl/GuildVoiceEventListener.java
rename to src/main/java/io/github/eggy03/papertrail/bot/listeners/guild/GuildVoiceEventListener.java
index 5c6de1d..4284ef5 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/auditlogsupl/GuildVoiceEventListener.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/listeners/guild/GuildVoiceEventListener.java
@@ -1,6 +1,6 @@
-package io.github.eggy03.papertrail.bot.listeners.auditlogsupl;
+package io.github.eggy03.papertrail.bot.listeners.guild;
-import io.github.eggy03.papertrail.bot.service.auditlogsupl.GuildVoiceEventHelper;
+import io.github.eggy03.papertrail.bot.service.guild.GuildVoiceEventHelper;
import io.github.eggy03.papertrail.sdk.client.AuditLogRegistrationClient;
import io.github.eggy03.papertrail.sdk.entity.AuditLogRegistrationEntity;
import lombok.NonNull;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/messagelog/MessageLogListener.java b/src/main/java/io/github/eggy03/papertrail/bot/listeners/message/MessageLogListener.java
similarity index 80%
rename from src/main/java/io/github/eggy03/papertrail/bot/listeners/messagelog/MessageLogListener.java
rename to src/main/java/io/github/eggy03/papertrail/bot/listeners/message/MessageLogListener.java
index 6ebe9cc..537aa77 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/messagelog/MessageLogListener.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/listeners/message/MessageLogListener.java
@@ -1,8 +1,8 @@
-package io.github.eggy03.papertrail.bot.listeners.messagelog;
+package io.github.eggy03.papertrail.bot.listeners.message;
-import io.github.eggy03.papertrail.bot.service.messagelog.MessageLogMessageDeleteEventHelper;
-import io.github.eggy03.papertrail.bot.service.messagelog.MessageLogMessageReceivedEventHelper;
-import io.github.eggy03.papertrail.bot.service.messagelog.MessageLogMessageUpdateEventHelper;
+import io.github.eggy03.papertrail.bot.service.message.MessageLogMessageDeleteEventHelper;
+import io.github.eggy03.papertrail.bot.service.message.MessageLogMessageReceivedEventHelper;
+import io.github.eggy03.papertrail.bot.service.message.MessageLogMessageUpdateEventHelper;
import io.github.eggy03.papertrail.sdk.client.MessageLogContentClient;
import io.github.eggy03.papertrail.sdk.client.MessageLogRegistrationClient;
import io.github.eggy03.papertrail.sdk.entity.MessageLogRegistrationEntity;
@@ -41,9 +41,9 @@ public void onMessageReceived(@NonNull MessageReceivedEvent event) {
}
vThreadPool.execute(() -> {
- // get the auditlogsupl id for which the event was fired
+ // get the guild id for which the event was fired
String guildId = event.getGuild().getId();
- // Call the API to see if the auditlogsupl is registered for Message Logging
+ // Call the API to see if the guild is registered for Message Logging
Optional response = registrationClient.getRegisteredGuild(guildId);
response.ifPresent(success ->
MessageLogMessageReceivedEventHelper.saveMessage(event, contentClient)
@@ -59,9 +59,9 @@ public void onMessageUpdate(@NonNull MessageUpdateEvent event) {
}
vThreadPool.execute(() -> {
- // Get the auditlogsupl id for which the event was fired
+ // Get the guild id for which the event was fired
String guildId = event.getGuild().getId();
- // Call the API to see if the auditlogsupl is registered for Message Logging
+ // Call the API to see if the guild is registered for Message Logging
Optional response = registrationClient.getRegisteredGuild(guildId);
response.ifPresent(success -> {
@@ -80,10 +80,10 @@ public void onMessageDelete(@NonNull MessageDeleteEvent event) {
vThreadPool.execute(() -> {
- // Get the auditlogsupl id for which the event was fired
+ // Get the guild id for which the event was fired
String guildId = event.getGuild().getId();
- // Call the API to see if the auditlogsupl is registered for Message Logging
+ // Call the API to see if the guild is registered for Message Logging
Optional response = registrationClient.getRegisteredGuild(guildId);
response.ifPresent(success -> {
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/misc/ActivityUpdateListener.java b/src/main/java/io/github/eggy03/papertrail/bot/listeners/misc/ActivityUpdateListener.java
index 1c4a159..cb09ce3 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/misc/ActivityUpdateListener.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/listeners/misc/ActivityUpdateListener.java
@@ -28,12 +28,12 @@ public void onReady(@NonNull ReadyEvent event) { // update on cold start
}
@Override
- public void onGuildJoin(@NonNull GuildJoinEvent event) { // update on auditlogsupl join
+ public void onGuildJoin(@NonNull GuildJoinEvent event) { // update on guild join
updateActivity();
}
@Override
- public void onGuildLeave(@NonNull GuildLeaveEvent event) { // update on auditlogsupl leave
+ public void onGuildLeave(@NonNull GuildLeaveEvent event) { // update on guild leave
updateActivity();
}
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/HomeSettingsEventHandler.java b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/HomeSettingsEventHandler.java
index f48dbe4..3d77f93 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/HomeSettingsEventHandler.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/HomeSettingsEventHandler.java
@@ -65,7 +65,7 @@ public void onHomeSettingsCreate(@NonNull GuildAuditLogEntryCreateEvent event) {
eb.addField(
MarkdownUtil.underline("More Info"),
- MarkdownUtil.codeblock("To view the created guide, either visit the Server Guide section or the Onboarding section of your auditlogsupl."),
+ MarkdownUtil.codeblock("To view the created guide, either visit the Server Guide section or the Onboarding section of your guild."),
false
);
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlogsupl/GuildMemberJoinEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/guild/GuildMemberJoinEventHelper.java
similarity index 97%
rename from src/main/java/io/github/eggy03/papertrail/bot/service/auditlogsupl/GuildMemberJoinEventHelper.java
rename to src/main/java/io/github/eggy03/papertrail/bot/service/guild/GuildMemberJoinEventHelper.java
index 2fb8192..db9b3b8 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlogsupl/GuildMemberJoinEventHelper.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/guild/GuildMemberJoinEventHelper.java
@@ -1,4 +1,4 @@
-package io.github.eggy03.papertrail.bot.service.auditlogsupl;
+package io.github.eggy03.papertrail.bot.service.guild;
import io.github.eggy03.papertrail.bot.utils.BooleanUtils;
import io.github.eggy03.papertrail.bot.utils.DurationUtils;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlogsupl/GuildMemberRemoveEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/guild/GuildMemberRemoveEventHelper.java
similarity index 97%
rename from src/main/java/io/github/eggy03/papertrail/bot/service/auditlogsupl/GuildMemberRemoveEventHelper.java
rename to src/main/java/io/github/eggy03/papertrail/bot/service/guild/GuildMemberRemoveEventHelper.java
index 330fdee..af8ab81 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlogsupl/GuildMemberRemoveEventHelper.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/guild/GuildMemberRemoveEventHelper.java
@@ -1,4 +1,4 @@
-package io.github.eggy03.papertrail.bot.service.auditlogsupl;
+package io.github.eggy03.papertrail.bot.service.guild;
import io.github.eggy03.papertrail.bot.utils.DurationUtils;
import lombok.NonNull;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlogsupl/GuildMemberUpdateBoostTimeEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/guild/GuildMemberUpdateBoostTimeEventHelper.java
similarity index 97%
rename from src/main/java/io/github/eggy03/papertrail/bot/service/auditlogsupl/GuildMemberUpdateBoostTimeEventHelper.java
rename to src/main/java/io/github/eggy03/papertrail/bot/service/guild/GuildMemberUpdateBoostTimeEventHelper.java
index 18d06a4..30d1e03 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlogsupl/GuildMemberUpdateBoostTimeEventHelper.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/guild/GuildMemberUpdateBoostTimeEventHelper.java
@@ -1,4 +1,4 @@
-package io.github.eggy03.papertrail.bot.service.auditlogsupl;
+package io.github.eggy03.papertrail.bot.service.guild;
import lombok.NonNull;
import lombok.experimental.UtilityClass;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlogsupl/GuildPollEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/guild/GuildPollEventHelper.java
similarity index 97%
rename from src/main/java/io/github/eggy03/papertrail/bot/service/auditlogsupl/GuildPollEventHelper.java
rename to src/main/java/io/github/eggy03/papertrail/bot/service/guild/GuildPollEventHelper.java
index c22bbbc..68b2363 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlogsupl/GuildPollEventHelper.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/guild/GuildPollEventHelper.java
@@ -1,4 +1,4 @@
-package io.github.eggy03.papertrail.bot.service.auditlogsupl;
+package io.github.eggy03.papertrail.bot.service.guild;
import io.github.eggy03.papertrail.bot.utils.BooleanUtils;
import lombok.NonNull;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlogsupl/GuildUpdateBoostCountEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/guild/GuildUpdateBoostCountEventHelper.java
similarity index 96%
rename from src/main/java/io/github/eggy03/papertrail/bot/service/auditlogsupl/GuildUpdateBoostCountEventHelper.java
rename to src/main/java/io/github/eggy03/papertrail/bot/service/guild/GuildUpdateBoostCountEventHelper.java
index 402ebd5..d6f1013 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlogsupl/GuildUpdateBoostCountEventHelper.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/guild/GuildUpdateBoostCountEventHelper.java
@@ -1,4 +1,4 @@
-package io.github.eggy03.papertrail.bot.service.auditlogsupl;
+package io.github.eggy03.papertrail.bot.service.guild;
import lombok.NonNull;
import lombok.experimental.UtilityClass;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlogsupl/GuildUpdateBoostTierEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/guild/GuildUpdateBoostTierEventHelper.java
similarity index 97%
rename from src/main/java/io/github/eggy03/papertrail/bot/service/auditlogsupl/GuildUpdateBoostTierEventHelper.java
rename to src/main/java/io/github/eggy03/papertrail/bot/service/guild/GuildUpdateBoostTierEventHelper.java
index 11ae726..cd120ee 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlogsupl/GuildUpdateBoostTierEventHelper.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/guild/GuildUpdateBoostTierEventHelper.java
@@ -1,4 +1,4 @@
-package io.github.eggy03.papertrail.bot.service.auditlogsupl;
+package io.github.eggy03.papertrail.bot.service.guild;
import lombok.NonNull;
import lombok.experimental.UtilityClass;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlogsupl/GuildVoiceEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/guild/GuildVoiceEventHelper.java
similarity index 97%
rename from src/main/java/io/github/eggy03/papertrail/bot/service/auditlogsupl/GuildVoiceEventHelper.java
rename to src/main/java/io/github/eggy03/papertrail/bot/service/guild/GuildVoiceEventHelper.java
index c4bf197..b4f92e0 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlogsupl/GuildVoiceEventHelper.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/guild/GuildVoiceEventHelper.java
@@ -1,4 +1,4 @@
-package io.github.eggy03.papertrail.bot.service.auditlogsupl;
+package io.github.eggy03.papertrail.bot.service.guild;
import lombok.NonNull;
import lombok.experimental.UtilityClass;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/messagelog/MessageLogMessageDeleteEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/message/MessageLogMessageDeleteEventHelper.java
similarity index 97%
rename from src/main/java/io/github/eggy03/papertrail/bot/service/messagelog/MessageLogMessageDeleteEventHelper.java
rename to src/main/java/io/github/eggy03/papertrail/bot/service/message/MessageLogMessageDeleteEventHelper.java
index 83bc415..ade5cfe 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/messagelog/MessageLogMessageDeleteEventHelper.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/message/MessageLogMessageDeleteEventHelper.java
@@ -1,4 +1,4 @@
-package io.github.eggy03.papertrail.bot.service.messagelog;
+package io.github.eggy03.papertrail.bot.service.message;
import com.google.common.base.Splitter;
import io.github.eggy03.papertrail.sdk.client.MessageLogContentClient;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/messagelog/MessageLogMessageReceivedEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/message/MessageLogMessageReceivedEventHelper.java
similarity index 91%
rename from src/main/java/io/github/eggy03/papertrail/bot/service/messagelog/MessageLogMessageReceivedEventHelper.java
rename to src/main/java/io/github/eggy03/papertrail/bot/service/message/MessageLogMessageReceivedEventHelper.java
index 437b48b..7002a93 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/messagelog/MessageLogMessageReceivedEventHelper.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/message/MessageLogMessageReceivedEventHelper.java
@@ -1,4 +1,4 @@
-package io.github.eggy03.papertrail.bot.service.messagelog;
+package io.github.eggy03.papertrail.bot.service.message;
import io.github.eggy03.papertrail.sdk.client.MessageLogContentClient;
import lombok.NonNull;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/messagelog/MessageLogMessageUpdateEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/service/message/MessageLogMessageUpdateEventHelper.java
similarity index 98%
rename from src/main/java/io/github/eggy03/papertrail/bot/service/messagelog/MessageLogMessageUpdateEventHelper.java
rename to src/main/java/io/github/eggy03/papertrail/bot/service/message/MessageLogMessageUpdateEventHelper.java
index fbbf12b..4a9e1f1 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/messagelog/MessageLogMessageUpdateEventHelper.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/service/message/MessageLogMessageUpdateEventHelper.java
@@ -1,4 +1,4 @@
-package io.github.eggy03.papertrail.bot.service.messagelog;
+package io.github.eggy03.papertrail.bot.service.message;
import com.google.common.base.Splitter;
import io.github.eggy03.papertrail.sdk.client.MessageLogContentClient;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/StickerUtils.java b/src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/StickerUtils.java
index 26b08fe..e87600a 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/StickerUtils.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/StickerUtils.java
@@ -20,7 +20,7 @@ public final class StickerUtils {
public static String resolveStickerUrl(@NonNull GenericGuildEvent event, @Nullable Object stickerIdObject) {
if (stickerIdObject == null) {
- log.debug("stickerIdObject is null (auditlogsupl={})", event.getGuild().getId());
+ log.debug("stickerIdObject is null (guild={})", event.getGuild().getId());
return FALLBACK_STRING;
}
@@ -28,7 +28,7 @@ public static String resolveStickerUrl(@NonNull GenericGuildEvent event, @Nullab
GuildSticker sticker = event.getGuild().getStickerById(String.valueOf(stickerIdObject));
if (sticker == null) {
- log.debug("sticker not found (stickerIdObject={}, auditlogsupl={})", stickerIdStr, event.getGuild().getId());
+ log.debug("sticker not found (stickerIdObject={}, guild={})", stickerIdStr, event.getGuild().getId());
return stickerIdStr;
}
@@ -43,7 +43,7 @@ public static String resolveStickerUrl(@NonNull GenericGuildEvent event, @Nullab
public static String resolveRelatedEmoji(@NonNull GenericGuildEvent event, @Nullable Object emojiIdObject) {
if (emojiIdObject == null) {
- log.debug("emojiIdObject is null (auditlogsupl={})", event.getGuild().getId());
+ log.debug("emojiIdObject is null (guild={})", event.getGuild().getId());
return FALLBACK_STRING;
}
@@ -54,13 +54,13 @@ public static String resolveRelatedEmoji(@NonNull GenericGuildEvent event, @Null
Emoji emoji = event.getGuild().getEmojiById(emojiIdLong);
if (emoji == null) {
- log.debug("custom emoji not found (emojiIdLong={}, auditlogsupl={})", emojiIdLong, event.getGuild().getId());
+ log.debug("custom emoji not found (emojiIdLong={}, guild={})", emojiIdLong, event.getGuild().getId());
return emojiIdString;
}
return emoji.getFormatted();
} catch (NumberFormatException _) {
- log.debug("value is not numeric, treating as Unicode (value={}, auditlogsupl={})", emojiIdString, event.getGuild().getId());
+ log.debug("value is not numeric, treating as Unicode (value={}, guild={})", emojiIdString, event.getGuild().getId());
return emojiIdString;
}
From e9597b00ea7ce9341f05214f4a0a2c601a988eff Mon Sep 17 00:00:00 2001
From: Egg-03 <111327101+eggy03@users.noreply.github.com>
Date: Sun, 31 May 2026 14:18:14 +0530
Subject: [PATCH 41/66] refactor(bot): move event handlers from service to
handlers package
- Move event handlers and helpers from `service` to `handlers` package
- Update package declarations and imports accordingly
- Add todo comment in `MessageLogListener.java` for future renaming
Signed-off-by: Egg-03 <111327101+eggy03@users.noreply.github.com>
---
.../auditlog/AutoModEventHandler.java | 2 +-
.../auditlog/ChannelEventHandler.java | 2 +-
.../auditlog/ChannelOverrideEventHandler.java | 2 +-
.../{service => handlers}/auditlog/EmojiEventHandler.java | 2 +-
.../auditlog/GuildUpdateEventHandler.java | 2 +-
.../auditlog/HomeSettingsEventHandler.java | 2 +-
.../auditlog/IntegrationEventHandler.java | 2 +-
.../{service => handlers}/auditlog/InviteEventHandler.java | 2 +-
.../auditlog/MemberStatusEventHandler.java | 2 +-
.../auditlog/MessageEventHandler.java | 2 +-
.../auditlog/MessagePinEventHandler.java | 2 +-
.../auditlog/ModActionEventHandler.java | 2 +-
.../auditlog/OnboardingEventHandler.java | 2 +-
.../auditlog/OnboardingPromptEventHandler.java | 2 +-
.../{service => handlers}/auditlog/RoleEventHandler.java | 2 +-
.../auditlog/ScheduledEventHandler.java | 2 +-
.../auditlog/SoundboardEventHandler.java | 2 +-
.../auditlog/StageInstanceEventHandler.java | 2 +-
.../auditlog/StickerEventHandler.java | 2 +-
.../{service => handlers}/auditlog/ThreadEventHandler.java | 2 +-
.../auditlog/UnimplementedEventHandler.java | 2 +-
.../auditlog/UnknownEventHandler.java | 2 +-
.../auditlog/VoiceChannelStatusEventHandler.java | 2 +-
.../auditlog/WebhookEventHandler.java | 2 +-
.../guild/GuildMemberJoinEventHelper.java | 2 +-
.../guild/GuildMemberRemoveEventHelper.java | 2 +-
.../guild/GuildMemberUpdateBoostTimeEventHelper.java | 2 +-
.../{service => handlers}/guild/GuildPollEventHelper.java | 2 +-
.../guild/GuildUpdateBoostCountEventHelper.java | 2 +-
.../guild/GuildUpdateBoostTierEventHelper.java | 2 +-
.../{service => handlers}/guild/GuildVoiceEventHelper.java | 2 +-
.../message/MessageLogMessageDeleteEventHelper.java | 2 +-
.../message/MessageLogMessageReceivedEventHelper.java | 2 +-
.../message/MessageLogMessageUpdateEventHelper.java | 2 +-
.../bot/listeners/guild/GuildBoostEventListener.java | 6 +++---
.../guild/GuildMemberJoinAndLeaveEventListener.java | 4 ++--
.../bot/listeners/guild/GuildPollEventListener.java | 2 +-
.../bot/listeners/guild/GuildVoiceEventListener.java | 2 +-
.../bot/listeners/message/MessageLogListener.java | 7 ++++---
39 files changed, 45 insertions(+), 44 deletions(-)
rename src/main/java/io/github/eggy03/papertrail/bot/{service => handlers}/auditlog/AutoModEventHandler.java (99%)
rename src/main/java/io/github/eggy03/papertrail/bot/{service => handlers}/auditlog/ChannelEventHandler.java (99%)
rename src/main/java/io/github/eggy03/papertrail/bot/{service => handlers}/auditlog/ChannelOverrideEventHandler.java (99%)
rename src/main/java/io/github/eggy03/papertrail/bot/{service => handlers}/auditlog/EmojiEventHandler.java (99%)
rename src/main/java/io/github/eggy03/papertrail/bot/{service => handlers}/auditlog/GuildUpdateEventHandler.java (99%)
rename src/main/java/io/github/eggy03/papertrail/bot/{service => handlers}/auditlog/HomeSettingsEventHandler.java (98%)
rename src/main/java/io/github/eggy03/papertrail/bot/{service => handlers}/auditlog/IntegrationEventHandler.java (99%)
rename src/main/java/io/github/eggy03/papertrail/bot/{service => handlers}/auditlog/InviteEventHandler.java (99%)
rename src/main/java/io/github/eggy03/papertrail/bot/{service => handlers}/auditlog/MemberStatusEventHandler.java (99%)
rename src/main/java/io/github/eggy03/papertrail/bot/{service => handlers}/auditlog/MessageEventHandler.java (98%)
rename src/main/java/io/github/eggy03/papertrail/bot/{service => handlers}/auditlog/MessagePinEventHandler.java (98%)
rename src/main/java/io/github/eggy03/papertrail/bot/{service => handlers}/auditlog/ModActionEventHandler.java (99%)
rename src/main/java/io/github/eggy03/papertrail/bot/{service => handlers}/auditlog/OnboardingEventHandler.java (99%)
rename src/main/java/io/github/eggy03/papertrail/bot/{service => handlers}/auditlog/OnboardingPromptEventHandler.java (99%)
rename src/main/java/io/github/eggy03/papertrail/bot/{service => handlers}/auditlog/RoleEventHandler.java (99%)
rename src/main/java/io/github/eggy03/papertrail/bot/{service => handlers}/auditlog/ScheduledEventHandler.java (99%)
rename src/main/java/io/github/eggy03/papertrail/bot/{service => handlers}/auditlog/SoundboardEventHandler.java (99%)
rename src/main/java/io/github/eggy03/papertrail/bot/{service => handlers}/auditlog/StageInstanceEventHandler.java (99%)
rename src/main/java/io/github/eggy03/papertrail/bot/{service => handlers}/auditlog/StickerEventHandler.java (99%)
rename src/main/java/io/github/eggy03/papertrail/bot/{service => handlers}/auditlog/ThreadEventHandler.java (99%)
rename src/main/java/io/github/eggy03/papertrail/bot/{service => handlers}/auditlog/UnimplementedEventHandler.java (92%)
rename src/main/java/io/github/eggy03/papertrail/bot/{service => handlers}/auditlog/UnknownEventHandler.java (98%)
rename src/main/java/io/github/eggy03/papertrail/bot/{service => handlers}/auditlog/VoiceChannelStatusEventHandler.java (98%)
rename src/main/java/io/github/eggy03/papertrail/bot/{service => handlers}/auditlog/WebhookEventHandler.java (99%)
rename src/main/java/io/github/eggy03/papertrail/bot/{service => handlers}/guild/GuildMemberJoinEventHelper.java (97%)
rename src/main/java/io/github/eggy03/papertrail/bot/{service => handlers}/guild/GuildMemberRemoveEventHelper.java (98%)
rename src/main/java/io/github/eggy03/papertrail/bot/{service => handlers}/guild/GuildMemberUpdateBoostTimeEventHelper.java (97%)
rename src/main/java/io/github/eggy03/papertrail/bot/{service => handlers}/guild/GuildPollEventHelper.java (98%)
rename src/main/java/io/github/eggy03/papertrail/bot/{service => handlers}/guild/GuildUpdateBoostCountEventHelper.java (96%)
rename src/main/java/io/github/eggy03/papertrail/bot/{service => handlers}/guild/GuildUpdateBoostTierEventHelper.java (97%)
rename src/main/java/io/github/eggy03/papertrail/bot/{service => handlers}/guild/GuildVoiceEventHelper.java (98%)
rename src/main/java/io/github/eggy03/papertrail/bot/{service => handlers}/message/MessageLogMessageDeleteEventHelper.java (98%)
rename src/main/java/io/github/eggy03/papertrail/bot/{service => handlers}/message/MessageLogMessageReceivedEventHelper.java (91%)
rename src/main/java/io/github/eggy03/papertrail/bot/{service => handlers}/message/MessageLogMessageUpdateEventHelper.java (98%)
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/AutoModEventHandler.java b/src/main/java/io/github/eggy03/papertrail/bot/handlers/auditlog/AutoModEventHandler.java
similarity index 99%
rename from src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/AutoModEventHandler.java
rename to src/main/java/io/github/eggy03/papertrail/bot/handlers/auditlog/AutoModEventHandler.java
index debae63..df1c516 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/AutoModEventHandler.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/handlers/auditlog/AutoModEventHandler.java
@@ -1,4 +1,4 @@
-package io.github.eggy03.papertrail.bot.service.auditlog;
+package io.github.eggy03.papertrail.bot.handlers.auditlog;
import io.github.eggy03.papertrail.bot.listeners.auditlog.GuildAuditLogEntryCreateEventHandler;
import io.github.eggy03.papertrail.bot.utils.BooleanUtils;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/ChannelEventHandler.java b/src/main/java/io/github/eggy03/papertrail/bot/handlers/auditlog/ChannelEventHandler.java
similarity index 99%
rename from src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/ChannelEventHandler.java
rename to src/main/java/io/github/eggy03/papertrail/bot/handlers/auditlog/ChannelEventHandler.java
index 90df40e..ac64e56 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/ChannelEventHandler.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/handlers/auditlog/ChannelEventHandler.java
@@ -1,4 +1,4 @@
-package io.github.eggy03.papertrail.bot.service.auditlog;
+package io.github.eggy03.papertrail.bot.handlers.auditlog;
import io.github.eggy03.papertrail.bot.listeners.auditlog.GuildAuditLogEntryCreateEventHandler;
import io.github.eggy03.papertrail.bot.utils.BooleanUtils;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/ChannelOverrideEventHandler.java b/src/main/java/io/github/eggy03/papertrail/bot/handlers/auditlog/ChannelOverrideEventHandler.java
similarity index 99%
rename from src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/ChannelOverrideEventHandler.java
rename to src/main/java/io/github/eggy03/papertrail/bot/handlers/auditlog/ChannelOverrideEventHandler.java
index 4aa6727..38a04e0 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/ChannelOverrideEventHandler.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/handlers/auditlog/ChannelOverrideEventHandler.java
@@ -1,4 +1,4 @@
-package io.github.eggy03.papertrail.bot.service.auditlog;
+package io.github.eggy03.papertrail.bot.handlers.auditlog;
import io.github.eggy03.papertrail.bot.listeners.auditlog.GuildAuditLogEntryCreateEventHandler;
import io.github.eggy03.papertrail.bot.utils.auditlog.ChannelUtils;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/EmojiEventHandler.java b/src/main/java/io/github/eggy03/papertrail/bot/handlers/auditlog/EmojiEventHandler.java
similarity index 99%
rename from src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/EmojiEventHandler.java
rename to src/main/java/io/github/eggy03/papertrail/bot/handlers/auditlog/EmojiEventHandler.java
index c610956..0d84cf0 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/EmojiEventHandler.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/handlers/auditlog/EmojiEventHandler.java
@@ -1,4 +1,4 @@
-package io.github.eggy03.papertrail.bot.service.auditlog;
+package io.github.eggy03.papertrail.bot.handlers.auditlog;
import io.github.eggy03.papertrail.bot.listeners.auditlog.GuildAuditLogEntryCreateEventHandler;
import io.github.eggy03.papertrail.sdk.client.AuditLogRegistrationClient;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/GuildUpdateEventHandler.java b/src/main/java/io/github/eggy03/papertrail/bot/handlers/auditlog/GuildUpdateEventHandler.java
similarity index 99%
rename from src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/GuildUpdateEventHandler.java
rename to src/main/java/io/github/eggy03/papertrail/bot/handlers/auditlog/GuildUpdateEventHandler.java
index 2f6bab0..7973f82 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/GuildUpdateEventHandler.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/handlers/auditlog/GuildUpdateEventHandler.java
@@ -1,4 +1,4 @@
-package io.github.eggy03.papertrail.bot.service.auditlog;
+package io.github.eggy03.papertrail.bot.handlers.auditlog;
import io.github.eggy03.papertrail.bot.listeners.auditlog.GuildAuditLogEntryCreateEventHandler;
import io.github.eggy03.papertrail.bot.utils.BooleanUtils;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/HomeSettingsEventHandler.java b/src/main/java/io/github/eggy03/papertrail/bot/handlers/auditlog/HomeSettingsEventHandler.java
similarity index 98%
rename from src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/HomeSettingsEventHandler.java
rename to src/main/java/io/github/eggy03/papertrail/bot/handlers/auditlog/HomeSettingsEventHandler.java
index 3d77f93..6b3aab0 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/HomeSettingsEventHandler.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/handlers/auditlog/HomeSettingsEventHandler.java
@@ -1,4 +1,4 @@
-package io.github.eggy03.papertrail.bot.service.auditlog;
+package io.github.eggy03.papertrail.bot.handlers.auditlog;
import io.github.eggy03.papertrail.bot.listeners.auditlog.GuildAuditLogEntryCreateEventHandler;
import io.github.eggy03.papertrail.sdk.client.AuditLogRegistrationClient;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/IntegrationEventHandler.java b/src/main/java/io/github/eggy03/papertrail/bot/handlers/auditlog/IntegrationEventHandler.java
similarity index 99%
rename from src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/IntegrationEventHandler.java
rename to src/main/java/io/github/eggy03/papertrail/bot/handlers/auditlog/IntegrationEventHandler.java
index a1c22db..22377af 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/IntegrationEventHandler.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/handlers/auditlog/IntegrationEventHandler.java
@@ -1,4 +1,4 @@
-package io.github.eggy03.papertrail.bot.service.auditlog;
+package io.github.eggy03.papertrail.bot.handlers.auditlog;
import io.github.eggy03.papertrail.bot.listeners.auditlog.GuildAuditLogEntryCreateEventHandler;
import io.github.eggy03.papertrail.sdk.client.AuditLogRegistrationClient;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/InviteEventHandler.java b/src/main/java/io/github/eggy03/papertrail/bot/handlers/auditlog/InviteEventHandler.java
similarity index 99%
rename from src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/InviteEventHandler.java
rename to src/main/java/io/github/eggy03/papertrail/bot/handlers/auditlog/InviteEventHandler.java
index 4f6fa4b..bff8ad0 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/InviteEventHandler.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/handlers/auditlog/InviteEventHandler.java
@@ -1,4 +1,4 @@
-package io.github.eggy03.papertrail.bot.service.auditlog;
+package io.github.eggy03.papertrail.bot.handlers.auditlog;
import io.github.eggy03.papertrail.bot.listeners.auditlog.GuildAuditLogEntryCreateEventHandler;
import io.github.eggy03.papertrail.bot.utils.BooleanUtils;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/MemberStatusEventHandler.java b/src/main/java/io/github/eggy03/papertrail/bot/handlers/auditlog/MemberStatusEventHandler.java
similarity index 99%
rename from src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/MemberStatusEventHandler.java
rename to src/main/java/io/github/eggy03/papertrail/bot/handlers/auditlog/MemberStatusEventHandler.java
index 4602d1d..f261e62 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/MemberStatusEventHandler.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/handlers/auditlog/MemberStatusEventHandler.java
@@ -1,4 +1,4 @@
-package io.github.eggy03.papertrail.bot.service.auditlog;
+package io.github.eggy03.papertrail.bot.handlers.auditlog;
import io.github.eggy03.papertrail.bot.listeners.auditlog.GuildAuditLogEntryCreateEventHandler;
import io.github.eggy03.papertrail.bot.utils.BooleanUtils;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/MessageEventHandler.java b/src/main/java/io/github/eggy03/papertrail/bot/handlers/auditlog/MessageEventHandler.java
similarity index 98%
rename from src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/MessageEventHandler.java
rename to src/main/java/io/github/eggy03/papertrail/bot/handlers/auditlog/MessageEventHandler.java
index 933eab6..78381d3 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/MessageEventHandler.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/handlers/auditlog/MessageEventHandler.java
@@ -1,4 +1,4 @@
-package io.github.eggy03.papertrail.bot.service.auditlog;
+package io.github.eggy03.papertrail.bot.handlers.auditlog;
import io.github.eggy03.papertrail.bot.listeners.auditlog.GuildAuditLogEntryCreateEventHandler;
import io.github.eggy03.papertrail.sdk.client.AuditLogRegistrationClient;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/MessagePinEventHandler.java b/src/main/java/io/github/eggy03/papertrail/bot/handlers/auditlog/MessagePinEventHandler.java
similarity index 98%
rename from src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/MessagePinEventHandler.java
rename to src/main/java/io/github/eggy03/papertrail/bot/handlers/auditlog/MessagePinEventHandler.java
index da4d8d0..4b8d85f 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/MessagePinEventHandler.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/handlers/auditlog/MessagePinEventHandler.java
@@ -1,4 +1,4 @@
-package io.github.eggy03.papertrail.bot.service.auditlog;
+package io.github.eggy03.papertrail.bot.handlers.auditlog;
import io.github.eggy03.papertrail.bot.listeners.auditlog.GuildAuditLogEntryCreateEventHandler;
import io.github.eggy03.papertrail.bot.utils.auditlog.MessageUtils;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/ModActionEventHandler.java b/src/main/java/io/github/eggy03/papertrail/bot/handlers/auditlog/ModActionEventHandler.java
similarity index 99%
rename from src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/ModActionEventHandler.java
rename to src/main/java/io/github/eggy03/papertrail/bot/handlers/auditlog/ModActionEventHandler.java
index a5b25f3..8c09146 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/ModActionEventHandler.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/handlers/auditlog/ModActionEventHandler.java
@@ -1,4 +1,4 @@
-package io.github.eggy03.papertrail.bot.service.auditlog;
+package io.github.eggy03.papertrail.bot.handlers.auditlog;
import io.github.eggy03.papertrail.bot.listeners.auditlog.GuildAuditLogEntryCreateEventHandler;
import io.github.eggy03.papertrail.sdk.client.AuditLogRegistrationClient;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/OnboardingEventHandler.java b/src/main/java/io/github/eggy03/papertrail/bot/handlers/auditlog/OnboardingEventHandler.java
similarity index 99%
rename from src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/OnboardingEventHandler.java
rename to src/main/java/io/github/eggy03/papertrail/bot/handlers/auditlog/OnboardingEventHandler.java
index 2568e4e..476fc1b 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/OnboardingEventHandler.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/handlers/auditlog/OnboardingEventHandler.java
@@ -1,4 +1,4 @@
-package io.github.eggy03.papertrail.bot.service.auditlog;
+package io.github.eggy03.papertrail.bot.handlers.auditlog;
import io.github.eggy03.papertrail.bot.listeners.auditlog.GuildAuditLogEntryCreateEventHandler;
import io.github.eggy03.papertrail.bot.utils.BooleanUtils;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/OnboardingPromptEventHandler.java b/src/main/java/io/github/eggy03/papertrail/bot/handlers/auditlog/OnboardingPromptEventHandler.java
similarity index 99%
rename from src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/OnboardingPromptEventHandler.java
rename to src/main/java/io/github/eggy03/papertrail/bot/handlers/auditlog/OnboardingPromptEventHandler.java
index 9ec72e4..2629742 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/OnboardingPromptEventHandler.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/handlers/auditlog/OnboardingPromptEventHandler.java
@@ -1,4 +1,4 @@
-package io.github.eggy03.papertrail.bot.service.auditlog;
+package io.github.eggy03.papertrail.bot.handlers.auditlog;
import io.github.eggy03.papertrail.bot.listeners.auditlog.GuildAuditLogEntryCreateEventHandler;
import io.github.eggy03.papertrail.bot.utils.BooleanUtils;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/RoleEventHandler.java b/src/main/java/io/github/eggy03/papertrail/bot/handlers/auditlog/RoleEventHandler.java
similarity index 99%
rename from src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/RoleEventHandler.java
rename to src/main/java/io/github/eggy03/papertrail/bot/handlers/auditlog/RoleEventHandler.java
index ec9d5a1..1a6fe69 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/RoleEventHandler.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/handlers/auditlog/RoleEventHandler.java
@@ -1,4 +1,4 @@
-package io.github.eggy03.papertrail.bot.service.auditlog;
+package io.github.eggy03.papertrail.bot.handlers.auditlog;
import io.github.eggy03.papertrail.bot.listeners.auditlog.GuildAuditLogEntryCreateEventHandler;
import io.github.eggy03.papertrail.bot.utils.BooleanUtils;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/ScheduledEventHandler.java b/src/main/java/io/github/eggy03/papertrail/bot/handlers/auditlog/ScheduledEventHandler.java
similarity index 99%
rename from src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/ScheduledEventHandler.java
rename to src/main/java/io/github/eggy03/papertrail/bot/handlers/auditlog/ScheduledEventHandler.java
index e2e1612..aecda5c 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/ScheduledEventHandler.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/handlers/auditlog/ScheduledEventHandler.java
@@ -1,4 +1,4 @@
-package io.github.eggy03.papertrail.bot.service.auditlog;
+package io.github.eggy03.papertrail.bot.handlers.auditlog;
import io.github.eggy03.papertrail.bot.listeners.auditlog.GuildAuditLogEntryCreateEventHandler;
import io.github.eggy03.papertrail.bot.utils.auditlog.ScheduledEventUtils;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/SoundboardEventHandler.java b/src/main/java/io/github/eggy03/papertrail/bot/handlers/auditlog/SoundboardEventHandler.java
similarity index 99%
rename from src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/SoundboardEventHandler.java
rename to src/main/java/io/github/eggy03/papertrail/bot/handlers/auditlog/SoundboardEventHandler.java
index 8560d79..e12fee8 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/SoundboardEventHandler.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/handlers/auditlog/SoundboardEventHandler.java
@@ -1,4 +1,4 @@
-package io.github.eggy03.papertrail.bot.service.auditlog;
+package io.github.eggy03.papertrail.bot.handlers.auditlog;
import io.github.eggy03.papertrail.bot.listeners.auditlog.GuildAuditLogEntryCreateEventHandler;
import io.github.eggy03.papertrail.bot.utils.auditlog.SoundboardUtils;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/StageInstanceEventHandler.java b/src/main/java/io/github/eggy03/papertrail/bot/handlers/auditlog/StageInstanceEventHandler.java
similarity index 99%
rename from src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/StageInstanceEventHandler.java
rename to src/main/java/io/github/eggy03/papertrail/bot/handlers/auditlog/StageInstanceEventHandler.java
index ac508af..e519615 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/StageInstanceEventHandler.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/handlers/auditlog/StageInstanceEventHandler.java
@@ -1,4 +1,4 @@
-package io.github.eggy03.papertrail.bot.service.auditlog;
+package io.github.eggy03.papertrail.bot.handlers.auditlog;
import io.github.eggy03.papertrail.bot.listeners.auditlog.GuildAuditLogEntryCreateEventHandler;
import io.github.eggy03.papertrail.bot.utils.auditlog.StageUtils;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/StickerEventHandler.java b/src/main/java/io/github/eggy03/papertrail/bot/handlers/auditlog/StickerEventHandler.java
similarity index 99%
rename from src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/StickerEventHandler.java
rename to src/main/java/io/github/eggy03/papertrail/bot/handlers/auditlog/StickerEventHandler.java
index 38a78fb..262e597 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/StickerEventHandler.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/handlers/auditlog/StickerEventHandler.java
@@ -1,4 +1,4 @@
-package io.github.eggy03.papertrail.bot.service.auditlog;
+package io.github.eggy03.papertrail.bot.handlers.auditlog;
import io.github.eggy03.papertrail.bot.listeners.auditlog.GuildAuditLogEntryCreateEventHandler;
import io.github.eggy03.papertrail.bot.utils.auditlog.StickerUtils;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/ThreadEventHandler.java b/src/main/java/io/github/eggy03/papertrail/bot/handlers/auditlog/ThreadEventHandler.java
similarity index 99%
rename from src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/ThreadEventHandler.java
rename to src/main/java/io/github/eggy03/papertrail/bot/handlers/auditlog/ThreadEventHandler.java
index 672a6bc..4c706b6 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/ThreadEventHandler.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/handlers/auditlog/ThreadEventHandler.java
@@ -1,4 +1,4 @@
-package io.github.eggy03.papertrail.bot.service.auditlog;
+package io.github.eggy03.papertrail.bot.handlers.auditlog;
import io.github.eggy03.papertrail.bot.listeners.auditlog.GuildAuditLogEntryCreateEventHandler;
import io.github.eggy03.papertrail.bot.utils.BooleanUtils;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/UnimplementedEventHandler.java b/src/main/java/io/github/eggy03/papertrail/bot/handlers/auditlog/UnimplementedEventHandler.java
similarity index 92%
rename from src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/UnimplementedEventHandler.java
rename to src/main/java/io/github/eggy03/papertrail/bot/handlers/auditlog/UnimplementedEventHandler.java
index 6ce74a8..d102059 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/UnimplementedEventHandler.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/handlers/auditlog/UnimplementedEventHandler.java
@@ -1,4 +1,4 @@
-package io.github.eggy03.papertrail.bot.service.auditlog;
+package io.github.eggy03.papertrail.bot.handlers.auditlog;
import io.github.eggy03.papertrail.bot.listeners.auditlog.GuildAuditLogEntryCreateEventHandler;
import jakarta.enterprise.context.ApplicationScoped;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/UnknownEventHandler.java b/src/main/java/io/github/eggy03/papertrail/bot/handlers/auditlog/UnknownEventHandler.java
similarity index 98%
rename from src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/UnknownEventHandler.java
rename to src/main/java/io/github/eggy03/papertrail/bot/handlers/auditlog/UnknownEventHandler.java
index bc8834f..3fd1e02 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/UnknownEventHandler.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/handlers/auditlog/UnknownEventHandler.java
@@ -1,4 +1,4 @@
-package io.github.eggy03.papertrail.bot.service.auditlog;
+package io.github.eggy03.papertrail.bot.handlers.auditlog;
import io.github.eggy03.papertrail.bot.listeners.auditlog.GuildAuditLogEntryCreateEventHandler;
import io.github.eggy03.papertrail.sdk.client.AuditLogRegistrationClient;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/VoiceChannelStatusEventHandler.java b/src/main/java/io/github/eggy03/papertrail/bot/handlers/auditlog/VoiceChannelStatusEventHandler.java
similarity index 98%
rename from src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/VoiceChannelStatusEventHandler.java
rename to src/main/java/io/github/eggy03/papertrail/bot/handlers/auditlog/VoiceChannelStatusEventHandler.java
index 45e2bf3..6541eef 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/VoiceChannelStatusEventHandler.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/handlers/auditlog/VoiceChannelStatusEventHandler.java
@@ -1,4 +1,4 @@
-package io.github.eggy03.papertrail.bot.service.auditlog;
+package io.github.eggy03.papertrail.bot.handlers.auditlog;
import io.github.eggy03.papertrail.bot.listeners.auditlog.GuildAuditLogEntryCreateEventHandler;
import io.github.eggy03.papertrail.sdk.client.AuditLogRegistrationClient;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/WebhookEventHandler.java b/src/main/java/io/github/eggy03/papertrail/bot/handlers/auditlog/WebhookEventHandler.java
similarity index 99%
rename from src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/WebhookEventHandler.java
rename to src/main/java/io/github/eggy03/papertrail/bot/handlers/auditlog/WebhookEventHandler.java
index 4ce2f4e..0b504fa 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/auditlog/WebhookEventHandler.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/handlers/auditlog/WebhookEventHandler.java
@@ -1,4 +1,4 @@
-package io.github.eggy03.papertrail.bot.service.auditlog;
+package io.github.eggy03.papertrail.bot.handlers.auditlog;
import io.github.eggy03.papertrail.bot.listeners.auditlog.GuildAuditLogEntryCreateEventHandler;
import io.github.eggy03.papertrail.bot.utils.auditlog.GuildUtils;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/guild/GuildMemberJoinEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/handlers/guild/GuildMemberJoinEventHelper.java
similarity index 97%
rename from src/main/java/io/github/eggy03/papertrail/bot/service/guild/GuildMemberJoinEventHelper.java
rename to src/main/java/io/github/eggy03/papertrail/bot/handlers/guild/GuildMemberJoinEventHelper.java
index db9b3b8..d0fd71b 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/guild/GuildMemberJoinEventHelper.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/handlers/guild/GuildMemberJoinEventHelper.java
@@ -1,4 +1,4 @@
-package io.github.eggy03.papertrail.bot.service.guild;
+package io.github.eggy03.papertrail.bot.handlers.guild;
import io.github.eggy03.papertrail.bot.utils.BooleanUtils;
import io.github.eggy03.papertrail.bot.utils.DurationUtils;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/guild/GuildMemberRemoveEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/handlers/guild/GuildMemberRemoveEventHelper.java
similarity index 98%
rename from src/main/java/io/github/eggy03/papertrail/bot/service/guild/GuildMemberRemoveEventHelper.java
rename to src/main/java/io/github/eggy03/papertrail/bot/handlers/guild/GuildMemberRemoveEventHelper.java
index af8ab81..9a1d056 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/guild/GuildMemberRemoveEventHelper.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/handlers/guild/GuildMemberRemoveEventHelper.java
@@ -1,4 +1,4 @@
-package io.github.eggy03.papertrail.bot.service.guild;
+package io.github.eggy03.papertrail.bot.handlers.guild;
import io.github.eggy03.papertrail.bot.utils.DurationUtils;
import lombok.NonNull;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/guild/GuildMemberUpdateBoostTimeEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/handlers/guild/GuildMemberUpdateBoostTimeEventHelper.java
similarity index 97%
rename from src/main/java/io/github/eggy03/papertrail/bot/service/guild/GuildMemberUpdateBoostTimeEventHelper.java
rename to src/main/java/io/github/eggy03/papertrail/bot/handlers/guild/GuildMemberUpdateBoostTimeEventHelper.java
index 30d1e03..9212f0c 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/guild/GuildMemberUpdateBoostTimeEventHelper.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/handlers/guild/GuildMemberUpdateBoostTimeEventHelper.java
@@ -1,4 +1,4 @@
-package io.github.eggy03.papertrail.bot.service.guild;
+package io.github.eggy03.papertrail.bot.handlers.guild;
import lombok.NonNull;
import lombok.experimental.UtilityClass;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/guild/GuildPollEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/handlers/guild/GuildPollEventHelper.java
similarity index 98%
rename from src/main/java/io/github/eggy03/papertrail/bot/service/guild/GuildPollEventHelper.java
rename to src/main/java/io/github/eggy03/papertrail/bot/handlers/guild/GuildPollEventHelper.java
index 68b2363..f98eb08 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/guild/GuildPollEventHelper.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/handlers/guild/GuildPollEventHelper.java
@@ -1,4 +1,4 @@
-package io.github.eggy03.papertrail.bot.service.guild;
+package io.github.eggy03.papertrail.bot.handlers.guild;
import io.github.eggy03.papertrail.bot.utils.BooleanUtils;
import lombok.NonNull;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/guild/GuildUpdateBoostCountEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/handlers/guild/GuildUpdateBoostCountEventHelper.java
similarity index 96%
rename from src/main/java/io/github/eggy03/papertrail/bot/service/guild/GuildUpdateBoostCountEventHelper.java
rename to src/main/java/io/github/eggy03/papertrail/bot/handlers/guild/GuildUpdateBoostCountEventHelper.java
index d6f1013..3bf10a3 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/guild/GuildUpdateBoostCountEventHelper.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/handlers/guild/GuildUpdateBoostCountEventHelper.java
@@ -1,4 +1,4 @@
-package io.github.eggy03.papertrail.bot.service.guild;
+package io.github.eggy03.papertrail.bot.handlers.guild;
import lombok.NonNull;
import lombok.experimental.UtilityClass;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/guild/GuildUpdateBoostTierEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/handlers/guild/GuildUpdateBoostTierEventHelper.java
similarity index 97%
rename from src/main/java/io/github/eggy03/papertrail/bot/service/guild/GuildUpdateBoostTierEventHelper.java
rename to src/main/java/io/github/eggy03/papertrail/bot/handlers/guild/GuildUpdateBoostTierEventHelper.java
index cd120ee..f3be27f 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/guild/GuildUpdateBoostTierEventHelper.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/handlers/guild/GuildUpdateBoostTierEventHelper.java
@@ -1,4 +1,4 @@
-package io.github.eggy03.papertrail.bot.service.guild;
+package io.github.eggy03.papertrail.bot.handlers.guild;
import lombok.NonNull;
import lombok.experimental.UtilityClass;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/guild/GuildVoiceEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/handlers/guild/GuildVoiceEventHelper.java
similarity index 98%
rename from src/main/java/io/github/eggy03/papertrail/bot/service/guild/GuildVoiceEventHelper.java
rename to src/main/java/io/github/eggy03/papertrail/bot/handlers/guild/GuildVoiceEventHelper.java
index b4f92e0..828b615 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/guild/GuildVoiceEventHelper.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/handlers/guild/GuildVoiceEventHelper.java
@@ -1,4 +1,4 @@
-package io.github.eggy03.papertrail.bot.service.guild;
+package io.github.eggy03.papertrail.bot.handlers.guild;
import lombok.NonNull;
import lombok.experimental.UtilityClass;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/message/MessageLogMessageDeleteEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/handlers/message/MessageLogMessageDeleteEventHelper.java
similarity index 98%
rename from src/main/java/io/github/eggy03/papertrail/bot/service/message/MessageLogMessageDeleteEventHelper.java
rename to src/main/java/io/github/eggy03/papertrail/bot/handlers/message/MessageLogMessageDeleteEventHelper.java
index ade5cfe..e05d28f 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/message/MessageLogMessageDeleteEventHelper.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/handlers/message/MessageLogMessageDeleteEventHelper.java
@@ -1,4 +1,4 @@
-package io.github.eggy03.papertrail.bot.service.message;
+package io.github.eggy03.papertrail.bot.handlers.message;
import com.google.common.base.Splitter;
import io.github.eggy03.papertrail.sdk.client.MessageLogContentClient;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/message/MessageLogMessageReceivedEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/handlers/message/MessageLogMessageReceivedEventHelper.java
similarity index 91%
rename from src/main/java/io/github/eggy03/papertrail/bot/service/message/MessageLogMessageReceivedEventHelper.java
rename to src/main/java/io/github/eggy03/papertrail/bot/handlers/message/MessageLogMessageReceivedEventHelper.java
index 7002a93..1896857 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/message/MessageLogMessageReceivedEventHelper.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/handlers/message/MessageLogMessageReceivedEventHelper.java
@@ -1,4 +1,4 @@
-package io.github.eggy03.papertrail.bot.service.message;
+package io.github.eggy03.papertrail.bot.handlers.message;
import io.github.eggy03.papertrail.sdk.client.MessageLogContentClient;
import lombok.NonNull;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/service/message/MessageLogMessageUpdateEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/handlers/message/MessageLogMessageUpdateEventHelper.java
similarity index 98%
rename from src/main/java/io/github/eggy03/papertrail/bot/service/message/MessageLogMessageUpdateEventHelper.java
rename to src/main/java/io/github/eggy03/papertrail/bot/handlers/message/MessageLogMessageUpdateEventHelper.java
index 4a9e1f1..f11eabb 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/service/message/MessageLogMessageUpdateEventHelper.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/handlers/message/MessageLogMessageUpdateEventHelper.java
@@ -1,4 +1,4 @@
-package io.github.eggy03.papertrail.bot.service.message;
+package io.github.eggy03.papertrail.bot.handlers.message;
import com.google.common.base.Splitter;
import io.github.eggy03.papertrail.sdk.client.MessageLogContentClient;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/guild/GuildBoostEventListener.java b/src/main/java/io/github/eggy03/papertrail/bot/listeners/guild/GuildBoostEventListener.java
index bbcdcd0..9b93958 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/guild/GuildBoostEventListener.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/listeners/guild/GuildBoostEventListener.java
@@ -1,8 +1,8 @@
package io.github.eggy03.papertrail.bot.listeners.guild;
-import io.github.eggy03.papertrail.bot.service.guild.GuildMemberUpdateBoostTimeEventHelper;
-import io.github.eggy03.papertrail.bot.service.guild.GuildUpdateBoostCountEventHelper;
-import io.github.eggy03.papertrail.bot.service.guild.GuildUpdateBoostTierEventHelper;
+import io.github.eggy03.papertrail.bot.handlers.guild.GuildMemberUpdateBoostTimeEventHelper;
+import io.github.eggy03.papertrail.bot.handlers.guild.GuildUpdateBoostCountEventHelper;
+import io.github.eggy03.papertrail.bot.handlers.guild.GuildUpdateBoostTierEventHelper;
import io.github.eggy03.papertrail.sdk.client.AuditLogRegistrationClient;
import io.github.eggy03.papertrail.sdk.entity.AuditLogRegistrationEntity;
import lombok.NonNull;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/guild/GuildMemberJoinAndLeaveEventListener.java b/src/main/java/io/github/eggy03/papertrail/bot/listeners/guild/GuildMemberJoinAndLeaveEventListener.java
index cfa33b9..5ad5ec9 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/guild/GuildMemberJoinAndLeaveEventListener.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/listeners/guild/GuildMemberJoinAndLeaveEventListener.java
@@ -1,7 +1,7 @@
package io.github.eggy03.papertrail.bot.listeners.guild;
-import io.github.eggy03.papertrail.bot.service.guild.GuildMemberJoinEventHelper;
-import io.github.eggy03.papertrail.bot.service.guild.GuildMemberRemoveEventHelper;
+import io.github.eggy03.papertrail.bot.handlers.guild.GuildMemberJoinEventHelper;
+import io.github.eggy03.papertrail.bot.handlers.guild.GuildMemberRemoveEventHelper;
import io.github.eggy03.papertrail.sdk.client.AuditLogRegistrationClient;
import io.github.eggy03.papertrail.sdk.entity.AuditLogRegistrationEntity;
import lombok.NonNull;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/guild/GuildPollEventListener.java b/src/main/java/io/github/eggy03/papertrail/bot/listeners/guild/GuildPollEventListener.java
index 123a4e5..7264e82 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/guild/GuildPollEventListener.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/listeners/guild/GuildPollEventListener.java
@@ -1,6 +1,6 @@
package io.github.eggy03.papertrail.bot.listeners.guild;
-import io.github.eggy03.papertrail.bot.service.guild.GuildPollEventHelper;
+import io.github.eggy03.papertrail.bot.handlers.guild.GuildPollEventHelper;
import io.github.eggy03.papertrail.sdk.client.AuditLogRegistrationClient;
import io.github.eggy03.papertrail.sdk.entity.AuditLogRegistrationEntity;
import lombok.NonNull;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/guild/GuildVoiceEventListener.java b/src/main/java/io/github/eggy03/papertrail/bot/listeners/guild/GuildVoiceEventListener.java
index 4284ef5..1c532d4 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/guild/GuildVoiceEventListener.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/listeners/guild/GuildVoiceEventListener.java
@@ -1,6 +1,6 @@
package io.github.eggy03.papertrail.bot.listeners.guild;
-import io.github.eggy03.papertrail.bot.service.guild.GuildVoiceEventHelper;
+import io.github.eggy03.papertrail.bot.handlers.guild.GuildVoiceEventHelper;
import io.github.eggy03.papertrail.sdk.client.AuditLogRegistrationClient;
import io.github.eggy03.papertrail.sdk.entity.AuditLogRegistrationEntity;
import lombok.NonNull;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/message/MessageLogListener.java b/src/main/java/io/github/eggy03/papertrail/bot/listeners/message/MessageLogListener.java
index 537aa77..55294df 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/message/MessageLogListener.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/listeners/message/MessageLogListener.java
@@ -1,8 +1,8 @@
package io.github.eggy03.papertrail.bot.listeners.message;
-import io.github.eggy03.papertrail.bot.service.message.MessageLogMessageDeleteEventHelper;
-import io.github.eggy03.papertrail.bot.service.message.MessageLogMessageReceivedEventHelper;
-import io.github.eggy03.papertrail.bot.service.message.MessageLogMessageUpdateEventHelper;
+import io.github.eggy03.papertrail.bot.handlers.message.MessageLogMessageDeleteEventHelper;
+import io.github.eggy03.papertrail.bot.handlers.message.MessageLogMessageReceivedEventHelper;
+import io.github.eggy03.papertrail.bot.handlers.message.MessageLogMessageUpdateEventHelper;
import io.github.eggy03.papertrail.sdk.client.MessageLogContentClient;
import io.github.eggy03.papertrail.sdk.client.MessageLogRegistrationClient;
import io.github.eggy03.papertrail.sdk.entity.MessageLogRegistrationEntity;
@@ -17,6 +17,7 @@
import java.util.Optional;
import java.util.concurrent.Executor;
+// todo rename this and its helpers to GuildMessageEventListener* and move it to the guild package
@Slf4j
@RequiredArgsConstructor
public final class MessageLogListener extends ListenerAdapter {
From e46f15571fc20327bb67fffdde659668d5224f66 Mon Sep 17 00:00:00 2001
From: Egg-03 <111327101+eggy03@users.noreply.github.com>
Date: Sun, 31 May 2026 19:59:27 +0530
Subject: [PATCH 42/66] refactor(commands): delegate listener logic to
dedicated handlers
- Extract execution logic from command listeners into new handler classes
- Add `@ApplicationScoped` and `@Inject` annotations for CDI support
Signed-off-by: Egg-03 <111327101+eggy03@users.noreply.github.com>
---
.../command/AuditLogSetupCommandHandler.java | 119 +++++++++++++
.../BotSetupInstructionCommandHandler.java | 70 ++++++++
.../handlers/command/DebugCommandHandler.java | 162 ++++++++++++++++++
.../MessageLogSetupCommandHandler.java | 119 +++++++++++++
.../command/ServerStatCommandHandler.java | 94 ++++++++++
.../command/AuditLogSetupCommandListener.java | 119 ++-----------
.../BotSetupInstructionCommandListener.java | 70 ++------
.../command/DebugCommandListener.java | 157 +----------------
.../MessageLogSetupCommandListener.java | 120 ++-----------
.../command/ServerStatCommandListener.java | 88 +---------
10 files changed, 620 insertions(+), 498 deletions(-)
create mode 100644 src/main/java/io/github/eggy03/papertrail/bot/handlers/command/AuditLogSetupCommandHandler.java
create mode 100644 src/main/java/io/github/eggy03/papertrail/bot/handlers/command/BotSetupInstructionCommandHandler.java
create mode 100644 src/main/java/io/github/eggy03/papertrail/bot/handlers/command/DebugCommandHandler.java
create mode 100644 src/main/java/io/github/eggy03/papertrail/bot/handlers/command/MessageLogSetupCommandHandler.java
create mode 100644 src/main/java/io/github/eggy03/papertrail/bot/handlers/command/ServerStatCommandHandler.java
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/handlers/command/AuditLogSetupCommandHandler.java b/src/main/java/io/github/eggy03/papertrail/bot/handlers/command/AuditLogSetupCommandHandler.java
new file mode 100644
index 0000000..a3ef703
--- /dev/null
+++ b/src/main/java/io/github/eggy03/papertrail/bot/handlers/command/AuditLogSetupCommandHandler.java
@@ -0,0 +1,119 @@
+package io.github.eggy03.papertrail.bot.handlers.command;
+
+import io.github.eggy03.papertrail.sdk.client.AuditLogRegistrationClient;
+import io.github.eggy03.papertrail.sdk.entity.AuditLogRegistrationEntity;
+import jakarta.enterprise.context.ApplicationScoped;
+import jakarta.inject.Inject;
+import lombok.NonNull;
+import lombok.extern.slf4j.Slf4j;
+import net.dv8tion.jda.api.EmbedBuilder;
+import net.dv8tion.jda.api.entities.Guild;
+import net.dv8tion.jda.api.entities.channel.middleman.GuildChannel;
+import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent;
+import net.dv8tion.jda.api.utils.MarkdownUtil;
+
+import java.awt.Color;
+import java.util.Optional;
+
+@ApplicationScoped
+@Slf4j
+public final class AuditLogSetupCommandHandler {
+
+ private final @NonNull AuditLogRegistrationClient client;
+
+ @Inject
+ public AuditLogSetupCommandHandler(@NonNull AuditLogRegistrationClient client) {
+ this.client = client;
+ }
+
+ public void setAuditLogging(@NonNull SlashCommandInteractionEvent event) {
+
+ Guild callerGuild = event.getGuild();
+ GuildChannel callerChannel = event.getChannel().asTextChannel();
+ if (callerGuild == null) {
+ log.warn("An audit log set command may have been called outside of a guild. This should not happen.");
+ return;
+ }
+
+ // acknowledge this interaction before calling the API
+ event.deferReply().queue();
+
+ // Call the API to register the guild and the channel
+ boolean success = client.registerGuild(callerGuild.getId(), callerChannel.getId());
+
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("Audit Log Registration Process");
+
+ if (success) {
+ eb.setColor(Color.GREEN);
+ eb.addField(MarkdownUtil.underline("Registration Success"), MarkdownUtil.codeblock("All audit log info will be logged here"), false);
+ } else {
+ eb.setColor(Color.YELLOW);
+ eb.addField(MarkdownUtil.underline("Registration Failure"), MarkdownUtil.codeblock("Channel could not be registered. Check if a channel in this guild is already registered for logging."), false);
+ }
+
+ event.getHook().editOriginalEmbeds(eb.build()).queue();
+ }
+
+ public void viewAuditLoggingChannel(@NonNull SlashCommandInteractionEvent event) {
+
+ Guild callerGuild = event.getGuild();
+ if (callerGuild == null) {
+ log.warn("An audit log view command may have been called outside of a guild. This should not happen.");
+ return;
+ }
+
+ // acknowledge this interaction before calling the API
+ event.deferReply().queue();
+
+ // Call the API to retrieve the registered channel
+ Optional response = client.getRegisteredGuild(callerGuild.getId());
+
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("View Existing Audit Log Configuration");
+
+ // if there is no channel_id for the given guild_id returned by the API, then inform
+ // the user of the same, else link the channel that has been registered
+ response.ifPresentOrElse(success -> {
+ String registeredChannelId = success.getChannelId();
+ GuildChannel registeredChannel = event.getJDA().getGuildChannelById(registeredChannelId);
+ String registeredChannelName = registeredChannel != null ? registeredChannel.getName() : registeredChannelId;
+
+ eb.setColor(Color.CYAN);
+ eb.addField(MarkdownUtil.underline("Success"), MarkdownUtil.codeblock(registeredChannelName + " is found to be registered as the audit log channel"), false);
+ }, () -> {
+ eb.setColor(Color.YELLOW);
+ eb.addField(MarkdownUtil.underline("Warning"), MarkdownUtil.codeblock("No channel has been registered for audit logs"), false);
+ });
+
+ event.getHook().editOriginalEmbeds(eb.build()).queue();
+ }
+
+ public void unsetAuditLogging(@NonNull SlashCommandInteractionEvent event) {
+
+ Guild callerGuild = event.getGuild();
+ if (callerGuild == null) {
+ log.warn("An audit log unset command may have been called outside of a guild. This should not happen.");
+ return;
+ }
+
+ // acknowledge this interaction before calling the API
+ event.deferReply().queue();
+
+ // Call the API to unregister guild
+ boolean success = client.deleteRegisteredGuild(callerGuild.getId());
+
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("Audit Log Removal Process");
+
+ if (success) {
+ eb.setColor(Color.GREEN);
+ eb.addField(MarkdownUtil.underline("Removal Success"), MarkdownUtil.codeblock("Channel successfully unset"), false);
+ } else {
+ eb.setColor(Color.YELLOW);
+ eb.addField(MarkdownUtil.underline("Removal Failure"), MarkdownUtil.codeblock("Channel could not be unset. This may be because no channel has been registered in this guild yet."), false);
+ }
+
+ event.getHook().editOriginalEmbeds(eb.build()).queue();
+ }
+}
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/handlers/command/BotSetupInstructionCommandHandler.java b/src/main/java/io/github/eggy03/papertrail/bot/handlers/command/BotSetupInstructionCommandHandler.java
new file mode 100644
index 0000000..9e1e2cd
--- /dev/null
+++ b/src/main/java/io/github/eggy03/papertrail/bot/handlers/command/BotSetupInstructionCommandHandler.java
@@ -0,0 +1,70 @@
+package io.github.eggy03.papertrail.bot.handlers.command;
+
+import io.github.eggy03.papertrail.bot.constant.ProjectInfo;
+import jakarta.enterprise.context.ApplicationScoped;
+import lombok.NonNull;
+import net.dv8tion.jda.api.EmbedBuilder;
+import net.dv8tion.jda.api.entities.MessageEmbed;
+import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent;
+
+import java.awt.Color;
+import java.time.Instant;
+
+@ApplicationScoped
+public final class BotSetupInstructionCommandHandler {
+
+ public void sendInstructions(@NonNull SlashCommandInteractionEvent event) {
+
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("🛠️ Setup Guide for " + ProjectInfo.APPNAME);
+ eb.setDescription("Follow the instructions below to set up the bot in your server.");
+ eb.setColor(Color.decode("#38e8bc"));
+
+ eb.addField("1️⃣ Set Audit Log Channel",
+ "Use `/auditlog set` to **register this channel** for receiving audit log events.",
+ false);
+
+ eb.addField("2️⃣ View Audit Log Channel",
+ "Use `/auditlog view` to **see which channel** is currently receiving audit logs.",
+ false);
+
+ eb.addField("3️⃣ Remove Audit Log Channel",
+ "Use `/auditlog remove` to **stop logging** events and remove the registered channel.",
+ false);
+
+ eb.addField("🔒 Permissions",
+ "These three commands require the **Administrator** permission.",
+ false);
+
+ eb.addBlankField(false);
+
+ eb.addField("4️⃣ Set Message Log Channel",
+ "Use `/messagelog set` to **register this channel** for receiving message logs.",
+ false);
+
+ eb.addField("5️⃣ View Message Log Channel",
+ "Use `/messagelog view` to **see which channel** is currently receiving message logs.",
+ false);
+
+ eb.addField("6️⃣ Remove Message Log Channel",
+ "Use `/messagelog remove` to **stop logging** messages and remove the registered channel.",
+ false);
+
+ eb.addField("🔒 Permissions",
+ "These three commands require the **Administrator** permission.",
+ false);
+
+ eb.addBlankField(false);
+
+ eb.addField("7️⃣ View Server Stats",
+ "Use `/stats` to **view useful server information**, including member count, channel count, and more.",
+ false);
+
+ eb.addField("📬 Need help?", "Create an issue on [GitHub](" + ProjectInfo.PROJECT_ISSUE_LINK + ")", false);
+ eb.setFooter(ProjectInfo.APPNAME + " " + ProjectInfo.VERSION);
+ eb.setTimestamp(Instant.now());
+
+ MessageEmbed mb = eb.build();
+ event.replyEmbeds(mb).queue();
+ }
+}
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/handlers/command/DebugCommandHandler.java b/src/main/java/io/github/eggy03/papertrail/bot/handlers/command/DebugCommandHandler.java
new file mode 100644
index 0000000..90f6d44
--- /dev/null
+++ b/src/main/java/io/github/eggy03/papertrail/bot/handlers/command/DebugCommandHandler.java
@@ -0,0 +1,162 @@
+package io.github.eggy03.papertrail.bot.handlers.command;
+
+import io.github.eggy03.papertrail.bot.constant.ProjectInfo;
+import io.github.eggy03.papertrail.bot.utils.BooleanUtils;
+import io.github.eggy03.papertrail.sdk.client.AuditLogRegistrationClient;
+import io.github.eggy03.papertrail.sdk.client.MessageLogRegistrationClient;
+import jakarta.enterprise.context.ApplicationScoped;
+import jakarta.inject.Inject;
+import lombok.NonNull;
+import net.dv8tion.jda.api.EmbedBuilder;
+import net.dv8tion.jda.api.JDA;
+import net.dv8tion.jda.api.Permission;
+import net.dv8tion.jda.api.entities.Guild;
+import net.dv8tion.jda.api.entities.Member;
+import net.dv8tion.jda.api.entities.channel.middleman.GuildChannel;
+import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent;
+import net.dv8tion.jda.api.utils.MarkdownUtil;
+import org.jetbrains.annotations.NotNull;
+
+import java.awt.Color;
+import java.time.Instant;
+import java.util.EnumSet;
+import java.util.Set;
+
+@ApplicationScoped
+public final class DebugCommandHandler {
+
+ private final @NonNull AuditLogRegistrationClient auditLogRegistrationClient;
+ private final @NonNull MessageLogRegistrationClient messageLogRegistrationClient;
+
+ // necessary permissions for the bot to function
+ @NonNull
+ private final Set necessaryPermissions = EnumSet.of(
+ Permission.VIEW_CHANNEL,
+ Permission.VIEW_AUDIT_LOGS,
+ Permission.MANAGE_SERVER,
+ Permission.MESSAGE_SEND,
+ Permission.MESSAGE_SEND_IN_THREADS,
+ Permission.MESSAGE_EMBED_LINKS,
+ Permission.MESSAGE_HISTORY
+ );
+
+ @Inject
+ public DebugCommandHandler(@NonNull AuditLogRegistrationClient auditLogRegistrationClient, @NonNull MessageLogRegistrationClient messageLogRegistrationClient) {
+ this.auditLogRegistrationClient = auditLogRegistrationClient;
+ this.messageLogRegistrationClient = messageLogRegistrationClient;
+ }
+
+ public void sendDebugInfo(@NonNull SlashCommandInteractionEvent event, @NonNull Guild guild, @NonNull Member member) {
+ GuildChannel channel = event.getGuildChannel();
+
+ // acknowledge this interaction but reply when the embed's been built
+ event.deferReply().queue();
+
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("Debug Info");
+ eb.setDescription("Server: " + guild.getName());
+ eb.setColor(Color.GRAY);
+
+ eb.addField(MarkdownUtil.underline("Bot Permissions"), MarkdownUtil.quoteBlock(getBotPermissions(guild)), true);
+ eb.addField(MarkdownUtil.underline("Channel Permissions"), MarkdownUtil.quoteBlock(getBotPermissionsInCurrentChannel(guild, channel)), true);
+ eb.addField(MarkdownUtil.underline("Server Info"), MarkdownUtil.quoteBlock(getServerInfo(guild, channel)), true);
+
+ eb.addField(MarkdownUtil.underline("User Info"), MarkdownUtil.quoteBlock(getCallerInfo(member)), true);
+ eb.addField(MarkdownUtil.underline("Bot Info"), MarkdownUtil.quoteBlock(getBotInfo(event)), true);
+ eb.addField(MarkdownUtil.underline("Configuration Info"), MarkdownUtil.quoteBlock(getConfigurationInfo(guild)), true);
+
+ eb.setFooter(ProjectInfo.APPNAME + " " + ProjectInfo.VERSION);
+ eb.setTimestamp(Instant.now());
+
+ event.getHook().editOriginalEmbeds(eb.build()).queue();
+ }
+
+ @NotNull
+ private String getBotPermissions(@NonNull Guild guild) {
+ return formatPermissions(guild.getSelfMember().getPermissions());
+ }
+
+ @NotNull
+ private String getBotPermissionsInCurrentChannel(@NonNull Guild guild, @NonNull GuildChannel channel) {
+ return formatPermissions(guild.getSelfMember().getPermissions(channel));
+ }
+
+ @NotNull
+ private String formatPermissions(@NonNull EnumSet grantedGuildOrChannelPermissions) {
+ // gets all the permissions granted to the bot in the server as a whole or a particular channel
+ EnumSet grantedPermissions = EnumSet.copyOf(grantedGuildOrChannelPermissions);
+
+ // this will
+ // 1) REMOVE the UNNECESSARY GRANTED PERMISSIONS (permissions which are granted but not required for bot to function)
+ // 2) RETAIN those GRANTED PERMISSIONS that match with the NECESSARY ONES
+ // there may be cases where GRANTED PERMISSIONS is NOT a perfect SUPERSET of NECESSARY PERMISSIONS
+ // this indicates that some NECESSARY PERMISSIONS have been DENIED
+ grantedPermissions.retainAll(necessaryPermissions);
+
+ // create a copy of necessary permissions
+ EnumSet deniedPermissions = EnumSet.copyOf(necessaryPermissions);
+ // now if you calculate necessary - granted, you will get the set of necessary permissions which are DENIED
+ deniedPermissions.removeAll(grantedPermissions);
+
+ StringBuilder permString = new StringBuilder();
+ grantedPermissions.forEach(permission ->
+ permString.append("✅ - ")
+ .append(permission.getName())
+ .append("\n")
+ );
+
+ deniedPermissions.forEach(permission ->
+ permString.append("❌ - ")
+ .append(permission.getName())
+ .append("\n")
+ );
+
+ return permString.toString().trim();
+ }
+
+ @NotNull
+ private String getServerInfo(@NonNull Guild guild, @NonNull GuildChannel channel) {
+ return "Server Name: " + MarkdownUtil.underline(guild.getName()) + "\n" +
+ "Server ID: " + MarkdownUtil.underline(guild.getId()) + "\n" +
+ "Current Channel Name: " + MarkdownUtil.underline(channel.getName()) + "\n" +
+ "Current Channel ID: " + MarkdownUtil.underline(channel.getId());
+ }
+
+ @NotNull
+ private String getCallerInfo(@NonNull Member member) {
+ return "User Name: " + MarkdownUtil.underline(member.getUser().getEffectiveName()) + "\n" +
+ "User ID: " + MarkdownUtil.underline(member.getId()) + "\n" +
+ "Is Administrator: " + MarkdownUtil.underline(BooleanUtils.formatToYesOrNo(member.hasPermission(Permission.ADMINISTRATOR)));
+ }
+
+ @NotNull
+ private String getBotInfo(@NonNull SlashCommandInteractionEvent event) {
+ JDA.ShardInfo shardInfo = event.getJDA().getShardInfo();
+ return "Current Shard ID: " + shardInfo.getShardId() + "\n" +
+ "Total Shards: " + shardInfo.getShardTotal();
+ }
+
+ @NotNull
+ private String getConfigurationInfo(@NonNull Guild guild) {
+
+ StringBuilder sb = new StringBuilder();
+
+ auditLogRegistrationClient.getRegisteredGuild(guild.getId()).ifPresentOrElse(entity -> {
+ GuildChannel channel = guild.getGuildChannelById(entity.getChannelId());
+ if (channel != null)
+ sb.append("Registered Audit Log Channel: ").append(MarkdownUtil.underline(channel.getName())).append("\n");
+ else
+ sb.append("Registered Audit Log Channel: ").append(MarkdownUtil.underline("Registered Channel Unresolvable")).append("\n");
+ }, () -> sb.append(MarkdownUtil.underline("No Channel Registered For Audit Logging")).append("\n"));
+
+ messageLogRegistrationClient.getRegisteredGuild(guild.getId()).ifPresentOrElse(entity -> {
+ GuildChannel channel = guild.getGuildChannelById(entity.getChannelId());
+ if (channel != null)
+ sb.append("Registered Message Log Channel: ").append(MarkdownUtil.underline(channel.getName()));
+ else
+ sb.append("Registered Message Log Channel: ").append(MarkdownUtil.underline("Registered Channel Unresolvable"));
+ }, () -> sb.append(MarkdownUtil.underline("No Channel Registered For Message Logging")));
+
+ return sb.toString();
+ }
+}
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/handlers/command/MessageLogSetupCommandHandler.java b/src/main/java/io/github/eggy03/papertrail/bot/handlers/command/MessageLogSetupCommandHandler.java
new file mode 100644
index 0000000..9272125
--- /dev/null
+++ b/src/main/java/io/github/eggy03/papertrail/bot/handlers/command/MessageLogSetupCommandHandler.java
@@ -0,0 +1,119 @@
+package io.github.eggy03.papertrail.bot.handlers.command;
+
+import io.github.eggy03.papertrail.sdk.client.MessageLogRegistrationClient;
+import io.github.eggy03.papertrail.sdk.entity.MessageLogRegistrationEntity;
+import jakarta.enterprise.context.ApplicationScoped;
+import jakarta.inject.Inject;
+import lombok.NonNull;
+import lombok.extern.slf4j.Slf4j;
+import net.dv8tion.jda.api.EmbedBuilder;
+import net.dv8tion.jda.api.entities.Guild;
+import net.dv8tion.jda.api.entities.channel.middleman.GuildChannel;
+import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent;
+import net.dv8tion.jda.api.utils.MarkdownUtil;
+
+import java.awt.Color;
+import java.util.Optional;
+
+@ApplicationScoped
+@Slf4j
+public final class MessageLogSetupCommandHandler {
+
+ private final @NonNull MessageLogRegistrationClient client;
+
+ @Inject
+ public MessageLogSetupCommandHandler(@NonNull MessageLogRegistrationClient client) {
+ this.client = client;
+ }
+
+ public void setMessageLogging(@NonNull SlashCommandInteractionEvent event) {
+
+ Guild callerGuild = event.getGuild();
+ GuildChannel callerChannel = event.getChannel().asTextChannel();
+ if (callerGuild == null) {
+ log.warn("A message log set command may have been called outside of a guild. This should not happen.");
+ return;
+ }
+
+ // acknowledge this interaction before calling the API
+ event.deferReply().queue();
+
+ // Call the API to register guild for message logging
+ boolean success = client.registerGuild(callerGuild.getId(), callerChannel.getId());
+
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("Message Log Registration Process");
+
+ if (success) {
+ eb.setColor(Color.GREEN);
+ eb.addField(MarkdownUtil.underline("Registration Success"), MarkdownUtil.codeblock("All edited and deleted messages will be logged here"), false);
+ } else {
+ eb.setColor(Color.YELLOW);
+ eb.addField(MarkdownUtil.underline("Registration Failure"), MarkdownUtil.codeblock("Channel could not be registered. Check if a channel in this guild is already registered for logging."), false);
+
+ }
+
+ event.getHook().editOriginalEmbeds(eb.build()).queue();
+ }
+
+ public void viewMessageLoggingChannel(@NonNull SlashCommandInteractionEvent event) {
+
+ Guild callerGuild = event.getGuild();
+ if (callerGuild == null) {
+ log.warn("A message log view command may have been called outside of a guild. This should not happen.");
+ return;
+ }
+
+ // acknowledge this interaction before calling the API
+ event.deferReply().queue();
+
+ // Call the API to check for registered guild
+ Optional response = client.getRegisteredGuild(callerGuild.getId());
+
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("View Existing Message Log Configuration");
+
+ response.ifPresentOrElse(success -> {
+
+ String registeredChannelId = success.getChannelId();
+ GuildChannel registeredChannel = event.getJDA().getGuildChannelById(registeredChannelId);
+ String registeredChannelName = registeredChannel != null ? registeredChannel.getName() : registeredChannelId;
+
+ eb.setColor(Color.CYAN);
+ eb.addField(MarkdownUtil.underline("Success"), MarkdownUtil.codeblock(registeredChannelName + " is found to be registered as the message log channel"), false);
+ }, () -> {
+ eb.setColor(Color.YELLOW);
+ eb.addField(MarkdownUtil.underline("Warning"), MarkdownUtil.codeblock("No channel has been registered for message logs"), false);
+ });
+
+ event.getHook().editOriginalEmbeds(eb.build()).queue();
+ }
+
+ public void unsetMessageLogging(@NonNull SlashCommandInteractionEvent event) {
+
+ Guild callerGuild = event.getGuild();
+ if (callerGuild == null) {
+ log.warn("A message log unset command may have been called outside of a guild. This should not happen.");
+ return;
+ }
+
+ // acknowledge this interaction before calling the API
+ event.deferReply().queue();
+
+ // Call the API to unregister guild
+ boolean success = client.deleteRegisteredGuild(callerGuild.getId());
+
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("Message Log Removal Process");
+
+ if (success) {
+ eb.setColor(Color.GREEN);
+ eb.addField(MarkdownUtil.underline("Removal Success"), MarkdownUtil.codeblock("Channel successfully unset"), false);
+ } else {
+ eb.setColor(Color.YELLOW);
+ eb.addField(MarkdownUtil.underline("Removal Failure"), MarkdownUtil.codeblock("Channel could not be unset. This may be because no channel has been registered in this guild yet."), false);
+ }
+
+ event.getHook().editOriginalEmbeds(eb.build()).queue();
+ }
+}
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/handlers/command/ServerStatCommandHandler.java b/src/main/java/io/github/eggy03/papertrail/bot/handlers/command/ServerStatCommandHandler.java
new file mode 100644
index 0000000..ed1a698
--- /dev/null
+++ b/src/main/java/io/github/eggy03/papertrail/bot/handlers/command/ServerStatCommandHandler.java
@@ -0,0 +1,94 @@
+package io.github.eggy03.papertrail.bot.handlers.command;
+
+import jakarta.enterprise.context.ApplicationScoped;
+import lombok.NonNull;
+import net.dv8tion.jda.api.EmbedBuilder;
+import net.dv8tion.jda.api.entities.Guild;
+import net.dv8tion.jda.api.entities.Member;
+import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent;
+import net.dv8tion.jda.api.utils.MarkdownUtil;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import java.awt.Color;
+import java.time.Instant;
+import java.util.List;
+
+@ApplicationScoped
+public final class ServerStatCommandHandler {
+
+ public void sendServerStats(@NonNull SlashCommandInteractionEvent event, @NonNull Guild guild) {
+ // acknowledge this interaction but reply when the embed's been built
+ event.deferReply().queue();
+
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("Server Statistics");
+ eb.setDescription("Statistics For: " + guild.getName());
+ eb.setThumbnail(guild.getIconUrl());
+ eb.setColor(Color.PINK);
+
+ eb.addField(MarkdownUtil.underline("Guild Owner"), MarkdownUtil.quoteBlock(getGuildOwner(guild)), false);
+ eb.addField(MarkdownUtil.underline("Guild Created On"), MarkdownUtil.quoteBlock(getGuildCreationDate(guild)), false);
+ eb.addField(MarkdownUtil.underline("Guild Vanity URL"), MarkdownUtil.quoteBlock(getGuildVanityUrl(guild)), false);
+ eb.addField(MarkdownUtil.underline("Member Stats"), MarkdownUtil.quoteBlock(getMemberAndBotCount(guild)), false);
+ eb.addField(MarkdownUtil.underline("Guild Boosters"), MarkdownUtil.quoteBlock(getBoosters(guild)), false);
+ eb.addField(MarkdownUtil.underline("Guild Boost Count"), MarkdownUtil.quoteBlock(String.valueOf(guild.getBoostCount())), true);
+ eb.addField(MarkdownUtil.underline("Booster Role"), MarkdownUtil.quoteBlock(getBoosterRole(guild)), true);
+ eb.addField(MarkdownUtil.underline("Boost Tier"), MarkdownUtil.quoteBlock(guild.getBoostTier().name()), true);
+ eb.addField(MarkdownUtil.underline("Locale"), MarkdownUtil.quoteBlock(guild.getLocale().getNativeName()), true);
+ eb.addField(MarkdownUtil.underline("Verification"), MarkdownUtil.quoteBlock(guild.getVerificationLevel().name()), true);
+ eb.addField(MarkdownUtil.underline("Roles"), MarkdownUtil.quoteBlock(String.valueOf(guild.getRoles().size())), true);
+ eb.addField(MarkdownUtil.underline("Categories"), MarkdownUtil.quoteBlock(String.valueOf(guild.getCategories().size())), true);
+ eb.addField(MarkdownUtil.underline("Text Channels"), MarkdownUtil.quoteBlock(String.valueOf(guild.getTextChannels().size())), true);
+ eb.addField(MarkdownUtil.underline("Voice Channels"), MarkdownUtil.quoteBlock(String.valueOf(guild.getVoiceChannels().size())), true);
+
+ eb.setFooter("Requested By: " + getDataRequestingMember(event.getMember()));
+ eb.setTimestamp(Instant.now());
+
+ event.getHook().editOriginalEmbeds(eb.build()).queue();
+ }
+
+ @NotNull
+ private String getMemberAndBotCount(@NonNull Guild guild) {
+
+ List memberCache = guild.getMemberCache().asList();
+ int allUserCount = memberCache.size();
+ int botCount = memberCache.stream().filter(member -> member.getUser().isBot()).toList().size();
+
+ return "Users: " + (allUserCount - botCount) + "\nBots: " + botCount + "\nTotal: " + allUserCount;
+ }
+
+ @NotNull
+ private String getGuildOwner(@NonNull Guild guild) {
+ Member owner = guild.getOwner();
+
+ return owner == null ? "N/A" : owner.getAsMention();
+ }
+
+ @NotNull
+ private String getGuildCreationDate(@NonNull Guild guild) {
+ return "";
+ }
+
+ @NotNull
+ private String getGuildVanityUrl(@NonNull Guild guild) {
+ return guild.getVanityUrl() == null ? "N/A" : guild.getVanityUrl();
+ }
+
+ @NotNull
+ private String getBoosters(@NonNull Guild guild) {
+ StringBuilder boosterString = new StringBuilder();
+ guild.getBoosters().forEach(booster -> boosterString.append(booster.getAsMention()).append(" "));
+ return boosterString.toString().trim().isEmpty() ? "No Boosters" : boosterString.toString().trim();
+ }
+
+ @NotNull
+ private String getBoosterRole(@NonNull Guild guild) {
+ return guild.getBoostRole() != null ? guild.getBoostRole().getAsMention() : "No Boost Role Found";
+ }
+
+ @NotNull
+ private String getDataRequestingMember(@Nullable Member requestingMember) {
+ return requestingMember != null ? requestingMember.getEffectiveName() : "N/A";
+ }
+}
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/command/AuditLogSetupCommandListener.java b/src/main/java/io/github/eggy03/papertrail/bot/listeners/command/AuditLogSetupCommandListener.java
index 5664749..856b932 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/command/AuditLogSetupCommandListener.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/listeners/command/AuditLogSetupCommandListener.java
@@ -1,26 +1,23 @@
package io.github.eggy03.papertrail.bot.listeners.command;
-import io.github.eggy03.papertrail.sdk.client.AuditLogRegistrationClient;
-import io.github.eggy03.papertrail.sdk.entity.AuditLogRegistrationEntity;
+import io.github.eggy03.papertrail.bot.handlers.command.AuditLogSetupCommandHandler;
+import jakarta.enterprise.context.ApplicationScoped;
+import jakarta.inject.Inject;
import lombok.NonNull;
-import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
-import net.dv8tion.jda.api.EmbedBuilder;
-import net.dv8tion.jda.api.entities.Guild;
-import net.dv8tion.jda.api.entities.channel.middleman.GuildChannel;
import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent;
import net.dv8tion.jda.api.hooks.ListenerAdapter;
-import net.dv8tion.jda.api.utils.MarkdownUtil;
-
-import java.awt.Color;
-import java.util.Optional;
+@ApplicationScoped
@Slf4j
-@RequiredArgsConstructor
public final class AuditLogSetupCommandListener extends ListenerAdapter {
- @NonNull
- private final AuditLogRegistrationClient client;
+ private final @NonNull AuditLogSetupCommandHandler handler;
+
+ @Inject
+ public AuditLogSetupCommandListener(@NonNull AuditLogSetupCommandHandler handler) {
+ this.handler = handler;
+ }
@Override
public void onSlashCommandInteraction(@NonNull SlashCommandInteractionEvent event) {
@@ -30,103 +27,13 @@ public void onSlashCommandInteraction(@NonNull SlashCommandInteractionEvent even
}
switch (event.getSubcommandName()) {
- case "set" -> setAuditLogging(event);
- case "view" -> retrieveAuditLoggingChannel(event);
- case "remove" -> unsetAuditLogging(event);
+ case "set" -> handler.setAuditLogging(event);
+ case "view" -> handler.viewAuditLoggingChannel(event);
+ case "remove" -> handler.unsetAuditLogging(event);
default -> {
// do nothing
}
}
}
- private void setAuditLogging(@NonNull SlashCommandInteractionEvent event) {
-
- Guild callerGuild = event.getGuild();
- GuildChannel callerChannel = event.getChannel().asTextChannel();
- if (callerGuild == null) {
- log.warn("An audit log set command may have been called outside of a guild. This should not happen.");
- return;
- }
-
- // acknowledge this interaction before calling the API
- event.deferReply().queue();
-
- // Call the API to register the guild and the channel
- boolean success = client.registerGuild(callerGuild.getId(), callerChannel.getId());
-
- EmbedBuilder eb = new EmbedBuilder();
- eb.setTitle("Audit Log Registration Process");
-
- if (success) {
- eb.setColor(Color.GREEN);
- eb.addField(MarkdownUtil.underline("Registration Success"), MarkdownUtil.codeblock("All audit log info will be logged here"), false);
- } else {
- eb.setColor(Color.YELLOW);
- eb.addField(MarkdownUtil.underline("Registration Failure"), MarkdownUtil.codeblock("Channel could not be registered. Check if a channel in this guild is already registered for logging."), false);
- }
-
- event.getHook().editOriginalEmbeds(eb.build()).queue();
- }
-
- private void retrieveAuditLoggingChannel(@NonNull SlashCommandInteractionEvent event) {
-
- Guild callerGuild = event.getGuild();
- if (callerGuild == null) {
- log.warn("An audit log view command may have been called outside of a guild. This should not happen.");
- return;
- }
-
- // acknowledge this interaction before calling the API
- event.deferReply().queue();
-
- // Call the API to retrieve the registered channel
- Optional response = client.getRegisteredGuild(callerGuild.getId());
-
- EmbedBuilder eb = new EmbedBuilder();
- eb.setTitle("View Existing Audit Log Configuration");
-
- // if there is no channel_id for the given guild_id returned by the API, then inform
- // the user of the same, else link the channel that has been registered
- response.ifPresentOrElse(success -> {
- String registeredChannelId = success.getChannelId();
- GuildChannel registeredChannel = event.getJDA().getGuildChannelById(registeredChannelId);
- String registeredChannelName = registeredChannel != null ? registeredChannel.getName() : registeredChannelId;
-
- eb.setColor(Color.CYAN);
- eb.addField(MarkdownUtil.underline("Success"), MarkdownUtil.codeblock(registeredChannelName + " is found to be registered as the audit log channel"), false);
- }, () -> {
- eb.setColor(Color.YELLOW);
- eb.addField(MarkdownUtil.underline("Warning"), MarkdownUtil.codeblock("No channel has been registered for audit logs"), false);
- });
-
- event.getHook().editOriginalEmbeds(eb.build()).queue();
- }
-
- private void unsetAuditLogging(@NonNull SlashCommandInteractionEvent event) {
-
- Guild callerGuild = event.getGuild();
- if (callerGuild == null) {
- log.warn("An audit log unset command may have been called outside of a guild. This should not happen.");
- return;
- }
-
- // acknowledge this interaction before calling the API
- event.deferReply().queue();
-
- // Call the API to unregister guild
- boolean success = client.deleteRegisteredGuild(callerGuild.getId());
-
- EmbedBuilder eb = new EmbedBuilder();
- eb.setTitle("Audit Log Removal Process");
-
- if (success) {
- eb.setColor(Color.GREEN);
- eb.addField(MarkdownUtil.underline("Removal Success"), MarkdownUtil.codeblock("Channel successfully unset"), false);
- } else {
- eb.setColor(Color.YELLOW);
- eb.addField(MarkdownUtil.underline("Removal Failure"), MarkdownUtil.codeblock("Channel could not be unset. This may be because no channel has been registered in this guild yet."), false);
- }
-
- event.getHook().editOriginalEmbeds(eb.build()).queue();
- }
}
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/command/BotSetupInstructionCommandListener.java b/src/main/java/io/github/eggy03/papertrail/bot/listeners/command/BotSetupInstructionCommandListener.java
index 48e746a..844649f 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/command/BotSetupInstructionCommandListener.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/listeners/command/BotSetupInstructionCommandListener.java
@@ -1,73 +1,27 @@
package io.github.eggy03.papertrail.bot.listeners.command;
-import io.github.eggy03.papertrail.bot.constant.ProjectInfo;
+import io.github.eggy03.papertrail.bot.handlers.command.BotSetupInstructionCommandHandler;
+import jakarta.enterprise.context.ApplicationScoped;
+import jakarta.inject.Inject;
import lombok.NonNull;
-import net.dv8tion.jda.api.EmbedBuilder;
-import net.dv8tion.jda.api.entities.MessageEmbed;
import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent;
import net.dv8tion.jda.api.hooks.ListenerAdapter;
-import java.awt.Color;
-import java.time.Instant;
-
+@ApplicationScoped
public final class BotSetupInstructionCommandListener extends ListenerAdapter {
+ private final @NonNull BotSetupInstructionCommandHandler handler;
+
+ @Inject
+ public BotSetupInstructionCommandListener(@NonNull BotSetupInstructionCommandHandler handler) {
+ this.handler = handler;
+ }
+
@Override
public void onSlashCommandInteraction(@NonNull SlashCommandInteractionEvent event) {
if (event.getName().equals("setup")) {
-
- EmbedBuilder eb = new EmbedBuilder();
- eb.setTitle("🛠️ Setup Guide for " + ProjectInfo.APPNAME);
- eb.setDescription("Follow the instructions below to set up the bot in your server.");
- eb.setColor(Color.decode("#38e8bc"));
-
- eb.addField("1️⃣ Set Audit Log Channel",
- "Use `/auditlog set` to **register this channel** for receiving audit log events.",
- false);
-
- eb.addField("2️⃣ View Audit Log Channel",
- "Use `/auditlog view` to **see which channel** is currently receiving audit logs.",
- false);
-
- eb.addField("3️⃣ Remove Audit Log Channel",
- "Use `/auditlog remove` to **stop logging** events and remove the registered channel.",
- false);
-
- eb.addField("🔒 Permissions",
- "These three commands require the **Administrator** permission.",
- false);
-
- eb.addBlankField(false);
-
- eb.addField("4️⃣ Set Message Log Channel",
- "Use `/messagelog set` to **register this channel** for receiving message logs.",
- false);
-
- eb.addField("5️⃣ View Message Log Channel",
- "Use `/messagelog view` to **see which channel** is currently receiving message logs.",
- false);
-
- eb.addField("6️⃣ Remove Message Log Channel",
- "Use `/messagelog remove` to **stop logging** messages and remove the registered channel.",
- false);
-
- eb.addField("🔒 Permissions",
- "These three commands require the **Administrator** permission.",
- false);
-
- eb.addBlankField(false);
-
- eb.addField("7️⃣ View Server Stats",
- "Use `/stats` to **view useful server information**, including member count, channel count, and more.",
- false);
-
- eb.addField("📬 Need help?", "Create an issue on [GitHub](" + ProjectInfo.PROJECT_ISSUE_LINK + ")", false);
- eb.setFooter(ProjectInfo.APPNAME + " " + ProjectInfo.VERSION);
- eb.setTimestamp(Instant.now());
-
- MessageEmbed mb = eb.build();
- event.replyEmbeds(mb).queue();
+ handler.sendInstructions(event);
}
}
}
\ No newline at end of file
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/command/DebugCommandListener.java b/src/main/java/io/github/eggy03/papertrail/bot/listeners/command/DebugCommandListener.java
index 22dfa78..13f9d70 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/command/DebugCommandListener.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/listeners/command/DebugCommandListener.java
@@ -1,141 +1,24 @@
package io.github.eggy03.papertrail.bot.listeners.command;
-import io.github.eggy03.papertrail.bot.constant.ProjectInfo;
-import io.github.eggy03.papertrail.bot.utils.BooleanUtils;
-import io.github.eggy03.papertrail.sdk.client.AuditLogRegistrationClient;
-import io.github.eggy03.papertrail.sdk.client.MessageLogRegistrationClient;
+import io.github.eggy03.papertrail.bot.handlers.command.DebugCommandHandler;
+import jakarta.enterprise.context.ApplicationScoped;
+import jakarta.inject.Inject;
import lombok.NonNull;
-import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
-import net.dv8tion.jda.api.EmbedBuilder;
-import net.dv8tion.jda.api.JDA;
-import net.dv8tion.jda.api.Permission;
import net.dv8tion.jda.api.entities.Guild;
import net.dv8tion.jda.api.entities.Member;
-import net.dv8tion.jda.api.entities.channel.middleman.GuildChannel;
import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent;
import net.dv8tion.jda.api.hooks.ListenerAdapter;
-import net.dv8tion.jda.api.utils.MarkdownUtil;
-import org.jetbrains.annotations.NotNull;
-
-import java.awt.Color;
-import java.time.Instant;
-import java.util.EnumSet;
-import java.util.Set;
-import java.util.concurrent.ExecutorService;
-
@Slf4j
-@RequiredArgsConstructor
+@ApplicationScoped
public final class DebugCommandListener extends ListenerAdapter {
- @NonNull
- private final ExecutorService vThreadPool;
-
- @NonNull
- private final AuditLogRegistrationClient alClient;
-
- @NonNull
- private final MessageLogRegistrationClient mlClient;
-
- // recommended permissions for the bot to function
- @NonNull
- private final Set recommendedPermissions = EnumSet.of(
- Permission.VIEW_CHANNEL,
- Permission.VIEW_AUDIT_LOGS,
- Permission.MANAGE_SERVER,
- Permission.MESSAGE_SEND,
- Permission.MESSAGE_SEND_IN_THREADS,
- Permission.MESSAGE_EMBED_LINKS,
- Permission.MESSAGE_HISTORY
- );
-
- @NotNull
- private String getBotPermissions(@NonNull Guild guild) {
- return formatPermissions(guild.getSelfMember().getPermissions());
- }
-
- @NotNull
- private String getBotPermissionsInCurrentChannel(@NonNull Guild guild, @NonNull GuildChannel channel) {
- return formatPermissions(guild.getSelfMember().getPermissions(channel));
- }
-
- @NotNull
- private String formatPermissions(@NonNull EnumSet grantedGuildOrChannelPermissions) {
- // gets all the permissions granted to the bot in the server as a whole or a particular channel
- EnumSet grantedPermissions = EnumSet.copyOf(grantedGuildOrChannelPermissions);
- // this will
- // 1) REMOVE the UNNECESSARY GRANTED PERMISSIONS
- // 2) RETAIN those GRANTED PERMISSIONS that match with the RECOMMENDED ONES
- // there may be cases where granted permissions is NOT a perfect superset of recommended permissions
- // this indicates that some recommended permissions have been DENIED
- grantedPermissions.retainAll(recommendedPermissions);
-
- // create a copy of recommended permissions
- EnumSet deniedPermissions = EnumSet.copyOf(recommendedPermissions);
- // now if you calculate recommended - granted, you will get the set of recommended permissions which are DENIED
- deniedPermissions.removeAll(grantedPermissions);
-
- StringBuilder permString = new StringBuilder();
- grantedPermissions.forEach(permission ->
- permString.append("✅ - ")
- .append(permission.getName())
- .append("\n")
- );
-
- deniedPermissions.forEach(permission ->
- permString.append("❌ - ")
- .append(permission.getName())
- .append("\n")
- );
-
- return permString.toString().trim();
- }
+ private final @NonNull DebugCommandHandler handler;
- @NotNull
- private String getServerInfo(@NonNull Guild guild, @NonNull GuildChannel channel) {
- return "Server Name: " + MarkdownUtil.underline(guild.getName()) + "\n" +
- "Server ID: " + MarkdownUtil.underline(guild.getId()) + "\n" +
- "Current Channel Name: " + MarkdownUtil.underline(channel.getName()) + "\n" +
- "Current Channel ID: " + MarkdownUtil.underline(channel.getId());
- }
-
- @NotNull
- private String getCallerInfo(@NonNull Member member) {
- return "User Name: " + MarkdownUtil.underline(member.getUser().getEffectiveName()) + "\n" +
- "User ID: " + MarkdownUtil.underline(member.getId()) + "\n" +
- "Is Administrator: " + MarkdownUtil.underline(BooleanUtils.formatToYesOrNo(member.hasPermission(Permission.ADMINISTRATOR)));
- }
-
- @NotNull
- private String getBotInfo(@NonNull SlashCommandInteractionEvent event) {
- JDA.ShardInfo shardInfo = event.getJDA().getShardInfo();
- return "Current Shard ID: " + shardInfo.getShardId() + "\n" +
- "Total Shards: " + shardInfo.getShardTotal();
- }
-
- @NotNull
- private String getConfigurationInfo(@NonNull Guild guild) {
-
- StringBuilder sb = new StringBuilder();
-
- alClient.getRegisteredGuild(guild.getId()).ifPresentOrElse(entity -> {
- GuildChannel channel = guild.getGuildChannelById(entity.getChannelId());
- if (channel != null)
- sb.append("Registered Audit Log Channel: ").append(MarkdownUtil.underline(channel.getName())).append("\n");
- else
- sb.append("Registered Audit Log Channel: ").append(MarkdownUtil.underline("Registered Channel Unresolvable")).append("\n");
- }, () -> sb.append(MarkdownUtil.underline("No Channel Registered For Audit Logging")).append("\n"));
-
- mlClient.getRegisteredGuild(guild.getId()).ifPresentOrElse(entity -> {
- GuildChannel channel = guild.getGuildChannelById(entity.getChannelId());
- if (channel != null)
- sb.append("Registered Message Log Channel: ").append(MarkdownUtil.underline(channel.getName()));
- else
- sb.append("Registered Message Log Channel: ").append(MarkdownUtil.underline("Registered Channel Unresolvable"));
- }, () -> sb.append(MarkdownUtil.underline("No Channel Registered For Message Logging")));
-
- return sb.toString();
+ @Inject
+ public DebugCommandListener(@NonNull DebugCommandHandler handler) {
+ this.handler = handler;
}
@Override
@@ -151,29 +34,7 @@ public void onSlashCommandInteraction(@NonNull SlashCommandInteractionEvent even
return;
}
- GuildChannel channel = event.getGuildChannel();
-
- // acknowledge this interaction but reply when the embed's been built
- event.deferReply().queue();
-
- vThreadPool.execute(() -> {
- EmbedBuilder eb = new EmbedBuilder();
- eb.setTitle("Debug Info");
- eb.setDescription("Server: " + guild.getName());
- eb.setColor(Color.GRAY);
-
- eb.addField(MarkdownUtil.underline("Bot Permissions"), MarkdownUtil.quoteBlock(getBotPermissions(guild)), true);
- eb.addField(MarkdownUtil.underline("Channel Permissions"), MarkdownUtil.quoteBlock(getBotPermissionsInCurrentChannel(guild, channel)), true);
- eb.addField(MarkdownUtil.underline("Server Info"), MarkdownUtil.quoteBlock(getServerInfo(guild, channel)), true);
-
- eb.addField(MarkdownUtil.underline("User Info"), MarkdownUtil.quoteBlock(getCallerInfo(member)), true);
- eb.addField(MarkdownUtil.underline("Bot Info"), MarkdownUtil.quoteBlock(getBotInfo(event)), true);
- eb.addField(MarkdownUtil.underline("Configuration Info"), MarkdownUtil.quoteBlock(getConfigurationInfo(guild)), true);
-
- eb.setFooter(ProjectInfo.APPNAME + " " + ProjectInfo.VERSION);
- eb.setTimestamp(Instant.now());
+ handler.sendDebugInfo(event, guild, member);
- event.getHook().editOriginalEmbeds(eb.build()).queue();
- });
}
}
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/command/MessageLogSetupCommandListener.java b/src/main/java/io/github/eggy03/papertrail/bot/listeners/command/MessageLogSetupCommandListener.java
index 41f18db..6db23a4 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/command/MessageLogSetupCommandListener.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/listeners/command/MessageLogSetupCommandListener.java
@@ -1,26 +1,23 @@
package io.github.eggy03.papertrail.bot.listeners.command;
-import io.github.eggy03.papertrail.sdk.client.MessageLogRegistrationClient;
-import io.github.eggy03.papertrail.sdk.entity.MessageLogRegistrationEntity;
+import io.github.eggy03.papertrail.bot.handlers.command.MessageLogSetupCommandHandler;
+import jakarta.enterprise.context.ApplicationScoped;
+import jakarta.inject.Inject;
import lombok.NonNull;
-import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
-import net.dv8tion.jda.api.EmbedBuilder;
-import net.dv8tion.jda.api.entities.Guild;
-import net.dv8tion.jda.api.entities.channel.middleman.GuildChannel;
import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent;
import net.dv8tion.jda.api.hooks.ListenerAdapter;
-import net.dv8tion.jda.api.utils.MarkdownUtil;
-
-import java.awt.Color;
-import java.util.Optional;
@Slf4j
-@RequiredArgsConstructor
+@ApplicationScoped
public final class MessageLogSetupCommandListener extends ListenerAdapter {
- @NonNull
- private final MessageLogRegistrationClient client;
+ private final @NonNull MessageLogSetupCommandHandler handler;
+
+ @Inject
+ public MessageLogSetupCommandListener(@NonNull MessageLogSetupCommandHandler handler) {
+ this.handler = handler;
+ }
@Override
public void onSlashCommandInteraction(@NonNull SlashCommandInteractionEvent event) {
@@ -30,103 +27,12 @@ public void onSlashCommandInteraction(@NonNull SlashCommandInteractionEvent even
}
switch (event.getSubcommandName()) {
- case "set" -> setMessageLogging(event);
- case "view" -> retrieveMessageLoggingChannel(event);
- case "remove" -> unsetMessageLogging(event);
+ case "set" -> handler.setMessageLogging(event);
+ case "view" -> handler.viewMessageLoggingChannel(event);
+ case "remove" -> handler.unsetMessageLogging(event);
default -> {
// skip
}
}
}
-
- private void setMessageLogging(@NonNull SlashCommandInteractionEvent event) {
-
- Guild callerGuild = event.getGuild();
- GuildChannel callerChannel = event.getChannel().asTextChannel();
- if (callerGuild == null) {
- log.warn("A message log set command may have been called outside of a guild. This should not happen.");
- return;
- }
-
- // acknowledge this interaction before calling the API
- event.deferReply().queue();
-
- // Call the API to register guild for message logging
- boolean success = client.registerGuild(callerGuild.getId(), callerChannel.getId());
-
- EmbedBuilder eb = new EmbedBuilder();
- eb.setTitle("Message Log Registration Process");
-
- if (success) {
- eb.setColor(Color.GREEN);
- eb.addField(MarkdownUtil.underline("Registration Success"), MarkdownUtil.codeblock("All edited and deleted messages will be logged here"), false);
- } else {
- eb.setColor(Color.YELLOW);
- eb.addField(MarkdownUtil.underline("Registration Failure"), MarkdownUtil.codeblock("Channel could not be registered. Check if a channel in this guild is already registered for logging."), false);
-
- }
-
- event.getHook().editOriginalEmbeds(eb.build()).queue();
- }
-
- private void retrieveMessageLoggingChannel(@NonNull SlashCommandInteractionEvent event) {
-
- Guild callerGuild = event.getGuild();
- if (callerGuild == null) {
- log.warn("A message log view command may have been called outside of a guild. This should not happen.");
- return;
- }
-
- // acknowledge this interaction before calling the API
- event.deferReply().queue();
-
- // Call the API to check for registered guild
- Optional response = client.getRegisteredGuild(callerGuild.getId());
-
- EmbedBuilder eb = new EmbedBuilder();
- eb.setTitle("View Existing Message Log Configuration");
-
- response.ifPresentOrElse(success -> {
-
- String registeredChannelId = success.getChannelId();
- GuildChannel registeredChannel = event.getJDA().getGuildChannelById(registeredChannelId);
- String registeredChannelName = registeredChannel != null ? registeredChannel.getName() : registeredChannelId;
-
- eb.setColor(Color.CYAN);
- eb.addField(MarkdownUtil.underline("Success"), MarkdownUtil.codeblock(registeredChannelName + " is found to be registered as the message log channel"), false);
- }, () -> {
- eb.setColor(Color.YELLOW);
- eb.addField(MarkdownUtil.underline("Warning"), MarkdownUtil.codeblock("No channel has been registered for message logs"), false);
- });
-
- event.getHook().editOriginalEmbeds(eb.build()).queue();
- }
-
- private void unsetMessageLogging(@NonNull SlashCommandInteractionEvent event) {
-
- Guild callerGuild = event.getGuild();
- if (callerGuild == null) {
- log.warn("A message log unset command may have been called outside of a guild. This should not happen.");
- return;
- }
-
- // acknowledge this interaction before calling the API
- event.deferReply().queue();
-
- // Call the API to unregister guild
- boolean success = client.deleteRegisteredGuild(callerGuild.getId());
-
- EmbedBuilder eb = new EmbedBuilder();
- eb.setTitle("Message Log Removal Process");
-
- if (success) {
- eb.setColor(Color.GREEN);
- eb.addField(MarkdownUtil.underline("Removal Success"), MarkdownUtil.codeblock("Channel successfully unset"), false);
- } else {
- eb.setColor(Color.YELLOW);
- eb.addField(MarkdownUtil.underline("Removal Failure"), MarkdownUtil.codeblock("Channel could not be unset. This may be because no channel has been registered in this guild yet."), false);
- }
-
- event.getHook().editOriginalEmbeds(eb.build()).queue();
- }
}
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/command/ServerStatCommandListener.java b/src/main/java/io/github/eggy03/papertrail/bot/listeners/command/ServerStatCommandListener.java
index 43e5262..72b4975 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/command/ServerStatCommandListener.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/listeners/command/ServerStatCommandListener.java
@@ -1,65 +1,23 @@
package io.github.eggy03.papertrail.bot.listeners.command;
+import io.github.eggy03.papertrail.bot.handlers.command.ServerStatCommandHandler;
+import jakarta.enterprise.context.ApplicationScoped;
+import jakarta.inject.Inject;
import lombok.NonNull;
import lombok.extern.slf4j.Slf4j;
-import net.dv8tion.jda.api.EmbedBuilder;
import net.dv8tion.jda.api.entities.Guild;
-import net.dv8tion.jda.api.entities.Member;
import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent;
import net.dv8tion.jda.api.hooks.ListenerAdapter;
-import net.dv8tion.jda.api.utils.MarkdownUtil;
-import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
-
-import java.awt.Color;
-import java.time.Instant;
-import java.util.List;
+@ApplicationScoped
@Slf4j
public final class ServerStatCommandListener extends ListenerAdapter {
- @NotNull
- private String getMemberAndBotCount(@NonNull Guild guild) {
-
- List memberCache = guild.getMemberCache().asList();
- int allUserCount = memberCache.size();
- int botCount = memberCache.stream().filter(member -> member.getUser().isBot()).toList().size();
-
- return "Users: " + (allUserCount - botCount) + "\nBots: " + botCount + "\nTotal: " + allUserCount;
- }
-
- @NotNull
- private String getGuildOwner(@NonNull Guild guild) {
- Member owner = guild.getOwner();
-
- return owner == null ? "N/A" : owner.getAsMention();
- }
-
- @NotNull
- private String getGuildCreationDate(@NonNull Guild guild) {
- return "";
- }
-
- @NotNull
- private String getGuildVanityUrl(@NonNull Guild guild) {
- return guild.getVanityUrl() == null ? "N/A" : guild.getVanityUrl();
- }
-
- @NotNull
- private String getBoosters(@NonNull Guild guild) {
- StringBuilder boosterString = new StringBuilder();
- guild.getBoosters().forEach(booster -> boosterString.append(booster.getAsMention()).append(" "));
- return boosterString.toString().trim().isEmpty() ? "No Boosters" : boosterString.toString().trim();
- }
-
- @NotNull
- private String getBoosterRole(@NonNull Guild guild) {
- return guild.getBoostRole() != null ? guild.getBoostRole().getAsMention() : "No Boost Role Found";
- }
+ private final @NonNull ServerStatCommandHandler handler;
- @NotNull
- private String getDataRequestingMember(@Nullable Member requestingMember) {
- return requestingMember != null ? requestingMember.getEffectiveName() : "N/A";
+ @Inject
+ public ServerStatCommandListener(@NonNull ServerStatCommandHandler handler) {
+ this.handler = handler;
}
@Override
@@ -75,34 +33,6 @@ public void onSlashCommandInteraction(@NonNull SlashCommandInteractionEvent even
return;
}
- // acknowledge this interaction but reply when the embed's been built
- event.deferReply().queue();
-
- EmbedBuilder eb = new EmbedBuilder();
- eb.setTitle("Server Statistics");
- eb.setDescription("Statistics For: " + guild.getName());
- eb.setThumbnail(guild.getIconUrl());
- eb.setColor(Color.PINK);
-
- eb.addField(MarkdownUtil.underline("Guild Owner"), MarkdownUtil.quoteBlock(getGuildOwner(guild)), false);
- eb.addField(MarkdownUtil.underline("Guild Created On"), MarkdownUtil.quoteBlock(getGuildCreationDate(guild)), false);
- eb.addField(MarkdownUtil.underline("Guild Vanity URL"), MarkdownUtil.quoteBlock(getGuildVanityUrl(guild)), false);
- eb.addField(MarkdownUtil.underline("Member Stats"), MarkdownUtil.quoteBlock(getMemberAndBotCount(guild)), false);
- eb.addField(MarkdownUtil.underline("Guild Boosters"), MarkdownUtil.quoteBlock(getBoosters(guild)), false);
- eb.addField(MarkdownUtil.underline("Guild Boost Count"), MarkdownUtil.quoteBlock(String.valueOf(guild.getBoostCount())), true);
- eb.addField(MarkdownUtil.underline("Booster Role"), MarkdownUtil.quoteBlock(getBoosterRole(guild)), true);
- eb.addField(MarkdownUtil.underline("Boost Tier"), MarkdownUtil.quoteBlock(guild.getBoostTier().name()), true);
- eb.addField(MarkdownUtil.underline("Locale"), MarkdownUtil.quoteBlock(guild.getLocale().getNativeName()), true);
- eb.addField(MarkdownUtil.underline("Verification"), MarkdownUtil.quoteBlock(guild.getVerificationLevel().name()), true);
- eb.addField(MarkdownUtil.underline("Roles"), MarkdownUtil.quoteBlock(String.valueOf(guild.getRoles().size())), true);
- eb.addField(MarkdownUtil.underline("Categories"), MarkdownUtil.quoteBlock(String.valueOf(guild.getCategories().size())), true);
- eb.addField(MarkdownUtil.underline("Text Channels"), MarkdownUtil.quoteBlock(String.valueOf(guild.getTextChannels().size())), true);
- eb.addField(MarkdownUtil.underline("Voice Channels"), MarkdownUtil.quoteBlock(String.valueOf(guild.getVoiceChannels().size())), true);
-
- eb.setFooter("Requested By: " + getDataRequestingMember(event.getMember()));
- eb.setTimestamp(Instant.now());
-
- event.getHook().editOriginalEmbeds(eb.build()).queue();
-
+ handler.sendServerStats(event, guild);
}
}
From dcbe58cf01a1d21e7ce7df48be3370f724458b5c Mon Sep 17 00:00:00 2001
From: Egg-03 <111327101+eggy03@users.noreply.github.com>
Date: Sun, 31 May 2026 20:20:58 +0530
Subject: [PATCH 43/66] feat: allow for shard shutdown on exit
Signed-off-by: Egg-03 <111327101+eggy03@users.noreply.github.com>
---
.../eggy03/papertrail/bot/BootstrapService.java | 15 +++++++++++++++
1 file changed, 15 insertions(+)
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/BootstrapService.java b/src/main/java/io/github/eggy03/papertrail/bot/BootstrapService.java
index 32a440c..3c5cb93 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/BootstrapService.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/BootstrapService.java
@@ -2,11 +2,13 @@
import io.quarkus.runtime.Startup;
import jakarta.annotation.PostConstruct;
+import jakarta.annotation.PreDestroy;
import jakarta.enterprise.context.ApplicationScoped;
import jakarta.enterprise.inject.Instance;
import jakarta.enterprise.inject.Produces;
import jakarta.inject.Inject;
import lombok.NonNull;
+import lombok.extern.slf4j.Slf4j;
import net.dv8tion.jda.api.OnlineStatus;
import net.dv8tion.jda.api.hooks.ListenerAdapter;
import net.dv8tion.jda.api.requests.GatewayIntent;
@@ -18,6 +20,7 @@
import net.dv8tion.jda.api.utils.cache.CacheFlag;
import org.eclipse.microprofile.config.inject.ConfigProperty;
+@Slf4j
@ApplicationScoped
@Startup
public final class BootstrapService {
@@ -101,6 +104,18 @@ void login() {
}
+ @PreDestroy
+ void shutdown() {
+ if (shardManager == null)
+ return;
+
+ for (int i = minShardId; i <= maxShardId; i++) {
+ log.info("Shutting Down Shard: {}", i);
+ shardManager.shutdown(i);
+ }
+
+ }
+
@Produces
@ApplicationScoped
ShardManager shardManager() {
From 63e1ac9481b6f502f51464bd2a8057b48bfe49bc Mon Sep 17 00:00:00 2001
From: Egg-03 <111327101+eggy03@users.noreply.github.com>
Date: Mon, 1 Jun 2026 10:19:26 +0530
Subject: [PATCH 44/66] refactor(guildboostevents): consolidate boost event
helpers into single handler
Signed-off-by: Egg-03 <111327101+eggy03@users.noreply.github.com>
---
.../guild/GuildBoostEventHandler.java | 137 ++++++++++++++++++
...GuildMemberUpdateBoostTimeEventHelper.java | 54 -------
.../GuildUpdateBoostCountEventHelper.java | 44 ------
.../GuildUpdateBoostTierEventHelper.java | 58 --------
.../guild/GuildBoostEventListener.java | 48 ++----
5 files changed, 149 insertions(+), 192 deletions(-)
create mode 100644 src/main/java/io/github/eggy03/papertrail/bot/handlers/guild/GuildBoostEventHandler.java
delete mode 100644 src/main/java/io/github/eggy03/papertrail/bot/handlers/guild/GuildMemberUpdateBoostTimeEventHelper.java
delete mode 100644 src/main/java/io/github/eggy03/papertrail/bot/handlers/guild/GuildUpdateBoostCountEventHelper.java
delete mode 100644 src/main/java/io/github/eggy03/papertrail/bot/handlers/guild/GuildUpdateBoostTierEventHelper.java
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/handlers/guild/GuildBoostEventHandler.java b/src/main/java/io/github/eggy03/papertrail/bot/handlers/guild/GuildBoostEventHandler.java
new file mode 100644
index 0000000..5adbcf8
--- /dev/null
+++ b/src/main/java/io/github/eggy03/papertrail/bot/handlers/guild/GuildBoostEventHandler.java
@@ -0,0 +1,137 @@
+package io.github.eggy03.papertrail.bot.handlers.guild;
+
+import io.github.eggy03.papertrail.sdk.client.AuditLogRegistrationClient;
+import io.github.eggy03.papertrail.sdk.entity.AuditLogRegistrationEntity;
+import jakarta.enterprise.context.ApplicationScoped;
+import jakarta.inject.Inject;
+import lombok.NonNull;
+import lombok.extern.slf4j.Slf4j;
+import net.dv8tion.jda.api.EmbedBuilder;
+import net.dv8tion.jda.api.entities.Guild;
+import net.dv8tion.jda.api.entities.Member;
+import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;
+import net.dv8tion.jda.api.events.guild.GenericGuildEvent;
+import net.dv8tion.jda.api.events.guild.member.update.GuildMemberUpdateBoostTimeEvent;
+import net.dv8tion.jda.api.events.guild.update.GuildUpdateBoostCountEvent;
+import net.dv8tion.jda.api.events.guild.update.GuildUpdateBoostTierEvent;
+import net.dv8tion.jda.api.utils.MarkdownUtil;
+import org.apache.commons.lang3.StringUtils;
+
+import java.awt.Color;
+import java.time.Instant;
+import java.time.OffsetDateTime;
+
+@ApplicationScoped
+@Slf4j
+public final class GuildBoostEventHandler {
+
+ private final @NonNull AuditLogRegistrationClient client;
+
+ @Inject
+ public GuildBoostEventHandler(@NonNull AuditLogRegistrationClient client) {
+ this.client = client;
+ }
+
+ @NonNull
+ private String getRegisteredGuildChannel(@NonNull String guildId) {
+ return client.getRegisteredGuild(guildId)
+ .map(AuditLogRegistrationEntity::getChannelId).orElse(StringUtils.EMPTY);
+
+ }
+
+ private void performChecksThenBuildAndSendEmbed(@NonNull GenericGuildEvent event, @NonNull EmbedBuilder embedBuilder, @NonNull String channelIdToSendTo) {
+ if (!embedBuilder.isValidLength() || embedBuilder.isEmpty()) {
+ log.warn("Embed is empty or too long (current length: {}).", embedBuilder.length());
+ return;
+ }
+
+ TextChannel sendingChannel = event.getGuild().getTextChannelById(channelIdToSendTo);
+ if (sendingChannel != null && sendingChannel.canTalk()) {
+ sendingChannel.sendMessageEmbeds(embedBuilder.build()).queue();
+ }
+ }
+
+ public void handleUpdateBoostTier(@NonNull GuildUpdateBoostTierEvent event) {
+ String channelIdToSendTo = getRegisteredGuildChannel(event.getGuild().getId());
+ if (channelIdToSendTo.isBlank()) return;
+
+ Guild guild = event.getGuild();
+
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("Audit Log Entry | Server Boost Tier Update");
+ eb.setDescription(MarkdownUtil.quoteBlock("Guild Boost Tier Updated\nTarget Guild: " + guild.getName()));
+ eb.setThumbnail(guild.getIconUrl());
+ eb.setColor(Color.YELLOW);
+
+ Guild.BoostTier oldBoostTier = event.getOldBoostTier();
+ Guild.BoostTier newBoostTier = event.getNewBoostTier();
+
+ String oldTier = "**Tier:** " + oldBoostTier.name() + "\n" +
+ "**Max Emojis:** " + oldBoostTier.getMaxEmojis() + "\n" +
+ "**Max File Size:** " + oldBoostTier.getMaxFileSize() + "\n" +
+ "**Max Bitrate:** " + oldBoostTier.getMaxBitrate();
+
+ String newTier = "**Tier:** " + newBoostTier.name() + "\n" +
+ "**Max Emojis:** " + newBoostTier.getMaxEmojis() + "\n" +
+ "**Max File Size:** " + newBoostTier.getMaxFileSize() + "\n" +
+ "**Max Bitrate:** " + newBoostTier.getMaxBitrate();
+
+ eb.addField(MarkdownUtil.underline("Old Boost Tier Information"), oldTier, false);
+ eb.addField(MarkdownUtil.underline("New Boost Tier Information"), newTier, false);
+
+ eb.setFooter(guild.getName());
+ eb.setTimestamp(Instant.now());
+
+ performChecksThenBuildAndSendEmbed(event, eb, channelIdToSendTo);
+ }
+
+ public void handleUpdateBoostCount(@NonNull GuildUpdateBoostCountEvent event) {
+ String channelIdToSendTo = getRegisteredGuildChannel(event.getGuild().getId());
+ if (channelIdToSendTo.isBlank()) return;
+
+ Guild guild = event.getGuild();
+
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("Audit Log Entry | Server Boost Event");
+ eb.setDescription(MarkdownUtil.quoteBlock("Guild Boost Count Updated\nTarget Guild: " + guild.getName()));
+ eb.setThumbnail(guild.getIconUrl());
+ eb.setColor(Color.YELLOW);
+
+ eb.addField(MarkdownUtil.underline("Old Boost Count"), "╰┈➤" + event.getOldBoostCount(), false);
+ eb.addField(MarkdownUtil.underline("New Boost Count"), "╰┈➤" + event.getNewBoostCount(), false);
+
+ eb.setFooter(guild.getName());
+ eb.setTimestamp(Instant.now());
+
+ performChecksThenBuildAndSendEmbed(event, eb, channelIdToSendTo);
+ }
+
+ public void handleMemberUpdateBoostTime(@NonNull GuildMemberUpdateBoostTimeEvent event) {
+ String channelIdToSendTo = getRegisteredGuildChannel(event.getGuild().getId());
+ if (channelIdToSendTo.isBlank()) return;
+
+ Member member = event.getMember();
+ Guild guild = event.getGuild();
+
+ String mentionableMember = member.getAsMention();
+
+ OffsetDateTime newBoostTime = event.getNewTimeBoosted(); // Will be null if the member stopped boosting
+
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("Audit Log Entry | Server Boost Event");
+ eb.setThumbnail(guild.getIconUrl());
+
+ if (newBoostTime != null) {
+ eb.setDescription(MarkdownUtil.quoteBlock("Booster Gained: " + mentionableMember + "\nTarget Server: " + guild.getName()));
+ eb.setColor(Color.PINK);
+ } else {
+ eb.setDescription(MarkdownUtil.quoteBlock("Booster Lost: " + mentionableMember + "\nTarget Server: " + guild.getName()));
+ eb.setColor(Color.GRAY);
+ }
+
+ eb.setFooter(guild.getName());
+ eb.setTimestamp(Instant.now());
+
+ performChecksThenBuildAndSendEmbed(event, eb, channelIdToSendTo);
+ }
+}
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/handlers/guild/GuildMemberUpdateBoostTimeEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/handlers/guild/GuildMemberUpdateBoostTimeEventHelper.java
deleted file mode 100644
index 9212f0c..0000000
--- a/src/main/java/io/github/eggy03/papertrail/bot/handlers/guild/GuildMemberUpdateBoostTimeEventHelper.java
+++ /dev/null
@@ -1,54 +0,0 @@
-package io.github.eggy03.papertrail.bot.handlers.guild;
-
-import lombok.NonNull;
-import lombok.experimental.UtilityClass;
-import lombok.extern.slf4j.Slf4j;
-import net.dv8tion.jda.api.EmbedBuilder;
-import net.dv8tion.jda.api.entities.Guild;
-import net.dv8tion.jda.api.entities.Member;
-import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;
-import net.dv8tion.jda.api.events.guild.member.update.GuildMemberUpdateBoostTimeEvent;
-import net.dv8tion.jda.api.utils.MarkdownUtil;
-
-import java.awt.Color;
-import java.time.Instant;
-import java.time.OffsetDateTime;
-
-@UtilityClass
-@Slf4j
-public final class GuildMemberUpdateBoostTimeEventHelper {
-
- public static void format(@NonNull GuildMemberUpdateBoostTimeEvent event, @NonNull String channelIdToSendTo) {
- Member member = event.getMember();
- Guild guild = event.getGuild();
-
- String mentionableMember = member.getAsMention();
-
- OffsetDateTime newBoostTime = event.getNewTimeBoosted(); // Will be null if the member stopped boosting
-
- EmbedBuilder eb = new EmbedBuilder();
- eb.setTitle("Audit Log Entry | Server Boost Event");
- eb.setThumbnail(guild.getIconUrl());
-
- if (newBoostTime != null) {
- eb.setDescription(MarkdownUtil.quoteBlock("Booster Gained: " + mentionableMember + "\nTarget Server: " + guild.getName()));
- eb.setColor(Color.PINK);
- } else {
- eb.setDescription(MarkdownUtil.quoteBlock("Booster Lost: " + mentionableMember + "\nTarget Server: " + guild.getName()));
- eb.setColor(Color.GRAY);
- }
-
- eb.setFooter(guild.getName());
- eb.setTimestamp(Instant.now());
-
- if (!eb.isValidLength() || eb.isEmpty()) {
- log.warn("Embed is empty or too long (current length: {}).", eb.length());
- return;
- }
-
- TextChannel sendingChannel = event.getGuild().getTextChannelById(channelIdToSendTo);
- if (sendingChannel != null && sendingChannel.canTalk()) {
- sendingChannel.sendMessageEmbeds(eb.build()).queue();
- }
- }
-}
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/handlers/guild/GuildUpdateBoostCountEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/handlers/guild/GuildUpdateBoostCountEventHelper.java
deleted file mode 100644
index 3bf10a3..0000000
--- a/src/main/java/io/github/eggy03/papertrail/bot/handlers/guild/GuildUpdateBoostCountEventHelper.java
+++ /dev/null
@@ -1,44 +0,0 @@
-package io.github.eggy03.papertrail.bot.handlers.guild;
-
-import lombok.NonNull;
-import lombok.experimental.UtilityClass;
-import lombok.extern.slf4j.Slf4j;
-import net.dv8tion.jda.api.EmbedBuilder;
-import net.dv8tion.jda.api.entities.Guild;
-import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;
-import net.dv8tion.jda.api.events.guild.update.GuildUpdateBoostCountEvent;
-import net.dv8tion.jda.api.utils.MarkdownUtil;
-
-import java.awt.Color;
-import java.time.Instant;
-
-@UtilityClass
-@Slf4j
-public final class GuildUpdateBoostCountEventHelper {
-
- public static void format(@NonNull GuildUpdateBoostCountEvent event, @NonNull String channelIdToSendTo) {
- Guild guild = event.getGuild();
-
- EmbedBuilder eb = new EmbedBuilder();
- eb.setTitle("Audit Log Entry | Server Boost Event");
- eb.setDescription(MarkdownUtil.quoteBlock("Guild Boost Count Updated\nTarget Guild: " + guild.getName()));
- eb.setThumbnail(guild.getIconUrl());
- eb.setColor(Color.YELLOW);
-
- eb.addField(MarkdownUtil.underline("Old Boost Count"), "╰┈➤" + event.getOldBoostCount(), false);
- eb.addField(MarkdownUtil.underline("New Boost Count"), "╰┈➤" + event.getNewBoostCount(), false);
-
- eb.setFooter(guild.getName());
- eb.setTimestamp(Instant.now());
-
- if (!eb.isValidLength() || eb.isEmpty()) {
- log.warn("Embed is empty or too long (current length: {}).", eb.length());
- return;
- }
-
- TextChannel sendingChannel = event.getGuild().getTextChannelById(channelIdToSendTo);
- if (sendingChannel != null && sendingChannel.canTalk()) {
- sendingChannel.sendMessageEmbeds(eb.build()).queue();
- }
- }
-}
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/handlers/guild/GuildUpdateBoostTierEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/handlers/guild/GuildUpdateBoostTierEventHelper.java
deleted file mode 100644
index f3be27f..0000000
--- a/src/main/java/io/github/eggy03/papertrail/bot/handlers/guild/GuildUpdateBoostTierEventHelper.java
+++ /dev/null
@@ -1,58 +0,0 @@
-package io.github.eggy03.papertrail.bot.handlers.guild;
-
-import lombok.NonNull;
-import lombok.experimental.UtilityClass;
-import lombok.extern.slf4j.Slf4j;
-import net.dv8tion.jda.api.EmbedBuilder;
-import net.dv8tion.jda.api.entities.Guild;
-import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;
-import net.dv8tion.jda.api.events.guild.update.GuildUpdateBoostTierEvent;
-import net.dv8tion.jda.api.utils.MarkdownUtil;
-
-import java.awt.Color;
-import java.time.Instant;
-
-@UtilityClass
-@Slf4j
-public final class GuildUpdateBoostTierEventHelper {
-
- public static void format(@NonNull GuildUpdateBoostTierEvent event, @NonNull String channelIdToSendTo) {
-
- Guild guild = event.getGuild();
-
- EmbedBuilder eb = new EmbedBuilder();
- eb.setTitle("Audit Log Entry | Server Boost Tier Update");
- eb.setDescription(MarkdownUtil.quoteBlock("Guild Boost Tier Updated\nTarget Guild: " + guild.getName()));
- eb.setThumbnail(guild.getIconUrl());
- eb.setColor(Color.YELLOW);
-
- Guild.BoostTier oldBoostTier = event.getOldBoostTier();
- Guild.BoostTier newBoostTier = event.getNewBoostTier();
-
- String oldTier = "**Tier:** " + oldBoostTier.name() + "\n" +
- "**Max Emojis:** " + oldBoostTier.getMaxEmojis() + "\n" +
- "**Max File Size:** " + oldBoostTier.getMaxFileSize() + "\n" +
- "**Max Bitrate:** " + oldBoostTier.getMaxBitrate();
-
- String newTier = "**Tier:** " + newBoostTier.name() + "\n" +
- "**Max Emojis:** " + newBoostTier.getMaxEmojis() + "\n" +
- "**Max File Size:** " + newBoostTier.getMaxFileSize() + "\n" +
- "**Max Bitrate:** " + newBoostTier.getMaxBitrate();
-
- eb.addField(MarkdownUtil.underline("Old Boost Tier Information"), oldTier, false);
- eb.addField(MarkdownUtil.underline("New Boost Tier Information"), newTier, false);
-
- eb.setFooter(guild.getName());
- eb.setTimestamp(Instant.now());
-
- if (!eb.isValidLength() || eb.isEmpty()) {
- log.warn("Embed is empty or too long (current length: {}).", eb.length());
- return;
- }
-
- TextChannel sendingChannel = event.getGuild().getTextChannelById(channelIdToSendTo);
- if (sendingChannel != null && sendingChannel.canTalk()) {
- sendingChannel.sendMessageEmbeds(eb.build()).queue();
- }
- }
-}
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/guild/GuildBoostEventListener.java b/src/main/java/io/github/eggy03/papertrail/bot/listeners/guild/GuildBoostEventListener.java
index 9b93958..1f04212 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/guild/GuildBoostEventListener.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/listeners/guild/GuildBoostEventListener.java
@@ -1,60 +1,36 @@
package io.github.eggy03.papertrail.bot.listeners.guild;
-import io.github.eggy03.papertrail.bot.handlers.guild.GuildMemberUpdateBoostTimeEventHelper;
-import io.github.eggy03.papertrail.bot.handlers.guild.GuildUpdateBoostCountEventHelper;
-import io.github.eggy03.papertrail.bot.handlers.guild.GuildUpdateBoostTierEventHelper;
-import io.github.eggy03.papertrail.sdk.client.AuditLogRegistrationClient;
-import io.github.eggy03.papertrail.sdk.entity.AuditLogRegistrationEntity;
+import io.github.eggy03.papertrail.bot.handlers.guild.GuildBoostEventHandler;
+import jakarta.enterprise.context.ApplicationScoped;
+import jakarta.inject.Inject;
import lombok.NonNull;
-import lombok.RequiredArgsConstructor;
import net.dv8tion.jda.api.events.guild.member.update.GuildMemberUpdateBoostTimeEvent;
import net.dv8tion.jda.api.events.guild.update.GuildUpdateBoostCountEvent;
import net.dv8tion.jda.api.events.guild.update.GuildUpdateBoostTierEvent;
import net.dv8tion.jda.api.hooks.ListenerAdapter;
-import java.util.Optional;
-import java.util.concurrent.Executor;
-
-// Experimental
-@RequiredArgsConstructor
+@ApplicationScoped
public final class GuildBoostEventListener extends ListenerAdapter {
- @NonNull
- private final AuditLogRegistrationClient client;
+ private final @NonNull GuildBoostEventHandler handler;
- @NonNull
- private final Executor vThreadPool;
+ @Inject
+ public GuildBoostEventListener(@NonNull GuildBoostEventHandler handler) {
+ this.handler = handler;
+ }
@Override
public void onGuildUpdateBoostTier(@NonNull GuildUpdateBoostTierEvent event) {
-
- vThreadPool.execute(() -> {
- Optional response = client.getRegisteredGuild(event.getGuild().getId());
- response.ifPresent(success ->
- GuildUpdateBoostTierEventHelper.format(event, success.getChannelId())
- );
- });
+ handler.handleUpdateBoostTier(event);
}
@Override
public void onGuildUpdateBoostCount(@NonNull GuildUpdateBoostCountEvent event) {
-
- vThreadPool.execute(() -> {
- Optional response = client.getRegisteredGuild(event.getGuild().getId());
- response.ifPresent(success ->
- GuildUpdateBoostCountEventHelper.format(event, success.getChannelId())
- );
- });
+ handler.handleUpdateBoostCount(event);
}
@Override
public void onGuildMemberUpdateBoostTime(@NonNull GuildMemberUpdateBoostTimeEvent event) {
-
- vThreadPool.execute(() -> {
- Optional response = client.getRegisteredGuild(event.getGuild().getId());
- response.ifPresent(success ->
- GuildMemberUpdateBoostTimeEventHelper.format(event, success.getChannelId())
- );
- });
+ handler.handleMemberUpdateBoostTime(event);
}
}
From 0f6352b1f18b33ea42adeda0e72b4e4c0d8e8211 Mon Sep 17 00:00:00 2001
From: Egg-03 <111327101+eggy03@users.noreply.github.com>
Date: Mon, 1 Jun 2026 11:02:21 +0530
Subject: [PATCH 45/66] refactor(guildmemberevents): consolidate member event
helpers into single handler
Signed-off-by: Egg-03 <111327101+eggy03@users.noreply.github.com>
---
.../guild/GuildMemberEventHandler.java | 123 ++++++++++++++++++
.../guild/GuildMemberJoinEventHelper.java | 52 --------
.../guild/GuildMemberRemoveEventHelper.java | 71 ----------
.../guild/GuildMemberEventListener.java | 34 +++++
.../GuildMemberJoinAndLeaveEventListener.java | 51 --------
5 files changed, 157 insertions(+), 174 deletions(-)
create mode 100644 src/main/java/io/github/eggy03/papertrail/bot/handlers/guild/GuildMemberEventHandler.java
delete mode 100644 src/main/java/io/github/eggy03/papertrail/bot/handlers/guild/GuildMemberJoinEventHelper.java
delete mode 100644 src/main/java/io/github/eggy03/papertrail/bot/handlers/guild/GuildMemberRemoveEventHelper.java
create mode 100644 src/main/java/io/github/eggy03/papertrail/bot/listeners/guild/GuildMemberEventListener.java
delete mode 100644 src/main/java/io/github/eggy03/papertrail/bot/listeners/guild/GuildMemberJoinAndLeaveEventListener.java
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/handlers/guild/GuildMemberEventHandler.java b/src/main/java/io/github/eggy03/papertrail/bot/handlers/guild/GuildMemberEventHandler.java
new file mode 100644
index 0000000..164dfe6
--- /dev/null
+++ b/src/main/java/io/github/eggy03/papertrail/bot/handlers/guild/GuildMemberEventHandler.java
@@ -0,0 +1,123 @@
+package io.github.eggy03.papertrail.bot.handlers.guild;
+
+import io.github.eggy03.papertrail.bot.utils.BooleanUtils;
+import io.github.eggy03.papertrail.bot.utils.DurationUtils;
+import io.github.eggy03.papertrail.sdk.client.AuditLogRegistrationClient;
+import io.github.eggy03.papertrail.sdk.entity.AuditLogRegistrationEntity;
+import jakarta.enterprise.context.ApplicationScoped;
+import jakarta.inject.Inject;
+import lombok.NonNull;
+import lombok.extern.slf4j.Slf4j;
+import net.dv8tion.jda.api.EmbedBuilder;
+import net.dv8tion.jda.api.entities.Guild;
+import net.dv8tion.jda.api.entities.Member;
+import net.dv8tion.jda.api.entities.User;
+import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;
+import net.dv8tion.jda.api.events.guild.GenericGuildEvent;
+import net.dv8tion.jda.api.events.guild.member.GuildMemberJoinEvent;
+import net.dv8tion.jda.api.events.guild.member.GuildMemberRemoveEvent;
+import net.dv8tion.jda.api.utils.MarkdownUtil;
+import org.apache.commons.lang3.StringUtils;
+import org.jetbrains.annotations.NotNull;
+
+import java.awt.Color;
+import java.time.Instant;
+
+@ApplicationScoped
+@Slf4j
+public class GuildMemberEventHandler {
+
+ private final @NonNull AuditLogRegistrationClient client;
+
+ @Inject
+ public GuildMemberEventHandler(@NonNull AuditLogRegistrationClient client) {
+ this.client = client;
+ }
+
+ @NonNull
+ private String getRegisteredGuildChannel(@NonNull String guildId) {
+ return client.getRegisteredGuild(guildId)
+ .map(AuditLogRegistrationEntity::getChannelId).orElse(StringUtils.EMPTY);
+
+ }
+
+ private void performChecksThenBuildAndSendEmbed(@NonNull GenericGuildEvent event, @NonNull EmbedBuilder embedBuilder, @NonNull String channelIdToSendTo) {
+ if (!embedBuilder.isValidLength() || embedBuilder.isEmpty()) {
+ log.warn("Embed is empty or too long (current length: {}).", embedBuilder.length());
+ return;
+ }
+
+ TextChannel sendingChannel = event.getGuild().getTextChannelById(channelIdToSendTo);
+ if (sendingChannel != null && sendingChannel.canTalk()) {
+ sendingChannel.sendMessageEmbeds(embedBuilder.build()).queue();
+ }
+ }
+
+ public void handleGuildMemberJoin(@NonNull GuildMemberJoinEvent event) {
+ String channelIdToSendTo = getRegisteredGuildChannel(event.getGuild().getId());
+ if (channelIdToSendTo.isBlank()) return;
+
+ Guild guild = event.getGuild();
+ User user = event.getUser();
+
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("Audit Log Entry | Member Join Event");
+ eb.setDescription(MarkdownUtil.quoteBlock("Member Joined: " + user.getName() + "\nGuild: " + guild.getName()));
+ eb.setThumbnail(user.getEffectiveAvatarUrl());
+ eb.setColor(Color.GREEN);
+
+ eb.addField(MarkdownUtil.underline("Member Name"), "╰┈➤" + user.getName(), false);
+ eb.addField(MarkdownUtil.underline("Member Mention"), "╰┈➤" + user.getAsMention(), false);
+ eb.addField(MarkdownUtil.underline("Member ID"), "╰┈➤" + user.getId(), false);
+ eb.addField(MarkdownUtil.underline("Account Created"), "╰┈➤" + DurationUtils.isoToLocalTimeCounter(user.getTimeCreated()), false);
+ eb.addField(MarkdownUtil.underline("Bot Account"), "╰┈➤" + BooleanUtils.formatToYesOrNo(user.isBot()), false);
+
+ eb.setFooter(event.getGuild().getName());
+ eb.setTimestamp(Instant.now());
+
+ performChecksThenBuildAndSendEmbed(event, eb, channelIdToSendTo);
+ }
+
+ public void handleGuildMemberRemove(@NonNull GuildMemberRemoveEvent event) {
+ String channelIdToSendTo = getRegisteredGuildChannel(event.getGuild().getId());
+ if (channelIdToSendTo.isBlank()) return;
+
+ Guild guild = event.getGuild();
+ User user = event.getUser();
+
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("Audit Log Entry | Member Leave Event");
+ eb.setDescription(MarkdownUtil.quoteBlock("Member Left: " + user.getName() + "\nGuild: " + guild.getName()));
+ eb.setThumbnail(user.getEffectiveAvatarUrl());
+ eb.setColor(Color.RED);
+
+ eb.addField(MarkdownUtil.underline("Member Name"), "╰┈➤" + user.getName(), false);
+ eb.addField(MarkdownUtil.underline("Member ID"), "╰┈➤" + user.getId(), false);
+ eb.addField(MarkdownUtil.underline("Member Account Created"), "╰┈➤" + DurationUtils.isoToLocalTimeCounter(user.getTimeCreated()), false);
+ eb.addField(MarkdownUtil.underline("Member Joined The Server On"), "╰┈➤" + getMemberJoinDate(event), false);
+ eb.addField(MarkdownUtil.underline("Member Left The Server On"), "╰┈➤" + getMemberLeaveDate(), false);
+
+ eb.setFooter(event.getGuild().getName());
+ eb.setTimestamp(Instant.now());
+
+ performChecksThenBuildAndSendEmbed(event, eb, channelIdToSendTo);
+ }
+
+ @NotNull
+ private String getMemberJoinDate(@NonNull GuildMemberRemoveEvent event) {
+
+ Member member = event.getMember();
+ if (member == null)
+ return "Member not cached";
+
+ if (member.hasTimeJoined())
+ return "";
+
+ return "Unavailable";
+ }
+
+ @NotNull
+ private String getMemberLeaveDate() {
+ return "";
+ }
+}
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/handlers/guild/GuildMemberJoinEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/handlers/guild/GuildMemberJoinEventHelper.java
deleted file mode 100644
index d0fd71b..0000000
--- a/src/main/java/io/github/eggy03/papertrail/bot/handlers/guild/GuildMemberJoinEventHelper.java
+++ /dev/null
@@ -1,52 +0,0 @@
-package io.github.eggy03.papertrail.bot.handlers.guild;
-
-import io.github.eggy03.papertrail.bot.utils.BooleanUtils;
-import io.github.eggy03.papertrail.bot.utils.DurationUtils;
-import lombok.NonNull;
-import lombok.experimental.UtilityClass;
-import lombok.extern.slf4j.Slf4j;
-import net.dv8tion.jda.api.EmbedBuilder;
-import net.dv8tion.jda.api.entities.Guild;
-import net.dv8tion.jda.api.entities.User;
-import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;
-import net.dv8tion.jda.api.events.guild.member.GuildMemberJoinEvent;
-import net.dv8tion.jda.api.utils.MarkdownUtil;
-
-import java.awt.Color;
-import java.time.Instant;
-
-@UtilityClass
-@Slf4j
-public final class GuildMemberJoinEventHelper {
-
- public static void format(@NonNull GuildMemberJoinEvent event, @NonNull String channelIdToSendTo) {
-
- Guild guild = event.getGuild();
- User user = event.getUser();
-
- EmbedBuilder eb = new EmbedBuilder();
- eb.setTitle("Audit Log Entry | Member Join Event");
- eb.setDescription(MarkdownUtil.quoteBlock("Member Joined: " + user.getName() + "\nGuild: " + guild.getName()));
- eb.setThumbnail(user.getEffectiveAvatarUrl());
- eb.setColor(Color.GREEN);
-
- eb.addField(MarkdownUtil.underline("Member Name"), "╰┈➤" + user.getName(), false);
- eb.addField(MarkdownUtil.underline("Member Mention"), "╰┈➤" + user.getAsMention(), false);
- eb.addField(MarkdownUtil.underline("Member ID"), "╰┈➤" + user.getId(), false);
- eb.addField(MarkdownUtil.underline("Account Created"), "╰┈➤" + DurationUtils.isoToLocalTimeCounter(user.getTimeCreated()), false);
- eb.addField(MarkdownUtil.underline("Bot Account"), "╰┈➤" + BooleanUtils.formatToYesOrNo(user.isBot()), false);
-
- eb.setFooter(event.getGuild().getName());
- eb.setTimestamp(Instant.now());
-
- if (!eb.isValidLength() || eb.isEmpty()) {
- log.warn("Embed is empty or too long (current length: {}).", eb.length());
- return;
- }
-
- TextChannel sendingChannel = event.getGuild().getTextChannelById(channelIdToSendTo);
- if (sendingChannel != null && sendingChannel.canTalk()) {
- sendingChannel.sendMessageEmbeds(eb.build()).queue();
- }
- }
-}
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/handlers/guild/GuildMemberRemoveEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/handlers/guild/GuildMemberRemoveEventHelper.java
deleted file mode 100644
index 9a1d056..0000000
--- a/src/main/java/io/github/eggy03/papertrail/bot/handlers/guild/GuildMemberRemoveEventHelper.java
+++ /dev/null
@@ -1,71 +0,0 @@
-package io.github.eggy03.papertrail.bot.handlers.guild;
-
-import io.github.eggy03.papertrail.bot.utils.DurationUtils;
-import lombok.NonNull;
-import lombok.experimental.UtilityClass;
-import lombok.extern.slf4j.Slf4j;
-import net.dv8tion.jda.api.EmbedBuilder;
-import net.dv8tion.jda.api.entities.Guild;
-import net.dv8tion.jda.api.entities.Member;
-import net.dv8tion.jda.api.entities.User;
-import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;
-import net.dv8tion.jda.api.events.guild.member.GuildMemberRemoveEvent;
-import net.dv8tion.jda.api.utils.MarkdownUtil;
-import org.jetbrains.annotations.NotNull;
-
-import java.awt.Color;
-import java.time.Instant;
-
-@UtilityClass
-@Slf4j
-public final class GuildMemberRemoveEventHelper {
-
- public static void format(@NonNull GuildMemberRemoveEvent event, @NonNull String channelIdToSendTo) {
-
- Guild guild = event.getGuild();
- User user = event.getUser();
-
- EmbedBuilder eb = new EmbedBuilder();
- eb.setTitle("Audit Log Entry | Member Leave Event");
- eb.setDescription(MarkdownUtil.quoteBlock("Member Left: " + user.getName() + "\nGuild: " + guild.getName()));
- eb.setThumbnail(user.getEffectiveAvatarUrl());
- eb.setColor(Color.RED);
-
- eb.addField(MarkdownUtil.underline("Member Name"), "╰┈➤" + user.getName(), false);
- eb.addField(MarkdownUtil.underline("Member ID"), "╰┈➤" + user.getId(), false);
- eb.addField(MarkdownUtil.underline("Member Account Created"), "╰┈➤" + DurationUtils.isoToLocalTimeCounter(user.getTimeCreated()), false);
- eb.addField(MarkdownUtil.underline("Member Joined The Server On"), "╰┈➤" + getMemberJoinDate(event), false);
- eb.addField(MarkdownUtil.underline("Member Left The Server On"), "╰┈➤" + getMemberLeaveDate(), false);
-
- eb.setFooter(event.getGuild().getName());
- eb.setTimestamp(Instant.now());
-
- if (!eb.isValidLength() || eb.isEmpty()) {
- log.warn("Embed is empty or too long (current length: {}).", eb.length());
- return;
- }
-
- TextChannel sendingChannel = event.getGuild().getTextChannelById(channelIdToSendTo);
- if (sendingChannel != null && sendingChannel.canTalk()) {
- sendingChannel.sendMessageEmbeds(eb.build()).queue();
- }
- }
-
- @NotNull
- private static String getMemberJoinDate (@NonNull GuildMemberRemoveEvent event) {
-
- Member member = event.getMember();
- if(member==null)
- return "Member not cached";
-
- if (member.hasTimeJoined())
- return "";
-
- return "Unavailable";
- }
-
- @NotNull
- private static String getMemberLeaveDate () {
- return "";
- }
-}
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/guild/GuildMemberEventListener.java b/src/main/java/io/github/eggy03/papertrail/bot/listeners/guild/GuildMemberEventListener.java
new file mode 100644
index 0000000..e9e2630
--- /dev/null
+++ b/src/main/java/io/github/eggy03/papertrail/bot/listeners/guild/GuildMemberEventListener.java
@@ -0,0 +1,34 @@
+package io.github.eggy03.papertrail.bot.listeners.guild;
+
+import io.github.eggy03.papertrail.bot.handlers.guild.GuildMemberEventHandler;
+import jakarta.enterprise.context.ApplicationScoped;
+import jakarta.inject.Inject;
+import lombok.NonNull;
+import net.dv8tion.jda.api.events.guild.member.GuildMemberJoinEvent;
+import net.dv8tion.jda.api.events.guild.member.GuildMemberRemoveEvent;
+import net.dv8tion.jda.api.hooks.ListenerAdapter;
+
+// this event is not properly logged in the audit logs, hence the usage of JDA's listener is preferred
+// this event is logged in the same channel where the audit log events are logged
+@ApplicationScoped
+public final class GuildMemberEventListener extends ListenerAdapter {
+
+ private final @NonNull GuildMemberEventHandler handler;
+
+ @Inject
+ public GuildMemberEventListener(@NonNull GuildMemberEventHandler handler) {
+ this.handler = handler;
+ }
+
+
+ @Override
+ public void onGuildMemberJoin(@NonNull GuildMemberJoinEvent event) {
+ handler.handleGuildMemberJoin(event);
+ }
+
+ @Override
+ public void onGuildMemberRemove(@NonNull GuildMemberRemoveEvent event) {
+ handler.handleGuildMemberRemove(event);
+ }
+
+}
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/guild/GuildMemberJoinAndLeaveEventListener.java b/src/main/java/io/github/eggy03/papertrail/bot/listeners/guild/GuildMemberJoinAndLeaveEventListener.java
deleted file mode 100644
index 5ad5ec9..0000000
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/guild/GuildMemberJoinAndLeaveEventListener.java
+++ /dev/null
@@ -1,51 +0,0 @@
-package io.github.eggy03.papertrail.bot.listeners.guild;
-
-import io.github.eggy03.papertrail.bot.handlers.guild.GuildMemberJoinEventHelper;
-import io.github.eggy03.papertrail.bot.handlers.guild.GuildMemberRemoveEventHelper;
-import io.github.eggy03.papertrail.sdk.client.AuditLogRegistrationClient;
-import io.github.eggy03.papertrail.sdk.entity.AuditLogRegistrationEntity;
-import lombok.NonNull;
-import lombok.RequiredArgsConstructor;
-import net.dv8tion.jda.api.events.guild.member.GuildMemberJoinEvent;
-import net.dv8tion.jda.api.events.guild.member.GuildMemberRemoveEvent;
-import net.dv8tion.jda.api.hooks.ListenerAdapter;
-
-import java.util.Optional;
-import java.util.concurrent.Executor;
-
-// this event is not properly logged in the audit logs, hence the usage of JDA's listener is preferred
-// this event is logged in the same channel where the audit log events are logged
-@RequiredArgsConstructor
-public final class GuildMemberJoinAndLeaveEventListener extends ListenerAdapter {
-
- @NonNull
- private final AuditLogRegistrationClient client;
-
- @NonNull
- private final Executor vThreadPool;
-
- @Override
- public void onGuildMemberJoin(@NonNull GuildMemberJoinEvent event) {
-
- vThreadPool.execute(() -> {
- // Call the API and see if the event came from a registered Guild
- Optional response = client.getRegisteredGuild(event.getGuild().getId());
- response.ifPresent(success ->
- GuildMemberJoinEventHelper.format(event, success.getChannelId())
- );
- });
- }
-
- @Override
- public void onGuildMemberRemove(@NonNull GuildMemberRemoveEvent event) {
-
- vThreadPool.execute(() -> {
- // Call the API and see if the event came from a registered Guild
- Optional response = client.getRegisteredGuild(event.getGuild().getId());
- response.ifPresent(success ->
- GuildMemberRemoveEventHelper.format(event, success.getChannelId())
- );
- });
- }
-
-}
From a694d076124827d48ee7503b9ddc41877c091ddc Mon Sep 17 00:00:00 2001
From: Egg-03 <111327101+eggy03@users.noreply.github.com>
Date: Mon, 1 Jun 2026 11:34:53 +0530
Subject: [PATCH 46/66] refactor(guild-poll): delegate poll event handling
- Refactor `GuildPollEventHelper` into an `@ApplicationScoped` `GuildPollEventHandler` component, delegating poll event processing from `GuildPollEventListener`.
- Centralize poll event logic (client calls, embed building) within the new handler.
Signed-off-by: Egg-03 <111327101+eggy03@users.noreply.github.com>
---
...Helper.java => GuildPollEventHandler.java} | 58 ++++++++++++++-----
.../guild/GuildPollEventListener.java | 35 ++++-------
2 files changed, 54 insertions(+), 39 deletions(-)
rename src/main/java/io/github/eggy03/papertrail/bot/handlers/guild/{GuildPollEventHelper.java => GuildPollEventHandler.java} (57%)
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/handlers/guild/GuildPollEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/handlers/guild/GuildPollEventHandler.java
similarity index 57%
rename from src/main/java/io/github/eggy03/papertrail/bot/handlers/guild/GuildPollEventHelper.java
rename to src/main/java/io/github/eggy03/papertrail/bot/handlers/guild/GuildPollEventHandler.java
index f98eb08..7c50b8c 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/handlers/guild/GuildPollEventHelper.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/handlers/guild/GuildPollEventHandler.java
@@ -1,24 +1,61 @@
package io.github.eggy03.papertrail.bot.handlers.guild;
import io.github.eggy03.papertrail.bot.utils.BooleanUtils;
+import io.github.eggy03.papertrail.sdk.client.AuditLogRegistrationClient;
+import io.github.eggy03.papertrail.sdk.entity.AuditLogRegistrationEntity;
+import jakarta.enterprise.context.ApplicationScoped;
+import jakarta.inject.Inject;
import lombok.NonNull;
-import lombok.experimental.UtilityClass;
import lombok.extern.slf4j.Slf4j;
import net.dv8tion.jda.api.EmbedBuilder;
import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;
import net.dv8tion.jda.api.entities.messages.MessagePoll;
import net.dv8tion.jda.api.events.message.MessageReceivedEvent;
import net.dv8tion.jda.api.utils.MarkdownUtil;
+import org.apache.commons.lang3.StringUtils;
import org.jetbrains.annotations.NotNull;
import java.awt.Color;
import java.time.Instant;
-@UtilityClass
+@ApplicationScoped
@Slf4j
-public final class GuildPollEventHelper {
+public final class GuildPollEventHandler {
- public static void format(@NonNull MessageReceivedEvent event, @NonNull MessagePoll messagePoll, @NonNull String channelIdToSendTo) {
+ private final @NonNull AuditLogRegistrationClient client;
+
+ @Inject
+ public GuildPollEventHandler(@NonNull AuditLogRegistrationClient client) {
+ this.client = client;
+ }
+
+ @NonNull
+ private String getRegisteredGuildChannel(@NonNull String guildId) {
+ return client.getRegisteredGuild(guildId)
+ .map(AuditLogRegistrationEntity::getChannelId).orElse(StringUtils.EMPTY);
+
+ }
+
+ private void performChecksThenBuildAndSendEmbed(@NonNull MessageReceivedEvent event, @NonNull EmbedBuilder embedBuilder, @NonNull String channelIdToSendTo) {
+ if (!embedBuilder.isValidLength() || embedBuilder.isEmpty()) {
+ log.warn("Embed is empty or too long (current length: {}).", embedBuilder.length());
+ return;
+ }
+
+ TextChannel sendingChannel = event.getGuild().getTextChannelById(channelIdToSendTo);
+ if (sendingChannel != null && sendingChannel.canTalk()) {
+ sendingChannel.sendMessageEmbeds(embedBuilder.build()).queue();
+ }
+ }
+
+ public void handlePollCreationEvent(@NonNull MessageReceivedEvent event) {
+ // check if message has a poll
+ MessagePoll messagePoll = event.getMessage().getPoll();
+ if (messagePoll == null)
+ return;
+
+ String channelIdToSendTo = getRegisteredGuildChannel(event.getGuild().getId());
+ if (channelIdToSendTo.isBlank()) return;
EmbedBuilder eb = new EmbedBuilder();
eb.setTitle("Audit Log Entry | Poll Creation Event");
@@ -33,19 +70,12 @@ public static void format(@NonNull MessageReceivedEvent event, @NonNull MessageP
eb.setFooter(event.getGuild().getName());
eb.setTimestamp(Instant.now());
- if (!eb.isValidLength() || eb.isEmpty()) {
- log.warn("Embed is empty or too long (current length: {}).", eb.length());
- return;
- }
+ performChecksThenBuildAndSendEmbed(event, eb, channelIdToSendTo);
- TextChannel sendingChannel = event.getGuild().getTextChannelById(channelIdToSendTo);
- if (sendingChannel != null && sendingChannel.canTalk()) {
- sendingChannel.sendMessageEmbeds(eb.build()).queue();
- }
}
@NotNull
- private static String getMessagePollAnswers(@NonNull MessagePoll messagePoll) {
+ private String getMessagePollAnswers(@NonNull MessagePoll messagePoll) {
StringBuilder answers = new StringBuilder();
messagePoll.getAnswers().forEach(answer -> answers
@@ -60,7 +90,7 @@ private static String getMessagePollAnswers(@NonNull MessagePoll messagePoll) {
}
@NotNull
- private static String getPollExpiryTime(@NonNull MessagePoll messagePoll) {
+ private String getPollExpiryTime(@NonNull MessagePoll messagePoll) {
return messagePoll.getTimeExpiresAt() != null ?
"" :
"Never Expires";
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/guild/GuildPollEventListener.java b/src/main/java/io/github/eggy03/papertrail/bot/listeners/guild/GuildPollEventListener.java
index 7264e82..54bb1e1 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/guild/GuildPollEventListener.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/listeners/guild/GuildPollEventListener.java
@@ -1,26 +1,22 @@
package io.github.eggy03.papertrail.bot.listeners.guild;
-import io.github.eggy03.papertrail.bot.handlers.guild.GuildPollEventHelper;
-import io.github.eggy03.papertrail.sdk.client.AuditLogRegistrationClient;
-import io.github.eggy03.papertrail.sdk.entity.AuditLogRegistrationEntity;
+import io.github.eggy03.papertrail.bot.handlers.guild.GuildPollEventHandler;
+import jakarta.enterprise.context.ApplicationScoped;
+import jakarta.inject.Inject;
import lombok.NonNull;
-import lombok.RequiredArgsConstructor;
-import net.dv8tion.jda.api.entities.messages.MessagePoll;
import net.dv8tion.jda.api.events.message.MessageReceivedEvent;
import net.dv8tion.jda.api.hooks.ListenerAdapter;
-import java.util.Optional;
-import java.util.concurrent.Executor;
-
// guild poll events are mapped to audit log table
-@RequiredArgsConstructor
+@ApplicationScoped
public final class GuildPollEventListener extends ListenerAdapter {
- @NonNull
- private final AuditLogRegistrationClient client;
+ private final @NonNull GuildPollEventHandler handler;
- @NonNull
- private final Executor vThreadPool;
+ @Inject
+ public GuildPollEventListener(@NonNull GuildPollEventHandler handler) {
+ this.handler = handler;
+ }
@Override
public void onMessageReceived(@NonNull MessageReceivedEvent event) {
@@ -28,17 +24,6 @@ public void onMessageReceived(@NonNull MessageReceivedEvent event) {
if (!event.isFromGuild())
return;
- // check if message has a poll
- MessagePoll messagePoll = event.getMessage().getPoll();
- if (messagePoll == null)
- return;
-
- vThreadPool.execute(() -> {
- // Call the API and see if the event came from a registered Guild
- Optional response = client.getRegisteredGuild(event.getGuild().getId());
- response.ifPresent(success ->
- GuildPollEventHelper.format(event, messagePoll, success.getChannelId())
- );
- });
+ handler.handlePollCreationEvent(event);
}
}
From 36cdf099a99b3a74d038d55dea639d4d930ad5d9 Mon Sep 17 00:00:00 2001
From: Egg-03 <111327101+eggy03@users.noreply.github.com>
Date: Mon, 1 Jun 2026 11:49:35 +0530
Subject: [PATCH 47/66] refactor(guild-voice-events): delegate voice event
handling
- rename `GuildVoiceEventHelper.java` to `GuildVoiceEventHandler.java`
- convert `GuildVoiceEventHandler` from `@UtilityClass` to `@ApplicationScoped`
- inject `AuditLogRegistrationClient` into `GuildVoiceEventHandler`
- delegate `GuildVoiceUpdateEvent` processing from `GuildVoiceEventListener` to `GuildVoiceEventHandler`
- improve separation of concerns and enable dependency injection for event handling
Signed-off-by: Egg-03 <111327101+eggy03@users.noreply.github.com>
---
...elper.java => GuildVoiceEventHandler.java} | 52 ++++++++++++++-----
.../guild/GuildVoiceEventListener.java | 30 ++++-------
2 files changed, 49 insertions(+), 33 deletions(-)
rename src/main/java/io/github/eggy03/papertrail/bot/handlers/guild/{GuildVoiceEventHelper.java => GuildVoiceEventHandler.java} (65%)
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/handlers/guild/GuildVoiceEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/handlers/guild/GuildVoiceEventHandler.java
similarity index 65%
rename from src/main/java/io/github/eggy03/papertrail/bot/handlers/guild/GuildVoiceEventHelper.java
rename to src/main/java/io/github/eggy03/papertrail/bot/handlers/guild/GuildVoiceEventHandler.java
index 828b615..543be74 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/handlers/guild/GuildVoiceEventHelper.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/handlers/guild/GuildVoiceEventHandler.java
@@ -1,23 +1,57 @@
package io.github.eggy03.papertrail.bot.handlers.guild;
+import io.github.eggy03.papertrail.sdk.client.AuditLogRegistrationClient;
+import io.github.eggy03.papertrail.sdk.entity.AuditLogRegistrationEntity;
+import jakarta.enterprise.context.ApplicationScoped;
+import jakarta.inject.Inject;
import lombok.NonNull;
-import lombok.experimental.UtilityClass;
import lombok.extern.slf4j.Slf4j;
import net.dv8tion.jda.api.EmbedBuilder;
import net.dv8tion.jda.api.entities.Member;
import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;
import net.dv8tion.jda.api.entities.channel.middleman.AudioChannel;
+import net.dv8tion.jda.api.events.guild.GenericGuildEvent;
import net.dv8tion.jda.api.events.guild.voice.GuildVoiceUpdateEvent;
import net.dv8tion.jda.api.utils.MarkdownUtil;
+import org.apache.commons.lang3.StringUtils;
import java.awt.Color;
import java.time.Instant;
-@UtilityClass
+@ApplicationScoped
@Slf4j
-public final class GuildVoiceEventHelper {
+public final class GuildVoiceEventHandler {
- public static void format(@NonNull GuildVoiceUpdateEvent event, @NonNull String channelIdToSendTo) {
+ private final @NonNull AuditLogRegistrationClient client;
+
+ @Inject
+ public GuildVoiceEventHandler(@NonNull AuditLogRegistrationClient client) {
+ this.client = client;
+ }
+
+ @NonNull
+ private String getRegisteredGuildChannel(@NonNull String guildId) {
+ return client.getRegisteredGuild(guildId)
+ .map(AuditLogRegistrationEntity::getChannelId).orElse(StringUtils.EMPTY);
+
+ }
+
+ private void performChecksThenBuildAndSendEmbed(@NonNull GenericGuildEvent event, @NonNull EmbedBuilder embedBuilder, @NonNull String channelIdToSendTo) {
+ if (!embedBuilder.isValidLength() || embedBuilder.isEmpty()) {
+ log.warn("Embed is empty or too long (current length: {}).", embedBuilder.length());
+ return;
+ }
+
+ TextChannel sendingChannel = event.getGuild().getTextChannelById(channelIdToSendTo);
+ if (sendingChannel != null && sendingChannel.canTalk()) {
+ sendingChannel.sendMessageEmbeds(embedBuilder.build()).queue();
+ }
+ }
+
+ public void handleVoiceUpdateEvent(@NonNull GuildVoiceUpdateEvent event) {
+
+ String channelIdToSendTo = getRegisteredGuildChannel(event.getGuild().getId());
+ if (channelIdToSendTo.isBlank()) return;
Member member = event.getMember();
AudioChannel left = event.getOldValue(); // can be null if user joined for first time
@@ -61,14 +95,6 @@ public static void format(@NonNull GuildVoiceUpdateEvent event, @NonNull String
eb.setFooter(event.getGuild().getName());
eb.setTimestamp(Instant.now());
- if (!eb.isValidLength() || eb.isEmpty()) {
- log.warn("Embed is empty or too long (current length: {}).", eb.length());
- return;
- }
-
- TextChannel sendingChannel = event.getGuild().getTextChannelById(channelIdToSendTo);
- if (sendingChannel != null && sendingChannel.canTalk()) {
- sendingChannel.sendMessageEmbeds(eb.build()).queue();
- }
+ performChecksThenBuildAndSendEmbed(event, eb, channelIdToSendTo);
}
}
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/guild/GuildVoiceEventListener.java b/src/main/java/io/github/eggy03/papertrail/bot/listeners/guild/GuildVoiceEventListener.java
index 1c532d4..51a6d32 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/guild/GuildVoiceEventListener.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/listeners/guild/GuildVoiceEventListener.java
@@ -1,36 +1,26 @@
package io.github.eggy03.papertrail.bot.listeners.guild;
-import io.github.eggy03.papertrail.bot.handlers.guild.GuildVoiceEventHelper;
-import io.github.eggy03.papertrail.sdk.client.AuditLogRegistrationClient;
-import io.github.eggy03.papertrail.sdk.entity.AuditLogRegistrationEntity;
+import io.github.eggy03.papertrail.bot.handlers.guild.GuildVoiceEventHandler;
+import jakarta.enterprise.context.ApplicationScoped;
+import jakarta.inject.Inject;
import lombok.NonNull;
-import lombok.RequiredArgsConstructor;
import net.dv8tion.jda.api.events.guild.voice.GuildVoiceUpdateEvent;
import net.dv8tion.jda.api.hooks.ListenerAdapter;
-import java.util.Optional;
-import java.util.concurrent.Executor;
-
// this event is not properly logged in the audit logs, hence the usage of JDA's listener is preferred
// this event is logged in the same channel where the audit log events are logged
-@RequiredArgsConstructor
+@ApplicationScoped
public final class GuildVoiceEventListener extends ListenerAdapter {
- @NonNull
- private final AuditLogRegistrationClient client;
+ private final @NonNull GuildVoiceEventHandler handler;
- @NonNull
- private final Executor vThreadPool;
+ @Inject
+ public GuildVoiceEventListener(@NonNull GuildVoiceEventHandler handler) {
+ this.handler = handler;
+ }
@Override
public void onGuildVoiceUpdate(@NonNull GuildVoiceUpdateEvent event) {
-
- vThreadPool.execute(() -> {
- // Call the API and see if the event came from a registered Guild
- Optional response = client.getRegisteredGuild(event.getGuild().getId());
- response.ifPresent(success ->
- GuildVoiceEventHelper.format(event, success.getChannelId())
- );
- });
+ handler.handleVoiceUpdateEvent(event);
}
}
\ No newline at end of file
From 21c32d0b42c045235baeddf9be2ef6be2ff20696 Mon Sep 17 00:00:00 2001
From: Egg-03 <111327101+eggy03@users.noreply.github.com>
Date: Mon, 1 Jun 2026 13:03:02 +0530
Subject: [PATCH 48/66] refactor(message-logging): consolidate message event
handling
- move message received, update, and delete event logic from individual helper classes to `GuildMessageEventHandler`
- rename `MessageLogListener` to `GuildMessageEventListener` and delegate event processing to the new handler
- implement dependency injection for event handling components using `@ApplicationScoped` and `@Inject`
- remove explicit `vThreadPool` usage from `GuildMessageEventListener`
Signed-off-by: Egg-03 <111327101+eggy03@users.noreply.github.com>
---
.../auditlog/MessageEventHandler.java | 2 +-
.../message/GuildMessageEventHandler.java | 154 ++++++++++++++++++
.../MessageLogMessageDeleteEventHelper.java | 64 --------
.../MessageLogMessageReceivedEventHelper.java | 19 ---
.../MessageLogMessageUpdateEventHelper.java | 70 --------
.../message/GuildMessageEventListener.java | 53 ++++++
.../listeners/message/MessageLogListener.java | 101 ------------
7 files changed, 208 insertions(+), 255 deletions(-)
create mode 100644 src/main/java/io/github/eggy03/papertrail/bot/handlers/message/GuildMessageEventHandler.java
delete mode 100644 src/main/java/io/github/eggy03/papertrail/bot/handlers/message/MessageLogMessageDeleteEventHelper.java
delete mode 100644 src/main/java/io/github/eggy03/papertrail/bot/handlers/message/MessageLogMessageReceivedEventHelper.java
delete mode 100644 src/main/java/io/github/eggy03/papertrail/bot/handlers/message/MessageLogMessageUpdateEventHelper.java
create mode 100644 src/main/java/io/github/eggy03/papertrail/bot/listeners/message/GuildMessageEventListener.java
delete mode 100644 src/main/java/io/github/eggy03/papertrail/bot/listeners/message/MessageLogListener.java
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/handlers/auditlog/MessageEventHandler.java b/src/main/java/io/github/eggy03/papertrail/bot/handlers/auditlog/MessageEventHandler.java
index 78381d3..8d05478 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/handlers/auditlog/MessageEventHandler.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/handlers/auditlog/MessageEventHandler.java
@@ -49,7 +49,7 @@ private void performChecksThenBuildAndSendEmbed(@NonNull GuildAuditLogEntryCreat
}
// for the following four events, audit log does not expose much information
- // a custom implementation to log edits and deletes of messages is found in MessageLogListener
+ // a custom implementation to log edits and deletes of messages is found in GuildMessageEventListener
@Override
public void onMessageCreate(@NonNull GuildAuditLogEntryCreateEvent event) {
// do nothing (these never trigger)
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/handlers/message/GuildMessageEventHandler.java b/src/main/java/io/github/eggy03/papertrail/bot/handlers/message/GuildMessageEventHandler.java
new file mode 100644
index 0000000..3d9ff0c
--- /dev/null
+++ b/src/main/java/io/github/eggy03/papertrail/bot/handlers/message/GuildMessageEventHandler.java
@@ -0,0 +1,154 @@
+package io.github.eggy03.papertrail.bot.handlers.message;
+
+import com.google.common.base.Splitter;
+import io.github.eggy03.papertrail.sdk.client.MessageLogContentClient;
+import io.github.eggy03.papertrail.sdk.client.MessageLogRegistrationClient;
+import io.github.eggy03.papertrail.sdk.entity.MessageLogContentEntity;
+import io.github.eggy03.papertrail.sdk.entity.MessageLogRegistrationEntity;
+import jakarta.enterprise.context.ApplicationScoped;
+import jakarta.inject.Inject;
+import lombok.NonNull;
+import lombok.extern.slf4j.Slf4j;
+import net.dv8tion.jda.api.EmbedBuilder;
+import net.dv8tion.jda.api.entities.User;
+import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;
+import net.dv8tion.jda.api.events.message.GenericMessageEvent;
+import net.dv8tion.jda.api.events.message.MessageDeleteEvent;
+import net.dv8tion.jda.api.events.message.MessageReceivedEvent;
+import net.dv8tion.jda.api.events.message.MessageUpdateEvent;
+import net.dv8tion.jda.api.utils.MarkdownUtil;
+import org.apache.commons.lang3.StringUtils;
+
+import java.awt.Color;
+import java.time.Instant;
+import java.util.List;
+import java.util.Optional;
+
+@ApplicationScoped
+@Slf4j
+public class GuildMessageEventHandler {
+
+ private final @NonNull MessageLogRegistrationClient registrationClient;
+ private final @NonNull MessageLogContentClient contentClient;
+
+ @Inject
+ public GuildMessageEventHandler(@NonNull MessageLogRegistrationClient registrationClient, @NonNull MessageLogContentClient contentClient) {
+ this.registrationClient = registrationClient;
+ this.contentClient = contentClient;
+ }
+
+ private boolean isGuildRegistered(@NonNull String guildId) {
+ return registrationClient.getRegisteredGuild(guildId).isPresent();
+ }
+
+ @NonNull
+ private String getRegisteredGuildChannel(@NonNull String guildId) {
+ return registrationClient.getRegisteredGuild(guildId)
+ .map(MessageLogRegistrationEntity::getChannelId).orElse(StringUtils.EMPTY);
+
+ }
+
+ private void performChecksThenBuildAndSendEmbed(@NonNull GenericMessageEvent event, @NonNull EmbedBuilder embedBuilder, @NonNull String channelIdToSendTo) {
+ if (!embedBuilder.isValidLength() || embedBuilder.isEmpty()) {
+ log.warn("Message Embed is empty or too long (current length: {}).", embedBuilder.length());
+ return;
+ }
+
+ TextChannel sendingChannel = event.getGuild().getTextChannelById(channelIdToSendTo);
+ if (sendingChannel != null && sendingChannel.canTalk()) {
+ sendingChannel.sendMessageEmbeds(embedBuilder.build()).queue();
+ }
+ }
+
+ public void handleMessageReceivedEvent(@NonNull MessageReceivedEvent event) {
+ if (!isGuildRegistered(event.getGuild().getId()))
+ return;
+
+ String messageId = event.getMessageId();
+ String messageContent = event.getMessage().getContentDisplay();
+ String authorId = event.getAuthor().getId();
+
+ contentClient.logMessage(messageId, messageContent, authorId);
+ }
+
+ public void handleMessageUpdateEvent(@NonNull MessageUpdateEvent event) {
+ String channelIdToSendTo = getRegisteredGuildChannel(event.getGuild().getId());
+ if (channelIdToSendTo.isBlank())
+ return;
+
+ // fetch the old message object from the API
+ Optional oldMessageContentOptional = contentClient.retrieveMessage(event.getMessageId());
+ if (oldMessageContentOptional.isEmpty())
+ return;
+
+ MessageLogContentEntity oldMessageContentEntity = oldMessageContentOptional.get();
+ // Fetch the old message
+ String oldMessage = oldMessageContentEntity.getMessageContent();
+ // fetch the updated message and its author from the event
+ String updatedMessage = event.getMessage().getContentDisplay();
+ String updatedMessageAuthor = event.getAuthor().getAsMention();
+
+ // Ignore events where the message content wasn't edited (e.g., pin, embed resolve, thread creates and updates)
+ // This is required since MessageUpdateEvent is triggered in case of pins and embed resolves with no change to content
+ if (updatedMessage.equals(oldMessage))
+ return;
+
+ // Splitting is required because each field in an embed can display only up-to 1024 characters
+ // A full embed can display up-to 6000 characters
+ List oldMessageSplits = Splitter.fixedLength(1000).splitToList(oldMessage);
+ List updatedMessageSplits = Splitter.fixedLength(1000).splitToList(updatedMessage);
+
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("Message Edit Event");
+ eb.setDescription(MarkdownUtil.quoteBlock("Author: " + updatedMessageAuthor + "\n" + "Channel: " + event.getChannel().getAsMention()));
+ eb.setColor(Color.YELLOW);
+
+ oldMessageSplits.forEach(split -> eb.addField(MarkdownUtil.underline("Old Message"), MarkdownUtil.codeblock(split), false));
+ updatedMessageSplits.forEach(split -> eb.addField(MarkdownUtil.underline("New Message"), MarkdownUtil.codeblock(split), false));
+
+ eb.setFooter(event.getGuild().getName());
+ eb.setTimestamp(Instant.now());
+
+ // update the database with the new message
+ contentClient.updateMessage(event.getMessageId(), updatedMessage, event.getAuthor().getId());
+
+ performChecksThenBuildAndSendEmbed(event, eb, channelIdToSendTo);
+ }
+
+ public void handleMessageDeleteEvent(@NonNull MessageDeleteEvent event) {
+ String channelIdToSendTo = getRegisteredGuildChannel(event.getGuild().getId());
+ if (channelIdToSendTo.isBlank())
+ return;
+
+ // fetch the message object from the API which was just deleted
+ Optional deletedMessageContentOptional = contentClient.retrieveMessage(event.getMessageId());
+ if (deletedMessageContentOptional.isEmpty())
+ return;
+
+ MessageLogContentEntity deletedMessageContentEntity = deletedMessageContentOptional.get();
+ // Fetch the deleted message and it's author id
+ String deletedMessage = deletedMessageContentEntity.getMessageContent();
+ String deletedMessageAuthorId = deletedMessageContentEntity.getAuthorId();
+
+ User author = event.getJDA().getUserById(deletedMessageAuthorId);
+ String mentionableAuthor = (author != null ? author.getAsMention() : deletedMessageAuthorId);
+
+ // Splitting is required because each field in an embed can display only up-to 1024 characters
+ List deletedMessageSplits = Splitter.fixedLength(1000).splitToList(deletedMessage);
+
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("Message Delete Event");
+ eb.setDescription(MarkdownUtil.quoteBlock("Author: " + mentionableAuthor + "\n" + "Channel: " + event.getChannel().getAsMention()));
+ eb.setColor(Color.RED);
+
+ deletedMessageSplits.forEach(split -> eb.addField(MarkdownUtil.underline("Deleted Message"), MarkdownUtil.codeblock(split), false));
+
+ eb.setFooter(event.getGuild().getName());
+ eb.setTimestamp(Instant.now());
+
+ // delete the message from the database
+ contentClient.deleteMessage(event.getMessageId());
+
+ performChecksThenBuildAndSendEmbed(event, eb, channelIdToSendTo);
+ }
+}
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/handlers/message/MessageLogMessageDeleteEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/handlers/message/MessageLogMessageDeleteEventHelper.java
deleted file mode 100644
index e05d28f..0000000
--- a/src/main/java/io/github/eggy03/papertrail/bot/handlers/message/MessageLogMessageDeleteEventHelper.java
+++ /dev/null
@@ -1,64 +0,0 @@
-package io.github.eggy03.papertrail.bot.handlers.message;
-
-import com.google.common.base.Splitter;
-import io.github.eggy03.papertrail.sdk.client.MessageLogContentClient;
-import io.github.eggy03.papertrail.sdk.entity.MessageLogContentEntity;
-import lombok.NonNull;
-import lombok.experimental.UtilityClass;
-import lombok.extern.slf4j.Slf4j;
-import net.dv8tion.jda.api.EmbedBuilder;
-import net.dv8tion.jda.api.entities.User;
-import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;
-import net.dv8tion.jda.api.events.message.MessageDeleteEvent;
-import net.dv8tion.jda.api.utils.MarkdownUtil;
-
-import java.awt.Color;
-import java.time.Instant;
-import java.util.List;
-import java.util.Optional;
-
-@UtilityClass
-@Slf4j
-public final class MessageLogMessageDeleteEventHelper {
-
- public static void deleteMessage(@NonNull MessageDeleteEvent event, @NonNull MessageLogContentClient client, @NonNull String deletedMessageId, @NonNull String channelIdToSendTo) {
- // fetch the old message object from the API
- Optional oldMessageContent = client.retrieveMessage(deletedMessageId);
- oldMessageContent.ifPresent(contentEntity -> {
-
- // retrieve the stored message and author in the database which was deleted
- String deletedMessage = contentEntity.getMessageContent();
- String deletedMessageAuthorId = contentEntity.getAuthorId();
-
- User author = event.getJDA().getUserById(deletedMessageAuthorId);
- String mentionableAuthor = (author != null ? author.getAsMention() : deletedMessageAuthorId);
-
- // Splitting is required because each field in an embed can display only up-to 1024 characters
- List deletedMessageSplits = Splitter.fixedLength(1000).splitToList(deletedMessage);
-
- EmbedBuilder eb = new EmbedBuilder();
- eb.setTitle("Message Delete Event");
- eb.setDescription(MarkdownUtil.quoteBlock("Author: " + mentionableAuthor + "\n" + "Channel: " + event.getChannel().getAsMention()));
- eb.setColor(Color.RED);
-
- deletedMessageSplits.forEach(split -> eb.addField(MarkdownUtil.underline("Deleted Message"), MarkdownUtil.codeblock(split), false));
-
- eb.setFooter(event.getGuild().getName());
- eb.setTimestamp(Instant.now());
-
- // delete the message from the database
- client.deleteMessage(deletedMessageId);
-
- // send the fetched deleted message to the logging channel
- if (!eb.isValidLength() || eb.isEmpty()) {
- log.warn("Embed is empty or too long (current length: {}).", eb.length());
- return;
- }
-
- TextChannel sendingChannel = event.getGuild().getTextChannelById(channelIdToSendTo);
- if (sendingChannel != null && sendingChannel.canTalk()) {
- sendingChannel.sendMessageEmbeds(eb.build()).queue();
- }
- });
- }
-}
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/handlers/message/MessageLogMessageReceivedEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/handlers/message/MessageLogMessageReceivedEventHelper.java
deleted file mode 100644
index 1896857..0000000
--- a/src/main/java/io/github/eggy03/papertrail/bot/handlers/message/MessageLogMessageReceivedEventHelper.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package io.github.eggy03.papertrail.bot.handlers.message;
-
-import io.github.eggy03.papertrail.sdk.client.MessageLogContentClient;
-import lombok.NonNull;
-import lombok.experimental.UtilityClass;
-import net.dv8tion.jda.api.events.message.MessageReceivedEvent;
-
-@UtilityClass
-public final class MessageLogMessageReceivedEventHelper {
-
- public static void saveMessage(@NonNull MessageReceivedEvent event, @NonNull MessageLogContentClient client) {
-
- String messageId = event.getMessageId();
- String messageContent = event.getMessage().getContentDisplay();
- String authorId = event.getAuthor().getId();
-
- client.logMessage(messageId, messageContent, authorId);
- }
-}
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/handlers/message/MessageLogMessageUpdateEventHelper.java b/src/main/java/io/github/eggy03/papertrail/bot/handlers/message/MessageLogMessageUpdateEventHelper.java
deleted file mode 100644
index f11eabb..0000000
--- a/src/main/java/io/github/eggy03/papertrail/bot/handlers/message/MessageLogMessageUpdateEventHelper.java
+++ /dev/null
@@ -1,70 +0,0 @@
-package io.github.eggy03.papertrail.bot.handlers.message;
-
-import com.google.common.base.Splitter;
-import io.github.eggy03.papertrail.sdk.client.MessageLogContentClient;
-import io.github.eggy03.papertrail.sdk.entity.MessageLogContentEntity;
-import lombok.NonNull;
-import lombok.experimental.UtilityClass;
-import lombok.extern.slf4j.Slf4j;
-import net.dv8tion.jda.api.EmbedBuilder;
-import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;
-import net.dv8tion.jda.api.events.message.MessageUpdateEvent;
-import net.dv8tion.jda.api.utils.MarkdownUtil;
-
-import java.awt.Color;
-import java.time.Instant;
-import java.util.List;
-import java.util.Optional;
-
-@UtilityClass
-@Slf4j
-public final class MessageLogMessageUpdateEventHelper {
-
- public static void updateMessage(@NonNull MessageUpdateEvent event, @NonNull MessageLogContentClient client, @NonNull String updatedMessageId, @NonNull String channelIdToSendTo) {
-
- // fetch the old message object from the API
- Optional oldMessageContent = client.retrieveMessage(updatedMessageId);
- oldMessageContent.ifPresent(contentEntity -> {
- // Fetch the old message
- String oldMessage = contentEntity.getMessageContent();
- // fetch the updated message and its author from the event
- String updatedMessage = event.getMessage().getContentDisplay();
-
- // Ignore events where the message content wasn't edited (e.g., pin, embed resolve, thread creates and updates)
- // This is required since MessageUpdateEvent is triggered in case of pins and embed resolves with no change to content
- if (updatedMessage.equals(oldMessage)) {
- return;
- }
-
- // Splitting is required because each field in an embed can display only up-to 1024 characters
- // A full embed can display up-to 6000 characters
- List oldMessageSplits = Splitter.fixedLength(1000).splitToList(oldMessage);
- List updatedMessageSplits = Splitter.fixedLength(1000).splitToList(updatedMessage);
-
- EmbedBuilder eb = new EmbedBuilder();
- eb.setTitle("Message Edit Event");
- eb.setDescription(MarkdownUtil.quoteBlock("Author: " + event.getAuthor().getAsMention() + "\n" + "Channel: " + event.getChannel().getAsMention()));
- eb.setColor(Color.YELLOW);
-
- oldMessageSplits.forEach(split -> eb.addField(MarkdownUtil.underline("Old Message"), MarkdownUtil.codeblock(split), false));
- updatedMessageSplits.forEach(split -> eb.addField(MarkdownUtil.underline("New Message"), MarkdownUtil.codeblock(split), false));
-
- eb.setFooter(event.getGuild().getName());
- eb.setTimestamp(Instant.now());
-
- // update the database with the new message
- client.updateMessage(updatedMessageId, updatedMessage, event.getAuthor().getId());
-
- if (!eb.isValidLength() || eb.isEmpty()) {
- log.warn("Embed is empty or too long (current length: {}).", eb.length());
- return;
- }
-
- // send the old and updated message to the registered channel
- TextChannel sendingChannel = event.getGuild().getTextChannelById(channelIdToSendTo);
- if (sendingChannel != null && sendingChannel.canTalk()) {
- sendingChannel.sendMessageEmbeds(eb.build()).queue();
- }
- });
- }
-}
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/message/GuildMessageEventListener.java b/src/main/java/io/github/eggy03/papertrail/bot/listeners/message/GuildMessageEventListener.java
new file mode 100644
index 0000000..3704875
--- /dev/null
+++ b/src/main/java/io/github/eggy03/papertrail/bot/listeners/message/GuildMessageEventListener.java
@@ -0,0 +1,53 @@
+package io.github.eggy03.papertrail.bot.listeners.message;
+
+import io.github.eggy03.papertrail.bot.handlers.message.GuildMessageEventHandler;
+import jakarta.enterprise.context.ApplicationScoped;
+import jakarta.inject.Inject;
+import lombok.NonNull;
+import net.dv8tion.jda.api.events.message.MessageDeleteEvent;
+import net.dv8tion.jda.api.events.message.MessageReceivedEvent;
+import net.dv8tion.jda.api.events.message.MessageUpdateEvent;
+import net.dv8tion.jda.api.hooks.ListenerAdapter;
+
+@ApplicationScoped
+public final class GuildMessageEventListener extends ListenerAdapter {
+
+ private final @NonNull GuildMessageEventHandler handler;
+
+ @Inject
+ public GuildMessageEventListener(@NonNull GuildMessageEventHandler handler) {
+ this.handler = handler;
+ }
+
+ @Override
+ public void onMessageReceived(@NonNull MessageReceivedEvent event) {
+
+ // if the author is a bot or system, don't log
+ if (event.getAuthor().isBot() || event.getAuthor().isSystem()) {
+ return;
+ }
+ // don't register non-textual contents
+ if (event.getMessage().getContentRaw().isEmpty()) {
+ return;
+ }
+
+ handler.handleMessageReceivedEvent(event);
+
+ }
+
+ @Override
+ public void onMessageUpdate(@NonNull MessageUpdateEvent event) {
+
+ if (event.getAuthor().isBot() || event.getAuthor().isSystem()) {
+ return;
+ }
+
+ handler.handleMessageUpdateEvent(event);
+
+ }
+
+ @Override
+ public void onMessageDelete(@NonNull MessageDeleteEvent event) {
+ handler.handleMessageDeleteEvent(event);
+ }
+}
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/listeners/message/MessageLogListener.java b/src/main/java/io/github/eggy03/papertrail/bot/listeners/message/MessageLogListener.java
deleted file mode 100644
index 55294df..0000000
--- a/src/main/java/io/github/eggy03/papertrail/bot/listeners/message/MessageLogListener.java
+++ /dev/null
@@ -1,101 +0,0 @@
-package io.github.eggy03.papertrail.bot.listeners.message;
-
-import io.github.eggy03.papertrail.bot.handlers.message.MessageLogMessageDeleteEventHelper;
-import io.github.eggy03.papertrail.bot.handlers.message.MessageLogMessageReceivedEventHelper;
-import io.github.eggy03.papertrail.bot.handlers.message.MessageLogMessageUpdateEventHelper;
-import io.github.eggy03.papertrail.sdk.client.MessageLogContentClient;
-import io.github.eggy03.papertrail.sdk.client.MessageLogRegistrationClient;
-import io.github.eggy03.papertrail.sdk.entity.MessageLogRegistrationEntity;
-import lombok.NonNull;
-import lombok.RequiredArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-import net.dv8tion.jda.api.events.message.MessageDeleteEvent;
-import net.dv8tion.jda.api.events.message.MessageReceivedEvent;
-import net.dv8tion.jda.api.events.message.MessageUpdateEvent;
-import net.dv8tion.jda.api.hooks.ListenerAdapter;
-
-import java.util.Optional;
-import java.util.concurrent.Executor;
-
-// todo rename this and its helpers to GuildMessageEventListener* and move it to the guild package
-@Slf4j
-@RequiredArgsConstructor
-public final class MessageLogListener extends ListenerAdapter {
-
- @NonNull
- private final MessageLogRegistrationClient registrationClient;
- @NonNull
- private final MessageLogContentClient contentClient;
- @NonNull
- private final Executor vThreadPool;
-
- @Override
- public void onMessageReceived(@NonNull MessageReceivedEvent event) {
-
- // if the author is a bot or system, don't log
- if (event.getAuthor().isBot() || event.getAuthor().isSystem()) {
- return;
- }
- // don't register non-textual contents
- if (event.getMessage().getContentRaw().isEmpty()) {
- return;
- }
-
- vThreadPool.execute(() -> {
- // get the guild id for which the event was fired
- String guildId = event.getGuild().getId();
- // Call the API to see if the guild is registered for Message Logging
- Optional response = registrationClient.getRegisteredGuild(guildId);
- response.ifPresent(success ->
- MessageLogMessageReceivedEventHelper.saveMessage(event, contentClient)
- );
- });
- }
-
- @Override
- public void onMessageUpdate(@NonNull MessageUpdateEvent event) {
-
- if (event.getAuthor().isBot() || event.getAuthor().isSystem()) {
- return;
- }
-
- vThreadPool.execute(() -> {
- // Get the guild id for which the event was fired
- String guildId = event.getGuild().getId();
- // Call the API to see if the guild is registered for Message Logging
- Optional response = registrationClient.getRegisteredGuild(guildId);
- response.ifPresent(success -> {
-
- // get the message id of the message which was updated
- String messageId = event.getMessageId();
- // retrieve the channel id where the logs must be sent
- String channelIdToSendTo = success.getChannelId();
- // update message
- MessageLogMessageUpdateEventHelper.updateMessage(event, contentClient, messageId, channelIdToSendTo);
- });
- });
- }
-
- @Override
- public void onMessageDelete(@NonNull MessageDeleteEvent event) {
-
- vThreadPool.execute(() -> {
-
- // Get the guild id for which the event was fired
- String guildId = event.getGuild().getId();
-
- // Call the API to see if the guild is registered for Message Logging
- Optional response = registrationClient.getRegisteredGuild(guildId);
- response.ifPresent(success -> {
-
- // get the message id of the message which was deleted
- String messageId = event.getMessageId();
- // retrieve the channel id where the logs must be sent
- String channelIdToSendTo = success.getChannelId();
- // delete message
- MessageLogMessageDeleteEventHelper.deleteMessage(event, contentClient, messageId, channelIdToSendTo);
-
- });
- });
- }
-}
From 462460c522544ba655e1439581979f37b6f22d66 Mon Sep 17 00:00:00 2001
From: Egg-03 <111327101+eggy03@users.noreply.github.com>
Date: Mon, 1 Jun 2026 13:47:23 +0530
Subject: [PATCH 49/66] chore: replace `@NotNull` from jetbrains with
`@NonNull` from lombok
Signed-off-by: Egg-03 <111327101+eggy03@users.noreply.github.com>
---
.../bot/handlers/command/DebugCommandHandler.java | 15 +++++++--------
.../command/ServerStatCommandHandler.java | 15 +++++++--------
.../handlers/guild/GuildMemberEventHandler.java | 5 ++---
.../bot/handlers/guild/GuildPollEventHandler.java | 5 ++---
.../eggy03/papertrail/bot/utils/BooleanUtils.java | 7 +++----
.../bot/utils/auditlog/AutoModUtils.java | 5 ++---
.../bot/utils/auditlog/ChannelUtils.java | 15 +++++++--------
.../papertrail/bot/utils/auditlog/GuildUtils.java | 15 +++++++--------
.../bot/utils/auditlog/InviteUtils.java | 9 ++++-----
.../bot/utils/auditlog/MemberUtils.java | 5 ++---
.../bot/utils/auditlog/MessageUtils.java | 3 +--
.../bot/utils/auditlog/OnboardingUtils.java | 5 ++---
.../papertrail/bot/utils/auditlog/RoleUtils.java | 7 +++----
.../bot/utils/auditlog/ScheduledEventUtils.java | 5 ++---
.../bot/utils/auditlog/SoundboardUtils.java | 4 ++--
.../papertrail/bot/utils/auditlog/StageUtils.java | 4 ++--
.../bot/utils/auditlog/StickerUtils.java | 5 ++---
.../bot/utils/auditlog/ThreadUtils.java | 3 +--
.../bot/utils/auditlog/WebhookUtils.java | 3 +--
19 files changed, 59 insertions(+), 76 deletions(-)
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/handlers/command/DebugCommandHandler.java b/src/main/java/io/github/eggy03/papertrail/bot/handlers/command/DebugCommandHandler.java
index 90f6d44..29c1501 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/handlers/command/DebugCommandHandler.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/handlers/command/DebugCommandHandler.java
@@ -15,7 +15,6 @@
import net.dv8tion.jda.api.entities.channel.middleman.GuildChannel;
import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent;
import net.dv8tion.jda.api.utils.MarkdownUtil;
-import org.jetbrains.annotations.NotNull;
import java.awt.Color;
import java.time.Instant;
@@ -71,17 +70,17 @@ public void sendDebugInfo(@NonNull SlashCommandInteractionEvent event, @NonNull
event.getHook().editOriginalEmbeds(eb.build()).queue();
}
- @NotNull
+ @NonNull
private String getBotPermissions(@NonNull Guild guild) {
return formatPermissions(guild.getSelfMember().getPermissions());
}
- @NotNull
+ @NonNull
private String getBotPermissionsInCurrentChannel(@NonNull Guild guild, @NonNull GuildChannel channel) {
return formatPermissions(guild.getSelfMember().getPermissions(channel));
}
- @NotNull
+ @NonNull
private String formatPermissions(@NonNull EnumSet grantedGuildOrChannelPermissions) {
// gets all the permissions granted to the bot in the server as a whole or a particular channel
EnumSet grantedPermissions = EnumSet.copyOf(grantedGuildOrChannelPermissions);
@@ -114,7 +113,7 @@ private String formatPermissions(@NonNull EnumSet grantedGuildOrChan
return permString.toString().trim();
}
- @NotNull
+ @NonNull
private String getServerInfo(@NonNull Guild guild, @NonNull GuildChannel channel) {
return "Server Name: " + MarkdownUtil.underline(guild.getName()) + "\n" +
"Server ID: " + MarkdownUtil.underline(guild.getId()) + "\n" +
@@ -122,21 +121,21 @@ private String getServerInfo(@NonNull Guild guild, @NonNull GuildChannel channel
"Current Channel ID: " + MarkdownUtil.underline(channel.getId());
}
- @NotNull
+ @NonNull
private String getCallerInfo(@NonNull Member member) {
return "User Name: " + MarkdownUtil.underline(member.getUser().getEffectiveName()) + "\n" +
"User ID: " + MarkdownUtil.underline(member.getId()) + "\n" +
"Is Administrator: " + MarkdownUtil.underline(BooleanUtils.formatToYesOrNo(member.hasPermission(Permission.ADMINISTRATOR)));
}
- @NotNull
+ @NonNull
private String getBotInfo(@NonNull SlashCommandInteractionEvent event) {
JDA.ShardInfo shardInfo = event.getJDA().getShardInfo();
return "Current Shard ID: " + shardInfo.getShardId() + "\n" +
"Total Shards: " + shardInfo.getShardTotal();
}
- @NotNull
+ @NonNull
private String getConfigurationInfo(@NonNull Guild guild) {
StringBuilder sb = new StringBuilder();
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/handlers/command/ServerStatCommandHandler.java b/src/main/java/io/github/eggy03/papertrail/bot/handlers/command/ServerStatCommandHandler.java
index ed1a698..3c0e978 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/handlers/command/ServerStatCommandHandler.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/handlers/command/ServerStatCommandHandler.java
@@ -7,7 +7,6 @@
import net.dv8tion.jda.api.entities.Member;
import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent;
import net.dv8tion.jda.api.utils.MarkdownUtil;
-import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.awt.Color;
@@ -48,7 +47,7 @@ public void sendServerStats(@NonNull SlashCommandInteractionEvent event, @NonNul
event.getHook().editOriginalEmbeds(eb.build()).queue();
}
- @NotNull
+ @NonNull
private String getMemberAndBotCount(@NonNull Guild guild) {
List memberCache = guild.getMemberCache().asList();
@@ -58,36 +57,36 @@ private String getMemberAndBotCount(@NonNull Guild guild) {
return "Users: " + (allUserCount - botCount) + "\nBots: " + botCount + "\nTotal: " + allUserCount;
}
- @NotNull
+ @NonNull
private String getGuildOwner(@NonNull Guild guild) {
Member owner = guild.getOwner();
return owner == null ? "N/A" : owner.getAsMention();
}
- @NotNull
+ @NonNull
private String getGuildCreationDate(@NonNull Guild guild) {
return "";
}
- @NotNull
+ @NonNull
private String getGuildVanityUrl(@NonNull Guild guild) {
return guild.getVanityUrl() == null ? "N/A" : guild.getVanityUrl();
}
- @NotNull
+ @NonNull
private String getBoosters(@NonNull Guild guild) {
StringBuilder boosterString = new StringBuilder();
guild.getBoosters().forEach(booster -> boosterString.append(booster.getAsMention()).append(" "));
return boosterString.toString().trim().isEmpty() ? "No Boosters" : boosterString.toString().trim();
}
- @NotNull
+ @NonNull
private String getBoosterRole(@NonNull Guild guild) {
return guild.getBoostRole() != null ? guild.getBoostRole().getAsMention() : "No Boost Role Found";
}
- @NotNull
+ @NonNull
private String getDataRequestingMember(@Nullable Member requestingMember) {
return requestingMember != null ? requestingMember.getEffectiveName() : "N/A";
}
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/handlers/guild/GuildMemberEventHandler.java b/src/main/java/io/github/eggy03/papertrail/bot/handlers/guild/GuildMemberEventHandler.java
index 164dfe6..f1d01ba 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/handlers/guild/GuildMemberEventHandler.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/handlers/guild/GuildMemberEventHandler.java
@@ -18,7 +18,6 @@
import net.dv8tion.jda.api.events.guild.member.GuildMemberRemoveEvent;
import net.dv8tion.jda.api.utils.MarkdownUtil;
import org.apache.commons.lang3.StringUtils;
-import org.jetbrains.annotations.NotNull;
import java.awt.Color;
import java.time.Instant;
@@ -103,7 +102,7 @@ public void handleGuildMemberRemove(@NonNull GuildMemberRemoveEvent event) {
performChecksThenBuildAndSendEmbed(event, eb, channelIdToSendTo);
}
- @NotNull
+ @NonNull
private String getMemberJoinDate(@NonNull GuildMemberRemoveEvent event) {
Member member = event.getMember();
@@ -116,7 +115,7 @@ private String getMemberJoinDate(@NonNull GuildMemberRemoveEvent event) {
return "Unavailable";
}
- @NotNull
+ @NonNull
private String getMemberLeaveDate() {
return "";
}
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/handlers/guild/GuildPollEventHandler.java b/src/main/java/io/github/eggy03/papertrail/bot/handlers/guild/GuildPollEventHandler.java
index 7c50b8c..dc1f5fc 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/handlers/guild/GuildPollEventHandler.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/handlers/guild/GuildPollEventHandler.java
@@ -13,7 +13,6 @@
import net.dv8tion.jda.api.events.message.MessageReceivedEvent;
import net.dv8tion.jda.api.utils.MarkdownUtil;
import org.apache.commons.lang3.StringUtils;
-import org.jetbrains.annotations.NotNull;
import java.awt.Color;
import java.time.Instant;
@@ -74,7 +73,7 @@ public void handlePollCreationEvent(@NonNull MessageReceivedEvent event) {
}
- @NotNull
+ @NonNull
private String getMessagePollAnswers(@NonNull MessagePoll messagePoll) {
StringBuilder answers = new StringBuilder();
@@ -89,7 +88,7 @@ private String getMessagePollAnswers(@NonNull MessagePoll messagePoll) {
return answers.toString().trim();
}
- @NotNull
+ @NonNull
private String getPollExpiryTime(@NonNull MessagePoll messagePoll) {
return messagePoll.getTimeExpiresAt() != null ?
"" :
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/utils/BooleanUtils.java b/src/main/java/io/github/eggy03/papertrail/bot/utils/BooleanUtils.java
index 721aa84..8358f27 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/utils/BooleanUtils.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/utils/BooleanUtils.java
@@ -2,7 +2,6 @@
import lombok.NonNull;
import lombok.experimental.UtilityClass;
-import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@UtilityClass
@@ -11,7 +10,7 @@ public final class BooleanUtils {
@NonNull
private static final String FALLBACK_STRING = "N/A";
- @NotNull
+ @NonNull
public static String formatToEmoji(@Nullable Object booleanValueObject) {
if (booleanValueObject == null) {
@@ -24,7 +23,7 @@ public static String formatToEmoji(@Nullable Object booleanValueObject) {
return "❌";
}
- @NotNull
+ @NonNull
public static String formatToYesOrNo(@Nullable Object booleanValueObject) {
if (booleanValueObject == null) {
@@ -38,7 +37,7 @@ public static String formatToYesOrNo(@Nullable Object booleanValueObject) {
return "No";
}
- @NotNull
+ @NonNull
public static String formatToEnabledOrDisabled(@Nullable Object booleanValueObject) {
if (booleanValueObject == null) {
return FALLBACK_STRING;
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/AutoModUtils.java b/src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/AutoModUtils.java
index df72134..c98646f 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/AutoModUtils.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/AutoModUtils.java
@@ -5,7 +5,6 @@
import lombok.experimental.UtilityClass;
import net.dv8tion.jda.api.entities.automod.AutoModEventType;
import net.dv8tion.jda.api.entities.automod.AutoModTriggerType;
-import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@UtilityClass
@@ -14,7 +13,7 @@ public final class AutoModUtils {
@NonNull
public static final String FALLBACK_STRING = "N/A";
- @NotNull
+ @NonNull
public static String autoModEventTypeResolver(@Nullable Object autoModEventTypeInteger) {
Integer eventTypeInt = NumberParseUtils.parseInt(autoModEventTypeInteger);
if (eventTypeInt == null) {
@@ -24,7 +23,7 @@ public static String autoModEventTypeResolver(@Nullable Object autoModEventTypeI
return AutoModEventType.fromKey(eventTypeInt).name();
}
- @NotNull
+ @NonNull
public static String autoModTriggerTypeResolver(@Nullable Object autoModTriggerTypeInteger) {
Integer triggerTypeInt = NumberParseUtils.parseInt(autoModTriggerTypeInteger);
if (triggerTypeInt == null)
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/ChannelUtils.java b/src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/ChannelUtils.java
index 41692ea..d2c5f14 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/ChannelUtils.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/ChannelUtils.java
@@ -9,7 +9,6 @@
import net.dv8tion.jda.api.entities.Role;
import net.dv8tion.jda.api.entities.channel.ChannelType;
import net.dv8tion.jda.api.events.guild.GenericGuildEvent;
-import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.EnumSet;
@@ -24,7 +23,7 @@ public final class ChannelUtils {
/**
* can also be used for threads
*/
- @NotNull
+ @NonNull
public static String resolveChannelType(@Nullable Object channelTypeInteger) {
Integer channelType = NumberParseUtils.parseInt(channelTypeInteger);
@@ -34,7 +33,7 @@ public static String resolveChannelType(@Nullable Object channelTypeInteger) {
return ChannelType.fromId(channelType).name();
}
- @NotNull
+ @NonNull
public static String resolveVoiceChannelUserLimit(@Nullable Object limitNumber) {
Integer userLimit = NumberParseUtils.parseInt(limitNumber);
if (userLimit == null)
@@ -43,7 +42,7 @@ public static String resolveVoiceChannelUserLimit(@Nullable Object limitNumber)
return userLimit == 0 ? "Unlimited" : userLimit.toString();
}
- @NotNull
+ @NonNull
public static String resolveVoiceChannelBitrate(@Nullable Object bitrateInteger) {
Integer bitrate = NumberParseUtils.parseInt(bitrateInteger);
if (bitrate == null)
@@ -52,7 +51,7 @@ public static String resolveVoiceChannelBitrate(@Nullable Object bitrateInteger)
return (bitrate / 1000) + " kbps";
}
- @NotNull
+ @NonNull
public static String resolveVoiceChannelVideoQuality(@Nullable Object voiceChannelVideoQualityInteger) {
Integer videoQuality = NumberParseUtils.parseInt(voiceChannelVideoQualityInteger);
@@ -66,7 +65,7 @@ public static String resolveVoiceChannelVideoQuality(@Nullable Object voiceChann
}
// CHANNEL OVERRIDE UTILS
- @NotNull
+ @NonNull
public static String resolveChannelOverrideTargetType(@Nullable Object targetTypeInteger) {
Integer targetType = NumberParseUtils.parseInt(targetTypeInteger);
@@ -79,7 +78,7 @@ public static String resolveChannelOverrideTargetType(@Nullable Object targetTyp
}
- @NotNull
+ @NonNull
public static String resolveChannelOverridePermissions(@Nullable Object permissionValueLong, @NonNull String emoji) {
Long permissionValue = NumberParseUtils.parseLong(permissionValueLong);
@@ -101,7 +100,7 @@ public static String resolveChannelOverridePermissions(@Nullable Object permissi
}
// MISC UTILS
- @NotNull
+ @NonNull
public static String autoResolveMemberOrRole(@Nullable Object memberOrRoleId, @NonNull GenericGuildEvent event) {
if (memberOrRoleId == null) {
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/GuildUtils.java b/src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/GuildUtils.java
index bcb0671..bea40b4 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/GuildUtils.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/GuildUtils.java
@@ -8,7 +8,6 @@
import net.dv8tion.jda.api.entities.channel.middleman.GuildChannel;
import net.dv8tion.jda.api.entities.guild.SystemChannelFlag;
import net.dv8tion.jda.api.events.guild.GenericGuildEvent;
-import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@UtilityClass
@@ -18,7 +17,7 @@ public final class GuildUtils {
private static final String FALLBACK_STRING = "N/A";
// GUILD UTILS
- @NotNull
+ @NonNull
public static String resolveGuildVerificationLevel(@Nullable Object verificationLevelInteger) {
Integer verificationLevel = NumberParseUtils.parseInt(verificationLevelInteger);
@@ -34,7 +33,7 @@ public static String resolveGuildVerificationLevel(@Nullable Object verification
}
- @NotNull
+ @NonNull
public static String resolveGuildModActionMFALevel(@Nullable Object mfaLevelInteger) {
Integer mfaLevel = NumberParseUtils.parseInt(mfaLevelInteger);
if (mfaLevel == null)
@@ -44,7 +43,7 @@ public static String resolveGuildModActionMFALevel(@Nullable Object mfaLevelInte
}
- @NotNull
+ @NonNull
public static String resolveGuildDefaultMessageNotificationLevel(@Nullable Object notificationLevelInteger) {
Integer notificationLevel = NumberParseUtils.parseInt(notificationLevelInteger);
if (notificationLevel == null)
@@ -54,7 +53,7 @@ public static String resolveGuildDefaultMessageNotificationLevel(@Nullable Objec
}
- @NotNull
+ @NonNull
public static String resolveExplicitContentFilterLevel(@Nullable Object explicitContentFilterLevelInteger) {
Integer ecfLevel = NumberParseUtils.parseInt(explicitContentFilterLevelInteger);
if (ecfLevel == null)
@@ -63,7 +62,7 @@ public static String resolveExplicitContentFilterLevel(@Nullable Object explicit
return Guild.ExplicitContentLevel.fromKey(ecfLevel).getDescription();
}
- @NotNull
+ @NonNull
public static String resolveSystemChannelFlags(@Nullable Object systemChannelFlagsIntegerObject) {
Integer systemChannelFlagsInteger = NumberParseUtils.parseInt(systemChannelFlagsIntegerObject);
@@ -85,7 +84,7 @@ public static String resolveSystemChannelFlags(@Nullable Object systemChannelFla
}
// MISC GUILD UTILS (BROADER COVERAGE)
- @NotNull
+ @NonNull
public static String resolveMentionableChannel(@Nullable Object channelId, @NonNull GenericGuildEvent event) {
Long channelIdLong = NumberParseUtils.parseLong(channelId);
if (channelIdLong == null)
@@ -95,7 +94,7 @@ public static String resolveMentionableChannel(@Nullable Object channelId, @NonN
return channel != null ? channel.getAsMention() : channelIdLong.toString();
}
- @NotNull
+ @NonNull
public static String resolveOwnerName(@Nullable Object ownerId, @NonNull GenericGuildEvent event) {
Long ownerIdLong = NumberParseUtils.parseLong(ownerId);
if (ownerIdLong == null)
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/InviteUtils.java b/src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/InviteUtils.java
index 9386af9..79d13de 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/InviteUtils.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/InviteUtils.java
@@ -8,7 +8,6 @@
import net.dv8tion.jda.api.entities.channel.middleman.GuildChannel;
import net.dv8tion.jda.api.events.guild.GenericGuildEvent;
import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
-import org.jetbrains.annotations.NotNull;
import org.jspecify.annotations.Nullable;
import java.util.List;
@@ -20,7 +19,7 @@ public final class InviteUtils {
public static final String FALLBACK_STRING = "N/A";
- @NotNull
+ @NonNull
public static String resolveInviter(@Nullable Object inviterId, @NonNull GuildAuditLogEntryCreateEvent event) {
Long inviterIdLong = NumberParseUtils.parseLong(inviterId);
@@ -31,7 +30,7 @@ public static String resolveInviter(@Nullable Object inviterId, @NonNull GuildAu
return member != null ? member.getAsMention() : inviterIdLong.toString();
}
- @NotNull
+ @NonNull
public static String resolveInviteChannel(@Nullable Object inviteChannelId, @NonNull GuildAuditLogEntryCreateEvent event) {
Long inviteChannelIdLong = NumberParseUtils.parseLong(inviteChannelId);
@@ -42,7 +41,7 @@ public static String resolveInviteChannel(@Nullable Object inviteChannelId, @Non
return channel != null ? channel.getAsMention() : inviteChannelIdLong.toString();
}
- @NotNull
+ @NonNull
public static String resolveMaxUses(@Nullable Object usageCountIntegerObject) {
Integer maxUses = NumberParseUtils.parseInt(usageCountIntegerObject);
@@ -57,7 +56,7 @@ public static String resolveMaxUses(@Nullable Object usageCountIntegerObject) {
}
// the object is an array of Role IDs
- @NotNull
+ @NonNull
public static String resolveInviteRoleList(@NonNull GenericGuildEvent event, @Nullable Object inviteRoleObject) {
if (!(inviteRoleObject instanceof List> inviteRoleList) || inviteRoleList.isEmpty())
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/MemberUtils.java b/src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/MemberUtils.java
index f328a45..c6b3b40 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/MemberUtils.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/MemberUtils.java
@@ -7,7 +7,6 @@
import net.dv8tion.jda.api.entities.Role;
import net.dv8tion.jda.api.events.guild.GenericGuildEvent;
import net.dv8tion.jda.api.utils.MarkdownUtil;
-import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.List;
@@ -24,7 +23,7 @@ public final class MemberUtils {
// Parses an array list of map of role objects supplied by JDA
// roles are exposed as arraylists of maps [{name=role, id=1}, {name=role2, id=2}]
- @NotNull
+ @NonNull
public static String parseRoleListMap(@NonNull GenericGuildEvent event, @Nullable Object roleObject) {
if (!(roleObject instanceof List> roleList) || roleList.isEmpty())
@@ -42,7 +41,7 @@ public static String parseRoleListMap(@NonNull GenericGuildEvent event, @Nullabl
}
- @NotNull
+ @NonNull
@SuppressWarnings("all")
public static String resolveNickNameChanges(@Nullable Object oldNickValue, @Nullable Object newNickValue) {
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/MessageUtils.java b/src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/MessageUtils.java
index c28a984..b93b493 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/MessageUtils.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/MessageUtils.java
@@ -7,7 +7,6 @@
import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;
import net.dv8tion.jda.api.events.guild.GenericGuildEvent;
import org.jetbrains.annotations.Blocking;
-import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@UtilityClass
@@ -15,7 +14,7 @@ public final class MessageUtils {
private static final String FALLBACK_STRING = "N/A";
- @NotNull
+ @NonNull
@Blocking
public static String resolveMessageJumpUrlFromId(@Nullable Object channelId, @Nullable Object messageId, @NonNull GenericGuildEvent event) {
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/OnboardingUtils.java b/src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/OnboardingUtils.java
index d25c1be..fd8ff7d 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/OnboardingUtils.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/OnboardingUtils.java
@@ -6,7 +6,6 @@
import lombok.extern.slf4j.Slf4j;
import net.dv8tion.jda.api.entities.Guild;
import net.dv8tion.jda.api.entities.channel.middleman.GuildChannel;
-import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.List;
@@ -20,7 +19,7 @@ public final class OnboardingUtils {
@NonNull
public static final String FALLBACK_STRING = "N/A";
- @NotNull
+ @NonNull
public static String formatMode(@Nullable Object value) {
if (value == null) {
log.debug("format mode value was null");
@@ -37,7 +36,7 @@ public static String formatMode(@Nullable Object value) {
};
}
- @NotNull
+ @NonNull
public static String resolveChannelsFromList(@NonNull Guild guild, @Nullable Object value) {
if (!(value instanceof List> channelIdList) || channelIdList.isEmpty())
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/RoleUtils.java b/src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/RoleUtils.java
index 9fc50d7..c4c1fbf 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/RoleUtils.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/RoleUtils.java
@@ -5,7 +5,6 @@
import lombok.experimental.UtilityClass;
import lombok.extern.slf4j.Slf4j;
import net.dv8tion.jda.api.Permission;
-import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.EnumSet;
@@ -19,7 +18,7 @@ public final class RoleUtils {
@NonNull
private static final String FALLBACK_STRING = "N/A";
- @NotNull
+ @NonNull
public static String resolveRolePermissions(@Nullable Object permissionsValue, @NonNull String emoji) {
Long permissionLong = NumberParseUtils.parseLong(permissionsValue);
if (permissionLong == null)
@@ -41,7 +40,7 @@ public static String resolveRolePermissions(@Nullable Object permissionsValue, @
return permissions.toString().trim();
}
- @NotNull
+ @NonNull
public static String formatToHex(@Nullable Object colorValueInteger) {
if (colorValueInteger == null) {
@@ -67,7 +66,7 @@ public static String formatToHex(@Nullable Object colorValueInteger) {
* gradient is returned as a map in the following structure
* {"primary_color" = 123456789, "secondary_color" = 123456789, "tertiary_color" = 123456789}
*/
- @NotNull
+ @NonNull
public static String formatGradientToHex(@Nullable Object gradientMap) {
if (gradientMap == null) {
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/ScheduledEventUtils.java b/src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/ScheduledEventUtils.java
index 7cf0812..b80e3fc 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/ScheduledEventUtils.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/ScheduledEventUtils.java
@@ -5,7 +5,6 @@
import lombok.experimental.UtilityClass;
import lombok.extern.slf4j.Slf4j;
import net.dv8tion.jda.api.entities.ScheduledEvent;
-import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@UtilityClass
@@ -15,7 +14,7 @@ public final class ScheduledEventUtils {
@NonNull
public static final String FALLBACK_STRING = "N/A";
- @NotNull
+ @NonNull
public static String resolveEventType(@Nullable Object eventTypeInteger) {
Integer eventType = NumberParseUtils.parseInt(eventTypeInteger);
@@ -26,7 +25,7 @@ public static String resolveEventType(@Nullable Object eventTypeInteger) {
}
- @NotNull
+ @NonNull
public static String resolveStatusType(@Nullable Object eventTypeInteger) {
Integer eventType = NumberParseUtils.parseInt(eventTypeInteger);
if (eventType == null)
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/SoundboardUtils.java b/src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/SoundboardUtils.java
index c2aec4d..cae8c20 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/SoundboardUtils.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/SoundboardUtils.java
@@ -1,8 +1,8 @@
package io.github.eggy03.papertrail.bot.utils.auditlog;
import io.github.eggy03.papertrail.bot.utils.NumberParseUtils;
+import lombok.NonNull;
import lombok.experimental.UtilityClass;
-import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.math.RoundingMode;
@@ -10,7 +10,7 @@
@UtilityClass
public final class SoundboardUtils {
- @NotNull
+ @NonNull
public static String resolveVolumePercentage(@Nullable Object decimalVolume) {
Double volume = NumberParseUtils.parseDouble(decimalVolume, 4, RoundingMode.HALF_UP);
if (volume == null)
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/StageUtils.java b/src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/StageUtils.java
index 70f1da5..c881036 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/StageUtils.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/StageUtils.java
@@ -1,15 +1,15 @@
package io.github.eggy03.papertrail.bot.utils.auditlog;
import io.github.eggy03.papertrail.bot.utils.NumberParseUtils;
+import lombok.NonNull;
import lombok.experimental.UtilityClass;
import net.dv8tion.jda.api.entities.StageInstance;
-import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@UtilityClass
public final class StageUtils {
- @NotNull
+ @NonNull
public static String resolveStagePrivacyLevel(@Nullable Object stagePrivacyLevelInteger) {
Integer privacyLevel = NumberParseUtils.parseInt(stagePrivacyLevelInteger);
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/StickerUtils.java b/src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/StickerUtils.java
index e87600a..731420c 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/StickerUtils.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/StickerUtils.java
@@ -6,7 +6,6 @@
import net.dv8tion.jda.api.entities.emoji.Emoji;
import net.dv8tion.jda.api.entities.sticker.GuildSticker;
import net.dv8tion.jda.api.events.guild.GenericGuildEvent;
-import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@UtilityClass
@@ -16,7 +15,7 @@ public final class StickerUtils {
@NonNull
public static final String FALLBACK_STRING = "N/A";
- @NotNull
+ @NonNull
public static String resolveStickerUrl(@NonNull GenericGuildEvent event, @Nullable Object stickerIdObject) {
if (stickerIdObject == null) {
@@ -39,7 +38,7 @@ public static String resolveStickerUrl(@NonNull GenericGuildEvent event, @Nullab
// emojiIdObject does NOT give you snowflake IDs in case of Unicode emojis
// it only gives u IDs in case of custom emojis
// any values caught by NumberFormatException are Unicode emojis and can be returned raw
- @NotNull
+ @NonNull
public static String resolveRelatedEmoji(@NonNull GenericGuildEvent event, @Nullable Object emojiIdObject) {
if (emojiIdObject == null) {
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/ThreadUtils.java b/src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/ThreadUtils.java
index 987a4f4..efd6255 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/ThreadUtils.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/ThreadUtils.java
@@ -4,7 +4,6 @@
import lombok.NonNull;
import lombok.experimental.UtilityClass;
import net.dv8tion.jda.api.entities.channel.concrete.ThreadChannel;
-import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@UtilityClass
@@ -13,7 +12,7 @@ public final class ThreadUtils {
@NonNull
public static final String FALLBACK_STRING = "N/A";
- @NotNull
+ @NonNull
public static String resolveAutoArchiveDuration(@Nullable Object minutes) {
Integer minuteInt = NumberParseUtils.parseInt(minutes);
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/WebhookUtils.java b/src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/WebhookUtils.java
index 6e5812b..fc7201d 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/WebhookUtils.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/utils/auditlog/WebhookUtils.java
@@ -4,7 +4,6 @@
import lombok.NonNull;
import lombok.experimental.UtilityClass;
import lombok.extern.slf4j.Slf4j;
-import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@UtilityClass
@@ -14,7 +13,7 @@ public final class WebhookUtils {
@NonNull
public static final String FALLBACK_STRING = "N/A";
- @NotNull
+ @NonNull
public static String resolveWebhookEventType(@Nullable Object webhookInteger) {
Integer webhook = NumberParseUtils.parseInt(webhookInteger);
From ab11aac65adeb50639bdd7a7daefa9b353856e06 Mon Sep 17 00:00:00 2001
From: Egg-03 <111327101+eggy03@users.noreply.github.com>
Date: Mon, 1 Jun 2026 14:11:20 +0530
Subject: [PATCH 50/66] build: add quarkus packaging type
- Specify the project as a Quarkus application
- Enable Quarkus-specific build and packaging features
Signed-off-by: Egg-03 <111327101+eggy03@users.noreply.github.com>
---
pom.xml | 1 +
1 file changed, 1 insertion(+)
diff --git a/pom.xml b/pom.xml
index 1f9a840..3582e98 100644
--- a/pom.xml
+++ b/pom.xml
@@ -7,6 +7,7 @@
3.7.3
PaperTrail Bot
A simple bot for logging all server and member actions
+ quarkus
From 64862f6c11b11ed1c946878bf27397718a64c165 Mon Sep 17 00:00:00 2001
From: Egg-03 <111327101+eggy03@users.noreply.github.com>
Date: Mon, 1 Jun 2026 15:06:43 +0530
Subject: [PATCH 51/66] build: bump project version to `4.0.0-SNAPSHOT`
Signed-off-by: Egg-03 <111327101+eggy03@users.noreply.github.com>
---
pom.xml | 2 +-
.../io/github/eggy03/papertrail/bot/constant/ProjectInfo.java | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/pom.xml b/pom.xml
index 3582e98..95833ff 100644
--- a/pom.xml
+++ b/pom.xml
@@ -4,7 +4,7 @@
4.0.0
io.github.eggy03
papertrailbot
- 3.7.3
+ 4.0.0-SNAPSHOT
PaperTrail Bot
A simple bot for logging all server and member actions
quarkus
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/constant/ProjectInfo.java b/src/main/java/io/github/eggy03/papertrail/bot/constant/ProjectInfo.java
index bd74e91..c679edb 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/constant/ProjectInfo.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/constant/ProjectInfo.java
@@ -10,7 +10,7 @@ public final class ProjectInfo {
public static final String APPNAME = "PaperTrail";
@NonNull
- public static final String VERSION = "v3.7.3";
+ public static final String VERSION = "v4.0.0-SNAPSHOT";
@NonNull
public static final String PROJECT_ISSUE_LINK = "https://github.com/eggy03/PaperTrailBot/issues";
From 028250c765ca4fae9bfd8b8b1d46b298abd31256 Mon Sep 17 00:00:00 2001
From: Egg-03 <111327101+eggy03@users.noreply.github.com>
Date: Mon, 1 Jun 2026 15:08:03 +0530
Subject: [PATCH 52/66] build: update jar name
- Rename `papertrailbot-jar-with-dependencies.jar` to `papertrailbot-runner.jar` because of Quarkus
Signed-off-by: Egg-03 <111327101+eggy03@users.noreply.github.com>
---
Dockerfile | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Dockerfile b/Dockerfile
index ecaade8..8033b3a 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -23,6 +23,6 @@ WORKDIR /app
VOLUME /tmp
# Copy the JAR from the build stage
-COPY --from=build --chown=papertrail:papertrail /app/target/papertrailbot-jar-with-dependencies.jar papertrailbot.jar
+COPY --from=build --chown=papertrail:papertrail /app/target/papertrailbot-runner.jar papertrailbot.jar
USER papertrail
ENTRYPOINT ["java","-jar","papertrailbot.jar"]
\ No newline at end of file
From 4c65cc3205908f9362f9cb0985c7fc35c63b9549 Mon Sep 17 00:00:00 2001
From: Egg-03 <111327101+eggy03@users.noreply.github.com>
Date: Mon, 1 Jun 2026 19:13:22 +0530
Subject: [PATCH 53/66] build: bump papertrail-sdk version to 2.0.5
Signed-off-by: Egg-03 <111327101+eggy03@users.noreply.github.com>
---
pom.xml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/pom.xml b/pom.xml
index 95833ff..45f26b7 100644
--- a/pom.xml
+++ b/pom.xml
@@ -24,7 +24,7 @@
6.4.1
- 2.0.4
+ 2.0.5
3.20.0
33.5.0-jre
26.1.0
From 4e2a4c21993b36cd7da9c1e0508f841f143cce55 Mon Sep 17 00:00:00 2001
From: Egg-03 <111327101+eggy03@users.noreply.github.com>
Date: Mon, 1 Jun 2026 19:14:13 +0530
Subject: [PATCH 54/66] ci: update actions checkout and docker login versions
Signed-off-by: Egg-03 <111327101+eggy03@users.noreply.github.com>
---
.github/workflows/publish-container-image.yml | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/.github/workflows/publish-container-image.yml b/.github/workflows/publish-container-image.yml
index 3bddad8..1e5e65a 100644
--- a/.github/workflows/publish-container-image.yml
+++ b/.github/workflows/publish-container-image.yml
@@ -19,10 +19,10 @@ jobs:
steps:
- name: Checkout code
- uses: actions/checkout@v4
+ uses: actions/checkout@v6
- name: Log in to GHCR
- uses: docker/login-action@v3
+ uses: docker/login-action@v4
with:
registry: ${{ env.REGISTRY }}
username: ${{ github.actor }}
From 77fd0a6f0666706da4da181cc28d7b9de678ddc0 Mon Sep 17 00:00:00 2001
From: Egg-03 <111327101+eggy03@users.noreply.github.com>
Date: Mon, 1 Jun 2026 23:27:24 +0530
Subject: [PATCH 55/66] feat(health): add liveness and readiness checks
- Add `quarkus-smallrye-health` dependency to `pom.xml`
- Implement `LivenessCheckController` for JDA shard health monitoring
- Implement `ReadinessCheckController` to verify all JDA shards are connected
- Configure `quarkus.http.port` in `application.properties` for health endpoints
Signed-off-by: Egg-03 <111327101+eggy03@users.noreply.github.com>
---
pom.xml | 6 ++
.../controller/LivenessCheckController.java | 56 +++++++++++++++++++
.../controller/ReadinessCheckController.java | 48 ++++++++++++++++
src/main/resources/application.properties | 5 +-
4 files changed, 114 insertions(+), 1 deletion(-)
create mode 100644 src/main/java/io/github/eggy03/papertrail/bot/controller/LivenessCheckController.java
create mode 100644 src/main/java/io/github/eggy03/papertrail/bot/controller/ReadinessCheckController.java
diff --git a/pom.xml b/pom.xml
index 45f26b7..5a49d3f 100644
--- a/pom.xml
+++ b/pom.xml
@@ -55,6 +55,12 @@
quarkus-arc
+
+
+ io.quarkus
+ quarkus-smallrye-health
+
+
net.dv8tion
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/controller/LivenessCheckController.java b/src/main/java/io/github/eggy03/papertrail/bot/controller/LivenessCheckController.java
new file mode 100644
index 0000000..800d587
--- /dev/null
+++ b/src/main/java/io/github/eggy03/papertrail/bot/controller/LivenessCheckController.java
@@ -0,0 +1,56 @@
+package io.github.eggy03.papertrail.bot.controller;
+
+import jakarta.enterprise.context.ApplicationScoped;
+import jakarta.inject.Inject;
+import lombok.NonNull;
+import net.dv8tion.jda.api.JDA;
+import net.dv8tion.jda.api.sharding.ShardManager;
+import org.eclipse.microprofile.health.HealthCheck;
+import org.eclipse.microprofile.health.HealthCheckResponse;
+import org.eclipse.microprofile.health.Liveness;
+
+import java.util.Objects;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+@Liveness
+@ApplicationScoped
+public class LivenessCheckController implements HealthCheck {
+
+ private static final Set HEALTHY_STATUSES = Set.of(
+ JDA.Status.CONNECTED,
+ JDA.Status.ATTEMPTING_TO_RECONNECT,
+ JDA.Status.RECONNECT_QUEUED,
+ JDA.Status.WAITING_TO_RECONNECT
+ );
+
+ private final @NonNull ShardManager shardManager;
+
+ @Inject
+ public LivenessCheckController(@NonNull ShardManager shardManager) {
+ this.shardManager = shardManager;
+ }
+
+ @Override
+ public HealthCheckResponse call() {
+
+ if (HEALTHY_STATUSES.containsAll(shardManager.getStatuses().values())) {
+ return HealthCheckResponse.named("Liveness Check")
+ .withData("Shard Statuses", "All Shards are operating normally")
+ .up()
+ .build();
+ } else {
+ String shardStatuses = shardManager.getStatuses()
+ .values()
+ .stream()
+ .map(Objects::toString)
+ .collect(Collectors.joining(", "));
+
+ return HealthCheckResponse.named("Liveness Check")
+ .withData("Shard Statuses", shardStatuses)
+ .down()
+ .build();
+ }
+
+ }
+}
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/controller/ReadinessCheckController.java b/src/main/java/io/github/eggy03/papertrail/bot/controller/ReadinessCheckController.java
new file mode 100644
index 0000000..5a77f3e
--- /dev/null
+++ b/src/main/java/io/github/eggy03/papertrail/bot/controller/ReadinessCheckController.java
@@ -0,0 +1,48 @@
+package io.github.eggy03.papertrail.bot.controller;
+
+import jakarta.enterprise.context.ApplicationScoped;
+import jakarta.inject.Inject;
+import lombok.NonNull;
+import net.dv8tion.jda.api.JDA;
+import net.dv8tion.jda.api.sharding.ShardManager;
+import org.eclipse.microprofile.health.HealthCheck;
+import org.eclipse.microprofile.health.HealthCheckResponse;
+import org.eclipse.microprofile.health.Readiness;
+
+import java.util.Objects;
+import java.util.stream.Collectors;
+
+@Readiness
+@ApplicationScoped
+public class ReadinessCheckController implements HealthCheck {
+
+ private final @NonNull ShardManager shardManager;
+
+ @Inject
+ public ReadinessCheckController(@NonNull ShardManager shardManager) {
+ this.shardManager = shardManager;
+ }
+
+ @Override
+ public HealthCheckResponse call() {
+
+ if (shardManager.getStatuses().values().stream().allMatch(status -> status == JDA.Status.CONNECTED)) {
+ return HealthCheckResponse.named("Readiness Check")
+ .withData("Shard Statuses", "All Shards are connected")
+ .up()
+ .build();
+ } else {
+ String shardStatuses = shardManager.getStatuses()
+ .values()
+ .stream()
+ .map(Objects::toString)
+ .collect(Collectors.joining(", "));
+
+ return HealthCheckResponse.named("Readiness Check")
+ .withData("Shard Statuses", shardStatuses)
+ .down()
+ .build();
+ }
+
+ }
+}
diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties
index 446ca3d..7852822 100644
--- a/src/main/resources/application.properties
+++ b/src/main/resources/application.properties
@@ -1,5 +1,6 @@
# Token
discord.token=${TOKEN}
+
# PaperTrail API URL
api.url=${API_URL}
# Shard Config
@@ -14,4 +15,6 @@ quarkus.log.level=INFO
# Analytics
quarkus.analytics.disabled=true
# Banner
-quarkus.banner.path=banner.txt
\ No newline at end of file
+quarkus.banner.path=banner.txt
+#Port
+quarkus.http.port=${PORT:8080}
\ No newline at end of file
From 08b1475a9b02bd6a4cf9f9b12ea23b1c0ad40e05 Mon Sep 17 00:00:00 2001
From: Egg-03 <111327101+eggy03@users.noreply.github.com>
Date: Mon, 1 Jun 2026 23:29:25 +0530
Subject: [PATCH 56/66] chore(config): externalize log level
- Externalize `quarkus.log.level` to use `LOG_LEVEL` environment variable
Signed-off-by: Egg-03 <111327101+eggy03@users.noreply.github.com>
---
src/main/resources/application.properties | 14 ++++++++++----
1 file changed, 10 insertions(+), 4 deletions(-)
diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties
index 7852822..c5a3b59 100644
--- a/src/main/resources/application.properties
+++ b/src/main/resources/application.properties
@@ -3,18 +3,24 @@ discord.token=${TOKEN}
# PaperTrail API URL
api.url=${API_URL}
+
# Shard Config
min.shard.id=${MIN_SHARD_ID:0}
max.shard.id=${MAX_SHARD_ID:0}
total.shards=${TOTAL_SHARDS:1}
+
# Twilight HTTP Proxy URL
# default value is a whitespace
twilight.http.proxy.url=${TWILIGHT_HTTP_PROXY_URL: }
+
+#Port
+quarkus.http.port=${PORT:8080}
+
# Logging Level
-quarkus.log.level=INFO
+quarkus.log.level=${LOG_LEVEL:INFO}
+
# Analytics
quarkus.analytics.disabled=true
+
# Banner
-quarkus.banner.path=banner.txt
-#Port
-quarkus.http.port=${PORT:8080}
\ No newline at end of file
+quarkus.banner.path=banner.txt
\ No newline at end of file
From f57e5e2f61f25d59e107fd568770c92596f5035f Mon Sep 17 00:00:00 2001
From: Egg-03 <111327101+eggy03@users.noreply.github.com>
Date: Tue, 2 Jun 2026 00:04:24 +0530
Subject: [PATCH 57/66] docs: add health checks and custom port config info
Signed-off-by: Egg-03 <111327101+eggy03@users.noreply.github.com>
---
README.md | 35 ++++++++++++++++++++++++++++++++---
1 file changed, 32 insertions(+), 3 deletions(-)
diff --git a/README.md b/README.md
index a09d1d0..a80c433 100644
--- a/README.md
+++ b/README.md
@@ -13,6 +13,7 @@
* [Self-Host (Manual Configuration)](#self-host-manual-configuration)
* [Sharding (Advanced Configuration)](#sharding-advanced-configuration)
* [Synchronizing Rate Limits (Advanced Configuration)](#synchronizing-rate-limits-advanced-configuration)
+* [Health Checks and Custom Port Configuration](#health-checks-and-custom-port-configuration)
* [License](#license)
* [Help](#help)
@@ -300,12 +301,40 @@ as the instance-level. While this should not create functional conflicts,
it may lead to under-utilization of the rate limits provided by Discord and can reduce the overall throughput of your
bot cluster.
+# Health Checks and Custom Port Configuration
+
+## Health Checks
+
+Since v4, it is possible to get health information by probing any of the following health endpoints:
+
+| Endpoint | Description |
+|---------------------|-------------------------------------------------------------------------------------------------------|
+| `/q/health` | Aggregated health status containing all registered checks. |
+| `/q/health/live` | Liveness probe. Verifies that the bot process is healthy and that all shards are operating normally. |
+| `/q/health/ready` | Readiness probe. Verifies that all shards are fully connected to Discord and ready to receive events. |
+| `/q/health/started` | Startup probe. Indicates whether the application has completed its startup sequence. |
+
+### Liveness Check
+
+The liveness check reports **UP** when all shards belonging to this instance are in one of the following states:
+
+* `CONNECTED`
+* `ATTEMPTING_TO_RECONNECT`
+* `RECONNECT_QUEUED`
+* `WAITING_TO_RECONNECT`
+
+### Readiness Check
+
+The readiness check reports **UP** only when every shard belonging to this instance is fully `CONNECTED` to Discord.
+
+## Custom Port Configuration
+
+By, default PaperTrail runs on port 8080.
+You can alter this behavior by setting the `PORT` environment variable to a different port.
+
# License
This project is licensed under the [AGPLv3](/LICENSE) license.
-Read this
-easy-to-understand [Medium](https://medium.com/swlh/understanding-the-agpl-the-most-misunderstood-license-86fd1fe91275)
-article about AGPLv3 and it's scope.
# Help
From d55bb7a041ffba16bc35a57e142e0e8eb278717c Mon Sep 17 00:00:00 2001
From: Egg-03 <111327101+eggy03@users.noreply.github.com>
Date: Tue, 2 Jun 2026 09:34:10 +0530
Subject: [PATCH 58/66] build(native-image): add reflection metadata
Signed-off-by: Egg-03 <111327101+eggy03@users.noreply.github.com>
---
.../native-image/reachability-metadata.json | 79 +++++++++++++++++++
1 file changed, 79 insertions(+)
create mode 100644 src/main/resources/META-INF/io/github/eggy03/papertrailbot/native-image/reachability-metadata.json
diff --git a/src/main/resources/META-INF/io/github/eggy03/papertrailbot/native-image/reachability-metadata.json b/src/main/resources/META-INF/io/github/eggy03/papertrailbot/native-image/reachability-metadata.json
new file mode 100644
index 0000000..b355ce7
--- /dev/null
+++ b/src/main/resources/META-INF/io/github/eggy03/papertrailbot/native-image/reachability-metadata.json
@@ -0,0 +1,79 @@
+{
+ "reflection": [
+ {
+ "type": "io.github.eggy03.papertrail.sdk.client.AuditLogRegistrationClient"
+ },
+ {
+ "type": "io.github.eggy03.papertrail.sdk.client.MessageLogContentClient"
+ },
+ {
+ "type": "io.github.eggy03.papertrail.sdk.client.MessageLogRegistrationClient"
+ },
+ {
+ "type": "io.github.eggy03.papertrail.sdk.entity.AuditLogRegistrationEntity",
+ "allDeclaredConstructors": true,
+ "allDeclaredFields": true,
+ "allDeclaredMethods": true
+ },
+ {
+ "type": "io.github.eggy03.papertrail.sdk.entity.MessageLogContentEntity",
+ "allDeclaredConstructors": true,
+ "allDeclaredFields": true,
+ "allDeclaredMethods": true
+ },
+ {
+ "type": "io.github.eggy03.papertrail.sdk.entity.MessageLogRegistrationEntity",
+ "allDeclaredConstructors": true,
+ "allDeclaredFields": true,
+ "allDeclaredMethods": true
+ },
+ {
+ "type": "io.github.eggy03.papertrail.sdk.entity.ErrorEntity",
+ "allDeclaredConstructors": true,
+ "allDeclaredFields": true,
+ "allDeclaredMethods": true
+ },
+ {
+ "type": "net.dv8tion.jda.api.entities.User[]"
+ },
+ {
+ "type": "net.dv8tion.jda.api.entities.Role[]"
+ },
+ {
+ "type": "net.dv8tion.jda.api.entities.Guild[]"
+ },
+ {
+ "type": "net.dv8tion.jda.api.entities.Member[]"
+ },
+ {
+ "type": "net.dv8tion.jda.api.entities.ScheduledEvent[]"
+ },
+ {
+ "type": "net.dv8tion.jda.api.entities.ThreadMember[]"
+ },
+ {
+ "type": "net.dv8tion.jda.api.entities.channel.Channel[]"
+ },
+ {
+ "type": "net.dv8tion.jda.api.entities.channel.forums.ForumTag[]"
+ },
+ {
+ "type": "net.dv8tion.jda.api.entities.channel.middleman.GuildChannel[]"
+ },
+ {
+ "type": "net.dv8tion.jda.api.entities.emoji.RichCustomEmoji[]"
+ },
+ {
+ "type": "net.dv8tion.jda.api.entities.sticker.GuildSticker[]"
+ },
+ {
+ "type": "net.dv8tion.jda.api.managers.AudioManager[]"
+ },
+ {
+ "type": "net.dv8tion.jda.internal.entities.GuildVoiceStateImpl[]"
+ },
+ {
+ "type": "net.dv8tion.jda.internal.entities.MemberPresenceImpl[]"
+ }
+ ]
+}
\ No newline at end of file
From 3cd6870dc307c518e4edce81fe1b2be28d91d16c Mon Sep 17 00:00:00 2001
From: Egg-03 <111327101+eggy03@users.noreply.github.com>
Date: Tue, 2 Jun 2026 10:03:12 +0530
Subject: [PATCH 59/66] build: remove uber jar packaging system
- Remove `quarkus.package.jar.type` property from `pom.xml`
- Update `Dockerfile` to copy the `quarkus-app` directory
- Adjust `Dockerfile` entrypoint to `bot/quarkus-run.jar`
Signed-off-by: Egg-03 <111327101+eggy03@users.noreply.github.com>
---
Dockerfile | 4 ++--
pom.xml | 1 -
2 files changed, 2 insertions(+), 3 deletions(-)
diff --git a/Dockerfile b/Dockerfile
index 8033b3a..1a33fab 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -23,6 +23,6 @@ WORKDIR /app
VOLUME /tmp
# Copy the JAR from the build stage
-COPY --from=build --chown=papertrail:papertrail /app/target/papertrailbot-runner.jar papertrailbot.jar
+COPY --from=build --chown=papertrail:papertrail /app/target/quarkus-app bot
USER papertrail
-ENTRYPOINT ["java","-jar","papertrailbot.jar"]
\ No newline at end of file
+ENTRYPOINT ["java","-jar","bot/quarkus-run.jar"]
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index 5a49d3f..2828eaf 100644
--- a/pom.xml
+++ b/pom.xml
@@ -19,7 +19,6 @@
quarkus-bom
io.quarkus.platform
3.35.4
- uber-jar
true
From 205257a3384220ec4a71af91f68d94ba76570bbd Mon Sep 17 00:00:00 2001
From: Egg-03 <111327101+eggy03@users.noreply.github.com>
Date: Tue, 2 Jun 2026 13:30:04 +0530
Subject: [PATCH 60/66] docs: update to include an indefinite timeline for a
guideline
Signed-off-by: Egg-03 <111327101+eggy03@users.noreply.github.com>
---
CONTRIBUTING.md | 8 +++++---
1 file changed, 5 insertions(+), 3 deletions(-)
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index ebe3a02..77d3ebd 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -1,5 +1,7 @@
-This project does not accept pull requests.
+This project does not accept pull requests. I haven't been getting enough time to set up a contribution guideline.
+I will start accepting PRs once a guideline is in effect.
-If you would like to modify or extend the bot, please feel free to fork the repository and maintain your own version.
+Meanwhile, please feel free to fork the repository and maintain your own version. In case of any doubt or question
+regarding the codebase, you can open an issue in GitHub.
-Bug reports and suggestions are welcome through the Issues tab. I may review and address them as time permits.
\ No newline at end of file
+Bug reports and suggestions are also welcome through the Issues tab. I may review and address them as time permits.
\ No newline at end of file
From ee6dfee1880cae83fe7960601afffcd9c3f204ce Mon Sep 17 00:00:00 2001
From: Egg-03 <111327101+eggy03@users.noreply.github.com>
Date: Tue, 2 Jun 2026 14:21:41 +0530
Subject: [PATCH 61/66] docs: add ai usage declaration and policy
Signed-off-by: Egg-03 <111327101+eggy03@users.noreply.github.com>
---
README.md | 15 +++++++++++++++
1 file changed, 15 insertions(+)
diff --git a/README.md b/README.md
index a80c433..afec89b 100644
--- a/README.md
+++ b/README.md
@@ -15,6 +15,7 @@
* [Synchronizing Rate Limits (Advanced Configuration)](#synchronizing-rate-limits-advanced-configuration)
* [Health Checks and Custom Port Configuration](#health-checks-and-custom-port-configuration)
* [License](#license)
+* [AI Usage Declaration and Policy](#ai-usage-declaration-and-policy)
* [Help](#help)
# Overview
@@ -336,6 +337,20 @@ You can alter this behavior by setting the `PORT` environment variable to a diff
This project is licensed under the [AGPLv3](/LICENSE) license.
+# AI Usage Declaration and Policy
+
+No AI or LLM agents have been used to generate any part of the project's source code.
+This policy applies to all existing source code and future code contributions.
+
+After two years of development and manual testing, the application has reached a fairly stable and maintainable state.
+To preserve code quality, maintainability, format, and stability,
+AI-generated source code is **not accepted** for inclusion in this repository and the repositories related to the
+application.
+
+Limited use of AI for non-code tasks, such as commit message generation, spelling correction,
+or documentation proofreading, may be permitted at the maintainer's discretion.
+Such usage does not constitute authorship of the project's source code.
+
# Help
If you face any problems during self-hosting or have a question that needs to be answered, please feel free to
From 5adf49b94dc4fda9bb48f1e63b647d92c100591c Mon Sep 17 00:00:00 2001
From: Egg-03 <111327101+eggy03@users.noreply.github.com>
Date: Tue, 2 Jun 2026 14:23:53 +0530
Subject: [PATCH 62/66] build: set project version to 4.0.0
Signed-off-by: Egg-03 <111327101+eggy03@users.noreply.github.com>
---
pom.xml | 2 +-
.../io/github/eggy03/papertrail/bot/constant/ProjectInfo.java | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/pom.xml b/pom.xml
index 2828eaf..66576fb 100644
--- a/pom.xml
+++ b/pom.xml
@@ -4,7 +4,7 @@
4.0.0
io.github.eggy03
papertrailbot
- 4.0.0-SNAPSHOT
+ 4.0.0
PaperTrail Bot
A simple bot for logging all server and member actions
quarkus
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/constant/ProjectInfo.java b/src/main/java/io/github/eggy03/papertrail/bot/constant/ProjectInfo.java
index c679edb..c071194 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/constant/ProjectInfo.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/constant/ProjectInfo.java
@@ -10,7 +10,7 @@ public final class ProjectInfo {
public static final String APPNAME = "PaperTrail";
@NonNull
- public static final String VERSION = "v4.0.0-SNAPSHOT";
+ public static final String VERSION = "v4.0.0";
@NonNull
public static final String PROJECT_ISSUE_LINK = "https://github.com/eggy03/PaperTrailBot/issues";
From b749903ee4dc4d4e5a2378a27d97f847db86e96d Mon Sep 17 00:00:00 2001
From: Egg-03 <111327101+eggy03@users.noreply.github.com>
Date: Tue, 2 Jun 2026 19:30:21 +0530
Subject: [PATCH 63/66] docs: update proxy url environment variable name
Signed-off-by: Egg-03 <111327101+eggy03@users.noreply.github.com>
---
README.md | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/README.md b/README.md
index afec89b..0abcda7 100644
--- a/README.md
+++ b/README.md
@@ -279,9 +279,9 @@ This will set the discord token to `"my token"` and map the bound port to port `
Add the following environment variable to your bot:
-| Variable | Description |
-|-------------|----------------------------------------------------------------------------------------------------------------------------|
-| `PROXY_URL` | Base URL for the HTTP proxy that will receive Discord API requests instead of discord.com (Example: http://localhost:3000) |
+| Variable | Description |
+|---------------------------|----------------------------------------------------------------------------------------------------------------------------|
+| `TWILIGHT_HTTP_PROXY_URL` | Base URL for the HTTP proxy that will receive Discord API requests instead of discord.com (Example: http://localhost:3000) |
When configured, all Discord API requests made by the bot will be routed through the proxy.
From ad8fb5ab24117e0e09d3ee7abca8ff1c82cc80d6 Mon Sep 17 00:00:00 2001
From: Egg-03 <111327101+eggy03@users.noreply.github.com>
Date: Tue, 2 Jun 2026 19:43:36 +0530
Subject: [PATCH 64/66] docs: add default values and optionality to env var
tables
Signed-off-by: Egg-03 <111327101+eggy03@users.noreply.github.com>
---
README.md | 32 ++++++++++++++++++--------------
1 file changed, 18 insertions(+), 14 deletions(-)
diff --git a/README.md b/README.md
index 0abcda7..2e83dfa 100644
--- a/README.md
+++ b/README.md
@@ -99,10 +99,10 @@ Don't forget to copy the `bot token` as it will be required in the next step
### Step 2.2: Get Required Secrets
-| Variable | Description |
-|-----------|--------------------------------------------------------------------|
-| `TOKEN` | Discord application bot token (from the Developer Portal) |
-| `API_URL` | Internal URL of the PaperTrail API (e.g., `http://localhost:8080`) |
+| Variable | Description | Default Value | Optional |
+|-----------|--------------------------------------------------------------------|------------------|----------|
+| `TOKEN` | Discord application bot token (from the Developer Portal) | No Default Value | No |
+| `API_URL` | Internal URL of the PaperTrail API (e.g., `http://localhost:8080`) | No Default Value | No |
Example `.env` file:
@@ -174,11 +174,11 @@ Discord allows you to have up to 2500 guilds per shard but the recommended confi
You will need the following additional environment variables for custom shard configuration.
-| Variable | Description |
-|----------------|-------------------------------------------------------------------------------|
-| `TOTAL_SHARDS` | Total number of shards used by the bot across all running processes/instances |
-| `MIN_SHARD_ID` | The first shard ID handled by this specific bot instance |
-| `MAX_SHARD_ID` | The last shard ID handled by this specific bot instance |
+| Variable | Description | Default Value | Optional |
+|----------------|-------------------------------------------------------------------------------|---------------|----------|
+| `TOTAL_SHARDS` | Total number of shards used by the bot across all running processes/instances | 1 | Yes |
+| `MIN_SHARD_ID` | The first shard ID handled by this specific bot instance | 0 | Yes |
+| `MAX_SHARD_ID` | The last shard ID handled by this specific bot instance | 0 | Yes |
Shard IDs start at 0.
@@ -279,9 +279,9 @@ This will set the discord token to `"my token"` and map the bound port to port `
Add the following environment variable to your bot:
-| Variable | Description |
-|---------------------------|----------------------------------------------------------------------------------------------------------------------------|
-| `TWILIGHT_HTTP_PROXY_URL` | Base URL for the HTTP proxy that will receive Discord API requests instead of discord.com (Example: http://localhost:3000) |
+| Variable | Description | Default Value | Optional |
+|---------------------------|----------------------------------------------------------------------------------------------------------------------------|---------------|----------|
+| `TWILIGHT_HTTP_PROXY_URL` | Base URL for the HTTP proxy that will receive Discord API requests instead of discord.com (Example: http://localhost:3000) | Blank | Yes |
When configured, all Discord API requests made by the bot will be routed through the proxy.
@@ -330,8 +330,12 @@ The readiness check reports **UP** only when every shard belonging to this insta
## Custom Port Configuration
-By, default PaperTrail runs on port 8080.
-You can alter this behavior by setting the `PORT` environment variable to a different port.
+By, default PaperTrail runs on port 8080. If port 8080 is occupied by a different service, or you wish to
+run the application on a different port, you can manually set the `PORT` environment variable.
+
+| Variable | Description | Default Value | Optional |
+|----------|-------------------------------------------------------|---------------|----------|
+| `PORT` | Port Number on which the instance of the bot will run | 8080 | Yes |
# License
From 547dcf3623a4c9a4e31541e7e705d0908951db65 Mon Sep 17 00:00:00 2001
From: Egg-03 <111327101+eggy03@users.noreply.github.com>
Date: Tue, 2 Jun 2026 19:53:01 +0530
Subject: [PATCH 65/66] refactor: make GuildMemberEventHandler final
Signed-off-by: Egg-03 <111327101+eggy03@users.noreply.github.com>
---
.../papertrail/bot/handlers/guild/GuildMemberEventHandler.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/handlers/guild/GuildMemberEventHandler.java b/src/main/java/io/github/eggy03/papertrail/bot/handlers/guild/GuildMemberEventHandler.java
index f1d01ba..f170b2b 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/handlers/guild/GuildMemberEventHandler.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/handlers/guild/GuildMemberEventHandler.java
@@ -24,7 +24,7 @@
@ApplicationScoped
@Slf4j
-public class GuildMemberEventHandler {
+public final class GuildMemberEventHandler {
private final @NonNull AuditLogRegistrationClient client;
From 14c854321f9b24c38c61d666242a5de4c0cf7c4d Mon Sep 17 00:00:00 2001
From: Egg-03 <111327101+eggy03@users.noreply.github.com>
Date: Tue, 2 Jun 2026 19:53:11 +0530
Subject: [PATCH 66/66] refactor: make GuildMessageEventHandler final
Signed-off-by: Egg-03 <111327101+eggy03@users.noreply.github.com>
---
.../bot/handlers/message/GuildMessageEventHandler.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/main/java/io/github/eggy03/papertrail/bot/handlers/message/GuildMessageEventHandler.java b/src/main/java/io/github/eggy03/papertrail/bot/handlers/message/GuildMessageEventHandler.java
index 3d9ff0c..ea3cc44 100644
--- a/src/main/java/io/github/eggy03/papertrail/bot/handlers/message/GuildMessageEventHandler.java
+++ b/src/main/java/io/github/eggy03/papertrail/bot/handlers/message/GuildMessageEventHandler.java
@@ -26,7 +26,7 @@
@ApplicationScoped
@Slf4j
-public class GuildMessageEventHandler {
+public final class GuildMessageEventHandler {
private final @NonNull MessageLogRegistrationClient registrationClient;
private final @NonNull MessageLogContentClient contentClient;