From 16399562f72d1ded23d87edb52d25f0b6c02e1e9 Mon Sep 17 00:00:00 2001 From: Yuzu Date: Sun, 10 Jul 2022 21:49:36 -0500 Subject: [PATCH] feat: cache almost done --- mod.ts | 1 + packages/biscuit/structures/Message.ts | 2 +- packages/biscuit/structures/channels.ts | 36 +++++++++--- packages/cache/mod.ts | 73 +++++++++++++++++++++++-- 4 files changed, 99 insertions(+), 13 deletions(-) diff --git a/mod.ts b/mod.ts index 83c4805..c8684fa 100644 --- a/mod.ts +++ b/mod.ts @@ -1,2 +1,3 @@ export * from "./packages/biscuit/mod.ts"; export * from "./packages/discordeno/mod.ts"; +export * from "./packages/cache/mod.ts"; diff --git a/packages/biscuit/structures/Message.ts b/packages/biscuit/structures/Message.ts index ea07beb..795fd39 100644 --- a/packages/biscuit/structures/Message.ts +++ b/packages/biscuit/structures/Message.ts @@ -365,7 +365,7 @@ export class Message implements Model { const message = await this.session.rest.runMethod( this.session.rest, "GET", - Routes.CHANNEL_MESSAGE(this.channelId, this.message), + Routes.CHANNEL_MESSAGE(this.channelId, this.id), ); if (!message?.id) return; diff --git a/packages/biscuit/structures/channels.ts b/packages/biscuit/structures/channels.ts index e93dd14..4ad3190 100644 --- a/packages/biscuit/structures/channels.ts +++ b/packages/biscuit/structures/channels.ts @@ -130,8 +130,6 @@ export class TextChannel { if (data.last_pin_timestamp) { this.lastPinTimestamp = data.last_pin_timestamp; } - - this.messages = new Map(); } readonly session: Session; @@ -143,9 +141,6 @@ export class TextChannel { rateLimitPerUser: number; nsfw: boolean; - /** Meant to be used with cache */ - messages: Map; - /** * Mixin */ @@ -538,10 +533,10 @@ export class DMChannel extends BaseChannel implements Model { } } -TextChannel.applyTo(DMChannel); - export interface DMChannel extends Omit, Omit {} +TextChannel.applyTo(DMChannel); + /** VoiceChannel */ export class VoiceChannel extends BaseVoiceChannel { constructor(session: Session, data: DiscordChannel, guildId: Snowflake) { @@ -661,12 +656,26 @@ export class ThreadChannel extends GuildChannel implements Model { } } +export interface ThreadChannel extends Omit, Omit {} + TextChannel.applyTo(ThreadChannel); -export interface ThreadChannel extends Omit, Omit {} +export class GuildTextChannel extends GuildChannel { + constructor(session: Session, data: DiscordChannel, guildId: Snowflake) { + super(session, data, guildId); + this.type = data.type as ChannelTypes.GuildText; + } + + override type: ChannelTypes.GuildText; +} + +export interface GuildTextChannel extends GuildChannel, TextChannel {} + +TextChannel.applyTo(GuildTextChannel); /** ChannelFactory */ export type Channel = + | GuildTextChannel | TextChannel | VoiceChannel | DMChannel @@ -674,12 +683,23 @@ export type Channel = | ThreadChannel | StageChannel; +export type ChannelWithMessages = + | GuildTextChannel + | VoiceChannel + | DMChannel + | NewsChannel + | ThreadChannel; + +export type ChannelWithMessagesInGuild = Exclude; + export class ChannelFactory { static from(session: Session, channel: DiscordChannel): Channel { switch (channel.type) { case ChannelTypes.GuildPublicThread: case ChannelTypes.GuildPrivateThread: return new ThreadChannel(session, channel, channel.guild_id!); + case ChannelTypes.GuildText: + return new GuildTextChannel(session, channel, channel.guild_id!); case ChannelTypes.GuildNews: return new NewsChannel(session, channel, channel.guild_id!); case ChannelTypes.DM: diff --git a/packages/cache/mod.ts b/packages/cache/mod.ts index f1f6316..06f4c84 100644 --- a/packages/cache/mod.ts +++ b/packages/cache/mod.ts @@ -1,4 +1,5 @@ import type { + ChannelTypes, SymCache, Session, Snowflake, @@ -6,19 +7,62 @@ import type { 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; + guilds: StructCache; users: StructCache; dms: StructCache; emojis: StructCache; @@ -27,7 +71,7 @@ export interface SessionCache extends SymCache { export default function (session: Session): SessionCache { return { - guilds: new StructCache(session), + guilds: new StructCache(session), users: new StructCache(session), dms: new StructCache(session), emojis: new StructCache(session), @@ -59,6 +103,27 @@ export function DMChannelBootstrapper(cache: SessionCache, channel: DiscordChann } export function guildBootstrapper(guild: DiscordGuild, cache: SessionCache) { - // TODO: optimizee this garbage - cache.guilds.set(guild.id, new Guild(cache.session, guild)); + 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 }, + )); }