zappyzep/backend/src/utils/findMatchingAuditLogEntry.ts
Tiago R 06877e90cc
Update djs & knub (#395)
* update pkgs

Signed-off-by: GitHub <noreply@github.com>

* new knub typings

Signed-off-by: GitHub <noreply@github.com>

* more pkg updates

Signed-off-by: GitHub <noreply@github.com>

* more fixes

Signed-off-by: GitHub <noreply@github.com>

* channel typings

Signed-off-by: GitHub <noreply@github.com>

* more message utils typings fixes

Signed-off-by: GitHub <noreply@github.com>

* migrate permissions

Signed-off-by: GitHub <noreply@github.com>

* fix: InternalPoster webhookables

Signed-off-by: GitHub <noreply@github.com>

* djs typings: Attachment & Util

Signed-off-by: GitHub <noreply@github.com>

* more typings

Signed-off-by: GitHub <noreply@github.com>

* fix: rename permissionNames

Signed-off-by: GitHub <noreply@github.com>

* more fixes

Signed-off-by: GitHub <noreply@github.com>

* half the number of errors

* knub commands => messageCommands

Signed-off-by: GitHub <noreply@github.com>

* configPreprocessor => configParser

Signed-off-by: GitHub <noreply@github.com>

* fix channel.messages

Signed-off-by: GitHub <noreply@github.com>

* revert automod any typing

Signed-off-by: GitHub <noreply@github.com>

* more configParser typings

Signed-off-by: GitHub <noreply@github.com>

* revert

Signed-off-by: GitHub <noreply@github.com>

* remove knub type params

Signed-off-by: GitHub <noreply@github.com>

* fix more MessageEmbed / MessageOptions

Signed-off-by: GitHub <noreply@github.com>

* dumb commit for @almeidx to see why this is stupid

Signed-off-by: GitHub <noreply@github.com>

* temp disable custom_events

Signed-off-by: GitHub <noreply@github.com>

* more minor typings fixes - 23 err left

Signed-off-by: GitHub <noreply@github.com>

* update djs dep

* +debug build method (revert this)

Signed-off-by: GitHub <noreply@github.com>

* Revert "+debug build method (revert this)"

This reverts commit a80af1e729b742d1aad1097df538d224fbd32ce7.

* Redo +debug build (Revert this)

Signed-off-by: GitHub <noreply@github.com>

* uniform before/after Load shorthands

Signed-off-by: GitHub <noreply@github.com>

* remove unused imports & add prettier plugin

Signed-off-by: GitHub <noreply@github.com>

* env fixes for web platform hosting

Signed-off-by: GitHub <noreply@github.com>

* feat: knub v32-next; related fixes

* fix: allow legacy keys in change_perms action

* fix: request Message Content intent

* fix: use Knub's config validation logic in API

* fix(dashboard): fix error when there are no message and/or slash commands in a plugin

* fix(automod): start_thread action thread options

* fix(CustomEvents): message command types

* chore: remove unneeded type annotation

* feat: add forum channel icon; use thread icon for news threads

* chore: make tslint happy

* chore: fix formatting

---------

Signed-off-by: GitHub <noreply@github.com>
Co-authored-by: almeidx <almeidx@pm.me>
Co-authored-by: Dragory <2606411+Dragory@users.noreply.github.com>
2023-04-01 14:58:17 +03:00

69 lines
2.1 KiB
TypeScript

import { AuditLogEvent, Guild, GuildAuditLogsEntry } from "discord.js";
import { SECONDS, sleep } from "../utils";
const BATCH_DEBOUNCE_TIME = 2 * SECONDS;
const BATCH_FETCH_COUNT_INCREMENT = 10;
type Batch = {
_waitUntil: number;
_fetchCount: number;
_promise: Promise<GuildAuditLogsEntry[]>;
join: () => Promise<GuildAuditLogsEntry[]>;
};
const batches = new Map<string, Batch>();
/**
* Find a recent audit log entry matching the given criteria.
* This function will debounce and batch simultaneous calls into one audit log request.
*/
export async function findMatchingAuditLogEntry(
guild: Guild,
action?: AuditLogEvent,
targetId?: string,
): Promise<GuildAuditLogsEntry | undefined> {
let candidates: GuildAuditLogsEntry[];
if (batches.has(guild.id)) {
candidates = await batches.get(guild.id)!.join();
} else {
const batch: Batch = {
_waitUntil: Date.now(),
_fetchCount: 0,
_promise: new Promise(async (resolve) => {
await sleep(BATCH_DEBOUNCE_TIME);
do {
await sleep(Math.max(0, batch._waitUntil - Date.now()));
} while (Date.now() < batch._waitUntil);
const result = await guild
.fetchAuditLogs({
limit: batch._fetchCount,
})
.catch((err) => {
// tslint:disable-next-line:no-console
console.warn(`[DEBUG] Audit log error in ${guild.id} (${guild.name}): ${err.message}`);
return null;
});
const _candidates = Array.from(result?.entries.values() ?? []);
batches.delete(guild.id);
// TODO: Figure out the type
resolve(_candidates as any);
}),
join() {
batch._waitUntil = Date.now() + BATCH_DEBOUNCE_TIME;
batch._fetchCount = Math.min(100, batch._fetchCount + BATCH_FETCH_COUNT_INCREMENT);
return batch._promise;
},
};
batches.set(guild.id, batch);
candidates = await batch.join();
}
return candidates.find(
(entry) =>
(action == null || entry.action === action) && (targetId == null || (entry.target as any)?.id === targetId),
);
}