From 5f0abfcf3e7f765aababc088839101639007e029 Mon Sep 17 00:00:00 2001 From: Fuwn Date: Thu, 6 Nov 2025 14:35:01 -0800 Subject: feat(gateway:listeners): Add privileged access monitoring --- packages/gateway/src/listeners/index.ts | 2 ++ packages/gateway/src/listeners/roleExclusion.ts | 44 +++++++++++++++++++++++++ 2 files changed, 46 insertions(+) create mode 100644 packages/gateway/src/listeners/roleExclusion.ts diff --git a/packages/gateway/src/listeners/index.ts b/packages/gateway/src/listeners/index.ts index 4bb6843..46ae30c 100644 --- a/packages/gateway/src/listeners/index.ts +++ b/packages/gateway/src/listeners/index.ts @@ -11,6 +11,7 @@ import { handleTimeoutMirroring } from "./timeoutMirroring"; import { handleAutoDeletion } from "./autoDeletion"; import { handleEmojiUsageTracking } from "./emojiUsageTracking"; import { handleBotMessageLogger } from "./botMessageLogger"; +import { handleRoleExclusion } from "./roleExclusion"; // import { handleMediaModeration } from "./mediaModeration"; export const handleListeners = (client: Client) => { @@ -26,5 +27,6 @@ export const handleListeners = (client: Client) => { handleAutoDeletion(client); handleEmojiUsageTracking(client); handleBotMessageLogger(client); + handleRoleExclusion(client); // handleMediaModeration(client); }; diff --git a/packages/gateway/src/listeners/roleExclusion.ts b/packages/gateway/src/listeners/roleExclusion.ts new file mode 100644 index 0000000..b87d260 --- /dev/null +++ b/packages/gateway/src/listeners/roleExclusion.ts @@ -0,0 +1,44 @@ +import { Client, Events } from "discord.js"; +import { CENTRAL_GUILD_ID } from "../constants"; +import { logUnexpectedDiscordAPIError } from "../utilities"; + +const PRIVILEGED_ACCESS_ROLE_ID = "1423213971422580736"; +const REMOVED_FROM_PRIVILEGED_ACCESS_ROLE_ID = "1425706904478289928"; + +export const handleRoleExclusion = (client: Client) => { + client.on(Events.GuildMemberUpdate, async (oldMember, newMember) => { + if (newMember.guild.id !== CENTRAL_GUILD_ID) return; + + const oldRoles = oldMember.roles.cache; + const newRoles = newMember.roles.cache; + const removedRoleAdded = + !oldRoles.has(REMOVED_FROM_PRIVILEGED_ACCESS_ROLE_ID) && + newRoles.has(REMOVED_FROM_PRIVILEGED_ACCESS_ROLE_ID); + const privilegedRoleAdded = + !oldRoles.has(PRIVILEGED_ACCESS_ROLE_ID) && + newRoles.has(PRIVILEGED_ACCESS_ROLE_ID); + + try { + if (removedRoleAdded && newRoles.has(PRIVILEGED_ACCESS_ROLE_ID)) { + const roleToRemove = newMember.guild.roles.cache.get( + PRIVILEGED_ACCESS_ROLE_ID, + ); + + if (roleToRemove) await newMember.roles.remove(roleToRemove); + } + + if ( + privilegedRoleAdded && + newRoles.has(REMOVED_FROM_PRIVILEGED_ACCESS_ROLE_ID) + ) { + const roleToRemove = newMember.guild.roles.cache.get( + PRIVILEGED_ACCESS_ROLE_ID, + ); + + if (roleToRemove) await newMember.roles.remove(roleToRemove); + } + } catch (error) { + logUnexpectedDiscordAPIError(error); + } + }); +}; -- cgit v1.2.3