diff --git a/src/bot/commands/checkin/handlers/checkin-audit.ts b/src/bot/commands/checkin/handlers/checkin-audit.ts index f21ceed..d52f49f 100644 --- a/src/bot/commands/checkin/handlers/checkin-audit.ts +++ b/src/bot/commands/checkin/handlers/checkin-audit.ts @@ -3,7 +3,7 @@ import { registerCommand } from '@commands/registry' import { AUDIT_FLAME_CHANNEL, FLAMEWARDEN_ROLE } from '@config/discord' import { CHECKIN_AUDIT_ID } from '@events/interaction-create/checkin/handlers/audit-modal' import { createCheckinReviewModal, encodeSnowflake, getCustomId } from '@utils/component' -import { getChannel, sendReply } from '@utils/discord' +import { getChannel, getMember, sendReply } from '@utils/discord' import { DiscordBaseError } from '@utils/discord/error' import { log } from '@utils/logger' import { SlashCommandBuilder } from 'discord.js' @@ -32,7 +32,7 @@ registerCommand({ CheckinAudit.assertNotPrivateThread(thread) const threadMsg = await CheckinAudit.getThreadMessage(thread) CheckinAudit.assertThreadMessageSendBy(threadMsg, interaction.client.user.id) - const flamewarden = await interaction.guild.members.fetch(interaction.member.id) + const flamewarden = await getMember(interaction.guild, interaction.member.id) CheckinAudit.assertMember(flamewarden) CheckinAudit.assertMemberHasRole(flamewarden, FLAMEWARDEN_ROLE) diff --git a/src/bot/commands/checkin/validators/checkin-status.ts b/src/bot/commands/checkin/validators/checkin-status.ts index 2a0aae5..1c48614 100644 --- a/src/bot/commands/checkin/validators/checkin-status.ts +++ b/src/bot/commands/checkin/validators/checkin-status.ts @@ -6,7 +6,7 @@ import { CHECKIN_CHANNEL, FLAMEWARDEN_ROLE } from '@config/discord' import { Checkin } from '@events/interaction-create/checkin/validators' import { createEmbed, decodeSnowflakes } from '@utils/component' import { isDateYesterday } from '@utils/date' -import { DiscordAssert } from '@utils/discord' +import { DiscordAssert, getMember } from '@utils/discord' import { DUMMY } from '@utils/placeholder' import { messageLink, PermissionsBitField } from 'discord.js' import { CheckinStatusError } from '../handlers/checkin-status' @@ -45,7 +45,7 @@ export class CheckinStatus extends CheckinStatusMessage { const hasCheckedInToday = Checkin.hasCheckinToday(checkinStreak, checkin) if (checkin && hasCheckedInToday) { - const flamewarden = await guild.members.fetch(checkin.reviewed_by!) + const flamewarden = await getMember(guild, checkin.reviewed_by!) switch (checkin.status as CheckinStatusType) { case 'WAITING': { @@ -95,7 +95,7 @@ export class CheckinStatus extends CheckinStatusMessage { return { content, embed } } - const flamewarden = await guild.members.fetch(checkin.reviewed_by!) + const flamewarden = await getMember(guild, checkin.reviewed_by!) embed = createEmbed( `🕯️ Check-In #${checkin.public_id}`, CheckinStatus.MSG.LastCheckin(guild.name, userDiscordId, checkin, flamewarden), diff --git a/src/bot/events/client-ready/jobs/validators/reset-grinder-roles.ts b/src/bot/events/client-ready/jobs/validators/reset-grinder-roles.ts index 2b23647..fd7f7de 100644 --- a/src/bot/events/client-ready/jobs/validators/reset-grinder-roles.ts +++ b/src/bot/events/client-ready/jobs/validators/reset-grinder-roles.ts @@ -8,7 +8,7 @@ import { FLAMEWARDEN_ROLE, getGrindRoles, GRINDER_ROLE } from '@config/discord' import { GOODBYE_NOTE_BUTTON_ID, ResetGrinderRolesButtonError } from '@events/interaction-create/jobs/handlers/reset-grinder-roles-button' import { decodeSnowflakes, encodeSnowflake, getCustomId } from '@utils/component' import { isDateToday, isDateYesterday } from '@utils/date' -import { DiscordAssert, getChannel, sendAsBot } from '@utils/discord' +import { DiscordAssert, getChannel, getMember, sendAsBot } from '@utils/discord' import { log } from '@utils/logger' import { ActionRowBuilder, ButtonBuilder, ButtonStyle } from 'discord.js' import { ResetGrinderRolesMessage } from '../messages/reset-grinder-roles' @@ -91,6 +91,8 @@ export class ResetGrinderRoles extends ResetGrinderRolesMessage { } static async validateUsers(prisma: PrismaClient, guild: Guild, grindAshesChannel: TextChannel, auditFlameChannel: TextChannel, users: User[]) { + await guild.members.fetch({ withPresences: false }) + for (const user of users) { const checkinStreak = user.checkin_streaks?.[0] if (!checkinStreak) @@ -100,7 +102,7 @@ export class ResetGrinderRoles extends ResetGrinderRolesMessage { if (this.hasValidCheckin(lastCheckin)) continue - const member = await guild.members.fetch(user.discord_id) + const member = await getMember(guild, user.discord_id) await this.removeGrinderRoles(member) await this.breakCheckinStreakAt(prisma, checkinStreak, lastCheckin!) const thread = await this.validateWaitingCheckin(guild, auditFlameChannel, member, user, lastCheckin!) diff --git a/src/bot/events/interaction-create/checkin/handlers/approve-button.ts b/src/bot/events/interaction-create/checkin/handlers/approve-button.ts index 728ea5a..0cb958a 100644 --- a/src/bot/events/interaction-create/checkin/handlers/approve-button.ts +++ b/src/bot/events/interaction-create/checkin/handlers/approve-button.ts @@ -3,7 +3,7 @@ import { FLAMEWARDEN_ROLE } from '@config/discord' import { EVENT_PATH } from '@events/index' import { registerInteractionHandler } from '@events/interaction-create/registry' import { generateCustomId } from '@utils/component' -import { sendReply } from '@utils/discord' +import { getMember, sendReply } from '@utils/discord' import { DiscordBaseError } from '@utils/discord/error' import { getModuleName } from '@utils/io' import { Checkin } from '../validators' @@ -35,7 +35,7 @@ registerInteractionHandler({ const channel = interaction.channel as TextChannel Checkin.assertMissPerms(interaction.client.user, channel) - const flamewarden = await interaction.guild.members.fetch(interaction.member.id) + const flamewarden = await getMember(interaction.guild, interaction.member.id) Checkin.assertMember(flamewarden) Checkin.assertMemberHasRole(flamewarden, FLAMEWARDEN_ROLE) diff --git a/src/bot/events/interaction-create/checkin/handlers/audit-modal.ts b/src/bot/events/interaction-create/checkin/handlers/audit-modal.ts index f33acb3..a9a6d18 100644 --- a/src/bot/events/interaction-create/checkin/handlers/audit-modal.ts +++ b/src/bot/events/interaction-create/checkin/handlers/audit-modal.ts @@ -4,7 +4,7 @@ import { FLAMEWARDEN_ROLE } from '@config/discord' import { EVENT_PATH } from '@events/index' import { registerInteractionHandler } from '@events/interaction-create/registry' import { createEmbed, generateCustomId } from '@utils/component' -import { sendReply } from '@utils/discord' +import { getMember, sendReply } from '@utils/discord' import { DiscordBaseError } from '@utils/discord/error' import { getModuleName } from '@utils/io' import { DUMMY } from '@utils/placeholder' @@ -38,7 +38,7 @@ registerInteractionHandler({ const thread = interaction.channel as ThreadChannel const threadMsg = await CheckinAudit.getThreadMessage(thread) - const flamewarden = await interaction.guild.members.fetch(interaction.member.id) + const flamewarden = await getMember(interaction.guild, interaction.member.id) CheckinAudit.assertMember(flamewarden) CheckinAudit.assertMemberHasRole(flamewarden, FLAMEWARDEN_ROLE) diff --git a/src/bot/events/interaction-create/checkin/handlers/custom-button-modal.ts b/src/bot/events/interaction-create/checkin/handlers/custom-button-modal.ts index b239bf8..67dd20a 100644 --- a/src/bot/events/interaction-create/checkin/handlers/custom-button-modal.ts +++ b/src/bot/events/interaction-create/checkin/handlers/custom-button-modal.ts @@ -4,7 +4,7 @@ import { FLAMEWARDEN_ROLE } from '@config/discord' import { EVENT_PATH } from '@events/index' import { registerInteractionHandler } from '@events/interaction-create/registry' import { generateCustomId } from '@utils/component' -import { sendReply } from '@utils/discord' +import { getMember, sendReply } from '@utils/discord' import { DiscordBaseError } from '@utils/discord/error' import { getModuleName } from '@utils/io' import { Checkin } from '../validators' @@ -36,7 +36,7 @@ registerInteractionHandler({ const channel = interaction.channel as TextChannel Checkin.assertMissPerms(interaction.client.user, channel) - const flamewarden = await interaction.guild.members.fetch(interaction.member.id) + const flamewarden = await getMember(interaction.guild, interaction.member.id) Checkin.assertMember(flamewarden) Checkin.assertMemberHasRole(flamewarden, FLAMEWARDEN_ROLE) diff --git a/src/bot/events/interaction-create/checkin/handlers/custom-button.ts b/src/bot/events/interaction-create/checkin/handlers/custom-button.ts index 62cdfba..c38ba00 100644 --- a/src/bot/events/interaction-create/checkin/handlers/custom-button.ts +++ b/src/bot/events/interaction-create/checkin/handlers/custom-button.ts @@ -3,7 +3,7 @@ import { FLAMEWARDEN_ROLE } from '@config/discord' import { EVENT_PATH } from '@events/index' import { registerInteractionHandler } from '@events/interaction-create/registry' import { createCheckinReviewModal, encodeSnowflake, generateCustomId, getCustomId } from '@utils/component' -import { sendReply } from '@utils/discord' +import { getMember, sendReply } from '@utils/discord' import { DiscordBaseError } from '@utils/discord/error' import { getModuleName } from '@utils/io' import { Checkin } from '../validators' @@ -32,7 +32,7 @@ registerInteractionHandler({ const channel = interaction.channel as TextChannel Checkin.assertMissPerms(interaction.client.user, channel) - const flamewarden = await interaction.guild.members.fetch(interaction.member.id) + const flamewarden = await getMember(interaction.guild, interaction.member.id) Checkin.assertMember(flamewarden) Checkin.assertMemberHasRole(flamewarden, FLAMEWARDEN_ROLE) diff --git a/src/bot/events/interaction-create/checkin/handlers/reject-button.ts b/src/bot/events/interaction-create/checkin/handlers/reject-button.ts index a5db077..55bdf4c 100644 --- a/src/bot/events/interaction-create/checkin/handlers/reject-button.ts +++ b/src/bot/events/interaction-create/checkin/handlers/reject-button.ts @@ -3,7 +3,7 @@ import { FLAMEWARDEN_ROLE } from '@config/discord' import { EVENT_PATH } from '@events/index' import { registerInteractionHandler } from '@events/interaction-create/registry' import { generateCustomId } from '@utils/component' -import { sendReply } from '@utils/discord' +import { getMember, sendReply } from '@utils/discord' import { DiscordBaseError } from '@utils/discord/error' import { getModuleName } from '@utils/io' import { Checkin } from '../validators' @@ -35,7 +35,7 @@ registerInteractionHandler({ const channel = interaction.channel as TextChannel Checkin.assertMissPerms(interaction.client.user, channel) - const flamewarden = await interaction.guild.members.fetch(interaction.member.id) + const flamewarden = await getMember(interaction.guild, interaction.member.id) Checkin.assertMember(flamewarden) Checkin.assertMemberHasRole(flamewarden, FLAMEWARDEN_ROLE) diff --git a/src/bot/events/interaction-create/checkin/validators/index.ts b/src/bot/events/interaction-create/checkin/validators/index.ts index df8ad63..e9ad0fd 100644 --- a/src/bot/events/interaction-create/checkin/validators/index.ts +++ b/src/bot/events/interaction-create/checkin/validators/index.ts @@ -11,7 +11,7 @@ import { AURA_FARMING_CHANNEL, CHECKIN_CHANNEL, GRINDER_ROLE } from '@config/dis import { SubmittedCheckinError } from '@events/message-reaction-add/checkin/handlers/submitted' import { createEmbed, decodeSnowflakes, encodeSnowflake, getCustomId } from '@utils/component' import { isDateToday, isDateYesterday } from '@utils/date' -import { DiscordAssert, getChannel, sendAsBot } from '@utils/discord' +import { DiscordAssert, getChannel, getMember, sendAsBot } from '@utils/discord' import { attachNewGrindRole, getGrindRoleByStreakCount } from '@utils/discord/roles' import { DUMMY } from '@utils/placeholder' import { ActionRowBuilder, ButtonBuilder, ButtonStyle, messageLink, PermissionsBitField } from 'discord.js' @@ -444,7 +444,7 @@ export class Checkin extends CheckinMessage { } static async validateCheckinHandleToUser(guild: Guild, flamewarden: GuildMember, userDiscordId: string, updatedCheckin: CheckinType) { - const member = await guild.members.fetch(userDiscordId) + const member = await getMember(guild, userDiscordId) this.assertMember(member) const hasGrinderRole = this.isMemberHasRole(member, GRINDER_ROLE) diff --git a/src/bot/events/message-reaction-add/checkin/handlers/submitted.ts b/src/bot/events/message-reaction-add/checkin/handlers/submitted.ts index e63cda7..62a9512 100644 --- a/src/bot/events/message-reaction-add/checkin/handlers/submitted.ts +++ b/src/bot/events/message-reaction-add/checkin/handlers/submitted.ts @@ -2,6 +2,7 @@ import { CHECKIN_CHANNEL, FLAMEWARDEN_ROLE } from '@config/discord' import { EVENT_PATH } from '@events/index' import { Checkin } from '@events/interaction-create/checkin/validators' import { registerReactionHandler } from '@events/message-reaction-add/registry' +import { getMember } from '@utils/discord' import { DiscordBaseError } from '@utils/discord/error' import { getModuleName } from '@utils/io' @@ -29,7 +30,7 @@ registerReactionHandler({ await message.fetch() try { - const flamewarden = await guild.members.fetch(user.id) + const flamewarden = await getMember(guild, user.id) const emoji = Checkin.assertEmojis(reaction.emoji.name) Checkin.assertMember(flamewarden) Checkin.assertMemberHasRole(flamewarden, FLAMEWARDEN_ROLE) diff --git a/src/utils/discord/index.ts b/src/utils/discord/index.ts index d58c8a0..65a0b49 100644 --- a/src/utils/discord/index.ts +++ b/src/utils/discord/index.ts @@ -14,6 +14,10 @@ export async function getRole(guild: Guild, id: string): Promise { return guild!.roles.cache.get(id) as Role ?? await guild!.roles.fetch(id) } +export async function getMember(guild: Guild, discordId: string) { + return guild.members.cache.get(discordId) as GuildMember ?? await guild.members.fetch(discordId) +} + export const getMissPerms = (channelPerms: Readonly, requiredPerms: bigint[]): bigint[] => requiredPerms.filter(p => !channelPerms.has(p)) export async function getBot(guild: Guild): Promise {