From 9f4999b89b6d19906b7993e89bccb5acd0cb75a9 Mon Sep 17 00:00:00 2001 From: sdehaarte Date: Wed, 11 Jun 2025 20:06:43 -0400 Subject: [PATCH] Feature Reaction Role Logs. Adds logging functionality for reaction roles. This helps track when users add or remove reaction roles. --- src/actions/reactionRole.ts | 7 +++++++ src/builders/embeds.ts | 37 +++++++++++++++++++++++++++++++++++++ src/builders/messages.ts | 10 ++++++++++ 3 files changed, 54 insertions(+) diff --git a/src/actions/reactionRole.ts b/src/actions/reactionRole.ts index 80daaad..f947bdf 100644 --- a/src/actions/reactionRole.ts +++ b/src/actions/reactionRole.ts @@ -4,6 +4,8 @@ import {opendiscord, api, utilities} from "../index" import * as discord from "discord.js" +const generalConfig = opendiscord.configs.get("opendiscord:general") + export const registerActions = async () => { opendiscord.actions.add(new api.ODAction("opendiscord:reaction-role")) opendiscord.actions.get("opendiscord:reaction-role").workers.add([ @@ -79,6 +81,11 @@ export const registerActions = async () => { //update instance & finish event instance.result = result + + if (generalConfig.data.system.logs.enabled && generalConfig.data.system.messages.roleAdding.logs){ + const logChannel = opendiscord.posts.get("opendiscord:logs") + if (logChannel) { logChannel.send( await opendiscord.builders.messages.getSafe("opendiscord:reaction-role-logs").build(source,{guild,user,role,result}))}} + await opendiscord.events.get("afterRolesUpdated").emit([user,role]) }), new api.ODWorker("opendiscord:logs",0,(instance,params,source,cancel) => { diff --git a/src/builders/embeds.ts b/src/builders/embeds.ts index f06dde2..9ff53b4 100644 --- a/src/builders/embeds.ts +++ b/src/builders/embeds.ts @@ -1107,8 +1107,45 @@ const roleEmbeds = () => { else instance.setDescription(lang.getTranslation("actions.descriptions.rolesEmpty")) }) ) + + //REACTION ROLE LOGS + embeds.add(new api.ODEmbed("opendiscord:reaction-role-logs")) + embeds.get("opendiscord:reaction-role-logs")!.workers.add( + new api.ODWorker("opendiscord:reaction-role-logs",0,async (instance,params,source) => { + const {user,result} = params + + const newResult = result + .filter(r => r.action != null && r.role?.id) + .sort((a, b) => { + if (a.action === "added" && b.action === "removed") return -1; + if (a.action === "removed" && b.action === "added") return 1; + return 0; + }) + .map(r => { + return (r.action === "added") + ? `🟢${lang.getTranslation("params.uppercase.added")} ${discord.roleMention(r.role.id)}` + : `🔴 ${lang.getTranslation("params.uppercase.removed")} ${discord.roleMention(r.role.id)}` + }) + + let baseDescription = lang.getTranslationWithParams("actions.logs.roleLog", [discord.userMention(user.id)]) + if (!baseDescription || baseDescription === "null") { + baseDescription = `Roles updated for ${discord.userMention(user.id)}` + } + + const fullDescription = (newResult.length > 0) ? `${baseDescription}\n\n${newResult.join("\n")}` : `${baseDescription}\n\n${lang.getTranslation("actions.descriptions.rolesEmpty")}` + + instance.setColor(generalConfig.data.mainColor) + instance.setTitle(utilities.emojiTitle("📋", lang.getTranslation("actions.titles.roles"))) + instance.setThumbnail(user.displayAvatarURL()) + instance.setAuthor(user.displayName, user.displayAvatarURL()) + instance.setTimestamp(new Date()) + instance.setDescription(fullDescription) + }) + ) } +export default roleEmbeds + const clearEmbeds = () => { //CLEAR VERIFY MESSAGE embeds.add(new api.ODEmbed("opendiscord:clear-verify-message")) diff --git a/src/builders/messages.ts b/src/builders/messages.ts index 3b1531f..b618b0d 100644 --- a/src/builders/messages.ts +++ b/src/builders/messages.ts @@ -964,6 +964,16 @@ const roleMessages = () => { instance.setEphemeral(true) }) ) + + //REACTION ROLE LOGS + messages.add(new api.ODMessage("opendiscord:reaction-role-logs")) + messages.get("opendiscord:reaction-role-logs")!.workers.add( + new api.ODWorker("opendiscord:reaction-role-logs",0,async(instance,params,source) => { + const {guild,user,role,result} = params + const embed = await embeds.getSafe("opendiscord:reaction-role-logs").build(source,{guild,user,role,result}) + instance.addEmbed(embed) + }) + ) } const clearMessages = () => {