summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFuwn <[email protected]>2025-10-23 03:12:27 -0700
committerFuwn <[email protected]>2025-10-23 03:12:27 -0700
commitadf531603fb0f0bf280d844b15a568b3608280c5 (patch)
treed34422e4aa712caa4c5f059537e86a43d593f67d
parentfeat(shared:log): Improve unit logging (diff)
downloadumabotdiscord-adf531603fb0f0bf280d844b15a568b3608280c5.tar.xz
umabotdiscord-adf531603fb0f0bf280d844b15a568b3608280c5.zip
feat(gateway:listeners): Add timeout mirroring
-rw-r--r--packages/gateway/src/constants.ts2
-rw-r--r--packages/gateway/src/listeners/index.ts2
-rw-r--r--packages/gateway/src/listeners/timeoutMirroring.ts66
-rw-r--r--packages/shared/index.ts2
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 = [