From 0219f63d2d3d3c64021ec6d9f784ccbe85f986b1 Mon Sep 17 00:00:00 2001 From: Yuzu Date: Sun, 10 Jul 2022 19:22:14 -0500 Subject: [PATCH] feat: cache --- packages/biscuit/Util.ts | 7 +++ packages/biscuit/mod.ts | 3 + packages/biscuit/structures/channels.ts | 5 ++ packages/biscuit/structures/guilds/Guild.ts | 29 +++++++--- packages/cache/Channels.ts | 0 packages/cache/Collection.ts | 14 ----- packages/cache/Guilds.ts | 0 packages/cache/Members.ts | 0 packages/cache/Messages.ts | 43 -------------- packages/cache/Users.ts | 33 ----------- packages/cache/mod.ts | 64 +++++++++++++++++++++ 11 files changed, 100 insertions(+), 98 deletions(-) delete mode 100644 packages/cache/Channels.ts delete mode 100644 packages/cache/Collection.ts delete mode 100644 packages/cache/Guilds.ts delete mode 100644 packages/cache/Members.ts delete mode 100644 packages/cache/Messages.ts delete mode 100644 packages/cache/Users.ts diff --git a/packages/biscuit/Util.ts b/packages/biscuit/Util.ts index 37c865d..a0e019a 100644 --- a/packages/biscuit/Util.ts +++ b/packages/biscuit/Util.ts @@ -2,6 +2,13 @@ import type { ButtonBuilder, InputTextBuilder, SelectMenuBuilder } from "./mod.t import type { Permissions } from "./structures/Permissions.ts"; import type { Snowflake } from "./Snowflake.ts"; +/* + * Represents a session's cache + * */ +export interface SymCache { + readonly cache: symbol; +} + /* * @link https://discord.com/developers/docs/resources/channel#message-object-message-flags */ diff --git a/packages/biscuit/mod.ts b/packages/biscuit/mod.ts index 61802a4..bc196b1 100644 --- a/packages/biscuit/mod.ts +++ b/packages/biscuit/mod.ts @@ -51,6 +51,9 @@ export * from "./structures/interactions/InteractionFactory.ts"; export * from "./structures/interactions/ModalSubmitInteraction.ts"; export * from "./structures/interactions/PingInteraction.ts"; +// etc +export * from "./Snowflake.ts"; + // session export * from "./Session.ts"; diff --git a/packages/biscuit/structures/channels.ts b/packages/biscuit/structures/channels.ts index 8c29c20..e93dd14 100644 --- a/packages/biscuit/structures/channels.ts +++ b/packages/biscuit/structures/channels.ts @@ -130,6 +130,8 @@ export class TextChannel { if (data.last_pin_timestamp) { this.lastPinTimestamp = data.last_pin_timestamp; } + + this.messages = new Map(); } readonly session: Session; @@ -141,6 +143,9 @@ export class TextChannel { rateLimitPerUser: number; nsfw: boolean; + /** Meant to be used with cache */ + messages: Map; + /** * Mixin */ diff --git a/packages/biscuit/structures/guilds/Guild.ts b/packages/biscuit/structures/guilds/Guild.ts index 53ea0a6..86a60f4 100644 --- a/packages/biscuit/structures/guilds/Guild.ts +++ b/packages/biscuit/structures/guilds/Guild.ts @@ -22,7 +22,7 @@ import { VerificationLevels, } from "../../../discordeno/mod.ts"; import { encode as _encode, urlToBase64 } from "../../util/urlToBase64.ts"; -import { ThreadChannel } from "../channels.ts"; +import { GuildChannel, ThreadChannel } from "../channels.ts"; import Util from "../../Util.ts"; import Member from "../Member.ts"; import BaseGuild from "./BaseGuild.ts"; @@ -208,10 +208,22 @@ export class Guild extends BaseGuild implements Model { this.vefificationLevel = data.verification_level; this.defaultMessageNotificationLevel = data.default_message_notifications; this.explicitContentFilterLevel = data.explicit_content_filter; - this.members = data.members?.map((member) => new Member(session, { ...member, user: member.user! }, data.id)) ?? - []; - this.roles = data.roles.map((role) => new Role(session, role, data.id)); - this.emojis = data.emojis.map((guildEmoji) => new GuildEmoji(session, guildEmoji, data.id)); + + this.members = new Map( + data.members?.map((member) => [data.id, new Member(session, { ...member, user: member.user! }, data.id)]) + ); + + this.roles = new Map( + data.roles.map((role) => [data.id, new Role(session, role, data.id)]) + ); + + this.emojis = new Map( + data.emojis.map((guildEmoji) => [guildEmoji.id!, new GuildEmoji(session, guildEmoji, data.id)]) + ); + + this.channels = new Map( + data.channels?.map((guildChannel) => [guildChannel.id, new GuildChannel(session, guildChannel, data.id)]) + ); } splashHash?: bigint; @@ -222,9 +234,10 @@ export class Guild extends BaseGuild implements Model { vefificationLevel: VerificationLevels; defaultMessageNotificationLevel: DefaultMessageNotificationLevels; explicitContentFilterLevel: ExplicitContentFilterLevels; - members: Member[]; - roles: Role[]; - emojis: GuildEmoji[]; + members: Map; + roles: Map; + emojis: Map; + channels: Map; /** * 'null' would reset the nickname diff --git a/packages/cache/Channels.ts b/packages/cache/Channels.ts deleted file mode 100644 index e69de29..0000000 diff --git a/packages/cache/Collection.ts b/packages/cache/Collection.ts deleted file mode 100644 index d83dc05..0000000 --- a/packages/cache/Collection.ts +++ /dev/null @@ -1,14 +0,0 @@ -import type { Session } from "./deps.ts"; - -export class Collection extends Map { - constructor(session: Session, entries: Iterable) { - super(entries); - - this.session = session; - } - - /** Reference to a session */ - readonly session: Session; -} - -export default Collection; diff --git a/packages/cache/Guilds.ts b/packages/cache/Guilds.ts deleted file mode 100644 index e69de29..0000000 diff --git a/packages/cache/Members.ts b/packages/cache/Members.ts deleted file mode 100644 index e69de29..0000000 diff --git a/packages/cache/Messages.ts b/packages/cache/Messages.ts deleted file mode 100644 index ef00e8f..0000000 --- a/packages/cache/Messages.ts +++ /dev/null @@ -1,43 +0,0 @@ -import type { DiscordMessage, Session } from "./deps.ts"; -import { Message } from "./deps.ts"; -import { Collection } from "./Collection.ts"; - -export class CachedMessage extends Message { - constructor(session: Session, data: DiscordMessage) { - super(session, data); - - CachedMessage.from(this); - } - - _id!: bigint; - - static from(message: Message): CachedMessage { - const target: CachedMessage = Object.assign(message, { _id: BigInt(message.id) }); - - Object.defineProperty(target, "id", { - get(this: CachedMessage) { - return String(this._id); - } - }); - - return target; - } -} - -export class MessageCache extends Collection { - constructor(session: Session, entries: Iterable) { - super(session, entries); - } - - async fetch(channelId: bigint, id: bigint) { - const message = this.get(id) ?? await Message.prototype.fetch.call({ - session: this.session, - channelId: String(channelId), - id: String(id) - }); - - return CachedMessage.from(message); - } -} - -export default MessageCache; diff --git a/packages/cache/Users.ts b/packages/cache/Users.ts deleted file mode 100644 index 7ad9b68..0000000 --- a/packages/cache/Users.ts +++ /dev/null @@ -1,33 +0,0 @@ -import type { DiscordUser, Session } from "./deps.ts"; -import { User } from "./deps.ts"; -import { Collection } from "./Collection.ts"; - -export class CachedUser extends User { - constructor(session: Session, data: DiscordUser) { - super(session, data); - - CachedUser.from(this); - } - - _id!: bigint; - - static from(user: User): CachedUser { - const target: CachedUser = Object.assign(user, { _id: BigInt(user.id) }); - - Object.defineProperty(target, "id", { - get(this: CachedUser) { - return String(this._id); - } - }); - - return target; - } -} - -export class UserCache extends Collection { - constructor(session: Session, entries: Iterable) { - super(session, entries); - } -} - -export default UserCache; diff --git a/packages/cache/mod.ts b/packages/cache/mod.ts index e69de29..f1f6316 100644 --- a/packages/cache/mod.ts +++ b/packages/cache/mod.ts @@ -0,0 +1,64 @@ +import type { + SymCache, + Session, + Snowflake, + DiscordGuild, + DiscordEmoji, + DiscordUser, + DiscordChannel, +} from "./deps.ts"; + +import { + Guild, + User, + DMChannel, + GuildEmoji, +} from "./deps.ts"; + +export const cache_sym = Symbol("@cache"); + +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) { + // TODO: optimizee this garbage + cache.guilds.set(guild.id, new Guild(cache.session, guild)); +}