From 8d0673817afe65f19b631e890b76b2172c27793b Mon Sep 17 00:00:00 2001 From: Ashley Lamont Date: Thu, 15 Feb 2024 18:27:50 +1100 Subject: [PATCH] ok i promise it works now for realsies --- src/baserow-integration.ts | 54 ++++++++++++++++++++++++-------------- src/door-status.ts | 2 -- src/global-context.d.ts | 3 ++- src/index.ts | 3 +++ src/server-icon.ts | 3 +-- 5 files changed, 40 insertions(+), 25 deletions(-) diff --git a/src/baserow-integration.ts b/src/baserow-integration.ts index ecd9950..af43130 100644 --- a/src/baserow-integration.ts +++ b/src/baserow-integration.ts @@ -6,7 +6,7 @@ import { BaserowWebhook, } from "./baserow-types"; import express, { Express, Request } from "express"; -import { Guild, GuildMember, Snowflake } from "discord.js"; +import { GuildMember, Snowflake } from "discord.js"; const baserowData: Map = new Map(); const MEMBER_ROLE_ID = "753524901708693558"; @@ -38,6 +38,11 @@ export async function refreshBaserowData() { // Fetch data from baserow // Store in baserowData // Fire events for onRowCreate, onRowUpdate, onRowDelete as necessary + + // Force update all discord members + await cssaGuild.fetch(); + await cssaGuild.members.fetch(); + const fetchedData: BaserowItem[] = []; let nextUrl: string | null = "https://baserow.cssa.club/api/database/rows/table/511/"; @@ -77,8 +82,6 @@ export async function refreshBaserowData() { } // Drop any members not in the fetched data - const cssaGuild = await discordClient.guilds.fetch(CSSA_SERVER_ID); - if (!cssaGuild) throw new Error("Couldn't fetch CSSA guild data."); const memberRole = await cssaGuild.roles.fetch(MEMBER_ROLE_ID); if (!memberRole) throw new Error("Couldn't get member role."); const members = memberRole.members; @@ -99,7 +102,9 @@ export async function refreshBaserowData() { eventPromises.push(member.roles.remove(memberRole)); } - return Promise.all(eventPromises); + return Promise.all(eventPromises).then(() => { + console.log("Baserow data refreshed."); + }); } export async function attachBaserowWebhookListener(expressApp: Express) { @@ -175,20 +180,22 @@ export async function attachBaserowWebhookListener(expressApp: Express) { class MemberNotFoundError extends Error {} -async function getGuildAndUser( - guildId: string, - rawUsername: string, -): Promise<[Guild, GuildMember]> { +async function getUser(rawUsername: string): Promise { const [username, discriminator] = transformUsername(rawUsername); - const guild = await discordClient.guilds.fetch(guildId); - if (!guild) throw new Error("Couldn't fetch guild data."); - const matchingMembers = await guild.members.fetch({ query: username }); - for (const member of matchingMembers.values()) { + for (const member of cssaGuild.members.cache.values()) { if ( member.user.username === username && member.user.discriminator === discriminator.toString(10) ) - return [guild, member]; + return member; + } + const fetchedMembers = await cssaGuild.members.fetch({ query: username }); + for (const member of fetchedMembers.values()) { + if ( + member.user.username === username && + member.user.discriminator === discriminator.toString(10) + ) + return member; } console.log(`Couldn't find member in guild: ${username}#${discriminator}`); throw new MemberNotFoundError("Couldn't find member in guild: " + username); @@ -199,17 +206,24 @@ export async function performRoleUpdate( roleType: "member" | "lifeMember", operation: "add" | "remove", ) { - const [guild, member] = await getGuildAndUser(CSSA_SERVER_ID, username); - const role = await guild.roles.fetch( - roleType === "member" ? MEMBER_ROLE_ID : LIFE_MEMBER_ROLE_ID, - ); - if (!role) throw new Error("Couldn't get role."); + const member = await getUser(username); + const roleId = roleType === "member" ? MEMBER_ROLE_ID : LIFE_MEMBER_ROLE_ID; + const alreadySatisfied = + operation === "add" + ? member.roles.cache.has(roleId) + : !member.roles.cache.has(roleId); + if (alreadySatisfied) { + console.log( + `Role update not required: ${operation} ${roleType} for ${username}`, + ); + return; + } console.log( `Performing role update: ${operation} ${roleType} for ${username}`, ); await (operation === "add" - ? member.roles.add(role) - : member.roles.remove(role)); + ? member.roles.add(roleId) + : member.roles.remove(roleId)); } export async function onRowCreate(row: BaserowItem) { diff --git a/src/door-status.ts b/src/door-status.ts index f589d77..86e80c3 100644 --- a/src/door-status.ts +++ b/src/door-status.ts @@ -21,8 +21,6 @@ export async function attachDoorServer(app: Express) { ); // Get the channel from the CSSA discord server - const cssaGuild = await discordClient.guilds.fetch("476382037620555776"); - const statusChannel = (await cssaGuild.channels.fetch("1060799214550007849")) ?? undefined; if (statusChannel === undefined) diff --git a/src/global-context.d.ts b/src/global-context.d.ts index 6cc62c8..46a3ee7 100644 --- a/src/global-context.d.ts +++ b/src/global-context.d.ts @@ -1,9 +1,10 @@ /* eslint-disable no-var */ // noinspection ES6ConvertVarToLetConst -import { Client, GuildMember } from "discord.js"; +import { Client, Guild, GuildMember } from "discord.js"; declare global { var discordClient: Client; + var cssaGuild: Guild; var appMaintainers: GuildMember[]; } diff --git a/src/index.ts b/src/index.ts index 95576af..58504d1 100644 --- a/src/index.ts +++ b/src/index.ts @@ -20,6 +20,9 @@ async function main(): Promise { // with any subsequent code using it that the value will exist and be of the correct type. // This means that this line must be executed before any other code that uses globalThis.discordClient. globalThis.discordClient = await initDiscord(); + globalThis.cssaGuild = await discordClient.guilds.fetch( + process.env.CSSA_SERVER!, + ); await registerCommands(); // Initialise the express app and attach the door server diff --git a/src/server-icon.ts b/src/server-icon.ts index 3ccb099..6759c2c 100644 --- a/src/server-icon.ts +++ b/src/server-icon.ts @@ -20,8 +20,7 @@ export function startServerIcon(): void { async function setNewIcon(): Promise { const newIcon = await getNewIcon(); - const cssa = await discordClient.guilds.fetch("476382037620555776"); - await cssa.setIcon(newIcon); + await cssaGuild.setIcon(newIcon); } async function getNewIcon(): Promise {