From 0612b6f17d2a99adae37d0ab39b25ca0d735f201 Mon Sep 17 00:00:00 2001 From: iamshoXy Date: Sat, 9 Sep 2023 15:15:02 +0200 Subject: [PATCH] Update --- backend/src/api/guilds/importExport.ts | 9 ++-- .../Automod/triggers/matchAttachmentType.ts | 3 +- backend/src/plugins/Cases/caseIcons.ts | 18 ++++---- .../plugins/ModActions/ModActionsPlugin.ts | 1 + .../plugins/ModActions/functions/banUserId.ts | 12 +++--- backend/src/plugins/ModActions/types.ts | 43 ++++++++++--------- backend/src/utils.ts | 21 +++++---- 7 files changed, 58 insertions(+), 49 deletions(-) diff --git a/backend/src/api/guilds/importExport.ts b/backend/src/api/guilds/importExport.ts index a7bb6e2e..ee4d20a5 100644 --- a/backend/src/api/guilds/importExport.ts +++ b/backend/src/api/guilds/importExport.ts @@ -35,7 +35,7 @@ const caseData = z.object({ is_hidden: z.boolean(), pp_id: z.nullable(z.string()), pp_name: z.nullable(z.string()), - + log_message_id: z.string().optional(), notes: z.array(caseNoteData), }); @@ -75,9 +75,8 @@ export function initGuildsImportExportAPI(guildRouter: express.Router) { try { data = importExportData.parse(req.body.data); } catch (err) { - const prettyMessage = `${err.issues[0].code}: expected ${err.issues[0].expected}, received ${ - err.issues[0].received - } at /${err.issues[0].path.join("/")}`; + const prettyMessage = `${err.issues[0].code}: expected ${err.issues[0].expected}, received ${err.issues[0].received + } at /${err.issues[0].path.join("/")}`; return clientError(res, `Invalid import data format: ${prettyMessage}`); return; } @@ -168,7 +167,7 @@ export function initGuildsImportExportAPI(guildRouter: express.Router) { is_hidden: theCase.is_hidden, pp_id: theCase.pp_id, pp_name: theCase.pp_name, - + log_message_id: theCase.log_message_id ?? undefined, notes: theCase.notes.map((note) => ({ mod_id: note.mod_id, mod_name: note.mod_name, diff --git a/backend/src/plugins/Automod/triggers/matchAttachmentType.ts b/backend/src/plugins/Automod/triggers/matchAttachmentType.ts index 659be65b..6b62b12a 100644 --- a/backend/src/plugins/Automod/triggers/matchAttachmentType.ts +++ b/backend/src/plugins/Automod/triggers/matchAttachmentType.ts @@ -2,6 +2,7 @@ import { escapeInlineCode, Snowflake } from "discord.js"; import * as t from "io-ts"; import { asSingleLine, messageSummary, verboseChannelMention } from "../../../utils"; import { automodTrigger } from "../helpers"; +import { extname } from "path"; interface MatchResultType { matchedType: string; @@ -33,7 +34,7 @@ export const MatchAttachmentTypeTrigger = automodTrigger()({ } for (const attachment of context.message.data.attachments) { - const attachmentType = attachment.url.split(".").pop()!.toLowerCase(); + const attachmentType = extname(new URL(attachment.url).pathname).slice(1).toLowerCase(); const blacklist = trigger.blacklist_enabled ? (trigger.filetype_blacklist || []).map((_t) => _t.toLowerCase()) diff --git a/backend/src/plugins/Cases/caseIcons.ts b/backend/src/plugins/Cases/caseIcons.ts index 3d18cd12..a270575a 100644 --- a/backend/src/plugins/Cases/caseIcons.ts +++ b/backend/src/plugins/Cases/caseIcons.ts @@ -3,13 +3,13 @@ import { CaseTypes } from "../../data/CaseTypes"; // These emoji icons are hosted on the Hangar server // If you'd like your self-hosted instance to use these icons, check #add-your-bot on that server export const caseIcons: Record = { - [CaseTypes.Ban]: "<:case_ban:906897178176393246>", - [CaseTypes.Unban]: "<:case_unban:906897177824067665>", - [CaseTypes.Note]: "<:case_note:906897177832476743>", - [CaseTypes.Warn]: "<:case_warn:906897177840844832>", - [CaseTypes.Kick]: "<:case_kick:906897178310639646>", - [CaseTypes.Mute]: "<:case_mute:906897178147057664>", - [CaseTypes.Unmute]: "<:case_unmute:906897177819881523>", - [CaseTypes.Deleted]: "<:case_deleted:906897178209968148>", - [CaseTypes.Softban]: "<:case_softban:906897177828278274>", + [CaseTypes.Ban]: "<:case_ban:1150055546922213436>", + [CaseTypes.Unban]: "<:case_unban:1150055555335995412>", + [CaseTypes.Note]: "<:case_note:1150055552412553276>", + [CaseTypes.Warn]: "<:case_warn:1150055557919686776>", + [CaseTypes.Kick]: "<:case_kick:1150055557919686776>", + [CaseTypes.Mute]: "<:case_mute:1150055557919686776>", + [CaseTypes.Unmute]: "<:case_unmute:1150055557919686776>", + [CaseTypes.Deleted]: "<:case_deleted:1150055557919686776>", + [CaseTypes.Softban]: "<:case_softban:1150055557919686776>", }; diff --git a/backend/src/plugins/ModActions/ModActionsPlugin.ts b/backend/src/plugins/ModActions/ModActionsPlugin.ts index bf83b13e..523a48d3 100644 --- a/backend/src/plugins/ModActions/ModActionsPlugin.ts +++ b/backend/src/plugins/ModActions/ModActionsPlugin.ts @@ -62,6 +62,7 @@ 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_ban_reason: "No reason specified", alert_on_rejoin: false, alert_channel: null, warn_notify_enabled: false, diff --git a/backend/src/plugins/ModActions/functions/banUserId.ts b/backend/src/plugins/ModActions/functions/banUserId.ts index d9d1454b..3f21e23e 100644 --- a/backend/src/plugins/ModActions/functions/banUserId.ts +++ b/backend/src/plugins/ModActions/functions/banUserId.ts @@ -42,10 +42,12 @@ export async function banUserId( }; } + reason = 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); let notifyResult: UserNotificationResult = { method: null, success: true }; - if (reason && member) { + if (member) { const contactMethods = banOptions?.contactMethods ? banOptions.contactMethods : getDefaultContactMethods(pluginData, "ban"); @@ -91,7 +93,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; @@ -149,7 +151,7 @@ export async function banUserId( mod, user, caseNumber: createdCase.case_number, - reason: reason ?? "", + reason, banTime: humanizeDuration(banTime), }); } else { @@ -157,7 +159,7 @@ export async function banUserId( mod, user, caseNumber: createdCase.case_number, - reason: reason ?? "", + reason, }); } @@ -168,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 447b9638..4bcb6a02 100644 --- a/backend/src/plugins/ModActions/types.ts +++ b/backend/src/plugins/ModActions/types.ts @@ -23,6 +23,7 @@ export const ConfigSchema = t.type({ kick_message: tNullable(t.string), ban_message: tNullable(t.string), tempban_message: tNullable(t.string), + default_ban_reason: tNullable(t.string), alert_on_rejoin: t.boolean, alert_channel: tNullable(t.string), warn_notify_enabled: t.boolean, @@ -91,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; diff --git a/backend/src/utils.ts b/backend/src/utils.ts index 1bb4d6ce..7d8e0a29 100644 --- a/backend/src/utils.ts +++ b/backend/src/utils.ts @@ -135,7 +135,7 @@ export interface TDeepPartialProps

{ [K in keyof P]?: TDeepPartial>; } - > {} + > { } export function tDeepPartial(type: T): TDeepPartial { if (type instanceof t.InterfaceType || type instanceof t.PartialType) { @@ -220,7 +220,7 @@ export interface PartialDictionaryC [K in t.OutputOf]?: t.OutputOf; }, unknown - > {} + > { } export const tPartialDictionary = ( domain: D, @@ -275,6 +275,7 @@ export const tEmbed = t.type({ video: tNullable( t.type({ url: tNullable(t.string), + proxy_url: tNullable(t.string), width: tNullable(t.number), height: tNullable(t.number), }), @@ -298,8 +299,8 @@ export const tEmbed = t.type({ t.type({ name: t.string, url: tNullable(t.string), - width: tNullable(t.number), - height: tNullable(t.number), + icon_url: tNullable(t.string), + proxy_icon_url: tNullable(t.string), }), ), }); @@ -315,12 +316,14 @@ export const zEmbedInput = z.object({ z.object({ text: z.string(), icon_url: z.string().optional(), + proxy_icon_url: z.string().optional(), }), ), image: z.optional( z.object({ url: z.string().optional(), + proxy_url: z.string().optional(), width: z.number().optional(), height: z.number().optional(), }), @@ -329,6 +332,7 @@ export const zEmbedInput = z.object({ thumbnail: z.optional( z.object({ url: z.string().optional(), + proxy_url: z.string().optional(), width: z.number().optional(), height: z.number().optional(), }), @@ -337,6 +341,7 @@ export const zEmbedInput = z.object({ video: z.optional( z.object({ url: z.string().optional(), + proxy_url: z.string().optional(), width: z.number().optional(), height: z.number().optional(), }), @@ -364,8 +369,8 @@ export const zEmbedInput = z.object({ z.object({ name: z.string(), url: z.string().optional(), - width: z.number().optional(), - height: z.number().optional(), + icon_url: z.string().optional(), + proxy_icon_url: z.string().optional(), }), ) .nullable(), @@ -553,7 +558,7 @@ export function convertMSToDelayString(ms: number): string { return result; } -export function successMessage(str: string, emoji = "<:zep_check:906897402101891093>") { +export function successMessage(str: string, emoji = "<:success:1150055584566087770>") { return emoji ? `${emoji} ${str}` : str; } @@ -1612,4 +1617,4 @@ export function renderUsername(username: string, discriminator: string): string export function renderUserUsername(user: User | UnknownUser): string { return renderUsername(user.username, user.discriminator); -} +} \ No newline at end of file