From 2fc42c217aaa9df3eec212d05b0ee1d6775bd43d Mon Sep 17 00:00:00 2001 From: iamshoXy Date: Wed, 13 Sep 2023 13:58:12 +0200 Subject: [PATCH] PR: Fix issues with both ban commands --- .../src/plugins/ContextMenus/actions/ban.ts | 2 +- .../src/plugins/ContextMenus/actions/mute.ts | 2 +- .../src/plugins/ModActions/commands/BanCmd.ts | 14 +----- .../ModActions/commands/ForcebanCmd.ts | 46 ++++++++++--------- .../plugins/ModActions/functions/banUserId.ts | 4 +- backend/src/plugins/ModActions/types.ts | 42 ++++++++--------- 6 files changed, 51 insertions(+), 59 deletions(-) diff --git a/backend/src/plugins/ContextMenus/actions/ban.ts b/backend/src/plugins/ContextMenus/actions/ban.ts index 259622a6..e8c803d3 100644 --- a/backend/src/plugins/ContextMenus/actions/ban.ts +++ b/backend/src/plugins/ContextMenus/actions/ban.ts @@ -53,7 +53,7 @@ async function banAction( }; const durationMs = duration ? convertDelayStringToMS(duration)! : undefined; - const result = await modactions.banUserId(target, reason, { caseArgs }, durationMs); + const result = await modactions.banUserId(targetMember.id, reason, { caseArgs }, durationMs); if (result.status === "failed") { await interactionToReply .editReply({ content: "Error: Failed to ban user", embeds: [], components: [] }) diff --git a/backend/src/plugins/ContextMenus/actions/mute.ts b/backend/src/plugins/ContextMenus/actions/mute.ts index b0ea8776..dc67c50d 100644 --- a/backend/src/plugins/ContextMenus/actions/mute.ts +++ b/backend/src/plugins/ContextMenus/actions/mute.ts @@ -66,7 +66,7 @@ async function muteAction( const durationMs = duration ? convertDelayStringToMS(duration)! : undefined; try { - const result = await mutes.muteUser(target, durationMs, reason, { caseArgs }); + const result = await mutes.muteUser(targetMember.id, durationMs, reason, { caseArgs }); const messageResultText = result.notifyResult.text ? ` (${result.notifyResult.text})` : ""; const muteMessage = `Muted **${result.case.user_name}** ${ diff --git a/backend/src/plugins/ModActions/commands/BanCmd.ts b/backend/src/plugins/ModActions/commands/BanCmd.ts index 9d32cd10..a334af08 100644 --- a/backend/src/plugins/ModActions/commands/BanCmd.ts +++ b/backend/src/plugins/ModActions/commands/BanCmd.ts @@ -137,19 +137,7 @@ export const BanCmd = modActionsCmd({ return; } } else { - // Ask the mod if we should upgrade to a forceban as the user is not on the server - const reply = await waitForButtonConfirm( - msg.channel, - { content: "User not on server, forceban instead?" }, - { confirmText: "Yes", cancelText: "No", restrictToId: msg.member.id }, - ); - if (!reply) { - sendErrorMessage(pluginData, msg.channel, "User not on server, ban cancelled by moderator"); - lock.unlock(); - return; - } else { - forceban = true; - } + forceban = true; } } diff --git a/backend/src/plugins/ModActions/commands/ForcebanCmd.ts b/backend/src/plugins/ModActions/commands/ForcebanCmd.ts index 4ddef154..2bd0eb98 100644 --- a/backend/src/plugins/ModActions/commands/ForcebanCmd.ts +++ b/backend/src/plugins/ModActions/commands/ForcebanCmd.ts @@ -1,15 +1,14 @@ -import { Snowflake } from "discord.js"; import { commandTypeHelpers as ct } from "../../../commandTypes"; -import { CaseTypes } from "../../../data/CaseTypes"; import { LogType } from "../../../data/LogType"; import { canActOn, hasPermission, sendErrorMessage, sendSuccessMessage } from "../../../pluginUtils"; -import { CasesPlugin } from "../../../plugins/Cases/CasesPlugin"; -import { DAYS, MINUTES, resolveMember, resolveUser } from "../../../utils"; +import { resolveMember, resolveUser } from "../../../utils"; +import { banLock } from "../../../utils/lockNameHelpers"; import { LogsPlugin } from "../../Logs/LogsPlugin"; +import { banUserId } from "../functions/banUserId"; import { formatReasonWithAttachments } from "../functions/formatReasonWithAttachments"; import { ignoreEvent } from "../functions/ignoreEvent"; import { isBanned } from "../functions/isBanned"; -import { IgnoredEventType, modActionsCmd } from "../types"; +import { BanResult, IgnoredEventType, modActionsCmd } from "../types"; const opts = { mod: ct.member({ option: true }), @@ -62,39 +61,44 @@ export const ForcebanCmd = modActionsCmd({ } const reason = formatReasonWithAttachments(args.reason, [...msg.attachments.values()]); + const lock = await pluginData.locks.acquire(banLock(user)); ignoreEvent(pluginData, IgnoredEventType.Ban, user.id); pluginData.state.serverLogs.ignoreLog(LogType.MEMBER_BAN, user.id); + let banResult: BanResult; try { - // FIXME: Use banUserId()? - await pluginData.guild.bans.create(user.id as Snowflake, { - deleteMessageSeconds: (1 * DAYS) / MINUTES, - reason: reason ?? undefined, + const deleteMessageDays = + args["delete-days"] ?? (await pluginData.config.getForMessage(msg)).ban_delete_message_days; + banResult = await banUserId(pluginData, user.id, reason, { + contactMethods: [], + caseArgs: { + modId: mod.id, + ppId: mod.id !== msg.author.id ? msg.author.id : undefined, + }, + deleteMessageDays, + modId: mod.id, }); + if (banResult.status === "failed") { + sendErrorMessage(pluginData, msg.channel, `Failed to ban member: ${banResult.error}`); + lock.unlock(); + return; + } } catch { sendErrorMessage(pluginData, msg.channel, "Failed to forceban member"); + lock.unlock(); return; } - // Create a case - const casesPlugin = pluginData.getPlugin(CasesPlugin); - const createdCase = await casesPlugin.createCase({ - userId: user.id, - modId: mod.id, - type: CaseTypes.Ban, - reason, - ppId: mod.id !== msg.author.id ? msg.author.id : undefined, - }); - // Confirm the action - sendSuccessMessage(pluginData, msg.channel, `Member forcebanned (Case #${createdCase.case_number})`); + sendSuccessMessage(pluginData, msg.channel, `Member forcebanned (Case #${banResult.case.case_number})`); + lock.unlock(); // Log the action pluginData.getPlugin(LogsPlugin).logMemberForceban({ mod, userId: user.id, - caseNumber: createdCase.case_number, + caseNumber: banResult.case.case_number, reason, }); diff --git a/backend/src/plugins/ModActions/functions/banUserId.ts b/backend/src/plugins/ModActions/functions/banUserId.ts index 3f21e23e..e0548688 100644 --- a/backend/src/plugins/ModActions/functions/banUserId.ts +++ b/backend/src/plugins/ModActions/functions/banUserId.ts @@ -42,7 +42,7 @@ export async function banUserId( }; } - reason = reason || (config.default_ban_reason || "No reason specified"); + reason ||= config.default_ban_reason || "No reason specified"; // Attempt to message the user *before* banning them, as doing it after may not be possible const member = await resolveMember(pluginData.client, pluginData.guild, userId); @@ -170,4 +170,4 @@ export async function banUserId( case: createdCase, notifyResult, }; -} \ No newline at end of file +} diff --git a/backend/src/plugins/ModActions/types.ts b/backend/src/plugins/ModActions/types.ts index 4bcb6a02..ace09784 100644 --- a/backend/src/plugins/ModActions/types.ts +++ b/backend/src/plugins/ModActions/types.ts @@ -92,36 +92,36 @@ export interface IIgnoredEvent { export type WarnResult = | { - status: "failed"; - error: string; - } + status: "failed"; + error: string; + } | { - status: "success"; - case: Case; - notifyResult: UserNotificationResult; - }; + status: "success"; + case: Case; + notifyResult: UserNotificationResult; + }; export type KickResult = | { - status: "failed"; - error: string; - } + status: "failed"; + error: string; + } | { - status: "success"; - case: Case; - notifyResult: UserNotificationResult; - }; + status: "success"; + case: Case; + notifyResult: UserNotificationResult; + }; export type BanResult = | { - status: "failed"; - error: string; - } + status: "failed"; + error: string; + } | { - status: "success"; - case: Case; - notifyResult: UserNotificationResult; - }; + status: "success"; + case: Case; + notifyResult: UserNotificationResult; + }; export type WarnMemberNotifyRetryCallback = () => boolean | Promise;