diff --git a/backend/src/plugins/ModActions/ModActionsPlugin.ts b/backend/src/plugins/ModActions/ModActionsPlugin.ts index 2e92961f5..253e33c86 100644 --- a/backend/src/plugins/ModActions/ModActionsPlugin.ts +++ b/backend/src/plugins/ModActions/ModActionsPlugin.ts @@ -62,6 +62,11 @@ const defaultOptions = { kick_message: "You have been kicked from the {guildName} server. Reason given: {reason}", ban_message: "You have been banned from the {guildName} server. Reason given: {reason}", tempban_message: "You have been banned from the {guildName} server for {banTime}. Reason given: {reason}", + default_reasons: { + mute: "No reason specified", + kick: "No reason specified", + ban: "No reason specified", + }, alert_on_rejoin: false, alert_channel: null, warn_notify_enabled: false, diff --git a/backend/src/plugins/ModActions/commands/ForcebanCmd.ts b/backend/src/plugins/ModActions/commands/ForcebanCmd.ts index 4ddef1544..3aa235606 100644 --- a/backend/src/plugins/ModActions/commands/ForcebanCmd.ts +++ b/backend/src/plugins/ModActions/commands/ForcebanCmd.ts @@ -61,7 +61,10 @@ export const ForcebanCmd = modActionsCmd({ mod = args.mod; } - const reason = formatReasonWithAttachments(args.reason, [...msg.attachments.values()]); + const config = pluginData.config.get(); + const reason = args.reason + ? formatReasonWithAttachments(args.reason, [...msg.attachments.values()]) + : config.default_reasons?.ban || "No reason specified"; ignoreEvent(pluginData, IgnoredEventType.Ban, user.id); pluginData.state.serverLogs.ignoreLog(LogType.MEMBER_BAN, user.id); diff --git a/backend/src/plugins/ModActions/functions/actualKickMemberCmd.ts b/backend/src/plugins/ModActions/functions/actualKickMemberCmd.ts index a755ee08d..17ce4af18 100644 --- a/backend/src/plugins/ModActions/functions/actualKickMemberCmd.ts +++ b/backend/src/plugins/ModActions/functions/actualKickMemberCmd.ts @@ -67,7 +67,10 @@ export async function actualKickMemberCmd( return; } - const reason = formatReasonWithAttachments(args.reason, msg.attachments); + const config = pluginData.config.get(); + const reason = args.reason + ? formatReasonWithAttachments(args.reason, msg.attachments) + : config.default_reasons?.kick || "No reason specified"; 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 2f1084107..caf8cf7a3 100644 --- a/backend/src/plugins/ModActions/functions/actualMuteUserCmd.ts +++ b/backend/src/plugins/ModActions/functions/actualMuteUserCmd.ts @@ -42,7 +42,11 @@ export async function actualMuteUserCmd( } const timeUntilUnmute = args.time && humanizeDuration(args.time); - const reason = args.reason ? formatReasonWithAttachments(args.reason, [...msg.attachments.values()]) : undefined; + + const config = pluginData.config.get(); + const reason = args.reason + ? formatReasonWithAttachments(args.reason, [...msg.attachments.values()]) + : config.default_reasons?.mute || "No reason specified"; let muteResult: MuteResult; const mutesPlugin = pluginData.getPlugin(MutesPlugin); diff --git a/backend/src/plugins/ModActions/functions/banUserId.ts b/backend/src/plugins/ModActions/functions/banUserId.ts index 65686c815..6b1f11236 100644 --- a/backend/src/plugins/ModActions/functions/banUserId.ts +++ b/backend/src/plugins/ModActions/functions/banUserId.ts @@ -33,7 +33,6 @@ export async function banUserId( banOptions: BanOptions = {}, banTime?: number, ): Promise { - const config = pluginData.config.get(); const user = await resolveUser(pluginData.client, userId); if (!user.id) { return { @@ -42,10 +41,13 @@ export async function banUserId( }; } + const config = pluginData.config.get(); + reason ||= config.default_reasons?.ban || "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); let notifyResult: UserNotificationResult = { method: null, success: true }; - if (reason && member) { + if (member) { const contactMethods = banOptions?.contactMethods ? banOptions.contactMethods : getDefaultContactMethods(pluginData, "ban"); @@ -113,7 +115,7 @@ export async function banUserId( const deleteMessageDays = Math.min(7, Math.max(0, banOptions.deleteMessageDays ?? 1)); await pluginData.guild.bans.create(userId as Snowflake, { deleteMessageSeconds: (deleteMessageDays * DAYS) / SECONDS, - reason: reason ?? undefined, + reason, }); } catch (e) { let errorMessage; @@ -171,7 +173,7 @@ export async function banUserId( mod, user, caseNumber: createdCase.case_number, - reason: reason ?? "", + reason, banTime: humanizeDuration(banTime), }); } else { @@ -179,7 +181,7 @@ export async function banUserId( mod, user, caseNumber: createdCase.case_number, - reason: reason ?? "", + reason, }); } diff --git a/backend/src/plugins/ModActions/types.ts b/backend/src/plugins/ModActions/types.ts index fbe7890a7..1f9f0b25e 100644 --- a/backend/src/plugins/ModActions/types.ts +++ b/backend/src/plugins/ModActions/types.ts @@ -23,6 +23,13 @@ export const zModActionsConfig = z.strictObject({ kick_message: z.nullable(z.string()), ban_message: z.nullable(z.string()), tempban_message: z.nullable(z.string()), + default_reasons: z.nullable( + z.object({ + mute: z.string().max(512).nullable(), + kick: z.string().max(512).nullable(), + ban: z.string().max(512).nullable(), + }), + ), alert_on_rejoin: z.boolean(), alert_channel: z.nullable(z.string()), warn_notify_enabled: z.boolean(),