diff --git a/backend/src/data/Configs.ts b/backend/src/data/Configs.ts index 1b9ade22..bc702b5e 100644 --- a/backend/src/data/Configs.ts +++ b/backend/src/data/Configs.ts @@ -27,6 +27,12 @@ export class Configs extends BaseRepository { this.configs = dataSource.getRepository(Config); } + getActive() { + return this.configs.find({ + where: { is_active: true }, + }); + } + getActiveByKey(key) { return this.configs.findOne({ where: { diff --git a/backend/src/data/GuildLogs.ts b/backend/src/data/GuildLogs.ts index b324984e..5f7dc4ed 100644 --- a/backend/src/data/GuildLogs.ts +++ b/backend/src/data/GuildLogs.ts @@ -5,7 +5,7 @@ import { LogType } from "./LogType"; const guildInstances: Map = new Map(); interface IIgnoredLog { - type: LogType; + type: keyof typeof LogType; ignoreId: any; } @@ -27,7 +27,7 @@ export class GuildLogs extends events.EventEmitter { guildInstances.set(guildId, this); } - log(type: LogType, data: any, ignoreId?: string) { + log(type: keyof typeof LogType, data: any, ignoreId?: string) { if (ignoreId && this.isLogIgnored(type, ignoreId)) { this.clearIgnoredLog(type, ignoreId); return; @@ -36,7 +36,7 @@ export class GuildLogs extends events.EventEmitter { this.emit("log", { type, data }); } - ignoreLog(type: LogType, ignoreId: any, timeout?: number) { + ignoreLog(type: keyof typeof LogType, ignoreId: any, timeout?: number) { this.ignoredLogs.push({ type, ignoreId }); // Clear after expiry (15sec by default) @@ -45,11 +45,11 @@ export class GuildLogs extends events.EventEmitter { }, timeout || 1000 * 15); } - isLogIgnored(type: LogType, ignoreId: any) { + isLogIgnored(type: keyof typeof LogType, ignoreId: any) { return this.ignoredLogs.some((info) => type === info.type && ignoreId === info.ignoreId); } - clearIgnoredLog(type: LogType, ignoreId: any) { + clearIgnoredLog(type: keyof typeof LogType, ignoreId: any) { this.ignoredLogs.splice( this.ignoredLogs.findIndex((info) => type === info.type && ignoreId === info.ignoreId), 1, diff --git a/backend/src/data/LogType.ts b/backend/src/data/LogType.ts index 90c81173..1aba45ec 100644 --- a/backend/src/data/LogType.ts +++ b/backend/src/data/LogType.ts @@ -1,102 +1,74 @@ -export enum LogType { - MEMBER_WARN = 1, - MEMBER_MUTE, - MEMBER_UNMUTE, - MEMBER_MUTE_EXPIRED, - MEMBER_KICK, - MEMBER_BAN, - MEMBER_UNBAN, - MEMBER_FORCEBAN, - MEMBER_SOFTBAN, - MEMBER_JOIN, - MEMBER_LEAVE, - MEMBER_ROLE_ADD, - MEMBER_ROLE_REMOVE, - MEMBER_NICK_CHANGE, - MEMBER_USERNAME_CHANGE, - MEMBER_RESTORE, - - CHANNEL_CREATE, - CHANNEL_DELETE, - CHANNEL_UPDATE, - - THREAD_CREATE, - THREAD_DELETE, - THREAD_UPDATE, - - ROLE_CREATE, - ROLE_DELETE, - ROLE_UPDATE, - - MESSAGE_EDIT, - MESSAGE_DELETE, - MESSAGE_DELETE_BULK, - MESSAGE_DELETE_BARE, - - VOICE_CHANNEL_JOIN, - VOICE_CHANNEL_LEAVE, - VOICE_CHANNEL_MOVE, - - STAGE_INSTANCE_CREATE, - STAGE_INSTANCE_DELETE, - STAGE_INSTANCE_UPDATE, - - EMOJI_CREATE, - EMOJI_DELETE, - EMOJI_UPDATE, - - STICKER_CREATE, - STICKER_DELETE, - STICKER_UPDATE, - - COMMAND, - - MESSAGE_SPAM_DETECTED, - CENSOR, - CLEAN, - - CASE_CREATE, - - MASSUNBAN, - MASSBAN, - MASSMUTE, - - MEMBER_TIMED_MUTE, - MEMBER_TIMED_UNMUTE, - MEMBER_TIMED_BAN, - MEMBER_TIMED_UNBAN, - - MEMBER_JOIN_WITH_PRIOR_RECORDS, - OTHER_SPAM_DETECTED, - - MEMBER_ROLE_CHANGES, - VOICE_CHANNEL_FORCE_MOVE, - VOICE_CHANNEL_FORCE_DISCONNECT, - - CASE_UPDATE, - - MEMBER_MUTE_REJOIN, - - SCHEDULED_MESSAGE, - POSTED_SCHEDULED_MESSAGE, - - BOT_ALERT, - AUTOMOD_ACTION, - - SCHEDULED_REPEATED_MESSAGE, - REPEATED_MESSAGE, - - MESSAGE_DELETE_AUTO, - - SET_ANTIRAID_USER, - SET_ANTIRAID_AUTO, - - MASS_ASSIGN_ROLES, - MASS_UNASSIGN_ROLES, - - MEMBER_NOTE, - - CASE_DELETE, - - DM_FAILED, -} +export const LogType = { + MEMBER_WARN: "MEMBER_WARN", + MEMBER_MUTE: "MEMBER_MUTE", + MEMBER_UNMUTE: "MEMBER_UNMUTE", + MEMBER_MUTE_EXPIRED: "MEMBER_MUTE_EXPIRED", + MEMBER_KICK: "MEMBER_KICK", + MEMBER_BAN: "MEMBER_BAN", + MEMBER_UNBAN: "MEMBER_UNBAN", + MEMBER_FORCEBAN: "MEMBER_FORCEBAN", + MEMBER_SOFTBAN: "MEMBER_SOFTBAN", + MEMBER_JOIN: "MEMBER_JOIN", + MEMBER_LEAVE: "MEMBER_LEAVE", + MEMBER_ROLE_ADD: "MEMBER_ROLE_ADD", + MEMBER_ROLE_REMOVE: "MEMBER_ROLE_REMOVE", + MEMBER_NICK_CHANGE: "MEMBER_NICK_CHANGE", + MEMBER_USERNAME_CHANGE: "MEMBER_USERNAME_CHANGE", + MEMBER_RESTORE: "MEMBER_RESTORE", + CHANNEL_CREATE: "CHANNEL_CREATE", + CHANNEL_DELETE: "CHANNEL_DELETE", + CHANNEL_UPDATE: "CHANNEL_UPDATE", + THREAD_CREATE: "THREAD_CREATE", + THREAD_DELETE: "THREAD_DELETE", + THREAD_UPDATE: "THREAD_UPDATE", + ROLE_CREATE: "ROLE_CREATE", + ROLE_DELETE: "ROLE_DELETE", + ROLE_UPDATE: "ROLE_UPDATE", + MESSAGE_EDIT: "MESSAGE_EDIT", + MESSAGE_DELETE: "MESSAGE_DELETE", + MESSAGE_DELETE_BULK: "MESSAGE_DELETE_BULK", + MESSAGE_DELETE_BARE: "MESSAGE_DELETE_BARE", + VOICE_CHANNEL_JOIN: "VOICE_CHANNEL_JOIN", + VOICE_CHANNEL_LEAVE: "VOICE_CHANNEL_LEAVE", + VOICE_CHANNEL_MOVE: "VOICE_CHANNEL_MOVE", + STAGE_INSTANCE_CREATE: "STAGE_INSTANCE_CREATE", + STAGE_INSTANCE_DELETE: "STAGE_INSTANCE_DELETE", + STAGE_INSTANCE_UPDATE: "STAGE_INSTANCE_UPDATE", + EMOJI_CREATE: "EMOJI_CREATE", + EMOJI_DELETE: "EMOJI_DELETE", + EMOJI_UPDATE: "EMOJI_UPDATE", + STICKER_CREATE: "STICKER_CREATE", + STICKER_DELETE: "STICKER_DELETE", + STICKER_UPDATE: "STICKER_UPDATE", + COMMAND: "COMMAND", + MESSAGE_SPAM_DETECTED: "MESSAGE_SPAM_DETECTED", + CENSOR: "CENSOR", + CLEAN: "CLEAN", + CASE_CREATE: "CASE_CREATE", + MASSUNBAN: "MASSUNBAN", + MASSBAN: "MASSBAN", + MASSMUTE: "MASSMUTE", + MEMBER_TIMED_MUTE: "MEMBER_TIMED_MUTE", + MEMBER_TIMED_UNMUTE: "MEMBER_TIMED_UNMUTE", + MEMBER_TIMED_BAN: "MEMBER_TIMED_BAN", + MEMBER_TIMED_UNBAN: "MEMBER_TIMED_UNBAN", + MEMBER_JOIN_WITH_PRIOR_RECORDS: "MEMBER_JOIN_WITH_PRIOR_RECORDS", + OTHER_SPAM_DETECTED: "OTHER_SPAM_DETECTED", + MEMBER_ROLE_CHANGES: "MEMBER_ROLE_CHANGES", + VOICE_CHANNEL_FORCE_MOVE: "VOICE_CHANNEL_FORCE_MOVE", + VOICE_CHANNEL_FORCE_DISCONNECT: "VOICE_CHANNEL_FORCE_DISCONNECT", + CASE_UPDATE: "CASE_UPDATE", + MEMBER_MUTE_REJOIN: "MEMBER_MUTE_REJOIN", + SCHEDULED_MESSAGE: "SCHEDULED_MESSAGE", + POSTED_SCHEDULED_MESSAGE: "POSTED_SCHEDULED_MESSAGE", + BOT_ALERT: "BOT_ALERT", + AUTOMOD_ACTION: "AUTOMOD_ACTION", + SCHEDULED_REPEATED_MESSAGE: "SCHEDULED_REPEATED_MESSAGE", + REPEATED_MESSAGE: "REPEATED_MESSAGE", + MESSAGE_DELETE_AUTO: "MESSAGE_DELETE_AUTO", + SET_ANTIRAID_USER: "SET_ANTIRAID_USER", + SET_ANTIRAID_AUTO: "SET_ANTIRAID_AUTO", + MEMBER_NOTE: "MEMBER_NOTE", + CASE_DELETE: "CASE_DELETE", + DM_FAILED: "DM_FAILED", +} as const; diff --git a/backend/src/plugins/Logs/types.ts b/backend/src/plugins/Logs/types.ts index 51f67b87..2960c2ae 100644 --- a/backend/src/plugins/Logs/types.ts +++ b/backend/src/plugins/Logs/types.ts @@ -1,12 +1,12 @@ import { BasePluginType, CooldownManager, guildPluginEventListener } from "knub"; -import { z } from "zod"; +import { ZodString, z } from "zod"; import { RegExpRunner } from "../../RegExpRunner"; import { GuildArchives } from "../../data/GuildArchives"; import { GuildCases } from "../../data/GuildCases"; import { GuildLogs } from "../../data/GuildLogs"; import { GuildSavedMessages } from "../../data/GuildSavedMessages"; import { LogType } from "../../data/LogType"; -import { zBoundedCharacters, zMessageContent, zRegex, zSnowflake } from "../../utils"; +import { keys, zBoundedCharacters, zMessageContent, zRegex, zSnowflake } from "../../utils"; import { MessageBuffer } from "../../utils/MessageBuffer"; import { TemplateSafeCase, @@ -26,10 +26,13 @@ const DEFAULT_BATCH_TIME = 1000; const MIN_BATCH_TIME = 250; const MAX_BATCH_TIME = 5000; -export const zLogFormats = z.record( - zBoundedCharacters(1, 255), - zMessageContent, -); +type ZLogFormatsHelper = { + -readonly [K in keyof typeof LogType]: typeof zMessageContent; +}; +export const zLogFormats = z.strictObject(keys(LogType).reduce((map, logType) => { + map[logType] = zMessageContent; + return map; +}, {} as ZLogFormatsHelper)); export type TLogFormats = z.infer; const zLogChannel = z.strictObject({ @@ -44,7 +47,7 @@ const zLogChannel = z.strictObject({ excluded_threads: z.array(zSnowflake).nullable().default(null), exclude_bots: z.boolean().default(false), excluded_roles: z.array(zSnowflake).nullable().default(null), - format: zLogFormats.default({}), + format: zLogFormats.partial().default({}), timestamp_format: z.string().nullable().default(null), include_embed_timestamp: z.boolean().nullable().default(null), }); @@ -55,7 +58,7 @@ export type TLogChannelMap = z.infer; export const zLogsConfig = z.strictObject({ channels: zLogChannelMap, - format: z.intersection(zLogFormats, z.strictObject({ + format: zLogFormats.merge(z.strictObject({ // Legacy/deprecated, use timestamp_format below instead timestamp: zBoundedCharacters(0, 64).nullable(), })), diff --git a/backend/src/plugins/Logs/util/isLogIgnored.ts b/backend/src/plugins/Logs/util/isLogIgnored.ts index eb23b927..71255f50 100644 --- a/backend/src/plugins/Logs/util/isLogIgnored.ts +++ b/backend/src/plugins/Logs/util/isLogIgnored.ts @@ -2,6 +2,6 @@ import { GuildPluginData } from "knub"; import { LogType } from "../../../data/LogType"; import { LogsPluginType } from "../types"; -export function isLogIgnored(pluginData: GuildPluginData, type: LogType, ignoreId: string) { +export function isLogIgnored(pluginData: GuildPluginData, type: keyof typeof LogType, ignoreId: string) { return pluginData.state.guildLogs.isLogIgnored(type, ignoreId); }