3
0
Fork 0
mirror of https://github.com/ZeppelinBot/Zeppelin.git synced 2025-07-07 19:17:19 +00:00
zeppelin/backend/src/plugins/GuildMemberCache/GuildMemberCachePlugin.ts
2025-05-23 01:12:52 +00:00

53 lines
2 KiB
TypeScript

import { guildPlugin } from "knub";
import { GuildMemberCache } from "../../data/GuildMemberCache.js";
import { makePublicFn } from "../../pluginUtils.js";
import { SECONDS } from "../../utils.js";
import { cancelDeletionOnMemberJoin } from "./events/cancelDeletionOnMemberJoin.js";
import { removeMemberCacheOnMemberLeave } from "./events/removeMemberCacheOnMemberLeave.js";
import { updateMemberCacheOnMemberUpdate } from "./events/updateMemberCacheOnMemberUpdate.js";
import { updateMemberCacheOnMessage } from "./events/updateMemberCacheOnMessage.js";
import { updateMemberCacheOnRoleChange } from "./events/updateMemberCacheOnRoleChange.js";
import { updateMemberCacheOnVoiceStateUpdate } from "./events/updateMemberCacheOnVoiceStateUpdate.js";
import { getCachedMemberData } from "./functions/getCachedMemberData.js";
import { GuildMemberCachePluginType, zGuildMemberCacheConfig } from "./types.js";
const PENDING_SAVE_INTERVAL = 30 * SECONDS;
export const GuildMemberCachePlugin = guildPlugin<GuildMemberCachePluginType>()({
name: "guild_member_cache",
configSchema: zGuildMemberCacheConfig,
events: [
updateMemberCacheOnMemberUpdate,
updateMemberCacheOnMessage,
updateMemberCacheOnVoiceStateUpdate,
updateMemberCacheOnRoleChange,
removeMemberCacheOnMemberLeave,
cancelDeletionOnMemberJoin,
],
public(pluginData) {
return {
getCachedMemberData: makePublicFn(pluginData, getCachedMemberData),
};
},
beforeLoad(pluginData) {
pluginData.state.memberCache = GuildMemberCache.getGuildInstance(pluginData.guild.id);
// This won't leak memory... too much #trust
pluginData.state.initialUpdatedMembers = new Set();
},
afterLoad(pluginData) {
pluginData.state.saveInterval = setInterval(
() => pluginData.state.memberCache.savePendingUpdates(),
PENDING_SAVE_INTERVAL,
);
},
async beforeUnload(pluginData) {
clearInterval(pluginData.state.saveInterval);
await pluginData.state.memberCache.savePendingUpdates();
},
});