summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFuwn <[email protected]>2025-10-04 12:21:29 -0700
committerFuwn <[email protected]>2025-10-04 12:21:29 -0700
commitca0e9de3a4dda57415f9a5938891319784e61cf4 (patch)
tree196f40765628a3f39a459b02321c2e77ce51fa34
parentfeat(gateway): Clean and lint (diff)
downloadumabotdiscord-ca0e9de3a4dda57415f9a5938891319784e61cf4.tar.xz
umabotdiscord-ca0e9de3a4dda57415f9a5938891319784e61cf4.zip
feat(gateway): Add multi-guild support to roleplayUmagram and umagramCatchup
-rw-r--r--packages/gateway/src/listeners/clientReady/umagramCatchup.ts148
-rw-r--r--packages/gateway/src/listeners/messageCreate/index.ts3
-rw-r--r--packages/gateway/src/listeners/messageCreate/roleplayUmagram.ts15
3 files changed, 88 insertions, 78 deletions
diff --git a/packages/gateway/src/listeners/clientReady/umagramCatchup.ts b/packages/gateway/src/listeners/clientReady/umagramCatchup.ts
index 13564e6..f6b7870 100644
--- a/packages/gateway/src/listeners/clientReady/umagramCatchup.ts
+++ b/packages/gateway/src/listeners/clientReady/umagramCatchup.ts
@@ -1,88 +1,90 @@
import { Client } from "discord.js";
-import { GUILD_ID } from "../../constants";
-import { ROLEPLAY_UMAGRAM_CHANNEL_ID } from "../constants";
-export const handleUmagramCatchup = async (client: Client) => {
- try {
- const channel = client.channels.cache.get(ROLEPLAY_UMAGRAM_CHANNEL_ID);
-
- if (
- !channel ||
- !channel.isTextBased() ||
- !("guildId" in channel) ||
- channel.guildId !== GUILD_ID
- )
- return;
-
- const processChannelMessages = async (
- targetChannel: any,
- channelName: string,
- ) => {
- let lastMessageId: string | undefined;
- let messageCount = 0;
- let heartCount = 0;
-
- while (true) {
- const messages = await targetChannel.messages.fetch({
- limit: 100,
- before: lastMessageId,
- });
-
- if (messages.size === 0) break;
-
- for (const message of messages.values()) {
- messageCount += 1;
-
- const existingReaction = message.reactions.cache.get("❤️");
-
- if (
- existingReaction &&
- existingReaction.users.cache.has(client.user!.id)
- )
- continue;
-
- try {
- await message.react("❤️");
-
- heartCount += 1;
-
- await new Promise((resolve) => setTimeout(resolve, 100));
- } catch (error) {
- console.error(
- `Failed to heart message ${message.id} in ${channelName}:`,
- error,
- );
- }
- }
+const GUILD_UMAGRAM_CHANNELS = {
+ "1406422617724026901": "1419523288001937458", // Central guild
+ "1423919136974835782": "1423923190953934960", // Roleplay guild
+} as const;
- lastMessageId = messages.last()?.id;
+const processUmagramChannel = async (client: Client, guildId: string, channelId: string) => {
+ const channel = client.channels.cache.get(channelId);
- await new Promise((resolve) => setTimeout(resolve, 500));
- }
+ if (!channel || !channel.isTextBased() || !("guildId" in channel) || channel.guildId !== guildId) return;
+
+ const processChannelMessages = async (
+ targetChannel: any,
+ channelName: string,
+ ) => {
+ let lastMessageId: string | undefined;
+ let messageCount = 0;
+ let heartCount = 0;
+
+ while (true) {
+ const messages = await targetChannel.messages.fetch({
+ limit: 100,
+ before: lastMessageId,
+ });
- return { messageCount, heartCount };
- };
+ if (messages.size === 0) break;
- await processChannelMessages(channel, "Main Channel");
+ for (const message of messages.values()) {
+ messageCount += 1;
- try {
- const activeThreads = await (channel as any).threads?.fetchActive();
- const archivedThreads = await (channel as any).threads?.fetchArchived();
- const allThreads = [
- ...activeThreads.threads.values(),
- ...archivedThreads.threads.values(),
- ];
+ const existingReaction = message.reactions.cache.get("❤️");
+
+ if (
+ existingReaction &&
+ existingReaction.users.cache.has(client.user!.id)
+ )
+ continue;
- for (const thread of allThreads)
try {
- await processChannelMessages(thread, `Thread: ${thread.name}`);
+ await message.react("❤️");
+
+ heartCount += 1;
+
+ await new Promise((resolve) => setTimeout(resolve, 100));
} catch (error) {
- console.error(`Error processing thread ${thread.name}:`, error);
+ console.error(
+ `Failed to heart message ${message.id} in ${channelName}:`,
+ error,
+ );
}
- } catch (error) {
- console.error("Error fetching threads:", error);
+ }
+
+ lastMessageId = messages.last()?.id;
+
+ await new Promise((resolve) => setTimeout(resolve, 500));
}
+
+ return { messageCount, heartCount };
+ };
+
+ await processChannelMessages(channel, `Guild ${guildId} - Main Channel`);
+
+ try {
+ const activeThreads = await (channel as any).threads?.fetchActive();
+ const archivedThreads = await (channel as any).threads?.fetchArchived();
+ const allThreads = [
+ ...activeThreads.threads.values(),
+ ...archivedThreads.threads.values(),
+ ];
+
+ for (const thread of allThreads)
+ try {
+ await processChannelMessages(thread, `Guild ${guildId} - Thread: ${thread.name}`);
+ } catch (error) {
+ console.error(`Error processing thread ${thread.name}:`, error);
+ }
} catch (error) {
- console.error("Error adding hearts to existing messages:", error);
+ console.error("Error fetching threads:", error);
}
};
+
+export const handleUmagramCatchup = async (client: Client) => {
+ try {
+ for (const [guildId, channelId] of Object.entries(GUILD_UMAGRAM_CHANNELS))
+ await processUmagramChannel(client, guildId, channelId);
+ } catch (error) {
+ console.error("Error adding hearts to existing messages:", error);
+ }
+}; \ No newline at end of file
diff --git a/packages/gateway/src/listeners/messageCreate/index.ts b/packages/gateway/src/listeners/messageCreate/index.ts
index 1fb185f..f8da232 100644
--- a/packages/gateway/src/listeners/messageCreate/index.ts
+++ b/packages/gateway/src/listeners/messageCreate/index.ts
@@ -9,11 +9,12 @@ import { handleAICommand } from "./aiCommandHandler";
export const handleMessageCreate = (client: Client) => {
client.on(Events.MessageCreate, async (message: Message) => {
+ await handleRoleplayUmagram(message);
+
if (message.guildId !== GUILD_ID) return;
await Promise.allSettled([
handleIqdbModeration(message),
- handleRoleplayUmagram(message),
// handleArtMediaModeration(message),
handleAnnouncementReaction(message),
handleRoleMentionCooldown(message),
diff --git a/packages/gateway/src/listeners/messageCreate/roleplayUmagram.ts b/packages/gateway/src/listeners/messageCreate/roleplayUmagram.ts
index 31ab60b..9ed6e2a 100644
--- a/packages/gateway/src/listeners/messageCreate/roleplayUmagram.ts
+++ b/packages/gateway/src/listeners/messageCreate/roleplayUmagram.ts
@@ -1,11 +1,18 @@
import { Message } from "discord.js";
-import { ROLEPLAY_UMAGRAM_CHANNEL_ID } from "../constants";
+
+const GUILD_UMAGRAM_CHANNELS = {
+ "1406422617724026901": "1419523288001937458", // Central guild
+ "1423919136974835782": "1423923190953934960", // Roleplay guild
+} as const;
export const handleRoleplayUmagram = async (message: Message) => {
- const isMainChannel = message.channelId === ROLEPLAY_UMAGRAM_CHANNEL_ID;
+ if (!message.guildId || !(message.guildId in GUILD_UMAGRAM_CHANNELS)) return;
+
+ const umagramChannelId = GUILD_UMAGRAM_CHANNELS[message.guildId as keyof typeof GUILD_UMAGRAM_CHANNELS];
+ const isMainChannel = message.channelId === umagramChannelId;
const isThreadInChannel =
message.channel?.isThread() &&
- message.channel.parentId === ROLEPLAY_UMAGRAM_CHANNEL_ID;
+ message.channel.parentId === umagramChannelId;
if (!isMainChannel && !isThreadInChannel) return;
@@ -27,7 +34,7 @@ export const handleRoleplayUmagram = async (message: Message) => {
await message.delete();
const errorMessage = await (message.channel as any).send(
- `${message.author}, to participate in <#${ROLEPLAY_UMAGRAM_CHANNEL_ID}>, you can either:\n\n- **Post**: Send a message with both a brief caption **and** an image attachment\n- **Reply**: Reply to someone else's post (no image needed)\n - Reply with a thread (suggested)\n - Reply directly with a message\n\nThis message will be deleted in 30 seconds.`,
+ `${message.author}, to participate in <#${umagramChannelId}>, you can either:\n\n- **Post**: Send a message with both a brief caption **and** an image attachment\n- **Reply**: Reply to someone else's post (no image needed)\n - Reply with a thread (suggested)\n - Reply directly with a message\n\nThis message will be deleted in 30 seconds.`,
);
setTimeout(async () => {