diff options
| author | Fuwn <[email protected]> | 2025-10-23 03:12:27 -0700 |
|---|---|---|
| committer | Fuwn <[email protected]> | 2025-10-23 03:12:27 -0700 |
| commit | adf531603fb0f0bf280d844b15a568b3608280c5 (patch) | |
| tree | d34422e4aa712caa4c5f059537e86a43d593f67d | |
| parent | feat(shared:log): Improve unit logging (diff) | |
| download | umabotdiscord-adf531603fb0f0bf280d844b15a568b3608280c5.tar.xz umabotdiscord-adf531603fb0f0bf280d844b15a568b3608280c5.zip | |
feat(gateway:listeners): Add timeout mirroring
| -rw-r--r-- | packages/gateway/src/constants.ts | 2 | ||||
| -rw-r--r-- | packages/gateway/src/listeners/index.ts | 2 | ||||
| -rw-r--r-- | packages/gateway/src/listeners/timeoutMirroring.ts | 66 | ||||
| -rw-r--r-- | packages/shared/index.ts | 2 |
4 files changed, 72 insertions, 0 deletions
diff --git a/packages/gateway/src/constants.ts b/packages/gateway/src/constants.ts index 64a17ff..b8680e0 100644 --- a/packages/gateway/src/constants.ts +++ b/packages/gateway/src/constants.ts @@ -39,6 +39,8 @@ export { DISCORD_APPLICATION_COMMAND_OPTION_TYPES, DISCORD_INTERACTION_CONTEXTS, CENTRAL_SERVER_STAFF_ANNOUNCEMENTS_CHANNEL_ID, + CENTRAL_SERVER_NAME, + ROLEPLAY_SERVER_NAME, } from "../../shared"; export const UMA_PERSONAS = [ diff --git a/packages/gateway/src/listeners/index.ts b/packages/gateway/src/listeners/index.ts index 044f10d..76ffb42 100644 --- a/packages/gateway/src/listeners/index.ts +++ b/packages/gateway/src/listeners/index.ts @@ -6,6 +6,7 @@ import { handleMessageDeletion } from "./messageDeletion"; import { handleMessageEdit } from "./messageEdit"; import { handleClientReady } from "./clientReady"; import { handleMemberJoin } from "./memberJoin"; +import { handleTimeoutMirroring } from "./timeoutMirroring"; // import { handleMediaModeration } from "./mediaModeration"; export const handleListeners = (client: Client) => { @@ -16,5 +17,6 @@ export const handleListeners = (client: Client) => { handleMessageDeletion(client); handleMessageEdit(client); handleMemberJoin(client); + handleTimeoutMirroring(client); // handleMediaModeration(client); }; diff --git a/packages/gateway/src/listeners/timeoutMirroring.ts b/packages/gateway/src/listeners/timeoutMirroring.ts new file mode 100644 index 0000000..9d32723 --- /dev/null +++ b/packages/gateway/src/listeners/timeoutMirroring.ts @@ -0,0 +1,66 @@ +import { Client, Events, GuildMember } from "discord.js"; +import { + CENTRAL_GUILD_ID, + CENTRAL_SERVER_NAME, + ROLEPLAY_GUILD_ID, + ROLEPLAY_SERVER_NAME, +} from "../constants"; +import { logUnexpectedDiscordAPIError } from "../utilities"; +import { logUnexpectedDiscordAPIResult } from "../../../shared/log"; + +export const handleTimeoutMirroring = (client: Client) => { + client.on( + Events.GuildMemberUpdate, + async (oldMember, newMember: GuildMember) => { + const oldTimeout = oldMember?.communicationDisabledUntilTimestamp; + const newTimeout = newMember.communicationDisabledUntilTimestamp; + + if (oldTimeout === newTimeout) return; + + if ( + newMember.guild.id !== CENTRAL_GUILD_ID && + newMember.guild.id !== ROLEPLAY_GUILD_ID + ) + return; + + const isTimedOut = newTimeout && newTimeout > Date.now(); + const sourceGuildId = newMember.guild.id; + const targetGuildId = + sourceGuildId === CENTRAL_GUILD_ID + ? ROLEPLAY_GUILD_ID + : CENTRAL_GUILD_ID; + + try { + const targetGuild = client.guilds.cache.get(targetGuildId); + + if (!targetGuild) { + logUnexpectedDiscordAPIResult( + `Target guild ${targetGuildId} not found in cache`, + ); + + return; + } + + const memberInTargetGuild = await targetGuild.members + .fetch(newMember.id) + .catch(() => null); + + if (!memberInTargetGuild) return; + + if (isTimedOut) { + const timeoutDuration = newTimeout - Date.now(); + const timeoutReason = `Mirrored time out status application from ${sourceGuildId === CENTRAL_GUILD_ID ? CENTRAL_SERVER_NAME : ROLEPLAY_SERVER_NAME}`; + + await memberInTargetGuild.timeout(timeoutDuration, timeoutReason); + } else { + await memberInTargetGuild.timeout( + null, + `Mirrored time out status removal from ${sourceGuildId === CENTRAL_GUILD_ID ? CENTRAL_SERVER_NAME : ROLEPLAY_SERVER_NAME}`, + ); + } + } catch (error) { + logUnexpectedDiscordAPIError(error); + } + }, + ); +}; diff --git a/packages/shared/index.ts b/packages/shared/index.ts index 2c7be88..1b0df5e 100644 --- a/packages/shared/index.ts +++ b/packages/shared/index.ts @@ -40,6 +40,8 @@ export const CENTRAL_STAFF_ROLES = [ CENTRAL_ADMINISTRATOR_ROLE_ID, CENTRAL_MODERATOR_ROLE_ID, ] as const; +export const CENTRAL_SERVER_NAME = "okbuddyumamusume"; +export const ROLEPLAY_SERVER_NAME = "Tracen Academy"; export const CENTRAL_PRIVILEGED_ACCESS_ROLE_ID = "1425706904478289928"; export const COLOR_ROLE_IDS = [ |