import type { GuildMemberResponse } from "@purrkit/types"; import fs from "node:fs"; import { DISCORD_GUILD_ID } from "./constants"; import { rest } from "./lib/rest"; import { db, tickets } from "./old-db"; const neededUsers = await db .select({ subjectId: tickets.authorId, closerId: tickets.closedBy, }) .from(tickets) .execute(); const activeUserIds = new Set(); for (const row of neededUsers) { if (row.subjectId) activeUserIds.add(row.subjectId); if (row.closerId) activeUserIds.add(row.closerId); } console.log(`found ${activeUserIds.size} needed user ids`); let lastUserId: string | undefined; const fetchedMembers: GuildMemberResponse[] = []; while (true) { const response = await rest.guilds(DISCORD_GUILD_ID).members.get({ query: { limit: 1000, after: lastUserId ? Number(lastUserId) : undefined, }, }); if (!response.ok || response.data.length === 0) { console.log(JSON.stringify(response.data)); break; } lastUserId = response.data[response.data.length - 1]!.user.id; fs.writeFileSync(`members/members.${lastUserId}.json`, JSON.stringify(response.data)); fetchedMembers.push(...response.data); console.log( `fetched ${response.data.length} members page (total ${fetchedMembers.length + response.data.length})`, ); if (response.data.length < 1000) break; } fs.writeFileSync(`members/all-members.json`, JSON.stringify(fetchedMembers)); const missingUsers = new Set(activeUserIds); for (const member of fetchedMembers) missingUsers.delete(member.user.id); missingUsers.delete("system"); missingUsers.delete("reporter"); missingUsers.delete("0"); missingUsers.delete("1782593884"); console.log(`missing ${missingUsers.size} users`); fs.writeFileSync(`members/missing-users.json`, JSON.stringify(Array.from(missingUsers)));