From ad10c0e1e78b71cc29ff3f1187532d28e20f1896 Mon Sep 17 00:00:00 2001
From: Egg-03 <111327101+eggy03@users.noreply.github.com>
Date: Fri, 14 Nov 2025 09:07:41 +0530
Subject: [PATCH 1/6] refactor(workspace): restructure packages and remove old
features (restructure)
This commit introduces a significant restructuring of the project's
package layout, moving common utilities and SDK components into a new
`commons` package. Listener classes have been reorganized into more
logical sub-packages based on their functionality (e.g., `auditlog`,
`messagelog`, `misc`).
Several deprecated commands and their associated listeners, including
`/about`, `/permcheck`, and the server boost listener, have been
removed. The project version has been
updated, and dependencies in `pom.xml` have been refreshed,
including the integration of Lombok.
---
pom.xml | 30 +++++--
.../org/papertrail/cleanup/package-info.java | 4 -
.../sdk/client/AuditLogClient.java | 10 +--
.../sdk/client/MessageContentLogClient.java | 10 +--
.../sdk/client/MessageLogClient.java | 10 +--
.../sdk/http/HttpServiceEngine.java | 4 +-
.../sdk/model/AuditLogObject.java | 2 +-
.../{ => commons}/sdk/model/ErrorObject.java | 2 +-
.../sdk/model/MessageContentObject.java | 2 +-
.../sdk/model/MessageLogObject.java | 2 +-
.../{ => commons}/sdk/package-info.java | 2 +-
.../utilities/ColorFormatter.java | 2 +-
.../utilities/DurationFormatter.java | 2 +-
.../{ => commons}/utilities/EnvConfig.java | 2 +-
.../GuildSystemChannelFlagResolver.java | 2 +-
.../utilities/MemberRoleUpdateParser.java | 2 +-
.../utilities/MessageEncryption.java | 2 +-
.../utilities/PermissionResolver.java | 2 +-
.../{ => commons}/utilities/TypeResolver.java | 2 +-
.../commons/version/ProjectInfo.java | 12 +++
.../event}/AuditLogListener.java | 20 ++---
.../GuildMemberJoinAndLeaveListener.java | 10 +--
.../helper}/GuildVoiceListener.java | 8 +-
.../setup}/AuditLogSetupCommandListener.java | 8 +-
.../BotInfoCommandListener.java | 41 ----------
...equiredPermissionCheckCommandListener.java | 82 -------------------
.../commandlisteners/package-info.java | 4 -
.../guildlisteners/ServerBoostListener.java | 75 -----------------
.../guildlisteners/package-info.java | 4 -
.../listeners/loglisteners/package-info.java | 4 -
.../memberlisteners/package-info.java | 5 --
.../event}/MessageLogListener.java | 14 ++--
.../MessageLogSetupCommandListener.java | 8 +-
.../misc}/ActivityUpdateListener.java | 2 +-
.../misc}/BotKickListener.java | 6 +-
.../BotSetupInstructionCommandListener.java} | 12 +--
.../ServerStatCommandListener.java | 4 +-
.../voicelisteners/package-info.java | 4 -
.../main/ConnectionInitializer.java | 6 +-
.../java/org/papertrail/main/FireRun.java | 26 +++---
.../main/SlashCommandRegistrar.java | 9 +-
.../org/papertrail/version/AuthorInfo.java | 12 ---
.../org/papertrail/version/ProjectInfo.java | 16 ----
.../org/papertrail/version/package-info.java | 4 -
44 files changed, 126 insertions(+), 364 deletions(-)
delete mode 100644 src/main/java/org/papertrail/cleanup/package-info.java
rename src/main/java/org/papertrail/{ => commons}/sdk/client/AuditLogClient.java (88%)
rename src/main/java/org/papertrail/{ => commons}/sdk/client/MessageContentLogClient.java (88%)
rename src/main/java/org/papertrail/{ => commons}/sdk/client/MessageLogClient.java (88%)
rename src/main/java/org/papertrail/{ => commons}/sdk/http/HttpServiceEngine.java (97%)
rename src/main/java/org/papertrail/{ => commons}/sdk/model/AuditLogObject.java (62%)
rename src/main/java/org/papertrail/{ => commons}/sdk/model/ErrorObject.java (77%)
rename src/main/java/org/papertrail/{ => commons}/sdk/model/MessageContentObject.java (70%)
rename src/main/java/org/papertrail/{ => commons}/sdk/model/MessageLogObject.java (62%)
rename src/main/java/org/papertrail/{ => commons}/sdk/package-info.java (68%)
rename src/main/java/org/papertrail/{ => commons}/utilities/ColorFormatter.java (97%)
rename src/main/java/org/papertrail/{ => commons}/utilities/DurationFormatter.java (98%)
rename src/main/java/org/papertrail/{ => commons}/utilities/EnvConfig.java (90%)
rename src/main/java/org/papertrail/{ => commons}/utilities/GuildSystemChannelFlagResolver.java (96%)
rename src/main/java/org/papertrail/{ => commons}/utilities/MemberRoleUpdateParser.java (97%)
rename src/main/java/org/papertrail/{ => commons}/utilities/MessageEncryption.java (97%)
rename src/main/java/org/papertrail/{ => commons}/utilities/PermissionResolver.java (98%)
rename src/main/java/org/papertrail/{ => commons}/utilities/TypeResolver.java (99%)
create mode 100644 src/main/java/org/papertrail/commons/version/ProjectInfo.java
rename src/main/java/org/papertrail/listeners/{loglisteners => auditlog/event}/AuditLogListener.java (99%)
rename src/main/java/org/papertrail/listeners/{memberlisteners => auditlog/helper}/GuildMemberJoinAndLeaveListener.java (94%)
rename src/main/java/org/papertrail/listeners/{voicelisteners => auditlog/helper}/GuildVoiceListener.java (93%)
rename src/main/java/org/papertrail/listeners/{commandlisteners => auditlog/setup}/AuditLogSetupCommandListener.java (96%)
delete mode 100644 src/main/java/org/papertrail/listeners/commandlisteners/BotInfoCommandListener.java
delete mode 100644 src/main/java/org/papertrail/listeners/commandlisteners/RequiredPermissionCheckCommandListener.java
delete mode 100644 src/main/java/org/papertrail/listeners/commandlisteners/package-info.java
delete mode 100644 src/main/java/org/papertrail/listeners/guildlisteners/ServerBoostListener.java
delete mode 100644 src/main/java/org/papertrail/listeners/guildlisteners/package-info.java
delete mode 100644 src/main/java/org/papertrail/listeners/loglisteners/package-info.java
delete mode 100644 src/main/java/org/papertrail/listeners/memberlisteners/package-info.java
rename src/main/java/org/papertrail/listeners/{loglisteners => messagelog/event}/MessageLogListener.java (95%)
rename src/main/java/org/papertrail/listeners/{commandlisteners => messagelog/setup}/MessageLogSetupCommandListener.java (96%)
rename src/main/java/org/papertrail/{main => listeners/misc}/ActivityUpdateListener.java (96%)
rename src/main/java/org/papertrail/{cleanup => listeners/misc}/BotKickListener.java (84%)
rename src/main/java/org/papertrail/listeners/{commandlisteners/BotSetupCommandListener.java => misc/BotSetupInstructionCommandListener.java} (85%)
rename src/main/java/org/papertrail/listeners/{commandlisteners => misc}/ServerStatCommandListener.java (97%)
delete mode 100644 src/main/java/org/papertrail/listeners/voicelisteners/package-info.java
delete mode 100644 src/main/java/org/papertrail/version/AuthorInfo.java
delete mode 100644 src/main/java/org/papertrail/version/ProjectInfo.java
delete mode 100644 src/main/java/org/papertrail/version/package-info.java
diff --git a/pom.xml b/pom.xml
index bc16fd13..c9d03841 100644
--- a/pom.xml
+++ b/pom.xml
@@ -2,7 +2,7 @@
4.0.0
org.egg.papertrail
paper-trail-bot
- 2.0.3
+ 3.0.0
PaperTrail
A simple bot for logging all user actions
@@ -10,6 +10,7 @@
UTF-8
21
21
+ 1.18.42
@@ -41,7 +42,7 @@
org.apache.commons
commons-lang3
- 3.18.0
+ 3.19.0
org.jasypt
@@ -75,19 +76,38 @@
gson
2.13.1
+
+ org.projectlombok
+ lombok
+ ${lombok.version}
+
-
+
${project.artifactId}
-
+
org.springframework.boot
spring-boot-maven-plugin
- 3.5.4
+ 3.5.7
org.papertrail.main.FireRun
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ 3.14.1
+
+
+
+ org.projectlombok
+ lombok
+ ${lombok.version}
+
+
+
+
diff --git a/src/main/java/org/papertrail/cleanup/package-info.java b/src/main/java/org/papertrail/cleanup/package-info.java
deleted file mode 100644
index 1d0a2b39..00000000
--- a/src/main/java/org/papertrail/cleanup/package-info.java
+++ /dev/null
@@ -1,4 +0,0 @@
-/**
- * This package contains Classes and Methods that perform auto-cleanup when the bot is kicked from a server
- */
-package org.papertrail.cleanup;
\ No newline at end of file
diff --git a/src/main/java/org/papertrail/sdk/client/AuditLogClient.java b/src/main/java/org/papertrail/commons/sdk/client/AuditLogClient.java
similarity index 88%
rename from src/main/java/org/papertrail/sdk/client/AuditLogClient.java
rename to src/main/java/org/papertrail/commons/sdk/client/AuditLogClient.java
index 1b168ce1..1b30ad63 100644
--- a/src/main/java/org/papertrail/sdk/client/AuditLogClient.java
+++ b/src/main/java/org/papertrail/commons/sdk/client/AuditLogClient.java
@@ -1,11 +1,11 @@
-package org.papertrail.sdk.client;
+package org.papertrail.commons.sdk.client;
import io.vavr.control.Either;
import org.jetbrains.annotations.NotNull;
-import org.papertrail.sdk.http.HttpServiceEngine;
-import org.papertrail.sdk.model.AuditLogObject;
-import org.papertrail.sdk.model.ErrorObject;
-import org.papertrail.utilities.EnvConfig;
+import org.papertrail.commons.sdk.http.HttpServiceEngine;
+import org.papertrail.commons.sdk.model.AuditLogObject;
+import org.papertrail.commons.sdk.model.ErrorObject;
+import org.papertrail.commons.utilities.EnvConfig;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
diff --git a/src/main/java/org/papertrail/sdk/client/MessageContentLogClient.java b/src/main/java/org/papertrail/commons/sdk/client/MessageContentLogClient.java
similarity index 88%
rename from src/main/java/org/papertrail/sdk/client/MessageContentLogClient.java
rename to src/main/java/org/papertrail/commons/sdk/client/MessageContentLogClient.java
index 4f609f15..201d66af 100644
--- a/src/main/java/org/papertrail/sdk/client/MessageContentLogClient.java
+++ b/src/main/java/org/papertrail/commons/sdk/client/MessageContentLogClient.java
@@ -1,11 +1,11 @@
-package org.papertrail.sdk.client;
+package org.papertrail.commons.sdk.client;
import io.vavr.control.Either;
import org.jetbrains.annotations.NotNull;
-import org.papertrail.sdk.http.HttpServiceEngine;
-import org.papertrail.sdk.model.ErrorObject;
-import org.papertrail.sdk.model.MessageContentObject;
-import org.papertrail.utilities.EnvConfig;
+import org.papertrail.commons.sdk.http.HttpServiceEngine;
+import org.papertrail.commons.sdk.model.ErrorObject;
+import org.papertrail.commons.sdk.model.MessageContentObject;
+import org.papertrail.commons.utilities.EnvConfig;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
diff --git a/src/main/java/org/papertrail/sdk/client/MessageLogClient.java b/src/main/java/org/papertrail/commons/sdk/client/MessageLogClient.java
similarity index 88%
rename from src/main/java/org/papertrail/sdk/client/MessageLogClient.java
rename to src/main/java/org/papertrail/commons/sdk/client/MessageLogClient.java
index 0e95224b..733e9d6a 100644
--- a/src/main/java/org/papertrail/sdk/client/MessageLogClient.java
+++ b/src/main/java/org/papertrail/commons/sdk/client/MessageLogClient.java
@@ -1,11 +1,11 @@
-package org.papertrail.sdk.client;
+package org.papertrail.commons.sdk.client;
import io.vavr.control.Either;
import org.jetbrains.annotations.NotNull;
-import org.papertrail.sdk.http.HttpServiceEngine;
-import org.papertrail.sdk.model.ErrorObject;
-import org.papertrail.sdk.model.MessageLogObject;
-import org.papertrail.utilities.EnvConfig;
+import org.papertrail.commons.sdk.http.HttpServiceEngine;
+import org.papertrail.commons.sdk.model.ErrorObject;
+import org.papertrail.commons.sdk.model.MessageLogObject;
+import org.papertrail.commons.utilities.EnvConfig;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
diff --git a/src/main/java/org/papertrail/sdk/http/HttpServiceEngine.java b/src/main/java/org/papertrail/commons/sdk/http/HttpServiceEngine.java
similarity index 97%
rename from src/main/java/org/papertrail/sdk/http/HttpServiceEngine.java
rename to src/main/java/org/papertrail/commons/sdk/http/HttpServiceEngine.java
index 69dcdfb8..3925408c 100644
--- a/src/main/java/org/papertrail/sdk/http/HttpServiceEngine.java
+++ b/src/main/java/org/papertrail/commons/sdk/http/HttpServiceEngine.java
@@ -1,8 +1,8 @@
-package org.papertrail.sdk.http;
+package org.papertrail.commons.sdk.http;
import io.vavr.control.Either;
import org.jetbrains.annotations.NotNull;
-import org.papertrail.sdk.model.ErrorObject;
+import org.papertrail.commons.sdk.model.ErrorObject;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.web.client.HttpClientErrorException;
diff --git a/src/main/java/org/papertrail/sdk/model/AuditLogObject.java b/src/main/java/org/papertrail/commons/sdk/model/AuditLogObject.java
similarity index 62%
rename from src/main/java/org/papertrail/sdk/model/AuditLogObject.java
rename to src/main/java/org/papertrail/commons/sdk/model/AuditLogObject.java
index 8c4df960..2d8c8243 100644
--- a/src/main/java/org/papertrail/sdk/model/AuditLogObject.java
+++ b/src/main/java/org/papertrail/commons/sdk/model/AuditLogObject.java
@@ -1,4 +1,4 @@
-package org.papertrail.sdk.model;
+package org.papertrail.commons.sdk.model;
public record AuditLogObject(String guildId, String channelId) {
diff --git a/src/main/java/org/papertrail/sdk/model/ErrorObject.java b/src/main/java/org/papertrail/commons/sdk/model/ErrorObject.java
similarity index 77%
rename from src/main/java/org/papertrail/sdk/model/ErrorObject.java
rename to src/main/java/org/papertrail/commons/sdk/model/ErrorObject.java
index a0ca5257..d5b11b73 100644
--- a/src/main/java/org/papertrail/sdk/model/ErrorObject.java
+++ b/src/main/java/org/papertrail/commons/sdk/model/ErrorObject.java
@@ -1,4 +1,4 @@
-package org.papertrail.sdk.model;
+package org.papertrail.commons.sdk.model;
public record ErrorObject(
int status,
diff --git a/src/main/java/org/papertrail/sdk/model/MessageContentObject.java b/src/main/java/org/papertrail/commons/sdk/model/MessageContentObject.java
similarity index 70%
rename from src/main/java/org/papertrail/sdk/model/MessageContentObject.java
rename to src/main/java/org/papertrail/commons/sdk/model/MessageContentObject.java
index 2d1cc70b..a6329ff3 100644
--- a/src/main/java/org/papertrail/sdk/model/MessageContentObject.java
+++ b/src/main/java/org/papertrail/commons/sdk/model/MessageContentObject.java
@@ -1,4 +1,4 @@
-package org.papertrail.sdk.model;
+package org.papertrail.commons.sdk.model;
public record MessageContentObject(String messageId, String messageContent, String authorId) {
}
diff --git a/src/main/java/org/papertrail/sdk/model/MessageLogObject.java b/src/main/java/org/papertrail/commons/sdk/model/MessageLogObject.java
similarity index 62%
rename from src/main/java/org/papertrail/sdk/model/MessageLogObject.java
rename to src/main/java/org/papertrail/commons/sdk/model/MessageLogObject.java
index f07c8a11..d4f41e40 100644
--- a/src/main/java/org/papertrail/sdk/model/MessageLogObject.java
+++ b/src/main/java/org/papertrail/commons/sdk/model/MessageLogObject.java
@@ -1,4 +1,4 @@
-package org.papertrail.sdk.model;
+package org.papertrail.commons.sdk.model;
public record MessageLogObject(String guildId, String channelId) {
diff --git a/src/main/java/org/papertrail/sdk/package-info.java b/src/main/java/org/papertrail/commons/sdk/package-info.java
similarity index 68%
rename from src/main/java/org/papertrail/sdk/package-info.java
rename to src/main/java/org/papertrail/commons/sdk/package-info.java
index 62ae26be..7cbd8608 100644
--- a/src/main/java/org/papertrail/sdk/package-info.java
+++ b/src/main/java/org/papertrail/commons/sdk/package-info.java
@@ -1,4 +1,4 @@
/**
* Embedded SDK for resolving calls to the PaperTrail PersistenceAPI
*/
-package org.papertrail.sdk;
+package org.papertrail.commons.sdk;
diff --git a/src/main/java/org/papertrail/utilities/ColorFormatter.java b/src/main/java/org/papertrail/commons/utilities/ColorFormatter.java
similarity index 97%
rename from src/main/java/org/papertrail/utilities/ColorFormatter.java
rename to src/main/java/org/papertrail/commons/utilities/ColorFormatter.java
index a1c0dfc2..9e421e3f 100644
--- a/src/main/java/org/papertrail/utilities/ColorFormatter.java
+++ b/src/main/java/org/papertrail/commons/utilities/ColorFormatter.java
@@ -1,4 +1,4 @@
-package org.papertrail.utilities;
+package org.papertrail.commons.utilities;
import java.util.HashMap;
import java.util.IllegalFormatException;
diff --git a/src/main/java/org/papertrail/utilities/DurationFormatter.java b/src/main/java/org/papertrail/commons/utilities/DurationFormatter.java
similarity index 98%
rename from src/main/java/org/papertrail/utilities/DurationFormatter.java
rename to src/main/java/org/papertrail/commons/utilities/DurationFormatter.java
index 8538182e..252dc007 100644
--- a/src/main/java/org/papertrail/utilities/DurationFormatter.java
+++ b/src/main/java/org/papertrail/commons/utilities/DurationFormatter.java
@@ -1,4 +1,4 @@
-package org.papertrail.utilities;
+package org.papertrail.commons.utilities;
import java.time.Duration;
import java.time.OffsetDateTime;
diff --git a/src/main/java/org/papertrail/utilities/EnvConfig.java b/src/main/java/org/papertrail/commons/utilities/EnvConfig.java
similarity index 90%
rename from src/main/java/org/papertrail/utilities/EnvConfig.java
rename to src/main/java/org/papertrail/commons/utilities/EnvConfig.java
index 4365f13e..d97efec2 100644
--- a/src/main/java/org/papertrail/utilities/EnvConfig.java
+++ b/src/main/java/org/papertrail/commons/utilities/EnvConfig.java
@@ -1,4 +1,4 @@
-package org.papertrail.utilities;
+package org.papertrail.commons.utilities;
import io.github.cdimascio.dotenv.Dotenv;
diff --git a/src/main/java/org/papertrail/utilities/GuildSystemChannelFlagResolver.java b/src/main/java/org/papertrail/commons/utilities/GuildSystemChannelFlagResolver.java
similarity index 96%
rename from src/main/java/org/papertrail/utilities/GuildSystemChannelFlagResolver.java
rename to src/main/java/org/papertrail/commons/utilities/GuildSystemChannelFlagResolver.java
index f79862fd..1c05ec21 100644
--- a/src/main/java/org/papertrail/utilities/GuildSystemChannelFlagResolver.java
+++ b/src/main/java/org/papertrail/commons/utilities/GuildSystemChannelFlagResolver.java
@@ -1,4 +1,4 @@
-package org.papertrail.utilities;
+package org.papertrail.commons.utilities;
import java.util.Map;
diff --git a/src/main/java/org/papertrail/utilities/MemberRoleUpdateParser.java b/src/main/java/org/papertrail/commons/utilities/MemberRoleUpdateParser.java
similarity index 97%
rename from src/main/java/org/papertrail/utilities/MemberRoleUpdateParser.java
rename to src/main/java/org/papertrail/commons/utilities/MemberRoleUpdateParser.java
index 1bdc8c10..0262fd42 100644
--- a/src/main/java/org/papertrail/utilities/MemberRoleUpdateParser.java
+++ b/src/main/java/org/papertrail/commons/utilities/MemberRoleUpdateParser.java
@@ -1,4 +1,4 @@
-package org.papertrail.utilities;
+package org.papertrail.commons.utilities;
import java.util.Collections;
import java.util.HashMap;
diff --git a/src/main/java/org/papertrail/utilities/MessageEncryption.java b/src/main/java/org/papertrail/commons/utilities/MessageEncryption.java
similarity index 97%
rename from src/main/java/org/papertrail/utilities/MessageEncryption.java
rename to src/main/java/org/papertrail/commons/utilities/MessageEncryption.java
index 986db862..5f502441 100644
--- a/src/main/java/org/papertrail/utilities/MessageEncryption.java
+++ b/src/main/java/org/papertrail/commons/utilities/MessageEncryption.java
@@ -1,4 +1,4 @@
-package org.papertrail.utilities;
+package org.papertrail.commons.utilities;
import org.jasypt.encryption.pbe.StandardPBEStringEncryptor;
import org.tinylog.Logger;
diff --git a/src/main/java/org/papertrail/utilities/PermissionResolver.java b/src/main/java/org/papertrail/commons/utilities/PermissionResolver.java
similarity index 98%
rename from src/main/java/org/papertrail/utilities/PermissionResolver.java
rename to src/main/java/org/papertrail/commons/utilities/PermissionResolver.java
index c198ccf3..25d98e9f 100644
--- a/src/main/java/org/papertrail/utilities/PermissionResolver.java
+++ b/src/main/java/org/papertrail/commons/utilities/PermissionResolver.java
@@ -1,4 +1,4 @@
-package org.papertrail.utilities;
+package org.papertrail.commons.utilities;
import java.util.Map;
diff --git a/src/main/java/org/papertrail/utilities/TypeResolver.java b/src/main/java/org/papertrail/commons/utilities/TypeResolver.java
similarity index 99%
rename from src/main/java/org/papertrail/utilities/TypeResolver.java
rename to src/main/java/org/papertrail/commons/utilities/TypeResolver.java
index 5a086e02..c4778112 100644
--- a/src/main/java/org/papertrail/utilities/TypeResolver.java
+++ b/src/main/java/org/papertrail/commons/utilities/TypeResolver.java
@@ -1,4 +1,4 @@
-package org.papertrail.utilities;
+package org.papertrail.commons.utilities;
/*
* Resolves Object sub-types from their given IDs
diff --git a/src/main/java/org/papertrail/commons/version/ProjectInfo.java b/src/main/java/org/papertrail/commons/version/ProjectInfo.java
new file mode 100644
index 00000000..bdf8f885
--- /dev/null
+++ b/src/main/java/org/papertrail/commons/version/ProjectInfo.java
@@ -0,0 +1,12 @@
+package org.papertrail.commons.version;
+
+public class ProjectInfo {
+
+ private ProjectInfo() {
+ throw new IllegalStateException("Utility Class");
+ }
+
+ public static final String APPNAME = "PaperTrail";
+ public static final String VERSION = "v3.0.0";
+ public static final String PROJECT_ISSUE_LINK="https://github.com/eggy03/PaperTrailBot/issues";
+}
diff --git a/src/main/java/org/papertrail/listeners/loglisteners/AuditLogListener.java b/src/main/java/org/papertrail/listeners/auditlog/event/AuditLogListener.java
similarity index 99%
rename from src/main/java/org/papertrail/listeners/loglisteners/AuditLogListener.java
rename to src/main/java/org/papertrail/listeners/auditlog/event/AuditLogListener.java
index 9dd2e1da..cdcccd67 100644
--- a/src/main/java/org/papertrail/listeners/loglisteners/AuditLogListener.java
+++ b/src/main/java/org/papertrail/listeners/auditlog/event/AuditLogListener.java
@@ -1,4 +1,4 @@
-package org.papertrail.listeners.loglisteners;
+package org.papertrail.listeners.auditlog.event;
import java.awt.Color;
import java.util.Map;
@@ -9,15 +9,15 @@
import io.vavr.control.Either;
import org.apache.commons.lang3.StringUtils;
import org.jetbrains.annotations.NotNull;
-import org.papertrail.sdk.client.AuditLogClient;
-import org.papertrail.sdk.model.AuditLogObject;
-import org.papertrail.sdk.model.ErrorObject;
-import org.papertrail.utilities.ColorFormatter;
-import org.papertrail.utilities.DurationFormatter;
-import org.papertrail.utilities.GuildSystemChannelFlagResolver;
-import org.papertrail.utilities.MemberRoleUpdateParser;
-import org.papertrail.utilities.PermissionResolver;
-import org.papertrail.utilities.TypeResolver;
+import org.papertrail.commons.sdk.client.AuditLogClient;
+import org.papertrail.commons.sdk.model.AuditLogObject;
+import org.papertrail.commons.sdk.model.ErrorObject;
+import org.papertrail.commons.utilities.ColorFormatter;
+import org.papertrail.commons.utilities.DurationFormatter;
+import org.papertrail.commons.utilities.GuildSystemChannelFlagResolver;
+import org.papertrail.commons.utilities.MemberRoleUpdateParser;
+import org.papertrail.commons.utilities.PermissionResolver;
+import org.papertrail.commons.utilities.TypeResolver;
import net.dv8tion.jda.api.EmbedBuilder;
import net.dv8tion.jda.api.audit.ActionType;
diff --git a/src/main/java/org/papertrail/listeners/memberlisteners/GuildMemberJoinAndLeaveListener.java b/src/main/java/org/papertrail/listeners/auditlog/helper/GuildMemberJoinAndLeaveListener.java
similarity index 94%
rename from src/main/java/org/papertrail/listeners/memberlisteners/GuildMemberJoinAndLeaveListener.java
rename to src/main/java/org/papertrail/listeners/auditlog/helper/GuildMemberJoinAndLeaveListener.java
index 21e4afba..f84df885 100644
--- a/src/main/java/org/papertrail/listeners/memberlisteners/GuildMemberJoinAndLeaveListener.java
+++ b/src/main/java/org/papertrail/listeners/auditlog/helper/GuildMemberJoinAndLeaveListener.java
@@ -1,4 +1,4 @@
-package org.papertrail.listeners.memberlisteners;
+package org.papertrail.listeners.auditlog.helper;
import io.vavr.control.Either;
import net.dv8tion.jda.api.EmbedBuilder;
@@ -10,10 +10,10 @@
import net.dv8tion.jda.api.events.guild.member.GuildMemberRemoveEvent;
import net.dv8tion.jda.api.hooks.ListenerAdapter;
import org.jetbrains.annotations.NotNull;
-import org.papertrail.sdk.client.AuditLogClient;
-import org.papertrail.sdk.model.AuditLogObject;
-import org.papertrail.sdk.model.ErrorObject;
-import org.papertrail.utilities.DurationFormatter;
+import org.papertrail.commons.sdk.client.AuditLogClient;
+import org.papertrail.commons.sdk.model.AuditLogObject;
+import org.papertrail.commons.sdk.model.ErrorObject;
+import org.papertrail.commons.utilities.DurationFormatter;
import java.awt.Color;
import java.time.Instant;
diff --git a/src/main/java/org/papertrail/listeners/voicelisteners/GuildVoiceListener.java b/src/main/java/org/papertrail/listeners/auditlog/helper/GuildVoiceListener.java
similarity index 93%
rename from src/main/java/org/papertrail/listeners/voicelisteners/GuildVoiceListener.java
rename to src/main/java/org/papertrail/listeners/auditlog/helper/GuildVoiceListener.java
index e9ee04d3..5b86e942 100644
--- a/src/main/java/org/papertrail/listeners/voicelisteners/GuildVoiceListener.java
+++ b/src/main/java/org/papertrail/listeners/auditlog/helper/GuildVoiceListener.java
@@ -1,4 +1,4 @@
-package org.papertrail.listeners.voicelisteners;
+package org.papertrail.listeners.auditlog.helper;
import java.awt.Color;
import java.time.Instant;
@@ -13,9 +13,9 @@
import net.dv8tion.jda.api.entities.channel.middleman.AudioChannel;
import net.dv8tion.jda.api.events.guild.voice.GuildVoiceUpdateEvent;
import net.dv8tion.jda.api.hooks.ListenerAdapter;
-import org.papertrail.sdk.client.AuditLogClient;
-import org.papertrail.sdk.model.AuditLogObject;
-import org.papertrail.sdk.model.ErrorObject;
+import org.papertrail.commons.sdk.client.AuditLogClient;
+import org.papertrail.commons.sdk.model.AuditLogObject;
+import org.papertrail.commons.sdk.model.ErrorObject;
public class GuildVoiceListener extends ListenerAdapter {
diff --git a/src/main/java/org/papertrail/listeners/commandlisteners/AuditLogSetupCommandListener.java b/src/main/java/org/papertrail/listeners/auditlog/setup/AuditLogSetupCommandListener.java
similarity index 96%
rename from src/main/java/org/papertrail/listeners/commandlisteners/AuditLogSetupCommandListener.java
rename to src/main/java/org/papertrail/listeners/auditlog/setup/AuditLogSetupCommandListener.java
index 0aeeefc6..0619871e 100644
--- a/src/main/java/org/papertrail/listeners/commandlisteners/AuditLogSetupCommandListener.java
+++ b/src/main/java/org/papertrail/listeners/auditlog/setup/AuditLogSetupCommandListener.java
@@ -1,12 +1,12 @@
-package org.papertrail.listeners.commandlisteners;
+package org.papertrail.listeners.auditlog.setup;
import java.awt.Color;
import java.util.Objects;
import io.vavr.control.Either;
-import org.papertrail.sdk.model.ErrorObject;
-import org.papertrail.sdk.client.AuditLogClient;
-import org.papertrail.sdk.model.AuditLogObject;
+import org.papertrail.commons.sdk.model.ErrorObject;
+import org.papertrail.commons.sdk.client.AuditLogClient;
+import org.papertrail.commons.sdk.model.AuditLogObject;
import net.dv8tion.jda.api.EmbedBuilder;
import net.dv8tion.jda.api.Permission;
diff --git a/src/main/java/org/papertrail/listeners/commandlisteners/BotInfoCommandListener.java b/src/main/java/org/papertrail/listeners/commandlisteners/BotInfoCommandListener.java
deleted file mode 100644
index 0829a6e8..00000000
--- a/src/main/java/org/papertrail/listeners/commandlisteners/BotInfoCommandListener.java
+++ /dev/null
@@ -1,41 +0,0 @@
-package org.papertrail.listeners.commandlisteners;
-
-import java.awt.Color;
-import java.time.Instant;
-
-import org.papertrail.version.AuthorInfo;
-import org.papertrail.version.ProjectInfo;
-
-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;
-
-public class BotInfoCommandListener extends ListenerAdapter {
-
- @Override
- public void onSlashCommandInteraction(SlashCommandInteractionEvent event) {
-
- if(event.getName().equals("about")) {
-
- EmbedBuilder eb = new EmbedBuilder();
- eb.setTitle("๐ About "+ProjectInfo.APPNAME+" ๐");
- eb.setDescription("๐ค Developed By: **"+AuthorInfo.AUTHOR_NAME+"**");
- eb.setThumbnail(AuthorInfo.AUTHOR_AVATAR_URL);
- eb.setColor(Color.PINK);
-
- eb.addField("๐ท๏ธ App Name", "โฐโโค"+ProjectInfo.APPNAME, false);
- eb.addField("โ๏ธ App Version", "โฐโโค"+ProjectInfo.VERSION, false);
- eb.addField("๐ App Source Code", "โฐโโค"+"[GitHub]("+ProjectInfo.PROJECT_LINK+")", false);
- eb.addField("๐ Privacy Policy", "โฐโโค"+"[Privacy.md]("+ProjectInfo.PRIVACY+")", false);
- eb.addField("๐ค Terms of Use", "โฐโโค"+"[Terms.md]("+ProjectInfo.TERMS+")", false);
-
- eb.setFooter(ProjectInfo.APPNAME+" "+ProjectInfo.VERSION);
- eb.setTimestamp(Instant.now());
-
- MessageEmbed mb = eb.build();
- event.replyEmbeds(mb).setEphemeral(false).queue();
- }
-
- }
-}
diff --git a/src/main/java/org/papertrail/listeners/commandlisteners/RequiredPermissionCheckCommandListener.java b/src/main/java/org/papertrail/listeners/commandlisteners/RequiredPermissionCheckCommandListener.java
deleted file mode 100644
index 95b88a56..00000000
--- a/src/main/java/org/papertrail/listeners/commandlisteners/RequiredPermissionCheckCommandListener.java
+++ /dev/null
@@ -1,82 +0,0 @@
-package org.papertrail.listeners.commandlisteners;
-
-import java.awt.Color;
-import java.util.EnumMap;
-import java.util.Map;
-
-import net.dv8tion.jda.api.EmbedBuilder;
-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.MessageEmbed;
-import net.dv8tion.jda.api.entities.Role;
-import net.dv8tion.jda.api.entities.SelfUser;
-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;
-
-public class RequiredPermissionCheckCommandListener extends ListenerAdapter {
-
- @Override
- public void onSlashCommandInteraction(SlashCommandInteractionEvent event) {
-
- if (event.getName().equals("permcheck")) {
-
- Guild guild = event.getGuild();
-
- SelfUser botAsUser = event.getJDA().getSelfUser();
- assert guild != null;
- Role botIntegrationRole = guild.getRoleByBot(botAsUser);
- Member botMember = guild.getMember(botAsUser);
-
- EmbedBuilder eb = new EmbedBuilder();
- eb.setTitle("PaperTrail Permissions Checker");
- eb.setDescription("Helps determine whether the required permissions are granted for PaperTrail to function properly");
- eb.setColor(Color.MAGENTA);
-
- assert botIntegrationRole != null;
- String botRoleRequiredPermissions = (botIntegrationRole.hasPermission(Permission.VIEW_AUDIT_LOGS) ? "โ
" : "โ") +
- Permission.VIEW_AUDIT_LOGS.getName() +
- System.lineSeparator() +
- (botIntegrationRole.hasPermission(Permission.MANAGE_SERVER) ? "โ
" : "โ") +
- Permission.MANAGE_SERVER.getName();
-
- eb.addField("Bot Integration Role Specific Permission", botRoleRequiredPermissions, false);
-
- // create a map of required permissions and set all their statuses to false
- Map requiredPermissions = new EnumMap<>(Permission.class);
- requiredPermissions.putAll(Map.of(
- Permission.MESSAGE_EMBED_LINKS, false,
- Permission.MESSAGE_HISTORY, false,
- Permission.MESSAGE_SEND, false,
- Permission.MESSAGE_SEND_IN_THREADS, false,
- Permission.VIEW_CHANNEL, false));
-
-
- GuildChannel currentChannel = guild.getGuildChannelById(event.getChannelIdLong());
-
- if(currentChannel==null || botMember == null) {
- eb.addField("Channel Specific Permissions","ERROR: Could not determine bot permissions for the given channel. Channel possibly not supported", false);
- } else {
- botMember.getPermissions(currentChannel).forEach(permission ->{
- if(requiredPermissions.containsKey(permission)) {
- requiredPermissions.replace(permission, true);
- }
- });
-
- StringBuilder finalPermissions = new StringBuilder();
- requiredPermissions.forEach((key, value) -> {
- finalPermissions.append(Boolean.TRUE.equals(value) ? "โ
" : "โ");
- finalPermissions.append(key.getName()).append(System.lineSeparator());
- });
-
-
- eb.addField("Channel Specific Permissions: "+currentChannel.getAsMention(), finalPermissions.toString(), false);
- }
-
-
- MessageEmbed mb = eb.build();
- event.replyEmbeds(mb).queue();
- }
- }
-}
diff --git a/src/main/java/org/papertrail/listeners/commandlisteners/package-info.java b/src/main/java/org/papertrail/listeners/commandlisteners/package-info.java
deleted file mode 100644
index dd37ae86..00000000
--- a/src/main/java/org/papertrail/listeners/commandlisteners/package-info.java
+++ /dev/null
@@ -1,4 +0,0 @@
-/**
- * This package contains classes that listen for slash commands
- */
-package org.papertrail.listeners.commandlisteners;
\ No newline at end of file
diff --git a/src/main/java/org/papertrail/listeners/guildlisteners/ServerBoostListener.java b/src/main/java/org/papertrail/listeners/guildlisteners/ServerBoostListener.java
deleted file mode 100644
index 9a9737fb..00000000
--- a/src/main/java/org/papertrail/listeners/guildlisteners/ServerBoostListener.java
+++ /dev/null
@@ -1,75 +0,0 @@
-package org.papertrail.listeners.guildlisteners;
-
-import java.awt.Color;
-import java.time.Instant;
-import java.time.OffsetDateTime;
-import java.util.Objects;
-import java.util.concurrent.Executor;
-
-import io.vavr.control.Either;
-import org.jetbrains.annotations.NotNull;
-
-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.MessageEmbed;
-import net.dv8tion.jda.api.events.guild.member.update.GuildMemberUpdateBoostTimeEvent;
-import net.dv8tion.jda.api.hooks.ListenerAdapter;
-import org.papertrail.sdk.client.AuditLogClient;
-import org.papertrail.sdk.model.AuditLogObject;
-import org.papertrail.sdk.model.ErrorObject;
-
-public class ServerBoostListener extends ListenerAdapter {
-
- private final Executor vThreadPool;
-
- public ServerBoostListener( Executor vThreadPool) {
- this.vThreadPool = vThreadPool;
- }
-
- @Override
- public void onGuildMemberUpdateBoostTime(@NotNull GuildMemberUpdateBoostTimeEvent event) {
-
- vThreadPool.execute(()->{
- // server boost logs are mapped to audit log table
- // Call the API and see if the event came from a registered Guild
- Either response = AuditLogClient.getRegisteredGuild(event.getGuild().getId());
- response.peek(success -> {
- String registeredChannelId= success.channelId();
-
- 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("๐ Server Boost Event ");
- eb.setThumbnail(guild.getIconUrl());
-
- if (newBoostTime != null) {
- eb.setDescription("๐ **" + guild.getName() + "** has been boosted!");
- eb.setColor(Color.PINK);
- eb.addField("๐ Booster Gained", "โฐโโค"+mentionableMember+" has started boosting your server", false);
- eb.addField("๐ Total Boosts In The Server", "โฐโโค"+guild.getBoostCount(), false);
- eb.addField("๐๏ธ Current Boost Tier", "โฐโโค"+ guild.getBoostTier(), false);
- } else {
- eb.setDescription("โ ๏ธ **" + guild.getName() + "** has lost a boost.");
- eb.setColor(Color.GRAY);
- eb.addField("๐ชซ Booster Lost", "โฐโโค"+mentionableMember+" has removed their boost from your server", false);
- eb.addField("๐ Remaining Boosts In The Server", "โฐโโค"+guild.getBoostCount(), false);
- eb.addField("๐๏ธ Current Boost Tier", "โฐโโค"+ guild.getBoostTier(), false);
- eb.addField("Notice", "Boosts remain active for a period even after a member stops boosting, so the server's boost count doesn't update immediately.", false);
- }
-
- eb.setFooter("Server Boost Detection");
- eb.setTimestamp(Instant.now());
-
- MessageEmbed mb = eb.build();
- Objects.requireNonNull(event.getGuild().getTextChannelById(registeredChannelId)).sendMessageEmbeds(mb).queue();
- });
-
- });
- }
-}
diff --git a/src/main/java/org/papertrail/listeners/guildlisteners/package-info.java b/src/main/java/org/papertrail/listeners/guildlisteners/package-info.java
deleted file mode 100644
index 210b11aa..00000000
--- a/src/main/java/org/papertrail/listeners/guildlisteners/package-info.java
+++ /dev/null
@@ -1,4 +0,0 @@
-/*
- * Groups listeners related to guild updates
- */
-package org.papertrail.listeners.guildlisteners;
\ No newline at end of file
diff --git a/src/main/java/org/papertrail/listeners/loglisteners/package-info.java b/src/main/java/org/papertrail/listeners/loglisteners/package-info.java
deleted file mode 100644
index 209ac0be..00000000
--- a/src/main/java/org/papertrail/listeners/loglisteners/package-info.java
+++ /dev/null
@@ -1,4 +0,0 @@
-/**
- * This package contains Classes and Methods that detect and parse audit and message log activities
- */
-package org.papertrail.listeners.loglisteners;
\ No newline at end of file
diff --git a/src/main/java/org/papertrail/listeners/memberlisteners/package-info.java b/src/main/java/org/papertrail/listeners/memberlisteners/package-info.java
deleted file mode 100644
index f3d22771..00000000
--- a/src/main/java/org/papertrail/listeners/memberlisteners/package-info.java
+++ /dev/null
@@ -1,5 +0,0 @@
-/*
- * This package contains Classes and Members that track Guild Member Activities
- *
- */
-package org.papertrail.listeners.memberlisteners;
\ No newline at end of file
diff --git a/src/main/java/org/papertrail/listeners/loglisteners/MessageLogListener.java b/src/main/java/org/papertrail/listeners/messagelog/event/MessageLogListener.java
similarity index 95%
rename from src/main/java/org/papertrail/listeners/loglisteners/MessageLogListener.java
rename to src/main/java/org/papertrail/listeners/messagelog/event/MessageLogListener.java
index dd91339f..29a6554d 100644
--- a/src/main/java/org/papertrail/listeners/loglisteners/MessageLogListener.java
+++ b/src/main/java/org/papertrail/listeners/messagelog/event/MessageLogListener.java
@@ -1,4 +1,4 @@
-package org.papertrail.listeners.loglisteners;
+package org.papertrail.listeners.messagelog.event;
import java.awt.Color;
import java.time.Instant;
@@ -21,12 +21,12 @@
import net.dv8tion.jda.api.events.message.MessageReceivedEvent;
import net.dv8tion.jda.api.events.message.MessageUpdateEvent;
import net.dv8tion.jda.api.hooks.ListenerAdapter;
-import org.papertrail.sdk.client.MessageContentLogClient;
-import org.papertrail.sdk.client.MessageLogClient;
-import org.papertrail.sdk.model.ErrorObject;
-import org.papertrail.sdk.model.MessageContentObject;
-import org.papertrail.sdk.model.MessageLogObject;
-import org.papertrail.utilities.MessageEncryption;
+import org.papertrail.commons.sdk.client.MessageContentLogClient;
+import org.papertrail.commons.sdk.client.MessageLogClient;
+import org.papertrail.commons.sdk.model.ErrorObject;
+import org.papertrail.commons.sdk.model.MessageContentObject;
+import org.papertrail.commons.sdk.model.MessageLogObject;
+import org.papertrail.commons.utilities.MessageEncryption;
import org.tinylog.Logger;
public class MessageLogListener extends ListenerAdapter {
diff --git a/src/main/java/org/papertrail/listeners/commandlisteners/MessageLogSetupCommandListener.java b/src/main/java/org/papertrail/listeners/messagelog/setup/MessageLogSetupCommandListener.java
similarity index 96%
rename from src/main/java/org/papertrail/listeners/commandlisteners/MessageLogSetupCommandListener.java
rename to src/main/java/org/papertrail/listeners/messagelog/setup/MessageLogSetupCommandListener.java
index 484f1fd7..ddd81b97 100644
--- a/src/main/java/org/papertrail/listeners/commandlisteners/MessageLogSetupCommandListener.java
+++ b/src/main/java/org/papertrail/listeners/messagelog/setup/MessageLogSetupCommandListener.java
@@ -1,12 +1,12 @@
-package org.papertrail.listeners.commandlisteners;
+package org.papertrail.listeners.messagelog.setup;
import java.awt.Color;
import java.util.Objects;
import io.vavr.control.Either;
-import org.papertrail.sdk.model.ErrorObject;
-import org.papertrail.sdk.client.MessageLogClient;
-import org.papertrail.sdk.model.MessageLogObject;
+import org.papertrail.commons.sdk.model.ErrorObject;
+import org.papertrail.commons.sdk.client.MessageLogClient;
+import org.papertrail.commons.sdk.model.MessageLogObject;
import net.dv8tion.jda.api.EmbedBuilder;
import net.dv8tion.jda.api.Permission;
diff --git a/src/main/java/org/papertrail/main/ActivityUpdateListener.java b/src/main/java/org/papertrail/listeners/misc/ActivityUpdateListener.java
similarity index 96%
rename from src/main/java/org/papertrail/main/ActivityUpdateListener.java
rename to src/main/java/org/papertrail/listeners/misc/ActivityUpdateListener.java
index a27252ce..b6e15878 100644
--- a/src/main/java/org/papertrail/main/ActivityUpdateListener.java
+++ b/src/main/java/org/papertrail/listeners/misc/ActivityUpdateListener.java
@@ -1,4 +1,4 @@
-package org.papertrail.main;
+package org.papertrail.listeners.misc;
import org.jetbrains.annotations.NotNull;
diff --git a/src/main/java/org/papertrail/cleanup/BotKickListener.java b/src/main/java/org/papertrail/listeners/misc/BotKickListener.java
similarity index 84%
rename from src/main/java/org/papertrail/cleanup/BotKickListener.java
rename to src/main/java/org/papertrail/listeners/misc/BotKickListener.java
index 3c3641eb..7ec29369 100644
--- a/src/main/java/org/papertrail/cleanup/BotKickListener.java
+++ b/src/main/java/org/papertrail/listeners/misc/BotKickListener.java
@@ -1,12 +1,12 @@
-package org.papertrail.cleanup;
+package org.papertrail.listeners.misc;
import org.jetbrains.annotations.NotNull;
import net.dv8tion.jda.api.entities.Guild;
import net.dv8tion.jda.api.events.guild.GuildLeaveEvent;
import net.dv8tion.jda.api.hooks.ListenerAdapter;
-import org.papertrail.sdk.client.AuditLogClient;
-import org.papertrail.sdk.client.MessageLogClient;
+import org.papertrail.commons.sdk.client.AuditLogClient;
+import org.papertrail.commons.sdk.client.MessageLogClient;
import java.util.concurrent.Executor;
diff --git a/src/main/java/org/papertrail/listeners/commandlisteners/BotSetupCommandListener.java b/src/main/java/org/papertrail/listeners/misc/BotSetupInstructionCommandListener.java
similarity index 85%
rename from src/main/java/org/papertrail/listeners/commandlisteners/BotSetupCommandListener.java
rename to src/main/java/org/papertrail/listeners/misc/BotSetupInstructionCommandListener.java
index 38af2756..8a7124d7 100644
--- a/src/main/java/org/papertrail/listeners/commandlisteners/BotSetupCommandListener.java
+++ b/src/main/java/org/papertrail/listeners/misc/BotSetupInstructionCommandListener.java
@@ -1,16 +1,16 @@
-package org.papertrail.listeners.commandlisteners;
+package org.papertrail.listeners.misc;
import java.awt.Color;
import java.time.Instant;
-import org.papertrail.version.ProjectInfo;
+import org.papertrail.commons.version.ProjectInfo;
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;
-public class BotSetupCommandListener extends ListenerAdapter {
+public class BotSetupInstructionCommandListener extends ListenerAdapter {
@Override
public void onSlashCommandInteraction(SlashCommandInteractionEvent event) {
@@ -54,12 +54,6 @@ public void onSlashCommandInteraction(SlashCommandInteractionEvent event) {
"- Use `/stats` to **get useful server information** like member count, channel count, and more.",
false);
- eb.addField("8๏ธโฃ Bot Information",
- "- Use `/about` to **view bot details**, including author info and version.",
- false);
-
- eb.addField("๐ก Permission Check","- Use `/permcheck` to **see if the bot has required permissions** in the **server** and in the **current channel**.",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());
diff --git a/src/main/java/org/papertrail/listeners/commandlisteners/ServerStatCommandListener.java b/src/main/java/org/papertrail/listeners/misc/ServerStatCommandListener.java
similarity index 97%
rename from src/main/java/org/papertrail/listeners/commandlisteners/ServerStatCommandListener.java
rename to src/main/java/org/papertrail/listeners/misc/ServerStatCommandListener.java
index cde7ea0c..fb39d721 100644
--- a/src/main/java/org/papertrail/listeners/commandlisteners/ServerStatCommandListener.java
+++ b/src/main/java/org/papertrail/listeners/misc/ServerStatCommandListener.java
@@ -1,11 +1,11 @@
-package org.papertrail.listeners.commandlisteners;
+package org.papertrail.listeners.misc;
import java.awt.Color;
import java.time.Instant;
import java.util.List;
import java.util.Objects;
-import org.papertrail.utilities.DurationFormatter;
+import org.papertrail.commons.utilities.DurationFormatter;
import net.dv8tion.jda.api.EmbedBuilder;
import net.dv8tion.jda.api.OnlineStatus;
diff --git a/src/main/java/org/papertrail/listeners/voicelisteners/package-info.java b/src/main/java/org/papertrail/listeners/voicelisteners/package-info.java
deleted file mode 100644
index 2b1293c9..00000000
--- a/src/main/java/org/papertrail/listeners/voicelisteners/package-info.java
+++ /dev/null
@@ -1,4 +0,0 @@
-/**
- * This package contains Classes and Methods that perform check for guild voice activity
- */
-package org.papertrail.listeners.voicelisteners;
\ No newline at end of file
diff --git a/src/main/java/org/papertrail/main/ConnectionInitializer.java b/src/main/java/org/papertrail/main/ConnectionInitializer.java
index 5cd06ea0..f028b25f 100644
--- a/src/main/java/org/papertrail/main/ConnectionInitializer.java
+++ b/src/main/java/org/papertrail/main/ConnectionInitializer.java
@@ -1,6 +1,6 @@
package org.papertrail.main;
-import org.papertrail.utilities.EnvConfig;
+import org.papertrail.commons.utilities.EnvConfig;
import net.dv8tion.jda.api.OnlineStatus;
import net.dv8tion.jda.api.requests.GatewayIntent;
@@ -9,6 +9,8 @@
import net.dv8tion.jda.api.utils.ChunkingFilter;
import net.dv8tion.jda.api.utils.MemberCachePolicy;
import net.dv8tion.jda.api.utils.cache.CacheFlag;
+import org.papertrail.listeners.misc.ActivityUpdateListener;
+
/*
* This class initializes the connection to discord and configures all the necessary intents
*/
@@ -48,7 +50,7 @@ public ConnectionInitializer() {
manager = builder.build();
manager.addEventListener(new ActivityUpdateListener(manager));
- // manager.addEventListener(new SlashCommandRegistrar());
+ manager.addEventListener(new SlashCommandRegistrar());
// re-enable it only when adding/updating/deleting commands
}
diff --git a/src/main/java/org/papertrail/main/FireRun.java b/src/main/java/org/papertrail/main/FireRun.java
index 28bf507f..910dc0cc 100644
--- a/src/main/java/org/papertrail/main/FireRun.java
+++ b/src/main/java/org/papertrail/main/FireRun.java
@@ -8,18 +8,15 @@
import net.dv8tion.jda.api.sharding.ShardManager;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
-import org.papertrail.cleanup.BotKickListener;
-import org.papertrail.listeners.commandlisteners.BotInfoCommandListener;
-import org.papertrail.listeners.commandlisteners.ServerStatCommandListener;
-import org.papertrail.listeners.commandlisteners.BotSetupCommandListener;
-import org.papertrail.listeners.commandlisteners.RequiredPermissionCheckCommandListener;
-import org.papertrail.listeners.guildlisteners.ServerBoostListener;
-import org.papertrail.listeners.loglisteners.AuditLogListener;
-import org.papertrail.listeners.commandlisteners.AuditLogSetupCommandListener;
-import org.papertrail.listeners.memberlisteners.GuildMemberJoinAndLeaveListener;
-import org.papertrail.listeners.commandlisteners.MessageLogSetupCommandListener;
-import org.papertrail.listeners.loglisteners.MessageLogListener;
-import org.papertrail.listeners.voicelisteners.GuildVoiceListener;
+import org.papertrail.listeners.misc.BotKickListener;
+import org.papertrail.listeners.misc.ServerStatCommandListener;
+import org.papertrail.listeners.misc.BotSetupInstructionCommandListener;
+import org.papertrail.listeners.auditlog.event.AuditLogListener;
+import org.papertrail.listeners.auditlog.setup.AuditLogSetupCommandListener;
+import org.papertrail.listeners.auditlog.helper.GuildMemberJoinAndLeaveListener;
+import org.papertrail.listeners.messagelog.setup.MessageLogSetupCommandListener;
+import org.papertrail.listeners.messagelog.event.MessageLogListener;
+import org.papertrail.listeners.auditlog.helper.GuildVoiceListener;
import org.tinylog.Logger;
import com.sun.net.httpserver.HttpExchange;
@@ -58,13 +55,10 @@ public static void main(String[] args) throws IOException {
manager.addEventListener(new GuildVoiceListener(vThreadPool));
manager.addEventListener(new GuildMemberJoinAndLeaveListener(vThreadPool));
- manager.addEventListener(new ServerBoostListener(vThreadPool));
manager.addEventListener(new BotKickListener(vThreadPool));
manager.addEventListener(new ServerStatCommandListener());
- manager.addEventListener(new BotInfoCommandListener());
- manager.addEventListener(new BotSetupCommandListener());
- manager.addEventListener(new RequiredPermissionCheckCommandListener());
+ manager.addEventListener(new BotSetupInstructionCommandListener());
// Custom health check endpoint
HttpServer server = HttpServer.create(new InetSocketAddress(8080), 0);
diff --git a/src/main/java/org/papertrail/main/SlashCommandRegistrar.java b/src/main/java/org/papertrail/main/SlashCommandRegistrar.java
index 453e35d0..db140812 100644
--- a/src/main/java/org/papertrail/main/SlashCommandRegistrar.java
+++ b/src/main/java/org/papertrail/main/SlashCommandRegistrar.java
@@ -33,19 +33,14 @@ private void setAuditLogCommands(JDA jda) {
CommandData serverStats = Commands.slash("stats",
"Provides Server Statistics");
- CommandData botInfo = Commands.slash("about",
- "Provides Bot Info");
+
CommandData setup = Commands.slash("setup", "Provides a guide on setting up the bot");
- CommandData permCheck = Commands.slash("permcheck", "Checks if the bot has the necessary permissions to operate");
-
jda.updateCommands()
.addCommands(auditLog,
messageLog,
serverStats,
- botInfo,
- setup,
- permCheck)
+ setup)
.queue();
}
}
diff --git a/src/main/java/org/papertrail/version/AuthorInfo.java b/src/main/java/org/papertrail/version/AuthorInfo.java
deleted file mode 100644
index b13c3b80..00000000
--- a/src/main/java/org/papertrail/version/AuthorInfo.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package org.papertrail.version;
-
-public class AuthorInfo {
-
- private AuthorInfo() {
- throw new IllegalStateException("Utility Class");
- }
-
- public static final String AUTHOR_NAME="Egg-03";
- public static final String AUTHOR_LINK = "https://github.com/eggy03";
- public static final String AUTHOR_AVATAR_URL="https://avatars.githubusercontent.com/eggy03";
-}
diff --git a/src/main/java/org/papertrail/version/ProjectInfo.java b/src/main/java/org/papertrail/version/ProjectInfo.java
deleted file mode 100644
index 6a5cb43c..00000000
--- a/src/main/java/org/papertrail/version/ProjectInfo.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package org.papertrail.version;
-
-public class ProjectInfo {
-
- private ProjectInfo() {
- throw new IllegalStateException("Utility Class");
- }
-
- public static final String APPNAME = "PaperTrail";
- public static final String VERSION = "v2.0.3";
- public static final String PROJECT_LINK = "https://github.com/eggy03/PaperTrailBot";
- public static final String PROJECT_ISSUE_LINK="https://github.com/eggy03/PaperTrailBot/issues";
-
- public static final String PRIVACY = "https://github.com/Egg-03/PaperTrailBot/blob/main/PRIVACY.md";
- public static final String TERMS = "https://github.com/Egg-03/PaperTrailBot/blob/main/TERMS.md";
-}
diff --git a/src/main/java/org/papertrail/version/package-info.java b/src/main/java/org/papertrail/version/package-info.java
deleted file mode 100644
index 26ad72c6..00000000
--- a/src/main/java/org/papertrail/version/package-info.java
+++ /dev/null
@@ -1,4 +0,0 @@
-/*
- * Package contains fields containing author and version info
- */
-package org.papertrail.version;
\ No newline at end of file
From ab35dfec141976380d9618417db391b4864f9521 Mon Sep 17 00:00:00 2001
From: Egg-03 <111327101+eggy03@users.noreply.github.com>
Date: Fri, 14 Nov 2025 13:55:39 +0530
Subject: [PATCH 2/6] refactor(api): extract audit log event formatting to
dedicated helpers
Refactor the monolithic AuditLogListener by extracting individual event
formatting logic into dedicated helper classes. This significantly
improves code organization, readability, and maintainability.
Also, restructure listener packages from 'auditlog' and 'messagelog'
to 'audit' and 'message' respectively, enhancing consistency and clarity
across the project.
---
README.md | 13 +-
.../audit/event/AuditLogListener.java | 189 ++
.../GuildMemberJoinAndLeaveListener.java | 4 +-
.../event}/GuildVoiceListener.java | 4 +-
...utoModerationFlagToChannelEventHelper.java | 35 +
...utoModerationMemberTimeoutEventHelper.java | 35 +
...ModerationRuleBlockMessageEventHelper.java | 35 +
.../AutoModerationRuleCreateEventHelper.java | 104 +
.../AutoModerationRuleDeleteEventHelper.java | 59 +
.../AutoModerationRuleUpdateEventHelper.java | 94 +
.../audit/helper/BanEventHelper.java | 46 +
.../audit/helper/BotAddEventHelper.java | 41 +
.../helper/ChannelCreateEventHelper.java | 87 +
.../helper/ChannelDeleteEventHelper.java | 69 +
.../ChannelOverrideCreateEventHelper.java | 95 +
.../ChannelOverrideDeleteEventHelper.java | 94 +
.../ChannelOverrideUpdateEventHelper.java | 96 +
.../helper/ChannelUpdateEventHelper.java | 114 +
.../audit/helper/EmojiCreateEventHelper.java | 57 +
.../audit/helper/EmojiDeleteEventHelper.java | 56 +
.../audit/helper/EmojiUpdateEventHelper.java | 56 +
.../helper/GenericAuditLogEventHelper.java | 44 +
.../audit/helper/GuildUpdateEventHelper.java | 126 +
.../helper/IntegrationCreateEventHelper.java | 59 +
.../helper/IntegrationDeleteEventHelper.java | 59 +
.../audit/helper/InviteCreateEventHelper.java | 81 +
.../audit/helper/InviteDeleteEventHelper.java | 74 +
.../audit/helper/KickEventHelper.java | 47 +
.../helper/MemberRoleUpdateEventHelper.java | 72 +
.../audit/helper/MemberUpdateEventHelper.java | 91 +
.../helper/MemberVoiceKickEventHelper.java | 37 +
.../helper/MemberVoiceMoveEventHelper.java | 37 +
.../audit/helper/MessagePinEventHelper.java | 37 +
.../audit/helper/MessageUnpinEventHelper.java | 36 +
.../audit/helper/RoleCreateEventHelper.java | 68 +
.../audit/helper/RoleDeleteEventHelper.java | 81 +
.../audit/helper/RoleUpdateEventHelper.java | 94 +
.../ScheduledEventCreateEventHelper.java | 79 +
.../ScheduledEventDeleteEventHelper.java | 79 +
.../ScheduledEventUpdateEventHelper.java | 88 +
.../StageInstanceCreateEventHelper.java | 58 +
.../StageInstanceDeleteEventHelper.java | 58 +
.../StageInstanceUpdateEventHelper.java | 60 +
.../helper/StickerCreateEventHelper.java | 73 +
.../helper/StickerDeleteEventHelper.java | 70 +
.../helper/StickerUpdateEventHelper.java | 72 +
.../audit/helper/ThreadCreateEventHelper.java | 83 +
.../audit/helper/ThreadDeleteEventHelper.java | 78 +
.../audit/helper/ThreadUpdateEventHelper.java | 98 +
.../audit/helper/UnbanEventHelper.java | 44 +
.../VoiceChannelStatusDeleteEventHelper.java | 39 +
.../VoiceChannelStatusUpdateEventHelper.java | 39 +
.../helper/WebhookCreateEventHelper.java | 69 +
.../helper/WebhookRemoveEventHelper.java | 69 +
.../helper/WebhookUpdateEventHelper.java | 70 +
.../setup/AuditLogSetupCommandListener.java | 2 +-
.../auditlog/event/AuditLogListener.java | 2676 -----------------
.../event/MessageLogListener.java | 2 +-
.../setup/MessageLogSetupCommandListener.java | 2 +-
.../java/org/papertrail/main/FireRun.java | 12 +-
60 files changed, 3652 insertions(+), 2694 deletions(-)
create mode 100644 src/main/java/org/papertrail/listeners/audit/event/AuditLogListener.java
rename src/main/java/org/papertrail/listeners/{auditlog/helper => audit/event}/GuildMemberJoinAndLeaveListener.java (95%)
rename src/main/java/org/papertrail/listeners/{auditlog/helper => audit/event}/GuildVoiceListener.java (93%)
create mode 100644 src/main/java/org/papertrail/listeners/audit/helper/AutoModerationFlagToChannelEventHelper.java
create mode 100644 src/main/java/org/papertrail/listeners/audit/helper/AutoModerationMemberTimeoutEventHelper.java
create mode 100644 src/main/java/org/papertrail/listeners/audit/helper/AutoModerationRuleBlockMessageEventHelper.java
create mode 100644 src/main/java/org/papertrail/listeners/audit/helper/AutoModerationRuleCreateEventHelper.java
create mode 100644 src/main/java/org/papertrail/listeners/audit/helper/AutoModerationRuleDeleteEventHelper.java
create mode 100644 src/main/java/org/papertrail/listeners/audit/helper/AutoModerationRuleUpdateEventHelper.java
create mode 100644 src/main/java/org/papertrail/listeners/audit/helper/BanEventHelper.java
create mode 100644 src/main/java/org/papertrail/listeners/audit/helper/BotAddEventHelper.java
create mode 100644 src/main/java/org/papertrail/listeners/audit/helper/ChannelCreateEventHelper.java
create mode 100644 src/main/java/org/papertrail/listeners/audit/helper/ChannelDeleteEventHelper.java
create mode 100644 src/main/java/org/papertrail/listeners/audit/helper/ChannelOverrideCreateEventHelper.java
create mode 100644 src/main/java/org/papertrail/listeners/audit/helper/ChannelOverrideDeleteEventHelper.java
create mode 100644 src/main/java/org/papertrail/listeners/audit/helper/ChannelOverrideUpdateEventHelper.java
create mode 100644 src/main/java/org/papertrail/listeners/audit/helper/ChannelUpdateEventHelper.java
create mode 100644 src/main/java/org/papertrail/listeners/audit/helper/EmojiCreateEventHelper.java
create mode 100644 src/main/java/org/papertrail/listeners/audit/helper/EmojiDeleteEventHelper.java
create mode 100644 src/main/java/org/papertrail/listeners/audit/helper/EmojiUpdateEventHelper.java
create mode 100644 src/main/java/org/papertrail/listeners/audit/helper/GenericAuditLogEventHelper.java
create mode 100644 src/main/java/org/papertrail/listeners/audit/helper/GuildUpdateEventHelper.java
create mode 100644 src/main/java/org/papertrail/listeners/audit/helper/IntegrationCreateEventHelper.java
create mode 100644 src/main/java/org/papertrail/listeners/audit/helper/IntegrationDeleteEventHelper.java
create mode 100644 src/main/java/org/papertrail/listeners/audit/helper/InviteCreateEventHelper.java
create mode 100644 src/main/java/org/papertrail/listeners/audit/helper/InviteDeleteEventHelper.java
create mode 100644 src/main/java/org/papertrail/listeners/audit/helper/KickEventHelper.java
create mode 100644 src/main/java/org/papertrail/listeners/audit/helper/MemberRoleUpdateEventHelper.java
create mode 100644 src/main/java/org/papertrail/listeners/audit/helper/MemberUpdateEventHelper.java
create mode 100644 src/main/java/org/papertrail/listeners/audit/helper/MemberVoiceKickEventHelper.java
create mode 100644 src/main/java/org/papertrail/listeners/audit/helper/MemberVoiceMoveEventHelper.java
create mode 100644 src/main/java/org/papertrail/listeners/audit/helper/MessagePinEventHelper.java
create mode 100644 src/main/java/org/papertrail/listeners/audit/helper/MessageUnpinEventHelper.java
create mode 100644 src/main/java/org/papertrail/listeners/audit/helper/RoleCreateEventHelper.java
create mode 100644 src/main/java/org/papertrail/listeners/audit/helper/RoleDeleteEventHelper.java
create mode 100644 src/main/java/org/papertrail/listeners/audit/helper/RoleUpdateEventHelper.java
create mode 100644 src/main/java/org/papertrail/listeners/audit/helper/ScheduledEventCreateEventHelper.java
create mode 100644 src/main/java/org/papertrail/listeners/audit/helper/ScheduledEventDeleteEventHelper.java
create mode 100644 src/main/java/org/papertrail/listeners/audit/helper/ScheduledEventUpdateEventHelper.java
create mode 100644 src/main/java/org/papertrail/listeners/audit/helper/StageInstanceCreateEventHelper.java
create mode 100644 src/main/java/org/papertrail/listeners/audit/helper/StageInstanceDeleteEventHelper.java
create mode 100644 src/main/java/org/papertrail/listeners/audit/helper/StageInstanceUpdateEventHelper.java
create mode 100644 src/main/java/org/papertrail/listeners/audit/helper/StickerCreateEventHelper.java
create mode 100644 src/main/java/org/papertrail/listeners/audit/helper/StickerDeleteEventHelper.java
create mode 100644 src/main/java/org/papertrail/listeners/audit/helper/StickerUpdateEventHelper.java
create mode 100644 src/main/java/org/papertrail/listeners/audit/helper/ThreadCreateEventHelper.java
create mode 100644 src/main/java/org/papertrail/listeners/audit/helper/ThreadDeleteEventHelper.java
create mode 100644 src/main/java/org/papertrail/listeners/audit/helper/ThreadUpdateEventHelper.java
create mode 100644 src/main/java/org/papertrail/listeners/audit/helper/UnbanEventHelper.java
create mode 100644 src/main/java/org/papertrail/listeners/audit/helper/VoiceChannelStatusDeleteEventHelper.java
create mode 100644 src/main/java/org/papertrail/listeners/audit/helper/VoiceChannelStatusUpdateEventHelper.java
create mode 100644 src/main/java/org/papertrail/listeners/audit/helper/WebhookCreateEventHelper.java
create mode 100644 src/main/java/org/papertrail/listeners/audit/helper/WebhookRemoveEventHelper.java
create mode 100644 src/main/java/org/papertrail/listeners/audit/helper/WebhookUpdateEventHelper.java
rename src/main/java/org/papertrail/listeners/{auditlog => audit}/setup/AuditLogSetupCommandListener.java (99%)
delete mode 100644 src/main/java/org/papertrail/listeners/auditlog/event/AuditLogListener.java
rename src/main/java/org/papertrail/listeners/{messagelog => message}/event/MessageLogListener.java (99%)
rename src/main/java/org/papertrail/listeners/{messagelog => message}/setup/MessageLogSetupCommandListener.java (99%)
diff --git a/README.md b/README.md
index e564c40d..3abb5936 100644
--- a/README.md
+++ b/README.md
@@ -3,18 +3,17 @@ PaperTrail is a free and open source, self-hostable and privacy friendly Discord
Key Features:
-- ๐ Full audit log integration (supports over 50+ event types) and generic support for unknown types
-- ๐ฌ Encrypted Message logging (edit, delete)
-- ๐ค Member activity tracking (joins, leaves, kicks, bans, updates)
-- ๐ Voice activity logging (join/leave, move)
-- ๐ Server boost tracking
-- ๐งฑ Auto-deletion of logged messages after 30 days
+- Full audit log integration (supports over 50+ event types) and generic support for unknown types
+- Encrypted Message logging (edit, delete)
+- Member activity tracking (joins, leaves, kicks, bans, updates)
+- Voice activity logging (join/leave, move)
+- Auto-deletion of logged messages after 30 days
> ๐ Get it from here: https://discord.com/discovery/applications/1381658412550590475
# Self-Hosting Guide
> [!IMPORTANT]
-> Please note that this is only for advanced users who want to self host this bot
+> Please note that this is only for advanced users who want to self-host this bot
>
> A pre-hosted instance is already available: https://discord.com/discovery/applications/1381658412550590475
>
diff --git a/src/main/java/org/papertrail/listeners/audit/event/AuditLogListener.java b/src/main/java/org/papertrail/listeners/audit/event/AuditLogListener.java
new file mode 100644
index 00000000..0e275d0e
--- /dev/null
+++ b/src/main/java/org/papertrail/listeners/audit/event/AuditLogListener.java
@@ -0,0 +1,189 @@
+package org.papertrail.listeners.audit.event;
+
+import io.vavr.control.Either;
+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 org.jetbrains.annotations.NotNull;
+import org.papertrail.commons.sdk.client.AuditLogClient;
+import org.papertrail.commons.sdk.model.AuditLogObject;
+import org.papertrail.commons.sdk.model.ErrorObject;
+import org.papertrail.listeners.audit.helper.AutoModerationFlagToChannelEventHelper;
+import org.papertrail.listeners.audit.helper.AutoModerationMemberTimeoutEventHelper;
+import org.papertrail.listeners.audit.helper.AutoModerationRuleBlockMessageEventHelper;
+import org.papertrail.listeners.audit.helper.AutoModerationRuleCreateEventHelper;
+import org.papertrail.listeners.audit.helper.AutoModerationRuleDeleteEventHelper;
+import org.papertrail.listeners.audit.helper.AutoModerationRuleUpdateEventHelper;
+import org.papertrail.listeners.audit.helper.BanEventHelper;
+import org.papertrail.listeners.audit.helper.BotAddEventHelper;
+import org.papertrail.listeners.audit.helper.ChannelCreateEventHelper;
+import org.papertrail.listeners.audit.helper.ChannelDeleteEventHelper;
+import org.papertrail.listeners.audit.helper.ChannelOverrideCreateEventHelper;
+import org.papertrail.listeners.audit.helper.ChannelOverrideDeleteEventHelper;
+import org.papertrail.listeners.audit.helper.ChannelOverrideUpdateEventHelper;
+import org.papertrail.listeners.audit.helper.ChannelUpdateEventHelper;
+import org.papertrail.listeners.audit.helper.EmojiCreateEventHelper;
+import org.papertrail.listeners.audit.helper.EmojiDeleteEventHelper;
+import org.papertrail.listeners.audit.helper.EmojiUpdateEventHelper;
+import org.papertrail.listeners.audit.helper.GenericAuditLogEventHelper;
+import org.papertrail.listeners.audit.helper.GuildUpdateEventHelper;
+import org.papertrail.listeners.audit.helper.IntegrationCreateEventHelper;
+import org.papertrail.listeners.audit.helper.IntegrationDeleteEventHelper;
+import org.papertrail.listeners.audit.helper.InviteCreateEventHelper;
+import org.papertrail.listeners.audit.helper.InviteDeleteEventHelper;
+import org.papertrail.listeners.audit.helper.KickEventHelper;
+import org.papertrail.listeners.audit.helper.MemberRoleUpdateEventHelper;
+import org.papertrail.listeners.audit.helper.MemberUpdateEventHelper;
+import org.papertrail.listeners.audit.helper.MemberVoiceKickEventHelper;
+import org.papertrail.listeners.audit.helper.MemberVoiceMoveEventHelper;
+import org.papertrail.listeners.audit.helper.MessagePinEventHelper;
+import org.papertrail.listeners.audit.helper.MessageUnpinEventHelper;
+import org.papertrail.listeners.audit.helper.RoleCreateEventHelper;
+import org.papertrail.listeners.audit.helper.RoleDeleteEventHelper;
+import org.papertrail.listeners.audit.helper.RoleUpdateEventHelper;
+import org.papertrail.listeners.audit.helper.ScheduledEventCreateEventHelper;
+import org.papertrail.listeners.audit.helper.ScheduledEventDeleteEventHelper;
+import org.papertrail.listeners.audit.helper.ScheduledEventUpdateEventHelper;
+import org.papertrail.listeners.audit.helper.StageInstanceCreateEventHelper;
+import org.papertrail.listeners.audit.helper.StageInstanceDeleteEventHelper;
+import org.papertrail.listeners.audit.helper.StageInstanceUpdateEventHelper;
+import org.papertrail.listeners.audit.helper.StickerCreateEventHelper;
+import org.papertrail.listeners.audit.helper.StickerDeleteEventHelper;
+import org.papertrail.listeners.audit.helper.StickerUpdateEventHelper;
+import org.papertrail.listeners.audit.helper.ThreadCreateEventHelper;
+import org.papertrail.listeners.audit.helper.ThreadDeleteEventHelper;
+import org.papertrail.listeners.audit.helper.ThreadUpdateEventHelper;
+import org.papertrail.listeners.audit.helper.UnbanEventHelper;
+import org.papertrail.listeners.audit.helper.VoiceChannelStatusDeleteEventHelper;
+import org.papertrail.listeners.audit.helper.VoiceChannelStatusUpdateEventHelper;
+import org.papertrail.listeners.audit.helper.WebhookCreateEventHelper;
+import org.papertrail.listeners.audit.helper.WebhookRemoveEventHelper;
+import org.papertrail.listeners.audit.helper.WebhookUpdateEventHelper;
+
+import java.util.Objects;
+import java.util.concurrent.Executor;
+
+@Slf4j
+public class AuditLogListener extends ListenerAdapter {
+
+ private final Executor vThreadPool;
+
+ public AuditLogListener(Executor vThreadPool) {
+ this.vThreadPool = vThreadPool;
+ }
+
+ @Override
+ public void onGuildAuditLogEntryCreate(@NotNull GuildAuditLogEntryCreateEvent event) {
+ vThreadPool.execute(() -> {
+ // Call the API and see if the event came from a registered Guild
+ Either response = AuditLogClient.getRegisteredGuild(event.getGuild().getId());
+ response.peek(success -> {
+ AuditLogEntry ale = event.getEntry();
+ auditLogParser(event, ale, success.channelId());
+ });
+ });
+ }
+
+ private void auditLogParser(GuildAuditLogEntryCreateEvent event, AuditLogEntry ale, String channelIdToSendTo) {
+ ActionType action = ale.getType();
+ switch (action) {
+
+ case AUTO_MODERATION_FLAG_TO_CHANNEL ->
+ AutoModerationFlagToChannelEventHelper.format(event, ale, channelIdToSendTo);
+ case AUTO_MODERATION_MEMBER_TIMEOUT ->
+ AutoModerationMemberTimeoutEventHelper.format(event, ale, channelIdToSendTo);
+ case AUTO_MODERATION_RULE_BLOCK_MESSAGE ->
+ AutoModerationRuleBlockMessageEventHelper.format(event, ale, channelIdToSendTo);
+ case AUTO_MODERATION_RULE_CREATE ->
+ AutoModerationRuleCreateEventHelper.format(event, ale, channelIdToSendTo);
+ case AUTO_MODERATION_RULE_UPDATE ->
+ AutoModerationRuleUpdateEventHelper.format(event, ale, channelIdToSendTo);
+ case AUTO_MODERATION_RULE_DELETE ->
+ AutoModerationRuleDeleteEventHelper.format(event, ale, channelIdToSendTo);
+
+ case KICK -> KickEventHelper.format(event, ale, channelIdToSendTo);
+ case BAN -> BanEventHelper.format(event, ale, channelIdToSendTo);
+ case UNBAN -> UnbanEventHelper.format(event, ale, channelIdToSendTo);
+ case BOT_ADD -> BotAddEventHelper.format(event, ale, channelIdToSendTo);
+ // PRUNE has generic formatting
+
+ case CHANNEL_CREATE -> ChannelCreateEventHelper.format(event, ale, channelIdToSendTo);
+ case CHANNEL_UPDATE -> ChannelUpdateEventHelper.format(event, ale, channelIdToSendTo);
+ case CHANNEL_DELETE -> ChannelDeleteEventHelper.format(event, ale, channelIdToSendTo);
+ case CHANNEL_OVERRIDE_CREATE -> ChannelOverrideCreateEventHelper.format(event, ale, channelIdToSendTo);
+ case CHANNEL_OVERRIDE_UPDATE -> ChannelOverrideUpdateEventHelper.format(event, ale, channelIdToSendTo);
+ case CHANNEL_OVERRIDE_DELETE -> ChannelOverrideDeleteEventHelper.format(event, ale, channelIdToSendTo);
+
+ case ROLE_CREATE -> RoleCreateEventHelper.format(event, ale, channelIdToSendTo);
+ case ROLE_UPDATE -> RoleUpdateEventHelper.format(event, ale, channelIdToSendTo);
+ case ROLE_DELETE -> RoleDeleteEventHelper.format(event, ale, channelIdToSendTo);
+
+ case EMOJI_CREATE -> EmojiCreateEventHelper.format(event, ale, channelIdToSendTo);
+ case EMOJI_UPDATE -> EmojiUpdateEventHelper.format(event, ale, channelIdToSendTo);
+ case EMOJI_DELETE -> EmojiDeleteEventHelper.format(event, ale, channelIdToSendTo);
+
+ case STICKER_CREATE -> StickerCreateEventHelper.format(event, ale, channelIdToSendTo);
+ case STICKER_UPDATE -> StickerUpdateEventHelper.format(event, ale, channelIdToSendTo);
+ case STICKER_DELETE -> StickerDeleteEventHelper.format(event, ale, channelIdToSendTo);
+
+ case GUILD_UPDATE -> GuildUpdateEventHelper.format(event, ale, channelIdToSendTo);
+
+ case INTEGRATION_CREATE -> IntegrationCreateEventHelper.format(event, ale, channelIdToSendTo);
+ case INTEGRATION_DELETE -> IntegrationDeleteEventHelper.format(event, ale, channelIdToSendTo);
+ // INTEGRATION_UPDATE has generic formatting
+
+ case INVITE_CREATE -> InviteCreateEventHelper.format(event, ale, channelIdToSendTo);
+ case INVITE_DELETE -> InviteDeleteEventHelper.format(event, ale, channelIdToSendTo);
+ // INVITE_UPDATE has generic formatting
+
+ case MEMBER_ROLE_UPDATE -> MemberRoleUpdateEventHelper.format(event, ale, channelIdToSendTo);
+ case MEMBER_UPDATE -> MemberUpdateEventHelper.format(event, ale, channelIdToSendTo);
+
+ case MEMBER_VOICE_KICK -> MemberVoiceKickEventHelper.format(event, ale, channelIdToSendTo);
+ case MEMBER_VOICE_MOVE -> MemberVoiceMoveEventHelper.format(event, ale, channelIdToSendTo);
+
+ case MESSAGE_PIN -> MessagePinEventHelper.format(event, ale, channelIdToSendTo);
+ case MESSAGE_UNPIN -> MessageUnpinEventHelper.format(event, ale, channelIdToSendTo);
+
+ case SCHEDULED_EVENT_CREATE -> ScheduledEventCreateEventHelper.format(event, ale, channelIdToSendTo);
+ case SCHEDULED_EVENT_UPDATE -> ScheduledEventUpdateEventHelper.format(event, ale, channelIdToSendTo);
+ case SCHEDULED_EVENT_DELETE -> ScheduledEventDeleteEventHelper.format(event, ale, channelIdToSendTo);
+
+ case STAGE_INSTANCE_CREATE -> StageInstanceCreateEventHelper.format(event, ale, channelIdToSendTo);
+ case STAGE_INSTANCE_UPDATE -> StageInstanceUpdateEventHelper.format(event, ale, channelIdToSendTo);
+ case STAGE_INSTANCE_DELETE -> StageInstanceDeleteEventHelper.format(event, ale, channelIdToSendTo);
+
+ case THREAD_CREATE -> ThreadCreateEventHelper.format(event, ale, channelIdToSendTo);
+ case THREAD_UPDATE -> ThreadUpdateEventHelper.format(event, ale, channelIdToSendTo);
+ case THREAD_DELETE -> ThreadDeleteEventHelper.format(event, ale, channelIdToSendTo);
+
+ case VOICE_CHANNEL_STATUS_DELETE ->
+ VoiceChannelStatusDeleteEventHelper.format(event, ale, channelIdToSendTo);
+ case VOICE_CHANNEL_STATUS_UPDATE ->
+ VoiceChannelStatusUpdateEventHelper.format(event, ale, channelIdToSendTo);
+
+ case WEBHOOK_CREATE -> WebhookCreateEventHelper.format(event, ale, channelIdToSendTo);
+ case WEBHOOK_UPDATE -> WebhookUpdateEventHelper.format(event, ale, channelIdToSendTo);
+ case WEBHOOK_REMOVE -> WebhookRemoveEventHelper.format(event, ale, channelIdToSendTo);
+
+ case APPLICATION_COMMAND_PRIVILEGES_UPDATE,
+ PRUNE,
+ INTEGRATION_UPDATE,
+ INVITE_UPDATE,
+ UNKNOWN -> GenericAuditLogEventHelper.format(event, ale, channelIdToSendTo);
+
+ // these seemingly don't trigger properly, or are unreliable
+ case MESSAGE_BULK_DELETE,
+ MESSAGE_CREATE,
+ MESSAGE_DELETE,
+ MESSAGE_UPDATE -> GenericAuditLogEventHelper.format(event, ale, channelIdToSendTo);
+
+ default -> {
+ GenericAuditLogEventHelper.format(event, ale, channelIdToSendTo);
+ log.warn("The following event has no enum value defined in JDA and is not covered by the UNKNOWN type {}", Objects.requireNonNull(event.getRawData()).toPrettyString());
+ }
+ }
+ }
+}
diff --git a/src/main/java/org/papertrail/listeners/auditlog/helper/GuildMemberJoinAndLeaveListener.java b/src/main/java/org/papertrail/listeners/audit/event/GuildMemberJoinAndLeaveListener.java
similarity index 95%
rename from src/main/java/org/papertrail/listeners/auditlog/helper/GuildMemberJoinAndLeaveListener.java
rename to src/main/java/org/papertrail/listeners/audit/event/GuildMemberJoinAndLeaveListener.java
index f84df885..8ac2c9e9 100644
--- a/src/main/java/org/papertrail/listeners/auditlog/helper/GuildMemberJoinAndLeaveListener.java
+++ b/src/main/java/org/papertrail/listeners/audit/event/GuildMemberJoinAndLeaveListener.java
@@ -1,4 +1,4 @@
-package org.papertrail.listeners.auditlog.helper;
+package org.papertrail.listeners.audit.event;
import io.vavr.control.Either;
import net.dv8tion.jda.api.EmbedBuilder;
@@ -20,6 +20,8 @@
import java.util.Objects;
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
public class GuildMemberJoinAndLeaveListener extends ListenerAdapter {
private final Executor vThreadPool;
diff --git a/src/main/java/org/papertrail/listeners/auditlog/helper/GuildVoiceListener.java b/src/main/java/org/papertrail/listeners/audit/event/GuildVoiceListener.java
similarity index 93%
rename from src/main/java/org/papertrail/listeners/auditlog/helper/GuildVoiceListener.java
rename to src/main/java/org/papertrail/listeners/audit/event/GuildVoiceListener.java
index 5b86e942..13b4df52 100644
--- a/src/main/java/org/papertrail/listeners/auditlog/helper/GuildVoiceListener.java
+++ b/src/main/java/org/papertrail/listeners/audit/event/GuildVoiceListener.java
@@ -1,4 +1,4 @@
-package org.papertrail.listeners.auditlog.helper;
+package org.papertrail.listeners.audit.event;
import java.awt.Color;
import java.time.Instant;
@@ -17,6 +17,8 @@
import org.papertrail.commons.sdk.model.AuditLogObject;
import org.papertrail.commons.sdk.model.ErrorObject;
+// 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
public class GuildVoiceListener extends ListenerAdapter {
private final Executor vThreadPool;
diff --git a/src/main/java/org/papertrail/listeners/audit/helper/AutoModerationFlagToChannelEventHelper.java b/src/main/java/org/papertrail/listeners/audit/helper/AutoModerationFlagToChannelEventHelper.java
new file mode 100644
index 00000000..b5e8a6bb
--- /dev/null
+++ b/src/main/java/org/papertrail/listeners/audit/helper/AutoModerationFlagToChannelEventHelper.java
@@ -0,0 +1,35 @@
+package org.papertrail.listeners.audit.helper;
+
+import lombok.experimental.UtilityClass;
+import net.dv8tion.jda.api.EmbedBuilder;
+import net.dv8tion.jda.api.audit.AuditLogEntry;
+import net.dv8tion.jda.api.entities.MessageEmbed;
+import net.dv8tion.jda.api.entities.User;
+import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
+
+import java.awt.Color;
+import java.util.Objects;
+
+@UtilityClass
+public class AutoModerationFlagToChannelEventHelper {
+
+ public static void format(GuildAuditLogEntryCreateEvent event, AuditLogEntry ale, String channelIdToSendTo) {
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("Audit Log Entry | Automod Event");
+
+ User targetUser = ale.getJDA().getUserById(ale.getTargetId());
+ String mentionableTargetUser = (targetUser != null ? targetUser.getAsMention() : ale.getTargetId());
+
+ eb.setDescription("๐ Automod has flagged a message sent by: "+mentionableTargetUser);
+ eb.setColor(Color.YELLOW);
+
+ eb.addField("Action Type", String.valueOf(ale.getType()), true);
+ eb.addField("Target Type", String.valueOf(ale.getTargetType()), true);
+
+ eb.setFooter("Audit Log Entry ID: "+ale.getId());
+ eb.setTimestamp(ale.getTimeCreated());
+
+ MessageEmbed mb = eb.build();
+ Objects.requireNonNull(event.getGuild().getTextChannelById(channelIdToSendTo)).sendMessageEmbeds(mb).queue();
+ }
+}
diff --git a/src/main/java/org/papertrail/listeners/audit/helper/AutoModerationMemberTimeoutEventHelper.java b/src/main/java/org/papertrail/listeners/audit/helper/AutoModerationMemberTimeoutEventHelper.java
new file mode 100644
index 00000000..cd097011
--- /dev/null
+++ b/src/main/java/org/papertrail/listeners/audit/helper/AutoModerationMemberTimeoutEventHelper.java
@@ -0,0 +1,35 @@
+package org.papertrail.listeners.audit.helper;
+
+import lombok.experimental.UtilityClass;
+import net.dv8tion.jda.api.EmbedBuilder;
+import net.dv8tion.jda.api.audit.AuditLogEntry;
+import net.dv8tion.jda.api.entities.MessageEmbed;
+import net.dv8tion.jda.api.entities.User;
+import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
+
+import java.awt.Color;
+import java.util.Objects;
+
+@UtilityClass
+public class AutoModerationMemberTimeoutEventHelper {
+
+ public static void format (GuildAuditLogEntryCreateEvent event, AuditLogEntry ale, String channelIdToSendTo) {
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("Audit Log Entry | Automod Event");
+
+ User targetUser = ale.getJDA().getUserById(ale.getTargetId());
+ String mentionableTargetUser = (targetUser != null ? targetUser.getAsMention() : ale.getTargetId());
+
+ eb.setDescription("๐ Automod has timed out"+mentionableTargetUser+" for a defined rule violation");
+ eb.setColor(Color.MAGENTA);
+
+ eb.addField("Action Type", String.valueOf(ale.getType()), true);
+ eb.addField("Target Type", String.valueOf(ale.getTargetType()), true);
+
+ eb.setFooter("Audit Log Entry ID: "+ale.getId());
+ eb.setTimestamp(ale.getTimeCreated());
+
+ MessageEmbed mb = eb.build();
+ Objects.requireNonNull(event.getGuild().getTextChannelById(channelIdToSendTo)).sendMessageEmbeds(mb).queue();
+ }
+}
diff --git a/src/main/java/org/papertrail/listeners/audit/helper/AutoModerationRuleBlockMessageEventHelper.java b/src/main/java/org/papertrail/listeners/audit/helper/AutoModerationRuleBlockMessageEventHelper.java
new file mode 100644
index 00000000..0e462aff
--- /dev/null
+++ b/src/main/java/org/papertrail/listeners/audit/helper/AutoModerationRuleBlockMessageEventHelper.java
@@ -0,0 +1,35 @@
+package org.papertrail.listeners.audit.helper;
+
+import lombok.experimental.UtilityClass;
+import net.dv8tion.jda.api.EmbedBuilder;
+import net.dv8tion.jda.api.audit.AuditLogEntry;
+import net.dv8tion.jda.api.entities.MessageEmbed;
+import net.dv8tion.jda.api.entities.User;
+import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
+
+import java.awt.Color;
+import java.util.Objects;
+
+@UtilityClass
+public class AutoModerationRuleBlockMessageEventHelper {
+
+ public static void format (GuildAuditLogEntryCreateEvent event, AuditLogEntry ale, String channelIdToSendTo) {
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("Audit Log Entry | Automod Event");
+
+ User targetUser = ale.getJDA().getUserById(ale.getTargetId());
+ String mentionableTargetUser = (targetUser != null ? targetUser.getAsMention() : ale.getTargetId());
+
+ eb.setDescription("๐ Automod has blocked a message sent by: "+mentionableTargetUser);
+ eb.setColor(Color.ORANGE);
+
+ eb.addField("Action Type", String.valueOf(ale.getType()), true);
+ eb.addField("Target Type", String.valueOf(ale.getTargetType()), true);
+
+ eb.setFooter("Audit Log Entry ID: "+ale.getId());
+ eb.setTimestamp(ale.getTimeCreated());
+
+ MessageEmbed mb = eb.build();
+ Objects.requireNonNull(event.getGuild().getTextChannelById(channelIdToSendTo)).sendMessageEmbeds(mb).queue();
+ }
+}
diff --git a/src/main/java/org/papertrail/listeners/audit/helper/AutoModerationRuleCreateEventHelper.java b/src/main/java/org/papertrail/listeners/audit/helper/AutoModerationRuleCreateEventHelper.java
new file mode 100644
index 00000000..2f64925d
--- /dev/null
+++ b/src/main/java/org/papertrail/listeners/audit/helper/AutoModerationRuleCreateEventHelper.java
@@ -0,0 +1,104 @@
+package org.papertrail.listeners.audit.helper;
+
+import lombok.experimental.UtilityClass;
+import net.dv8tion.jda.api.EmbedBuilder;
+import net.dv8tion.jda.api.audit.AuditLogChange;
+import net.dv8tion.jda.api.audit.AuditLogEntry;
+import net.dv8tion.jda.api.entities.MessageEmbed;
+import net.dv8tion.jda.api.entities.Role;
+import net.dv8tion.jda.api.entities.User;
+import net.dv8tion.jda.api.entities.channel.middleman.GuildChannel;
+import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
+import org.apache.commons.lang3.StringUtils;
+import org.papertrail.commons.utilities.TypeResolver;
+
+import java.awt.Color;
+import java.util.Map;
+import java.util.Objects;
+
+@UtilityClass
+public class AutoModerationRuleCreateEventHelper {
+
+ public static void format (GuildAuditLogEntryCreateEvent event, AuditLogEntry ale, String channelIdToSendTo) {
+
+ 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("๐ค **By**: "+mentionableExecutor+"\nโน๏ธ The following AutoMod rule was created");
+ eb.setColor(Color.GREEN);
+
+ eb.addField("Action Type", String.valueOf(ale.getType()), true);
+ eb.addField("Target Type", String.valueOf(ale.getTargetType()), true);
+
+ for(Map.Entry changes: ale.getChanges().entrySet()) {
+
+ String change = changes.getKey();
+ Object oldValue = changes.getValue().getOldValue();
+ Object newValue = changes.getValue().getNewValue();
+
+ switch(change) {
+
+ case "exempt_roles":
+ String roleIds = String.valueOf(newValue);
+ String cleanedRoleIds = StringUtils.strip(roleIds, "[]");
+ String[] roleIdList = StringUtils.split(cleanedRoleIds, ",");
+ StringBuilder mentionableRoles = new StringBuilder();
+ for(String roleId : roleIdList) {
+ Role r = ale.getGuild().getRoleById(roleId.strip());
+ mentionableRoles.append(r!=null ? r.getAsMention() : roleId.strip()).append(", ");
+ }
+ eb.addField("โ๏ธ Exempt Roles: ", "โฐโโค"+ mentionableRoles, false);
+ break;
+
+ case "enabled":
+ eb.addField("โ Enabled", "โฐโโค"+((Boolean.TRUE.equals(newValue)) ? "โ
" : "โ"), false);
+ break;
+
+ case "trigger_type":
+ eb.addField("โก Trigger Type", "โฐโโค"+ TypeResolver.automodTriggerTypeResolver(newValue), false);
+ break;
+
+ case "actions":
+ eb.addField("โก Actions", "โฐโโค"+newValue, false);
+ break;
+
+ case "exempt_channels":
+ String channelIds = String.valueOf(newValue);
+ String cleanedChannelIds = StringUtils.strip(channelIds, "[]");
+ String[] channelIdList = StringUtils.split(cleanedChannelIds, ",");
+ StringBuilder mentionableChannels = new StringBuilder();
+ for(String channelId : channelIdList) {
+ GuildChannel r = ale.getGuild().getGuildChannelById(channelId.strip());
+ mentionableChannels.append(r!=null ? r.getAsMention() : channelId.strip()).append(", ");
+ }
+ eb.addField("โ๏ธ Exempt Channels: ", "โฐโโค"+ mentionableChannels, false);
+ break;
+
+ case "event_type":
+ eb.addField("๐งญ Event Type", "โฐโโค"+TypeResolver.automodEventTypeResolver(newValue), false);
+ break;
+
+ case "trigger_metadata":
+ eb.addField("๐ Trigger Metadata", "โฐโโค"+newValue, false);
+ break;
+
+ case "name":
+ eb.addField("๐ท๏ธ AutoMod Rule Name ", "โฐโโค"+newValue, false);
+ break;
+
+ default:
+ eb.addField(change, "from "+oldValue+" to "+newValue, false);
+ }
+ }
+
+ eb.setFooter("Audit Log Entry ID: "+ale.getId());
+ eb.setTimestamp(ale.getTimeCreated());
+
+ MessageEmbed mb = eb.build();
+
+ Objects.requireNonNull(event.getGuild().getTextChannelById(channelIdToSendTo)).sendMessageEmbeds(mb).queue();
+ }
+}
diff --git a/src/main/java/org/papertrail/listeners/audit/helper/AutoModerationRuleDeleteEventHelper.java b/src/main/java/org/papertrail/listeners/audit/helper/AutoModerationRuleDeleteEventHelper.java
new file mode 100644
index 00000000..769e5606
--- /dev/null
+++ b/src/main/java/org/papertrail/listeners/audit/helper/AutoModerationRuleDeleteEventHelper.java
@@ -0,0 +1,59 @@
+package org.papertrail.listeners.audit.helper;
+
+import lombok.experimental.UtilityClass;
+import net.dv8tion.jda.api.EmbedBuilder;
+import net.dv8tion.jda.api.audit.AuditLogChange;
+import net.dv8tion.jda.api.audit.AuditLogEntry;
+import net.dv8tion.jda.api.entities.MessageEmbed;
+import net.dv8tion.jda.api.entities.User;
+import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
+
+import java.awt.Color;
+import java.util.Map;
+import java.util.Objects;
+
+@UtilityClass
+public class AutoModerationRuleDeleteEventHelper {
+
+ public static void format(GuildAuditLogEntryCreateEvent event, AuditLogEntry ale, String channelIdToSendTo) {
+
+ 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("๐ค **By**: "+mentionableExecutor+"\nโน๏ธ The following AutoMod rule was deleted");
+ eb.setColor(Color.RED);
+
+ eb.addField("Action Type", String.valueOf(ale.getType()), true);
+ eb.addField("Target Type", String.valueOf(ale.getTargetType()), true);
+
+ for(Map.Entry changes: ale.getChanges().entrySet()) {
+
+ String change = changes.getKey();
+ Object oldValue = changes.getValue().getOldValue();
+ Object newValue = changes.getValue().getNewValue();
+
+ switch(change) {
+
+ case "exempt_roles", "enabled", "trigger_type", "actions", "exempt_channels", "event_type", "trigger_metadata":
+ break;
+
+ case "name":
+ eb.addField("๐ท๏ธ AutoMod Rule Name ", "โฐโโค"+oldValue, false);
+ break;
+
+ default:
+ eb.addField(change, "from "+oldValue+" to "+newValue, false);
+ }
+ }
+
+ eb.setFooter("Audit Log Entry ID: "+ale.getId());
+ eb.setTimestamp(ale.getTimeCreated());
+
+ MessageEmbed mb = eb.build();
+
+ Objects.requireNonNull(event.getGuild().getTextChannelById(channelIdToSendTo)).sendMessageEmbeds(mb).queue();
+ }
+}
diff --git a/src/main/java/org/papertrail/listeners/audit/helper/AutoModerationRuleUpdateEventHelper.java b/src/main/java/org/papertrail/listeners/audit/helper/AutoModerationRuleUpdateEventHelper.java
new file mode 100644
index 00000000..7bee35ae
--- /dev/null
+++ b/src/main/java/org/papertrail/listeners/audit/helper/AutoModerationRuleUpdateEventHelper.java
@@ -0,0 +1,94 @@
+package org.papertrail.listeners.audit.helper;
+
+import lombok.experimental.UtilityClass;
+import net.dv8tion.jda.api.EmbedBuilder;
+import net.dv8tion.jda.api.audit.AuditLogChange;
+import net.dv8tion.jda.api.audit.AuditLogEntry;
+import net.dv8tion.jda.api.entities.MessageEmbed;
+import net.dv8tion.jda.api.entities.Role;
+import net.dv8tion.jda.api.entities.User;
+import net.dv8tion.jda.api.entities.automod.AutoModRule;
+import net.dv8tion.jda.api.entities.channel.middleman.GuildChannel;
+import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
+import org.apache.commons.lang3.StringUtils;
+
+import java.awt.Color;
+import java.util.Map;
+import java.util.Objects;
+
+@UtilityClass
+public class AutoModerationRuleUpdateEventHelper {
+
+ public static void format (GuildAuditLogEntryCreateEvent event, AuditLogEntry ale, String channelIdToSendTo) {
+
+ 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("๐ค **By**: "+mentionableExecutor+"\nโน๏ธ The following AutoMod rule was updated");
+ eb.setColor(Color.YELLOW);
+
+ eb.addField("Action Type", String.valueOf(ale.getType()), true);
+ eb.addField("Target Type", String.valueOf(ale.getTargetType()), true);
+
+ for(Map.Entry changes: ale.getChanges().entrySet()) {
+
+ String change = changes.getKey();
+ Object oldValue = changes.getValue().getOldValue();
+ Object newValue = changes.getValue().getNewValue();
+
+ switch(change) {
+
+ case "exempt_roles":
+ String roleIds = String.valueOf(newValue);
+ String cleanedRoleIds = StringUtils.strip(roleIds, "[]");
+ String[] roleIdList = StringUtils.split(cleanedRoleIds, ",");
+ StringBuilder mentionableRoles = new StringBuilder();
+ for(String roleId : roleIdList) {
+ Role r = ale.getGuild().getRoleById(roleId.strip());
+ mentionableRoles.append(r!=null ? r.getAsMention() : roleId.strip()).append(", ");
+ }
+ eb.addField("โ๏ธ New Exempt Roles: ", "โฐโโค"+ mentionableRoles, false);
+ break;
+
+
+ case "actions":
+ eb.addField("โก New Actions", "โฐโโค"+newValue, false);
+ break;
+
+ case "exempt_channels":
+ String channelIds = String.valueOf(newValue);
+ String cleanedChannelIds = StringUtils.strip(channelIds, "[]");
+ String[] channelIdList = StringUtils.split(cleanedChannelIds, ",");
+ StringBuilder mentionableChannels = new StringBuilder();
+ for(String channelId : channelIdList) {
+ GuildChannel r = ale.getGuild().getGuildChannelById(channelId.strip());
+ mentionableChannels.append(r!=null ? r.getAsMention() : channelId.strip()).append(", ");
+ }
+ eb.addField("โ๏ธ New Exempt Channels: ", "โฐโโค"+ mentionableChannels, false);
+ break;
+
+
+ case "trigger_metadata":
+ eb.addField("๐ New Trigger Metadata", "โฐโโค"+newValue, false);
+ break;
+
+ default:
+ eb.addField(change, "from "+oldValue+" to "+newValue, false);
+ }
+ }
+
+ // add name of the rule which got updated
+ AutoModRule rule = ale.getGuild().retrieveAutoModRuleById(ale.getTargetId()).complete();
+ eb.addField("๐ท๏ธ AutoMod Rule Name ", "โฐโโค"+rule.getName(), false);
+
+ eb.setFooter("Audit Log Entry ID: "+ale.getId());
+ eb.setTimestamp(ale.getTimeCreated());
+
+ MessageEmbed mb = eb.build();
+
+ Objects.requireNonNull(event.getGuild().getTextChannelById(channelIdToSendTo)).sendMessageEmbeds(mb).queue();
+ }
+}
diff --git a/src/main/java/org/papertrail/listeners/audit/helper/BanEventHelper.java b/src/main/java/org/papertrail/listeners/audit/helper/BanEventHelper.java
new file mode 100644
index 00000000..e4814a62
--- /dev/null
+++ b/src/main/java/org/papertrail/listeners/audit/helper/BanEventHelper.java
@@ -0,0 +1,46 @@
+package org.papertrail.listeners.audit.helper;
+
+import lombok.experimental.UtilityClass;
+import net.dv8tion.jda.api.EmbedBuilder;
+import net.dv8tion.jda.api.audit.AuditLogEntry;
+import net.dv8tion.jda.api.entities.MessageEmbed;
+import net.dv8tion.jda.api.entities.User;
+import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
+
+import java.awt.Color;
+import java.util.Objects;
+
+@UtilityClass
+public class BanEventHelper {
+
+ public static void format(GuildAuditLogEntryCreateEvent event, AuditLogEntry ale, String channelIdToSendTo) {
+
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("Audit Log Entry | Ban Event");
+
+ User executor = ale.getJDA().getUserById(ale.getUserIdLong());
+ String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
+
+ eb.setDescription("๐ค **By**: "+mentionableExecutor+"\nโน๏ธ The following user was banned");
+ eb.setColor(Color.RED);
+ eb.addField("Action Type", String.valueOf(ale.getType()), true);
+ eb.addField("Target Type", String.valueOf(ale.getTargetType()), true);
+
+ String moderatorId = ale.getUserId();
+ String targetId = ale.getTargetId();
+ String reason = ale.getReason();
+
+ event.getJDA().retrieveUserById(moderatorId).queue(moderator->
+ event.getJDA().retrieveUserById(targetId).queue(target->{
+ // if user objects are null we cannot use their mention so we instead use their IDs instead since they will never be null
+ eb.addField("๐ซ A member has been banned", "โฐโโค"+(moderator!=null ? moderator.getAsMention() : moderatorId)+" has banned "+(target!=null ? target.getAsMention() : targetId), false);
+ eb.addField("๐ With Reason", "โฐโโค"+(reason!=null ? reason : "No Reason Provided"), false);
+
+ eb.setFooter("Audit Log Entry ID: "+ale.getId());
+ eb.setTimestamp(ale.getTimeCreated());
+ MessageEmbed mb = eb.build();
+ Objects.requireNonNull(event.getGuild().getTextChannelById(channelIdToSendTo)).sendMessageEmbeds(mb).queue();
+ })
+ );
+ }
+}
diff --git a/src/main/java/org/papertrail/listeners/audit/helper/BotAddEventHelper.java b/src/main/java/org/papertrail/listeners/audit/helper/BotAddEventHelper.java
new file mode 100644
index 00000000..5d1f7194
--- /dev/null
+++ b/src/main/java/org/papertrail/listeners/audit/helper/BotAddEventHelper.java
@@ -0,0 +1,41 @@
+package org.papertrail.listeners.audit.helper;
+
+import lombok.experimental.UtilityClass;
+import net.dv8tion.jda.api.EmbedBuilder;
+import net.dv8tion.jda.api.audit.AuditLogEntry;
+import net.dv8tion.jda.api.entities.MessageEmbed;
+import net.dv8tion.jda.api.entities.User;
+import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
+
+import java.awt.Color;
+import java.util.Objects;
+
+@UtilityClass
+public class BotAddEventHelper {
+
+ public static void format(GuildAuditLogEntryCreateEvent event, AuditLogEntry ale, String channelIdToSendTo) {
+
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("Audit Log Entry | Bot Add Event");
+
+ User executor = ale.getJDA().getUserById(ale.getUserIdLong());
+ User target = ale.getJDA().getUserById(ale.getTargetIdLong());
+
+ String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
+ String mentionableTarget = (target !=null ? target.getAsMention() : ale.getTargetId());
+
+ eb.setDescription("๐ค **By**: "+mentionableExecutor+"\nโน๏ธ A bot was added");
+ eb.setColor(Color.CYAN);
+
+ eb.addField("Action Type", String.valueOf(ale.getType()), true);
+ eb.addField("Target Type", String.valueOf(ale.getTargetType()), true);
+ eb.addField("๐ค Added a bot: ", "โฐโโค"+mentionableTarget, false);
+
+ eb.setFooter("Audit Log Entry ID: "+ale.getId());
+ eb.setTimestamp(ale.getTimeCreated());
+
+ MessageEmbed mb = eb.build();
+
+ Objects.requireNonNull(event.getGuild().getTextChannelById(channelIdToSendTo)).sendMessageEmbeds(mb).queue();
+ }
+}
diff --git a/src/main/java/org/papertrail/listeners/audit/helper/ChannelCreateEventHelper.java b/src/main/java/org/papertrail/listeners/audit/helper/ChannelCreateEventHelper.java
new file mode 100644
index 00000000..33d76812
--- /dev/null
+++ b/src/main/java/org/papertrail/listeners/audit/helper/ChannelCreateEventHelper.java
@@ -0,0 +1,87 @@
+package org.papertrail.listeners.audit.helper;
+
+import lombok.experimental.UtilityClass;
+import net.dv8tion.jda.api.EmbedBuilder;
+import net.dv8tion.jda.api.audit.AuditLogChange;
+import net.dv8tion.jda.api.audit.AuditLogEntry;
+import net.dv8tion.jda.api.entities.MessageEmbed;
+import net.dv8tion.jda.api.entities.User;
+import net.dv8tion.jda.api.entities.channel.middleman.GuildChannel;
+import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
+import org.papertrail.commons.utilities.DurationFormatter;
+import org.papertrail.commons.utilities.TypeResolver;
+
+import java.awt.Color;
+import java.util.Map;
+import java.util.Objects;
+
+@UtilityClass
+public class ChannelCreateEventHelper {
+
+ public static void format(GuildAuditLogEntryCreateEvent event, AuditLogEntry ale, String channelIdToSendTo) {
+
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("Audit Log Entry | Channel Create Event");
+
+ User executor = ale.getJDA().getUserById(ale.getUserIdLong());
+ GuildChannel targetChannel = ale.getGuild().getGuildChannelById(ale.getTargetId());
+
+ String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
+ String mentionableTargetChannel = (targetChannel !=null ? targetChannel.getAsMention() : ale.getTargetId());
+
+
+ eb.setDescription("๐ค **By**: "+mentionableExecutor+"\nโน๏ธ The following channel was created");
+ eb.setColor(Color.GREEN);
+
+ eb.addField("Action Type", String.valueOf(ale.getType()), true);
+ eb.addField("Target Type", String.valueOf(ale.getTargetType()), true);
+
+ for(Map.Entry changes: ale.getChanges().entrySet()) {
+
+ String change = changes.getKey();
+ Object oldValue = changes.getValue().getOldValue();
+ Object newValue = changes.getValue().getNewValue();
+
+ switch(change) {
+ case "user_limit":
+ eb.addField("๐ฅ User Limit", "โฐโโค"+ TypeResolver.formatNumberOrUnlimited(newValue), false);
+ break;
+
+ case "rate_limit_per_user":
+ eb.addField("๐ Slowmode", "โฐโโค"+ DurationFormatter.formatSeconds(newValue), false);
+ break;
+
+ case "type":
+ eb.addField("๐จ๏ธ Channel Type", "โฐโโค"+TypeResolver.channelTypeResolver(newValue), false);
+ break;
+
+ case "nsfw":
+ eb.addField("๐ NSFW", "โฐโโค"+((Boolean.TRUE.equals(newValue)) ? "โ
" : "โ"), false);
+ break;
+
+ case "permission_overwrites", "flags":
+ break;
+
+ case "name":
+ eb.addField("๐ท๏ธ Channel Name", "โฐโโค"+newValue, false);
+ // provide a channel link next to its name. This mentionable channel can be obtained via the target ID of ALE
+ eb.addField("๐ Channel Link", "โฐโโค"+mentionableTargetChannel, true);
+ break;
+
+ case "bitrate":
+ eb.addField("๐๏ธ Voice Channel Bitrate", "โฐโโค"+TypeResolver.voiceChannelBitrateResolver(newValue), false);
+ break;
+
+ default:
+ eb.addField(change, "from "+oldValue+" to "+newValue, false);
+ }
+ }
+
+ eb.setFooter("Audit Log Entry ID: "+ale.getId());
+ eb.setTimestamp(ale.getTimeCreated());
+
+ MessageEmbed mb = eb.build();
+
+ Objects.requireNonNull(event.getGuild().getTextChannelById(channelIdToSendTo)).sendMessageEmbeds(mb).queue();
+ }
+}
diff --git a/src/main/java/org/papertrail/listeners/audit/helper/ChannelDeleteEventHelper.java b/src/main/java/org/papertrail/listeners/audit/helper/ChannelDeleteEventHelper.java
new file mode 100644
index 00000000..91352876
--- /dev/null
+++ b/src/main/java/org/papertrail/listeners/audit/helper/ChannelDeleteEventHelper.java
@@ -0,0 +1,69 @@
+package org.papertrail.listeners.audit.helper;
+
+import lombok.experimental.UtilityClass;
+import net.dv8tion.jda.api.EmbedBuilder;
+import net.dv8tion.jda.api.audit.AuditLogChange;
+import net.dv8tion.jda.api.audit.AuditLogEntry;
+import net.dv8tion.jda.api.entities.MessageEmbed;
+import net.dv8tion.jda.api.entities.User;
+import net.dv8tion.jda.api.entities.channel.middleman.GuildChannel;
+import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
+import org.papertrail.commons.utilities.TypeResolver;
+
+import java.awt.Color;
+import java.util.Map;
+import java.util.Objects;
+
+@UtilityClass
+public class ChannelDeleteEventHelper {
+
+ public static void format(GuildAuditLogEntryCreateEvent event, AuditLogEntry ale, String channelIdToSendTo) {
+
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("Audit Log Entry | Channel Delete Event");
+
+ User executor = ale.getJDA().getUserById(ale.getUserIdLong());
+ GuildChannel targetChannel = ale.getJDA().getGuildChannelById(ale.getTargetIdLong());
+
+ String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
+ String mentionableTargetChannel = (targetChannel !=null ? targetChannel.getAsMention() : ale.getTargetId()); // this will return only the ID cause the channel with the ID has been deleted
+
+ eb.setDescription("๐ค **By**: "+mentionableExecutor+"\nโน๏ธ The following channel was deleted");
+ eb.setColor(Color.RED);
+
+ eb.addField("Action Type", String.valueOf(ale.getType()), true);
+ eb.addField("Target Type", String.valueOf(ale.getTargetType()), true);
+
+
+ for(Map.Entry changes: ale.getChanges().entrySet()) {
+
+ String change = changes.getKey();
+ Object oldValue = changes.getValue().getOldValue();
+ Object newValue = changes.getValue().getNewValue();
+
+ switch(change) {
+ case "name":
+ eb.addField("๐ท๏ธ Name", "โฐโโค"+oldValue, false);
+ break;
+
+ case "type":
+ eb.addField("๐จ๏ธ Type", "โฐโโค"+ TypeResolver.channelTypeResolver(oldValue), false);
+ break;
+
+ case "user_limit", "rate_limit_per_user", "nsfw", "permission_overwrites", "video_quality_mode", "flags", "bitrate", "rtc_region":
+ break; // they're null during channel delete events
+
+ default:
+ eb.addField(change, "from "+oldValue+" to "+newValue, false);
+ }
+ }
+
+ eb.addField("๐ Deleted Channel ID", "โฐโโค"+mentionableTargetChannel, false);
+ eb.setFooter("Audit Log Entry ID: "+ale.getId());
+ eb.setTimestamp(ale.getTimeCreated());
+
+ MessageEmbed mb = eb.build();
+
+ Objects.requireNonNull(event.getGuild().getTextChannelById(channelIdToSendTo)).sendMessageEmbeds(mb).queue();
+ }
+}
diff --git a/src/main/java/org/papertrail/listeners/audit/helper/ChannelOverrideCreateEventHelper.java b/src/main/java/org/papertrail/listeners/audit/helper/ChannelOverrideCreateEventHelper.java
new file mode 100644
index 00000000..0c560609
--- /dev/null
+++ b/src/main/java/org/papertrail/listeners/audit/helper/ChannelOverrideCreateEventHelper.java
@@ -0,0 +1,95 @@
+package org.papertrail.listeners.audit.helper;
+
+import lombok.experimental.UtilityClass;
+import net.dv8tion.jda.api.EmbedBuilder;
+import net.dv8tion.jda.api.audit.AuditLogChange;
+import net.dv8tion.jda.api.audit.AuditLogEntry;
+import net.dv8tion.jda.api.entities.Member;
+import net.dv8tion.jda.api.entities.MessageEmbed;
+import net.dv8tion.jda.api.entities.Role;
+import net.dv8tion.jda.api.entities.User;
+import net.dv8tion.jda.api.entities.channel.middleman.GuildChannel;
+import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
+import org.papertrail.commons.utilities.PermissionResolver;
+import org.papertrail.commons.utilities.TypeResolver;
+
+import java.awt.Color;
+import java.util.Map;
+import java.util.Objects;
+
+@UtilityClass
+public class ChannelOverrideCreateEventHelper {
+
+ public static void format(GuildAuditLogEntryCreateEvent event, AuditLogEntry ale, String channelIdToSendTo) {
+
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("Audit Log Entry | Channel Override Create");
+
+ User executor = ale.getJDA().getUserById(ale.getUserIdLong());
+ GuildChannel targetChannel = event.getGuild().getGuildChannelById(ale.getTargetId());
+
+ String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
+ String mentionableTargetChannel = (targetChannel !=null ? targetChannel.getAsMention() : ale.getTargetId());
+
+ eb.setDescription("๐ค **By**: "+mentionableExecutor+"\nโน๏ธ The following channel overrides were created");
+ eb.setColor(Color.GREEN);
+
+ eb.addField("Action Type", String.valueOf(ale.getType()), true);
+ eb.addField("Target Type", String.valueOf(ale.getTargetType()), true);
+
+
+ for(Map.Entry changes: ale.getChanges().entrySet()) {
+
+ String change = changes.getKey();
+ Object oldValue = changes.getValue().getOldValue();
+ Object newValue = changes.getValue().getNewValue();
+
+ switch(change) {
+
+ case "type":
+ eb.addField("๐งฉ Override Type", "โฐโโค"+ TypeResolver.channelOverrideTypeResolver(newValue), false);
+ break;
+
+ case "deny":
+ // the oldValue will return null if a new channel is over-riden for the first time but we're not concerned with oldValue
+ // the new value contains the list of denied permissions the moderator sets when creating overrides for the first time
+ eb.addField("Denied Permissions", PermissionResolver.getParsedPermissions(newValue, "โ"), false);
+ break;
+
+ case "allow":
+ // the oldValue will return null if a new channel is over-riden for the first time but we're not concerned with oldValue
+ // the new value contains the list of allowed permissions the moderator sets when creating overrides for the first time
+ eb.addField("Allowed Permissions", PermissionResolver.getParsedPermissions(newValue, "โ
"), false);
+ break;
+
+ case "id":
+ // id exposes the member/role id which for which the channel permissions are over-riden
+ // only one member/role permissions can be over-riden at a time
+ Member mb = event.getGuild().getMemberById(String.valueOf(newValue));
+ Role r = event.getGuild().getRoleById(String.valueOf(newValue));
+
+ String mentionableRoleOrMember = "";
+ if(mb!=null) {
+ mentionableRoleOrMember = mb.getAsMention();
+ } else if (r!=null) {
+ mentionableRoleOrMember = r.getAsMention();
+ }
+ eb.addField("๐ญ Target", "โฐโโค"+mentionableRoleOrMember, false);
+ break;
+
+ default:
+ eb.addField(change, "from "+oldValue+" to "+newValue, false);
+ }
+ }
+ // add the target channel whose permissions were overridden
+ // exposed via ALE's TargetID
+ eb.addField("๐จ๏ธ Target Channel", "โฐโโค"+mentionableTargetChannel, false);
+
+ eb.setFooter("Audit Log Entry ID: "+ale.getId());
+ eb.setTimestamp(ale.getTimeCreated());
+
+ MessageEmbed mb = eb.build();
+
+ Objects.requireNonNull(event.getGuild().getTextChannelById(channelIdToSendTo)).sendMessageEmbeds(mb).queue();
+ }
+}
diff --git a/src/main/java/org/papertrail/listeners/audit/helper/ChannelOverrideDeleteEventHelper.java b/src/main/java/org/papertrail/listeners/audit/helper/ChannelOverrideDeleteEventHelper.java
new file mode 100644
index 00000000..ea813acb
--- /dev/null
+++ b/src/main/java/org/papertrail/listeners/audit/helper/ChannelOverrideDeleteEventHelper.java
@@ -0,0 +1,94 @@
+package org.papertrail.listeners.audit.helper;
+
+import lombok.experimental.UtilityClass;
+import net.dv8tion.jda.api.EmbedBuilder;
+import net.dv8tion.jda.api.audit.AuditLogChange;
+import net.dv8tion.jda.api.audit.AuditLogEntry;
+import net.dv8tion.jda.api.entities.Member;
+import net.dv8tion.jda.api.entities.MessageEmbed;
+import net.dv8tion.jda.api.entities.Role;
+import net.dv8tion.jda.api.entities.User;
+import net.dv8tion.jda.api.entities.channel.middleman.GuildChannel;
+import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
+import org.papertrail.commons.utilities.PermissionResolver;
+import org.papertrail.commons.utilities.TypeResolver;
+
+import java.awt.Color;
+import java.util.Map;
+import java.util.Objects;
+
+@UtilityClass
+public class ChannelOverrideDeleteEventHelper {
+
+ public static void format(GuildAuditLogEntryCreateEvent event, AuditLogEntry ale, String channelIdToSendTo) {
+
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("Audit Log Entry | Channel Override Delete");
+
+ User executor = ale.getJDA().getUserById(ale.getUserIdLong());
+ GuildChannel targetChannel = event.getGuild().getGuildChannelById(ale.getTargetId());
+
+ String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
+ String mentionableTargetChannel = (targetChannel !=null ? targetChannel.getAsMention() : ale.getTargetId());
+
+ eb.setDescription("๐ค **By**: "+mentionableExecutor+"\nโน๏ธ The following channel overrides were deleted");
+ eb.setColor(Color.RED);
+
+ eb.addField("Action Type", String.valueOf(ale.getType()), true);
+ eb.addField("Target Type", String.valueOf(ale.getTargetType()), true);
+
+
+ for(Map.Entry changes: ale.getChanges().entrySet()) {
+
+ String change = changes.getKey();
+ Object oldValue = changes.getValue().getOldValue();
+ Object newValue = changes.getValue().getNewValue();
+
+ switch(change) {
+
+ case "type":
+ eb.addField("๐งฉ Override Type", "โฐโโค"+ TypeResolver.channelOverrideTypeResolver(oldValue), false);
+ break;
+
+ case "deny":
+ // the newValue will return null if an over-ride is deleted but we're not concerned with newValue
+ // the oldValue returns the permissions the channel was previously denied
+ eb.addField("Previously Denied Permissions", PermissionResolver.getParsedPermissions(oldValue, "โ"), false);
+ break;
+
+ case "allow":
+ // the newValue will return null if an over-ride is deleted but we're not concerned with newValue
+ // the oldValue returns the permissions the channel was previously allowed
+ eb.addField("Previously Allowed Permissions", PermissionResolver.getParsedPermissions(oldValue, "โ
"), false);
+ break;
+
+ case "id":
+ // id exposes the member/role id which for which the channel permissions are over-riden
+ Member mb = event.getGuild().getMemberById(String.valueOf(oldValue));
+ Role r = event.getGuild().getRoleById(String.valueOf(oldValue));
+
+ String mentionableRoleOrMember = "";
+ if(mb!=null) {
+ mentionableRoleOrMember = mb.getAsMention();
+ } else if (r!=null) {
+ mentionableRoleOrMember = r.getAsMention();
+ }
+ eb.addField("๐ญ Deleted Target", "โฐโโค"+mentionableRoleOrMember, false);
+ break;
+
+ default:
+ eb.addField(change, "from "+oldValue+" to "+newValue, false);
+ }
+ }
+ // add the target channel whose permissions were over-riden
+ // can be retrieved via ALE's TargetID
+ eb.addField("๐จ๏ธ Target Channel", "โฐโโค"+mentionableTargetChannel, false);
+
+ eb.setFooter("Audit Log Entry ID: "+ale.getId());
+ eb.setTimestamp(ale.getTimeCreated());
+
+ MessageEmbed mb = eb.build();
+
+ Objects.requireNonNull(event.getGuild().getTextChannelById(channelIdToSendTo)).sendMessageEmbeds(mb).queue();
+ }
+}
diff --git a/src/main/java/org/papertrail/listeners/audit/helper/ChannelOverrideUpdateEventHelper.java b/src/main/java/org/papertrail/listeners/audit/helper/ChannelOverrideUpdateEventHelper.java
new file mode 100644
index 00000000..e8f0ab79
--- /dev/null
+++ b/src/main/java/org/papertrail/listeners/audit/helper/ChannelOverrideUpdateEventHelper.java
@@ -0,0 +1,96 @@
+package org.papertrail.listeners.audit.helper;
+
+import lombok.experimental.UtilityClass;
+import net.dv8tion.jda.api.EmbedBuilder;
+import net.dv8tion.jda.api.audit.AuditLogChange;
+import net.dv8tion.jda.api.audit.AuditLogEntry;
+import net.dv8tion.jda.api.entities.Member;
+import net.dv8tion.jda.api.entities.MessageEmbed;
+import net.dv8tion.jda.api.entities.Role;
+import net.dv8tion.jda.api.entities.User;
+import net.dv8tion.jda.api.entities.channel.middleman.GuildChannel;
+import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
+import org.papertrail.commons.utilities.PermissionResolver;
+
+import java.awt.Color;
+import java.util.Map;
+import java.util.Objects;
+
+@UtilityClass
+public class ChannelOverrideUpdateEventHelper {
+
+ public static void format(GuildAuditLogEntryCreateEvent event, AuditLogEntry ale, String channelIdToSendTo) {
+
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("Audit Log Entry | Channel Override Update");
+
+ User executor = ale.getJDA().getUserById(ale.getUserIdLong());
+ GuildChannel targetChannel = event.getGuild().getGuildChannelById(ale.getTargetId());
+
+ String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
+ String mentionableTargetChannel = (targetChannel !=null ? targetChannel.getAsMention() : ale.getTargetId());
+
+ eb.setDescription("๐ค **By**: "+mentionableExecutor+"\nโน๏ธ The following channel overrides were updated");
+ eb.setColor(Color.YELLOW);
+
+ eb.addField("Action Type", String.valueOf(ale.getType()), true);
+ eb.addField("Target Type", String.valueOf(ale.getTargetType()), true);
+
+ // changes do not expose the id and type keys in case of override updates
+ String overriddenId = ale.getOptionByName("id");
+ String overriddenType = ale.getOptionByName("type");
+
+ String mentionableOverrideTarget = overriddenId;
+ if ("0".equals(overriddenType)) {
+ // Itโs a role
+ Role role = event.getGuild().getRoleById(Objects.requireNonNull(overriddenId));
+ if (role != null) {
+ mentionableOverrideTarget = role.getAsMention();
+ }
+ } else if ("1".equals(overriddenType)) {
+ // Itโs a member
+ Member member = event.getGuild().getMemberById(Objects.requireNonNull(overriddenId));
+ if (member != null) {
+ mentionableOverrideTarget = member.getAsMention();
+ }
+ }
+
+ eb.addField("๐ญ Permissions Overridden For", "โฐโโค"+mentionableOverrideTarget, false);
+
+ for(Map.Entry changes: ale.getChanges().entrySet()) {
+
+ String change = changes.getKey();
+ Object oldValue = changes.getValue().getOldValue();
+ Object newValue = changes.getValue().getNewValue();
+
+ switch(change) {
+
+ case "deny":
+ String deniedPerms = PermissionResolver.getParsedPermissions(newValue, "โ");
+ // if a channel is synchronized with it's category, the permission list will be blank and the StringBuilder will return a blank string
+ eb.addField("Denied Permissions", (deniedPerms.isBlank() ? "Permissions Synced With Category" : deniedPerms), false);
+ break;
+
+ case "allow":
+ String allowedPerms = PermissionResolver.getParsedPermissions(newValue, "โ
");
+ // if a channel is synchronized with it's category, the permission list will be blank and the StringBuilder will return a blank string
+ eb.addField("Allowed Permissions", (allowedPerms.isBlank() ? "Permissions Synced With Category" : allowedPerms), false);
+ break;
+
+ default:
+ eb.addField(change, "from "+oldValue+" to "+newValue, false);
+ }
+ }
+
+ // add the target channel whose permissions were overridden
+ // can be retrieved via ALE's TargetID
+ eb.addField("๐จ๏ธ Target Channel", "โฐโโค"+mentionableTargetChannel, false);
+
+ eb.setFooter("Audit Log Entry ID: "+ale.getId());
+ eb.setTimestamp(ale.getTimeCreated());
+
+ MessageEmbed mb = eb.build();
+
+ Objects.requireNonNull(event.getGuild().getTextChannelById(channelIdToSendTo)).sendMessageEmbeds(mb).queue();
+ }
+}
diff --git a/src/main/java/org/papertrail/listeners/audit/helper/ChannelUpdateEventHelper.java b/src/main/java/org/papertrail/listeners/audit/helper/ChannelUpdateEventHelper.java
new file mode 100644
index 00000000..6dd11d2b
--- /dev/null
+++ b/src/main/java/org/papertrail/listeners/audit/helper/ChannelUpdateEventHelper.java
@@ -0,0 +1,114 @@
+package org.papertrail.listeners.audit.helper;
+
+import lombok.experimental.UtilityClass;
+import net.dv8tion.jda.api.EmbedBuilder;
+import net.dv8tion.jda.api.audit.AuditLogChange;
+import net.dv8tion.jda.api.audit.AuditLogEntry;
+import net.dv8tion.jda.api.entities.MessageEmbed;
+import net.dv8tion.jda.api.entities.User;
+import net.dv8tion.jda.api.entities.channel.middleman.GuildChannel;
+import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
+import org.papertrail.commons.utilities.DurationFormatter;
+import org.papertrail.commons.utilities.TypeResolver;
+
+import java.awt.Color;
+import java.util.Map;
+import java.util.Objects;
+
+@UtilityClass
+public class ChannelUpdateEventHelper {
+
+ public static void format(GuildAuditLogEntryCreateEvent event, AuditLogEntry ale, String channelIdToSendTo) {
+
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("Audit Log Entry | Channel Update Event");
+
+ User executor = ale.getJDA().getUserById(ale.getUserIdLong());
+ GuildChannel targetChannel = event.getGuild().getGuildChannelById(ale.getTargetId());
+
+ String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
+ String mentionableTargetChannel = (targetChannel !=null ? targetChannel.getAsMention() : ale.getTargetId());
+
+ eb.setDescription("๐ค **By**: "+mentionableExecutor+"\nโน๏ธ The following channel was updated");
+ eb.setColor(Color.YELLOW);
+
+ eb.addField("Action Type", String.valueOf(ale.getType()), true);
+ eb.addField("Target Type", String.valueOf(ale.getTargetType()), true);
+ eb.addBlankField(true);
+
+ for(Map.Entry changes: ale.getChanges().entrySet()) {
+
+ String change = changes.getKey();
+ Object oldValue = changes.getValue().getOldValue();
+ Object newValue = changes.getValue().getNewValue();
+
+ switch(change) {
+ case "user_limit":
+ eb.addField("๐ฅ Old User Limit", "โฐโโค"+ TypeResolver.formatNumberOrUnlimited(oldValue), true);
+ eb.addField("๐ฅ New User Limit", "โฐโโค"+TypeResolver.formatNumberOrUnlimited(newValue), true);
+ eb.addBlankField(true);
+ break;
+
+ case "rate_limit_per_user":
+ eb.addField("๐ Old Slowmode Value", "โฐโโค"+ DurationFormatter.formatSeconds(oldValue), true);
+ eb.addField("๐ New Slowmode Value", "โฐโโค"+DurationFormatter.formatSeconds(newValue), true);
+ eb.addBlankField(true);
+ break;
+
+ case "nsfw":
+ eb.addField("๐ Old NSFW Settings", "โฐโโค"+((Boolean.TRUE.equals(oldValue)) ? "โ
" : "โ"), true);
+ eb.addField("๐ New NSFW Settings", "โฐโโค"+((Boolean.TRUE.equals(newValue)) ? "โ
" : "โ"), true);
+ eb.addBlankField(true);
+ break;
+
+ case "video_quality_mode":
+ eb.addField("๐ฅ Old Video Quality Mode", "โฐโโค"+TypeResolver.videoQualityModeResolver(oldValue), true);
+ eb.addField("๐ฅ New Video Quality Mode", "โฐโโค"+TypeResolver.videoQualityModeResolver(newValue), true);
+ eb.addBlankField(true);
+ break;
+
+ case "name":
+ eb.addField("๐ท๏ธ Old Channel Name", "โฐโโค"+oldValue, true);
+ eb.addField("๐ท๏ธ New Channel Name", "โฐโโค"+newValue, true);
+ eb.addBlankField(true);
+ break;
+
+ case "bitrate":
+ eb.addField("๐๏ธ Old Voice Channel Bitrate", "โฐโโค"+TypeResolver.voiceChannelBitrateResolver(oldValue), true);
+ eb.addField("๐๏ธ New Voice Channel Bitrate", "โฐโโค"+TypeResolver.voiceChannelBitrateResolver(newValue), true);
+ eb.addBlankField(true);
+ break;
+
+ case "rtc_region":
+ eb.addField("๐ Old Region", "โฐโโค"+oldValue, true);
+ eb.addField("๐ New Region", "โฐโโค"+newValue, true);
+ eb.addBlankField(true);
+ break;
+
+ case "topic":
+ eb.addField("๐๏ธ Old Topic", "โฐโโค"+oldValue, true);
+ eb.addField("๐๏ธ New topic", "โฐโโค"+newValue, true);
+ eb.addBlankField(true);
+ break;
+
+ case "default_auto_archive_duration":
+ eb.addField("๐ Old Hide After Inactivity Timer", "โฐโโค"+DurationFormatter.formatMinutes(oldValue), true);
+ eb.addField("๐ New Hide After Inactivity Timer", "โฐโโค"+DurationFormatter.formatMinutes(newValue), true);
+ eb.addBlankField(true);
+ break;
+
+ default:
+ eb.addField(change, "from "+oldValue+" to "+newValue, false);
+ }
+ }
+ // mention the channel that got updated, id can be exposed via ALE's TargetID
+ eb.addField("๐ฌ Target Channel", "โฐโโค"+mentionableTargetChannel, false);
+
+ eb.setFooter("Audit Log Entry ID: "+ale.getId());
+ eb.setTimestamp(ale.getTimeCreated());
+
+ MessageEmbed mb = eb.build();
+
+ Objects.requireNonNull(event.getGuild().getTextChannelById(channelIdToSendTo)).sendMessageEmbeds(mb).queue();
+ }
+}
diff --git a/src/main/java/org/papertrail/listeners/audit/helper/EmojiCreateEventHelper.java b/src/main/java/org/papertrail/listeners/audit/helper/EmojiCreateEventHelper.java
new file mode 100644
index 00000000..d10bdb71
--- /dev/null
+++ b/src/main/java/org/papertrail/listeners/audit/helper/EmojiCreateEventHelper.java
@@ -0,0 +1,57 @@
+package org.papertrail.listeners.audit.helper;
+
+import lombok.experimental.UtilityClass;
+import net.dv8tion.jda.api.EmbedBuilder;
+import net.dv8tion.jda.api.audit.AuditLogChange;
+import net.dv8tion.jda.api.audit.AuditLogEntry;
+import net.dv8tion.jda.api.entities.MessageEmbed;
+import net.dv8tion.jda.api.entities.User;
+import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
+
+import java.awt.Color;
+import java.util.Map;
+import java.util.Objects;
+
+@UtilityClass
+public class EmojiCreateEventHelper {
+
+ public static void format(GuildAuditLogEntryCreateEvent event, AuditLogEntry ale, String channelIdToSendTo) {
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("Audit Log Entry | Emoji Create Event");
+
+ User executor = ale.getJDA().getUserById(ale.getUserIdLong());
+ String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
+
+ eb.setDescription("๐ค **By**: "+mentionableExecutor+"\nโน๏ธ The following emoji was created");
+ eb.setColor(Color.GREEN);
+
+ eb.addField("Action Type", String.valueOf(ale.getType()), true);
+ eb.addField("Target Type", String.valueOf(ale.getTargetType()), true);
+
+ for(Map.Entry changes: ale.getChanges().entrySet()) {
+
+ String change = changes.getKey();
+ Object oldValue = changes.getValue().getOldValue();
+ Object newValue = changes.getValue().getNewValue();
+
+ switch(change) {
+
+ case "name":
+ eb.addField("๐ท๏ธ Emoji Name", "โฐโโค"+newValue, false);
+ eb.addField("โน๏ธ Emoji", "โฐโโค"+"<:"+newValue+":"+ale.getTargetId()+">", false); // ale's TargetID retrieves the ID of the created emoji
+ break;
+
+ default:
+ eb.addField(change, "from "+oldValue+" to "+newValue, false);
+ }
+ }
+
+
+ eb.setFooter("Audit Log Entry ID: "+ale.getId());
+ eb.setTimestamp(ale.getTimeCreated());
+
+ MessageEmbed mb = eb.build();
+
+ Objects.requireNonNull(event.getGuild().getTextChannelById(channelIdToSendTo)).sendMessageEmbeds(mb).queue();
+ }
+}
diff --git a/src/main/java/org/papertrail/listeners/audit/helper/EmojiDeleteEventHelper.java b/src/main/java/org/papertrail/listeners/audit/helper/EmojiDeleteEventHelper.java
new file mode 100644
index 00000000..8ae2dcde
--- /dev/null
+++ b/src/main/java/org/papertrail/listeners/audit/helper/EmojiDeleteEventHelper.java
@@ -0,0 +1,56 @@
+package org.papertrail.listeners.audit.helper;
+
+import lombok.experimental.UtilityClass;
+import net.dv8tion.jda.api.EmbedBuilder;
+import net.dv8tion.jda.api.audit.AuditLogChange;
+import net.dv8tion.jda.api.audit.AuditLogEntry;
+import net.dv8tion.jda.api.entities.MessageEmbed;
+import net.dv8tion.jda.api.entities.User;
+import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
+
+import java.awt.Color;
+import java.util.Map;
+import java.util.Objects;
+
+@UtilityClass
+public class EmojiDeleteEventHelper {
+
+ public static void format(GuildAuditLogEntryCreateEvent event, AuditLogEntry ale, String channelIdToSendTo) {
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("Audit Log Entry | Emoji Delete Event");
+
+ User executor = ale.getJDA().getUserById(ale.getUserIdLong());
+ String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
+
+ eb.setDescription("๐ค **By**: "+mentionableExecutor+"\nโน๏ธ The following emoji was deleted");
+ eb.setColor(Color.RED);
+
+ eb.addField("Action Type", String.valueOf(ale.getType()), true);
+ eb.addField("Target Type", String.valueOf(ale.getTargetType()), true);
+
+ for(Map.Entry changes: ale.getChanges().entrySet()) {
+
+ String change = changes.getKey();
+ Object oldValue = changes.getValue().getOldValue();
+ Object newValue = changes.getValue().getNewValue();
+
+ switch(change) {
+
+ case "name":
+ eb.addField("โป๏ธ Deleted Emoji", "โฐโโค "+":"+oldValue+":", false);
+ break;
+
+ default:
+ eb.addField(change, "from "+oldValue+" to "+newValue, false);
+ }
+ }
+
+ eb.addField("โป๏ธ Deleted Emoji ID", "โฐโโค"+ale.getTargetId(), false);
+ eb.setFooter("Audit Log Entry ID: "+ale.getId());
+ eb.setTimestamp(ale.getTimeCreated());
+
+ MessageEmbed mb = eb.build();
+
+ Objects.requireNonNull(event.getGuild().getTextChannelById(channelIdToSendTo)).sendMessageEmbeds(mb).queue();
+ }
+}
diff --git a/src/main/java/org/papertrail/listeners/audit/helper/EmojiUpdateEventHelper.java b/src/main/java/org/papertrail/listeners/audit/helper/EmojiUpdateEventHelper.java
new file mode 100644
index 00000000..7aba9984
--- /dev/null
+++ b/src/main/java/org/papertrail/listeners/audit/helper/EmojiUpdateEventHelper.java
@@ -0,0 +1,56 @@
+package org.papertrail.listeners.audit.helper;
+
+import lombok.experimental.UtilityClass;
+import net.dv8tion.jda.api.EmbedBuilder;
+import net.dv8tion.jda.api.audit.AuditLogChange;
+import net.dv8tion.jda.api.audit.AuditLogEntry;
+import net.dv8tion.jda.api.entities.MessageEmbed;
+import net.dv8tion.jda.api.entities.User;
+import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
+
+import java.awt.Color;
+import java.util.Map;
+import java.util.Objects;
+
+@UtilityClass
+public class EmojiUpdateEventHelper {
+
+ public static void format(GuildAuditLogEntryCreateEvent event, AuditLogEntry ale, String channelIdToSendTo) {
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("Audit Log Entry | Emoji Update Event");
+
+ User executor = ale.getJDA().getUserById(ale.getUserIdLong());
+ String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
+
+ eb.setDescription("๐ค **By**: "+mentionableExecutor+"\nโน๏ธ The following emoji was updated");
+ eb.setColor(Color.YELLOW);
+
+ eb.addField("Action Type", String.valueOf(ale.getType()), true);
+ eb.addField("Target Type", String.valueOf(ale.getTargetType()), true);
+
+ for(Map.Entry changes: ale.getChanges().entrySet()) {
+
+ String change = changes.getKey();
+ Object oldValue = changes.getValue().getOldValue();
+ Object newValue = changes.getValue().getNewValue();
+
+ switch(change) {
+
+ case "name":
+ eb.addField("๐ท๏ธ Emoji Name Updated", "โฐโโค"+"From "+oldValue+" to "+newValue, false);
+ eb.addField("โน๏ธ Target Emoji", "โฐโโค"+"<:"+newValue+":"+ale.getTargetId()+">", false);
+ break;
+
+ default:
+ eb.addField(change, "from "+oldValue+" to "+newValue, false);
+ }
+ }
+
+ eb.setFooter("Audit Log Entry ID: "+ale.getId());
+ eb.setTimestamp(ale.getTimeCreated());
+
+ MessageEmbed mb = eb.build();
+
+ Objects.requireNonNull(event.getGuild().getTextChannelById(channelIdToSendTo)).sendMessageEmbeds(mb).queue();
+ }
+}
diff --git a/src/main/java/org/papertrail/listeners/audit/helper/GenericAuditLogEventHelper.java b/src/main/java/org/papertrail/listeners/audit/helper/GenericAuditLogEventHelper.java
new file mode 100644
index 00000000..5f8b28dd
--- /dev/null
+++ b/src/main/java/org/papertrail/listeners/audit/helper/GenericAuditLogEventHelper.java
@@ -0,0 +1,44 @@
+package org.papertrail.listeners.audit.helper;
+
+import lombok.experimental.UtilityClass;
+import net.dv8tion.jda.api.EmbedBuilder;
+import net.dv8tion.jda.api.audit.AuditLogChange;
+import net.dv8tion.jda.api.audit.AuditLogEntry;
+import net.dv8tion.jda.api.entities.MessageEmbed;
+import net.dv8tion.jda.api.entities.User;
+import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
+
+import java.awt.Color;
+import java.util.Map;
+import java.util.Objects;
+
+// for events not defined by JDA yet
+@UtilityClass
+public class GenericAuditLogEventHelper {
+
+ public static void format(GuildAuditLogEntryCreateEvent event, AuditLogEntry ale, String channelIdToSendTo) {
+
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("Audit Log Entry | Generic Event");
+ User executor = ale.getJDA().getUserById(ale.getUserIdLong());
+
+ eb.setDescription((executor != null ? executor.getAsMention() : ale.getUserId())+" has executed the following action:");
+ eb.setColor(Color.LIGHT_GRAY);
+ eb.addField("Action Type", String.valueOf(ale.getType()), true);
+ eb.addField("Target Type", String.valueOf(ale.getTargetType()), true);
+
+ for(Map.Entry changes: ale.getChanges().entrySet()) {
+ String change = changes.getKey();
+ Object oldValue = changes.getValue().getOldValue();
+ Object newValue = changes.getValue().getNewValue();
+
+ eb.addField(change, "from "+oldValue+" to "+newValue, false);
+ }
+
+ eb.setFooter("Audit Log Entry ID: "+ale.getId());
+ eb.setTimestamp(ale.getTimeCreated());
+
+ MessageEmbed mb = eb.build();
+ Objects.requireNonNull(event.getGuild().getTextChannelById(channelIdToSendTo)).sendMessageEmbeds(mb).queue();
+ }
+}
diff --git a/src/main/java/org/papertrail/listeners/audit/helper/GuildUpdateEventHelper.java b/src/main/java/org/papertrail/listeners/audit/helper/GuildUpdateEventHelper.java
new file mode 100644
index 00000000..c8bc8766
--- /dev/null
+++ b/src/main/java/org/papertrail/listeners/audit/helper/GuildUpdateEventHelper.java
@@ -0,0 +1,126 @@
+package org.papertrail.listeners.audit.helper;
+
+import lombok.experimental.UtilityClass;
+import net.dv8tion.jda.api.EmbedBuilder;
+import net.dv8tion.jda.api.audit.AuditLogChange;
+import net.dv8tion.jda.api.audit.AuditLogEntry;
+import net.dv8tion.jda.api.entities.MessageEmbed;
+import net.dv8tion.jda.api.entities.User;
+import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
+import org.papertrail.commons.utilities.GuildSystemChannelFlagResolver;
+import org.papertrail.commons.utilities.TypeResolver;
+
+import java.awt.Color;
+import java.util.Map;
+import java.util.Objects;
+
+@UtilityClass
+public class GuildUpdateEventHelper {
+
+ public static void format(GuildAuditLogEntryCreateEvent event, AuditLogEntry ale, String channelIdToSendTo) {
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("Audit Log Entry | Guild Update Event");
+
+ User executor = ale.getJDA().getUserById(ale.getUserIdLong());
+ String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
+
+ eb.setDescription("๐ค **By**: "+mentionableExecutor+"\nโน๏ธ The following guild updates were recorded");
+ eb.setColor(Color.MAGENTA);
+
+ eb.addField("Action Type", String.valueOf(ale.getType()), true);
+ eb.addField("Target Type", String.valueOf(ale.getTargetType()), true);
+
+ for(Map.Entry changes: ale.getChanges().entrySet()) {
+
+ String change = changes.getKey();
+ Object oldValue = changes.getValue().getOldValue();
+ Object newValue = changes.getValue().getNewValue();
+
+ switch(change) {
+
+ case "description":
+ eb.addField("Description Change", "from `"+oldValue+"` to `"+newValue+"`", false);
+ break;
+
+ case "icon_hash":
+ eb.addField("Icon Hash Change", "from `"+oldValue+"` to `"+newValue+"`", false);
+ break;
+
+ case "name":
+ eb.addField("Guild Name Change", "from `"+oldValue+"` to `"+newValue+"`", false);
+ break;
+
+ case "afk_channel_id":
+ eb.addField("AFK Channel Changed To", "`"+newValue+"`", false);
+ break;
+
+ case "default_message_notifications":
+ eb.addField("Default Message Notifications Update", "`"+newValue+"`", false);
+ break;
+
+ case "afk_timeout":
+ eb.addField("AFK Channel Timeout Change", "`"+newValue+"s`", false);
+ break;
+
+ case "system_channel_id":
+ eb.addField("Community Updates Channel Changed To", "`"+newValue+"`", false);
+ break;
+
+ case "widget_enabled":
+ eb.addField("Widget Enabled", "`"+newValue+"`", false);
+ break;
+
+ case "widget_channel_id":
+ eb.addField("Widget Channel Changed To", "`"+newValue+"`", false);
+ break;
+
+ case "premium_progress_bar_enabled":
+ eb.addField("Server Boost Progress Bar Enabled", "`"+newValue+"`", false);
+ break;
+
+ case "mfa_level":
+ eb.addField("MFA Requirement", "`"+newValue+"`", false);
+ break;
+
+ case "verification_level":
+ eb.addField("Verification Level", "`"+ TypeResolver.guildVerificationLevelResolver(newValue)+"`", false);
+ break;
+
+ case "owner_id":
+ User oldOwner = ale.getJDA().getUserById(String.valueOf(oldValue));
+ User newOwner = ale.getJDA().getUserById(String.valueOf(newValue));
+ String mentionableOldOwner = (oldOwner!=null ? oldOwner.getAsMention() : String.valueOf(oldValue));
+ String mentionableNewOwner = (newOwner!=null ? newOwner.getAsMention() : String.valueOf(newValue));
+ eb.addField("Ownership Change", "from "+mentionableOldOwner+" to "+mentionableNewOwner, false);
+ break;
+
+ case "public_updates_channel_id":
+ eb.addField("Announcements Channel Changed To", "`"+newValue+"`", false);
+ break;
+
+ case "rules_channel_id":
+ eb.addField("Rules Channel Changed To", "`"+newValue+"`", false);
+ break;
+
+
+ case "system_channel_flags":
+ eb.addField("System Channel Flags", GuildSystemChannelFlagResolver.getParsedFlags(newValue), false);
+ break;
+
+ case "explicit_content_filter":
+ eb.addField("Explicit Content Filter", TypeResolver.explicitFilterTypeResolver(newValue), false);
+ break;
+
+ default:
+ eb.addField(change, "from "+oldValue+" to "+newValue, false);
+ }
+ }
+
+ eb.setFooter("Audit Log Entry ID: "+ale.getId());
+ eb.setTimestamp(ale.getTimeCreated());
+
+ MessageEmbed mb = eb.build();
+
+ Objects.requireNonNull(event.getGuild().getTextChannelById(channelIdToSendTo)).sendMessageEmbeds(mb).queue();
+ }
+}
diff --git a/src/main/java/org/papertrail/listeners/audit/helper/IntegrationCreateEventHelper.java b/src/main/java/org/papertrail/listeners/audit/helper/IntegrationCreateEventHelper.java
new file mode 100644
index 00000000..068dec7a
--- /dev/null
+++ b/src/main/java/org/papertrail/listeners/audit/helper/IntegrationCreateEventHelper.java
@@ -0,0 +1,59 @@
+package org.papertrail.listeners.audit.helper;
+
+import lombok.experimental.UtilityClass;
+import net.dv8tion.jda.api.EmbedBuilder;
+import net.dv8tion.jda.api.audit.AuditLogChange;
+import net.dv8tion.jda.api.audit.AuditLogEntry;
+import net.dv8tion.jda.api.entities.MessageEmbed;
+import net.dv8tion.jda.api.entities.User;
+import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
+
+import java.awt.Color;
+import java.util.Map;
+import java.util.Objects;
+
+@UtilityClass
+public class IntegrationCreateEventHelper {
+
+ public static void format(GuildAuditLogEntryCreateEvent event, AuditLogEntry ale, String channelIdToSendTo) {
+
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("Audit Log Entry | Integration Create Event");
+
+ User executor = ale.getJDA().getUserById(ale.getUserIdLong());
+ String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
+
+ eb.setDescription("๐ค **By**: "+mentionableExecutor+"\nโน๏ธ The following integration was created");
+ eb.setColor(Color.PINK);
+
+ eb.addField("Action Type", String.valueOf(ale.getType()), true);
+ eb.addField("Target Type", String.valueOf(ale.getTargetType()), true);
+
+ for(Map.Entry changes: ale.getChanges().entrySet()) {
+
+ String change = changes.getKey();
+ Object oldValue = changes.getValue().getOldValue();
+ Object newValue = changes.getValue().getNewValue();
+
+ switch(change) {
+ case "type":
+ eb.addField("Integration Type","โฐโโค"+newValue, false);
+ break;
+
+ case "name":
+ eb.addField("Integration Name", "โฐโโค"+newValue, false);
+ break;
+
+ default:
+ eb.addField(change, "from "+oldValue+" to "+newValue, false);
+ }
+ }
+
+ eb.setFooter("Audit Log Entry ID: "+ale.getId());
+ eb.setTimestamp(ale.getTimeCreated());
+
+ MessageEmbed mb = eb.build();
+
+ Objects.requireNonNull(event.getGuild().getTextChannelById(channelIdToSendTo)).sendMessageEmbeds(mb).queue();
+ }
+}
diff --git a/src/main/java/org/papertrail/listeners/audit/helper/IntegrationDeleteEventHelper.java b/src/main/java/org/papertrail/listeners/audit/helper/IntegrationDeleteEventHelper.java
new file mode 100644
index 00000000..dd202d2a
--- /dev/null
+++ b/src/main/java/org/papertrail/listeners/audit/helper/IntegrationDeleteEventHelper.java
@@ -0,0 +1,59 @@
+package org.papertrail.listeners.audit.helper;
+
+import lombok.experimental.UtilityClass;
+import net.dv8tion.jda.api.EmbedBuilder;
+import net.dv8tion.jda.api.audit.AuditLogChange;
+import net.dv8tion.jda.api.audit.AuditLogEntry;
+import net.dv8tion.jda.api.entities.MessageEmbed;
+import net.dv8tion.jda.api.entities.User;
+import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
+
+import java.awt.Color;
+import java.util.Map;
+import java.util.Objects;
+
+@UtilityClass
+public class IntegrationDeleteEventHelper {
+
+ public static void format(GuildAuditLogEntryCreateEvent event, AuditLogEntry ale, String channelIdToSendTo) {
+
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("Audit Log Entry | Integration Delete Event");
+
+ User executor = ale.getJDA().getUserById(ale.getUserIdLong());
+ String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
+
+ eb.setDescription("๐ค **By**: "+mentionableExecutor+"\nโน๏ธ The following integration was deleted");
+ eb.setColor(Color.RED);
+
+ eb.addField("Action Type", String.valueOf(ale.getType()), true);
+ eb.addField("Target Type", String.valueOf(ale.getTargetType()), true);
+
+ for(Map.Entry changes: ale.getChanges().entrySet()) {
+
+ String change = changes.getKey();
+ Object oldValue = changes.getValue().getOldValue();
+ Object newValue = changes.getValue().getNewValue();
+
+ switch(change) {
+ case "type":
+ eb.addField("โ๏ธ Integration Type", "โฐโโค"+oldValue, false);
+ break;
+
+ case "name":
+ eb.addField("๐ท๏ธ Integration Name", "โฐโโค"+oldValue, false);
+ break;
+
+ default:
+ eb.addField(change, "from "+oldValue+" to "+newValue, false);
+ }
+ }
+
+ eb.setFooter("Audit Log Entry ID: "+ale.getId());
+ eb.setTimestamp(ale.getTimeCreated());
+
+ MessageEmbed mb = eb.build();
+
+ Objects.requireNonNull(event.getGuild().getTextChannelById(channelIdToSendTo)).sendMessageEmbeds(mb).queue();
+ }
+}
diff --git a/src/main/java/org/papertrail/listeners/audit/helper/InviteCreateEventHelper.java b/src/main/java/org/papertrail/listeners/audit/helper/InviteCreateEventHelper.java
new file mode 100644
index 00000000..a1ea94aa
--- /dev/null
+++ b/src/main/java/org/papertrail/listeners/audit/helper/InviteCreateEventHelper.java
@@ -0,0 +1,81 @@
+package org.papertrail.listeners.audit.helper;
+
+import lombok.experimental.UtilityClass;
+import net.dv8tion.jda.api.EmbedBuilder;
+import net.dv8tion.jda.api.audit.AuditLogChange;
+import net.dv8tion.jda.api.audit.AuditLogEntry;
+import net.dv8tion.jda.api.entities.MessageEmbed;
+import net.dv8tion.jda.api.entities.User;
+import net.dv8tion.jda.api.entities.channel.middleman.GuildChannel;
+import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
+import org.papertrail.commons.utilities.DurationFormatter;
+
+import java.awt.Color;
+import java.util.Map;
+import java.util.Objects;
+
+@UtilityClass
+public class InviteCreateEventHelper {
+
+ public static void format(GuildAuditLogEntryCreateEvent event, AuditLogEntry ale , String channelIdToSendTo) {
+
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("Audit Log Entry | Invite Create Event");
+
+ User executor = ale.getJDA().getUserById(ale.getUserIdLong());
+ String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
+
+ eb.setDescription("๐ค **By**: "+mentionableExecutor+"\nโน๏ธ The following invite was created");
+ eb.setColor(Color.CYAN);
+ eb.addField("Action Type", String.valueOf(ale.getType()), true);
+ eb.addField("Target Type", String.valueOf(ale.getTargetType()), true);
+
+ for(Map.Entry changes: ale.getChanges().entrySet()) {
+
+ String change = changes.getKey();
+ Object oldValue = changes.getValue().getOldValue();
+ Object newValue = changes.getValue().getNewValue();
+
+ switch(change) {
+
+ case "code":
+ eb.addField("๐ Invite Code", "โฐโโค"+newValue, false);
+ break;
+
+ case "inviter_id":
+ User inviter = ale.getJDA().getUserById(String.valueOf(newValue));
+ eb.addField("๐ค Invite Created By", "โฐโโค"+(inviter != null ? inviter.getAsMention() : ale.getUserId()), false);
+ break;
+
+ case "temporary":
+ eb.addField("๐ Temporary Invite", "โฐโโค"+((Boolean.TRUE.equals(newValue)) ? "โ
" : "โ"), false);
+ break;
+
+ case "max_uses":
+ int maxUses = Integer.parseInt(String.valueOf(newValue));
+ eb.addField("๐ข Max Uses", "โฐโโค"+(maxUses == 0 ? "Unlimited" : String.valueOf(maxUses)), false);
+ break;
+ case "uses", "flags":
+ break;
+
+ case "max_age":
+ eb.addField("โณ Expires After", "โฐโโค"+ DurationFormatter.formatSeconds(newValue), false);
+ break;
+ case "channel_id":
+ GuildChannel channel = ale.getGuild().getGuildChannelById(String.valueOf(newValue));
+ eb.addField("๐ฌ Invite Channel", "โฐโโค"+(channel != null ? channel.getAsMention() : "`"+newValue+"`"), false);
+ break;
+ default:
+ eb.addField(change, "from "+oldValue+" to "+newValue, false);
+ }
+ }
+
+ eb.setFooter("Audit Log Entry ID: "+ale.getId());
+ eb.setTimestamp(ale.getTimeCreated());
+
+ MessageEmbed mb = eb.build();
+
+ Objects.requireNonNull(event.getGuild().getTextChannelById(channelIdToSendTo)).sendMessageEmbeds(mb).queue();
+
+ }
+}
diff --git a/src/main/java/org/papertrail/listeners/audit/helper/InviteDeleteEventHelper.java b/src/main/java/org/papertrail/listeners/audit/helper/InviteDeleteEventHelper.java
new file mode 100644
index 00000000..efb147e4
--- /dev/null
+++ b/src/main/java/org/papertrail/listeners/audit/helper/InviteDeleteEventHelper.java
@@ -0,0 +1,74 @@
+package org.papertrail.listeners.audit.helper;
+
+import lombok.experimental.UtilityClass;
+import net.dv8tion.jda.api.EmbedBuilder;
+import net.dv8tion.jda.api.audit.AuditLogChange;
+import net.dv8tion.jda.api.audit.AuditLogEntry;
+import net.dv8tion.jda.api.entities.MessageEmbed;
+import net.dv8tion.jda.api.entities.User;
+import net.dv8tion.jda.api.entities.channel.Channel;
+import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
+
+import java.awt.Color;
+import java.util.Map;
+import java.util.Objects;
+
+@UtilityClass
+public class InviteDeleteEventHelper {
+
+ public static void format(GuildAuditLogEntryCreateEvent event, AuditLogEntry ale, String channelIdToSendTo) {
+
+ 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("๐ค **By**: "+mentionableExecutor+"\nโน๏ธ The following invite has been deleted");
+ eb.setColor(Color.BLUE);
+ eb.addField("Action Type", String.valueOf(ale.getType()), true);
+ eb.addField("Target Type", String.valueOf(ale.getTargetType()), true);
+
+ for(Map.Entry changes: ale.getChanges().entrySet()) {
+
+ String change = changes.getKey();
+ Object oldValue = changes.getValue().getOldValue();
+ Object newValue = changes.getValue().getNewValue();
+
+ switch(change) {
+
+ case "code":
+ eb.addField("๐ Deleted Invite Code", "โฐโโค"+oldValue, false);
+ break;
+
+ case "inviter_id":
+ User inviter = ale.getJDA().getUserById(String.valueOf(oldValue));
+ eb.addField("๐ค Invite Originally Created By", "โฐโโค"+(inviter != null ? inviter.getAsMention() : "`Unknown`"), false);
+ break;
+
+ case "temporary":
+ eb.addField("๐ Temporary Invite", "โฐโโค"+((Boolean.TRUE.equals(oldValue)) ? "โ
" : "โ"), false);
+ break;
+
+ case "max_uses", "flags", "max_age":
+ break;
+ case "uses":
+ eb.addField("๐ข Number of times the invite was used", "โฐโโค"+oldValue, false);
+ break;
+ case "channel_id":
+ Channel channel = ale.getGuild().getGuildChannelById(String.valueOf(oldValue));
+ eb.addField("๐ฌ Invite Channel", "โฐโโค"+(channel != null ? channel.getAsMention() : "`"+oldValue+"`"), false);
+ break;
+ default:
+ eb.addField(change, "from "+oldValue+" to "+newValue, false);
+ }
+ }
+
+ eb.setFooter("Audit Log Entry ID: "+ale.getId());
+ eb.setTimestamp(ale.getTimeCreated());
+
+ MessageEmbed mb = eb.build();
+
+ Objects.requireNonNull(event.getGuild().getTextChannelById(channelIdToSendTo)).sendMessageEmbeds(mb).queue();
+ }
+}
diff --git a/src/main/java/org/papertrail/listeners/audit/helper/KickEventHelper.java b/src/main/java/org/papertrail/listeners/audit/helper/KickEventHelper.java
new file mode 100644
index 00000000..42800a55
--- /dev/null
+++ b/src/main/java/org/papertrail/listeners/audit/helper/KickEventHelper.java
@@ -0,0 +1,47 @@
+package org.papertrail.listeners.audit.helper;
+
+import lombok.experimental.UtilityClass;
+import net.dv8tion.jda.api.EmbedBuilder;
+import net.dv8tion.jda.api.audit.AuditLogEntry;
+import net.dv8tion.jda.api.entities.MessageEmbed;
+import net.dv8tion.jda.api.entities.User;
+import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
+
+import java.awt.Color;
+import java.util.Objects;
+
+@UtilityClass
+public class KickEventHelper {
+
+ public static void format(GuildAuditLogEntryCreateEvent event, AuditLogEntry ale, String channelIdToSendTo) {
+
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("Audit Log Entry | Kick Event");
+
+ User executor = ale.getJDA().getUserById(ale.getUserIdLong());
+ String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
+
+ eb.setDescription("๐ค **By**: "+mentionableExecutor+"\nโน๏ธ The following member was kicked");
+ eb.setColor(Color.ORANGE);
+ eb.addField("Action Type", String.valueOf(ale.getType()), true);
+ eb.addField("Target Type", String.valueOf(ale.getTargetType()), true);
+
+ String moderatorId = ale.getUserId();
+ String targetId = ale.getTargetId();
+ String reason = ale.getReason();
+
+ // A REST Action is required here because kicked members are not cached
+ event.getJDA().retrieveUserById(moderatorId).queue(moderator->
+ event.getJDA().retrieveUserById(targetId).queue(target->{
+ // if user objects are null we cannot use their mention so we instead use their IDs instead since they will never be null
+ eb.addField("๐ข A member/application has been kicked", "โฐโโค"+(moderator!=null ? moderator.getAsMention() : moderatorId)+" has kicked "+(target!=null ? target.getAsMention() : targetId), false);
+ eb.addField("๐ With Reason", "โฐโโค"+(reason!=null ? reason : "No Reason Provided"), false);
+
+ eb.setFooter("Audit Log Entry ID: "+ale.getId());
+ eb.setTimestamp(ale.getTimeCreated());
+ MessageEmbed mb = eb.build();
+ Objects.requireNonNull(event.getGuild().getTextChannelById(channelIdToSendTo)).sendMessageEmbeds(mb).queue();
+ })
+ );
+ }
+}
diff --git a/src/main/java/org/papertrail/listeners/audit/helper/MemberRoleUpdateEventHelper.java b/src/main/java/org/papertrail/listeners/audit/helper/MemberRoleUpdateEventHelper.java
new file mode 100644
index 00000000..abddf2d2
--- /dev/null
+++ b/src/main/java/org/papertrail/listeners/audit/helper/MemberRoleUpdateEventHelper.java
@@ -0,0 +1,72 @@
+package org.papertrail.listeners.audit.helper;
+
+import lombok.experimental.UtilityClass;
+import net.dv8tion.jda.api.EmbedBuilder;
+import net.dv8tion.jda.api.audit.AuditLogChange;
+import net.dv8tion.jda.api.audit.AuditLogEntry;
+import net.dv8tion.jda.api.entities.MessageEmbed;
+import net.dv8tion.jda.api.entities.User;
+import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
+import org.papertrail.commons.utilities.MemberRoleUpdateParser;
+
+import java.awt.Color;
+import java.util.Map;
+import java.util.Objects;
+
+@UtilityClass
+public class MemberRoleUpdateEventHelper {
+
+ public static void format(GuildAuditLogEntryCreateEvent event, AuditLogEntry ale, String channelIdToSendTo) {
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("Audit Log Entry | Member Role Update");
+
+ User executor = ale.getJDA().getUserById(ale.getUserIdLong());
+ User target = ale.getJDA().getUserById(ale.getTargetIdLong());
+
+ String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
+ String mentionableTarget = (target !=null ? target.getAsMention() : ale.getTargetId());
+
+ eb.setDescription("๐ค **By**: "+mentionableExecutor+"\nโน๏ธ The following member role was updated");
+ eb.setThumbnail(Objects.requireNonNull(event.getGuild().getMemberById(ale.getTargetIdLong())).getEffectiveAvatarUrl());
+ eb.setColor(Color.CYAN);
+
+ eb.addField("Action Type", String.valueOf(ale.getType()), true);
+ eb.addField("Target Type", String.valueOf(ale.getTargetType()), true);
+
+ for(Map.Entry changes: ale.getChanges().entrySet()) {
+
+ String change = changes.getKey();
+ Object oldValue = changes.getValue().getOldValue();
+ Object newValue = changes.getValue().getNewValue();
+
+ switch(change) {
+
+ case "$add":
+ eb.setColor(Color.GREEN);
+ eb.addField("Target Member", "โฐโโค"+mentionableTarget, false);
+ Map addedRoleNameAndId = MemberRoleUpdateParser.parseRoleUpdate(newValue);
+ eb.addField("Role Added", "โ
"+addedRoleNameAndId.getOrDefault("name", "`ERROR: Name Not Found`"), false);
+ eb.addField("Added Role ID", "โฐโโค"+addedRoleNameAndId.getOrDefault("id", "`ERROR: ID Not Found`"), false);
+ break;
+
+ case "$remove":
+ eb.setColor(Color.RED);
+ eb.addField("Target Member", "โฐโโค"+mentionableTarget, false);
+ Map removedRoleNameAndId = MemberRoleUpdateParser.parseRoleUpdate(newValue);
+ eb.addField("Role Removed", "โ "+removedRoleNameAndId.getOrDefault("name", "`ERROR: Name Not Found`"), false);
+ eb.addField("Removed Role ID", "โฐโโค"+removedRoleNameAndId.getOrDefault("id", "`ERROR: ID Not Found`"), false);
+ break;
+
+ default:
+ eb.addField(change, "from "+oldValue+" to "+newValue, false);
+ }
+ }
+
+ eb.setFooter("Audit Log Entry ID: "+ale.getId());
+ eb.setTimestamp(ale.getTimeCreated());
+
+ MessageEmbed mb = eb.build();
+
+ Objects.requireNonNull(event.getGuild().getTextChannelById(channelIdToSendTo)).sendMessageEmbeds(mb).queue();
+ }
+}
diff --git a/src/main/java/org/papertrail/listeners/audit/helper/MemberUpdateEventHelper.java b/src/main/java/org/papertrail/listeners/audit/helper/MemberUpdateEventHelper.java
new file mode 100644
index 00000000..1323991f
--- /dev/null
+++ b/src/main/java/org/papertrail/listeners/audit/helper/MemberUpdateEventHelper.java
@@ -0,0 +1,91 @@
+package org.papertrail.listeners.audit.helper;
+
+import lombok.experimental.UtilityClass;
+import net.dv8tion.jda.api.EmbedBuilder;
+import net.dv8tion.jda.api.audit.AuditLogChange;
+import net.dv8tion.jda.api.audit.AuditLogEntry;
+import net.dv8tion.jda.api.entities.MessageEmbed;
+import net.dv8tion.jda.api.entities.User;
+import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
+import org.papertrail.commons.utilities.DurationFormatter;
+
+import java.awt.Color;
+import java.util.Map;
+import java.util.Objects;
+
+@UtilityClass
+public class MemberUpdateEventHelper {
+
+ public static void format(GuildAuditLogEntryCreateEvent event, AuditLogEntry ale, String channelIdToSendTo) {
+
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("Audit Log Entry | Member Update Event");
+
+ User executor = ale.getJDA().getUserById(ale.getUserIdLong());
+ User target = ale.getJDA().getUserById(ale.getTargetIdLong());
+
+ String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
+ String mentionableTarget = (target !=null ? target.getAsMention() : ale.getTargetId());
+
+ eb.setDescription("๐ค **By**: "+mentionableExecutor+"\nโน๏ธ The following member was updated");
+ eb.setThumbnail(Objects.requireNonNull(event.getGuild().getMemberById(ale.getTargetId())).getEffectiveAvatarUrl());
+ eb.setColor(Color.CYAN);
+ eb.addField("Action Type", String.valueOf(ale.getType()), true);
+ eb.addField("Target Type", String.valueOf(ale.getTargetType()), true);
+
+ for(Map.Entry changes: ale.getChanges().entrySet()) {
+
+ String change = changes.getKey();
+ Object oldValue = changes.getValue().getOldValue();
+ Object newValue = changes.getValue().getNewValue();
+
+ switch(change) {
+
+ case "communication_disabled_until":
+ if(newValue==null) {
+ eb.setColor(Color.GREEN);
+ eb.addField("๐ข Timeout Lifted", "โฐโโค Timeout for "+mentionableTarget+ " has been removed", false);
+ } else {
+ eb.setColor(Color.YELLOW);
+ eb.addField("โ Timeout Received", "โฐโโค"+mentionableTarget+ " has received a timeout", false);
+ eb.addField("โฑ๏ธ Till", "โฐโโค"+ DurationFormatter.isoToLocalTimeCounter(newValue), false);
+ eb.addField("๐ Reason", "โฐโโค"+(ale.getReason()!=null ? ale.getReason() : "No Reason Provided"), false);
+ }
+
+ break;
+
+ case "nick":
+ if(oldValue!=null && newValue==null) { // resetting to default nickname
+ eb.addField("๐ท๏ธ Nickname Update", "โฐโโค"+"Reset "+mentionableTarget+"'s name", false);
+ } else if(oldValue != null) { // changing from one nickname to another
+ eb.addField("๐ท๏ธ Nickname Update", "โฐโโค"+"Updated "+mentionableTarget+"'s name from "+oldValue+ " to "+ newValue, false);
+ } else if(newValue != null) { // changing from default nickname to a new nickname
+ eb.addField("๐ท๏ธ Nickname Update", "โฐโโค"+"Set "+mentionableTarget+"'s name as "+ newValue, false);
+ }
+ break;
+
+ case "mute":
+ eb.addField("๐๏ธ Is Muted", "โฐโโคSet "+mentionableTarget+"'s Mute Status as "+ ((Boolean.TRUE.equals(newValue)) ? "โ
" : "โ"), false);
+ break;
+
+ case "deaf":
+ eb.addField("๐ Is Deafened", "โฐโโคSet "+mentionableTarget+"'s Deafened Status as "+ ((Boolean.TRUE.equals(newValue)) ? "โ
" : "โ"), false);
+ break;
+
+ case "bypasses_verification":
+ eb.addField("๐ก๏ธ Bypass Verification", "โฐโโคSet "+mentionableTarget+"'s verification bypass status as "+ ((Boolean.TRUE.equals(newValue)) ? "โ
" : "โ"), false);
+ break;
+
+ default:
+ eb.addField(change, "from "+oldValue+" to "+newValue, false);
+ }
+ }
+
+ eb.setFooter("Audit Log Entry ID: "+ale.getId());
+ eb.setTimestamp(ale.getTimeCreated());
+
+ MessageEmbed mb = eb.build();
+
+ Objects.requireNonNull(event.getGuild().getTextChannelById(channelIdToSendTo)).sendMessageEmbeds(mb).queue();
+ }
+}
diff --git a/src/main/java/org/papertrail/listeners/audit/helper/MemberVoiceKickEventHelper.java b/src/main/java/org/papertrail/listeners/audit/helper/MemberVoiceKickEventHelper.java
new file mode 100644
index 00000000..940c1e8b
--- /dev/null
+++ b/src/main/java/org/papertrail/listeners/audit/helper/MemberVoiceKickEventHelper.java
@@ -0,0 +1,37 @@
+package org.papertrail.listeners.audit.helper;
+
+import lombok.experimental.UtilityClass;
+import net.dv8tion.jda.api.EmbedBuilder;
+import net.dv8tion.jda.api.audit.AuditLogEntry;
+import net.dv8tion.jda.api.entities.MessageEmbed;
+import net.dv8tion.jda.api.entities.User;
+import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
+
+import java.awt.Color;
+import java.util.Objects;
+
+@UtilityClass
+public class MemberVoiceKickEventHelper {
+
+ // the audit log does not expose much information regarding member vc move and kick events
+ // therefore GuildVoiceListener has been created to know about channels the target has been moved or kicked from
+ public static void format(GuildAuditLogEntryCreateEvent event, AuditLogEntry ale, String channelIdToSendTo) {
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("Audit Log Entry | Member Voice Kick Event");
+
+ User executor = ale.getJDA().getUserById(ale.getUserId());
+ String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
+
+ eb.setDescription("๐ค **By**: "+mentionableExecutor+"\nโน๏ธ A voice kick event was detected");
+ eb.setColor(Color.RED);
+
+ eb.addField("Action Type", String.valueOf(ale.getType()), true);
+ eb.addField("Target Type", String.valueOf(ale.getTargetType()), true);
+
+ eb.setFooter("Audit Log Entry ID: "+ale.getId());
+ eb.setTimestamp(ale.getTimeCreated());
+
+ MessageEmbed mb = eb.build();
+ Objects.requireNonNull(event.getGuild().getTextChannelById(channelIdToSendTo)).sendMessageEmbeds(mb).queue();
+ }
+}
diff --git a/src/main/java/org/papertrail/listeners/audit/helper/MemberVoiceMoveEventHelper.java b/src/main/java/org/papertrail/listeners/audit/helper/MemberVoiceMoveEventHelper.java
new file mode 100644
index 00000000..24ea43dd
--- /dev/null
+++ b/src/main/java/org/papertrail/listeners/audit/helper/MemberVoiceMoveEventHelper.java
@@ -0,0 +1,37 @@
+package org.papertrail.listeners.audit.helper;
+
+import lombok.experimental.UtilityClass;
+import net.dv8tion.jda.api.EmbedBuilder;
+import net.dv8tion.jda.api.audit.AuditLogEntry;
+import net.dv8tion.jda.api.entities.MessageEmbed;
+import net.dv8tion.jda.api.entities.User;
+import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
+
+import java.awt.Color;
+import java.util.Objects;
+
+@UtilityClass
+public class MemberVoiceMoveEventHelper {
+
+ // the audit log does not expose much information regarding member vc move and kick events
+ // therefore GuildVoiceListener has been created to know about channels the target has been moved or kicked from
+ public static void format(GuildAuditLogEntryCreateEvent event, AuditLogEntry ale, String channelIdToSendTo) {
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("Audit Log Entry | Member Voice Move Event");
+
+ User executor = ale.getJDA().getUserById(ale.getUserId());
+ String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
+
+ eb.setDescription("๐ค **By**: "+mentionableExecutor+"\nโน๏ธ A voice move event was detected");
+ eb.setColor(Color.YELLOW);
+
+ eb.addField("Action Type", String.valueOf(ale.getType()), true);
+ eb.addField("Target Type", String.valueOf(ale.getTargetType()), true);
+
+ eb.setFooter("Audit Log Entry ID: "+ale.getId());
+ eb.setTimestamp(ale.getTimeCreated());
+
+ MessageEmbed mb = eb.build();
+ Objects.requireNonNull(event.getGuild().getTextChannelById(channelIdToSendTo)).sendMessageEmbeds(mb).queue();
+ }
+}
diff --git a/src/main/java/org/papertrail/listeners/audit/helper/MessagePinEventHelper.java b/src/main/java/org/papertrail/listeners/audit/helper/MessagePinEventHelper.java
new file mode 100644
index 00000000..570dd6ae
--- /dev/null
+++ b/src/main/java/org/papertrail/listeners/audit/helper/MessagePinEventHelper.java
@@ -0,0 +1,37 @@
+package org.papertrail.listeners.audit.helper;
+
+import lombok.experimental.UtilityClass;
+import net.dv8tion.jda.api.EmbedBuilder;
+import net.dv8tion.jda.api.audit.AuditLogEntry;
+import net.dv8tion.jda.api.entities.MessageEmbed;
+import net.dv8tion.jda.api.entities.User;
+import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
+
+import java.awt.Color;
+import java.util.Objects;
+
+@UtilityClass
+public class MessagePinEventHelper {
+
+ // this audit log event does not expose anything other than the executor of the event
+ public static void format(GuildAuditLogEntryCreateEvent event, AuditLogEntry ale, String channelIdToSendTo) {
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("Audit Log Entry | Message Pin Event");
+
+ User executor = ale.getJDA().getUserById(ale.getTargetId());
+ String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getTargetId());
+
+ eb.setDescription("๐ค **A message from **: "+mentionableExecutor+" was pinned");
+ eb.setColor(Color.PINK);
+
+ eb.addField("Action Type", String.valueOf(ale.getType()), true);
+ eb.addField("Target Type", String.valueOf(ale.getTargetType()), true);
+
+ eb.setFooter("Audit Log Entry ID: "+ale.getId());
+ eb.setTimestamp(ale.getTimeCreated());
+
+ MessageEmbed mb = eb.build();
+ Objects.requireNonNull(event.getGuild().getTextChannelById(channelIdToSendTo)).sendMessageEmbeds(mb).queue();
+ }
+
+}
diff --git a/src/main/java/org/papertrail/listeners/audit/helper/MessageUnpinEventHelper.java b/src/main/java/org/papertrail/listeners/audit/helper/MessageUnpinEventHelper.java
new file mode 100644
index 00000000..9ef58ce3
--- /dev/null
+++ b/src/main/java/org/papertrail/listeners/audit/helper/MessageUnpinEventHelper.java
@@ -0,0 +1,36 @@
+package org.papertrail.listeners.audit.helper;
+
+import lombok.experimental.UtilityClass;
+import net.dv8tion.jda.api.EmbedBuilder;
+import net.dv8tion.jda.api.audit.AuditLogEntry;
+import net.dv8tion.jda.api.entities.MessageEmbed;
+import net.dv8tion.jda.api.entities.User;
+import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
+
+import java.awt.Color;
+import java.util.Objects;
+
+@UtilityClass
+public class MessageUnpinEventHelper {
+
+ // this audit log event does not expose anything other than the executor of the event
+ public static void format(GuildAuditLogEntryCreateEvent event, AuditLogEntry ale, String channelIdToSendTo) {
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("Audit Log Entry | Message Unpin Event");
+
+ User executor = ale.getJDA().getUserById(ale.getTargetId());
+ String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getTargetId());
+
+ eb.setDescription("๐ค **A message from **: "+mentionableExecutor+" un-pinned");
+ eb.setColor(Color.MAGENTA);
+
+ eb.addField("Action Type", String.valueOf(ale.getType()), true);
+ eb.addField("Target Type", String.valueOf(ale.getTargetType()), true);
+
+ eb.setFooter("Audit Log Entry ID: "+ale.getId());
+ eb.setTimestamp(ale.getTimeCreated());
+
+ MessageEmbed mb = eb.build();
+ Objects.requireNonNull(event.getGuild().getTextChannelById(channelIdToSendTo)).sendMessageEmbeds(mb).queue();
+ }
+}
diff --git a/src/main/java/org/papertrail/listeners/audit/helper/RoleCreateEventHelper.java b/src/main/java/org/papertrail/listeners/audit/helper/RoleCreateEventHelper.java
new file mode 100644
index 00000000..18022fed
--- /dev/null
+++ b/src/main/java/org/papertrail/listeners/audit/helper/RoleCreateEventHelper.java
@@ -0,0 +1,68 @@
+package org.papertrail.listeners.audit.helper;
+
+import lombok.experimental.UtilityClass;
+import net.dv8tion.jda.api.EmbedBuilder;
+import net.dv8tion.jda.api.audit.AuditLogChange;
+import net.dv8tion.jda.api.audit.AuditLogEntry;
+import net.dv8tion.jda.api.entities.MessageEmbed;
+import net.dv8tion.jda.api.entities.Role;
+import net.dv8tion.jda.api.entities.User;
+import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
+
+import java.awt.Color;
+import java.util.Map;
+import java.util.Objects;
+
+@UtilityClass
+public class RoleCreateEventHelper {
+
+ public static void format(GuildAuditLogEntryCreateEvent event, AuditLogEntry ale, String channelIdToSendTo) {
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("Audit Log Entry | Role Create Event");
+
+ User executor = ale.getJDA().getUserById(ale.getUserId());
+ Role targetRole = ale.getJDA().getRoleById(ale.getTargetId());
+
+ String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
+ String mentionableTargetRole = (targetRole !=null ? targetRole.getAsMention() : ale.getTargetId());
+
+ eb.setDescription("๐ค **By**: "+mentionableExecutor+"\n The following role was created");
+ eb.setColor(Color.GREEN);
+
+ eb.addField("Action Type", String.valueOf(ale.getType()), true);
+ eb.addField("Target Type", String.valueOf(ale.getTargetType()), true);
+
+ eb.addField("Target Role", mentionableTargetRole, false);
+ for(Map.Entry changes: ale.getChanges().entrySet()) {
+
+ String change = changes.getKey();
+ Object oldValue = changes.getValue().getOldValue();
+ Object newValue = changes.getValue().getNewValue();
+
+ switch(change) {
+
+ case "name":
+ eb.addField("๐ท๏ธ Role Name", "โฐโโค"+newValue, false);
+ break;
+
+ /*
+ * 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
+ */
+ case "colors", "hoist", "color", "permissions", "mentionable":
+ break;
+
+ default:
+ eb.addField(change, "from "+oldValue+" to "+newValue, false);
+ }
+ }
+
+ eb.setFooter("Audit Log Entry ID: "+ale.getId());
+ eb.setTimestamp(ale.getTimeCreated());
+
+ MessageEmbed mb = eb.build();
+
+ Objects.requireNonNull(event.getGuild().getTextChannelById(channelIdToSendTo)).sendMessageEmbeds(mb).queue();
+ }
+}
diff --git a/src/main/java/org/papertrail/listeners/audit/helper/RoleDeleteEventHelper.java b/src/main/java/org/papertrail/listeners/audit/helper/RoleDeleteEventHelper.java
new file mode 100644
index 00000000..f4619933
--- /dev/null
+++ b/src/main/java/org/papertrail/listeners/audit/helper/RoleDeleteEventHelper.java
@@ -0,0 +1,81 @@
+package org.papertrail.listeners.audit.helper;
+
+import lombok.experimental.UtilityClass;
+import net.dv8tion.jda.api.EmbedBuilder;
+import net.dv8tion.jda.api.audit.AuditLogChange;
+import net.dv8tion.jda.api.audit.AuditLogEntry;
+import net.dv8tion.jda.api.entities.MessageEmbed;
+import net.dv8tion.jda.api.entities.Role;
+import net.dv8tion.jda.api.entities.User;
+import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
+import org.papertrail.commons.utilities.ColorFormatter;
+import org.papertrail.commons.utilities.PermissionResolver;
+
+import java.awt.Color;
+import java.util.Map;
+import java.util.Objects;
+
+@UtilityClass
+public class RoleDeleteEventHelper {
+
+ public static void format(GuildAuditLogEntryCreateEvent event, AuditLogEntry ale, String channelIdToSendTo) {
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("Audit Log Entry | Role Delete Event");
+
+ User executor = ale.getJDA().getUserById(ale.getUserId());
+ Role targetRole = ale.getJDA().getRoleById(ale.getTargetId());
+
+ String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
+ String mentionableTargetRole = (targetRole !=null ? targetRole.getAsMention() : ale.getTargetId()); // this will always return the ID only
+
+ eb.setDescription("๐ค **By**: "+mentionableExecutor+"\nโน๏ธ The following role was deleted");
+ eb.setColor(Color.RED);
+
+ eb.addField("Action Type", String.valueOf(ale.getType()), true);
+ eb.addField("Target Type", String.valueOf(ale.getTargetType()), true);
+
+ for(Map.Entry changes: ale.getChanges().entrySet()) {
+
+ String change = changes.getKey();
+ Object oldValue = changes.getValue().getOldValue();
+ Object newValue = changes.getValue().getNewValue();
+
+ switch(change) {
+
+ case "name":
+ eb.addField("๐ท๏ธ Role Name", "โฐโโค"+oldValue, false);
+ break;
+
+ case "hoist":
+ eb.addField("๐ Display Seperately", "โฐโโค"+((Boolean.TRUE.equals(oldValue)) ? "โ
" : "โ"), false);
+ break;
+
+ case "color":
+ eb.addField("๐จ Color", "โฐโโค"+ ColorFormatter.formatToHex(oldValue), false);
+ break;
+
+ case "permissions":
+ eb.addField("Role Permissions", PermissionResolver.getParsedPermissions(oldValue, "โ
"), false);
+ break;
+
+ case "mentionable":
+ eb.addField("๐ Mentionable", "โฐโโค"+((Boolean.TRUE.equals(oldValue)) ? "โ
" : "โ"), false);
+ break;
+
+ case "colors":
+ eb.addField("๐ Gradient Color System", "โฐโโค"+ColorFormatter.formatGradientColorSystemToHex(oldValue), false);
+ break;
+ default:
+ eb.addField(change, "from "+oldValue+" to "+newValue, false);
+ }
+ }
+
+ eb.addField("๐ Deleted Role ID", "โฐโโค"+mentionableTargetRole, false);
+ eb.setFooter("Audit Log Entry ID: "+ale.getId());
+ eb.setTimestamp(ale.getTimeCreated());
+
+ MessageEmbed mb = eb.build();
+
+ Objects.requireNonNull(event.getGuild().getTextChannelById(channelIdToSendTo)).sendMessageEmbeds(mb).queue();
+ }
+}
diff --git a/src/main/java/org/papertrail/listeners/audit/helper/RoleUpdateEventHelper.java b/src/main/java/org/papertrail/listeners/audit/helper/RoleUpdateEventHelper.java
new file mode 100644
index 00000000..8298cd07
--- /dev/null
+++ b/src/main/java/org/papertrail/listeners/audit/helper/RoleUpdateEventHelper.java
@@ -0,0 +1,94 @@
+package org.papertrail.listeners.audit.helper;
+
+import lombok.experimental.UtilityClass;
+import net.dv8tion.jda.api.EmbedBuilder;
+import net.dv8tion.jda.api.audit.AuditLogChange;
+import net.dv8tion.jda.api.audit.AuditLogEntry;
+import net.dv8tion.jda.api.entities.MessageEmbed;
+import net.dv8tion.jda.api.entities.Role;
+import net.dv8tion.jda.api.entities.User;
+import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
+import org.papertrail.commons.utilities.ColorFormatter;
+import org.papertrail.commons.utilities.PermissionResolver;
+
+import java.awt.Color;
+import java.util.Map;
+import java.util.Objects;
+
+@UtilityClass
+public class RoleUpdateEventHelper {
+
+ public static void format(GuildAuditLogEntryCreateEvent event, AuditLogEntry ale, String channelIdToSendTo) {
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("Audit Log Entry | Role Update Event");
+
+ User executor = ale.getJDA().getUserById(ale.getUserId());
+ Role targetRole = ale.getJDA().getRoleById(ale.getTargetId());
+
+ String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
+ String mentionableTargetRole = (targetRole !=null ? targetRole.getAsMention() : ale.getTargetId());
+
+ eb.setDescription("๐ค **By**: "+mentionableExecutor+"\nโน๏ธ The following member role was updated");
+ eb.setColor(Color.YELLOW);
+
+ eb.addField("Action Type", String.valueOf(ale.getType()), true);
+ eb.addField("Target Type", String.valueOf(ale.getTargetType()), true);
+
+ eb.addField("Target Role", mentionableTargetRole, false);
+
+ for(Map.Entry changes: ale.getChanges().entrySet()) {
+
+ String change = changes.getKey();
+ Object oldValue = changes.getValue().getOldValue();
+ Object newValue = changes.getValue().getNewValue();
+
+ switch(change) {
+
+ case "name":
+ eb.addField("๐ท๏ธ Old Role Name", "โฐโโค"+oldValue, true);
+ eb.addField("๐ท๏ธ New Role Name", "โฐโโค"+newValue, true);
+ eb.addBlankField(true);
+ break;
+
+ case "hoist":
+ eb.addField("๐ Old Display Seperately", "โฐโโค"+((Boolean.TRUE.equals(oldValue)) ? "โ
" : "โ"), true);
+ eb.addField("๐ New Display Seperately", "โฐโโค"+((Boolean.TRUE.equals(newValue)) ? "โ
" : "โ"), true);
+ eb.addBlankField(true);
+ break;
+
+ case "color":
+ eb.addField("๐จ Old Color", "โฐโโค"+ ColorFormatter.formatToHex(oldValue), true);
+ eb.addField("๐จ New Color", "โฐโโค"+ColorFormatter.formatToHex(newValue), true);
+ eb.addBlankField(true);
+ break;
+
+ case "permissions":
+ eb.addField("Old Role Permissions", PermissionResolver.getParsedPermissions(oldValue, "โ
"), true);
+ eb.addField("New Role Permissions", PermissionResolver.getParsedPermissions(newValue, "โ
"), true);
+ eb.addBlankField(true);
+ break;
+
+ case "mentionable":
+ eb.addField("๐ Old Mentionable", "โฐโโค"+((Boolean.TRUE.equals(oldValue)) ? "โ
" : "โ"), true);
+ eb.addField("๐ New Mentionable", "โฐโโค"+((Boolean.TRUE.equals(newValue)) ? "โ
" : "โ"), true);
+ eb.addBlankField(true);
+ break;
+
+ case "colors":
+ eb.addField("๐ Old Gradient Color System", "โฐโโค"+ColorFormatter.formatGradientColorSystemToHex(oldValue), true);
+ eb.addField("๐ New Gradient Color System", "โฐโโค"+ColorFormatter.formatGradientColorSystemToHex(newValue), true);
+ eb.addBlankField(true);
+ break;
+ default:
+ eb.addField(change, "from "+oldValue+" to "+newValue, false);
+ }
+ }
+
+ eb.setFooter("Audit Log Entry ID: "+ale.getId());
+ eb.setTimestamp(ale.getTimeCreated());
+
+ MessageEmbed mb = eb.build();
+
+ Objects.requireNonNull(event.getGuild().getTextChannelById(channelIdToSendTo)).sendMessageEmbeds(mb).queue();
+ }
+}
diff --git a/src/main/java/org/papertrail/listeners/audit/helper/ScheduledEventCreateEventHelper.java b/src/main/java/org/papertrail/listeners/audit/helper/ScheduledEventCreateEventHelper.java
new file mode 100644
index 00000000..9fce208c
--- /dev/null
+++ b/src/main/java/org/papertrail/listeners/audit/helper/ScheduledEventCreateEventHelper.java
@@ -0,0 +1,79 @@
+package org.papertrail.listeners.audit.helper;
+
+import lombok.experimental.UtilityClass;
+import net.dv8tion.jda.api.EmbedBuilder;
+import net.dv8tion.jda.api.audit.AuditLogChange;
+import net.dv8tion.jda.api.audit.AuditLogEntry;
+import net.dv8tion.jda.api.entities.MessageEmbed;
+import net.dv8tion.jda.api.entities.User;
+import net.dv8tion.jda.api.entities.channel.middleman.GuildChannel;
+import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
+import org.papertrail.commons.utilities.TypeResolver;
+
+import java.awt.Color;
+import java.util.Map;
+import java.util.Objects;
+
+@UtilityClass
+public class ScheduledEventCreateEventHelper {
+
+ public static void format(GuildAuditLogEntryCreateEvent event, AuditLogEntry ale, String channelIdToSendTo) {
+
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("Audit Log Entry | Scheduled Event Create Event");
+
+ User executor = ale.getJDA().getUserById(ale.getUserIdLong());
+ String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
+
+ eb.setDescription("๐ค **By**: "+mentionableExecutor+"\nโน๏ธ A scheduled event was created");
+ eb.setColor(Color.GREEN);
+ eb.addField("Action Type", String.valueOf(ale.getType()), true);
+ eb.addField("Target Type", String.valueOf(ale.getTargetType()), true);
+
+ for(Map.Entry changes: ale.getChanges().entrySet()) {
+ String change = changes.getKey();
+ Object oldValue = changes.getValue().getOldValue();
+ Object newValue = changes.getValue().getNewValue();
+
+ switch(change) {
+ case "entity_type":
+ eb.addField("๐ Event Type", "โฐโโค"+ TypeResolver.scheduleEventTypeResolver(newValue), false);
+ break;
+
+ case "privacy_level", "image_hash":
+ break;
+
+ case "description":
+ eb.addField("๐ Event Description", "โฐโโค"+newValue, false);
+ break;
+
+ case "status":
+ eb.addField("๐ Event Status", "โฐโโค"+TypeResolver.scheduleEventStatusTypeResolver(newValue), false);
+ break;
+
+ case "location":
+ eb.addField("๐ Event Location", "โฐโโค"+newValue, false);
+ break;
+
+ case "name":
+ eb.addField("๐ท๏ธ Event Name", "โฐโโค"+newValue, false);
+ break;
+
+ case "channel_id":
+ GuildChannel eventChannel = event.getGuild().getGuildChannelById(String.valueOf(newValue));
+ eb.addField("๐ฌ Event Channel", "โฐโโค"+(eventChannel!=null ? eventChannel.getAsMention() : String.valueOf(newValue)), false);
+ break;
+
+ default:
+ eb.addField(change, "from "+oldValue+" to "+newValue, false);
+ }
+
+ }
+
+ eb.setFooter("Audit Log Entry ID: "+ale.getId());
+ eb.setTimestamp(ale.getTimeCreated());
+
+ MessageEmbed mb = eb.build();
+ Objects.requireNonNull(event.getGuild().getTextChannelById(channelIdToSendTo)).sendMessageEmbeds(mb).queue();
+ }
+}
diff --git a/src/main/java/org/papertrail/listeners/audit/helper/ScheduledEventDeleteEventHelper.java b/src/main/java/org/papertrail/listeners/audit/helper/ScheduledEventDeleteEventHelper.java
new file mode 100644
index 00000000..a979b7e4
--- /dev/null
+++ b/src/main/java/org/papertrail/listeners/audit/helper/ScheduledEventDeleteEventHelper.java
@@ -0,0 +1,79 @@
+package org.papertrail.listeners.audit.helper;
+
+import lombok.experimental.UtilityClass;
+import net.dv8tion.jda.api.EmbedBuilder;
+import net.dv8tion.jda.api.audit.AuditLogChange;
+import net.dv8tion.jda.api.audit.AuditLogEntry;
+import net.dv8tion.jda.api.entities.MessageEmbed;
+import net.dv8tion.jda.api.entities.User;
+import net.dv8tion.jda.api.entities.channel.middleman.GuildChannel;
+import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
+import org.papertrail.commons.utilities.TypeResolver;
+
+import java.awt.Color;
+import java.util.Map;
+import java.util.Objects;
+
+@UtilityClass
+public class ScheduledEventDeleteEventHelper {
+
+ public static void format(GuildAuditLogEntryCreateEvent event, AuditLogEntry ale, String channelIdToSendTo) {
+
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("Audit Log Entry | Scheduled Event Delete Event");
+
+ User executor = ale.getJDA().getUserById(ale.getUserIdLong());
+ String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
+
+ eb.setDescription("๐ค **By**: "+mentionableExecutor+"\nโน๏ธ A scheduled event has been deleted");
+ eb.setColor(Color.RED);
+ eb.addField("Action Type", String.valueOf(ale.getType()), true);
+ eb.addField("Target Type", String.valueOf(ale.getTargetType()), true);
+
+ for(Map.Entry changes: ale.getChanges().entrySet()) {
+ String change = changes.getKey();
+ Object oldValue = changes.getValue().getOldValue();
+ Object newValue = changes.getValue().getNewValue();
+
+ switch(change) {
+ case "entity_type":
+ eb.addField("๐ Event Type", "โฐโโค"+ TypeResolver.scheduleEventTypeResolver(oldValue), false);
+ break;
+
+ case "privacy_level", "image_hash":
+ break;
+
+ case "description":
+ eb.addField("๐ Event Description", "โฐโโค"+newValue, false);
+ break;
+
+ case "status":
+ eb.addField("๐ Event Status", "โฐโโค"+TypeResolver.scheduleEventStatusTypeResolver(oldValue), false);
+ break;
+
+ case "location":
+ eb.addField("๐ Event Location", "โฐโโค"+oldValue, false);
+ break;
+
+ case "name":
+ eb.addField("๐ท๏ธ Event Name", "โฐโโค"+oldValue, false);
+ break;
+
+ case "channel_id":
+ GuildChannel eventChannel = event.getGuild().getGuildChannelById(String.valueOf(oldValue));
+ eb.addField("๐ฌ Event Channel", "โฐโโค"+(eventChannel!=null ? eventChannel.getAsMention() : String.valueOf(oldValue)), false);
+ break;
+
+ default:
+ eb.addField(change, "from "+oldValue+" to "+newValue, false);
+ }
+
+ }
+
+ eb.setFooter("Audit Log Entry ID: "+ale.getId());
+ eb.setTimestamp(ale.getTimeCreated());
+
+ MessageEmbed mb = eb.build();
+ Objects.requireNonNull(event.getGuild().getTextChannelById(channelIdToSendTo)).sendMessageEmbeds(mb).queue();
+ }
+}
diff --git a/src/main/java/org/papertrail/listeners/audit/helper/ScheduledEventUpdateEventHelper.java b/src/main/java/org/papertrail/listeners/audit/helper/ScheduledEventUpdateEventHelper.java
new file mode 100644
index 00000000..71f17087
--- /dev/null
+++ b/src/main/java/org/papertrail/listeners/audit/helper/ScheduledEventUpdateEventHelper.java
@@ -0,0 +1,88 @@
+package org.papertrail.listeners.audit.helper;
+
+import lombok.experimental.UtilityClass;
+import net.dv8tion.jda.api.EmbedBuilder;
+import net.dv8tion.jda.api.audit.AuditLogChange;
+import net.dv8tion.jda.api.audit.AuditLogEntry;
+import net.dv8tion.jda.api.entities.MessageEmbed;
+import net.dv8tion.jda.api.entities.ScheduledEvent;
+import net.dv8tion.jda.api.entities.User;
+import net.dv8tion.jda.api.entities.channel.middleman.GuildChannel;
+import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
+import org.papertrail.commons.utilities.TypeResolver;
+
+import java.awt.Color;
+import java.util.Map;
+import java.util.Objects;
+
+@UtilityClass
+public class ScheduledEventUpdateEventHelper {
+
+ public static void format(GuildAuditLogEntryCreateEvent event, AuditLogEntry ale, String channelIdToSendTo) {
+
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("Audit Log Entry | Scheduled Event Update Event");
+
+ User executor = ale.getJDA().getUserById(ale.getUserIdLong());
+ String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
+
+ ScheduledEvent targetEvent = event.getGuild().getScheduledEventById(ale.getTargetId());
+ eb.setDescription("๐ค **By**: "+mentionableExecutor+"\nโน๏ธ The following scheduled event was updated: "+ Objects.requireNonNull(targetEvent).getName());
+ eb.setColor(Color.YELLOW);
+ eb.addField("Action Type", String.valueOf(ale.getType()), true);
+ eb.addField("Target Type", String.valueOf(ale.getTargetType()), true);
+
+ for(Map.Entry changes: ale.getChanges().entrySet()) {
+ String change = changes.getKey();
+ Object oldValue = changes.getValue().getOldValue();
+ Object newValue = changes.getValue().getNewValue();
+
+ switch(change) {
+ case "entity_type":
+ eb.addField("๐ Old Event Type", "โฐโโค"+ TypeResolver.scheduleEventTypeResolver(oldValue), false);
+ eb.addField("๐ New Event Type", "โฐโโค"+TypeResolver.scheduleEventTypeResolver(newValue), false);
+ break;
+
+ case "privacy_level", "image_hash":
+ break;
+
+ case "description":
+ eb.addField("๐ Old Event Description", "โฐโโค"+oldValue, false);
+ eb.addField("๐ New Event Description", "โฐโโค"+newValue, false);
+ break;
+
+ case "status":
+ eb.addField("๐ Old Event Status", "โฐโโค"+TypeResolver.scheduleEventStatusTypeResolver(oldValue), false);
+ eb.addField("๐ New Event Status", "โฐโโค"+TypeResolver.scheduleEventStatusTypeResolver(newValue), false);
+ break;
+
+ case "location":
+ eb.addField("๐ Event Location", "โฐโโค"+oldValue, false);
+ eb.addField("๐ Event Location", "โฐโโค"+newValue, false);
+ break;
+
+ case "name":
+ eb.addField("๐ท๏ธ Old Event Name", "โฐโโค"+oldValue, false);
+ eb.addField("๐ท๏ธ New Event Name","โฐโโค"+newValue, false);
+ break;
+
+ case "channel_id":
+ GuildChannel eventChannel = event.getGuild().getGuildChannelById(String.valueOf(oldValue));
+ eb.addField("๐ฌ Old Event Channel", "โฐโโค"+(eventChannel!=null ? eventChannel.getAsMention() : String.valueOf(oldValue)), false);
+ eventChannel = event.getGuild().getGuildChannelById(String.valueOf(newValue));
+ eb.addField("๐ฌ New Event Channel", "โฐโโค"+(eventChannel!=null ? eventChannel.getAsMention() : String.valueOf(newValue)), false);
+ break;
+
+ default:
+ eb.addField(change, "from "+oldValue+" to "+newValue, false);
+ }
+
+ }
+
+ eb.setFooter("Audit Log Entry ID: "+ale.getId());
+ eb.setTimestamp(ale.getTimeCreated());
+
+ MessageEmbed mb = eb.build();
+ Objects.requireNonNull(event.getGuild().getTextChannelById(channelIdToSendTo)).sendMessageEmbeds(mb).queue();
+ }
+}
diff --git a/src/main/java/org/papertrail/listeners/audit/helper/StageInstanceCreateEventHelper.java b/src/main/java/org/papertrail/listeners/audit/helper/StageInstanceCreateEventHelper.java
new file mode 100644
index 00000000..fe9058c0
--- /dev/null
+++ b/src/main/java/org/papertrail/listeners/audit/helper/StageInstanceCreateEventHelper.java
@@ -0,0 +1,58 @@
+package org.papertrail.listeners.audit.helper;
+
+import lombok.experimental.UtilityClass;
+import net.dv8tion.jda.api.EmbedBuilder;
+import net.dv8tion.jda.api.audit.AuditLogChange;
+import net.dv8tion.jda.api.audit.AuditLogEntry;
+import net.dv8tion.jda.api.entities.MessageEmbed;
+import net.dv8tion.jda.api.entities.User;
+import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
+
+import java.awt.Color;
+import java.util.Map;
+import java.util.Objects;
+
+@UtilityClass
+public class StageInstanceCreateEventHelper {
+
+ public static void format(GuildAuditLogEntryCreateEvent event, AuditLogEntry ale, String channelIdToSendTo) {
+
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("Audit Log Entry | Stage Instance Create Event");
+
+ User executor = ale.getJDA().getUserById(ale.getUserIdLong());
+ String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
+
+ eb.setDescription("๐ค **By**: "+mentionableExecutor+"\nโน๏ธ A stage instance was created");
+ eb.setColor(Color.GREEN);
+ eb.addField("Action Type", String.valueOf(ale.getType()), true);
+ eb.addField("Target Type", String.valueOf(ale.getTargetType()), true);
+
+ for(Map.Entry changes: ale.getChanges().entrySet()) {
+ String change = changes.getKey();
+ Object oldValue = changes.getValue().getOldValue();
+ Object newValue = changes.getValue().getNewValue();
+
+ switch(change) {
+ case "topic":
+ eb.addField("๐ Stage Topic", "โฐโโค"+newValue, false);
+ break;
+
+ case "privacy_level":
+ eb.addField("๐ Stage Privacy", "โฐโโค"+newValue, false);
+ eb.addField("Stage Privacy Result Inference", "-# A value of 1 means PUBLIC (deprecated) and 2 means GUILD_ONLY", false);
+ break;
+
+ default:
+ eb.addField(change, "from "+oldValue+" to "+newValue, false);
+ }
+
+ }
+
+ eb.setFooter("Audit Log Entry ID: "+ale.getId());
+ eb.setTimestamp(ale.getTimeCreated());
+
+ MessageEmbed mb = eb.build();
+ Objects.requireNonNull(event.getGuild().getTextChannelById(channelIdToSendTo)).sendMessageEmbeds(mb).queue();
+ }
+}
diff --git a/src/main/java/org/papertrail/listeners/audit/helper/StageInstanceDeleteEventHelper.java b/src/main/java/org/papertrail/listeners/audit/helper/StageInstanceDeleteEventHelper.java
new file mode 100644
index 00000000..cca0caf1
--- /dev/null
+++ b/src/main/java/org/papertrail/listeners/audit/helper/StageInstanceDeleteEventHelper.java
@@ -0,0 +1,58 @@
+package org.papertrail.listeners.audit.helper;
+
+import lombok.experimental.UtilityClass;
+import net.dv8tion.jda.api.EmbedBuilder;
+import net.dv8tion.jda.api.audit.AuditLogChange;
+import net.dv8tion.jda.api.audit.AuditLogEntry;
+import net.dv8tion.jda.api.entities.MessageEmbed;
+import net.dv8tion.jda.api.entities.User;
+import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
+
+import java.awt.Color;
+import java.util.Map;
+import java.util.Objects;
+
+@UtilityClass
+public class StageInstanceDeleteEventHelper {
+
+ public static void format(GuildAuditLogEntryCreateEvent event, AuditLogEntry ale, String channelIdToSendTo) {
+
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("Audit Log Entry | Stage Instance Delete Event");
+
+ User executor = ale.getJDA().getUserById(ale.getUserIdLong());
+ String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
+
+ eb.setDescription("๐ค **By**: "+mentionableExecutor+"\nโน๏ธ A stage instance was deleted");
+ eb.setColor(Color.RED);
+ eb.addField("Action Type", String.valueOf(ale.getType()), true);
+ eb.addField("Target Type", String.valueOf(ale.getTargetType()), true);
+
+ for(Map.Entry changes: ale.getChanges().entrySet()) {
+ String change = changes.getKey();
+ Object oldValue = changes.getValue().getOldValue();
+ Object newValue = changes.getValue().getNewValue();
+
+ switch(change) {
+ case "topic":
+ eb.addField("๐ Deleted Stage Topic", "โฐโโค"+oldValue, false);
+ break;
+
+ case "privacy_level":
+ eb.addField("๐ Deleted Stage Privacy", "โฐโโค"+oldValue, false);
+ eb.addField("Stage Privacy Result Inference", "-# A value of 1 means PUBLIC (deprecated) and 2 means GUILD_ONLY", false);
+ break;
+
+ default:
+ eb.addField(change, "from "+oldValue+" to "+newValue, false);
+ }
+
+ }
+
+ eb.setFooter("Audit Log Entry ID: "+ale.getId());
+ eb.setTimestamp(ale.getTimeCreated());
+
+ MessageEmbed mb = eb.build();
+ Objects.requireNonNull(event.getGuild().getTextChannelById(channelIdToSendTo)).sendMessageEmbeds(mb).queue();
+ }
+}
diff --git a/src/main/java/org/papertrail/listeners/audit/helper/StageInstanceUpdateEventHelper.java b/src/main/java/org/papertrail/listeners/audit/helper/StageInstanceUpdateEventHelper.java
new file mode 100644
index 00000000..2112701b
--- /dev/null
+++ b/src/main/java/org/papertrail/listeners/audit/helper/StageInstanceUpdateEventHelper.java
@@ -0,0 +1,60 @@
+package org.papertrail.listeners.audit.helper;
+
+import lombok.experimental.UtilityClass;
+import net.dv8tion.jda.api.EmbedBuilder;
+import net.dv8tion.jda.api.audit.AuditLogChange;
+import net.dv8tion.jda.api.audit.AuditLogEntry;
+import net.dv8tion.jda.api.entities.MessageEmbed;
+import net.dv8tion.jda.api.entities.User;
+import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
+
+import java.awt.Color;
+import java.util.Map;
+import java.util.Objects;
+
+@UtilityClass
+public class StageInstanceUpdateEventHelper {
+
+ public static void format(GuildAuditLogEntryCreateEvent event, AuditLogEntry ale, String channelIdToSendTo) {
+
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("Audit Log Entry | Stage Instance Update Event");
+
+ User executor = ale.getJDA().getUserById(ale.getUserIdLong());
+ String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
+
+ eb.setDescription("๐ค **By**: "+mentionableExecutor+"\nโน๏ธ A stage instance was updated");
+ eb.setColor(Color.YELLOW);
+ eb.addField("Action Type", String.valueOf(ale.getType()), true);
+ eb.addField("Target Type", String.valueOf(ale.getTargetType()), true);
+
+ for(Map.Entry changes: ale.getChanges().entrySet()) {
+ String change = changes.getKey();
+ Object oldValue = changes.getValue().getOldValue();
+ Object newValue = changes.getValue().getNewValue();
+
+ switch(change) {
+ case "topic":
+ eb.addField("๐ OldStage Topic", "โฐโโค"+oldValue, false);
+ eb.addField("๐ New Stage Topic", "โฐโโค"+newValue, false);
+ break;
+
+ case "privacy_level":
+ eb.addField("๐ Old Stage Privacy","โฐโโค"+oldValue, false);
+ eb.addField("๐ New Stage Privacy", "โฐโโค"+newValue, false);
+ eb.addField("Stage Privacy Result Inference", "-# A value of 1 means PUBLIC (deprecated) and 2 means GUILD_ONLY", false);
+ break;
+
+ default:
+ eb.addField(change, "from "+oldValue+" to "+newValue, false);
+ }
+
+ }
+
+ eb.setFooter("Audit Log Entry ID: "+ale.getId());
+ eb.setTimestamp(ale.getTimeCreated());
+
+ MessageEmbed mb = eb.build();
+ Objects.requireNonNull(event.getGuild().getTextChannelById(channelIdToSendTo)).sendMessageEmbeds(mb).queue();
+ }
+}
diff --git a/src/main/java/org/papertrail/listeners/audit/helper/StickerCreateEventHelper.java b/src/main/java/org/papertrail/listeners/audit/helper/StickerCreateEventHelper.java
new file mode 100644
index 00000000..25e52272
--- /dev/null
+++ b/src/main/java/org/papertrail/listeners/audit/helper/StickerCreateEventHelper.java
@@ -0,0 +1,73 @@
+package org.papertrail.listeners.audit.helper;
+
+import lombok.experimental.UtilityClass;
+import net.dv8tion.jda.api.EmbedBuilder;
+import net.dv8tion.jda.api.audit.AuditLogChange;
+import net.dv8tion.jda.api.audit.AuditLogEntry;
+import net.dv8tion.jda.api.entities.MessageEmbed;
+import net.dv8tion.jda.api.entities.User;
+import net.dv8tion.jda.api.entities.sticker.GuildSticker;
+import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
+
+import java.awt.Color;
+import java.util.Map;
+import java.util.Objects;
+
+@UtilityClass
+public class StickerCreateEventHelper {
+
+ public static void format(GuildAuditLogEntryCreateEvent event, AuditLogEntry ale, String channelIdToSendTo) {
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("Audit Log Entry | Sticker Create Event");
+
+ User executor = ale.getJDA().getUserById(ale.getUserIdLong());
+ String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
+
+ eb.setDescription("๐ค **By**: "+mentionableExecutor+"\nโน๏ธ The following sticker was created");
+ eb.setColor(Color.GREEN);
+
+ eb.addField("Action Type", String.valueOf(ale.getType()), true);
+ eb.addField("Target Type", String.valueOf(ale.getTargetType()), true);
+
+ for(Map.Entry changes: ale.getChanges().entrySet()) {
+
+ String change = changes.getKey();
+ Object oldValue = changes.getValue().getOldValue();
+ Object newValue = changes.getValue().getNewValue();
+
+ switch(change) {
+
+ case "format_type", "type", "asset", "available", "guild_id":
+ break;
+
+ case "id":
+ eb.addField("๐ Sticker ID", "โฐโโค"+newValue, false);
+ GuildSticker sticker = event.getGuild().getStickerById(String.valueOf(newValue));
+ eb.addField("๐ Sticker Link", "โฐโโค"+(sticker!=null ? sticker.getIconUrl() : "N/A"), false);
+ break;
+
+ case "tags":
+ eb.addField("โน๏ธ Related Emoji", "โฐโโค"+newValue, false);
+ break;
+
+ case "description":
+ eb.addField("๐ Description", "โฐโโค"+newValue, false);
+ break;
+
+ case "name":
+ eb.addField("๐ท๏ธ Sticker Name", "โฐโโค"+newValue, false);
+ break;
+
+ default:
+ eb.addField(change, "from "+oldValue+" to "+newValue, false);
+ }
+ }
+
+ eb.setFooter("Audit Log Entry ID: "+ale.getId());
+ eb.setTimestamp(ale.getTimeCreated());
+
+ MessageEmbed mb = eb.build();
+
+ Objects.requireNonNull(event.getGuild().getTextChannelById(channelIdToSendTo)).sendMessageEmbeds(mb).queue();
+ }
+}
diff --git a/src/main/java/org/papertrail/listeners/audit/helper/StickerDeleteEventHelper.java b/src/main/java/org/papertrail/listeners/audit/helper/StickerDeleteEventHelper.java
new file mode 100644
index 00000000..636aa04b
--- /dev/null
+++ b/src/main/java/org/papertrail/listeners/audit/helper/StickerDeleteEventHelper.java
@@ -0,0 +1,70 @@
+package org.papertrail.listeners.audit.helper;
+
+import lombok.experimental.UtilityClass;
+import net.dv8tion.jda.api.EmbedBuilder;
+import net.dv8tion.jda.api.audit.AuditLogChange;
+import net.dv8tion.jda.api.audit.AuditLogEntry;
+import net.dv8tion.jda.api.entities.MessageEmbed;
+import net.dv8tion.jda.api.entities.User;
+import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
+
+import java.awt.Color;
+import java.util.Map;
+import java.util.Objects;
+
+@UtilityClass
+public class StickerDeleteEventHelper {
+
+ public static void format(GuildAuditLogEntryCreateEvent event, AuditLogEntry ale, String channelIdToSendTo) {
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("Audit Log Entry | Sticker Delete Event");
+
+ User executor = ale.getJDA().getUserById(ale.getUserIdLong());
+ String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
+
+ eb.setDescription("๐ค **By**: "+mentionableExecutor+"\nโน๏ธ The following sticker was deleted");
+ eb.setColor(Color.RED);
+
+ eb.addField("Action Type", String.valueOf(ale.getType()), true);
+ eb.addField("Target Type", String.valueOf(ale.getTargetType()), true);
+
+ for(Map.Entry changes: ale.getChanges().entrySet()) {
+
+ String change = changes.getKey();
+ Object oldValue = changes.getValue().getOldValue();
+ Object newValue = changes.getValue().getNewValue();
+
+ switch(change) {
+
+ case "format_type", "type", "asset", "available", "guild_id":
+ break;
+
+ case "id":
+ eb.addField("๐ Sticker ID", "โฐโโค"+oldValue, false);
+ break;
+
+ case "tags":
+ eb.addField("โน๏ธ Related Emoji", "โฐโโค"+oldValue, false);
+ break;
+
+ case "description":
+ eb.addField("๐ Description", "โฐโโค"+oldValue, false);
+ break;
+
+ case "name":
+ eb.addField("๐ท๏ธ Sticker Name", "โฐโโค"+oldValue, false);
+ break;
+
+ default:
+ eb.addField(change, "from "+oldValue+" to "+newValue, false);
+ }
+ }
+
+ eb.setFooter("Audit Log Entry ID: "+ale.getId());
+ eb.setTimestamp(ale.getTimeCreated());
+
+ MessageEmbed mb = eb.build();
+
+ Objects.requireNonNull(event.getGuild().getTextChannelById(channelIdToSendTo)).sendMessageEmbeds(mb).queue();
+ }
+}
diff --git a/src/main/java/org/papertrail/listeners/audit/helper/StickerUpdateEventHelper.java b/src/main/java/org/papertrail/listeners/audit/helper/StickerUpdateEventHelper.java
new file mode 100644
index 00000000..df3c55a0
--- /dev/null
+++ b/src/main/java/org/papertrail/listeners/audit/helper/StickerUpdateEventHelper.java
@@ -0,0 +1,72 @@
+package org.papertrail.listeners.audit.helper;
+
+import lombok.experimental.UtilityClass;
+import net.dv8tion.jda.api.EmbedBuilder;
+import net.dv8tion.jda.api.audit.AuditLogChange;
+import net.dv8tion.jda.api.audit.AuditLogEntry;
+import net.dv8tion.jda.api.entities.MessageEmbed;
+import net.dv8tion.jda.api.entities.User;
+import net.dv8tion.jda.api.entities.sticker.GuildSticker;
+import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
+
+import java.awt.Color;
+import java.util.Map;
+import java.util.Objects;
+
+@UtilityClass
+public class StickerUpdateEventHelper {
+
+ public static void format(GuildAuditLogEntryCreateEvent event, AuditLogEntry ale, String channelIdToSendTo) {
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("Audit Log Entry | Sticker Update Event");
+
+ User executor = ale.getJDA().getUserById(ale.getUserIdLong());
+ String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
+
+ GuildSticker targetSticker = event.getGuild().getStickerById(ale.getTargetId());
+
+ eb.setDescription("๐ค **By**: "+mentionableExecutor+"\nโน๏ธ The following sticker was updated");
+ eb.setColor(Color.YELLOW);
+
+ eb.addField("Action Type", String.valueOf(ale.getType()), true);
+ eb.addField("Target Type", String.valueOf(ale.getTargetType()), true);
+
+ eb.addField("๐ท๏ธ Target Sticker Name", Objects.requireNonNull(targetSticker).getName(), false);
+ eb.addField("๐ Target Sticker Url", targetSticker.getIconUrl(), false);
+
+ for(Map.Entry changes: ale.getChanges().entrySet()) {
+
+ String change = changes.getKey();
+ Object oldValue = changes.getValue().getOldValue();
+ Object newValue = changes.getValue().getNewValue();
+
+ switch(change) {
+
+ case "format_type", "type", "asset", "available", "guild_id", "id":
+ break;
+
+ case "tags":
+ eb.addField("โน๏ธ Related Emoji", "โฐโโค"+"from "+oldValue+" to "+newValue, false);
+ break;
+
+ case "description":
+ eb.addField("๐ Description", "โฐโโค"+"from `"+oldValue+"` to `"+newValue+"`", false);
+ break;
+
+ case "name":
+ eb.addField("๐ท๏ธ Sticker Name", "โฐโโค"+"from `"+oldValue+"` to `"+newValue+"`", false);
+ break;
+
+ default:
+ eb.addField(change, "from "+oldValue+" to "+newValue, false);
+ }
+ }
+
+ eb.setFooter("Audit Log Entry ID: "+ale.getId());
+ eb.setTimestamp(ale.getTimeCreated());
+
+ MessageEmbed mb = eb.build();
+
+ Objects.requireNonNull(event.getGuild().getTextChannelById(channelIdToSendTo)).sendMessageEmbeds(mb).queue();
+ }
+}
diff --git a/src/main/java/org/papertrail/listeners/audit/helper/ThreadCreateEventHelper.java b/src/main/java/org/papertrail/listeners/audit/helper/ThreadCreateEventHelper.java
new file mode 100644
index 00000000..461e9048
--- /dev/null
+++ b/src/main/java/org/papertrail/listeners/audit/helper/ThreadCreateEventHelper.java
@@ -0,0 +1,83 @@
+package org.papertrail.listeners.audit.helper;
+
+import lombok.experimental.UtilityClass;
+import net.dv8tion.jda.api.EmbedBuilder;
+import net.dv8tion.jda.api.audit.AuditLogChange;
+import net.dv8tion.jda.api.audit.AuditLogEntry;
+import net.dv8tion.jda.api.entities.MessageEmbed;
+import net.dv8tion.jda.api.entities.User;
+import net.dv8tion.jda.api.entities.channel.concrete.ThreadChannel;
+import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
+import org.papertrail.commons.utilities.DurationFormatter;
+import org.papertrail.commons.utilities.TypeResolver;
+
+import java.awt.Color;
+import java.util.Map;
+import java.util.Objects;
+
+@UtilityClass
+public class ThreadCreateEventHelper {
+
+ public static void format(GuildAuditLogEntryCreateEvent event, AuditLogEntry ale, String channelIdToSendTo) {
+
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("Audit Log Entry | Thread Create Event");
+
+ 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());
+
+ eb.setDescription("๐ค **By**: "+mentionableExecutor+"\nโน๏ธ A thread has been created");
+ eb.setColor(Color.GREEN);
+ eb.addField("Action Type", String.valueOf(ale.getType()), true);
+ eb.addField("Target Type", String.valueOf(ale.getTargetType()), true);
+
+ for(Map.Entry changes: ale.getChanges().entrySet()) {
+ String change = changes.getKey();
+ Object oldValue = changes.getValue().getOldValue();
+ Object newValue = changes.getValue().getNewValue();
+
+ switch(change) {
+ case "locked":
+ eb.addField("๐ Locked", "โฐโโค"+((Boolean.TRUE.equals(newValue)) ? "โ
" : "โ"), false);
+ break;
+
+ case "auto_archive_duration":
+ eb.addField("๐ Auto Archive Duration", "โฐโโค"+ DurationFormatter.formatMinutes(newValue), false);
+ break;
+
+ case "rate_limit_per_user":
+ eb.addField("๐ Slowmode Limit", "โฐโโค"+DurationFormatter.formatSeconds(newValue), false);
+ break;
+
+ case "type":
+ eb.addField("๐ Thread Type", "โฐโโค"+ TypeResolver.channelTypeResolver(newValue), false);
+ break;
+
+ case "archived":
+ eb.addField("๐๏ธ Archived", "โฐโโค"+((Boolean.TRUE.equals(newValue)) ? "โ
" : "โ"), false);
+ break;
+
+ case "flags":
+ eb.addField("๐ฉ Flags", "โฐโโค"+newValue, false);
+ break;
+
+ case "name":
+ eb.addField("๐ท๏ธ Thread Name", "โฐโโค"+newValue, false);
+ break;
+
+ default:
+ eb.addField(change, "from "+oldValue+" to "+newValue, false);
+ }
+
+ }
+ eb.addField("๐งต Target Thread", "โฐโโค"+mentionableTargetThread, false);
+ eb.setFooter("Audit Log Entry ID: "+ale.getId());
+ eb.setTimestamp(ale.getTimeCreated());
+
+ MessageEmbed mb = eb.build();
+ Objects.requireNonNull(event.getGuild().getTextChannelById(channelIdToSendTo)).sendMessageEmbeds(mb).queue();
+ }
+}
diff --git a/src/main/java/org/papertrail/listeners/audit/helper/ThreadDeleteEventHelper.java b/src/main/java/org/papertrail/listeners/audit/helper/ThreadDeleteEventHelper.java
new file mode 100644
index 00000000..117a2149
--- /dev/null
+++ b/src/main/java/org/papertrail/listeners/audit/helper/ThreadDeleteEventHelper.java
@@ -0,0 +1,78 @@
+package org.papertrail.listeners.audit.helper;
+
+import lombok.experimental.UtilityClass;
+import net.dv8tion.jda.api.EmbedBuilder;
+import net.dv8tion.jda.api.audit.AuditLogChange;
+import net.dv8tion.jda.api.audit.AuditLogEntry;
+import net.dv8tion.jda.api.entities.MessageEmbed;
+import net.dv8tion.jda.api.entities.User;
+import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
+import org.papertrail.commons.utilities.DurationFormatter;
+import org.papertrail.commons.utilities.TypeResolver;
+
+import java.awt.Color;
+import java.util.Map;
+import java.util.Objects;
+
+@UtilityClass
+public class ThreadDeleteEventHelper {
+
+ public static void format(GuildAuditLogEntryCreateEvent event, AuditLogEntry ale, String channelIdToSendTo) {
+
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("Audit Log Entry | Thread Delete Event");
+
+ User executor = ale.getJDA().getUserById(ale.getUserIdLong());
+ String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
+
+ eb.setDescription("๐ค **By**: "+mentionableExecutor+"\nโน๏ธ A thread has been deleted");
+ eb.setColor(Color.RED);
+ eb.addField("Action Type", String.valueOf(ale.getType()), true);
+ eb.addField("Target Type", String.valueOf(ale.getTargetType()), true);
+
+ for(Map.Entry changes: ale.getChanges().entrySet()) {
+ String change = changes.getKey();
+ Object oldValue = changes.getValue().getOldValue();
+ Object newValue = changes.getValue().getNewValue();
+
+ switch(change) {
+ case "๐ locked":
+ eb.addField("Locked", "โฐโโค"+((Boolean.TRUE.equals(oldValue)) ? "โ
" : "โ"), false);
+ break;
+
+ case "๐ auto_archive_duration":
+ eb.addField("Auto Archive Duration", "โฐโโค"+ DurationFormatter.formatMinutes(oldValue), false);
+ break;
+
+ case "rate_limit_per_user":
+ eb.addField("๐ Slowmode Limit", "โฐโโค"+DurationFormatter.formatSeconds(oldValue), false);
+ break;
+
+ case "type":
+ eb.addField("๐ Thread Type", "โฐโโค"+ TypeResolver.channelTypeResolver(oldValue), false);
+ break;
+
+ case "archived":
+ eb.addField("๐๏ธ Archived", "โฐโโค"+((Boolean.TRUE.equals(oldValue)) ? "โ
" : "โ"), false);
+ break;
+
+ case "flags":
+ eb.addField("๐ฉ Flags", "โฐโโค"+oldValue, false);
+ break;
+
+ case "name":
+ eb.addField("๐ท๏ธ Thread Name", "โฐโโค"+oldValue, false);
+ break;
+
+ default:
+ eb.addField(change, "from "+oldValue+" to "+newValue, false);
+ }
+
+ }
+ eb.setFooter("Audit Log Entry ID: "+ale.getId());
+ eb.setTimestamp(ale.getTimeCreated());
+
+ MessageEmbed mb = eb.build();
+ Objects.requireNonNull(event.getGuild().getTextChannelById(channelIdToSendTo)).sendMessageEmbeds(mb).queue();
+ }
+}
diff --git a/src/main/java/org/papertrail/listeners/audit/helper/ThreadUpdateEventHelper.java b/src/main/java/org/papertrail/listeners/audit/helper/ThreadUpdateEventHelper.java
new file mode 100644
index 00000000..8c8e5400
--- /dev/null
+++ b/src/main/java/org/papertrail/listeners/audit/helper/ThreadUpdateEventHelper.java
@@ -0,0 +1,98 @@
+package org.papertrail.listeners.audit.helper;
+
+import lombok.experimental.UtilityClass;
+import net.dv8tion.jda.api.EmbedBuilder;
+import net.dv8tion.jda.api.audit.AuditLogChange;
+import net.dv8tion.jda.api.audit.AuditLogEntry;
+import net.dv8tion.jda.api.entities.MessageEmbed;
+import net.dv8tion.jda.api.entities.User;
+import net.dv8tion.jda.api.entities.channel.concrete.ThreadChannel;
+import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
+import org.papertrail.commons.utilities.DurationFormatter;
+import org.papertrail.commons.utilities.TypeResolver;
+
+import java.awt.Color;
+import java.util.Map;
+import java.util.Objects;
+
+@UtilityClass
+public class ThreadUpdateEventHelper {
+
+ public static void format(GuildAuditLogEntryCreateEvent event, AuditLogEntry ale, String channelIdToSendTo) {
+
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("Audit Log Entry | Thread Update Event");
+
+ 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());
+
+ eb.setDescription("๐ค **By**: "+mentionableExecutor+"\nโน๏ธ A thread has been updated");
+ eb.setColor(Color.YELLOW);
+ eb.addField("Action Type", String.valueOf(ale.getType()), true);
+ eb.addField("Target Type", String.valueOf(ale.getTargetType()), true);
+ eb.addBlankField(true);
+
+ for(Map.Entry changes: ale.getChanges().entrySet()) {
+ String change = changes.getKey();
+ Object oldValue = changes.getValue().getOldValue();
+ Object newValue = changes.getValue().getNewValue();
+
+ switch(change) {
+ case "locked":
+ eb.addField("๐ Old Lock Status", "โฐโโค"+((Boolean.TRUE.equals(oldValue)) ? "โ
" : "โ"), true);
+ eb.addField("๐ New Lock Status", "โฐโโค"+((Boolean.TRUE.equals(newValue)) ? "โ
" : "โ"), true);
+ eb.addBlankField(true);
+ break;
+
+ case "auto_archive_duration":
+ eb.addField("๐ Old Auto Archive Duration", "โฐโโค"+ DurationFormatter.formatMinutes(oldValue), true);
+ eb.addField("๐ New Auto Archive Duration", "โฐโโค"+DurationFormatter.formatMinutes(newValue), true);
+ eb.addBlankField(true);
+ break;
+
+ case "rate_limit_per_user":
+ eb.addField("๐ Old Slowmode Limit", "โฐโโค"+DurationFormatter.formatSeconds(oldValue), true);
+ eb.addField("๐ New Slowmode Limit", "โฐโโค"+DurationFormatter.formatSeconds(newValue), true);
+ eb.addBlankField(true);
+ break;
+
+ case "type":
+ eb.addField("๐ Old Thread Type", "โฐโโค"+ TypeResolver.channelTypeResolver(oldValue), true);
+ eb.addField("๐ New Thread Type", "โฐโโค"+TypeResolver.channelTypeResolver(newValue), true);
+ eb.addBlankField(true);
+ break;
+
+ case "archived":
+ eb.addField("๐๏ธ Old Archive Status", "โฐโโค"+((Boolean.TRUE.equals(oldValue)) ? "โ
" : "โ"), true);
+ eb.addField("๐๏ธ New Archive Status", "โฐโโค"+((Boolean.TRUE.equals(newValue)) ? "โ
" : "โ"), true);
+ eb.addBlankField(true);
+ break;
+
+ case "flags":
+ eb.addField("๐ฉ Old Flag Value", "โฐโโค"+oldValue, true);
+ eb.addField("๐ฉ New Flag Value", "โฐโโค"+newValue, true);
+ eb.addBlankField(true);
+ break;
+
+ case "name":
+ eb.addField("๐ท๏ธ Old Thread Name", "โฐโโค"+oldValue, true);
+ eb.addField("๐ท๏ธ New Thread Name", "โฐโโค"+newValue, true);
+ eb.addBlankField(true);
+ break;
+
+ default:
+ eb.addField(change, "from "+oldValue+" to "+newValue, false);
+ }
+
+ }
+ eb.addField("๐งต Target Thread", "โฐโโค"+mentionableTargetThread, false);
+ eb.setFooter("Audit Log Entry ID: "+ale.getId());
+ eb.setTimestamp(ale.getTimeCreated());
+
+ MessageEmbed mb = eb.build();
+ Objects.requireNonNull(event.getGuild().getTextChannelById(channelIdToSendTo)).sendMessageEmbeds(mb).queue();
+ }
+}
diff --git a/src/main/java/org/papertrail/listeners/audit/helper/UnbanEventHelper.java b/src/main/java/org/papertrail/listeners/audit/helper/UnbanEventHelper.java
new file mode 100644
index 00000000..b446556d
--- /dev/null
+++ b/src/main/java/org/papertrail/listeners/audit/helper/UnbanEventHelper.java
@@ -0,0 +1,44 @@
+package org.papertrail.listeners.audit.helper;
+
+import lombok.experimental.UtilityClass;
+import net.dv8tion.jda.api.EmbedBuilder;
+import net.dv8tion.jda.api.audit.AuditLogEntry;
+import net.dv8tion.jda.api.entities.MessageEmbed;
+import net.dv8tion.jda.api.entities.User;
+import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
+
+import java.awt.Color;
+import java.util.Objects;
+
+@UtilityClass
+public class UnbanEventHelper {
+
+ public static void format(GuildAuditLogEntryCreateEvent event, AuditLogEntry ale, String channelIdToSendTo) {
+
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("Audit Log Entry | Member Unban Event");
+
+ User executor = ale.getJDA().getUserById(ale.getUserIdLong());
+ String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
+
+ eb.setDescription("๐ค **By**: "+mentionableExecutor+"\nโน๏ธ The following user was un-banned");
+ eb.setColor(Color.GREEN);
+ eb.addField("Action Type", String.valueOf(ale.getType()), true);
+ eb.addField("Target Type", String.valueOf(ale.getTargetType()), true);
+
+ String moderatorId = ale.getUserId();
+ String targetId = ale.getTargetId();
+
+ event.getJDA().retrieveUserById(moderatorId).queue(moderator->
+ event.getJDA().retrieveUserById(targetId).queue(target->{
+ // if user objects are null we cannot use their mention so we instead use their IDs instead since they will never be null
+ eb.addField("๐ A member has been un-banned", "โฐโโค"+(moderator!=null ? moderator.getAsMention() : moderatorId)+" has un-banned "+(target!=null ? target.getAsMention() : targetId), false);
+
+ eb.setFooter("Audit Log Entry ID: "+ale.getId());
+ eb.setTimestamp(ale.getTimeCreated());
+ MessageEmbed mb = eb.build();
+ Objects.requireNonNull(event.getGuild().getTextChannelById(channelIdToSendTo)).sendMessageEmbeds(mb).queue();
+ })
+ );
+ }
+}
diff --git a/src/main/java/org/papertrail/listeners/audit/helper/VoiceChannelStatusDeleteEventHelper.java b/src/main/java/org/papertrail/listeners/audit/helper/VoiceChannelStatusDeleteEventHelper.java
new file mode 100644
index 00000000..265ef8ab
--- /dev/null
+++ b/src/main/java/org/papertrail/listeners/audit/helper/VoiceChannelStatusDeleteEventHelper.java
@@ -0,0 +1,39 @@
+package org.papertrail.listeners.audit.helper;
+
+import lombok.experimental.UtilityClass;
+import net.dv8tion.jda.api.EmbedBuilder;
+import net.dv8tion.jda.api.audit.AuditLogEntry;
+import net.dv8tion.jda.api.entities.MessageEmbed;
+import net.dv8tion.jda.api.entities.User;
+import net.dv8tion.jda.api.entities.channel.middleman.GuildChannel;
+import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
+
+import java.awt.Color;
+import java.util.Objects;
+
+@UtilityClass
+public class VoiceChannelStatusDeleteEventHelper {
+
+ public static void format(GuildAuditLogEntryCreateEvent event, AuditLogEntry ale, String channelIdToSendTo) {
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("Audit Log Entry | Voice Channel Status Delete");
+
+ 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());
+
+ eb.setDescription("๐ค **By**: "+mentionableExecutor+"\nโน๏ธ The following voice channel's status was deleted: "+mentionableTargetChannel);
+ eb.setColor(Color.ORANGE);
+
+ eb.addField("Action Type", String.valueOf(ale.getType()), true);
+ eb.addField("Target Type", String.valueOf(ale.getTargetType()), true);
+
+ eb.setFooter("Audit Log Entry ID: "+ale.getId());
+ eb.setTimestamp(ale.getTimeCreated());
+
+ MessageEmbed mb = eb.build();
+ Objects.requireNonNull(event.getGuild().getTextChannelById(channelIdToSendTo)).sendMessageEmbeds(mb).queue();
+ }
+}
diff --git a/src/main/java/org/papertrail/listeners/audit/helper/VoiceChannelStatusUpdateEventHelper.java b/src/main/java/org/papertrail/listeners/audit/helper/VoiceChannelStatusUpdateEventHelper.java
new file mode 100644
index 00000000..ea2447ed
--- /dev/null
+++ b/src/main/java/org/papertrail/listeners/audit/helper/VoiceChannelStatusUpdateEventHelper.java
@@ -0,0 +1,39 @@
+package org.papertrail.listeners.audit.helper;
+
+import lombok.experimental.UtilityClass;
+import net.dv8tion.jda.api.EmbedBuilder;
+import net.dv8tion.jda.api.audit.AuditLogEntry;
+import net.dv8tion.jda.api.entities.MessageEmbed;
+import net.dv8tion.jda.api.entities.User;
+import net.dv8tion.jda.api.entities.channel.middleman.GuildChannel;
+import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
+
+import java.awt.Color;
+import java.util.Objects;
+
+@UtilityClass
+public class VoiceChannelStatusUpdateEventHelper {
+
+ public static void format(GuildAuditLogEntryCreateEvent event, AuditLogEntry ale, String channelIdToSendTo) {
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("Audit Log Entry | Voice Channel Status Update");
+
+ 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());
+
+ eb.setDescription("๐ค **By**: "+mentionableExecutor+"\nโน๏ธ The following voice channel's status was updated: "+mentionableTargetChannel);
+ eb.setColor(Color.YELLOW);
+
+ eb.addField("Action Type", String.valueOf(ale.getType()), true);
+ eb.addField("Target Type", String.valueOf(ale.getTargetType()), true);
+
+ eb.setFooter("Audit Log Entry ID: "+ale.getId());
+ eb.setTimestamp(ale.getTimeCreated());
+
+ MessageEmbed mb = eb.build();
+ Objects.requireNonNull(event.getGuild().getTextChannelById(channelIdToSendTo)).sendMessageEmbeds(mb).queue();
+ }
+}
diff --git a/src/main/java/org/papertrail/listeners/audit/helper/WebhookCreateEventHelper.java b/src/main/java/org/papertrail/listeners/audit/helper/WebhookCreateEventHelper.java
new file mode 100644
index 00000000..0a7b3f5e
--- /dev/null
+++ b/src/main/java/org/papertrail/listeners/audit/helper/WebhookCreateEventHelper.java
@@ -0,0 +1,69 @@
+package org.papertrail.listeners.audit.helper;
+
+import lombok.experimental.UtilityClass;
+import net.dv8tion.jda.api.EmbedBuilder;
+import net.dv8tion.jda.api.audit.AuditLogChange;
+import net.dv8tion.jda.api.audit.AuditLogEntry;
+import net.dv8tion.jda.api.entities.MessageEmbed;
+import net.dv8tion.jda.api.entities.User;
+import net.dv8tion.jda.api.entities.channel.middleman.GuildChannel;
+import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
+
+import java.awt.Color;
+import java.util.Map;
+import java.util.Objects;
+
+@UtilityClass
+public class WebhookCreateEventHelper {
+
+ public static void format(GuildAuditLogEntryCreateEvent event, AuditLogEntry ale, String channelIdToSendTo) {
+
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("Audit Log Entry | Webhook Create Event");
+
+ User executor = ale.getJDA().getUserById(ale.getUserIdLong());
+ String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
+
+ eb.setDescription("๐ค **By**: "+mentionableExecutor+"\nโน๏ธ A webhook has been created");
+ eb.setColor(Color.GREEN);
+ eb.addField("Action Type", String.valueOf(ale.getType()), true);
+ eb.addField("Target Type", String.valueOf(ale.getTargetType()), true);
+
+ for(Map.Entry changes: ale.getChanges().entrySet()) {
+ String change = changes.getKey();
+ Object oldValue = changes.getValue().getOldValue();
+ Object newValue = changes.getValue().getNewValue();
+
+ switch(change) {
+ case "type":
+ eb.addField("Webhook Type", "โฐโโค"+newValue, false);
+ eb.addField("Webhook Type Explanation", "-# 0 for PING; 1 for Event", false);
+ break;
+
+ case "avatar_Hash":
+ eb.addField("Avatar Hash", "โฐโโค"+newValue, false);
+ break;
+
+ case "channel_id":
+ GuildChannel targetChannel = event.getGuild().getGuildChannelById(String.valueOf(newValue));
+ String mentionableTargetChannel = (targetChannel !=null ? targetChannel.getAsMention() : String.valueOf(newValue));
+ eb.addField("Channel", "โฐโโค"+mentionableTargetChannel, false);
+ break;
+
+ case "name":
+ eb.addField("Webhook Name", "โฐโโค"+newValue, false);
+ break;
+
+
+ default:
+ eb.addField(change, "from "+oldValue+" to "+newValue, false);
+ }
+
+ }
+ eb.setFooter("Audit Log Entry ID: "+ale.getId());
+ eb.setTimestamp(ale.getTimeCreated());
+
+ MessageEmbed mb = eb.build();
+ Objects.requireNonNull(event.getGuild().getTextChannelById(channelIdToSendTo)).sendMessageEmbeds(mb).queue();
+ }
+}
diff --git a/src/main/java/org/papertrail/listeners/audit/helper/WebhookRemoveEventHelper.java b/src/main/java/org/papertrail/listeners/audit/helper/WebhookRemoveEventHelper.java
new file mode 100644
index 00000000..d1be9357
--- /dev/null
+++ b/src/main/java/org/papertrail/listeners/audit/helper/WebhookRemoveEventHelper.java
@@ -0,0 +1,69 @@
+package org.papertrail.listeners.audit.helper;
+
+import lombok.experimental.UtilityClass;
+import net.dv8tion.jda.api.EmbedBuilder;
+import net.dv8tion.jda.api.audit.AuditLogChange;
+import net.dv8tion.jda.api.audit.AuditLogEntry;
+import net.dv8tion.jda.api.entities.MessageEmbed;
+import net.dv8tion.jda.api.entities.User;
+import net.dv8tion.jda.api.entities.channel.middleman.GuildChannel;
+import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
+
+import java.awt.Color;
+import java.util.Map;
+import java.util.Objects;
+
+@UtilityClass
+public class WebhookRemoveEventHelper {
+
+ public static void format(GuildAuditLogEntryCreateEvent event, AuditLogEntry ale, String channelIdToSendTo) {
+
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("Audit Log Entry | Webhook Remove Event");
+
+ User executor = ale.getJDA().getUserById(ale.getUserIdLong());
+ String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
+
+ eb.setDescription("๐ค **By**: "+mentionableExecutor+"\nโน๏ธ A webhook has been removed");
+ eb.setColor(Color.RED);
+ eb.addField("Action Type", String.valueOf(ale.getType()), true);
+ eb.addField("Target Type", String.valueOf(ale.getTargetType()), true);
+
+ for(Map.Entry changes: ale.getChanges().entrySet()) {
+ String change = changes.getKey();
+ Object oldValue = changes.getValue().getOldValue();
+ Object newValue = changes.getValue().getNewValue();
+
+ switch(change) {
+ case "type":
+ eb.addField("๐ก Webhook Type", "โฐโโค"+oldValue, false);
+ eb.addField("Webhook Type Legend", "-# 0 for PING; 1 for Event", false);
+ break;
+
+ case "avatar_hash":
+ eb.addField("๐ผ๏ธ Avatar Hash", "โฐโโค"+oldValue, false);
+ break;
+
+ case "channel_id":
+ GuildChannel targetChannel = event.getGuild().getGuildChannelById(String.valueOf(oldValue));
+ String mentionableTargetChannel = (targetChannel !=null ? targetChannel.getAsMention() : String.valueOf(oldValue));
+ eb.addField("๐ฌ Channel", "โฐโโค"+mentionableTargetChannel, false);
+ break;
+
+ case "name":
+ eb.addField("๐ท๏ธ Webhook Name", "โฐโโค"+oldValue, false);
+ break;
+
+
+ default:
+ eb.addField(change, "from "+oldValue+" to "+newValue, false);
+ }
+
+ }
+ eb.setFooter("Audit Log Entry ID: "+ale.getId());
+ eb.setTimestamp(ale.getTimeCreated());
+
+ MessageEmbed mb = eb.build();
+ Objects.requireNonNull(event.getGuild().getTextChannelById(channelIdToSendTo)).sendMessageEmbeds(mb).queue();
+ }
+}
diff --git a/src/main/java/org/papertrail/listeners/audit/helper/WebhookUpdateEventHelper.java b/src/main/java/org/papertrail/listeners/audit/helper/WebhookUpdateEventHelper.java
new file mode 100644
index 00000000..a7873d42
--- /dev/null
+++ b/src/main/java/org/papertrail/listeners/audit/helper/WebhookUpdateEventHelper.java
@@ -0,0 +1,70 @@
+package org.papertrail.listeners.audit.helper;
+
+import lombok.experimental.UtilityClass;
+import net.dv8tion.jda.api.EmbedBuilder;
+import net.dv8tion.jda.api.audit.AuditLogChange;
+import net.dv8tion.jda.api.audit.AuditLogEntry;
+import net.dv8tion.jda.api.entities.MessageEmbed;
+import net.dv8tion.jda.api.entities.User;
+import net.dv8tion.jda.api.entities.channel.middleman.GuildChannel;
+import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
+
+import java.awt.Color;
+import java.util.Map;
+import java.util.Objects;
+
+@UtilityClass
+public class WebhookUpdateEventHelper {
+
+ public static void format(GuildAuditLogEntryCreateEvent event, AuditLogEntry ale, String channelIdToSendTo) {
+
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("Audit Log Entry | Webhook Update Event");
+
+ User executor = ale.getJDA().getUserById(ale.getUserIdLong());
+ String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
+
+ eb.setDescription("๐ค **By**: "+mentionableExecutor+"\nโน๏ธ A webhook has been updated");
+ eb.setColor(Color.YELLOW);
+ eb.addField("Action Type", String.valueOf(ale.getType()), true);
+ eb.addField("Target Type", String.valueOf(ale.getTargetType()), true);
+
+ for(Map.Entry changes: ale.getChanges().entrySet()) {
+ String change = changes.getKey();
+ Object oldValue = changes.getValue().getOldValue();
+ Object newValue = changes.getValue().getNewValue();
+
+ switch(change) {
+ case "type":
+ eb.addField("๐ก Webhook Type", "โฐโโค " + newValue, false);
+ eb.addField("Webhook Type Legend", "-# 0 for PING; 1 for Event", false);
+ break;
+
+ case "avatar_hash":
+ eb.addField("๐ผ๏ธ Avatar Hash", "โฐโโค"+"from `"+oldValue+"` to `"+newValue+"`", false);
+ break;
+
+ case "channel_id":
+ GuildChannel targetChannel = event.getGuild().getGuildChannelById(String.valueOf(newValue));
+ String mentionableTargetChannel = (targetChannel !=null ? targetChannel.getAsMention() : String.valueOf(newValue));
+ eb.addField("๐ฌ New Channel", "โฐโโค"+mentionableTargetChannel, false);
+ break;
+
+ case "name":
+ eb.addField("๐ท๏ธ Webhook Name", "โฐโโค"+"from "+oldValue+" to "+newValue, false);
+ break;
+
+
+ default:
+ eb.addField(change, "from "+oldValue+" to "+newValue, false);
+ }
+
+ }
+ eb.setFooter("Audit Log Entry ID: "+ale.getId());
+ eb.setTimestamp(ale.getTimeCreated());
+
+ MessageEmbed mb = eb.build();
+ Objects.requireNonNull(event.getGuild().getTextChannelById(channelIdToSendTo)).sendMessageEmbeds(mb).queue();
+ }
+
+}
diff --git a/src/main/java/org/papertrail/listeners/auditlog/setup/AuditLogSetupCommandListener.java b/src/main/java/org/papertrail/listeners/audit/setup/AuditLogSetupCommandListener.java
similarity index 99%
rename from src/main/java/org/papertrail/listeners/auditlog/setup/AuditLogSetupCommandListener.java
rename to src/main/java/org/papertrail/listeners/audit/setup/AuditLogSetupCommandListener.java
index 0619871e..e87f7640 100644
--- a/src/main/java/org/papertrail/listeners/auditlog/setup/AuditLogSetupCommandListener.java
+++ b/src/main/java/org/papertrail/listeners/audit/setup/AuditLogSetupCommandListener.java
@@ -1,4 +1,4 @@
-package org.papertrail.listeners.auditlog.setup;
+package org.papertrail.listeners.audit.setup;
import java.awt.Color;
import java.util.Objects;
diff --git a/src/main/java/org/papertrail/listeners/auditlog/event/AuditLogListener.java b/src/main/java/org/papertrail/listeners/auditlog/event/AuditLogListener.java
deleted file mode 100644
index cdcccd67..00000000
--- a/src/main/java/org/papertrail/listeners/auditlog/event/AuditLogListener.java
+++ /dev/null
@@ -1,2676 +0,0 @@
-package org.papertrail.listeners.auditlog.event;
-
-import java.awt.Color;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.Objects;
-import java.util.concurrent.Executor;
-
-import io.vavr.control.Either;
-import org.apache.commons.lang3.StringUtils;
-import org.jetbrains.annotations.NotNull;
-import org.papertrail.commons.sdk.client.AuditLogClient;
-import org.papertrail.commons.sdk.model.AuditLogObject;
-import org.papertrail.commons.sdk.model.ErrorObject;
-import org.papertrail.commons.utilities.ColorFormatter;
-import org.papertrail.commons.utilities.DurationFormatter;
-import org.papertrail.commons.utilities.GuildSystemChannelFlagResolver;
-import org.papertrail.commons.utilities.MemberRoleUpdateParser;
-import org.papertrail.commons.utilities.PermissionResolver;
-import org.papertrail.commons.utilities.TypeResolver;
-
-import net.dv8tion.jda.api.EmbedBuilder;
-import net.dv8tion.jda.api.audit.ActionType;
-import net.dv8tion.jda.api.audit.AuditLogChange;
-import net.dv8tion.jda.api.audit.AuditLogEntry;
-import net.dv8tion.jda.api.entities.Member;
-import net.dv8tion.jda.api.entities.MessageEmbed;
-import net.dv8tion.jda.api.entities.Role;
-import net.dv8tion.jda.api.entities.ScheduledEvent;
-import net.dv8tion.jda.api.entities.User;
-import net.dv8tion.jda.api.entities.automod.AutoModRule;
-import net.dv8tion.jda.api.entities.channel.Channel;
-import net.dv8tion.jda.api.entities.channel.concrete.ThreadChannel;
-import net.dv8tion.jda.api.entities.channel.middleman.GuildChannel;
-import net.dv8tion.jda.api.entities.sticker.GuildSticker;
-import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
-import net.dv8tion.jda.api.hooks.ListenerAdapter;
-
-public class AuditLogListener extends ListenerAdapter{
-
- private final Executor vThreadPool;
-
- public AuditLogListener(Executor vThreadPool) {
- this.vThreadPool = vThreadPool;
- }
-
- @Override
- public void onGuildAuditLogEntryCreate(@NotNull GuildAuditLogEntryCreateEvent event) {
-
- vThreadPool.execute(()->{
-
- // Call the API and see if the event came from a registered Guild
- Either response = AuditLogClient.getRegisteredGuild(event.getGuild().getId());
- response.peek(success -> {
- AuditLogEntry ale = event.getEntry();
- auditLogParser(event, ale, success.channelId());
- });
-
- });
- }
-
- private void auditLogParser(GuildAuditLogEntryCreateEvent event, AuditLogEntry ale, String channelIdToSendTo) {
- ActionType action = ale.getType();
- switch(action) {
- case APPLICATION_COMMAND_PRIVILEGES_UPDATE -> formatGeneric(event, ale, channelIdToSendTo);
-
- case AUTO_MODERATION_FLAG_TO_CHANNEL -> formatAutoModFlagToChannel(event, ale, channelIdToSendTo);
- case AUTO_MODERATION_MEMBER_TIMEOUT -> formatAutoModMemberTimeout(event, ale, channelIdToSendTo);
- case AUTO_MODERATION_RULE_BLOCK_MESSAGE -> formatAutoModRuleBlockMessage(event, ale, channelIdToSendTo);
- case AUTO_MODERATION_RULE_CREATE -> formatAutoModRuleCreate(event, ale, channelIdToSendTo);
- case AUTO_MODERATION_RULE_DELETE -> formatAutoModRuleDelete(event, ale, channelIdToSendTo);
- case AUTO_MODERATION_RULE_UPDATE -> formatAutoModRuleUpdate(event, ale, channelIdToSendTo);
-
- case KICK -> formatKick(event, ale, channelIdToSendTo);
- case PRUNE -> formatGeneric(event, ale, channelIdToSendTo);
- case BAN -> formatBan(event, ale, channelIdToSendTo);
- case UNBAN -> formatUnban(event, ale, channelIdToSendTo);
- case BOT_ADD -> formatBotAdd(event, ale, channelIdToSendTo);
-
- case CHANNEL_CREATE -> formatChannelCreate(event, ale, channelIdToSendTo);
- case CHANNEL_UPDATE -> formatChannelUpdate(event, ale, channelIdToSendTo);
- case CHANNEL_DELETE -> formatChannelDelete(event, ale, channelIdToSendTo);
- case CHANNEL_OVERRIDE_CREATE -> formatChannelOverrideCreate(event, ale, channelIdToSendTo);
- case CHANNEL_OVERRIDE_DELETE -> formatChannelOverrideDelete(event, ale, channelIdToSendTo);
- case CHANNEL_OVERRIDE_UPDATE -> formatChannelOverrideUpdate(event, ale, channelIdToSendTo);
-
- case ROLE_CREATE -> formatRoleCreate(event, ale, channelIdToSendTo);
- case ROLE_UPDATE -> formatRoleUpdate(event, ale, channelIdToSendTo);
- case ROLE_DELETE -> formatRoleDelete(event, ale, channelIdToSendTo);
-
- case EMOJI_CREATE -> formatEmojiCreate(event, ale, channelIdToSendTo);
- case EMOJI_UPDATE -> formatEmojiUpdate(event, ale, channelIdToSendTo);
- case EMOJI_DELETE -> formatEmojiDelete(event, ale, channelIdToSendTo);
-
- case STICKER_CREATE -> formatStickerCreate(event, ale, channelIdToSendTo);
- case STICKER_UPDATE -> formatStickerUpdate(event, ale, channelIdToSendTo);
- case STICKER_DELETE -> formatStickerDelete(event, ale, channelIdToSendTo);
-
- case GUILD_UPDATE -> formatGuildUpdate(event, ale, channelIdToSendTo);
-
- case INTEGRATION_CREATE -> formatIntegrationCreate(event, ale, channelIdToSendTo);
- case INTEGRATION_UPDATE -> formatGeneric(event, ale, channelIdToSendTo);
- case INTEGRATION_DELETE -> formatIntegrationDelete(event, ale, channelIdToSendTo);
-
- case INVITE_CREATE -> formatInviteCreate(event, ale, channelIdToSendTo);
- case INVITE_UPDATE -> formatGeneric(event, ale, channelIdToSendTo);
- case INVITE_DELETE -> formatInviteDelete(event, ale, channelIdToSendTo);
-
- case MEMBER_ROLE_UPDATE -> formatMemberRoleUpdate(event, ale, channelIdToSendTo);
- case MEMBER_UPDATE -> formatMemberUpdate(event, ale, channelIdToSendTo);
-
- case MEMBER_VOICE_KICK -> formatMemberVoiceKick(event, ale, channelIdToSendTo);
- case MEMBER_VOICE_MOVE -> formatMemberVoiceMove(event, ale, channelIdToSendTo);
-
- // these seemingly don't trigger properly, or are unreliable
- case MESSAGE_BULK_DELETE -> formatGeneric(event, ale, channelIdToSendTo);
- case MESSAGE_CREATE -> formatGeneric(event, ale, channelIdToSendTo);
- case MESSAGE_DELETE -> formatGeneric(event, ale, channelIdToSendTo);
- case MESSAGE_UPDATE -> formatGeneric(event, ale, channelIdToSendTo);
-
- case MESSAGE_PIN -> formatMessagePin(event, ale, channelIdToSendTo);
- case MESSAGE_UNPIN -> formatMessageUnpin(event, ale, channelIdToSendTo);
-
- case SCHEDULED_EVENT_CREATE -> formatScheduledEventCreate(event, ale, channelIdToSendTo);
- case SCHEDULED_EVENT_UPDATE -> formatScheduledEventUpdate(event, ale, channelIdToSendTo);
- case SCHEDULED_EVENT_DELETE -> formatScheduledEventDelete(event, ale, channelIdToSendTo);
-
- case STAGE_INSTANCE_CREATE -> formatStageInstanceCreate(event, ale, channelIdToSendTo);
- case STAGE_INSTANCE_UPDATE -> formatStageInstanceUpdate(event, ale, channelIdToSendTo);
- case STAGE_INSTANCE_DELETE -> formatStageInstanceDelete(event, ale, channelIdToSendTo);
-
- case THREAD_CREATE -> formatThreadCreate(event, ale, channelIdToSendTo);
- case THREAD_UPDATE -> formatThreadUpdate(event, ale, channelIdToSendTo);
- case THREAD_DELETE -> formatThreadDelete(event, ale, channelIdToSendTo);
-
- case VOICE_CHANNEL_STATUS_DELETE -> formatVoiceChannelStatusDelete(event, ale, channelIdToSendTo);
- case VOICE_CHANNEL_STATUS_UPDATE -> formatVoiceChannelStatusUpdate(event, ale, channelIdToSendTo);
-
- case WEBHOOK_CREATE -> formatWebhookCreate(event, ale, channelIdToSendTo);
- case WEBHOOK_UPDATE -> formatWebhookUpdate(event, ale, channelIdToSendTo);
- case WEBHOOK_REMOVE -> formatWebhookRemove(event, ale, channelIdToSendTo);
-
- case UNKNOWN -> formatGeneric(event, ale, channelIdToSendTo);
- default -> formatGeneric(event, ale, channelIdToSendTo);
- }
- }
-
-
- private void formatGeneric(GuildAuditLogEntryCreateEvent event, AuditLogEntry ale, String channelIdToSendTo) {
-
- EmbedBuilder eb = new EmbedBuilder();
- eb.setTitle("Audit Log Entry | Generic Event");
- User executor = ale.getJDA().getUserById(ale.getUserIdLong());
-
- eb.setDescription((executor != null ? executor.getAsMention() : ale.getUserId())+" has executed the following action:");
- eb.setColor(Color.LIGHT_GRAY);
- eb.addField("Action Type", String.valueOf(ale.getType()), true);
- eb.addField("Target Type", String.valueOf(ale.getTargetType()), true);
-
- for(Entry changes: ale.getChanges().entrySet()) {
- String change = changes.getKey();
- Object oldValue = changes.getValue().getOldValue();
- Object newValue = changes.getValue().getNewValue();
-
- eb.addField(change, "from "+oldValue+" to "+newValue, false);
- }
-
- eb.setFooter("Audit Log Entry ID: "+ale.getId());
- eb.setTimestamp(ale.getTimeCreated());
-
- MessageEmbed mb = eb.build();
- Objects.requireNonNull(event.getGuild().getTextChannelById(channelIdToSendTo)).sendMessageEmbeds(mb).queue();
- }
-
- private void formatInviteCreate(GuildAuditLogEntryCreateEvent event, AuditLogEntry ale , String channelIdToSendTo) {
-
- EmbedBuilder eb = new EmbedBuilder();
- eb.setTitle("Audit Log Entry | Invite Create Event");
-
- User executor = ale.getJDA().getUserById(ale.getUserIdLong());
- String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
-
- eb.setDescription("๐ค **By**: "+mentionableExecutor+"\nโน๏ธ The following invite was created");
- eb.setColor(Color.CYAN);
- eb.addField("Action Type", String.valueOf(ale.getType()), true);
- eb.addField("Target Type", String.valueOf(ale.getTargetType()), true);
-
- for(Entry changes: ale.getChanges().entrySet()) {
-
- String change = changes.getKey();
- Object oldValue = changes.getValue().getOldValue();
- Object newValue = changes.getValue().getNewValue();
-
- switch(change) {
-
- case "code":
- eb.addField("๐ Invite Code", "โฐโโค"+newValue, false);
- break;
-
- case "inviter_id":
- User inviter = ale.getJDA().getUserById(String.valueOf(newValue));
- eb.addField("๐ค Invite Created By", "โฐโโค"+(inviter != null ? inviter.getAsMention() : ale.getUserId()), false);
- break;
-
- case "temporary":
- eb.addField("๐ Temporary Invite", "โฐโโค"+((Boolean.TRUE.equals(newValue)) ? "โ
" : "โ"), false);
- break;
-
- case "max_uses":
- int maxUses = Integer.parseInt(String.valueOf(newValue));
- eb.addField("๐ข Max Uses", "โฐโโค"+(maxUses == 0 ? "Unlimited" : String.valueOf(maxUses)), false);
- break;
- case "uses", "flags":
- break;
-
- case "max_age":
- eb.addField("โณ Expires After", "โฐโโค"+DurationFormatter.formatSeconds(newValue), false);
- break;
- case "channel_id":
- GuildChannel channel = ale.getGuild().getGuildChannelById(String.valueOf(newValue));
- eb.addField("๐ฌ Invite Channel", "โฐโโค"+(channel != null ? channel.getAsMention() : "`"+newValue+"`"), false);
- break;
- default:
- eb.addField(change, "from "+oldValue+" to "+newValue, false);
- }
- }
-
- eb.setFooter("Audit Log Entry ID: "+ale.getId());
- eb.setTimestamp(ale.getTimeCreated());
-
- MessageEmbed mb = eb.build();
-
- Objects.requireNonNull(event.getGuild().getTextChannelById(channelIdToSendTo)).sendMessageEmbeds(mb).queue();
-
- }
-
- private void formatInviteDelete(GuildAuditLogEntryCreateEvent event, AuditLogEntry ale, String channelIdToSendTo) {
-
- 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("๐ค **By**: "+mentionableExecutor+"\nโน๏ธ The following invite has been deleted");
- eb.setColor(Color.BLUE);
- eb.addField("Action Type", String.valueOf(ale.getType()), true);
- eb.addField("Target Type", String.valueOf(ale.getTargetType()), true);
-
- for(Entry changes: ale.getChanges().entrySet()) {
-
- String change = changes.getKey();
- Object oldValue = changes.getValue().getOldValue();
- Object newValue = changes.getValue().getNewValue();
-
- switch(change) {
-
- case "code":
- eb.addField("๐ Deleted Invite Code", "โฐโโค"+oldValue, false);
- break;
-
- case "inviter_id":
- User inviter = ale.getJDA().getUserById(String.valueOf(oldValue));
- eb.addField("๐ค Invite Originally Created By", "โฐโโค"+(inviter != null ? inviter.getAsMention() : "`Unknown`"), false);
- break;
-
- case "temporary":
- eb.addField("๐ Temporary Invite", "โฐโโค"+((Boolean.TRUE.equals(oldValue)) ? "โ
" : "โ"), false);
- break;
-
- case "max_uses", "flags", "max_age":
- break;
- case "uses":
- eb.addField("๐ข Number of times the invite was used", "โฐโโค"+oldValue, false);
- break;
- case "channel_id":
- Channel channel = ale.getGuild().getGuildChannelById(String.valueOf(oldValue));
- eb.addField("๐ฌ Invite Channel", "โฐโโค"+(channel != null ? channel.getAsMention() : "`"+oldValue+"`"), false);
- break;
- default:
- eb.addField(change, "from "+oldValue+" to "+newValue, false);
- }
- }
-
- eb.setFooter("Audit Log Entry ID: "+ale.getId());
- eb.setTimestamp(ale.getTimeCreated());
-
- MessageEmbed mb = eb.build();
-
- Objects.requireNonNull(event.getGuild().getTextChannelById(channelIdToSendTo)).sendMessageEmbeds(mb).queue();
- }
-
- private void formatKick(GuildAuditLogEntryCreateEvent event, AuditLogEntry ale, String channelIdToSendTo) {
-
- EmbedBuilder eb = new EmbedBuilder();
- eb.setTitle("Audit Log Entry | Kick Event");
-
- User executor = ale.getJDA().getUserById(ale.getUserIdLong());
- String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
-
- eb.setDescription("๐ค **By**: "+mentionableExecutor+"\nโน๏ธ The following member was kicked");
- eb.setColor(Color.ORANGE);
- eb.addField("Action Type", String.valueOf(ale.getType()), true);
- eb.addField("Target Type", String.valueOf(ale.getTargetType()), true);
-
- String moderatorId = ale.getUserId();
- String targetId = ale.getTargetId();
- String reason = ale.getReason();
-
- // A REST Action is required here because kicked members are not cached
- event.getJDA().retrieveUserById(moderatorId).queue(moderator->{
- event.getJDA().retrieveUserById(targetId).queue(target->{
- // if user objects are null we cannot use their mention so we instead use their IDs instead since they will never be null
- eb.addField("๐ข A member/application has been kicked", "โฐโโค"+(moderator!=null ? moderator.getAsMention() : moderatorId)+" has kicked "+(target!=null ? target.getAsMention() : targetId), false);
- eb.addField("๐ With Reason", "โฐโโค"+(reason!=null ? reason : "No Reason Provided"), false);
-
- eb.setFooter("Audit Log Entry ID: "+ale.getId());
- eb.setTimestamp(ale.getTimeCreated());
- MessageEmbed mb = eb.build();
- Objects.requireNonNull(event.getGuild().getTextChannelById(channelIdToSendTo)).sendMessageEmbeds(mb).queue();
- });
- });
- }
-
- private void formatBan(GuildAuditLogEntryCreateEvent event, AuditLogEntry ale, String channelIdToSendTo) {
-
- EmbedBuilder eb = new EmbedBuilder();
- eb.setTitle("Audit Log Entry | Ban Event");
-
- User executor = ale.getJDA().getUserById(ale.getUserIdLong());
- String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
-
- eb.setDescription("๐ค **By**: "+mentionableExecutor+"\nโน๏ธ The following user was banned");
- eb.setColor(Color.RED);
- eb.addField("Action Type", String.valueOf(ale.getType()), true);
- eb.addField("Target Type", String.valueOf(ale.getTargetType()), true);
-
- String moderatorId = ale.getUserId();
- String targetId = ale.getTargetId();
- String reason = ale.getReason();
-
- event.getJDA().retrieveUserById(moderatorId).queue(moderator->{
- event.getJDA().retrieveUserById(targetId).queue(target->{
- // if user objects are null we cannot use their mention so we instead use their IDs instead since they will never be null
- eb.addField("๐ซ A member has been banned", "โฐโโค"+(moderator!=null ? moderator.getAsMention() : moderatorId)+" has banned "+(target!=null ? target.getAsMention() : targetId), false);
- eb.addField("๐ With Reason", "โฐโโค"+(reason!=null ? reason : "No Reason Provided"), false);
-
- eb.setFooter("Audit Log Entry ID: "+ale.getId());
- eb.setTimestamp(ale.getTimeCreated());
- MessageEmbed mb = eb.build();
- Objects.requireNonNull(event.getGuild().getTextChannelById(channelIdToSendTo)).sendMessageEmbeds(mb).queue();
- });
- });
- }
-
- private void formatUnban(GuildAuditLogEntryCreateEvent event, AuditLogEntry ale, String channelIdToSendTo) {
-
- EmbedBuilder eb = new EmbedBuilder();
- eb.setTitle("Audit Log Entry | Member Unban Event");
-
- User executor = ale.getJDA().getUserById(ale.getUserIdLong());
- String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
-
- eb.setDescription("๐ค **By**: "+mentionableExecutor+"\nโน๏ธ The following user was un-banned");
- eb.setColor(Color.GREEN);
- eb.addField("Action Type", String.valueOf(ale.getType()), true);
- eb.addField("Target Type", String.valueOf(ale.getTargetType()), true);
-
- String moderatorId = ale.getUserId();
- String targetId = ale.getTargetId();
-
- event.getJDA().retrieveUserById(moderatorId).queue(moderator->{
- event.getJDA().retrieveUserById(targetId).queue(target->{
- // if user objects are null we cannot use their mention so we instead use their IDs instead since they will never be null
- eb.addField("๐ A member has been un-banned", "โฐโโค"+(moderator!=null ? moderator.getAsMention() : moderatorId)+" has un-banned "+(target!=null ? target.getAsMention() : targetId), false);
-
- eb.setFooter("Audit Log Entry ID: "+ale.getId());
- eb.setTimestamp(ale.getTimeCreated());
- MessageEmbed mb = eb.build();
- Objects.requireNonNull(event.getGuild().getTextChannelById(channelIdToSendTo)).sendMessageEmbeds(mb).queue();
- });
- });
- }
-
- private void formatMemberUpdate(GuildAuditLogEntryCreateEvent event, AuditLogEntry ale, String channelIdToSendTo) {
-
- EmbedBuilder eb = new EmbedBuilder();
- eb.setTitle("Audit Log Entry | Member Update Event");
-
- User executor = ale.getJDA().getUserById(ale.getUserIdLong());
- User target = ale.getJDA().getUserById(ale.getTargetIdLong());
-
- String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
- String mentionableTarget = (target !=null ? target.getAsMention() : ale.getTargetId());
-
- eb.setDescription("๐ค **By**: "+mentionableExecutor+"\nโน๏ธ The following member was updated");
- eb.setThumbnail(Objects.requireNonNull(event.getGuild().getMemberById(ale.getTargetId())).getEffectiveAvatarUrl());
- eb.setColor(Color.CYAN);
- eb.addField("Action Type", String.valueOf(ale.getType()), true);
- eb.addField("Target Type", String.valueOf(ale.getTargetType()), true);
-
- for(Entry changes: ale.getChanges().entrySet()) {
-
- String change = changes.getKey();
- Object oldValue = changes.getValue().getOldValue();
- Object newValue = changes.getValue().getNewValue();
-
- switch(change) {
-
- case "communication_disabled_until":
- if(newValue==null) {
- eb.setColor(Color.GREEN);
- eb.addField("๐ข Timeout Lifted", "โฐโโค Timeout for "+mentionableTarget+ " has been removed", false);
- } else {
- eb.setColor(Color.YELLOW);
- eb.addField("โ Timeout Received", "โฐโโค"+mentionableTarget+ " has received a timeout", false);
- eb.addField("โฑ๏ธ Till", "โฐโโค"+DurationFormatter.isoToLocalTimeCounter(newValue), false);
- eb.addField("๐ Reason", "โฐโโค"+(ale.getReason()!=null ? ale.getReason() : "No Reason Provided"), false);
- }
-
- break;
-
- case "nick":
- if(oldValue!=null && newValue==null) { // resetting to default nickname
- eb.addField("๐ท๏ธ Nickname Update", "โฐโโค"+"Reset "+mentionableTarget+"'s name", false);
- } else if(oldValue != null) { // changing from one nickname to another
- eb.addField("๐ท๏ธ Nickname Update", "โฐโโค"+"Updated "+mentionableTarget+"'s name from "+oldValue+ " to "+ newValue, false);
- } else if(newValue != null) { // changing from default nickname to a new nickname
- eb.addField("๐ท๏ธ Nickname Update", "โฐโโค"+"Set "+mentionableTarget+"'s name as "+ newValue, false);
- }
- break;
-
- case "mute":
- eb.addField("๐๏ธ Is Muted", "โฐโโคSet "+mentionableTarget+"'s Mute Status as "+ ((Boolean.TRUE.equals(newValue)) ? "โ
" : "โ"), false);
- break;
-
- case "deaf":
- eb.addField("๐ Is Deafened", "โฐโโคSet "+mentionableTarget+"'s Deafened Status as "+ ((Boolean.TRUE.equals(newValue)) ? "โ
" : "โ"), false);
- break;
-
- case "bypasses_verification":
- eb.addField("๐ก๏ธ Bypass Verification", "โฐโโคSet "+mentionableTarget+"'s verification bypass status as "+ ((Boolean.TRUE.equals(newValue)) ? "โ
" : "โ"), false);
- break;
-
- default:
- eb.addField(change, "from "+oldValue+" to "+newValue, false);
- }
- }
-
- eb.setFooter("Audit Log Entry ID: "+ale.getId());
- eb.setTimestamp(ale.getTimeCreated());
-
- MessageEmbed mb = eb.build();
-
- Objects.requireNonNull(event.getGuild().getTextChannelById(channelIdToSendTo)).sendMessageEmbeds(mb).queue();
- }
-
- private void formatBotAdd(GuildAuditLogEntryCreateEvent event, AuditLogEntry ale, String channelIdToSendTo) {
-
- EmbedBuilder eb = new EmbedBuilder();
- eb.setTitle("Audit Log Entry | Bot Add Event");
-
- User executor = ale.getJDA().getUserById(ale.getUserIdLong());
- User target = ale.getJDA().getUserById(ale.getTargetIdLong());
-
- String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
- String mentionableTarget = (target !=null ? target.getAsMention() : ale.getTargetId());
-
- eb.setDescription("๐ค **By**: "+mentionableExecutor+"\nโน๏ธ A bot was added");
- eb.setColor(Color.CYAN);
-
- eb.addField("Action Type", String.valueOf(ale.getType()), true);
- eb.addField("Target Type", String.valueOf(ale.getTargetType()), true);
- eb.addField("๐ค Added a bot: ", "โฐโโค"+mentionableTarget, false);
-
- eb.setFooter("Audit Log Entry ID: "+ale.getId());
- eb.setTimestamp(ale.getTimeCreated());
-
- MessageEmbed mb = eb.build();
-
- Objects.requireNonNull(event.getGuild().getTextChannelById(channelIdToSendTo)).sendMessageEmbeds(mb).queue();
- }
-
- private void formatIntegrationCreate(GuildAuditLogEntryCreateEvent event, AuditLogEntry ale, String channelIdToSendTo) {
-
- EmbedBuilder eb = new EmbedBuilder();
- eb.setTitle("Audit Log Entry | Integration Create Event");
-
- User executor = ale.getJDA().getUserById(ale.getUserIdLong());
- String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
-
- eb.setDescription("๐ค **By**: "+mentionableExecutor+"\nโน๏ธ The following integration was created");
- eb.setColor(Color.PINK);
-
- eb.addField("Action Type", String.valueOf(ale.getType()), true);
- eb.addField("Target Type", String.valueOf(ale.getTargetType()), true);
-
- for(Entry changes: ale.getChanges().entrySet()) {
-
- String change = changes.getKey();
- Object oldValue = changes.getValue().getOldValue();
- Object newValue = changes.getValue().getNewValue();
-
- switch(change) {
- case "type":
- eb.addField("Integration Type","โฐโโค"+newValue, false);
- break;
-
- case "name":
- eb.addField("Integration Name", "โฐโโค"+newValue, false);
- break;
-
- default:
- eb.addField(change, "from "+oldValue+" to "+newValue, false);
- }
- }
-
- eb.setFooter("Audit Log Entry ID: "+ale.getId());
- eb.setTimestamp(ale.getTimeCreated());
-
- MessageEmbed mb = eb.build();
-
- Objects.requireNonNull(event.getGuild().getTextChannelById(channelIdToSendTo)).sendMessageEmbeds(mb).queue();
- }
-
- private void formatIntegrationDelete(GuildAuditLogEntryCreateEvent event, AuditLogEntry ale, String channelIdToSendTo) {
-
- EmbedBuilder eb = new EmbedBuilder();
- eb.setTitle("Audit Log Entry | Integration Delete Event");
-
- User executor = ale.getJDA().getUserById(ale.getUserIdLong());
- String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
-
- eb.setDescription("๐ค **By**: "+mentionableExecutor+"\nโน๏ธ The following integration was deleted");
- eb.setColor(Color.RED);
-
- eb.addField("Action Type", String.valueOf(ale.getType()), true);
- eb.addField("Target Type", String.valueOf(ale.getTargetType()), true);
-
- for(Entry changes: ale.getChanges().entrySet()) {
-
- String change = changes.getKey();
- Object oldValue = changes.getValue().getOldValue();
- Object newValue = changes.getValue().getNewValue();
-
- switch(change) {
- case "type":
- eb.addField("โ๏ธ Integration Type", "โฐโโค"+oldValue, false);
- break;
-
- case "name":
- eb.addField("๐ท๏ธ Integration Name", "โฐโโค"+oldValue, false);
- break;
-
- default:
- eb.addField(change, "from "+oldValue+" to "+newValue, false);
- }
- }
-
- eb.setFooter("Audit Log Entry ID: "+ale.getId());
- eb.setTimestamp(ale.getTimeCreated());
-
- MessageEmbed mb = eb.build();
-
- Objects.requireNonNull(event.getGuild().getTextChannelById(channelIdToSendTo)).sendMessageEmbeds(mb).queue();
- }
-
- private void formatChannelCreate(GuildAuditLogEntryCreateEvent event, AuditLogEntry ale, String channelIdToSendTo) {
-
- EmbedBuilder eb = new EmbedBuilder();
- eb.setTitle("Audit Log Entry | Channel Create Event");
-
- User executor = ale.getJDA().getUserById(ale.getUserIdLong());
- GuildChannel targetChannel = ale.getGuild().getGuildChannelById(ale.getTargetId());
-
- String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
- String mentionableTargetChannel = (targetChannel !=null ? targetChannel.getAsMention() : ale.getTargetId());
-
-
- eb.setDescription("๐ค **By**: "+mentionableExecutor+"\nโน๏ธ The following channel was created");
- eb.setColor(Color.GREEN);
-
- eb.addField("Action Type", String.valueOf(ale.getType()), true);
- eb.addField("Target Type", String.valueOf(ale.getTargetType()), true);
-
- for(Entry changes: ale.getChanges().entrySet()) {
-
- String change = changes.getKey();
- Object oldValue = changes.getValue().getOldValue();
- Object newValue = changes.getValue().getNewValue();
-
- switch(change) {
- case "user_limit":
- eb.addField("๐ฅ User Limit", "โฐโโค"+TypeResolver.formatNumberOrUnlimited(newValue), false);
- break;
-
- case "rate_limit_per_user":
- eb.addField("๐ Slowmode", "โฐโโค"+DurationFormatter.formatSeconds(newValue), false);
- break;
-
- case "type":
- eb.addField("๐จ๏ธ Channel Type", "โฐโโค"+TypeResolver.channelTypeResolver(newValue), false);
- break;
-
- case "nsfw":
- eb.addField("๐ NSFW", "โฐโโค"+((Boolean.TRUE.equals(newValue)) ? "โ
" : "โ"), false);
- break;
-
- case "permission_overwrites", "flags":
- break;
-
- case "name":
- eb.addField("๐ท๏ธ Channel Name", "โฐโโค"+newValue, false);
- // provide a channel link next to its name. This mentionable channel can be obtained via the target ID of ALE
- eb.addField("๐ Channel Link", "โฐโโค"+mentionableTargetChannel, true);
- break;
-
- case "bitrate":
- eb.addField("๐๏ธ Voice Channel Bitrate", "โฐโโค"+TypeResolver.voiceChannelBitrateResolver(newValue), false);
- break;
-
- default:
- eb.addField(change, "from "+oldValue+" to "+newValue, false);
- }
- }
-
- eb.setFooter("Audit Log Entry ID: "+ale.getId());
- eb.setTimestamp(ale.getTimeCreated());
-
- MessageEmbed mb = eb.build();
-
- Objects.requireNonNull(event.getGuild().getTextChannelById(channelIdToSendTo)).sendMessageEmbeds(mb).queue();
- }
-
- private void formatChannelUpdate(GuildAuditLogEntryCreateEvent event, AuditLogEntry ale, String channelIdToSendTo) {
-
- EmbedBuilder eb = new EmbedBuilder();
- eb.setTitle("Audit Log Entry | Channel Update Event");
-
- User executor = ale.getJDA().getUserById(ale.getUserIdLong());
- GuildChannel targetChannel = event.getGuild().getGuildChannelById(ale.getTargetId());
-
- String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
- String mentionableTargetChannel = (targetChannel !=null ? targetChannel.getAsMention() : ale.getTargetId());
-
- eb.setDescription("๐ค **By**: "+mentionableExecutor+"\nโน๏ธ The following channel was updated");
- eb.setColor(Color.YELLOW);
-
- eb.addField("Action Type", String.valueOf(ale.getType()), true);
- eb.addField("Target Type", String.valueOf(ale.getTargetType()), true);
- eb.addBlankField(true);
-
- for(Entry changes: ale.getChanges().entrySet()) {
-
- String change = changes.getKey();
- Object oldValue = changes.getValue().getOldValue();
- Object newValue = changes.getValue().getNewValue();
-
- switch(change) {
- case "user_limit":
- eb.addField("๐ฅ Old User Limit", "โฐโโค"+TypeResolver.formatNumberOrUnlimited(oldValue), true);
- eb.addField("๐ฅ New User Limit", "โฐโโค"+TypeResolver.formatNumberOrUnlimited(newValue), true);
- eb.addBlankField(true);
- break;
-
- case "rate_limit_per_user":
- eb.addField("๐ Old Slowmode Value", "โฐโโค"+DurationFormatter.formatSeconds(oldValue), true);
- eb.addField("๐ New Slowmode Value", "โฐโโค"+DurationFormatter.formatSeconds(newValue), true);
- eb.addBlankField(true);
- break;
-
- case "nsfw":
- eb.addField("๐ Old NSFW Settings", "โฐโโค"+((Boolean.TRUE.equals(oldValue)) ? "โ
" : "โ"), true);
- eb.addField("๐ New NSFW Settings", "โฐโโค"+((Boolean.TRUE.equals(newValue)) ? "โ
" : "โ"), true);
- eb.addBlankField(true);
- break;
-
- case "video_quality_mode":
- eb.addField("๐ฅ Old Video Quality Mode", "โฐโโค"+TypeResolver.videoQualityModeResolver(oldValue), true);
- eb.addField("๐ฅ New Video Quality Mode", "โฐโโค"+TypeResolver.videoQualityModeResolver(newValue), true);
- eb.addBlankField(true);
- break;
-
- case "name":
- eb.addField("๐ท๏ธ Old Channel Name", "โฐโโค"+oldValue, true);
- eb.addField("๐ท๏ธ New Channel Name", "โฐโโค"+newValue, true);
- eb.addBlankField(true);
- break;
-
- case "bitrate":
- eb.addField("๐๏ธ Old Voice Channel Bitrate", "โฐโโค"+TypeResolver.voiceChannelBitrateResolver(oldValue), true);
- eb.addField("๐๏ธ New Voice Channel Bitrate", "โฐโโค"+TypeResolver.voiceChannelBitrateResolver(newValue), true);
- eb.addBlankField(true);
- break;
-
- case "rtc_region":
- eb.addField("๐ Old Region", "โฐโโค"+oldValue, true);
- eb.addField("๐ New Region", "โฐโโค"+newValue, true);
- eb.addBlankField(true);
- break;
-
- case "topic":
- eb.addField("๐๏ธ Old Topic", "โฐโโค"+oldValue, true);
- eb.addField("๐๏ธ New topic", "โฐโโค"+newValue, true);
- eb.addBlankField(true);
- break;
-
- case "default_auto_archive_duration":
- eb.addField("๐ Old Hide After Inactivity Timer", "โฐโโค"+DurationFormatter.formatMinutes(oldValue), true);
- eb.addField("๐ New Hide After Inactivity Timer", "โฐโโค"+DurationFormatter.formatMinutes(newValue), true);
- eb.addBlankField(true);
- break;
-
- default:
- eb.addField(change, "from "+oldValue+" to "+newValue, false);
- }
- }
- // mention the channel that got updated, id can be exposed via ALE's TargetID
- eb.addField("๐ฌ Target Channel", "โฐโโค"+mentionableTargetChannel, false);
-
- eb.setFooter("Audit Log Entry ID: "+ale.getId());
- eb.setTimestamp(ale.getTimeCreated());
-
- MessageEmbed mb = eb.build();
-
- Objects.requireNonNull(event.getGuild().getTextChannelById(channelIdToSendTo)).sendMessageEmbeds(mb).queue();
- }
-
- private void formatChannelDelete(GuildAuditLogEntryCreateEvent event, AuditLogEntry ale, String channelIdToSendTo) {
-
- EmbedBuilder eb = new EmbedBuilder();
- eb.setTitle("Audit Log Entry | Channel Delete Event");
-
- User executor = ale.getJDA().getUserById(ale.getUserIdLong());
- GuildChannel targetChannel = ale.getJDA().getGuildChannelById(ale.getTargetIdLong());
-
- String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
- String mentionableTargetChannel = (targetChannel !=null ? targetChannel.getAsMention() : ale.getTargetId()); // this will return only the ID cause the channel with the ID has been deleted
-
- eb.setDescription("๐ค **By**: "+mentionableExecutor+"\nโน๏ธ The following channel was deleted");
- eb.setColor(Color.RED);
-
- eb.addField("Action Type", String.valueOf(ale.getType()), true);
- eb.addField("Target Type", String.valueOf(ale.getTargetType()), true);
-
-
- for(Entry changes: ale.getChanges().entrySet()) {
-
- String change = changes.getKey();
- Object oldValue = changes.getValue().getOldValue();
- Object newValue = changes.getValue().getNewValue();
-
- switch(change) {
- case "name":
- eb.addField("๐ท๏ธ Name", "โฐโโค"+oldValue, false);
- break;
-
- case "type":
- eb.addField("๐จ๏ธ Type", "โฐโโค"+TypeResolver.channelTypeResolver(oldValue), false);
- break;
-
- case "user_limit", "rate_limit_per_user", "nsfw", "permission_overwrites", "video_quality_mode", "flags", "bitrate", "rtc_region":
- break;
-
- default:
- eb.addField(change, "from "+oldValue+" to "+newValue, false);
- }
- }
-
- eb.addField("๐ Deleted Channel ID", "โฐโโค"+mentionableTargetChannel, false);
- eb.setFooter("Audit Log Entry ID: "+ale.getId());
- eb.setTimestamp(ale.getTimeCreated());
-
- MessageEmbed mb = eb.build();
-
- Objects.requireNonNull(event.getGuild().getTextChannelById(channelIdToSendTo)).sendMessageEmbeds(mb).queue();
- }
-
- private void formatChannelOverrideCreate(GuildAuditLogEntryCreateEvent event, AuditLogEntry ale, String channelIdToSendTo) {
-
- EmbedBuilder eb = new EmbedBuilder();
- eb.setTitle("Audit Log Entry | Channel Override Create");
-
- User executor = ale.getJDA().getUserById(ale.getUserIdLong());
- GuildChannel targetChannel = event.getGuild().getGuildChannelById(ale.getTargetId());
-
- String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
- String mentionableTargetChannel = (targetChannel !=null ? targetChannel.getAsMention() : ale.getTargetId());
-
- eb.setDescription("๐ค **By**: "+mentionableExecutor+"\nโน๏ธ The following channel overrides were created");
- eb.setColor(Color.GREEN);
-
- eb.addField("Action Type", String.valueOf(ale.getType()), true);
- eb.addField("Target Type", String.valueOf(ale.getTargetType()), true);
-
-
- for(Entry changes: ale.getChanges().entrySet()) {
-
- String change = changes.getKey();
- Object oldValue = changes.getValue().getOldValue();
- Object newValue = changes.getValue().getNewValue();
-
- switch(change) {
-
- case "type":
- eb.addField("๐งฉ Override Type", "โฐโโค"+TypeResolver.channelOverrideTypeResolver(newValue), false);
- break;
-
- case "deny":
- // the oldValue will return null if a new channel is over-riden for the first time but we're not concerned with oldValue
- // the new value contains the list of denied permissions the moderator sets when creating overrides for the first time
- eb.addField("Denied Permissions", PermissionResolver.getParsedPermissions(newValue, "โ"), false);
- break;
-
- case "allow":
- // the oldValue will return null if a new channel is over-riden for the first time but we're not concerned with oldValue
- // the new value contains the list of allowed permissions the moderator sets when creating overrides for the first time
- eb.addField("Allowed Permissions", PermissionResolver.getParsedPermissions(newValue, "โ
"), false);
- break;
-
- case "id":
- // id exposes the member/role id which for which the channel permissions are over-riden
- // only one member/role permissions can be over-riden at a time
- Member mb = event.getGuild().getMemberById(String.valueOf(newValue));
- Role r = event.getGuild().getRoleById(String.valueOf(newValue));
-
- String mentionableRoleOrMember = "";
- if(mb!=null) {
- mentionableRoleOrMember = mb.getAsMention();
- } else if (r!=null) {
- mentionableRoleOrMember = r.getAsMention();
- }
- eb.addField("๐ญ Target", "โฐโโค"+mentionableRoleOrMember, false);
- break;
-
- default:
- eb.addField(change, "from "+oldValue+" to "+newValue, false);
- }
- }
- // add the target channel whose permissions were over-riden
- // exposed via ALE's TargetID
- eb.addField("๐จ๏ธ Target Channel", "โฐโโค"+mentionableTargetChannel, false);
-
- eb.setFooter("Audit Log Entry ID: "+ale.getId());
- eb.setTimestamp(ale.getTimeCreated());
-
- MessageEmbed mb = eb.build();
-
- Objects.requireNonNull(event.getGuild().getTextChannelById(channelIdToSendTo)).sendMessageEmbeds(mb).queue();
- }
-
- private void formatChannelOverrideUpdate(GuildAuditLogEntryCreateEvent event, AuditLogEntry ale, String channelIdToSendTo) {
-
- EmbedBuilder eb = new EmbedBuilder();
- eb.setTitle("Audit Log Entry | Channel Override Update");
-
- User executor = ale.getJDA().getUserById(ale.getUserIdLong());
- GuildChannel targetChannel = event.getGuild().getGuildChannelById(ale.getTargetId());
-
- String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
- String mentionableTargetChannel = (targetChannel !=null ? targetChannel.getAsMention() : ale.getTargetId());
-
- eb.setDescription("๐ค **By**: "+mentionableExecutor+"\nโน๏ธ The following channel overrides were updated");
- eb.setColor(Color.YELLOW);
-
- eb.addField("Action Type", String.valueOf(ale.getType()), true);
- eb.addField("Target Type", String.valueOf(ale.getTargetType()), true);
-
- // changes does not expose the id and type keys in case of override updates
- String overriddenId = ale.getOptionByName("id");
- String overriddenType = ale.getOptionByName("type");
-
- String mentionableOverrideTarget = overriddenId;
- if ("0".equals(overriddenType)) {
- // Itโs a role
- Role role = event.getGuild().getRoleById(Objects.requireNonNull(overriddenId));
- if (role != null) {
- mentionableOverrideTarget = role.getAsMention();
- }
- } else if ("1".equals(overriddenType)) {
- // Itโs a member
- Member member = event.getGuild().getMemberById(Objects.requireNonNull(overriddenId));
- if (member != null) {
- mentionableOverrideTarget = member.getAsMention();
- }
- }
-
- eb.addField("๐ญ Permissions Overridden For", "โฐโโค"+mentionableOverrideTarget, false);
-
- for(Entry changes: ale.getChanges().entrySet()) {
-
- String change = changes.getKey();
- Object oldValue = changes.getValue().getOldValue();
- Object newValue = changes.getValue().getNewValue();
-
- switch(change) {
-
- case "deny":
- String deniedPerms = PermissionResolver.getParsedPermissions(newValue, "โ");
- // if a channel is synchronized with it's category, the permission list will be blank and the StringBuilder will return a blank string
- eb.addField("Denied Permissions", (deniedPerms.isBlank() ? "Permissions Synced With Category" : deniedPerms), false);
- break;
-
- case "allow":
- String allowedPerms = PermissionResolver.getParsedPermissions(newValue, "โ
");
- // if a channel is synchronized with it's category, the permission list will be blank and the StringBuilder will return a blank string
- eb.addField("Allowed Permissions", (allowedPerms.isBlank() ? "Permissions Synced With Category" : allowedPerms), false);
- break;
-
- default:
- eb.addField(change, "from "+oldValue+" to "+newValue, false);
- }
- }
-
- // add the target channel whose permissions were over-riden
- // can be retrieved via ALE's TargetID
- eb.addField("๐จ๏ธ Target Channel", "โฐโโค"+mentionableTargetChannel, false);
-
- eb.setFooter("Audit Log Entry ID: "+ale.getId());
- eb.setTimestamp(ale.getTimeCreated());
-
- MessageEmbed mb = eb.build();
-
- Objects.requireNonNull(event.getGuild().getTextChannelById(channelIdToSendTo)).sendMessageEmbeds(mb).queue();
- }
-
- private void formatChannelOverrideDelete(GuildAuditLogEntryCreateEvent event, AuditLogEntry ale, String channelIdToSendTo) {
-
- EmbedBuilder eb = new EmbedBuilder();
- eb.setTitle("Audit Log Entry | Channel Override Delete");
-
- User executor = ale.getJDA().getUserById(ale.getUserIdLong());
- GuildChannel targetChannel = event.getGuild().getGuildChannelById(ale.getTargetId());
-
- String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
- String mentionableTargetChannel = (targetChannel !=null ? targetChannel.getAsMention() : ale.getTargetId());
-
- eb.setDescription("๐ค **By**: "+mentionableExecutor+"\nโน๏ธ The following channel overrides were deleted");
- eb.setColor(Color.RED);
-
- eb.addField("Action Type", String.valueOf(ale.getType()), true);
- eb.addField("Target Type", String.valueOf(ale.getTargetType()), true);
-
-
- for(Entry changes: ale.getChanges().entrySet()) {
-
- String change = changes.getKey();
- Object oldValue = changes.getValue().getOldValue();
- Object newValue = changes.getValue().getNewValue();
-
- switch(change) {
-
- case "type":
- eb.addField("๐งฉ Override Type", "โฐโโค"+TypeResolver.channelOverrideTypeResolver(oldValue), false);
- break;
-
- case "deny":
- // the newValue will return null if an over-ride is deleted but we're not concerned with newValue
- // the oldValue returns the permissions the channel was previously denied
- eb.addField("Previously Denied Permissions", PermissionResolver.getParsedPermissions(oldValue, "โ"), false);
- break;
-
- case "allow":
- // the newValue will return null if an over-ride is deleted but we're not concerned with newValue
- // the oldValue returns the permissions the channel was previously allowed
- eb.addField("Previously Allowed Permissions", PermissionResolver.getParsedPermissions(oldValue, "โ
"), false);
- break;
-
- case "id":
- // id exposes the member/role id which for which the channel permissions are over-riden
- Member mb = event.getGuild().getMemberById(String.valueOf(oldValue));
- Role r = event.getGuild().getRoleById(String.valueOf(oldValue));
-
- String mentionableRoleOrMember = "";
- if(mb!=null) {
- mentionableRoleOrMember = mb.getAsMention();
- } else if (r!=null) {
- mentionableRoleOrMember = r.getAsMention();
- }
- eb.addField("๐ญ Deleted Target", "โฐโโค"+mentionableRoleOrMember, false);
- break;
-
- default:
- eb.addField(change, "from "+oldValue+" to "+newValue, false);
- }
- }
- // add the target channel whose permissions were over-riden
- // can be retrieved via ALE's TargetID
- eb.addField("๐จ๏ธ Target Channel", "โฐโโค"+mentionableTargetChannel, false);
-
- eb.setFooter("Audit Log Entry ID: "+ale.getId());
- eb.setTimestamp(ale.getTimeCreated());
-
- MessageEmbed mb = eb.build();
-
- Objects.requireNonNull(event.getGuild().getTextChannelById(channelIdToSendTo)).sendMessageEmbeds(mb).queue();
- }
-
- private void formatAutoModRuleCreate(GuildAuditLogEntryCreateEvent event, AuditLogEntry ale, String channelIdToSendTo) {
-
- 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("๐ค **By**: "+mentionableExecutor+"\nโน๏ธ The following AutoMod rule was created");
- eb.setColor(Color.GREEN);
-
- eb.addField("Action Type", String.valueOf(ale.getType()), true);
- eb.addField("Target Type", String.valueOf(ale.getTargetType()), true);
-
- for(Entry changes: ale.getChanges().entrySet()) {
-
- String change = changes.getKey();
- Object oldValue = changes.getValue().getOldValue();
- Object newValue = changes.getValue().getNewValue();
-
- switch(change) {
-
- case "exempt_roles":
- String roleIds = String.valueOf(newValue);
- String cleanedRoleIds = StringUtils.strip(roleIds, "[]");
- String[] roleIdList = StringUtils.split(cleanedRoleIds, ",");
- StringBuilder mentionableRoles = new StringBuilder();
- for(String roleId : roleIdList) {
- Role r = ale.getGuild().getRoleById(roleId.strip());
- mentionableRoles.append(r!=null ? r.getAsMention() : roleId.strip()).append(", ");
- }
- eb.addField("โ๏ธ Exempt Roles: ", "โฐโโค"+ mentionableRoles, false);
- break;
-
- case "enabled":
- eb.addField("โ Enabled", "โฐโโค"+((Boolean.TRUE.equals(newValue)) ? "โ
" : "โ"), false);
- break;
-
- case "trigger_type":
- eb.addField("โก Trigger Type", "โฐโโค"+TypeResolver.automodTriggerTypeResolver(newValue), false);
- break;
-
- case "actions":
- eb.addField("โก Actions", "โฐโโค"+newValue, false);
- break;
-
- case "exempt_channels":
- String channelIds = String.valueOf(newValue);
- String cleanedChannelIds = StringUtils.strip(channelIds, "[]");
- String[] channelIdList = StringUtils.split(cleanedChannelIds, ",");
- StringBuilder mentionableChannels = new StringBuilder();
- for(String channelId : channelIdList) {
- GuildChannel r = ale.getGuild().getGuildChannelById(channelId.strip());
- mentionableChannels.append(r!=null ? r.getAsMention() : channelId.strip()).append(", ");
- }
- eb.addField("โ๏ธ Exempt Channels: ", "โฐโโค"+ mentionableChannels, false);
- break;
-
- case "event_type":
- eb.addField("๐งญ Event Type", "โฐโโค"+TypeResolver.automodEventTypeResolver(newValue), false);
- break;
-
- case "trigger_metadata":
- eb.addField("๐ Trigger Metadata", "โฐโโค"+newValue, false);
- break;
-
- case "name":
- eb.addField("๐ท๏ธ AutoMod Rule Name ", "โฐโโค"+newValue, false);
- break;
-
- default:
- eb.addField(change, "from "+oldValue+" to "+newValue, false);
- }
- }
-
- eb.setFooter("Audit Log Entry ID: "+ale.getId());
- eb.setTimestamp(ale.getTimeCreated());
-
- MessageEmbed mb = eb.build();
-
- Objects.requireNonNull(event.getGuild().getTextChannelById(channelIdToSendTo)).sendMessageEmbeds(mb).queue();
- }
-
- private void formatAutoModRuleDelete(GuildAuditLogEntryCreateEvent event, AuditLogEntry ale, String channelIdToSendTo) {
-
- 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("๐ค **By**: "+mentionableExecutor+"\nโน๏ธ The following AutoMod rule was deleted");
- eb.setColor(Color.RED);
-
- eb.addField("Action Type", String.valueOf(ale.getType()), true);
- eb.addField("Target Type", String.valueOf(ale.getTargetType()), true);
-
- for(Entry changes: ale.getChanges().entrySet()) {
-
- String change = changes.getKey();
- Object oldValue = changes.getValue().getOldValue();
- Object newValue = changes.getValue().getNewValue();
-
- switch(change) {
-
- case "exempt_roles", "enabled", "trigger_type", "actions", "exempt_channels", "event_type", "trigger_metadata":
- break;
-
- case "name":
- eb.addField("๐ท๏ธ AutoMod Rule Name ", "โฐโโค"+oldValue, false);
- break;
-
- default:
- eb.addField(change, "from "+oldValue+" to "+newValue, false);
- }
- }
-
- eb.setFooter("Audit Log Entry ID: "+ale.getId());
- eb.setTimestamp(ale.getTimeCreated());
-
- MessageEmbed mb = eb.build();
-
- Objects.requireNonNull(event.getGuild().getTextChannelById(channelIdToSendTo)).sendMessageEmbeds(mb).queue();
- }
-
- private void formatAutoModRuleUpdate(GuildAuditLogEntryCreateEvent event, AuditLogEntry ale, String channelIdToSendTo) {
-
- 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("๐ค **By**: "+mentionableExecutor+"\nโน๏ธ The following AutoMod rule was updated");
- eb.setColor(Color.YELLOW);
-
- eb.addField("Action Type", String.valueOf(ale.getType()), true);
- eb.addField("Target Type", String.valueOf(ale.getTargetType()), true);
-
- for(Entry changes: ale.getChanges().entrySet()) {
-
- String change = changes.getKey();
- Object oldValue = changes.getValue().getOldValue();
- Object newValue = changes.getValue().getNewValue();
-
- switch(change) {
-
- case "exempt_roles":
- String roleIds = String.valueOf(newValue);
- String cleanedRoleIds = StringUtils.strip(roleIds, "[]");
- String[] roleIdList = StringUtils.split(cleanedRoleIds, ",");
- StringBuilder mentionableRoles = new StringBuilder();
- for(String roleId : roleIdList) {
- Role r = ale.getGuild().getRoleById(roleId.strip());
- mentionableRoles.append(r!=null ? r.getAsMention() : roleId.strip()).append(", ");
- }
- eb.addField("โ๏ธ New Exempt Roles: ", "โฐโโค"+ mentionableRoles, false);
- break;
-
-
- case "actions":
- eb.addField("โก New Actions", "โฐโโค"+newValue, false);
- break;
-
- case "exempt_channels":
- String channelIds = String.valueOf(newValue);
- String cleanedChannelIds = StringUtils.strip(channelIds, "[]");
- String[] channelIdList = StringUtils.split(cleanedChannelIds, ",");
- StringBuilder mentionableChannels = new StringBuilder();
- for(String channelId : channelIdList) {
- GuildChannel r = ale.getGuild().getGuildChannelById(channelId.strip());
- mentionableChannels.append(r!=null ? r.getAsMention() : channelId.strip()).append(", ");
- }
- eb.addField("โ๏ธ New Exempt Channels: ", "โฐโโค"+ mentionableChannels, false);
- break;
-
-
- case "trigger_metadata":
- eb.addField("๐ New Trigger Metadata", "โฐโโค"+newValue, false);
- break;
-
- default:
- eb.addField(change, "from "+oldValue+" to "+newValue, false);
- }
- }
-
- // add name of the rule which got updated
- AutoModRule rule = ale.getGuild().retrieveAutoModRuleById(ale.getTargetId()).complete();
- eb.addField("๐ท๏ธ AutoMod Rule Name ", "โฐโโค"+rule.getName(), false);
-
- eb.setFooter("Audit Log Entry ID: "+ale.getId());
- eb.setTimestamp(ale.getTimeCreated());
-
- MessageEmbed mb = eb.build();
-
- Objects.requireNonNull(event.getGuild().getTextChannelById(channelIdToSendTo)).sendMessageEmbeds(mb).queue();
- }
-
- private void formatEmojiCreate(GuildAuditLogEntryCreateEvent event, AuditLogEntry ale, String channelIdToSendTo) {
- EmbedBuilder eb = new EmbedBuilder();
- eb.setTitle("Audit Log Entry | Emoji Create Event");
-
- User executor = ale.getJDA().getUserById(ale.getUserIdLong());
- String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
-
- eb.setDescription("๐ค **By**: "+mentionableExecutor+"\nโน๏ธ The following emoji was created");
- eb.setColor(Color.GREEN);
-
- eb.addField("Action Type", String.valueOf(ale.getType()), true);
- eb.addField("Target Type", String.valueOf(ale.getTargetType()), true);
-
- for(Entry changes: ale.getChanges().entrySet()) {
-
- String change = changes.getKey();
- Object oldValue = changes.getValue().getOldValue();
- Object newValue = changes.getValue().getNewValue();
-
- switch(change) {
-
- case "name":
- eb.addField("๐ท๏ธ Emoji Name", "โฐโโค"+newValue, false);
- eb.addField("โน๏ธ Emoji", "โฐโโค"+"<:"+newValue+":"+ale.getTargetId()+">", false); // ale's TargetID retrieves the ID of the created emoji
- break;
-
- default:
- eb.addField(change, "from "+oldValue+" to "+newValue, false);
- }
- }
-
-
- eb.setFooter("Audit Log Entry ID: "+ale.getId());
- eb.setTimestamp(ale.getTimeCreated());
-
- MessageEmbed mb = eb.build();
-
- Objects.requireNonNull(event.getGuild().getTextChannelById(channelIdToSendTo)).sendMessageEmbeds(mb).queue();
- }
-
- private void formatEmojiUpdate(GuildAuditLogEntryCreateEvent event, AuditLogEntry ale, String channelIdToSendTo) {
- EmbedBuilder eb = new EmbedBuilder();
- eb.setTitle("Audit Log Entry | Emoji Update Event");
-
- User executor = ale.getJDA().getUserById(ale.getUserIdLong());
- String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
-
- eb.setDescription("๐ค **By**: "+mentionableExecutor+"\nโน๏ธ The following emoji was updated");
- eb.setColor(Color.YELLOW);
-
- eb.addField("Action Type", String.valueOf(ale.getType()), true);
- eb.addField("Target Type", String.valueOf(ale.getTargetType()), true);
-
- for(Entry changes: ale.getChanges().entrySet()) {
-
- String change = changes.getKey();
- Object oldValue = changes.getValue().getOldValue();
- Object newValue = changes.getValue().getNewValue();
-
- switch(change) {
-
- case "name":
- eb.addField("๐ท๏ธ Emoji Name Updated", "โฐโโค"+"From "+oldValue+" to "+newValue, false);
- eb.addField("โน๏ธ Target Emoji", "โฐโโค"+"<:"+newValue+":"+ale.getTargetId()+">", false);
- break;
-
- default:
- eb.addField(change, "from "+oldValue+" to "+newValue, false);
- }
- }
-
- eb.setFooter("Audit Log Entry ID: "+ale.getId());
- eb.setTimestamp(ale.getTimeCreated());
-
- MessageEmbed mb = eb.build();
-
- Objects.requireNonNull(event.getGuild().getTextChannelById(channelIdToSendTo)).sendMessageEmbeds(mb).queue();
- }
-
- private void formatEmojiDelete(GuildAuditLogEntryCreateEvent event, AuditLogEntry ale, String channelIdToSendTo) {
- EmbedBuilder eb = new EmbedBuilder();
- eb.setTitle("Audit Log Entry | Emoji Delete Event");
-
- User executor = ale.getJDA().getUserById(ale.getUserIdLong());
- String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
-
- eb.setDescription("๐ค **By**: "+mentionableExecutor+"\nโน๏ธ The following emoji was deleted");
- eb.setColor(Color.RED);
-
- eb.addField("Action Type", String.valueOf(ale.getType()), true);
- eb.addField("Target Type", String.valueOf(ale.getTargetType()), true);
-
- for(Entry changes: ale.getChanges().entrySet()) {
-
- String change = changes.getKey();
- Object oldValue = changes.getValue().getOldValue();
- Object newValue = changes.getValue().getNewValue();
-
- switch(change) {
-
- case "name":
- eb.addField("โป๏ธ Deleted Emoji", "โฐโโค "+":"+oldValue+":", false);
- break;
-
- default:
- eb.addField(change, "from "+oldValue+" to "+newValue, false);
- }
- }
-
- eb.addField("โป๏ธ Deleted Emoji ID", "โฐโโค"+ale.getTargetId(), false);
- eb.setFooter("Audit Log Entry ID: "+ale.getId());
- eb.setTimestamp(ale.getTimeCreated());
-
- MessageEmbed mb = eb.build();
-
- Objects.requireNonNull(event.getGuild().getTextChannelById(channelIdToSendTo)).sendMessageEmbeds(mb).queue();
- }
-
- private void formatStickerCreate(GuildAuditLogEntryCreateEvent event, AuditLogEntry ale, String channelIdToSendTo) {
- EmbedBuilder eb = new EmbedBuilder();
- eb.setTitle("Audit Log Entry | Sticker Create Event");
-
- User executor = ale.getJDA().getUserById(ale.getUserIdLong());
- String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
-
- eb.setDescription("๐ค **By**: "+mentionableExecutor+"\nโน๏ธ The following sticker was created");
- eb.setColor(Color.GREEN);
-
- eb.addField("Action Type", String.valueOf(ale.getType()), true);
- eb.addField("Target Type", String.valueOf(ale.getTargetType()), true);
-
- for(Entry changes: ale.getChanges().entrySet()) {
-
- String change = changes.getKey();
- Object oldValue = changes.getValue().getOldValue();
- Object newValue = changes.getValue().getNewValue();
-
- switch(change) {
-
- case "format_type", "type", "asset", "available", "guild_id":
- break;
-
- case "id":
- eb.addField("๐ Sticker ID", "โฐโโค"+newValue, false);
- GuildSticker sticker = event.getGuild().getStickerById(String.valueOf(newValue));
- eb.addField("๐ Sticker Link", "โฐโโค"+(sticker!=null ? sticker.getIconUrl() : "N/A"), false);
- break;
-
- case "tags":
- eb.addField("โน๏ธ Related Emoji", "โฐโโค"+newValue, false);
- break;
-
- case "description":
- eb.addField("๐ Description", "โฐโโค"+newValue, false);
- break;
-
- case "name":
- eb.addField("๐ท๏ธ Sticker Name", "โฐโโค"+newValue, false);
- break;
-
- default:
- eb.addField(change, "from "+oldValue+" to "+newValue, false);
- }
- }
-
- eb.setFooter("Audit Log Entry ID: "+ale.getId());
- eb.setTimestamp(ale.getTimeCreated());
-
- MessageEmbed mb = eb.build();
-
- Objects.requireNonNull(event.getGuild().getTextChannelById(channelIdToSendTo)).sendMessageEmbeds(mb).queue();
- }
-
- private void formatStickerDelete(GuildAuditLogEntryCreateEvent event, AuditLogEntry ale, String channelIdToSendTo) {
- EmbedBuilder eb = new EmbedBuilder();
- eb.setTitle("Audit Log Entry | Sticker Delete Event");
-
- User executor = ale.getJDA().getUserById(ale.getUserIdLong());
- String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
-
- eb.setDescription("๐ค **By**: "+mentionableExecutor+"\nโน๏ธ The following sticker was deleted");
- eb.setColor(Color.RED);
-
- eb.addField("Action Type", String.valueOf(ale.getType()), true);
- eb.addField("Target Type", String.valueOf(ale.getTargetType()), true);
-
- for(Entry changes: ale.getChanges().entrySet()) {
-
- String change = changes.getKey();
- Object oldValue = changes.getValue().getOldValue();
- Object newValue = changes.getValue().getNewValue();
-
- switch(change) {
-
- case "format_type", "type", "asset", "available", "guild_id":
- break;
-
- case "id":
- eb.addField("๐ Sticker ID", "โฐโโค"+oldValue, false);
- break;
-
- case "tags":
- eb.addField("โน๏ธ Related Emoji", "โฐโโค"+oldValue, false);
- break;
-
- case "description":
- eb.addField("๐ Description", "โฐโโค"+oldValue, false);
- break;
-
- case "name":
- eb.addField("๐ท๏ธ Sticker Name", "โฐโโค"+oldValue, false);
- break;
-
- default:
- eb.addField(change, "from "+oldValue+" to "+newValue, false);
- }
- }
-
- eb.setFooter("Audit Log Entry ID: "+ale.getId());
- eb.setTimestamp(ale.getTimeCreated());
-
- MessageEmbed mb = eb.build();
-
- Objects.requireNonNull(event.getGuild().getTextChannelById(channelIdToSendTo)).sendMessageEmbeds(mb).queue();
- }
-
- private void formatStickerUpdate(GuildAuditLogEntryCreateEvent event, AuditLogEntry ale, String channelIdToSendTo) {
- EmbedBuilder eb = new EmbedBuilder();
- eb.setTitle("Audit Log Entry | Sticker Update Event");
-
- User executor = ale.getJDA().getUserById(ale.getUserIdLong());
- String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
-
- GuildSticker targetSticker = event.getGuild().getStickerById(ale.getTargetId());
-
- eb.setDescription("๐ค **By**: "+mentionableExecutor+"\nโน๏ธ The following sticker was updated");
- eb.setColor(Color.YELLOW);
-
- eb.addField("Action Type", String.valueOf(ale.getType()), true);
- eb.addField("Target Type", String.valueOf(ale.getTargetType()), true);
-
- eb.addField("๐ท๏ธ Target Sticker Name", Objects.requireNonNull(targetSticker).getName(), false);
- eb.addField("๐ Target Sticker Url", targetSticker.getIconUrl(), false);
-
- for(Entry changes: ale.getChanges().entrySet()) {
-
- String change = changes.getKey();
- Object oldValue = changes.getValue().getOldValue();
- Object newValue = changes.getValue().getNewValue();
-
- switch(change) {
-
- case "format_type", "type", "asset", "available", "guild_id", "id":
- break;
-
- case "tags":
- eb.addField("โน๏ธ Related Emoji", "โฐโโค"+"from "+oldValue+" to "+newValue, false);
- break;
-
- case "description":
- eb.addField("๐ Description", "โฐโโค"+"from `"+oldValue+"` to `"+newValue+"`", false);
- break;
-
- case "name":
- eb.addField("๐ท๏ธ Sticker Name", "โฐโโค"+"from `"+oldValue+"` to `"+newValue+"`", false);
- break;
-
- default:
- eb.addField(change, "from "+oldValue+" to "+newValue, false);
- }
- }
-
- eb.setFooter("Audit Log Entry ID: "+ale.getId());
- eb.setTimestamp(ale.getTimeCreated());
-
- MessageEmbed mb = eb.build();
-
- Objects.requireNonNull(event.getGuild().getTextChannelById(channelIdToSendTo)).sendMessageEmbeds(mb).queue();
- }
-
- private void formatGuildUpdate(GuildAuditLogEntryCreateEvent event, AuditLogEntry ale, String channelIdToSendTo) {
- EmbedBuilder eb = new EmbedBuilder();
- eb.setTitle("Audit Log Entry | Guild Update Event");
-
- User executor = ale.getJDA().getUserById(ale.getUserIdLong());
- String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
-
- eb.setDescription("๐ค **By**: "+mentionableExecutor+"\nโน๏ธ The following guild updates were recorded");
- eb.setColor(Color.MAGENTA);
-
- eb.addField("Action Type", String.valueOf(ale.getType()), true);
- eb.addField("Target Type", String.valueOf(ale.getTargetType()), true);
-
- for(Entry changes: ale.getChanges().entrySet()) {
-
- String change = changes.getKey();
- Object oldValue = changes.getValue().getOldValue();
- Object newValue = changes.getValue().getNewValue();
-
- switch(change) {
-
- case "description":
- eb.addField("Description Change", "from `"+oldValue+"` to `"+newValue+"`", false);
- break;
-
- case "icon_hash":
- eb.addField("Icon Hash Change", "from `"+oldValue+"` to `"+newValue+"`", false);
- break;
-
- case "name":
- eb.addField("Guild Name Change", "from `"+oldValue+"` to `"+newValue+"`", false);
- break;
-
- case "afk_channel_id":
- eb.addField("AFK Channel Changed To", "`"+newValue+"`", false);
- break;
-
- case "default_message_notifications":
- eb.addField("Default Message Notifications Update", "`"+newValue+"`", false);
- break;
-
- case "afk_timeout":
- eb.addField("AFK Channel Timeout Change", "`"+newValue+"s`", false);
- break;
-
- case "system_channel_id":
- eb.addField("Community Updates Channel Changed To", "`"+newValue+"`", false);
- break;
-
- case "widget_enabled":
- eb.addField("Widget Enabled", "`"+newValue+"`", false);
- break;
-
- case "widget_channel_id":
- eb.addField("Widget Channel Changed To", "`"+newValue+"`", false);
- break;
-
- case "premium_progress_bar_enabled":
- eb.addField("Server Boost Progress Bar Enabled", "`"+newValue+"`", false);
- break;
-
- case "mfa_level":
- eb.addField("MFA Requirement", "`"+newValue+"`", false);
- break;
-
- case "verification_level":
- eb.addField("Verification Level", "`"+TypeResolver.guildVerificationLevelResolver(newValue)+"`", false);
- break;
-
- case "owner_id":
- User oldOwner = ale.getJDA().getUserById(String.valueOf(oldValue));
- User newOwner = ale.getJDA().getUserById(String.valueOf(newValue));
- String mentionableOldOwner = (oldOwner!=null ? oldOwner.getAsMention() : String.valueOf(oldValue));
- String mentionableNewOwner = (newOwner!=null ? newOwner.getAsMention() : String.valueOf(newValue));
- eb.addField("Ownership Change", "from "+mentionableOldOwner+" to "+mentionableNewOwner, false);
- break;
-
- case "public_updates_channel_id":
- eb.addField("Announcements Channel Changed To", "`"+newValue+"`", false);
- break;
-
- case "rules_channel_id":
- eb.addField("Rules Channel Changed To", "`"+newValue+"`", false);
- break;
-
-
- case "system_channel_flags":
- eb.addField("System Channel Flags", GuildSystemChannelFlagResolver.getParsedFlags(newValue), false);
- break;
-
- case "explicit_content_filter":
- eb.addField("Explicit Content Filter", TypeResolver.explicitFilterTypeResolver(newValue), false);
- break;
-
- default:
- eb.addField(change, "from "+oldValue+" to "+newValue, false);
- }
- }
-
- eb.setFooter("Audit Log Entry ID: "+ale.getId());
- eb.setTimestamp(ale.getTimeCreated());
-
- MessageEmbed mb = eb.build();
-
- Objects.requireNonNull(event.getGuild().getTextChannelById(channelIdToSendTo)).sendMessageEmbeds(mb).queue();
- }
-
- private void formatMemberRoleUpdate(GuildAuditLogEntryCreateEvent event, AuditLogEntry ale, String channelIdToSendTo) {
- EmbedBuilder eb = new EmbedBuilder();
- eb.setTitle("Audit Log Entry | Member Role Update");
-
- User executor = ale.getJDA().getUserById(ale.getUserIdLong());
- User target = ale.getJDA().getUserById(ale.getTargetIdLong());
-
- String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
- String mentionableTarget = (target !=null ? target.getAsMention() : ale.getTargetId());
-
- eb.setDescription("๐ค **By**: "+mentionableExecutor+"\nโน๏ธ The following member role was updated");
- eb.setThumbnail(Objects.requireNonNull(event.getGuild().getMemberById(ale.getTargetIdLong())).getEffectiveAvatarUrl());
- eb.setColor(Color.CYAN);
-
- eb.addField("Action Type", String.valueOf(ale.getType()), true);
- eb.addField("Target Type", String.valueOf(ale.getTargetType()), true);
-
- for(Entry changes: ale.getChanges().entrySet()) {
-
- String change = changes.getKey();
- Object oldValue = changes.getValue().getOldValue();
- Object newValue = changes.getValue().getNewValue();
-
- switch(change) {
-
- case "$add":
- eb.setColor(Color.GREEN);
- eb.addField("Target Member", "โฐโโค"+mentionableTarget, false);
- Map addedRoleNameAndId = MemberRoleUpdateParser.parseRoleUpdate(newValue);
- eb.addField("Role Added", "โ
"+addedRoleNameAndId.getOrDefault("name", "`ERROR: Not Found`"), false);
- eb.addField("Added Role ID", "โฐโโค"+addedRoleNameAndId.getOrDefault("id", "`ERROR: Not Found`"), false);
- break;
-
- case "$remove":
- eb.setColor(Color.RED);
- eb.addField("Target Member", "โฐโโค"+mentionableTarget, false);
- Map removedRoleNameAndId = MemberRoleUpdateParser.parseRoleUpdate(newValue);
- eb.addField("Role Removed", "โ "+removedRoleNameAndId.getOrDefault("name", "`ERROR: Not Found`"), false);
- eb.addField("Removed Role ID", "โฐโโค"+removedRoleNameAndId.getOrDefault("id", "`ERROR: Not Found`"), false);
- break;
-
- default:
- eb.addField(change, "from "+oldValue+" to "+newValue, false);
- }
- }
-
- eb.setFooter("Audit Log Entry ID: "+ale.getId());
- eb.setTimestamp(ale.getTimeCreated());
-
- MessageEmbed mb = eb.build();
-
- Objects.requireNonNull(event.getGuild().getTextChannelById(channelIdToSendTo)).sendMessageEmbeds(mb).queue();
- }
-
- private void formatRoleCreate(GuildAuditLogEntryCreateEvent event, AuditLogEntry ale, String channelIdToSendTo) {
- EmbedBuilder eb = new EmbedBuilder();
- eb.setTitle("Audit Log Entry | Role Create Event");
-
- User executor = ale.getJDA().getUserById(ale.getUserId());
- Role targetRole = ale.getJDA().getRoleById(ale.getTargetId());
-
- String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
- String mentionableTargetRole = (targetRole !=null ? targetRole.getAsMention() : ale.getTargetId());
-
- eb.setDescription("๐ค **By**: "+mentionableExecutor+"\n The following role was created");
- eb.setColor(Color.GREEN);
-
- eb.addField("Action Type", String.valueOf(ale.getType()), true);
- eb.addField("Target Type", String.valueOf(ale.getTargetType()), true);
-
- eb.addField("Target Role", mentionableTargetRole, false);
- for(Entry changes: ale.getChanges().entrySet()) {
-
- String change = changes.getKey();
- Object oldValue = changes.getValue().getOldValue();
- Object newValue = changes.getValue().getNewValue();
-
- switch(change) {
-
- case "name":
- eb.addField("๐ท๏ธ Role Name", "โฐโโค"+newValue, false);
- break;
-
- /*
- * 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
- */
- case "colors", "hoist", "color", "permissions", "mentionable":
- break;
-
- default:
- eb.addField(change, "from "+oldValue+" to "+newValue, false);
- }
- }
-
- eb.setFooter("Audit Log Entry ID: "+ale.getId());
- eb.setTimestamp(ale.getTimeCreated());
-
- MessageEmbed mb = eb.build();
-
- Objects.requireNonNull(event.getGuild().getTextChannelById(channelIdToSendTo)).sendMessageEmbeds(mb).queue();
- }
-
- private void formatRoleUpdate(GuildAuditLogEntryCreateEvent event, AuditLogEntry ale, String channelIdToSendTo) {
- EmbedBuilder eb = new EmbedBuilder();
- eb.setTitle("Audit Log Entry | Role Update Event");
-
- User executor = ale.getJDA().getUserById(ale.getUserId());
- Role targetRole = ale.getJDA().getRoleById(ale.getTargetId());
-
- String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
- String mentionableTargetRole = (targetRole !=null ? targetRole.getAsMention() : ale.getTargetId());
-
- eb.setDescription("๐ค **By**: "+mentionableExecutor+"\nโน๏ธ The following member role was updated");
- eb.setColor(Color.YELLOW);
-
- eb.addField("Action Type", String.valueOf(ale.getType()), true);
- eb.addField("Target Type", String.valueOf(ale.getTargetType()), true);
-
- eb.addField("Target Role", mentionableTargetRole, false);
-
- for(Entry changes: ale.getChanges().entrySet()) {
-
- String change = changes.getKey();
- Object oldValue = changes.getValue().getOldValue();
- Object newValue = changes.getValue().getNewValue();
-
- switch(change) {
-
- case "name":
- eb.addField("๐ท๏ธ Old Role Name", "โฐโโค"+oldValue, true);
- eb.addField("๐ท๏ธ New Role Name", "โฐโโค"+newValue, true);
- eb.addBlankField(true);
- break;
-
- case "hoist":
- eb.addField("๐ Old Display Seperately", "โฐโโค"+((Boolean.TRUE.equals(oldValue)) ? "โ
" : "โ"), true);
- eb.addField("๐ New Display Seperately", "โฐโโค"+((Boolean.TRUE.equals(newValue)) ? "โ
" : "โ"), true);
- eb.addBlankField(true);
- break;
-
- case "color":
- eb.addField("๐จ Old Color", "โฐโโค"+ColorFormatter.formatToHex(oldValue), true);
- eb.addField("๐จ New Color", "โฐโโค"+ColorFormatter.formatToHex(newValue), true);
- eb.addBlankField(true);
- break;
-
- case "permissions":
- eb.addField("Old Role Permissions", PermissionResolver.getParsedPermissions(oldValue, "โ
"), true);
- eb.addField("New Role Permissions", PermissionResolver.getParsedPermissions(newValue, "โ
"), true);
- eb.addBlankField(true);
- break;
-
- case "mentionable":
- eb.addField("๐ Old Mentionable", "โฐโโค"+((Boolean.TRUE.equals(oldValue)) ? "โ
" : "โ"), true);
- eb.addField("๐ New Mentionable", "โฐโโค"+((Boolean.TRUE.equals(newValue)) ? "โ
" : "โ"), true);
- eb.addBlankField(true);
- break;
-
- case "colors":
- eb.addField("๐ Old Gradient Color System", "โฐโโค"+ColorFormatter.formatGradientColorSystemToHex(oldValue), true);
- eb.addField("๐ New Gradient Color System", "โฐโโค"+ColorFormatter.formatGradientColorSystemToHex(newValue), true);
- eb.addBlankField(true);
- break;
- default:
- eb.addField(change, "from "+oldValue+" to "+newValue, false);
- }
- }
-
- eb.setFooter("Audit Log Entry ID: "+ale.getId());
- eb.setTimestamp(ale.getTimeCreated());
-
- MessageEmbed mb = eb.build();
-
- Objects.requireNonNull(event.getGuild().getTextChannelById(channelIdToSendTo)).sendMessageEmbeds(mb).queue();
- }
-
- private void formatRoleDelete(GuildAuditLogEntryCreateEvent event, AuditLogEntry ale, String channelIdToSendTo) {
- EmbedBuilder eb = new EmbedBuilder();
- eb.setTitle("Audit Log Entry | Role Delete Event");
-
- User executor = ale.getJDA().getUserById(ale.getUserId());
- Role targetRole = ale.getJDA().getRoleById(ale.getTargetId());
-
- String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
- String mentionableTargetRole = (targetRole !=null ? targetRole.getAsMention() : ale.getTargetId()); // this will always return the ID only
-
- eb.setDescription("๐ค **By**: "+mentionableExecutor+"\nโน๏ธ The following role was deleted");
- eb.setColor(Color.RED);
-
- eb.addField("Action Type", String.valueOf(ale.getType()), true);
- eb.addField("Target Type", String.valueOf(ale.getTargetType()), true);
-
- for(Entry changes: ale.getChanges().entrySet()) {
-
- String change = changes.getKey();
- Object oldValue = changes.getValue().getOldValue();
- Object newValue = changes.getValue().getNewValue();
-
- switch(change) {
-
- case "name":
- eb.addField("๐ท๏ธ Role Name", "โฐโโค"+oldValue, false);
- break;
-
- case "hoist":
- eb.addField("๐ Display Seperately", "โฐโโค"+((Boolean.TRUE.equals(oldValue)) ? "โ
" : "โ"), false);
- break;
-
- case "color":
- eb.addField("๐จ Color", "โฐโโค"+ColorFormatter.formatToHex(oldValue), false);
- break;
-
- case "permissions":
- eb.addField("Role Permissions", PermissionResolver.getParsedPermissions(oldValue, "โ
"), false);
- break;
-
- case "mentionable":
- eb.addField("๐ Mentionable", "โฐโโค"+((Boolean.TRUE.equals(oldValue)) ? "โ
" : "โ"), false);
- break;
-
- case "colors":
- eb.addField("๐ Gradient Color System", "โฐโโค"+ColorFormatter.formatGradientColorSystemToHex(oldValue), false);
- break;
- default:
- eb.addField(change, "from "+oldValue+" to "+newValue, false);
- }
- }
-
- eb.addField("๐ Deleted Role ID", "โฐโโค"+mentionableTargetRole, false);
- eb.setFooter("Audit Log Entry ID: "+ale.getId());
- eb.setTimestamp(ale.getTimeCreated());
-
- MessageEmbed mb = eb.build();
-
- Objects.requireNonNull(event.getGuild().getTextChannelById(channelIdToSendTo)).sendMessageEmbeds(mb).queue();
- }
-
- // the audit log does not expose much information regarding member vc move and kick events
- // therefore GuildVoiceListener has been created to know about channels the target has been moved or kicked from
- private void formatMemberVoiceKick(GuildAuditLogEntryCreateEvent event, AuditLogEntry ale, String channelIdToSendTo) {
- EmbedBuilder eb = new EmbedBuilder();
- eb.setTitle("Audit Log Entry | Member Voice Kick Event");
-
- User executor = ale.getJDA().getUserById(ale.getUserId());
- String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
-
- eb.setDescription("๐ค **By**: "+mentionableExecutor+"\nโน๏ธ A voice kick event was detected");
- eb.setColor(Color.RED);
-
- eb.addField("Action Type", String.valueOf(ale.getType()), true);
- eb.addField("Target Type", String.valueOf(ale.getTargetType()), true);
-
- eb.setFooter("Audit Log Entry ID: "+ale.getId());
- eb.setTimestamp(ale.getTimeCreated());
-
- MessageEmbed mb = eb.build();
- Objects.requireNonNull(event.getGuild().getTextChannelById(channelIdToSendTo)).sendMessageEmbeds(mb).queue();
- }
-
- private void formatMemberVoiceMove(GuildAuditLogEntryCreateEvent event, AuditLogEntry ale, String channelIdToSendTo) {
- EmbedBuilder eb = new EmbedBuilder();
- eb.setTitle("Audit Log Entry | Member Voice Move Event");
-
- User executor = ale.getJDA().getUserById(ale.getUserId());
- String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
-
- eb.setDescription("๐ค **By**: "+mentionableExecutor+"\nโน๏ธ A voice move event was detected");
- eb.setColor(Color.YELLOW);
-
- eb.addField("Action Type", String.valueOf(ale.getType()), true);
- eb.addField("Target Type", String.valueOf(ale.getTargetType()), true);
-
- eb.setFooter("Audit Log Entry ID: "+ale.getId());
- eb.setTimestamp(ale.getTimeCreated());
-
- MessageEmbed mb = eb.build();
- Objects.requireNonNull(event.getGuild().getTextChannelById(channelIdToSendTo)).sendMessageEmbeds(mb).queue();
- }
-
- private void formatVoiceChannelStatusUpdate(GuildAuditLogEntryCreateEvent event, AuditLogEntry ale, String channelIdToSendTo) {
- EmbedBuilder eb = new EmbedBuilder();
- eb.setTitle("Audit Log Entry | Voice Channel Status Update");
-
- 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());
-
- eb.setDescription("๐ค **By**: "+mentionableExecutor+"\nโน๏ธ The following voice channel's status was updated: "+mentionableTargetChannel);
- eb.setColor(Color.YELLOW);
-
- eb.addField("Action Type", String.valueOf(ale.getType()), true);
- eb.addField("Target Type", String.valueOf(ale.getTargetType()), true);
-
- eb.setFooter("Audit Log Entry ID: "+ale.getId());
- eb.setTimestamp(ale.getTimeCreated());
-
- MessageEmbed mb = eb.build();
- Objects.requireNonNull(event.getGuild().getTextChannelById(channelIdToSendTo)).sendMessageEmbeds(mb).queue();
- }
-
- private void formatVoiceChannelStatusDelete(GuildAuditLogEntryCreateEvent event, AuditLogEntry ale, String channelIdToSendTo) {
- EmbedBuilder eb = new EmbedBuilder();
- eb.setTitle("Audit Log Entry | Voice Channel Status Delete");
-
- 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());
-
- eb.setDescription("๐ค **By**: "+mentionableExecutor+"\nโน๏ธ The following voice channel's status was deleted: "+mentionableTargetChannel);
- eb.setColor(Color.ORANGE);
-
- eb.addField("Action Type", String.valueOf(ale.getType()), true);
- eb.addField("Target Type", String.valueOf(ale.getTargetType()), true);
-
- eb.setFooter("Audit Log Entry ID: "+ale.getId());
- eb.setTimestamp(ale.getTimeCreated());
-
- MessageEmbed mb = eb.build();
- Objects.requireNonNull(event.getGuild().getTextChannelById(channelIdToSendTo)).sendMessageEmbeds(mb).queue();
- }
-
- private void formatAutoModFlagToChannel(GuildAuditLogEntryCreateEvent event, AuditLogEntry ale, String channelIdToSendTo) {
- EmbedBuilder eb = new EmbedBuilder();
- eb.setTitle("Audit Log Entry | Automod Event");
-
- User targetUser = ale.getJDA().getUserById(ale.getTargetId());
- String mentionableTargetUser = (targetUser != null ? targetUser.getAsMention() : ale.getTargetId());
-
- eb.setDescription("๐ Automod has flagged a message sent by: "+mentionableTargetUser);
- eb.setColor(Color.YELLOW);
-
- eb.addField("Action Type", String.valueOf(ale.getType()), true);
- eb.addField("Target Type", String.valueOf(ale.getTargetType()), true);
-
- eb.setFooter("Audit Log Entry ID: "+ale.getId());
- eb.setTimestamp(ale.getTimeCreated());
-
- MessageEmbed mb = eb.build();
- Objects.requireNonNull(event.getGuild().getTextChannelById(channelIdToSendTo)).sendMessageEmbeds(mb).queue();
- }
-
- private void formatAutoModMemberTimeout (GuildAuditLogEntryCreateEvent event, AuditLogEntry ale, String channelIdToSendTo) {
- EmbedBuilder eb = new EmbedBuilder();
- eb.setTitle("Audit Log Entry | Automod Event");
-
- User targetUser = ale.getJDA().getUserById(ale.getTargetId());
- String mentionableTargetUser = (targetUser != null ? targetUser.getAsMention() : ale.getTargetId());
-
- eb.setDescription("๐ Automod has timed out"+mentionableTargetUser+" for a defined rule violation");
- eb.setColor(Color.MAGENTA);
-
- eb.addField("Action Type", String.valueOf(ale.getType()), true);
- eb.addField("Target Type", String.valueOf(ale.getTargetType()), true);
-
- eb.setFooter("Audit Log Entry ID: "+ale.getId());
- eb.setTimestamp(ale.getTimeCreated());
-
- MessageEmbed mb = eb.build();
- Objects.requireNonNull(event.getGuild().getTextChannelById(channelIdToSendTo)).sendMessageEmbeds(mb).queue();
- }
-
- private void formatAutoModRuleBlockMessage (GuildAuditLogEntryCreateEvent event, AuditLogEntry ale, String channelIdToSendTo) {
- EmbedBuilder eb = new EmbedBuilder();
- eb.setTitle("Audit Log Entry | Automod Event");
-
- User targetUser = ale.getJDA().getUserById(ale.getTargetId());
- String mentionableTargetUser = (targetUser != null ? targetUser.getAsMention() : ale.getTargetId());
-
- eb.setDescription("๐ Automod has deleted a message sent by: "+mentionableTargetUser);
- eb.setColor(Color.ORANGE);
-
- eb.addField("Action Type", String.valueOf(ale.getType()), true);
- eb.addField("Target Type", String.valueOf(ale.getTargetType()), true);
-
- eb.setFooter("Audit Log Entry ID: "+ale.getId());
- eb.setTimestamp(ale.getTimeCreated());
-
- MessageEmbed mb = eb.build();
- Objects.requireNonNull(event.getGuild().getTextChannelById(channelIdToSendTo)).sendMessageEmbeds(mb).queue();
- }
-
- private void formatMessagePin(GuildAuditLogEntryCreateEvent event, AuditLogEntry ale, String channelIdToSendTo) {
- EmbedBuilder eb = new EmbedBuilder();
- eb.setTitle("Audit Log Entry | Message Pin Event");
-
- User executor = ale.getJDA().getUserById(ale.getTargetId());
- String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getTargetId());
-
- eb.setDescription("๐ค **A message from **: "+mentionableExecutor+" was pinned");
- eb.setColor(Color.PINK);
-
- eb.addField("Action Type", String.valueOf(ale.getType()), true);
- eb.addField("Target Type", String.valueOf(ale.getTargetType()), true);
-
- eb.setFooter("Audit Log Entry ID: "+ale.getId());
- eb.setTimestamp(ale.getTimeCreated());
-
- MessageEmbed mb = eb.build();
- Objects.requireNonNull(event.getGuild().getTextChannelById(channelIdToSendTo)).sendMessageEmbeds(mb).queue();
- }
- // these audit log events don't expose anything other than the executor of the event
- private void formatMessageUnpin(GuildAuditLogEntryCreateEvent event, AuditLogEntry ale, String channelIdToSendTo) {
- EmbedBuilder eb = new EmbedBuilder();
- eb.setTitle("Audit Log Entry | Message Unpin Event");
-
- User executor = ale.getJDA().getUserById(ale.getTargetId());
- String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getTargetId());
-
- eb.setDescription("๐ค **A message from **: "+mentionableExecutor+" un-pinned");
- eb.setColor(Color.MAGENTA);
-
- eb.addField("Action Type", String.valueOf(ale.getType()), true);
- eb.addField("Target Type", String.valueOf(ale.getTargetType()), true);
-
- eb.setFooter("Audit Log Entry ID: "+ale.getId());
- eb.setTimestamp(ale.getTimeCreated());
-
- MessageEmbed mb = eb.build();
- Objects.requireNonNull(event.getGuild().getTextChannelById(channelIdToSendTo)).sendMessageEmbeds(mb).queue();
- }
-
- private void formatStageInstanceCreate(GuildAuditLogEntryCreateEvent event, AuditLogEntry ale, String channelIdToSendTo) {
-
- EmbedBuilder eb = new EmbedBuilder();
- eb.setTitle("Audit Log Entry | Stage Instance Create Event");
-
- User executor = ale.getJDA().getUserById(ale.getUserIdLong());
- String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
-
- eb.setDescription("๐ค **By**: "+mentionableExecutor+"\nโน๏ธ A stage instance was created");
- eb.setColor(Color.GREEN);
- eb.addField("Action Type", String.valueOf(ale.getType()), true);
- eb.addField("Target Type", String.valueOf(ale.getTargetType()), true);
-
- for(Entry changes: ale.getChanges().entrySet()) {
- String change = changes.getKey();
- Object oldValue = changes.getValue().getOldValue();
- Object newValue = changes.getValue().getNewValue();
-
- switch(change) {
- case "topic":
- eb.addField("๐ Stage Topic", "โฐโโค"+newValue, false);
- break;
-
- case "privacy_level":
- eb.addField("๐ Stage Privacy", "โฐโโค"+newValue, false);
- eb.addField("Stage Privacy Result Inference", "-# A value of 1 means PUBLIC (deprecated) and 2 means GUILD_ONLY", false);
- break;
-
- default:
- eb.addField(change, "from "+oldValue+" to "+newValue, false);
- }
-
- }
-
- eb.setFooter("Audit Log Entry ID: "+ale.getId());
- eb.setTimestamp(ale.getTimeCreated());
-
- MessageEmbed mb = eb.build();
- Objects.requireNonNull(event.getGuild().getTextChannelById(channelIdToSendTo)).sendMessageEmbeds(mb).queue();
- }
-
- private void formatStageInstanceUpdate(GuildAuditLogEntryCreateEvent event, AuditLogEntry ale, String channelIdToSendTo) {
-
- EmbedBuilder eb = new EmbedBuilder();
- eb.setTitle("Audit Log Entry | Stage Instance Update Event");
-
- User executor = ale.getJDA().getUserById(ale.getUserIdLong());
- String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
-
- eb.setDescription("๐ค **By**: "+mentionableExecutor+"\nโน๏ธ A stage instance was updated");
- eb.setColor(Color.YELLOW);
- eb.addField("Action Type", String.valueOf(ale.getType()), true);
- eb.addField("Target Type", String.valueOf(ale.getTargetType()), true);
-
- for(Entry changes: ale.getChanges().entrySet()) {
- String change = changes.getKey();
- Object oldValue = changes.getValue().getOldValue();
- Object newValue = changes.getValue().getNewValue();
-
- switch(change) {
- case "topic":
- eb.addField("๐ OldStage Topic", "โฐโโค"+oldValue, false);
- eb.addField("๐ New Stage Topic", "โฐโโค"+newValue, false);
- break;
-
- case "privacy_level":
- eb.addField("๐ Old Stage Privacy","โฐโโค"+oldValue, false);
- eb.addField("๐ New Stage Privacy", "โฐโโค"+newValue, false);
- eb.addField("Stage Privacy Result Inference", "-# A value of 1 means PUBLIC (deprecated) and 2 means GUILD_ONLY", false);
- break;
-
- default:
- eb.addField(change, "from "+oldValue+" to "+newValue, false);
- }
-
- }
-
- eb.setFooter("Audit Log Entry ID: "+ale.getId());
- eb.setTimestamp(ale.getTimeCreated());
-
- MessageEmbed mb = eb.build();
- Objects.requireNonNull(event.getGuild().getTextChannelById(channelIdToSendTo)).sendMessageEmbeds(mb).queue();
- }
-
- private void formatStageInstanceDelete(GuildAuditLogEntryCreateEvent event, AuditLogEntry ale, String channelIdToSendTo) {
-
- EmbedBuilder eb = new EmbedBuilder();
- eb.setTitle("Audit Log Entry | Stage Instance Delete Event");
-
- User executor = ale.getJDA().getUserById(ale.getUserIdLong());
- String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
-
- eb.setDescription("๐ค **By**: "+mentionableExecutor+"\nโน๏ธ A stage instance was deleted");
- eb.setColor(Color.RED);
- eb.addField("Action Type", String.valueOf(ale.getType()), true);
- eb.addField("Target Type", String.valueOf(ale.getTargetType()), true);
-
- for(Entry changes: ale.getChanges().entrySet()) {
- String change = changes.getKey();
- Object oldValue = changes.getValue().getOldValue();
- Object newValue = changes.getValue().getNewValue();
-
- switch(change) {
- case "topic":
- eb.addField("๐ Deleted Stage Topic", "โฐโโค"+oldValue, false);
- break;
-
- case "privacy_level":
- eb.addField("๐ Deleted Stage Privacy", "โฐโโค"+oldValue, false);
- eb.addField("Stage Privacy Result Inference", "-# A value of 1 means PUBLIC (deprecated) and 2 means GUILD_ONLY", false);
- break;
-
- default:
- eb.addField(change, "from "+oldValue+" to "+newValue, false);
- }
-
- }
-
- eb.setFooter("Audit Log Entry ID: "+ale.getId());
- eb.setTimestamp(ale.getTimeCreated());
-
- MessageEmbed mb = eb.build();
- Objects.requireNonNull(event.getGuild().getTextChannelById(channelIdToSendTo)).sendMessageEmbeds(mb).queue();
- }
-
- private void formatScheduledEventCreate(GuildAuditLogEntryCreateEvent event, AuditLogEntry ale, String channelIdToSendTo) {
-
- EmbedBuilder eb = new EmbedBuilder();
- eb.setTitle("Audit Log Entry | Scheduled Event Create Event");
-
- User executor = ale.getJDA().getUserById(ale.getUserIdLong());
- String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
-
- eb.setDescription("๐ค **By**: "+mentionableExecutor+"\nโน๏ธ A scheduled event was created");
- eb.setColor(Color.GREEN);
- eb.addField("Action Type", String.valueOf(ale.getType()), true);
- eb.addField("Target Type", String.valueOf(ale.getTargetType()), true);
-
- for(Entry changes: ale.getChanges().entrySet()) {
- String change = changes.getKey();
- Object oldValue = changes.getValue().getOldValue();
- Object newValue = changes.getValue().getNewValue();
-
- switch(change) {
- case "entity_type":
- eb.addField("๐ Event Type", "โฐโโค"+TypeResolver.scheduleEventTypeResolver(newValue), false);
- break;
-
- case "privacy_level", "image_hash":
- break;
-
- case "description":
- eb.addField("๐ Event Description", "โฐโโค"+newValue, false);
- break;
-
- case "status":
- eb.addField("๐ Event Status", "โฐโโค"+TypeResolver.scheduleEventStatusTypeResolver(newValue), false);
- break;
-
- case "location":
- eb.addField("๐ Event Location", "โฐโโค"+newValue, false);
- break;
-
- case "name":
- eb.addField("๐ท๏ธ Event Name", "โฐโโค"+newValue, false);
- break;
-
- case "channel_id":
- GuildChannel eventChannel = event.getGuild().getGuildChannelById(String.valueOf(newValue));
- eb.addField("๐ฌ Event Channel", "โฐโโค"+(eventChannel!=null ? eventChannel.getAsMention() : String.valueOf(newValue)), false);
- break;
-
- default:
- eb.addField(change, "from "+oldValue+" to "+newValue, false);
- }
-
- }
-
- eb.setFooter("Audit Log Entry ID: "+ale.getId());
- eb.setTimestamp(ale.getTimeCreated());
-
- MessageEmbed mb = eb.build();
- Objects.requireNonNull(event.getGuild().getTextChannelById(channelIdToSendTo)).sendMessageEmbeds(mb).queue();
- }
-
- private void formatScheduledEventUpdate(GuildAuditLogEntryCreateEvent event, AuditLogEntry ale, String channelIdToSendTo) {
-
- EmbedBuilder eb = new EmbedBuilder();
- eb.setTitle("Audit Log Entry | Scheduled Event Update Event");
-
- User executor = ale.getJDA().getUserById(ale.getUserIdLong());
- String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
-
- ScheduledEvent targetEvent = event.getGuild().getScheduledEventById(ale.getTargetId());
- eb.setDescription("๐ค **By**: "+mentionableExecutor+"\nโน๏ธ The following scheduled event was updated: "+ Objects.requireNonNull(targetEvent).getName());
- eb.setColor(Color.YELLOW);
- eb.addField("Action Type", String.valueOf(ale.getType()), true);
- eb.addField("Target Type", String.valueOf(ale.getTargetType()), true);
-
- for(Entry changes: ale.getChanges().entrySet()) {
- String change = changes.getKey();
- Object oldValue = changes.getValue().getOldValue();
- Object newValue = changes.getValue().getNewValue();
-
- switch(change) {
- case "entity_type":
- eb.addField("๐ Old Event Type", "โฐโโค"+TypeResolver.scheduleEventTypeResolver(oldValue), false);
- eb.addField("๐ New Event Type", "โฐโโค"+TypeResolver.scheduleEventTypeResolver(newValue), false);
- break;
-
- case "privacy_level", "image_hash":
- break;
-
- case "description":
- eb.addField("๐ Old Event Description", "โฐโโค"+oldValue, false);
- eb.addField("๐ New Event Description", "โฐโโค"+newValue, false);
- break;
-
- case "status":
- eb.addField("๐ Old Event Status", "โฐโโค"+TypeResolver.scheduleEventStatusTypeResolver(oldValue), false);
- eb.addField("๐ New Event Status", "โฐโโค"+TypeResolver.scheduleEventStatusTypeResolver(newValue), false);
- break;
-
- case "location":
- eb.addField("๐ Event Location", "โฐโโค"+oldValue, false);
- eb.addField("๐ Event Location", "โฐโโค"+newValue, false);
- break;
-
- case "name":
- eb.addField("๐ท๏ธ Old Event Name", "โฐโโค"+oldValue, false);
- eb.addField("๐ท๏ธ New Event Name","โฐโโค"+newValue, false);
- break;
-
- case "channel_id":
- GuildChannel eventChannel = event.getGuild().getGuildChannelById(String.valueOf(oldValue));
- eb.addField("๐ฌ Old Event Channel", "โฐโโค"+(eventChannel!=null ? eventChannel.getAsMention() : String.valueOf(oldValue)), false);
- eventChannel = event.getGuild().getGuildChannelById(String.valueOf(newValue));
- eb.addField("๐ฌ New Event Channel", "โฐโโค"+(eventChannel!=null ? eventChannel.getAsMention() : String.valueOf(newValue)), false);
- break;
-
- default:
- eb.addField(change, "from "+oldValue+" to "+newValue, false);
- }
-
- }
-
- eb.setFooter("Audit Log Entry ID: "+ale.getId());
- eb.setTimestamp(ale.getTimeCreated());
-
- MessageEmbed mb = eb.build();
- Objects.requireNonNull(event.getGuild().getTextChannelById(channelIdToSendTo)).sendMessageEmbeds(mb).queue();
- }
-
- private void formatScheduledEventDelete(GuildAuditLogEntryCreateEvent event, AuditLogEntry ale, String channelIdToSendTo) {
-
- EmbedBuilder eb = new EmbedBuilder();
- eb.setTitle("Audit Log Entry | Scheduled Event Delete Event");
-
- User executor = ale.getJDA().getUserById(ale.getUserIdLong());
- String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
-
- eb.setDescription("๐ค **By**: "+mentionableExecutor+"\nโน๏ธ A scheduled event has been deleted");
- eb.setColor(Color.RED);
- eb.addField("Action Type", String.valueOf(ale.getType()), true);
- eb.addField("Target Type", String.valueOf(ale.getTargetType()), true);
-
- for(Entry changes: ale.getChanges().entrySet()) {
- String change = changes.getKey();
- Object oldValue = changes.getValue().getOldValue();
- Object newValue = changes.getValue().getNewValue();
-
- switch(change) {
- case "entity_type":
- eb.addField("๐ Event Type", "โฐโโค"+TypeResolver.scheduleEventTypeResolver(oldValue), false);
- break;
-
- case "privacy_level", "image_hash":
- break;
-
- case "description":
- eb.addField("๐ Event Description", "โฐโโค"+newValue, false);
- break;
-
- case "status":
- eb.addField("๐ Event Status", "โฐโโค"+TypeResolver.scheduleEventStatusTypeResolver(oldValue), false);
- break;
-
- case "location":
- eb.addField("๐ Event Location", "โฐโโค"+oldValue, false);
- break;
-
- case "name":
- eb.addField("๐ท๏ธ Event Name", "โฐโโค"+oldValue, false);
- break;
-
- case "channel_id":
- GuildChannel eventChannel = event.getGuild().getGuildChannelById(String.valueOf(oldValue));
- eb.addField("๐ฌ Event Channel", "โฐโโค"+(eventChannel!=null ? eventChannel.getAsMention() : String.valueOf(oldValue)), false);
- break;
-
- default:
- eb.addField(change, "from "+oldValue+" to "+newValue, false);
- }
-
- }
-
- eb.setFooter("Audit Log Entry ID: "+ale.getId());
- eb.setTimestamp(ale.getTimeCreated());
-
- MessageEmbed mb = eb.build();
- Objects.requireNonNull(event.getGuild().getTextChannelById(channelIdToSendTo)).sendMessageEmbeds(mb).queue();
- }
-
- private void formatThreadCreate(GuildAuditLogEntryCreateEvent event, AuditLogEntry ale, String channelIdToSendTo) {
-
- EmbedBuilder eb = new EmbedBuilder();
- eb.setTitle("Audit Log Entry | Thread Create Event");
-
- 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());
-
- eb.setDescription("๐ค **By**: "+mentionableExecutor+"\nโน๏ธ A thread has been created");
- eb.setColor(Color.GREEN);
- eb.addField("Action Type", String.valueOf(ale.getType()), true);
- eb.addField("Target Type", String.valueOf(ale.getTargetType()), true);
-
- for(Entry changes: ale.getChanges().entrySet()) {
- String change = changes.getKey();
- Object oldValue = changes.getValue().getOldValue();
- Object newValue = changes.getValue().getNewValue();
-
- switch(change) {
- case "locked":
- eb.addField("๐ Locked", "โฐโโค"+((Boolean.TRUE.equals(newValue)) ? "โ
" : "โ"), false);
- break;
-
- case "auto_archive_duration":
- eb.addField("๐ Auto Archive Duration", "โฐโโค"+DurationFormatter.formatMinutes(newValue), false);
- break;
-
- case "rate_limit_per_user":
- eb.addField("๐ Slowmode Limit", "โฐโโค"+DurationFormatter.formatSeconds(newValue), false);
- break;
-
- case "type":
- eb.addField("๐ Thread Type", "โฐโโค"+TypeResolver.channelTypeResolver(newValue), false);
- break;
-
- case "archived":
- eb.addField("๐๏ธ Archived", "โฐโโค"+((Boolean.TRUE.equals(newValue)) ? "โ
" : "โ"), false);
- break;
-
- case "flags":
- eb.addField("๐ฉ Flags", "โฐโโค"+newValue, false);
- break;
-
- case "name":
- eb.addField("๐ท๏ธ Thread Name", "โฐโโค"+newValue, false);
- break;
-
- default:
- eb.addField(change, "from "+oldValue+" to "+newValue, false);
- }
-
- }
- eb.addField("๐งต Target Thread", "โฐโโค"+mentionableTargetThread, false);
- eb.setFooter("Audit Log Entry ID: "+ale.getId());
- eb.setTimestamp(ale.getTimeCreated());
-
- MessageEmbed mb = eb.build();
- Objects.requireNonNull(event.getGuild().getTextChannelById(channelIdToSendTo)).sendMessageEmbeds(mb).queue();
- }
-
- private void formatThreadUpdate(GuildAuditLogEntryCreateEvent event, AuditLogEntry ale, String channelIdToSendTo) {
-
- EmbedBuilder eb = new EmbedBuilder();
- eb.setTitle("Audit Log Entry | Thread Update Event");
-
- 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());
-
- eb.setDescription("๐ค **By**: "+mentionableExecutor+"\nโน๏ธ A thread has been updated");
- eb.setColor(Color.YELLOW);
- eb.addField("Action Type", String.valueOf(ale.getType()), true);
- eb.addField("Target Type", String.valueOf(ale.getTargetType()), true);
- eb.addBlankField(true);
-
- for(Entry changes: ale.getChanges().entrySet()) {
- String change = changes.getKey();
- Object oldValue = changes.getValue().getOldValue();
- Object newValue = changes.getValue().getNewValue();
-
- switch(change) {
- case "locked":
- eb.addField("๐ Old Lock Status", "โฐโโค"+((Boolean.TRUE.equals(oldValue)) ? "โ
" : "โ"), true);
- eb.addField("๐ New Lock Status", "โฐโโค"+((Boolean.TRUE.equals(newValue)) ? "โ
" : "โ"), true);
- eb.addBlankField(true);
- break;
-
- case "auto_archive_duration":
- eb.addField("๐ Old Auto Archive Duration", "โฐโโค"+DurationFormatter.formatMinutes(oldValue), true);
- eb.addField("๐ New Auto Archive Duration", "โฐโโค"+DurationFormatter.formatMinutes(newValue), true);
- eb.addBlankField(true);
- break;
-
- case "rate_limit_per_user":
- eb.addField("๐ Old Slowmode Limit", "โฐโโค"+DurationFormatter.formatSeconds(oldValue), true);
- eb.addField("๐ New Slowmode Limit", "โฐโโค"+DurationFormatter.formatSeconds(newValue), true);
- eb.addBlankField(true);
- break;
-
- case "type":
- eb.addField("๐ Old Thread Type", "โฐโโค"+TypeResolver.channelTypeResolver(oldValue), true);
- eb.addField("๐ New Thread Type", "โฐโโค"+TypeResolver.channelTypeResolver(newValue), true);
- eb.addBlankField(true);
- break;
-
- case "archived":
- eb.addField("๐๏ธ Old Archive Status", "โฐโโค"+((Boolean.TRUE.equals(oldValue)) ? "โ
" : "โ"), true);
- eb.addField("๐๏ธ New Archive Status", "โฐโโค"+((Boolean.TRUE.equals(newValue)) ? "โ
" : "โ"), true);
- eb.addBlankField(true);
- break;
-
- case "flags":
- eb.addField("๐ฉ Old Flag Value", "โฐโโค"+oldValue, true);
- eb.addField("๐ฉ New Flag Value", "โฐโโค"+newValue, true);
- eb.addBlankField(true);
- break;
-
- case "name":
- eb.addField("๐ท๏ธ Old Thread Name", "โฐโโค"+oldValue, true);
- eb.addField("๐ท๏ธ New Thread Name", "โฐโโค"+newValue, true);
- eb.addBlankField(true);
- break;
-
- default:
- eb.addField(change, "from "+oldValue+" to "+newValue, false);
- }
-
- }
- eb.addField("๐งต Target Thread", "โฐโโค"+mentionableTargetThread, false);
- eb.setFooter("Audit Log Entry ID: "+ale.getId());
- eb.setTimestamp(ale.getTimeCreated());
-
- MessageEmbed mb = eb.build();
- Objects.requireNonNull(event.getGuild().getTextChannelById(channelIdToSendTo)).sendMessageEmbeds(mb).queue();
- }
-
- private void formatThreadDelete(GuildAuditLogEntryCreateEvent event, AuditLogEntry ale, String channelIdToSendTo) {
-
- EmbedBuilder eb = new EmbedBuilder();
- eb.setTitle("Audit Log Entry | Thread Delete Event");
-
- User executor = ale.getJDA().getUserById(ale.getUserIdLong());
- String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
-
- eb.setDescription("๐ค **By**: "+mentionableExecutor+"\nโน๏ธ A thread has been deleted");
- eb.setColor(Color.RED);
- eb.addField("Action Type", String.valueOf(ale.getType()), true);
- eb.addField("Target Type", String.valueOf(ale.getTargetType()), true);
-
- for(Entry changes: ale.getChanges().entrySet()) {
- String change = changes.getKey();
- Object oldValue = changes.getValue().getOldValue();
- Object newValue = changes.getValue().getNewValue();
-
- switch(change) {
- case "๐ locked":
- eb.addField("Locked", "โฐโโค"+((Boolean.TRUE.equals(oldValue)) ? "โ
" : "โ"), false);
- break;
-
- case "๐ auto_archive_duration":
- eb.addField("Auto Archive Duration", "โฐโโค"+DurationFormatter.formatMinutes(oldValue), false);
- break;
-
- case "rate_limit_per_user":
- eb.addField("๐ Slowmode Limit", "โฐโโค"+DurationFormatter.formatSeconds(oldValue), false);
- break;
-
- case "type":
- eb.addField("๐ Thread Type", "โฐโโค"+TypeResolver.channelTypeResolver(oldValue), false);
- break;
-
- case "archived":
- eb.addField("๐๏ธ Archived", "โฐโโค"+((Boolean.TRUE.equals(oldValue)) ? "โ
" : "โ"), false);
- break;
-
- case "flags":
- eb.addField("๐ฉ Flags", "โฐโโค"+oldValue, false);
- break;
-
- case "name":
- eb.addField("๐ท๏ธ Thread Name", "โฐโโค"+oldValue, false);
- break;
-
- default:
- eb.addField(change, "from "+oldValue+" to "+newValue, false);
- }
-
- }
- eb.setFooter("Audit Log Entry ID: "+ale.getId());
- eb.setTimestamp(ale.getTimeCreated());
-
- MessageEmbed mb = eb.build();
- Objects.requireNonNull(event.getGuild().getTextChannelById(channelIdToSendTo)).sendMessageEmbeds(mb).queue();
- }
-
- private void formatWebhookCreate(GuildAuditLogEntryCreateEvent event, AuditLogEntry ale, String channelIdToSendTo) {
-
- EmbedBuilder eb = new EmbedBuilder();
- eb.setTitle("Audit Log Entry | Webhook Create Event");
-
- User executor = ale.getJDA().getUserById(ale.getUserIdLong());
- String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
-
- eb.setDescription("๐ค **By**: "+mentionableExecutor+"\nโน๏ธ A webhook has been created");
- eb.setColor(Color.GREEN);
- eb.addField("Action Type", String.valueOf(ale.getType()), true);
- eb.addField("Target Type", String.valueOf(ale.getTargetType()), true);
-
- for(Entry changes: ale.getChanges().entrySet()) {
- String change = changes.getKey();
- Object oldValue = changes.getValue().getOldValue();
- Object newValue = changes.getValue().getNewValue();
-
- switch(change) {
- case "type":
- eb.addField("Webhook Type", "โฐโโค"+newValue, false);
- eb.addField("Webhook Type Explanation", "-# 0 for PING; 1 for Event", false);
- break;
-
- case "avatar_Hash":
- eb.addField("Avatar Hash", "โฐโโค"+newValue, false);
- break;
-
- case "channel_id":
- GuildChannel targetChannel = event.getGuild().getGuildChannelById(String.valueOf(newValue));
- String mentionableTargetChannel = (targetChannel !=null ? targetChannel.getAsMention() : String.valueOf(newValue));
- eb.addField("Channel", "โฐโโค"+mentionableTargetChannel, false);
- break;
-
- case "name":
- eb.addField("Webhook Name", "โฐโโค"+newValue, false);
- break;
-
-
- default:
- eb.addField(change, "from "+oldValue+" to "+newValue, false);
- }
-
- }
- eb.setFooter("Audit Log Entry ID: "+ale.getId());
- eb.setTimestamp(ale.getTimeCreated());
-
- MessageEmbed mb = eb.build();
- Objects.requireNonNull(event.getGuild().getTextChannelById(channelIdToSendTo)).sendMessageEmbeds(mb).queue();
- }
-
- private void formatWebhookUpdate(GuildAuditLogEntryCreateEvent event, AuditLogEntry ale, String channelIdToSendTo) {
-
- EmbedBuilder eb = new EmbedBuilder();
- eb.setTitle("Audit Log Entry | Webhook Update Event");
-
- User executor = ale.getJDA().getUserById(ale.getUserIdLong());
- String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
-
- eb.setDescription("๐ค **By**: "+mentionableExecutor+"\nโน๏ธ A webhook has been updated");
- eb.setColor(Color.YELLOW);
- eb.addField("Action Type", String.valueOf(ale.getType()), true);
- eb.addField("Target Type", String.valueOf(ale.getTargetType()), true);
-
- for(Entry changes: ale.getChanges().entrySet()) {
- String change = changes.getKey();
- Object oldValue = changes.getValue().getOldValue();
- Object newValue = changes.getValue().getNewValue();
-
- switch(change) {
- case "type":
- eb.addField("๐ก Webhook Type", "โฐโโค " + newValue, false);
- eb.addField("Webhook Type Legend", "-# 0 for PING; 1 for Event", false);
- break;
-
- case "avatar_hash":
- eb.addField("๐ผ๏ธ Avatar Hash", "โฐโโค"+"from `"+oldValue+"` to `"+newValue+"`", false);
- break;
-
- case "channel_id":
- GuildChannel targetChannel = event.getGuild().getGuildChannelById(String.valueOf(newValue));
- String mentionableTargetChannel = (targetChannel !=null ? targetChannel.getAsMention() : String.valueOf(newValue));
- eb.addField("๐ฌ New Channel", "โฐโโค"+mentionableTargetChannel, false);
- break;
-
- case "name":
- eb.addField("๐ท๏ธ Webhook Name", "โฐโโค"+"from "+oldValue+" to "+newValue, false);
- break;
-
-
- default:
- eb.addField(change, "from "+oldValue+" to "+newValue, false);
- }
-
- }
- eb.setFooter("Audit Log Entry ID: "+ale.getId());
- eb.setTimestamp(ale.getTimeCreated());
-
- MessageEmbed mb = eb.build();
- Objects.requireNonNull(event.getGuild().getTextChannelById(channelIdToSendTo)).sendMessageEmbeds(mb).queue();
- }
-
- private void formatWebhookRemove(GuildAuditLogEntryCreateEvent event, AuditLogEntry ale, String channelIdToSendTo) {
-
- EmbedBuilder eb = new EmbedBuilder();
- eb.setTitle("Audit Log Entry | Webhook Remove Event");
-
- User executor = ale.getJDA().getUserById(ale.getUserIdLong());
- String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getUserId());
-
- eb.setDescription("๐ค **By**: "+mentionableExecutor+"\nโน๏ธ A webhook has been removed");
- eb.setColor(Color.RED);
- eb.addField("Action Type", String.valueOf(ale.getType()), true);
- eb.addField("Target Type", String.valueOf(ale.getTargetType()), true);
-
- for(Entry changes: ale.getChanges().entrySet()) {
- String change = changes.getKey();
- Object oldValue = changes.getValue().getOldValue();
- Object newValue = changes.getValue().getNewValue();
-
- switch(change) {
- case "type":
- eb.addField("๐ก Webhook Type", "โฐโโค"+oldValue, false);
- eb.addField("Webhook Type Legend", "-# 0 for PING; 1 for Event", false);
- break;
-
- case "avatar_hash":
- eb.addField("๐ผ๏ธ Avatar Hash", "โฐโโค"+oldValue, false);
- break;
-
- case "channel_id":
- GuildChannel targetChannel = event.getGuild().getGuildChannelById(String.valueOf(oldValue));
- String mentionableTargetChannel = (targetChannel !=null ? targetChannel.getAsMention() : String.valueOf(oldValue));
- eb.addField("๐ฌ Channel", "โฐโโค"+mentionableTargetChannel, false);
- break;
-
- case "name":
- eb.addField("๐ท๏ธ Webhook Name", "โฐโโค"+oldValue, false);
- break;
-
-
- default:
- eb.addField(change, "from "+oldValue+" to "+newValue, false);
- }
-
- }
- eb.setFooter("Audit Log Entry ID: "+ale.getId());
- eb.setTimestamp(ale.getTimeCreated());
-
- MessageEmbed mb = eb.build();
- Objects.requireNonNull(event.getGuild().getTextChannelById(channelIdToSendTo)).sendMessageEmbeds(mb).queue();
- }
-}
diff --git a/src/main/java/org/papertrail/listeners/messagelog/event/MessageLogListener.java b/src/main/java/org/papertrail/listeners/message/event/MessageLogListener.java
similarity index 99%
rename from src/main/java/org/papertrail/listeners/messagelog/event/MessageLogListener.java
rename to src/main/java/org/papertrail/listeners/message/event/MessageLogListener.java
index 29a6554d..7394a7af 100644
--- a/src/main/java/org/papertrail/listeners/messagelog/event/MessageLogListener.java
+++ b/src/main/java/org/papertrail/listeners/message/event/MessageLogListener.java
@@ -1,4 +1,4 @@
-package org.papertrail.listeners.messagelog.event;
+package org.papertrail.listeners.message.event;
import java.awt.Color;
import java.time.Instant;
diff --git a/src/main/java/org/papertrail/listeners/messagelog/setup/MessageLogSetupCommandListener.java b/src/main/java/org/papertrail/listeners/message/setup/MessageLogSetupCommandListener.java
similarity index 99%
rename from src/main/java/org/papertrail/listeners/messagelog/setup/MessageLogSetupCommandListener.java
rename to src/main/java/org/papertrail/listeners/message/setup/MessageLogSetupCommandListener.java
index ddd81b97..79f2adf8 100644
--- a/src/main/java/org/papertrail/listeners/messagelog/setup/MessageLogSetupCommandListener.java
+++ b/src/main/java/org/papertrail/listeners/message/setup/MessageLogSetupCommandListener.java
@@ -1,4 +1,4 @@
-package org.papertrail.listeners.messagelog.setup;
+package org.papertrail.listeners.message.setup;
import java.awt.Color;
import java.util.Objects;
diff --git a/src/main/java/org/papertrail/main/FireRun.java b/src/main/java/org/papertrail/main/FireRun.java
index 910dc0cc..6f5783c5 100644
--- a/src/main/java/org/papertrail/main/FireRun.java
+++ b/src/main/java/org/papertrail/main/FireRun.java
@@ -11,12 +11,12 @@
import org.papertrail.listeners.misc.BotKickListener;
import org.papertrail.listeners.misc.ServerStatCommandListener;
import org.papertrail.listeners.misc.BotSetupInstructionCommandListener;
-import org.papertrail.listeners.auditlog.event.AuditLogListener;
-import org.papertrail.listeners.auditlog.setup.AuditLogSetupCommandListener;
-import org.papertrail.listeners.auditlog.helper.GuildMemberJoinAndLeaveListener;
-import org.papertrail.listeners.messagelog.setup.MessageLogSetupCommandListener;
-import org.papertrail.listeners.messagelog.event.MessageLogListener;
-import org.papertrail.listeners.auditlog.helper.GuildVoiceListener;
+import org.papertrail.listeners.audit.event.AuditLogListener;
+import org.papertrail.listeners.audit.setup.AuditLogSetupCommandListener;
+import org.papertrail.listeners.audit.event.GuildMemberJoinAndLeaveListener;
+import org.papertrail.listeners.message.setup.MessageLogSetupCommandListener;
+import org.papertrail.listeners.message.event.MessageLogListener;
+import org.papertrail.listeners.audit.event.GuildVoiceListener;
import org.tinylog.Logger;
import com.sun.net.httpserver.HttpExchange;
From 87f474fb05f833cf041d4989e80bc24721e13190 Mon Sep 17 00:00:00 2001
From: Egg-03 <111327101+eggy03@users.noreply.github.com>
Date: Fri, 14 Nov 2025 13:59:18 +0530
Subject: [PATCH 3/6] refactor(api): migrate logging to slf4j with lombok
The logging implementation in `HttpServiceEngine` has been updated to use SLF4J
via the Lombok `@Slf4j` annotation, replacing direct usage of TinyLog
---
.../commons/sdk/http/HttpServiceEngine.java | 15 ++++++++-------
1 file changed, 8 insertions(+), 7 deletions(-)
diff --git a/src/main/java/org/papertrail/commons/sdk/http/HttpServiceEngine.java b/src/main/java/org/papertrail/commons/sdk/http/HttpServiceEngine.java
index 3925408c..c7c00469 100644
--- a/src/main/java/org/papertrail/commons/sdk/http/HttpServiceEngine.java
+++ b/src/main/java/org/papertrail/commons/sdk/http/HttpServiceEngine.java
@@ -1,6 +1,7 @@
package org.papertrail.commons.sdk.http;
import io.vavr.control.Either;
+import lombok.extern.slf4j.Slf4j;
import org.jetbrains.annotations.NotNull;
import org.papertrail.commons.sdk.model.ErrorObject;
import org.springframework.http.HttpHeaders;
@@ -9,11 +10,11 @@
import org.springframework.web.client.HttpServerErrorException;
import org.springframework.web.client.ResourceAccessException;
import org.springframework.web.client.RestClient;
-import org.tinylog.Logger;
import java.net.URI;
import java.time.Instant;
+@Slf4j
public class HttpServiceEngine {
private final RestClient client;
@@ -43,15 +44,15 @@ public Either makeRequest (
return Either.right(body);
} catch (HttpClientErrorException e) {
- Logger.trace("Client error when calling {} {}: {}", httpMethod, url, e.getMessage(), e);
+ log.trace("Client error when calling {} {}: {}", httpMethod, url, e.getMessage(), e);
ErrorObject error = e.getResponseBodyAs(ErrorObject.class);
return Either.left(error);
} catch (HttpServerErrorException e) {
- Logger.error("Server error when calling {} {}: {}", httpMethod, url, e.getMessage(), e);
+ log.error("Server error when calling {} {}: {}", httpMethod, url, e.getMessage(), e);
ErrorObject error = e.getResponseBodyAs(ErrorObject.class);
return Either.left(error);
} catch (ResourceAccessException e) {
- Logger.error("Resource access error when calling {} {}: {}", httpMethod, url, e.getMessage(), e);
+ log.error("Resource access error when calling {} {}: {}", httpMethod, url, e.getMessage(), e);
ErrorObject error = new ErrorObject(503, "API Unreachable", e.getMessage(), Instant.now().toString(), url);
return Either.left(error);
}
@@ -76,15 +77,15 @@ public Either makeRequestWithBody (
return Either.right(body);
} catch (HttpClientErrorException e) {
- Logger.trace("Client error when calling {} {}: {}", httpMethod, url, e.getMessage(), e);
+ log.trace("Client error when calling {} {}: {}", httpMethod, url, e.getMessage(), e);
ErrorObject error = e.getResponseBodyAs(ErrorObject.class);
return Either.left(error);
} catch (HttpServerErrorException e) {
- Logger.error("Server error when calling {} {}: {}", httpMethod, url, e.getMessage(), e);
+ log.error("Server error when calling {} {}: {}", httpMethod, url, e.getMessage(), e);
ErrorObject error = e.getResponseBodyAs(ErrorObject.class);
return Either.left(error);
} catch (ResourceAccessException e) {
- Logger.error("Resource access error when calling {} {}: {}", httpMethod, url, e.getMessage(), e);
+ log.error("Resource access error when calling {} {}: {}", httpMethod, url, e.getMessage(), e);
ErrorObject error = new ErrorObject(503, "API Unreachable", e.getMessage(), Instant.now().toString(), url);
return Either.left(error);
}
From 274f2f23cfbe98e0af4c09214e837caaf90426d8 Mon Sep 17 00:00:00 2001
From: Egg-03 <111327101+eggy03@users.noreply.github.com>
Date: Fri, 14 Nov 2025 14:46:11 +0530
Subject: [PATCH 4/6] refactor(api): migrate logging to slf4j and rename
self-kick listener
migrate logging from tinylog to slf4j using Lombok's @Slf4j annotation.
This standardizes logging practices and simplifies future integrations.
rename BotKickListener to SelfKickListener for improved clarity and
accuracy, reflecting its purpose of handling the bot's own departure.
update project version numbers in pom.xml and ProjectInfo.java from
3.0.0 to 2.1.0 to reflect the current release state.
update README.md to include a maintenance mode notice, warn against
using legacy v1.2.2, and correct a minor typo.
---
README.md | 8 +++++-
pom.xml | 2 +-
.../commons/version/ProjectInfo.java | 2 +-
.../message/event/MessageLogListener.java | 28 +++++++++----------
...ickListener.java => SelfKickListener.java} | 4 +--
.../java/org/papertrail/main/FireRun.java | 4 +--
6 files changed, 27 insertions(+), 21 deletions(-)
rename src/main/java/org/papertrail/listeners/misc/{BotKickListener.java => SelfKickListener.java} (89%)
diff --git a/README.md b/README.md
index 3abb5936..ebdc6219 100644
--- a/README.md
+++ b/README.md
@@ -1,5 +1,5 @@
# Overview
-PaperTrail is a free and open source, self-hostable and privacy friendly Discord bot designed to deliver structured, reliable logging across all major audit and runtime events. It hooks into Discord's audit logs to cover for most of the audit log events and for events not covered by Audit Logs, it supplements them with real-time listeners to bridge gaps in native coverage (e.g. voice state, boosts, message edits and deletions, custom triggers).
+PaperTrail is a free and open source, self-hostable and privacy-friendly Discord bot designed to deliver structured, reliable logging across all major audit and runtime events. It hooks into Discord's audit logs to cover for most of the audit log events and for events not covered by Audit Logs, it supplements them with real-time listeners to bridge gaps in native coverage (e.g. voice state, boosts, message edits and deletions, custom triggers).
Key Features:
@@ -11,6 +11,11 @@ Key Features:
> ๐ Get it from here: https://discord.com/discovery/applications/1381658412550590475
+
+> [!IMPORTANT]
+> PaperTrail is currently in maintenance mode. Existing bugs will be fixed, dependency updates will be provided
+> but large new features will likely not be added.
+
# Self-Hosting Guide
> [!IMPORTANT]
> Please note that this is only for advanced users who want to self-host this bot
@@ -21,6 +26,7 @@ Key Features:
## v1.2.2 Legacy
Checkout the guide for hosting the legacy version [here](https://github.com/Egg-03/PaperTrailBot/blob/legacy-v1.2.2/README.md).
+v1.2.2 has unresolved bugs and runs on JDA 5. It is recommended to not use that version anymore.
## V2 and above
Since v2, the project has been split into two services:
diff --git a/pom.xml b/pom.xml
index c9d03841..4197b3f3 100644
--- a/pom.xml
+++ b/pom.xml
@@ -2,7 +2,7 @@
4.0.0
org.egg.papertrail
paper-trail-bot
- 3.0.0
+ 2.1.0
PaperTrail
A simple bot for logging all user actions
diff --git a/src/main/java/org/papertrail/commons/version/ProjectInfo.java b/src/main/java/org/papertrail/commons/version/ProjectInfo.java
index bdf8f885..4f84057a 100644
--- a/src/main/java/org/papertrail/commons/version/ProjectInfo.java
+++ b/src/main/java/org/papertrail/commons/version/ProjectInfo.java
@@ -7,6 +7,6 @@ private ProjectInfo() {
}
public static final String APPNAME = "PaperTrail";
- public static final String VERSION = "v3.0.0";
+ public static final String VERSION = "v2.1.0";
public static final String PROJECT_ISSUE_LINK="https://github.com/eggy03/PaperTrailBot/issues";
}
diff --git a/src/main/java/org/papertrail/listeners/message/event/MessageLogListener.java b/src/main/java/org/papertrail/listeners/message/event/MessageLogListener.java
index 7394a7af..fdb26fad 100644
--- a/src/main/java/org/papertrail/listeners/message/event/MessageLogListener.java
+++ b/src/main/java/org/papertrail/listeners/message/event/MessageLogListener.java
@@ -1,19 +1,9 @@
package org.papertrail.listeners.message.event;
-import java.awt.Color;
-import java.time.Instant;
-import java.util.List;
-import java.util.Objects;
-import java.util.concurrent.Executor;
-import java.util.concurrent.atomic.AtomicLong;
-import java.util.concurrent.locks.Lock;
-
import com.google.common.base.Splitter;
import com.google.common.util.concurrent.Striped;
import io.vavr.control.Either;
-import org.jetbrains.annotations.NotNull;
-import org.jspecify.annotations.NonNull;
-
+import lombok.extern.slf4j.Slf4j;
import net.dv8tion.jda.api.EmbedBuilder;
import net.dv8tion.jda.api.entities.MessageEmbed;
import net.dv8tion.jda.api.entities.User;
@@ -21,14 +11,24 @@
import net.dv8tion.jda.api.events.message.MessageReceivedEvent;
import net.dv8tion.jda.api.events.message.MessageUpdateEvent;
import net.dv8tion.jda.api.hooks.ListenerAdapter;
+import org.jetbrains.annotations.NotNull;
+import org.jspecify.annotations.NonNull;
import org.papertrail.commons.sdk.client.MessageContentLogClient;
import org.papertrail.commons.sdk.client.MessageLogClient;
import org.papertrail.commons.sdk.model.ErrorObject;
import org.papertrail.commons.sdk.model.MessageContentObject;
import org.papertrail.commons.sdk.model.MessageLogObject;
import org.papertrail.commons.utilities.MessageEncryption;
-import org.tinylog.Logger;
+import java.awt.Color;
+import java.time.Instant;
+import java.util.List;
+import java.util.Objects;
+import java.util.concurrent.Executor;
+import java.util.concurrent.atomic.AtomicLong;
+import java.util.concurrent.locks.Lock;
+
+@Slf4j
public class MessageLogListener extends ListenerAdapter {
private final Executor vThreadPool;
@@ -42,12 +42,12 @@ public MessageLogListener(Executor vThreadPool) {
private void withMessageLock (String messageId, Runnable task) {
Lock lock = messageLocks.get(messageId);
lock.lock();
- Logger.debug("Lock acquired for message id: {} . Active lock count: {}", messageId, activeLockCount.incrementAndGet());
+ log.debug("Lock acquired for message id: {} . Active lock count: {}", messageId, activeLockCount.incrementAndGet());
try{
task.run();
} finally {
lock.unlock();
- Logger.debug("Lock released for message id: {} . Active lock count: {}", messageId, activeLockCount.decrementAndGet());
+ log.debug("Lock released for message id: {} . Active lock count: {}", messageId, activeLockCount.decrementAndGet());
}
}
diff --git a/src/main/java/org/papertrail/listeners/misc/BotKickListener.java b/src/main/java/org/papertrail/listeners/misc/SelfKickListener.java
similarity index 89%
rename from src/main/java/org/papertrail/listeners/misc/BotKickListener.java
rename to src/main/java/org/papertrail/listeners/misc/SelfKickListener.java
index 7ec29369..69a2a589 100644
--- a/src/main/java/org/papertrail/listeners/misc/BotKickListener.java
+++ b/src/main/java/org/papertrail/listeners/misc/SelfKickListener.java
@@ -13,11 +13,11 @@
/*
* This class will have methods that unregister the log channels from the database after the bot has been kicked
*/
-public class BotKickListener extends ListenerAdapter {
+public class SelfKickListener extends ListenerAdapter {
private final Executor vThreadPool;
- public BotKickListener(Executor vThreadPool) {
+ public SelfKickListener(Executor vThreadPool) {
this.vThreadPool = vThreadPool;
}
diff --git a/src/main/java/org/papertrail/main/FireRun.java b/src/main/java/org/papertrail/main/FireRun.java
index 6f5783c5..1c5644a1 100644
--- a/src/main/java/org/papertrail/main/FireRun.java
+++ b/src/main/java/org/papertrail/main/FireRun.java
@@ -8,7 +8,7 @@
import net.dv8tion.jda.api.sharding.ShardManager;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
-import org.papertrail.listeners.misc.BotKickListener;
+import org.papertrail.listeners.misc.SelfKickListener;
import org.papertrail.listeners.misc.ServerStatCommandListener;
import org.papertrail.listeners.misc.BotSetupInstructionCommandListener;
import org.papertrail.listeners.audit.event.AuditLogListener;
@@ -55,7 +55,7 @@ public static void main(String[] args) throws IOException {
manager.addEventListener(new GuildVoiceListener(vThreadPool));
manager.addEventListener(new GuildMemberJoinAndLeaveListener(vThreadPool));
- manager.addEventListener(new BotKickListener(vThreadPool));
+ manager.addEventListener(new SelfKickListener(vThreadPool));
manager.addEventListener(new ServerStatCommandListener());
manager.addEventListener(new BotSetupInstructionCommandListener());
From f3a2f7588bb0fcef90faf9e154d280472060e93a Mon Sep 17 00:00:00 2001
From: Egg-03 <111327101+eggy03@users.noreply.github.com>
Date: Fri, 14 Nov 2025 15:08:36 +0530
Subject: [PATCH 5/6] refactor(api): use Lombok @UtilityClass for utility
classes
---
.../org/papertrail/commons/utilities/ColorFormatter.java | 8 +++-----
.../papertrail/commons/utilities/DurationFormatter.java | 9 ++++-----
.../java/org/papertrail/commons/utilities/EnvConfig.java | 6 ++----
.../utilities/GuildSystemChannelFlagResolver.java | 9 ++++-----
.../commons/utilities/MemberRoleUpdateParser.java | 7 +++----
.../papertrail/commons/utilities/MessageEncryption.java | 8 +++-----
.../papertrail/commons/utilities/PermissionResolver.java | 9 ++++-----
.../org/papertrail/commons/utilities/TypeResolver.java | 9 ++++-----
8 files changed, 27 insertions(+), 38 deletions(-)
diff --git a/src/main/java/org/papertrail/commons/utilities/ColorFormatter.java b/src/main/java/org/papertrail/commons/utilities/ColorFormatter.java
index 9e421e3f..78c932b7 100644
--- a/src/main/java/org/papertrail/commons/utilities/ColorFormatter.java
+++ b/src/main/java/org/papertrail/commons/utilities/ColorFormatter.java
@@ -5,14 +5,12 @@
import java.util.Map;
import java.util.Map.Entry;
+import lombok.experimental.UtilityClass;
import org.apache.commons.lang3.StringUtils;
+@UtilityClass
public class ColorFormatter {
-
- private ColorFormatter() {
- throw new IllegalStateException("Utility Class");
- }
-
+
public static String formatToHex(Object colorValue) {
if(String.valueOf(colorValue).equals("null")) {
diff --git a/src/main/java/org/papertrail/commons/utilities/DurationFormatter.java b/src/main/java/org/papertrail/commons/utilities/DurationFormatter.java
index 252dc007..93266c4d 100644
--- a/src/main/java/org/papertrail/commons/utilities/DurationFormatter.java
+++ b/src/main/java/org/papertrail/commons/utilities/DurationFormatter.java
@@ -1,16 +1,15 @@
package org.papertrail.commons.utilities;
+import lombok.experimental.UtilityClass;
+
import java.time.Duration;
import java.time.OffsetDateTime;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException;
+@UtilityClass
public class DurationFormatter {
-
- private DurationFormatter() {
- throw new IllegalStateException("Utility Class");
- }
-
+
public static String formatSeconds(Object seconds) {
if (seconds == null) {
return "ERROR: Value Returned Null";
diff --git a/src/main/java/org/papertrail/commons/utilities/EnvConfig.java b/src/main/java/org/papertrail/commons/utilities/EnvConfig.java
index d97efec2..4a05f636 100644
--- a/src/main/java/org/papertrail/commons/utilities/EnvConfig.java
+++ b/src/main/java/org/papertrail/commons/utilities/EnvConfig.java
@@ -1,14 +1,12 @@
package org.papertrail.commons.utilities;
import io.github.cdimascio.dotenv.Dotenv;
+import lombok.experimental.UtilityClass;
+@UtilityClass
public class EnvConfig {
private static final Dotenv dotenv = Dotenv.configure().ignoreIfMalformed().ignoreIfMissing().load();
-
- private EnvConfig() {
- throw new IllegalStateException("Utility Class");
- }
public static String get(String key) {
diff --git a/src/main/java/org/papertrail/commons/utilities/GuildSystemChannelFlagResolver.java b/src/main/java/org/papertrail/commons/utilities/GuildSystemChannelFlagResolver.java
index 1c05ec21..8dd7cefc 100644
--- a/src/main/java/org/papertrail/commons/utilities/GuildSystemChannelFlagResolver.java
+++ b/src/main/java/org/papertrail/commons/utilities/GuildSystemChannelFlagResolver.java
@@ -1,7 +1,10 @@
package org.papertrail.commons.utilities;
+import lombok.experimental.UtilityClass;
+
import java.util.Map;
+@UtilityClass
public class GuildSystemChannelFlagResolver {
private static final Map SYSTEM_CHANNEL_FLAG_MAP = Map.ofEntries(
@@ -12,11 +15,7 @@ public class GuildSystemChannelFlagResolver {
Map.entry(1L << 4, "Suppress role subscription purchase and renewal notifications"),
Map.entry(1L << 5, "Hide role subscription sticker reply buttons")
);
-
- private GuildSystemChannelFlagResolver() {
- throw new IllegalStateException("Utility Class");
- }
-
+
private static String parseFlags(long bitfield){
StringBuilder flags = new StringBuilder();
for(Map.Entry entry: SYSTEM_CHANNEL_FLAG_MAP.entrySet()) {
diff --git a/src/main/java/org/papertrail/commons/utilities/MemberRoleUpdateParser.java b/src/main/java/org/papertrail/commons/utilities/MemberRoleUpdateParser.java
index 0262fd42..cd72b8ae 100644
--- a/src/main/java/org/papertrail/commons/utilities/MemberRoleUpdateParser.java
+++ b/src/main/java/org/papertrail/commons/utilities/MemberRoleUpdateParser.java
@@ -4,13 +4,12 @@
import java.util.HashMap;
import java.util.Map;
+import lombok.experimental.UtilityClass;
import org.apache.commons.lang3.StringUtils;
+@UtilityClass
public class MemberRoleUpdateParser {
-
- private MemberRoleUpdateParser() {
- throw new IllegalStateException("Utility Class");
- }
+
// parses Strings of type shown in this example [{name=2, id=1383465849507151922}] role_name, role_id into a map
public static Map parseRoleUpdate(Object roleUpdateValue) {
diff --git a/src/main/java/org/papertrail/commons/utilities/MessageEncryption.java b/src/main/java/org/papertrail/commons/utilities/MessageEncryption.java
index 5f502441..8252d7a4 100644
--- a/src/main/java/org/papertrail/commons/utilities/MessageEncryption.java
+++ b/src/main/java/org/papertrail/commons/utilities/MessageEncryption.java
@@ -1,17 +1,15 @@
package org.papertrail.commons.utilities;
+import lombok.experimental.UtilityClass;
import org.jasypt.encryption.pbe.StandardPBEStringEncryptor;
import org.tinylog.Logger;
+@UtilityClass
public class MessageEncryption {
private static final String SECRET = EnvConfig.get("MESSAGE_SECRET");
private static final String ALGORITHM = "PBEWITHSHA256AND256BITAES-CBC-BC";
-
- private MessageEncryption() {
- throw new IllegalStateException("UtilityClass");
- }
-
+
private static StandardPBEStringEncryptor getEncryptor() {
StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor();
encryptor.setPassword(SECRET);
diff --git a/src/main/java/org/papertrail/commons/utilities/PermissionResolver.java b/src/main/java/org/papertrail/commons/utilities/PermissionResolver.java
index 25d98e9f..4c25edbb 100644
--- a/src/main/java/org/papertrail/commons/utilities/PermissionResolver.java
+++ b/src/main/java/org/papertrail/commons/utilities/PermissionResolver.java
@@ -1,10 +1,13 @@
package org.papertrail.commons.utilities;
+import lombok.experimental.UtilityClass;
+
import java.util.Map;
/**
@see Discord Permissions
*/
+@UtilityClass
public class PermissionResolver {
private static final Map PERMISSION_MAP = Map.ofEntries(
@@ -60,11 +63,7 @@ public class PermissionResolver {
Map.entry(1L << 50, "USE_EXTERNAL_APPS"),
Map.entry(1L << 51, "PIN_MESSAGES")
);
-
- private PermissionResolver() {
- throw new IllegalStateException("Utility Class");
- }
-
+
private static String parsePermissions(long bitfield, String emoji){
StringBuilder permissions = new StringBuilder();
for(Map.Entry entry: PERMISSION_MAP.entrySet()) {
diff --git a/src/main/java/org/papertrail/commons/utilities/TypeResolver.java b/src/main/java/org/papertrail/commons/utilities/TypeResolver.java
index c4778112..0c371a1f 100644
--- a/src/main/java/org/papertrail/commons/utilities/TypeResolver.java
+++ b/src/main/java/org/papertrail/commons/utilities/TypeResolver.java
@@ -1,15 +1,14 @@
package org.papertrail.commons.utilities;
+import lombok.experimental.UtilityClass;
+
/*
- * Resolves Object sub-types from their given IDs
+ * Resolves Object subtypes from their given IDs
* @see Discord Channel Types
*/
+@UtilityClass
public class TypeResolver {
- private TypeResolver() {
- throw new IllegalStateException("Utility Class");
- }
-
public static String channelTypeResolver(Object channelTypeId) {
if (channelTypeId == null) {
return "ERROR: Value Returned Null";
From 5b394e5e3dfd3a9cd732f8a66f0d8ffd57583932 Mon Sep 17 00:00:00 2001
From: Egg-03 <111327101+eggy03@users.noreply.github.com>
Date: Fri, 14 Nov 2025 16:52:24 +0530
Subject: [PATCH 6/6] refactor(api): refactor data parsing utilities and
connection initializer
Simplify gradient color parsing in `ColorFormatter` by directly handling Map
objects, removing brittle string manipulation.
Rename `MemberRoleUpdateParser` to `RoleObjectParser`
and rewrite role parsing logic to handle List of Map objects, as a replacement for brittle string parsing. This fixes the issue where multiple role adds/removes in a single event (possible only via mobile) would only show the last added/removed role.
Replace manual `getManager()` method with Lombok's `@Getter` in
`ConnectionInitializer`.
---
.../commons/utilities/ColorFormatter.java | 48 +++++++------------
.../utilities/MemberRoleUpdateParser.java | 44 -----------------
.../commons/utilities/RoleObjectParser.java | 31 ++++++++++++
.../helper/MemberRoleUpdateEventHelper.java | 14 ++----
.../main/ConnectionInitializer.java | 14 +++---
5 files changed, 58 insertions(+), 93 deletions(-)
delete mode 100644 src/main/java/org/papertrail/commons/utilities/MemberRoleUpdateParser.java
create mode 100644 src/main/java/org/papertrail/commons/utilities/RoleObjectParser.java
diff --git a/src/main/java/org/papertrail/commons/utilities/ColorFormatter.java b/src/main/java/org/papertrail/commons/utilities/ColorFormatter.java
index 78c932b7..31c9b16b 100644
--- a/src/main/java/org/papertrail/commons/utilities/ColorFormatter.java
+++ b/src/main/java/org/papertrail/commons/utilities/ColorFormatter.java
@@ -1,12 +1,9 @@
package org.papertrail.commons.utilities;
-import java.util.HashMap;
+import lombok.experimental.UtilityClass;
+
import java.util.IllegalFormatException;
import java.util.Map;
-import java.util.Map.Entry;
-
-import lombok.experimental.UtilityClass;
-import org.apache.commons.lang3.StringUtils;
@UtilityClass
public class ColorFormatter {
@@ -26,32 +23,21 @@ public static String formatToHex(Object colorValue) {
return "Cannot parse color to hex";
}
}
-
+
+ // gradient is returned as a hash map in the following structure
+ // {"primary_color" = 123456789, "secondary_color" = 123456789, "tertiary_color" = 123456789}
public static String formatGradientColorSystemToHex(Object gradientValue) {
-
- if(String.valueOf(gradientValue).equals("null")) {
- return "N/A";
- }
-
- // Example gradient: "{tertiary_color=null, secondary_color=null, primary_color=3066993}"
- String cleanedroleValueString = StringUtils.strip(String.valueOf(gradientValue), "{}");
- // the string should now be "tertiary_color=null, secondary_color=null, primary_color=3066993"
- String[] splitValues = cleanedroleValueString.trim().split(",");
- // this should fill the array with three items
- // [tertiary_color=null, secondary_color=null, primary_color=3066993]
- MapcolorKeyAndValues = new HashMap<>();
- for(String splitValue: splitValues) {
- String[] keyValueSplit = StringUtils.split(splitValue, "="); // further split into 3 arrays [tertiary_color, null] [secondary_color, null] [primary_color, 3066993]
- if(keyValueSplit.length==2) {
- colorKeyAndValues.put(keyValueSplit[0].trim(), formatToHex(keyValueSplit[1].trim())); // put them into the map after converting the int color to hex
- }
- }
-
- StringBuilder sb = new StringBuilder();
- for(Entry colorKeyValue: colorKeyAndValues.entrySet()) {
- sb.append(colorKeyValue.getKey()).append(": ").append(colorKeyValue.getValue()).append(System.lineSeparator());
- }
-
- return sb.toString();
+
+ if(gradientValue instanceof Map, ?> colorMap){
+
+ String primaryColor = "Primary Color: "+ formatToHex(colorMap.get("primary_color"));
+ String secondaryColor = "Secondary Color: "+ formatToHex(colorMap.get("secondary_color"));
+ String tertiaryColor = "Tertiary Color: "+ formatToHex(colorMap.get("tertiary_color"));
+
+ return primaryColor+System.lineSeparator()+secondaryColor+System.lineSeparator()+tertiaryColor;
+ }
+
+ return "N/A";
+
}
}
diff --git a/src/main/java/org/papertrail/commons/utilities/MemberRoleUpdateParser.java b/src/main/java/org/papertrail/commons/utilities/MemberRoleUpdateParser.java
deleted file mode 100644
index cd72b8ae..00000000
--- a/src/main/java/org/papertrail/commons/utilities/MemberRoleUpdateParser.java
+++ /dev/null
@@ -1,44 +0,0 @@
-package org.papertrail.commons.utilities;
-
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
-
-import lombok.experimental.UtilityClass;
-import org.apache.commons.lang3.StringUtils;
-
-@UtilityClass
-public class MemberRoleUpdateParser {
-
- // parses Strings of type shown in this example [{name=2, id=1383465849507151922}] role_name, role_id into a map
- public static Map parseRoleUpdate(Object roleUpdateValue) {
-
- if(roleUpdateValue==null) {
- return Collections.emptyMap();
- }
-
- String roleUpdateValueString = String.valueOf(roleUpdateValue);
- if(roleUpdateValueString.isBlank()) {
- return Collections.emptyMap();
- }
-
- String cleanedroleValueString = StringUtils.strip(roleUpdateValueString, "[{}]");
- // the string should now be "name=2, id=1383465849507151922" without the quotation marks
- String[] splitValues = cleanedroleValueString.trim().split(",");
- // this should fill the array with two items
- // [name=2, id=1383465849507151922]
- //
-
- Map keyValueMap = new HashMap<>();
- for(String splitValue: splitValues) {
- String[] keyValue = StringUtils.split(splitValue, "=");
- // this should create 2 arrays each of size 2
- // Array 1 = [name,2] & Array 2 = [id, 1383465849507151922]
- if(keyValue.length==2) {
- keyValueMap.put(keyValue[0].trim(), keyValue[1].trim());
- }
- }
-
- return keyValueMap;
- }
-}
diff --git a/src/main/java/org/papertrail/commons/utilities/RoleObjectParser.java b/src/main/java/org/papertrail/commons/utilities/RoleObjectParser.java
new file mode 100644
index 00000000..de82ddf4
--- /dev/null
+++ b/src/main/java/org/papertrail/commons/utilities/RoleObjectParser.java
@@ -0,0 +1,31 @@
+package org.papertrail.commons.utilities;
+
+import lombok.experimental.UtilityClass;
+import lombok.extern.slf4j.Slf4j;
+
+import java.util.List;
+import java.util.Map;
+
+@UtilityClass
+@Slf4j
+public class RoleObjectParser {
+
+ // 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}]
+ public static String parseRole(Object roleObject) {
+
+ if (roleObject instanceof List> roleList) {
+ StringBuilder roles = new StringBuilder();
+ for (Object o : roleList) {
+ if (o instanceof Map, ?> roleMap) {
+ roles.append("Name: ").append(roleMap.get("name"))
+ .append(" ID: ").append(roleMap.get("id"))
+ .append(System.lineSeparator());
+ }
+ }
+ return roles.toString();
+ }
+
+ return "N/A";
+ }
+}
diff --git a/src/main/java/org/papertrail/listeners/audit/helper/MemberRoleUpdateEventHelper.java b/src/main/java/org/papertrail/listeners/audit/helper/MemberRoleUpdateEventHelper.java
index abddf2d2..ee0bdb6b 100644
--- a/src/main/java/org/papertrail/listeners/audit/helper/MemberRoleUpdateEventHelper.java
+++ b/src/main/java/org/papertrail/listeners/audit/helper/MemberRoleUpdateEventHelper.java
@@ -7,7 +7,7 @@
import net.dv8tion.jda.api.entities.MessageEmbed;
import net.dv8tion.jda.api.entities.User;
import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
-import org.papertrail.commons.utilities.MemberRoleUpdateParser;
+import org.papertrail.commons.utilities.RoleObjectParser;
import java.awt.Color;
import java.util.Map;
@@ -28,7 +28,7 @@ public static void format(GuildAuditLogEntryCreateEvent event, AuditLogEntry ale
eb.setDescription("๐ค **By**: "+mentionableExecutor+"\nโน๏ธ The following member role was updated");
eb.setThumbnail(Objects.requireNonNull(event.getGuild().getMemberById(ale.getTargetIdLong())).getEffectiveAvatarUrl());
- eb.setColor(Color.CYAN);
+ eb.setColor(Color.YELLOW);
eb.addField("Action Type", String.valueOf(ale.getType()), true);
eb.addField("Target Type", String.valueOf(ale.getTargetType()), true);
@@ -42,19 +42,13 @@ public static void format(GuildAuditLogEntryCreateEvent event, AuditLogEntry ale
switch(change) {
case "$add":
- eb.setColor(Color.GREEN);
eb.addField("Target Member", "โฐโโค"+mentionableTarget, false);
- Map addedRoleNameAndId = MemberRoleUpdateParser.parseRoleUpdate(newValue);
- eb.addField("Role Added", "โ
"+addedRoleNameAndId.getOrDefault("name", "`ERROR: Name Not Found`"), false);
- eb.addField("Added Role ID", "โฐโโค"+addedRoleNameAndId.getOrDefault("id", "`ERROR: ID Not Found`"), false);
+ eb.addField("Role(s) Added", "โฐโโค"+RoleObjectParser.parseRole(newValue), false);
break;
case "$remove":
- eb.setColor(Color.RED);
eb.addField("Target Member", "โฐโโค"+mentionableTarget, false);
- Map removedRoleNameAndId = MemberRoleUpdateParser.parseRoleUpdate(newValue);
- eb.addField("Role Removed", "โ "+removedRoleNameAndId.getOrDefault("name", "`ERROR: Name Not Found`"), false);
- eb.addField("Removed Role ID", "โฐโโค"+removedRoleNameAndId.getOrDefault("id", "`ERROR: ID Not Found`"), false);
+ eb.addField("Role(s) Removed", "โฐโโค"+RoleObjectParser.parseRole(newValue), false);
break;
default:
diff --git a/src/main/java/org/papertrail/main/ConnectionInitializer.java b/src/main/java/org/papertrail/main/ConnectionInitializer.java
index f028b25f..70f5f892 100644
--- a/src/main/java/org/papertrail/main/ConnectionInitializer.java
+++ b/src/main/java/org/papertrail/main/ConnectionInitializer.java
@@ -1,5 +1,6 @@
package org.papertrail.main;
+import lombok.Getter;
import org.papertrail.commons.utilities.EnvConfig;
import net.dv8tion.jda.api.OnlineStatus;
@@ -14,9 +15,11 @@
/*
* This class initializes the connection to discord and configures all the necessary intents
*/
+@Getter
public class ConnectionInitializer {
-
- // Manages multiple shards (instances) of the bot
+
+ // returns the manager that manages multiple shards (instances) of the bot
+ // Manages multiple shards (instances) of the bot
private final ShardManager manager;
public ConnectionInitializer() {
@@ -53,10 +56,5 @@ public ConnectionInitializer() {
manager.addEventListener(new SlashCommandRegistrar());
// re-enable it only when adding/updating/deleting commands
}
-
- // returns the manager that manages multiple shards (instances) of the bot
- public ShardManager getManager() {
- return manager;
- }
-
+
}