From 5eeed6de56e258ba2884b4c6dc935b12b7faff39 Mon Sep 17 00:00:00 2001
From: Egg-03 <111327101+eggy03@users.noreply.github.com>
Date: Thu, 5 Feb 2026 10:44:59 +0530
Subject: [PATCH 1/5] feat(utilities): add boolean formatter for
enabled/disabled strings
- Add `formatToEnabledOrDisabled` method to `BooleanFormatter.java`.
- Format `Boolean.TRUE` to "Enabled", `Boolean.FALSE` or other non-null to "Disabled", and `null` to "N/A".
Signed-off-by: Egg-03 <111327101+eggy03@users.noreply.github.com>
---
.../commons/utilities/BooleanFormatter.java | 11 +++++++++++
1 file changed, 11 insertions(+)
diff --git a/src/main/java/org/papertrail/commons/utilities/BooleanFormatter.java b/src/main/java/org/papertrail/commons/utilities/BooleanFormatter.java
index 5ea33f5c..a73c3fa0 100644
--- a/src/main/java/org/papertrail/commons/utilities/BooleanFormatter.java
+++ b/src/main/java/org/papertrail/commons/utilities/BooleanFormatter.java
@@ -27,4 +27,15 @@ public static String formatToYesOrNo (Object value) {
return "No";
}
+
+ @NotNull
+ public static String formatToEnabledOrDisabled (Object value) {
+ if(value==null)
+ return "N/A";
+
+ if(Boolean.TRUE.equals(value))
+ return "Enabled";
+
+ return "Disabled";
+ }
}
From b442fdf32d4d69f0548bbd8cfd61afcf278186ef Mon Sep 17 00:00:00 2001
From: Egg-03 <111327101+eggy03@users.noreply.github.com>
Date: Thu, 5 Feb 2026 10:45:29 +0530
Subject: [PATCH 2/5] feat(audit): add onboarding update event prompt event
handling
- Add handling for `prompts` updates in `OnboardingUpdateEventHelper.java`.
- Introduce `ONBOARDING_PROMPT_CREATE`, `ONBOARDING_PROMPT_UPDATE`, and `ONBOARDING_PROMPT_DELETE` event types.
- Reformat `case` statements and update event comments in `AuditLogEventListener.java`.
Signed-off-by: Egg-03 <111327101+eggy03@users.noreply.github.com>
feat(audit): add support for onboarding update audit events
- Introduce `OnboardingUpdateEventHelper.java` to format `ONBOARDING_UPDATE` audit log events.
- Integrate the new helper into `AuditLogEventListener.java` to process these events.
- This allows the bot to log changes made to Discord's onboarding feature.
Signed-off-by: Egg-03 <111327101+eggy03@users.noreply.github.com>
feat(onboarding): display onboarding mode changes in audit logs
- Add `OnboardingFormatter` utility to convert onboarding mode values (`"0"`, `"1"`) to human-readable strings.
- Update `OnboardingUpdateEventHelper` to use `OnboardingFormatter` for displaying onboarding mode changes in audit log embeds.
- This provides specific context for onboarding mode changes, instead of generic "from: X to: Y".
Signed-off-by: Egg-03 <111327101+eggy03@users.noreply.github.com>
refactor(onboarding): rename utility and enhance audit log details
- rename `OnboardingFormatter` to `OnboardingUtils`
- enhance `OnboardingUpdateEventHelper` to display old and new values for `enabled`, `mode`, and `default_channel_ids`
- add `formatStatus` and `resolveChannelsFromList` methods to `OnboardingUtils`
- update `AuditLogEventListener` call for `ONBOARDING_UPDATE` event
- add placeholder cases for `HOME_SETTINGS_CREATE` and `HOME_SETTINGS_UPDATE` events
Signed-off-by: Egg-03 <111327101+eggy03@users.noreply.github.com>
---
.../commons/utilities/OnboardingUtils.java | 50 ++++++++++++
.../audit/event/AuditLogEventListener.java | 50 ++++++------
.../helper/OnboardingUpdateEventHelper.java | 76 +++++++++++++++++++
3 files changed, 152 insertions(+), 24 deletions(-)
create mode 100644 src/main/java/org/papertrail/commons/utilities/OnboardingUtils.java
create mode 100644 src/main/java/org/papertrail/listeners/audit/helper/OnboardingUpdateEventHelper.java
diff --git a/src/main/java/org/papertrail/commons/utilities/OnboardingUtils.java b/src/main/java/org/papertrail/commons/utilities/OnboardingUtils.java
new file mode 100644
index 00000000..edbde899
--- /dev/null
+++ b/src/main/java/org/papertrail/commons/utilities/OnboardingUtils.java
@@ -0,0 +1,50 @@
+package org.papertrail.commons.utilities;
+
+import lombok.experimental.UtilityClass;
+import net.dv8tion.jda.api.entities.Guild;
+import net.dv8tion.jda.api.entities.channel.middleman.GuildChannel;
+import org.jetbrains.annotations.NotNull;
+
+import java.util.List;
+
+@UtilityClass
+public class OnboardingUtils {
+
+ @NotNull
+ public static String formatMode(Object value) {
+ if(value==null) return "N/A";
+
+ return switch (String.valueOf(value)) {
+ case "1" -> "Advanced Mode";
+ case "0" -> "Regular Mode";
+ default -> "N/A";
+ };
+ }
+
+ @NotNull
+ public static String formatStatus(Object value) {
+ if(value==null)
+ return "N/A";
+
+ if(Boolean.TRUE.equals(value))
+ return "Enabled";
+
+ return "Disabled";
+ }
+
+ @NotNull
+ public static String resolveChannelsFromList(Guild guild, Object value) {
+ if(value == null) return "No Resolvable Channel IDs";
+
+ StringBuilder sb = new StringBuilder();
+ if(value instanceof List> channelIdList) {
+ channelIdList.forEach(channelId -> {
+ GuildChannel channel = guild.getGuildChannelById((String) channelId);
+ sb.append(channel!=null ? channel.getAsMention() : channelId).append(", ");
+ });
+ sb.delete(sb.length()-2, sb.length()); // delete trailing ", "
+ }
+
+ return sb.toString();
+ }
+}
diff --git a/src/main/java/org/papertrail/listeners/audit/event/AuditLogEventListener.java b/src/main/java/org/papertrail/listeners/audit/event/AuditLogEventListener.java
index e07c0c5b..17fa18ee 100644
--- a/src/main/java/org/papertrail/listeners/audit/event/AuditLogEventListener.java
+++ b/src/main/java/org/papertrail/listeners/audit/event/AuditLogEventListener.java
@@ -39,6 +39,7 @@
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.OnboardingUpdateEventHelper;
import org.papertrail.listeners.audit.helper.RoleCreateEventHelper;
import org.papertrail.listeners.audit.helper.RoleDeleteEventHelper;
import org.papertrail.listeners.audit.helper.RoleUpdateEventHelper;
@@ -91,18 +92,12 @@ private void auditLogParser(GuildAuditLogEntryCreateEvent event, String channelI
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 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);
@@ -160,20 +155,26 @@ private void auditLogParser(GuildAuditLogEntryCreateEvent event, String channelI
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 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);
+ case SOUNDBOARD_SOUND_CREATE -> SoundboardSoundCreateEventHelper.format(event, ale, channelIdToSendTo);
+ case SOUNDBOARD_SOUND_UPDATE -> SoundboardSoundUpdateEventHelper.format(event, ale, channelIdToSendTo);
+ case SOUNDBOARD_SOUND_DELETE -> SoundboardSoundDeleteEventHelper.format(event, ale, channelIdToSendTo);
+
+ case ONBOARDING_UPDATE -> OnboardingUpdateEventHelper.format(event, channelIdToSendTo);
+ case ONBOARDING_PROMPT_CREATE -> GenericAuditLogEventHelper.format(event, ale, channelIdToSendTo);
+ case ONBOARDING_PROMPT_UPDATE -> GenericAuditLogEventHelper.format(event, ale, channelIdToSendTo);
+ case ONBOARDING_PROMPT_DELETE -> GenericAuditLogEventHelper.format(event, ale, channelIdToSendTo);
+
+ case HOME_SETTINGS_CREATE, HOME_SETTINGS_UPDATE -> {
+ // might come back later and implement it
+ // but for now, don't send these events
+ }
// these seemingly don't trigger properly, or are unreliable
case MESSAGE_BULK_DELETE,
@@ -181,9 +182,10 @@ private void auditLogParser(GuildAuditLogEntryCreateEvent event, String channelI
MESSAGE_DELETE,
MESSAGE_UPDATE -> GenericAuditLogEventHelper.format(event, ale, channelIdToSendTo);
- case SOUNDBOARD_SOUND_CREATE -> SoundboardSoundCreateEventHelper.format(event, ale, channelIdToSendTo);
- case SOUNDBOARD_SOUND_UPDATE -> SoundboardSoundUpdateEventHelper.format(event, ale, channelIdToSendTo);
- case SOUNDBOARD_SOUND_DELETE -> SoundboardSoundDeleteEventHelper.format(event, ale, channelIdToSendTo);
+ // except UNKNOWN, the rest have never been seen to be triggered
+ case APPLICATION_COMMAND_PRIVILEGES_UPDATE, PRUNE, INTEGRATION_UPDATE,
+ INVITE_UPDATE, ONBOARDING_CREATE,
+ UNKNOWN -> GenericAuditLogEventHelper.format(event, ale, channelIdToSendTo);
default -> {
GenericAuditLogEventHelper.format(event, ale, channelIdToSendTo);
diff --git a/src/main/java/org/papertrail/listeners/audit/helper/OnboardingUpdateEventHelper.java b/src/main/java/org/papertrail/listeners/audit/helper/OnboardingUpdateEventHelper.java
new file mode 100644
index 00000000..5374e42a
--- /dev/null
+++ b/src/main/java/org/papertrail/listeners/audit/helper/OnboardingUpdateEventHelper.java
@@ -0,0 +1,76 @@
+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.Guild;
+import net.dv8tion.jda.api.entities.MessageEmbed;
+import net.dv8tion.jda.api.entities.User;
+import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;
+import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
+import org.papertrail.commons.utilities.OnboardingUtils;
+
+import java.awt.Color;
+
+@UtilityClass
+public class OnboardingUpdateEventHelper {
+
+ public static void format(GuildAuditLogEntryCreateEvent event, String channelIdToSendTo) {
+
+ AuditLogEntry ale = event.getEntry();
+
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("Audit Log Entry | Onboarding Update Event");
+
+ User executor = ale.getJDA().getUserById(ale.getUserId());
+ String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getTargetId());
+
+ Guild guild = event.getGuild();
+
+ eb.setDescription("👤 " + mentionableExecutor + "has made changes to Onboarding");
+ eb.setColor(Color.MAGENTA);
+
+ eb.addField("Action Type", String.valueOf(ale.getType()), true);
+ eb.addField("Target Type", String.valueOf(ale.getTargetType()), true);
+
+ ale.getChanges().forEach((changeKey, changeValue) -> {
+ Object oldValue = changeValue.getOldValue();
+ Object newValue = changeValue.getNewValue();
+
+ switch (changeKey){
+ case "enabled":
+ eb.addField("Old Onboarding Status", OnboardingUtils.formatStatus(oldValue), false);
+ eb.addField("New Onboarding Status", OnboardingUtils.formatStatus(newValue), true);
+ break;
+
+ case "mode":
+ eb.addField("Old Onboarding Mode", OnboardingUtils.formatMode(oldValue), false);
+ eb.addField("New Onboarding Mode", OnboardingUtils.formatMode(newValue), true);
+ break;
+
+ case "default_channel_ids":
+ eb.addField("Old Default Channels", OnboardingUtils.resolveChannelsFromList(guild, oldValue), false);
+ eb.addField("New Default Channels", OnboardingUtils.resolveChannelsFromList(guild, newValue), false);
+ break;
+
+ case "prompts": // unknown as to exactly why this is triggered
+ eb.addField("Prompt Updates", "Overall Pre-join/Post-join questions may have been updated.\n Review changes manually.", false);
+ break;
+
+ default:
+ eb.addField(changeKey, "from: "+oldValue+" to: "+newValue, false);
+ }
+
+ });
+
+ eb.setFooter("Audit Log Entry ID: "+ale.getId());
+ eb.setTimestamp(ale.getTimeCreated());
+
+ MessageEmbed mb = eb.build();
+
+ TextChannel sendingChannel = event.getGuild().getTextChannelById(channelIdToSendTo);
+ if(sendingChannel!=null && sendingChannel.canTalk()) {
+ sendingChannel.sendMessageEmbeds(mb).queue();
+ }
+ }
+}
From 62ee3ff90a9069d5045b2e509f857abba6d7fc22 Mon Sep 17 00:00:00 2001
From: Egg-03 <111327101+eggy03@users.noreply.github.com>
Date: Thu, 5 Feb 2026 12:38:39 +0530
Subject: [PATCH 3/5] style(formatting): use single space for item separators
- Replaced `System.lineSeparator()` and `", "` with a single space in utility string builders.
- Removed redundant trailing comma-space deletion in `OnboardingUtils.java`.
- Ensures consistent output formatting across utilities.
Signed-off-by: Egg-03 <111327101+eggy03@users.noreply.github.com>
---
.../java/org/papertrail/commons/utilities/OnboardingUtils.java | 3 +--
.../org/papertrail/commons/utilities/RoleObjectParser.java | 3 +--
2 files changed, 2 insertions(+), 4 deletions(-)
diff --git a/src/main/java/org/papertrail/commons/utilities/OnboardingUtils.java b/src/main/java/org/papertrail/commons/utilities/OnboardingUtils.java
index edbde899..ad2cad96 100644
--- a/src/main/java/org/papertrail/commons/utilities/OnboardingUtils.java
+++ b/src/main/java/org/papertrail/commons/utilities/OnboardingUtils.java
@@ -40,9 +40,8 @@ public static String resolveChannelsFromList(Guild guild, Object value) {
if(value instanceof List> channelIdList) {
channelIdList.forEach(channelId -> {
GuildChannel channel = guild.getGuildChannelById((String) channelId);
- sb.append(channel!=null ? channel.getAsMention() : channelId).append(", ");
+ sb.append(channel!=null ? channel.getAsMention() : channelId).append(" ");
});
- sb.delete(sb.length()-2, sb.length()); // delete trailing ", "
}
return sb.toString();
diff --git a/src/main/java/org/papertrail/commons/utilities/RoleObjectParser.java b/src/main/java/org/papertrail/commons/utilities/RoleObjectParser.java
index 101bac1f..91d132ee 100644
--- a/src/main/java/org/papertrail/commons/utilities/RoleObjectParser.java
+++ b/src/main/java/org/papertrail/commons/utilities/RoleObjectParser.java
@@ -22,8 +22,7 @@ public static String parseRole(GenericGuildEvent event, Object roleObject) {
if (o instanceof Map, ?> roleMap && roleMap.containsKey("id")) {
String roleId = (String) roleMap.get("id");
Role role = event.getGuild().getRoleById(roleId);
- roleString.append(role!=null ? role.getAsMention() : roleMap.get("name"))
- .append(System.lineSeparator());
+ roleString.append(role!=null ? role.getAsMention() : roleMap.get("name")).append(" ");
}
}
return roleString.toString();
From 9e8c31b99b77756c4c7b28b475b7aa39bac88492 Mon Sep 17 00:00:00 2001
From: Egg-03 <111327101+eggy03@users.noreply.github.com>
Date: Thu, 5 Feb 2026 14:34:36 +0530
Subject: [PATCH 4/5] feat(audit): add specific handlers for onboarding prompt
events
- Implement dedicated helper classes for `ONBOARDING_PROMPT_CREATE`, `ONBOARDING_PROMPT_UPDATE`, and `ONBOARDING_PROMPT_DELETE` events.
- Integrate these helpers into `AuditLogEventListener` to provide detailed audit log messages for onboarding prompt changes.
Signed-off-by: Egg-03 <111327101+eggy03@users.noreply.github.com>
---
.../audit/event/AuditLogEventListener.java | 11 ++-
.../OnboardingPromptCreateEventHelper.java | 79 ++++++++++++++++++
.../OnboardingPromptDeleteEventHelper.java | 76 +++++++++++++++++
.../OnboardingPromptUpdateEventHelper.java | 83 +++++++++++++++++++
4 files changed, 245 insertions(+), 4 deletions(-)
create mode 100644 src/main/java/org/papertrail/listeners/audit/helper/OnboardingPromptCreateEventHelper.java
create mode 100644 src/main/java/org/papertrail/listeners/audit/helper/OnboardingPromptDeleteEventHelper.java
create mode 100644 src/main/java/org/papertrail/listeners/audit/helper/OnboardingPromptUpdateEventHelper.java
diff --git a/src/main/java/org/papertrail/listeners/audit/event/AuditLogEventListener.java b/src/main/java/org/papertrail/listeners/audit/event/AuditLogEventListener.java
index 17fa18ee..cb1f8577 100644
--- a/src/main/java/org/papertrail/listeners/audit/event/AuditLogEventListener.java
+++ b/src/main/java/org/papertrail/listeners/audit/event/AuditLogEventListener.java
@@ -39,6 +39,9 @@
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.OnboardingPromptCreateEventHelper;
+import org.papertrail.listeners.audit.helper.OnboardingPromptDeleteEventHelper;
+import org.papertrail.listeners.audit.helper.OnboardingPromptUpdateEventHelper;
import org.papertrail.listeners.audit.helper.OnboardingUpdateEventHelper;
import org.papertrail.listeners.audit.helper.RoleCreateEventHelper;
import org.papertrail.listeners.audit.helper.RoleDeleteEventHelper;
@@ -167,9 +170,9 @@ private void auditLogParser(GuildAuditLogEntryCreateEvent event, String channelI
case SOUNDBOARD_SOUND_DELETE -> SoundboardSoundDeleteEventHelper.format(event, ale, channelIdToSendTo);
case ONBOARDING_UPDATE -> OnboardingUpdateEventHelper.format(event, channelIdToSendTo);
- case ONBOARDING_PROMPT_CREATE -> GenericAuditLogEventHelper.format(event, ale, channelIdToSendTo);
- case ONBOARDING_PROMPT_UPDATE -> GenericAuditLogEventHelper.format(event, ale, channelIdToSendTo);
- case ONBOARDING_PROMPT_DELETE -> GenericAuditLogEventHelper.format(event, ale, channelIdToSendTo);
+ case ONBOARDING_PROMPT_CREATE -> OnboardingPromptCreateEventHelper.format(event, channelIdToSendTo);
+ case ONBOARDING_PROMPT_UPDATE -> OnboardingPromptUpdateEventHelper.format(event, channelIdToSendTo);
+ case ONBOARDING_PROMPT_DELETE -> OnboardingPromptDeleteEventHelper.format(event, channelIdToSendTo);
case HOME_SETTINGS_CREATE, HOME_SETTINGS_UPDATE -> {
// might come back later and implement it
@@ -189,7 +192,7 @@ private void auditLogParser(GuildAuditLogEntryCreateEvent event, String channelI
default -> {
GenericAuditLogEventHelper.format(event, ale, channelIdToSendTo);
- log.warn("The following event has either no enum value defined in JDA and is not covered by the UNKNOWN type or is not implemented by me yet {}", ale.getType().name());
+ log.warn("The following event is either not covered by JDA's UNKNOWN type or is not implemented by me yet {}", ale.getType().name());
}
}
}
diff --git a/src/main/java/org/papertrail/listeners/audit/helper/OnboardingPromptCreateEventHelper.java b/src/main/java/org/papertrail/listeners/audit/helper/OnboardingPromptCreateEventHelper.java
new file mode 100644
index 00000000..d6779a16
--- /dev/null
+++ b/src/main/java/org/papertrail/listeners/audit/helper/OnboardingPromptCreateEventHelper.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.AuditLogEntry;
+import net.dv8tion.jda.api.entities.MessageEmbed;
+import net.dv8tion.jda.api.entities.User;
+import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;
+import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
+import org.papertrail.commons.utilities.BooleanFormatter;
+
+import java.awt.Color;
+
+@UtilityClass
+public class OnboardingPromptCreateEventHelper {
+
+ public static void format(GuildAuditLogEntryCreateEvent event, String channelIdToSendTo) {
+
+ AuditLogEntry ale = event.getEntry();
+
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("Audit Log Entry | Onboarding Prompt Create Event");
+
+ User executor = ale.getJDA().getUserById(ale.getUserId());
+ String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getTargetId());
+
+ eb.setDescription("👤 " + mentionableExecutor + "has created an Onboarding Prompt");
+ eb.setColor(Color.GREEN);
+
+ eb.addField("Action Type", String.valueOf(ale.getType()), true);
+ eb.addField("Target Type", String.valueOf(ale.getTargetType()), true);
+
+ ale.getChanges().forEach((changeKey, changeValue) -> {
+
+ Object oldValue = changeValue.getOldValue();
+ Object newValue = changeValue.getNewValue();
+
+ switch (changeKey){
+ case "single_select":
+ eb.addField("Single Selection Mode", BooleanFormatter.formatToYesOrNo(newValue), false);
+ break;
+
+ case "required":
+ eb.addField("Required", BooleanFormatter.formatToYesOrNo(newValue), false);
+ break;
+
+ case "type", "id":
+ break;
+
+ case "title":
+ eb.addField("Question Title", String.valueOf(newValue), false);
+ break;
+
+ case "options":
+ eb.addField("Question Options", "Review the options in Onboarding Settings", false);
+ break;
+
+ case "in_onboarding":
+ eb.addField("Is a Pre-Join Question", BooleanFormatter.formatToYesOrNo(newValue), false);
+ break;
+
+ default:
+ eb.addField(changeKey, "OLD_VALUE: "+oldValue, false);
+ eb.addField(changeKey, "NEW_VALUE: "+newValue, false);
+ }
+
+ });
+
+ eb.setFooter("Audit Log Entry ID: "+ale.getId());
+ eb.setTimestamp(ale.getTimeCreated());
+
+ MessageEmbed mb = eb.build();
+
+ TextChannel sendingChannel = event.getGuild().getTextChannelById(channelIdToSendTo);
+ if(sendingChannel!=null && sendingChannel.canTalk()) {
+ sendingChannel.sendMessageEmbeds(mb).queue();
+ }
+ }
+}
diff --git a/src/main/java/org/papertrail/listeners/audit/helper/OnboardingPromptDeleteEventHelper.java b/src/main/java/org/papertrail/listeners/audit/helper/OnboardingPromptDeleteEventHelper.java
new file mode 100644
index 00000000..43b1dffc
--- /dev/null
+++ b/src/main/java/org/papertrail/listeners/audit/helper/OnboardingPromptDeleteEventHelper.java
@@ -0,0 +1,76 @@
+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.concrete.TextChannel;
+import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
+import org.papertrail.commons.utilities.BooleanFormatter;
+
+import java.awt.Color;
+
+@UtilityClass
+public class OnboardingPromptDeleteEventHelper {
+
+ public static void format(GuildAuditLogEntryCreateEvent event, String channelIdToSendTo) {
+
+ AuditLogEntry ale = event.getEntry();
+
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("Audit Log Entry | Onboarding Prompt Delete Event");
+
+ User executor = ale.getJDA().getUserById(ale.getUserId());
+ String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getTargetId());
+
+ eb.setDescription("👤 " + mentionableExecutor + "has made deleted an Onboarding Prompt");
+ eb.setColor(Color.RED);
+
+ eb.addField("Action Type", String.valueOf(ale.getType()), true);
+ eb.addField("Target Type", String.valueOf(ale.getTargetType()), true);
+
+ ale.getChanges().forEach((changeKey, changeValue) -> {
+
+ Object oldValue = changeValue.getOldValue();
+ Object newValue = changeValue.getNewValue();
+
+ switch (changeKey){
+ case "single_select":
+ eb.addField("Single Selection Mode", BooleanFormatter.formatToYesOrNo(oldValue), false);
+ break;
+
+ case "required":
+ eb.addField("Was Required", BooleanFormatter.formatToYesOrNo(oldValue), false);
+ break;
+
+ case "type", "id", "options":
+ break;
+
+ case "title":
+ eb.addField("Question Title", String.valueOf(oldValue), false);
+ break;
+
+ case "in_onboarding":
+ eb.addField("Was a Pre-Join Question", BooleanFormatter.formatToYesOrNo(oldValue), false);
+ break;
+
+ default:
+ eb.addField(changeKey, "OLD_VALUE: "+oldValue, false);
+ eb.addField(changeKey, "NEW_VALUE: "+newValue, false);
+ }
+
+ });
+
+ eb.setFooter("Audit Log Entry ID: "+ale.getId());
+ eb.setTimestamp(ale.getTimeCreated());
+
+ MessageEmbed mb = eb.build();
+
+ TextChannel sendingChannel = event.getGuild().getTextChannelById(channelIdToSendTo);
+ if(sendingChannel!=null && sendingChannel.canTalk()) {
+ sendingChannel.sendMessageEmbeds(mb).queue();
+ }
+ }
+
+}
diff --git a/src/main/java/org/papertrail/listeners/audit/helper/OnboardingPromptUpdateEventHelper.java b/src/main/java/org/papertrail/listeners/audit/helper/OnboardingPromptUpdateEventHelper.java
new file mode 100644
index 00000000..bf21d7ec
--- /dev/null
+++ b/src/main/java/org/papertrail/listeners/audit/helper/OnboardingPromptUpdateEventHelper.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.AuditLogEntry;
+import net.dv8tion.jda.api.entities.MessageEmbed;
+import net.dv8tion.jda.api.entities.User;
+import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;
+import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
+import org.papertrail.commons.utilities.BooleanFormatter;
+
+import java.awt.Color;
+
+@UtilityClass
+public class OnboardingPromptUpdateEventHelper {
+
+ public static void format(GuildAuditLogEntryCreateEvent event, String channelIdToSendTo) {
+
+ AuditLogEntry ale = event.getEntry();
+
+ EmbedBuilder eb = new EmbedBuilder();
+ eb.setTitle("Audit Log Entry | Onboarding Prompt Update Event");
+
+ User executor = ale.getJDA().getUserById(ale.getUserId());
+ String mentionableExecutor = (executor != null ? executor.getAsMention() : ale.getTargetId());
+
+ eb.setDescription("👤 " + mentionableExecutor + "has made changes to an existing Onboarding Prompt");
+ eb.setColor(Color.YELLOW);
+
+ eb.addField("Action Type", String.valueOf(ale.getType()), true);
+ eb.addField("Target Type", String.valueOf(ale.getTargetType()), true);
+
+ ale.getChanges().forEach((changeKey, changeValue) -> {
+
+ Object oldValue = changeValue.getOldValue();
+ Object newValue = changeValue.getNewValue();
+
+ switch (changeKey){
+ case "single_select":
+ eb.addField("Old Single Selection Mode", BooleanFormatter.formatToYesOrNo(oldValue), false);
+ eb.addField("New Single Selection Mode", BooleanFormatter.formatToYesOrNo(newValue), false);
+ break;
+
+ case "required":
+ eb.addField("Was Required", BooleanFormatter.formatToYesOrNo(oldValue), false);
+ eb.addField("Is Required", BooleanFormatter.formatToYesOrNo(newValue), false);
+ break;
+
+ case "type", "id":
+ break;
+
+ case "title":
+ eb.addField("Old Question Title", String.valueOf(oldValue), false);
+ eb.addField("New Question Title", String.valueOf(newValue), false);
+ break;
+
+ case "options":
+ eb.addField("Question Options", "Review the changed options in Onboarding Settings", false);
+ break;
+
+ case "in_onboarding":
+ eb.addField("Was a Pre-Join Question", BooleanFormatter.formatToYesOrNo(oldValue), false);
+ eb.addField("Is a Pre-Join Question", BooleanFormatter.formatToYesOrNo(newValue), false);
+ break;
+
+ default:
+ eb.addField(changeKey, "OLD_VALUE: "+oldValue, false);
+ eb.addField(changeKey, "NEW_VALUE: "+newValue, false);
+ }
+
+ });
+
+ eb.setFooter("Audit Log Entry ID: "+ale.getId());
+ eb.setTimestamp(ale.getTimeCreated());
+
+ MessageEmbed mb = eb.build();
+
+ TextChannel sendingChannel = event.getGuild().getTextChannelById(channelIdToSendTo);
+ if(sendingChannel!=null && sendingChannel.canTalk()) {
+ sendingChannel.sendMessageEmbeds(mb).queue();
+ }
+ }
+}
From 527399d66908defd6542fe54d16f2fd07e45fadd Mon Sep 17 00:00:00 2001
From: Egg-03 <111327101+eggy03@users.noreply.github.com>
Date: Thu, 5 Feb 2026 14:35:38 +0530
Subject: [PATCH 5/5] build(project): bump project version to `2.5.0`
- update project version from `2.4.0` to `2.5.0` in `pom.xml`
- update `VERSION` constant from `"v2.4.0"` to `"v2.5.0"` in `src/main/java/org/papertrail/commons/constant/ProjectInfo.java`
Signed-off-by: Egg-03 <111327101+eggy03@users.noreply.github.com>
---
pom.xml | 2 +-
src/main/java/org/papertrail/commons/constant/ProjectInfo.java | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/pom.xml b/pom.xml
index d222788a..97bd8993 100644
--- a/pom.xml
+++ b/pom.xml
@@ -6,7 +6,7 @@
org.egg.papertrail
paper-trail-bot
- 2.4.0
+ 2.5.0
PaperTrail
A simple bot for logging all user actions
diff --git a/src/main/java/org/papertrail/commons/constant/ProjectInfo.java b/src/main/java/org/papertrail/commons/constant/ProjectInfo.java
index 9b8cf5fe..86a7addd 100644
--- a/src/main/java/org/papertrail/commons/constant/ProjectInfo.java
+++ b/src/main/java/org/papertrail/commons/constant/ProjectInfo.java
@@ -7,6 +7,6 @@ private ProjectInfo() {
}
public static final String APPNAME = "PaperTrail";
- public static final String VERSION = "v2.4.0";
+ public static final String VERSION = "v2.5.0";
public static final String PROJECT_ISSUE_LINK="https://github.com/eggy03/PaperTrailBot/issues";
}