import type { ChannelInGuild, ChannelTypes, ChannelWithMessagesInGuild, DiscordChannel, Snowflake } from './deps.ts'; import type { CachedMessage } from './messages.ts'; import type { CachedGuild } from './guilds.ts'; import type { SessionCache } from './mod.ts'; import { Collection } from './Collection.ts'; import { ChannelFactory, DMChannel, textBasedChannels } from './deps.ts'; export interface CachedGuildChannel extends Omit { type: ChannelTypes; messages: Collection; guild: CachedGuild; guildId: Snowflake; } export interface CachedGuildChannel extends Omit { type: ChannelTypes; guild: CachedGuild; guildId: Snowflake; } export interface CachedDMChannel extends DMChannel { messages: Collection; } export function channelBootstrapper(cache: SessionCache, channel: DiscordChannel) { if (!channel.guild_id) { cache.dms.set( channel.id, Object.assign(new DMChannel(cache.session, channel), { messages: new Collection(cache.session), }), ); return; } cache.guilds.retrieve(channel.guild_id, (guild) => { if (textBasedChannels.includes(channel.type)) { guild.channels.set( channel.id, Object.assign( ChannelFactory.fromGuildChannel(cache.session, channel) as ChannelWithMessagesInGuild, { messages: new Collection(cache.session), guildId: channel.guild_id!, get guild(): CachedGuild { return cache.guilds.get(this.guildId)!; }, }, ), ); } else { guild.channels.set( channel.id, Object.assign( ChannelFactory.fromGuildChannel(cache.session, channel), { guildId: channel.guild_id!, get guild(): CachedGuild { return cache.guilds.get(this.guildId)!; }, }, ), ); } }); }