From 529a0bfc0ef37edb8728ae634f2b3bdc0ffba174 Mon Sep 17 00:00:00 2001 From: Hiroyuki Date: Sat, 4 Sep 2021 22:14:16 -0400 Subject: [PATCH] feat(mod-actions): require reason --- backend/src/plugins/ModActions/ModActionsPlugin.ts | 1 + backend/src/plugins/ModActions/commands/BanCmd.ts | 7 +++++++ backend/src/plugins/ModActions/commands/NoteCmd.ts | 7 ++++++- backend/src/plugins/ModActions/commands/UnbanCmd.ts | 5 +++++ backend/src/plugins/ModActions/commands/WarnCmd.ts | 4 ++++ .../plugins/ModActions/functions/actualKickMemberCmd.ts | 5 +++++ .../src/plugins/ModActions/functions/actualMuteUserCmd.ts | 5 +++++ .../plugins/ModActions/functions/actualUnmuteUserCmd.ts | 5 +++++ backend/src/plugins/ModActions/types.ts | 1 + 9 files changed, 39 insertions(+), 1 deletion(-) diff --git a/backend/src/plugins/ModActions/ModActionsPlugin.ts b/backend/src/plugins/ModActions/ModActionsPlugin.ts index 4453efe8..dab915b2 100644 --- a/backend/src/plugins/ModActions/ModActionsPlugin.ts +++ b/backend/src/plugins/ModActions/ModActionsPlugin.ts @@ -84,6 +84,7 @@ const defaultOptions = { can_deletecase: false, can_act_as_other: false, create_cases_for_manual_actions: true, + require_reason: ["warn"], }, overrides: [ { diff --git a/backend/src/plugins/ModActions/commands/BanCmd.ts b/backend/src/plugins/ModActions/commands/BanCmd.ts index 40a352c7..4ff77218 100644 --- a/backend/src/plugins/ModActions/commands/BanCmd.ts +++ b/backend/src/plugins/ModActions/commands/BanCmd.ts @@ -15,6 +15,7 @@ import { isBanned } from "../functions/isBanned"; import { readContactMethodsFromArgs } from "../functions/readContactMethodsFromArgs"; import { modActionsCmd } from "../types"; import { LogsPlugin } from "../../Logs/LogsPlugin"; +import { TextChannel } from "discord.js"; const opts = { mod: ct.member({ option: true }), @@ -52,7 +53,13 @@ export const BanCmd = modActionsCmd({ } const time = args["time"] ? args["time"] : null; + const config = pluginData.config.get(); const reason = formatReasonWithAttachments(args.reason, [...msg.attachments.values()]); + if (!reason && config.require_reason.includes("ban")) { + sendErrorMessage(pluginData, msg.channel, "You must include a reason in your ban"); + return; + } + const memberToBan = await resolveMember(pluginData.client, pluginData.guild, user.id); // The moderator who did the action is the message author or, if used, the specified -mod let mod = msg.member; diff --git a/backend/src/plugins/ModActions/commands/NoteCmd.ts b/backend/src/plugins/ModActions/commands/NoteCmd.ts index 569831a8..fbb74261 100644 --- a/backend/src/plugins/ModActions/commands/NoteCmd.ts +++ b/backend/src/plugins/ModActions/commands/NoteCmd.ts @@ -32,7 +32,12 @@ export const NoteCmd = modActionsCmd({ } const userName = user.tag; - const reason = formatReasonWithAttachments(args.note, [...msg.attachments.values()]); + const config = pluginData.config.get(); + const reason = formatReasonWithAttachments(args.reason, [...msg.attachments.values()]); + if (!reason && config.require_reason.includes("note")) { + sendErrorMessage(pluginData, msg.channel, "You must include a reason in your note"); + return; + } const casesPlugin = pluginData.getPlugin(CasesPlugin); const createdCase = await casesPlugin.createCase({ diff --git a/backend/src/plugins/ModActions/commands/UnbanCmd.ts b/backend/src/plugins/ModActions/commands/UnbanCmd.ts index eb235917..53b3b3ec 100644 --- a/backend/src/plugins/ModActions/commands/UnbanCmd.ts +++ b/backend/src/plugins/ModActions/commands/UnbanCmd.ts @@ -48,7 +48,12 @@ export const UnbanCmd = modActionsCmd({ } pluginData.state.serverLogs.ignoreLog(LogType.MEMBER_UNBAN, user.id); + const config = pluginData.config.get(); const reason = formatReasonWithAttachments(args.reason, [...msg.attachments.values()]); + if (!reason && config.require_reason.includes("unban")) { + sendErrorMessage(pluginData, msg.channel, "You must include a reason in your unban"); + return; + } try { ignoreEvent(pluginData, IgnoredEventType.Unban, user.id); diff --git a/backend/src/plugins/ModActions/commands/WarnCmd.ts b/backend/src/plugins/ModActions/commands/WarnCmd.ts index 03d79b76..7ce7caeb 100644 --- a/backend/src/plugins/ModActions/commands/WarnCmd.ts +++ b/backend/src/plugins/ModActions/commands/WarnCmd.ts @@ -64,6 +64,10 @@ export const WarnCmd = modActionsCmd({ const config = pluginData.config.get(); const reason = formatReasonWithAttachments(args.reason, [...msg.attachments.values()]); + if (!reason && config.require_reason.includes("warn")) { + sendErrorMessage(pluginData, msg.channel, "You must include a reason in your warning"); + return; + } const casesPlugin = pluginData.getPlugin(CasesPlugin); const priorWarnAmount = await casesPlugin.getCaseTypeAmountForUserId(memberToWarn.id, CaseTypes.Warn); diff --git a/backend/src/plugins/ModActions/functions/actualKickMemberCmd.ts b/backend/src/plugins/ModActions/functions/actualKickMemberCmd.ts index 92178edc..b97a009a 100644 --- a/backend/src/plugins/ModActions/functions/actualKickMemberCmd.ts +++ b/backend/src/plugins/ModActions/functions/actualKickMemberCmd.ts @@ -67,7 +67,12 @@ export async function actualKickMemberCmd( return; } + const config = pluginData.config.get(); const reason = formatReasonWithAttachments(args.reason, msg.attachments); + if (!reason && config.require_reason.includes("kick")) { + sendErrorMessage(pluginData, msg.channel, "You must include a reason in your kick"); + return; + } const kickResult = await kickMember(pluginData, memberToKick, reason, { contactMethods, diff --git a/backend/src/plugins/ModActions/functions/actualMuteUserCmd.ts b/backend/src/plugins/ModActions/functions/actualMuteUserCmd.ts index f790604a..c5395eca 100644 --- a/backend/src/plugins/ModActions/functions/actualMuteUserCmd.ts +++ b/backend/src/plugins/ModActions/functions/actualMuteUserCmd.ts @@ -42,7 +42,12 @@ export async function actualMuteUserCmd( } const timeUntilUnmute = args.time && humanizeDuration(args.time); + const config = pluginData.config.get(); const reason = args.reason ? formatReasonWithAttachments(args.reason, [...msg.attachments.values()]) : undefined; + if (!reason && config.require_reason.includes("mute")) { + sendErrorMessage(pluginData, msg.channel as TextChannel, "You must include a reason in your mute"); + return; + } let muteResult: MuteResult; const mutesPlugin = pluginData.getPlugin(MutesPlugin); diff --git a/backend/src/plugins/ModActions/functions/actualUnmuteUserCmd.ts b/backend/src/plugins/ModActions/functions/actualUnmuteUserCmd.ts index 46ab7be6..3d17f4d4 100644 --- a/backend/src/plugins/ModActions/functions/actualUnmuteUserCmd.ts +++ b/backend/src/plugins/ModActions/functions/actualUnmuteUserCmd.ts @@ -27,7 +27,12 @@ export async function actualUnmuteCmd( pp = msg.author; } + const config = pluginData.config.get(); const reason = args.reason ? formatReasonWithAttachments(args.reason, [...msg.attachments.values()]) : undefined; + if (!reason && config.require_reason.includes("unmute")) { + sendErrorMessage(pluginData, msg.channel as TextChannel, "You must include a reason in your unmute"); + return; + } const mutesPlugin = pluginData.getPlugin(MutesPlugin); const result = await mutesPlugin.unmuteUser(user.id, args.time, { diff --git a/backend/src/plugins/ModActions/types.ts b/backend/src/plugins/ModActions/types.ts index b8c07270..3beef228 100644 --- a/backend/src/plugins/ModActions/types.ts +++ b/backend/src/plugins/ModActions/types.ts @@ -46,6 +46,7 @@ export const ConfigSchema = t.type({ can_deletecase: t.boolean, can_act_as_other: t.boolean, create_cases_for_manual_actions: t.boolean, + require_reason: t.array(t.string), }); export type TConfigSchema = t.TypeOf;