From 4611b13465cd7cdcafaae433657405c22c537ac4 Mon Sep 17 00:00:00 2001 From: Naomi Carrigan Date: Wed, 20 Aug 2025 16:09:37 -0700 Subject: [PATCH] feat: grant role when user applies our tag --- package.json | 2 +- pnpm-lock.yaml | 20 ++++++------ src/config/ids.ts | 6 +++- src/index.ts | 5 +++ src/modules/processUserGuildTag.ts | 51 ++++++++++++++++++++++++++++++ 5 files changed, 72 insertions(+), 12 deletions(-) create mode 100644 src/modules/processUserGuildTag.ts diff --git a/package.json b/package.json index 458256a..0b34bf7 100644 --- a/package.json +++ b/package.json @@ -24,7 +24,7 @@ }, "dependencies": { "@nhcarrigan/logger": "1.0.0", - "discord.js": "14.21.0", + "discord.js": "14.22.0", "fastify": "5.5.0", "node-schedule": "2.1.1", "rss-parser": "3.13.0" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8f10e25..27fc5f8 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -12,8 +12,8 @@ importers: specifier: 1.0.0 version: 1.0.0 discord.js: - specifier: 14.21.0 - version: 14.21.0 + specifier: 14.22.0 + version: 14.22.0 fastify: specifier: 5.5.0 version: 5.5.0 @@ -69,8 +69,8 @@ packages: resolution: {integrity: sha512-5cnX+tASiPCqCWtFcFslxBVUaCetB0thvM/JyavhbXInP1HJIEU+Qv/zMrnuwSsX3yWH2lVXNJZeDK3EiP4HHg==} engines: {node: '>=16.11.0'} - '@discordjs/rest@2.5.1': - resolution: {integrity: sha512-Tg9840IneBcbrAjcGaQzHUJWFNq1MMWZjTdjJ0WS/89IffaNKc++iOvffucPxQTF/gviO9+9r8kEPea1X5J2Dw==} + '@discordjs/rest@2.6.0': + resolution: {integrity: sha512-RDYrhmpB7mTvmCKcpj+pc5k7POKszS4E2O9TYc+U+Y4iaCP+r910QdO43qmpOja8LRr1RJ0b3U+CqVsnPqzf4w==} engines: {node: '>=18'} '@discordjs/util@1.1.1': @@ -930,8 +930,8 @@ packages: discord-api-types@0.38.20: resolution: {integrity: sha512-wJSmFFi8eoFL/jIosUQLoXeCv7YK+l7joKmFCsnkx7HWSFt5xScNQdhvILLxC0oU6J5bK0ppR7GZ1d4NJScSNQ==} - discord.js@14.21.0: - resolution: {integrity: sha512-U5w41cEmcnSfwKYlLv5RJjB8Joa+QJyRwIJz5i/eg+v2Qvv6EYpCRhN9I2Rlf0900LuqSDg8edakUATrDZQncQ==} + discord.js@14.22.0: + resolution: {integrity: sha512-IDSeDdWSEA4DoOyspekbetcFKkEonJO09cxR+kqQQlTWd5CTm/3Z48I4Te+EL8uxn52s718FZ0rI2dLxRkTpwg==} engines: {node: '>=18'} doctrine@2.1.0: @@ -2270,7 +2270,7 @@ snapshots: dependencies: discord-api-types: 0.38.20 - '@discordjs/rest@2.5.1': + '@discordjs/rest@2.6.0': dependencies: '@discordjs/collection': 2.1.1 '@discordjs/util': 1.1.1 @@ -2287,7 +2287,7 @@ snapshots: '@discordjs/ws@1.2.3': dependencies: '@discordjs/collection': 2.1.1 - '@discordjs/rest': 2.5.1 + '@discordjs/rest': 2.6.0 '@discordjs/util': 1.1.1 '@sapphire/async-queue': 1.5.5 '@types/ws': 8.18.1 @@ -3136,12 +3136,12 @@ snapshots: discord-api-types@0.38.20: {} - discord.js@14.21.0: + discord.js@14.22.0: dependencies: '@discordjs/builders': 1.11.3 '@discordjs/collection': 1.5.3 '@discordjs/formatters': 0.6.1 - '@discordjs/rest': 2.5.1 + '@discordjs/rest': 2.6.0 '@discordjs/util': 1.1.1 '@discordjs/ws': 1.2.3 '@sapphire/snowflake': 3.5.3 diff --git a/src/config/ids.ts b/src/config/ids.ts index 2bebb4e..0514f74 100644 --- a/src/config/ids.ts +++ b/src/config/ids.ts @@ -11,8 +11,12 @@ export const ids = { news: "1407804798677418198", resumeReviewForum: "1407807555266154496", }, + guilds: { + nhcarrigan: "1354624415861833870", + }, roles: { - nhcarrigan: "1355033209037127771", + nhcarrigan: "1355033209037127771", + representing: "1407861842847469598", }, tags: { goal: { diff --git a/src/index.ts b/src/index.ts index e744839..0aea2be 100644 --- a/src/index.ts +++ b/src/index.ts @@ -11,6 +11,7 @@ import { postFreeCodeCampNews, postHackerNews, } from "./modules/postNews.js"; +import { processUserGuildTag } from "./modules/processUserGuildTag.js"; import { respondToDm } from "./modules/respondToDm.js"; import { instantiateServer } from "./server/serve.js"; import { logger } from "./utils/logger.js"; @@ -54,5 +55,9 @@ amari.discord.on(Events.InteractionCreate, (interaction) => { } }); +amari.discord.on(Events.UserUpdate, (_oldUser, updatedUser) => { + void processUserGuildTag(amari, updatedUser); +}); + await amari.discord.login(process.env.BOT_TOKEN); instantiateServer(); diff --git a/src/modules/processUserGuildTag.ts b/src/modules/processUserGuildTag.ts new file mode 100644 index 0000000..6d296a5 --- /dev/null +++ b/src/modules/processUserGuildTag.ts @@ -0,0 +1,51 @@ +/** + * @copyright NHCarrigan + * @license Naomi's Public License + * @author Naomi Carrigan + */ + +import { ids } from "../config/ids.js"; +import { logger } from "../utils/logger.js"; +import type { Amari } from "../interfaces/amari.js"; +import type { User } from "discord.js"; + +/** + * If the user has our guild tag, and does not have the role for + * it, give them the role. + * @param amari - Amari's instance. + * @param user - The user payload from Discord. + */ +// eslint-disable-next-line complexity -- I don't wanna refactor right now. +export const processUserGuildTag = async( + amari: Amari, + user: User, +): 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) { + return; + } + const member = guild.members.cache.get(user.id) + ?? await guild.members.fetch(user.id).catch(() => { + return null; + }); + if (member === null) { + return; + } + if (user.primaryGuild?.identityGuildId === ids.guilds.nhcarrigan + && !member.roles.cache.has(ids.roles.representing)) { + await member.roles.add(ids.roles.representing); + } + if (user.primaryGuild?.identityGuildId !== ids.guilds.nhcarrigan + && member.roles.cache.has(ids.roles.representing)) { + await member.roles.remove(ids.roles.representing); + } + } catch (error) { + if (error instanceof Error) { + await logger.error("process user guild tag module", error); + } + } +};