debug: re-enable Automod with extra profiling

This commit is contained in:
Dragory 2021-10-05 23:49:00 +03:00
parent 2d012bc5cf
commit 53d7491c1b
No known key found for this signature in database
GPG key ID: 5F387BA66DF8AAC1
8 changed files with 43 additions and 8 deletions

View file

@ -193,15 +193,15 @@ export const AutomodPlugin = zeppelinGuildPlugin<AutomodPluginType>()({
// prettier-ignore // prettier-ignore
events: [ events: [
// RunAutomodOnJoinEvt, RunAutomodOnJoinEvt,
// RunAutomodOnMemberUpdate, RunAutomodOnMemberUpdate,
// RunAutomodOnLeaveEvt, RunAutomodOnLeaveEvt,
// Messages use message events from SavedMessages, see onLoad below // Messages use message events from SavedMessages, see onLoad below
], ],
commands: [AntiraidClearCmd, SetAntiraidCmd, ViewAntiraidCmd], commands: [AntiraidClearCmd, SetAntiraidCmd, ViewAntiraidCmd],
async __beforeLoad(pluginData) { async beforeLoad(pluginData) {
pluginData.state.queue = new Queue(); pluginData.state.queue = new Queue();
pluginData.state.regexRunner = getRegExpRunner(`guild-${pluginData.guild.id}`); pluginData.state.regexRunner = getRegExpRunner(`guild-${pluginData.guild.id}`);
@ -224,7 +224,7 @@ export const AutomodPlugin = zeppelinGuildPlugin<AutomodPluginType>()({
pluginData.state.cachedAntiraidLevel = await pluginData.state.antiraidLevels.get(); pluginData.state.cachedAntiraidLevel = await pluginData.state.antiraidLevels.get();
}, },
async __afterLoad(pluginData) { async afterLoad(pluginData) {
pluginData.state.clearRecentActionsInterval = setInterval(() => clearOldRecentActions(pluginData), 1 * MINUTES); pluginData.state.clearRecentActionsInterval = setInterval(() => clearOldRecentActions(pluginData), 1 * MINUTES);
pluginData.state.clearRecentSpamInterval = setInterval(() => clearOldRecentSpam(pluginData), 1 * SECONDS); pluginData.state.clearRecentSpamInterval = setInterval(() => clearOldRecentSpam(pluginData), 1 * SECONDS);
pluginData.state.clearRecentNicknameChangesInterval = setInterval( pluginData.state.clearRecentNicknameChangesInterval = setInterval(
@ -289,7 +289,7 @@ export const AutomodPlugin = zeppelinGuildPlugin<AutomodPluginType>()({
registerEventListenersFromMap(mutesEvents, pluginData.state.mutesListeners); registerEventListenersFromMap(mutesEvents, pluginData.state.mutesListeners);
}, },
async __beforeUnload(pluginData) { async beforeUnload(pluginData) {
const countersPlugin = pluginData.getPlugin(CountersPlugin); const countersPlugin = pluginData.getPlugin(CountersPlugin);
countersPlugin.offCounterEvent("trigger", pluginData.state.onCounterTrigger); countersPlugin.offCounterEvent("trigger", pluginData.state.onCounterTrigger);
countersPlugin.offCounterEvent("reverseTrigger", pluginData.state.onCounterReverseTrigger); countersPlugin.offCounterEvent("reverseTrigger", pluginData.state.onCounterReverseTrigger);

View file

@ -1,10 +1,13 @@
import { GuildPluginData } from "knub"; import { GuildPluginData } from "knub";
import { RECENT_ACTION_EXPIRY_TIME } from "../constants"; import { RECENT_ACTION_EXPIRY_TIME } from "../constants";
import { AutomodPluginType } from "../types"; import { AutomodPluginType } from "../types";
import { startProfiling } from "../../../utils/easyProfiler";
export function clearOldRecentActions(pluginData: GuildPluginData<AutomodPluginType>) { export function clearOldRecentActions(pluginData: GuildPluginData<AutomodPluginType>) {
const stopProfiling = startProfiling(pluginData.getKnubInstance().profiler, "automod:fns:clearOldRecentActions");
const now = Date.now(); const now = Date.now();
pluginData.state.recentActions = pluginData.state.recentActions.filter((info) => { pluginData.state.recentActions = pluginData.state.recentActions.filter((info) => {
return info.context.timestamp + RECENT_ACTION_EXPIRY_TIME > now; return info.context.timestamp + RECENT_ACTION_EXPIRY_TIME > now;
}); });
stopProfiling();
} }

View file

@ -1,10 +1,13 @@
import { GuildPluginData } from "knub"; import { GuildPluginData } from "knub";
import { RECENT_SPAM_EXPIRY_TIME } from "../constants"; import { RECENT_SPAM_EXPIRY_TIME } from "../constants";
import { AutomodPluginType } from "../types"; import { AutomodPluginType } from "../types";
import { startProfiling } from "../../../utils/easyProfiler";
export function clearOldRecentSpam(pluginData: GuildPluginData<AutomodPluginType>) { export function clearOldRecentSpam(pluginData: GuildPluginData<AutomodPluginType>) {
const stopProfiling = startProfiling(pluginData.getKnubInstance().profiler, "automod:fns:clearOldRecentSpam");
const now = Date.now(); const now = Date.now();
pluginData.state.recentSpam = pluginData.state.recentSpam.filter((spam) => { pluginData.state.recentSpam = pluginData.state.recentSpam.filter((spam) => {
return spam.timestamp + RECENT_SPAM_EXPIRY_TIME > now; return spam.timestamp + RECENT_SPAM_EXPIRY_TIME > now;
}); });
stopProfiling();
} }

View file

@ -1,7 +1,12 @@
import { GuildPluginData } from "knub"; import { GuildPluginData } from "knub";
import { AutomodContext, AutomodPluginType } from "../types"; import { AutomodContext, AutomodPluginType } from "../types";
import { startProfiling } from "../../../utils/easyProfiler";
export function clearRecentActionsForMessage(pluginData: GuildPluginData<AutomodPluginType>, context: AutomodContext) { export function clearRecentActionsForMessage(pluginData: GuildPluginData<AutomodPluginType>, context: AutomodContext) {
const stopProfiling = startProfiling(
pluginData.getKnubInstance().profiler,
"automod:fns:clearRecentActionsForMessage",
);
const message = context.message!; const message = context.message!;
const globalIdentifier = message.user_id; const globalIdentifier = message.user_id;
const perChannelIdentifier = `${message.channel_id}-${message.user_id}`; const perChannelIdentifier = `${message.channel_id}-${message.user_id}`;
@ -9,4 +14,5 @@ export function clearRecentActionsForMessage(pluginData: GuildPluginData<Automod
pluginData.state.recentActions = pluginData.state.recentActions.filter((act) => { pluginData.state.recentActions = pluginData.state.recentActions.filter((act) => {
return act.identifier !== globalIdentifier && act.identifier !== perChannelIdentifier; return act.identifier !== globalIdentifier && act.identifier !== perChannelIdentifier;
}); });
stopProfiling();
} }

View file

@ -1,13 +1,17 @@
import { GuildPluginData } from "knub"; import { GuildPluginData } from "knub";
import { RecentActionType } from "../constants"; import { RecentActionType } from "../constants";
import { AutomodPluginType } from "../types"; import { AutomodPluginType } from "../types";
import { startProfiling } from "../../../utils/easyProfiler";
export function findRecentSpam( export function findRecentSpam(
pluginData: GuildPluginData<AutomodPluginType>, pluginData: GuildPluginData<AutomodPluginType>,
type: RecentActionType, type: RecentActionType,
identifier?: string, identifier?: string,
) { ) {
return pluginData.state.recentSpam.find((spam) => { const stopProfiling = startProfiling(pluginData.getKnubInstance().profiler, "automod:fns:findRecentSpam");
const result = pluginData.state.recentSpam.find((spam) => {
return spam.type === type && (!identifier || spam.identifiers.includes(identifier)); return spam.type === type && (!identifier || spam.identifiers.includes(identifier));
}); });
stopProfiling();
return result;
} }

View file

@ -4,6 +4,7 @@ import { SavedMessage } from "../../../data/entities/SavedMessage";
import { RecentActionType } from "../constants"; import { RecentActionType } from "../constants";
import { AutomodPluginType } from "../types"; import { AutomodPluginType } from "../types";
import { getMatchingRecentActions } from "./getMatchingRecentActions"; import { getMatchingRecentActions } from "./getMatchingRecentActions";
import { startProfiling } from "../../../utils/easyProfiler";
export function getMatchingMessageRecentActions( export function getMatchingMessageRecentActions(
pluginData: GuildPluginData<AutomodPluginType>, pluginData: GuildPluginData<AutomodPluginType>,
@ -13,11 +14,16 @@ export function getMatchingMessageRecentActions(
count: number, count: number,
within: number, within: number,
) { ) {
const stopProfiling = startProfiling(
pluginData.getKnubInstance().profiler,
"automod:fns:getMatchingMessageRecentActions",
);
const since = moment.utc(message.posted_at).valueOf() - within; const since = moment.utc(message.posted_at).valueOf() - within;
const to = moment.utc(message.posted_at).valueOf(); const to = moment.utc(message.posted_at).valueOf();
const recentActions = getMatchingRecentActions(pluginData, type, identifier, since, to); const recentActions = getMatchingRecentActions(pluginData, type, identifier, since, to);
const totalCount = recentActions.reduce((total, action) => total + action.count, 0); const totalCount = recentActions.reduce((total, action) => total + action.count, 0);
stopProfiling();
if (totalCount >= count) { if (totalCount >= count) {
return { return {
recentActions, recentActions,

View file

@ -1,6 +1,7 @@
import { GuildPluginData } from "knub"; import { GuildPluginData } from "knub";
import { RecentActionType } from "../constants"; import { RecentActionType } from "../constants";
import { AutomodPluginType } from "../types"; import { AutomodPluginType } from "../types";
import { startProfiling } from "../../../utils/easyProfiler";
export function getMatchingRecentActions( export function getMatchingRecentActions(
pluginData: GuildPluginData<AutomodPluginType>, pluginData: GuildPluginData<AutomodPluginType>,
@ -9,9 +10,10 @@ export function getMatchingRecentActions(
since: number, since: number,
to?: number, to?: number,
) { ) {
const stopProfiling = startProfiling(pluginData.getKnubInstance().profiler, "automod:fns:getMatchingRecentActions");
to = to || Date.now(); to = to || Date.now();
return pluginData.state.recentActions.filter((action) => { const result = pluginData.state.recentActions.filter((action) => {
return ( return (
action.type === type && action.type === type &&
(!identifier || action.identifier === identifier) && (!identifier || action.identifier === identifier) &&
@ -20,4 +22,6 @@ export function getMatchingRecentActions(
!action.context.actioned !action.context.actioned
); );
}); });
stopProfiling();
return result;
} }

View file

@ -0,0 +1,9 @@
import { Profiler } from "knub/dist/Profiler";
import { performance } from "perf_hooks";
export const startProfiling = (profiler: Profiler, key: string) => {
const startTime = performance.now();
return () => {
profiler.addDataPoint(key, performance.now() - startTime);
};
};