From 82ca94e8c9143cac8fdefb7f1e3507b213b8a404 Mon Sep 17 00:00:00 2001 From: Dragory <2606411+Dragory@users.noreply.github.com> Date: Sun, 5 Sep 2021 23:46:40 +0300 Subject: [PATCH] Limit which changed props are included in update logs --- .../Logs/events/LogsChannelModifyEvts.ts | 15 ++++++++++++++- .../events/LogsEmojiAndStickerModifyEvts.ts | 14 ++++++++++++-- .../plugins/Logs/events/LogsRoleModifyEvts.ts | 8 +++++++- .../Logs/events/LogsStageInstanceModifyEvts.ts | 17 +++++++++++++++-- .../plugins/Logs/events/LogsThreadModifyEvts.ts | 8 +++++++- backend/src/utils/filterObject.ts | 15 +++++++++------ 6 files changed, 64 insertions(+), 13 deletions(-) diff --git a/backend/src/plugins/Logs/events/LogsChannelModifyEvts.ts b/backend/src/plugins/Logs/events/LogsChannelModifyEvts.ts index f3a29c2c..33bd7df9 100644 --- a/backend/src/plugins/Logs/events/LogsChannelModifyEvts.ts +++ b/backend/src/plugins/Logs/events/LogsChannelModifyEvts.ts @@ -5,6 +5,8 @@ import { logsEvt } from "../types"; import { logChannelCreate } from "../logFunctions/logChannelCreate"; import { logChannelDelete } from "../logFunctions/logChannelDelete"; import { logChannelUpdate } from "../logFunctions/logChannelUpdate"; +import { TextChannel, VoiceChannel } from "discord.js"; +import { filterObject } from "../../../utils/filterObject"; export const LogsChannelCreateEvt = logsEvt({ event: "channelCreate", @@ -26,6 +28,15 @@ export const LogsChannelDeleteEvt = logsEvt({ }, }); +const validChannelDiffProps: Set = new Set([ + "name", + "parentId", + "nsfw", + "rateLimitPerUser", + "topic", + "bitrate", +]); + export const LogsChannelUpdateEvt = logsEvt({ event: "channelUpdate", @@ -34,7 +45,9 @@ export const LogsChannelUpdateEvt = logsEvt({ return; } - const diff = getScalarDifference(meta.args.oldChannel, meta.args.newChannel); + const oldChannelDiffProps = filterObject(meta.args.oldChannel || {}, (v, k) => validChannelDiffProps.has(k)); + const newChannelDiffProps = filterObject(meta.args.newChannel, (v, k) => validChannelDiffProps.has(k)); + const diff = getScalarDifference(oldChannelDiffProps, newChannelDiffProps); const differenceString = differenceToString(diff); if (differenceString.trim() === "") { diff --git a/backend/src/plugins/Logs/events/LogsEmojiAndStickerModifyEvts.ts b/backend/src/plugins/Logs/events/LogsEmojiAndStickerModifyEvts.ts index 9832ab41..29b8eb61 100644 --- a/backend/src/plugins/Logs/events/LogsEmojiAndStickerModifyEvts.ts +++ b/backend/src/plugins/Logs/events/LogsEmojiAndStickerModifyEvts.ts @@ -6,6 +6,8 @@ import { logEmojiUpdate } from "../logFunctions/logEmojiUpdate"; import { logStickerCreate } from "../logFunctions/logStickerCreate"; import { logStickerDelete } from "../logFunctions/logStickerDelete"; import { logStickerUpdate } from "../logFunctions/logStickerUpdate"; +import { Emoji, GuildEmoji, Sticker, ThreadChannel } from "discord.js"; +import { filterObject } from "../../../utils/filterObject"; export const LogsEmojiCreateEvt = logsEvt({ event: "emojiCreate", @@ -27,11 +29,15 @@ export const LogsEmojiDeleteEvt = logsEvt({ }, }); +const validEmojiDiffProps: Set = new Set(["name"]); + export const LogsEmojiUpdateEvt = logsEvt({ event: "emojiUpdate", async listener(meta) { - const diff = getScalarDifference(meta.args.oldEmoji, meta.args.newEmoji); + const oldEmojiDiffProps = filterObject(meta.args.oldEmoji || {}, (v, k) => validEmojiDiffProps.has(k)); + const newEmojiDiffProps = filterObject(meta.args.newEmoji, (v, k) => validEmojiDiffProps.has(k)); + const diff = getScalarDifference(oldEmojiDiffProps, newEmojiDiffProps); const differenceString = differenceToString(diff); if (differenceString === "") { @@ -66,11 +72,15 @@ export const LogsStickerDeleteEvt = logsEvt({ }, }); +const validStickerDiffProps: Set = new Set(["name"]); + export const LogsStickerUpdateEvt = logsEvt({ event: "stickerUpdate", async listener(meta) { - const diff = getScalarDifference(meta.args.oldSticker, meta.args.newSticker); + const oldStickerDiffProps = filterObject(meta.args.oldSticker || {}, (v, k) => validStickerDiffProps.has(k)); + const newStickerDiffProps = filterObject(meta.args.newSticker, (v, k) => validStickerDiffProps.has(k)); + const diff = getScalarDifference(oldStickerDiffProps, newStickerDiffProps); const differenceString = differenceToString(diff); if (differenceString === "") { diff --git a/backend/src/plugins/Logs/events/LogsRoleModifyEvts.ts b/backend/src/plugins/Logs/events/LogsRoleModifyEvts.ts index 0fea7c3f..81d6e2bf 100644 --- a/backend/src/plugins/Logs/events/LogsRoleModifyEvts.ts +++ b/backend/src/plugins/Logs/events/LogsRoleModifyEvts.ts @@ -5,6 +5,8 @@ import { logsEvt } from "../types"; import { logRoleCreate } from "../logFunctions/logRoleCreate"; import { logRoleDelete } from "../logFunctions/logRoleDelete"; import { logRoleUpdate } from "../logFunctions/logRoleUpdate"; +import { GuildEmoji, Role } from "discord.js"; +import { filterObject } from "../../../utils/filterObject"; export const LogsRoleCreateEvt = logsEvt({ event: "roleCreate", @@ -26,11 +28,15 @@ export const LogsRoleDeleteEvt = logsEvt({ }, }); +const validRoleDiffProps: Set = new Set(["name", "hoist", "color", "mentionable"]); + export const LogsRoleUpdateEvt = logsEvt({ event: "roleUpdate", async listener(meta) { - const diff = getScalarDifference(meta.args.oldRole, meta.args.newRole); + const oldRoleDiffProps = filterObject(meta.args.oldRole || {}, (v, k) => validRoleDiffProps.has(k)); + const newRoleDiffProps = filterObject(meta.args.newRole, (v, k) => validRoleDiffProps.has(k)); + const diff = getScalarDifference(oldRoleDiffProps, newRoleDiffProps); const differenceString = differenceToString(diff); logRoleUpdate(meta.pluginData, { diff --git a/backend/src/plugins/Logs/events/LogsStageInstanceModifyEvts.ts b/backend/src/plugins/Logs/events/LogsStageInstanceModifyEvts.ts index d964c672..f9ddb54a 100644 --- a/backend/src/plugins/Logs/events/LogsStageInstanceModifyEvts.ts +++ b/backend/src/plugins/Logs/events/LogsStageInstanceModifyEvts.ts @@ -3,9 +3,10 @@ import { differenceToString, getScalarDifference } from "../../../utils"; import { channelToTemplateSafeChannel, stageToTemplateSafeStage } from "../../../utils/templateSafeObjects"; import { logsEvt } from "../types"; import { logStageInstanceCreate } from "../logFunctions/logStageInstanceCreate"; -import { StageChannel } from "discord.js"; +import { Role, StageChannel, StageInstance } from "discord.js"; import { logStageInstanceDelete } from "../logFunctions/logStageInstanceDelete"; import { logStageInstanceUpdate } from "../logFunctions/logStageInstanceUpdate"; +import { filterObject } from "../../../utils/filterObject"; export const LogsStageInstanceCreateEvt = logsEvt({ event: "stageInstanceCreate", @@ -37,6 +38,12 @@ export const LogsStageInstanceDeleteEvt = logsEvt({ }, }); +const validStageInstanceDiffProps: Set = new Set([ + "topic", + "privacyLevel", + "discoverableDisabled", +]); + export const LogsStageInstanceUpdateEvt = logsEvt({ event: "stageInstanceUpdate", @@ -45,7 +52,13 @@ export const LogsStageInstanceUpdateEvt = logsEvt({ meta.args.newStageInstance.channel ?? ((await meta.pluginData.guild.channels.fetch(meta.args.newStageInstance.channelId)) as StageChannel); - const diff = getScalarDifference(meta.args.oldStageInstance, meta.args.newStageInstance); + const oldStageInstanceDiffProps = filterObject(meta.args.oldStageInstance || {}, (v, k) => + validStageInstanceDiffProps.has(k), + ); + const newStageInstanceDiffProps = filterObject(meta.args.newStageInstance, (v, k) => + validStageInstanceDiffProps.has(k), + ); + const diff = getScalarDifference(oldStageInstanceDiffProps, newStageInstanceDiffProps); const differenceString = differenceToString(diff); logStageInstanceUpdate(meta.pluginData, { diff --git a/backend/src/plugins/Logs/events/LogsThreadModifyEvts.ts b/backend/src/plugins/Logs/events/LogsThreadModifyEvts.ts index 7fb3dcf6..b760d21d 100644 --- a/backend/src/plugins/Logs/events/LogsThreadModifyEvts.ts +++ b/backend/src/plugins/Logs/events/LogsThreadModifyEvts.ts @@ -5,6 +5,8 @@ import { logsEvt } from "../types"; import { logThreadCreate } from "../logFunctions/logThreadCreate"; import { logThreadDelete } from "../logFunctions/logThreadDelete"; import { logThreadUpdate } from "../logFunctions/logThreadUpdate"; +import { TextChannel, ThreadChannel, VoiceChannel } from "discord.js"; +import { filterObject } from "../../../utils/filterObject"; export const LogsThreadCreateEvt = logsEvt({ event: "threadCreate", @@ -26,11 +28,15 @@ export const LogsThreadDeleteEvt = logsEvt({ }, }); +const validThreadDiffProps: Set = new Set(["name", "autoArchiveDuration", "rateLimitPerUser"]); + export const LogsThreadUpdateEvt = logsEvt({ event: "threadUpdate", async listener(meta) { - const diff = getScalarDifference(meta.args.oldThread, meta.args.newThread, ["messageCount", "archiveTimestamp"]); + const oldThreadDiffProps = filterObject(meta.args.oldThread || {}, (v, k) => validThreadDiffProps.has(k)); + const newThreadDiffProps = filterObject(meta.args.newThread, (v, k) => validThreadDiffProps.has(k)); + const diff = getScalarDifference(oldThreadDiffProps, newThreadDiffProps); const differenceString = differenceToString(diff); logThreadUpdate(meta.pluginData, { diff --git a/backend/src/utils/filterObject.ts b/backend/src/utils/filterObject.ts index f5fd6de0..0456ebcb 100644 --- a/backend/src/utils/filterObject.ts +++ b/backend/src/utils/filterObject.ts @@ -1,13 +1,16 @@ +type FilterResult = { + [K in keyof T]?: T[K]; +}; + /** * Filter an object's properties based on its values and keys * @return New object with filtered properties */ -export function filterObject>( +export function filterObject( object: T, filterFn: (value: T[K], key: K) => boolean, -): Record { - return Object.fromEntries(Object.entries(object).filter(([key, value]) => filterFn(value as any, key))) as Record< - keyof T, - T[keyof T] - >; +): FilterResult { + return Object.fromEntries( + Object.entries(object).filter(([key, value]) => filterFn(value as any, key as keyof T)), + ) as FilterResult; }