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;