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"; }