import type { Emoji, Session, SymCache } from "./deps.ts"; import type { CachedGuild } from "./guilds.ts"; import type { CachedUser } from "./users.ts"; import type { CachedDMChannel } from "./channels.ts"; import { Collection } from "./Collection.ts"; import { memberBootstrapper } from "./members.ts"; import { userBootstrapper } from "./users.ts"; import { channelBootstrapper } from "./channels.ts"; import { guildBootstrapper } from "./guilds.ts"; import { messageBootstrapper, reactionBootstrapper, reactionBootstrapperDeletions } from "./messages.ts"; export const cache_sym = Symbol("@cache"); export interface SessionCache extends SymCache { guilds: Collection; users: Collection; dms: Collection; emojis: Collection; session: Session; } export function enableCache(session: Session): SessionCache { const cache = { guilds: new Collection(session), users: new Collection(session), dms: new Collection(session), emojis: new Collection(session), cache: cache_sym, session, }; session.on("raw", (data) => { // deno-lint-ignore no-explicit-any const raw = data.d as any; if (!raw) return; switch (data.t) { // TODO: add more events // for now users have to use the bootstrappers that are not implemented yet case "MESSAGE_CREATE": messageBootstrapper(cache, raw, false); break; case "MESSAGE_UPDATE": messageBootstrapper(cache, raw, !raw.edited_timestamp); break; case "CHANNEL_CREATE": channelBootstrapper(cache, raw); break; case "GUILD_MEMBER_ADD": memberBootstrapper(cache, raw, raw.guild_id); break; case "GUILD_CREATE": guildBootstrapper(cache, raw); break; case "GUILD_DELETE": cache.guilds.delete(raw.id); break; case "MESSAGE_REACTION_ADD": reactionBootstrapper(cache, raw, false); break; case "MESSAGE_REACTION_REMOVE": reactionBootstrapper(cache, raw, false); break; case "MESSAGE_REACTION_REMOVE_ALL": reactionBootstrapperDeletions(cache, raw); break; case "READY": userBootstrapper(cache, raw.user); break; default: session.emit("debug", `NOT CACHED: ${JSON.stringify(raw)}`); } }); return cache; } export default enableCache;