import type { ChannelTypes, SymCache, Session, Snowflake, DiscordGuild, DiscordEmoji, DiscordUser, DiscordChannel, DiscordMemberWithUser, } from "./deps.ts"; import { ChannelFactory, Guild, User, DMChannel, GuildEmoji, GuildTextChannel, Member, Message, VoiceChannel, ThreadChannel, NewsChannel, } from "./deps.ts"; export const cache_sym = Symbol("@cache"); export interface CachedMessage extends Omit { authorId: Snowflake; author?: User; } export interface CachedMember extends Omit { userId: Snowflake; user?: User; } export interface CachedGuild extends Omit { channels: Map; members: Map; } export interface CachedGuildChannel extends Omit { type: ChannelTypes; messages: Map; } export interface CachedGuildChannel extends Omit { type: ChannelTypes; messages: Map; } export interface CachedGuildChannel extends Omit { type: ChannelTypes; messages: Map; } export interface CachedGuildChannel extends Omit { type: ChannelTypes messages: Map; } export interface SessionCache extends SymCache { guilds: StructCache; users: StructCache; dms: StructCache; emojis: StructCache; session: Session, } export default function (session: Session): SessionCache { return { guilds: new StructCache(session), users: new StructCache(session), dms: new StructCache(session), emojis: new StructCache(session), cache: cache_sym, session, }; } export class StructCache extends Map { constructor(session: Session, entries?: Iterable) { super(entries); this.session = session; } readonly session: Session; } export function userBootstrapper(cache: SessionCache, user: DiscordUser) { cache.users.set(user.id, new User(cache.session, user)); } export function emojiBootstrapper(cache: SessionCache, emoji: DiscordEmoji, guildId: Snowflake) { if (!emoji.id) return; cache.emojis.set(emoji.id, new GuildEmoji(cache.session, emoji, guildId)); } export function DMChannelBootstrapper(cache: SessionCache, channel: DiscordChannel) { cache.dms.set(channel.id, new DMChannel(cache.session, channel)); } export function guildBootstrapper(guild: DiscordGuild, cache: SessionCache) { const members = new Map(guild.members?.map((data) => { const obj: CachedMember = Object.assign(new Member(cache.session, data as DiscordMemberWithUser, guild.id), { userId: data.user!.id, get user(): User | undefined { return cache.users.get(this.userId); } }); return [data.user!.id, obj as CachedMember]; })); const channels = new Map(guild.channels?.map((data) => { const obj = Object.assign(ChannelFactory.from(cache.session, data), { messages: new Map(), }); return [data.id, obj as CachedGuildChannel]; })); cache.guilds.set(guild.id, Object.assign( new Guild(cache.session, guild), { members, channels }, )); }