From 1346a29a1f3f82d19814897352111e26a4108f1a Mon Sep 17 00:00:00 2001 From: Naomi Carrigan Date: Wed, 20 Aug 2025 16:35:01 -0700 Subject: [PATCH] fix: cache user data, do daily role sweep --- src/index.ts | 7 ++++++ src/modules/cacheData.ts | 35 ++++++++++++++++++++++++++++++ src/modules/processUserGuildTag.ts | 5 +++++ 3 files changed, 47 insertions(+) create mode 100644 src/modules/cacheData.ts diff --git a/src/index.ts b/src/index.ts index 0aea2be..9bdc5ca 100644 --- a/src/index.ts +++ b/src/index.ts @@ -7,6 +7,7 @@ import { Client, GatewayIntentBits, Events, Partials } from "discord.js"; import { scheduleJob } from "node-schedule"; import { handleMessageCreate } from "./events/handleMessageCreate.js"; +import { cacheData } from "./modules/cacheData.js"; import { postFreeCodeCampNews, postHackerNews, @@ -35,10 +36,16 @@ const amari: Amari = { amari.discord.once(Events.ClientReady, () => { void logger.log("debug", `Authenticated to Discord as ${amari.discord.user?.username ?? "unknown"}`); + void cacheData(amari); scheduleJob("post news", "0 * * * *", async() => { + await logger.log("debug", "Fetching tech news."); await postFreeCodeCampNews(amari); await postHackerNews(amari); }); + scheduleJob("check guild tags", "0 0 * * *", async() => { + await logger.log("debug", "Auditing guild tags."); + await cacheData(amari); + }); }); amari.discord.on(Events.MessageCreate, (message) => { diff --git a/src/modules/cacheData.ts b/src/modules/cacheData.ts new file mode 100644 index 0000000..e8e67d5 --- /dev/null +++ b/src/modules/cacheData.ts @@ -0,0 +1,35 @@ +/** + * @copyright NHCarrigan + * @license Naomi's Public License + * @author Naomi Carrigan + */ + +import { ids } from "../config/ids.js"; +import { logger } from "../utils/logger.js"; +import { processUserGuildTag } from "./processUserGuildTag.js"; +import type { Amari } from "../interfaces/amari.js"; + +/** + * To run on boot. Loads and caches our home guild members/users. + * @param amari - Amari's instance. + */ +export const cacheData = async(amari: Amari): Promise => { + try { + const guild = amari.discord.guilds.cache.get(ids.guilds.nhcarrigan) + ?? await amari.discord.guilds.fetch(ids.guilds.nhcarrigan).catch(() => { + return null; + }); + if (guild === null) { + throw new Error("Cannot find home guild. Amari will not function."); + } + const members = await guild.members.fetch(); + await logger.log("info", `Cached ${members.size.toString()} guild members.`); + await Promise.all([ ...members.values() ].map(async(member) => { + await processUserGuildTag(amari, member.user); + })); + } catch (error) { + if (error instanceof Error) { + await logger.error("cache data module", error); + } + } +}; diff --git a/src/modules/processUserGuildTag.ts b/src/modules/processUserGuildTag.ts index 6d296a5..789d598 100644 --- a/src/modules/processUserGuildTag.ts +++ b/src/modules/processUserGuildTag.ts @@ -35,6 +35,11 @@ export const processUserGuildTag = async( if (member === null) { return; } + if (user.primaryGuild?.identityEnabled !== true + && member.roles.cache.has(ids.roles.representing)) { + await member.roles.remove(ids.roles.representing); + return; + } if (user.primaryGuild?.identityGuildId === ids.guilds.nhcarrigan && !member.roles.cache.has(ids.roles.representing)) { await member.roles.add(ids.roles.representing);