Limit which changed props are included in update logs

This commit is contained in:
Dragory 2021-09-05 23:46:40 +03:00
parent 70fb0b5baa
commit 82ca94e8c9
No known key found for this signature in database
GPG key ID: 5F387BA66DF8AAC1
6 changed files with 64 additions and 13 deletions

View file

@ -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<keyof TextChannel | keyof VoiceChannel> = 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() === "") {

View file

@ -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<keyof GuildEmoji> = 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<keyof Sticker> = 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 === "") {

View file

@ -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<keyof Role> = 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, {

View file

@ -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<keyof StageInstance> = 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, {

View file

@ -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<keyof ThreadChannel> = 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, {

View file

@ -1,13 +1,16 @@
type FilterResult<T> = {
[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<T extends Record<string | number | symbol, unknown>>(
export function filterObject<T>(
object: T,
filterFn: <K extends keyof T>(value: T[K], key: K) => boolean,
): Record<keyof T, T[keyof T]> {
return Object.fromEntries(Object.entries(object).filter(([key, value]) => filterFn(value as any, key))) as Record<
keyof T,
T[keyof T]
>;
): FilterResult<T> {
return Object.fromEntries(
Object.entries(object).filter(([key, value]) => filterFn(value as any, key as keyof T)),
) as FilterResult<T>;
}