From 903a2369c8e5cd41941968b80533f12ad3fe5ba6 Mon Sep 17 00:00:00 2001 From: Nils <7890309+DarkView@users.noreply.github.com> Date: Wed, 28 Apr 2021 21:42:54 +0200 Subject: [PATCH] Allow automod to issue tempbans (#189) --- backend/src/plugins/Automod/actions/ban.ts | 29 ++++++++++++++----- .../plugins/ModActions/ModActionsPlugin.ts | 4 +-- .../src/plugins/ModActions/commands/BanCmd.ts | 7 +---- .../plugins/ModActions/functions/banUserId.ts | 10 +++++++ backend/src/plugins/ModActions/types.ts | 1 + 5 files changed, 36 insertions(+), 15 deletions(-) diff --git a/backend/src/plugins/Automod/actions/ban.ts b/backend/src/plugins/Automod/actions/ban.ts index 36a2800f..ae2f0292 100644 --- a/backend/src/plugins/Automod/actions/ban.ts +++ b/backend/src/plugins/Automod/actions/ban.ts @@ -1,7 +1,15 @@ import * as t from "io-ts"; import { automodAction } from "../helpers"; import { LogType } from "../../../data/LogType"; -import { asyncMap, nonNullish, resolveMember, tNullable, unique } from "../../../utils"; +import { + asyncMap, + convertDelayStringToMS, + nonNullish, + resolveMember, + tDelayString, + tNullable, + unique, +} from "../../../utils"; import { resolveActionContactMethods } from "../functions/resolveActionContactMethods"; import { ModActionsPlugin } from "../../ModActions/ModActionsPlugin"; import { CaseArgs } from "../../Cases/types"; @@ -9,6 +17,7 @@ import { CaseArgs } from "../../Cases/types"; export const BanAction = automodAction({ configType: t.type({ reason: tNullable(t.string), + duration: tNullable(tDelayString), notify: tNullable(t.string), notifyChannel: tNullable(t.string), deleteMessageDays: tNullable(t.number), @@ -21,6 +30,7 @@ export const BanAction = automodAction({ async apply({ pluginData, contexts, actionConfig, matchResult }) { const reason = actionConfig.reason || "Kicked automatically"; + const duration = actionConfig.duration ? convertDelayStringToMS(actionConfig.duration)! : undefined; const contactMethods = actionConfig.notify ? resolveActionContactMethods(pluginData, actionConfig) : undefined; const deleteMessageDays = actionConfig.deleteMessageDays || undefined; @@ -35,12 +45,17 @@ export const BanAction = automodAction({ const modActions = pluginData.getPlugin(ModActionsPlugin); for (const userId of userIdsToBan) { - await modActions.banUserId(userId, reason, { - contactMethods, - caseArgs, - deleteMessageDays, - isAutomodAction: true, - }); + await modActions.banUserId( + userId, + reason, + { + contactMethods, + caseArgs, + deleteMessageDays, + isAutomodAction: true, + }, + duration, + ); } }, }); diff --git a/backend/src/plugins/ModActions/ModActionsPlugin.ts b/backend/src/plugins/ModActions/ModActionsPlugin.ts index 2d583e06..a5660825 100644 --- a/backend/src/plugins/ModActions/ModActionsPlugin.ts +++ b/backend/src/plugins/ModActions/ModActionsPlugin.ts @@ -166,8 +166,8 @@ export const ModActionsPlugin = zeppelinGuildPlugin()("mod }, banUserId(pluginData) { - return (userId: string, reason?: string, banOptions?: BanOptions) => { - banUserId(pluginData, userId, reason, banOptions); + return (userId: string, reason?: string, banOptions?: BanOptions, banTime?: number) => { + banUserId(pluginData, userId, reason, banOptions, banTime); }; }, diff --git a/backend/src/plugins/ModActions/commands/BanCmd.ts b/backend/src/plugins/ModActions/commands/BanCmd.ts index f42b426a..8cc73d4c 100644 --- a/backend/src/plugins/ModActions/commands/BanCmd.ts +++ b/backend/src/plugins/ModActions/commands/BanCmd.ts @@ -172,6 +172,7 @@ export const BanCmd = modActionsCmd({ ppId: mod.id !== msg.author.id ? msg.author.id : undefined, }, deleteMessageDays, + modId: mod.id, }, time, ); @@ -184,12 +185,6 @@ export const BanCmd = modActionsCmd({ let forTime = ""; if (time && time > 0) { - if (existingTempban) { - pluginData.state.tempbans.updateExpiryTime(user.id, time, mod.id); - } else { - pluginData.state.tempbans.addTempban(user.id, time, mod.id); - } - forTime = `for ${humanizeDuration(time)} `; } diff --git a/backend/src/plugins/ModActions/functions/banUserId.ts b/backend/src/plugins/ModActions/functions/banUserId.ts index 4620ec0f..709ba994 100644 --- a/backend/src/plugins/ModActions/functions/banUserId.ts +++ b/backend/src/plugins/ModActions/functions/banUserId.ts @@ -97,6 +97,16 @@ export async function banUserId( }; } + const existingTempban = await pluginData.state.tempbans.findExistingTempbanForUserId(user.id); + if (banTime && banTime > 0) { + const selfId = pluginData.client.user.id; + if (existingTempban) { + pluginData.state.tempbans.updateExpiryTime(user.id, banTime, banOptions.modId ?? selfId); + } else { + pluginData.state.tempbans.addTempban(user.id, banTime, banOptions.modId ?? selfId); + } + } + // Create a case for this action const modId = banOptions.caseArgs?.modId || pluginData.client.user.id; const casesPlugin = pluginData.getPlugin(CasesPlugin); diff --git a/backend/src/plugins/ModActions/types.ts b/backend/src/plugins/ModActions/types.ts index 083e5642..2aaee948 100644 --- a/backend/src/plugins/ModActions/types.ts +++ b/backend/src/plugins/ModActions/types.ts @@ -139,6 +139,7 @@ export interface BanOptions { caseArgs?: Partial; contactMethods?: UserNotificationMethod[]; deleteMessageDays?: number; + modId?: string; isAutomodAction?: boolean; }