diff --git a/backend/src/RecoverablePluginError.ts b/backend/src/RecoverablePluginError.ts index d589f0f0..0a63ed78 100644 --- a/backend/src/RecoverablePluginError.ts +++ b/backend/src/RecoverablePluginError.ts @@ -6,6 +6,7 @@ export enum ERRORS { INVALID_EMOJI, NO_USER_NOTIFICATION_CHANNEL, INVALID_USER_NOTIFICATION_CHANNEL, + INVALID_USER, } export const RECOVERABLE_PLUGIN_ERROR_MESSAGES = { @@ -14,6 +15,7 @@ export const RECOVERABLE_PLUGIN_ERROR_MESSAGES = { [ERRORS.INVALID_EMOJI]: "Invalid emoji", [ERRORS.NO_USER_NOTIFICATION_CHANNEL]: "No user notify channel specified", [ERRORS.INVALID_USER_NOTIFICATION_CHANNEL]: "Invalid user notify channel specified", + [ERRORS.INVALID_USER]: "Invalid user", }; export class RecoverablePluginError extends Error { diff --git a/backend/src/plugins/Cases/functions/createCaseNote.ts b/backend/src/plugins/Cases/functions/createCaseNote.ts index ecea600e..e62f3d05 100644 --- a/backend/src/plugins/Cases/functions/createCaseNote.ts +++ b/backend/src/plugins/Cases/functions/createCaseNote.ts @@ -12,6 +12,10 @@ export async function createCaseNote(pluginData: PluginData, ar } const mod = await resolveUser(pluginData.client, args.modId); + if (!mod) { + throw new RecoverablePluginError(ERRORS.INVALID_USER); + } + const modName = `${mod.username}#${mod.discriminator}`; let body = args.body; diff --git a/backend/src/plugins/ModActions/commands/UnmuteCmd.ts b/backend/src/plugins/ModActions/commands/UnmuteCmd.ts index 695fef8c..716ce3f1 100644 --- a/backend/src/plugins/ModActions/commands/UnmuteCmd.ts +++ b/backend/src/plugins/ModActions/commands/UnmuteCmd.ts @@ -35,6 +35,7 @@ export const UnmuteCmd = modActionsCommand({ async run({ pluginData, message: msg, args }) { const user = await resolveUser(pluginData.client, args.user); if (!user) return sendErrorMessage(pluginData, msg.channel, `User not found`); + const memberToUnmute = await resolveMember(pluginData.client, pluginData.guild, user.id); const mutesPlugin = pluginData.getPlugin(MutesPlugin); const hasMuteRole = memberToUnmute && mutesPlugin.hasMutedRole(memberToUnmute); diff --git a/backend/src/plugins/ModActions/functions/banUserId.ts b/backend/src/plugins/ModActions/functions/banUserId.ts index 0f3bfdd2..5d6d615f 100644 --- a/backend/src/plugins/ModActions/functions/banUserId.ts +++ b/backend/src/plugins/ModActions/functions/banUserId.ts @@ -20,6 +20,12 @@ export async function banUserId( ): Promise { const config = pluginData.config.get(); const user = await resolveUser(pluginData.client, userId); + if (!user) { + return { + status: "failed", + error: "Invalid user", + }; + } // Attempt to message the user *before* banning them, as doing it after may not be possible let notifyResult: UserNotificationResult = { method: null, success: true }; diff --git a/backend/src/plugins/Mutes/functions/muteUser.ts b/backend/src/plugins/Mutes/functions/muteUser.ts index 4989b7ac..46126656 100644 --- a/backend/src/plugins/Mutes/functions/muteUser.ts +++ b/backend/src/plugins/Mutes/functions/muteUser.ts @@ -41,6 +41,11 @@ export async function muteUser( } const user = await resolveUser(pluginData.client, userId); + if (!user) { + lock.unlock(); + throw new RecoverablePluginError(ERRORS.INVALID_USER); + } + const member = await resolveMember(pluginData.client, pluginData.guild, user.id); // Grab the fresh member so we don't have stale role info const config = pluginData.config.getMatchingConfig({ member, userId }); diff --git a/backend/src/utils.ts b/backend/src/utils.ts index 3f6c5ef3..af4c96f7 100644 --- a/backend/src/utils.ts +++ b/backend/src/utils.ts @@ -972,8 +972,7 @@ export function resolveUserId(bot: Client, value: string) { } // Just a user ID? - const idMatch = value.match(/^\d+$/); - if (idMatch) { + if (isValidSnowflake(value)) { return value; } @@ -1000,12 +999,12 @@ export async function resolveUser(bot, value) { return new UnknownUser(); } - // If we have the user cached, return that directly const userId = resolveUserId(bot, value); if (!userId) { - return new UnknownUser({ id: userId }); + return null; } + // If we have the user cached, return that directly if (bot.users.has(userId)) { return bot.users.get(userId); }