diff --git a/backend/src/plugins/ModActions/commands/BanCmd.ts b/backend/src/plugins/ModActions/commands/BanCmd.ts index 0371a3df..46f7b0bd 100644 --- a/backend/src/plugins/ModActions/commands/BanCmd.ts +++ b/backend/src/plugins/ModActions/commands/BanCmd.ts @@ -53,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..d3f34868 100644 --- a/backend/src/plugins/ModActions/commands/NoteCmd.ts +++ b/backend/src/plugins/ModActions/commands/NoteCmd.ts @@ -32,25 +32,29 @@ export const NoteCmd = modActionsCmd({ } const userName = user.tag; - const reason = formatReasonWithAttachments(args.note, [...msg.attachments.values()]); + const content = formatReasonWithAttachments(args.note, [...msg.attachments.values()]); + if (!content) { + sendErrorMessage(pluginData, msg.channel, "You must include content for your note"); + return; + } const casesPlugin = pluginData.getPlugin(CasesPlugin); const createdCase = await casesPlugin.createCase({ userId: user.id, modId: msg.author.id, type: CaseTypes.Note, - reason, + reason: content, }); pluginData.getPlugin(LogsPlugin).logMemberNote({ mod: msg.author, user, caseNumber: createdCase.case_number, - reason, + reason: content, }); sendSuccessMessage(pluginData, msg.channel, `Note added on **${userName}** (Case #${createdCase.case_number})`); - pluginData.state.events.emit("note", user.id, reason); + pluginData.state.events.emit("note", user.id, content); }, }); diff --git a/backend/src/plugins/ModActions/commands/UnbanCmd.ts b/backend/src/plugins/ModActions/commands/UnbanCmd.ts index 2c9bbfd3..0f7bd63b 100644 --- a/backend/src/plugins/ModActions/commands/UnbanCmd.ts +++ b/backend/src/plugins/ModActions/commands/UnbanCmd.ts @@ -49,7 +49,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..49683ba3 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) { + 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 6a750fd5..2e5e6561 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 16e8e15e..ae4426ad 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;