diff --git a/backend/src/plugins/ModActions/commands/massban/actualMassBanCmd.ts b/backend/src/plugins/ModActions/commands/massban/actualMassBanCmd.ts index bdaf59c83..de75a5f65 100644 --- a/backend/src/plugins/ModActions/commands/massban/actualMassBanCmd.ts +++ b/backend/src/plugins/ModActions/commands/massban/actualMassBanCmd.ts @@ -11,7 +11,7 @@ import { isContextInteraction, sendContextResponse, } from "../../../../pluginUtils.js"; -import { DAYS, MINUTES, SECONDS, noop } from "../../../../utils.js"; +import { DAYS, MINUTES, SECONDS, noop, resolveMember } from "../../../../utils.js"; import { CasesPlugin } from "../../../Cases/CasesPlugin.js"; import { LogsPlugin } from "../../../Logs/LogsPlugin.js"; import { handleAttachmentLinkDetectionAndGetRestriction } from "../../functions/attachmentLinkReaction.js"; @@ -44,8 +44,15 @@ export async function actualMassBanCmd( const banReasonWithAttachments = formatReasonWithAttachments(reason, attachments); // Verify we can act on each of the users specified + let fetchedMembers: Map | null = null; + try { + fetchedMembers = await pluginData.guild.members.fetch({ user: userIds as Snowflake[] }); + } catch { + // If bulk fetch fails, fall back to cache-only checks + } + for (const userId of userIds) { - const member = pluginData.guild.members.cache.get(userId as Snowflake); // TODO: Get members on demand? + const member = fetchedMembers?.get(userId) ?? pluginData.guild.members.cache.get(userId as Snowflake); if (member && !canActOn(pluginData, author, member)) { pluginData.state.common.sendErrorMessage(context, "Cannot massban one or more users: insufficient permissions"); return; diff --git a/backend/src/plugins/ModActions/commands/massmute/actualMassMuteCmd.ts b/backend/src/plugins/ModActions/commands/massmute/actualMassMuteCmd.ts index cb3b313ee..8e9ccf06e 100644 --- a/backend/src/plugins/ModActions/commands/massmute/actualMassMuteCmd.ts +++ b/backend/src/plugins/ModActions/commands/massmute/actualMassMuteCmd.ts @@ -3,7 +3,7 @@ import { GuildPluginData } from "vety"; import { LogType } from "../../../../data/LogType.js"; import { logger } from "../../../../logger.js"; import { canActOn, deleteContextResponse, isContextInteraction, sendContextResponse } from "../../../../pluginUtils.js"; -import { noop } from "../../../../utils.js"; +import { noop, resolveMember } from "../../../../utils.js"; import { LogsPlugin } from "../../../Logs/LogsPlugin.js"; import { MutesPlugin } from "../../../Mutes/MutesPlugin.js"; import { handleAttachmentLinkDetectionAndGetRestriction } from "../../functions/attachmentLinkReaction.js"; @@ -35,8 +35,15 @@ export async function actualMassMuteCmd( const muteReasonWithAttachments = formatReasonWithAttachments(reason, attachments); // Verify we can act upon all users + let fetchedMembers: Map | null = null; + try { + fetchedMembers = await pluginData.guild.members.fetch({ user: userIds as Snowflake[] }); + } catch { + // If bulk fetch fails, fall back to cache-only checks + } + for (const userId of userIds) { - const member = pluginData.guild.members.cache.get(userId as Snowflake); + const member = fetchedMembers?.get(userId) ?? pluginData.guild.members.cache.get(userId as Snowflake); if (member && !canActOn(pluginData, author, member)) { pluginData.state.common.sendErrorMessage(context, "Cannot massmute one or more users: insufficient permissions"); return;