diff --git a/packages/biscuit/mod.ts b/packages/biscuit/mod.ts index 5d8d4de..61802a4 100644 --- a/packages/biscuit/mod.ts +++ b/packages/biscuit/mod.ts @@ -1,4 +1,7 @@ // structures +import { Session } from "./Session.ts"; +export default Session; + export * from "./structures/Attachment.ts"; export * from "./structures/Base.ts"; export * from "./structures/Embed.ts"; diff --git a/packages/biscuit/structures/Message.ts b/packages/biscuit/structures/Message.ts index e933364..ea07beb 100644 --- a/packages/biscuit/structures/Message.ts +++ b/packages/biscuit/structures/Message.ts @@ -361,6 +361,18 @@ export class Message implements Model { return new Message(this.session, message); } + async fetch() { + const message = await this.session.rest.runMethod( + this.session.rest, + "GET", + Routes.CHANNEL_MESSAGE(this.channelId, this.message), + ); + + if (!message?.id) return; + + return new Message(this.session, message); + } + /* * alias of Message.crosspost * */ diff --git a/packages/cache/Channels.ts b/packages/cache/Channels.ts new file mode 100644 index 0000000..e69de29 diff --git a/packages/cache/Collection.ts b/packages/cache/Collection.ts new file mode 100644 index 0000000..d83dc05 --- /dev/null +++ b/packages/cache/Collection.ts @@ -0,0 +1,14 @@ +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 new file mode 100644 index 0000000..e69de29 diff --git a/packages/cache/Members.ts b/packages/cache/Members.ts new file mode 100644 index 0000000..e69de29 diff --git a/packages/cache/Messages.ts b/packages/cache/Messages.ts new file mode 100644 index 0000000..ef00e8f --- /dev/null +++ b/packages/cache/Messages.ts @@ -0,0 +1,43 @@ +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 new file mode 100644 index 0000000..7ad9b68 --- /dev/null +++ b/packages/cache/Users.ts @@ -0,0 +1,33 @@ +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/deps.ts b/packages/cache/deps.ts new file mode 100644 index 0000000..dc3c536 --- /dev/null +++ b/packages/cache/deps.ts @@ -0,0 +1,2 @@ +export * from "../biscuit/mod.ts"; +export * from "../discordeno/mod.ts"; diff --git a/packages/cache/mod.ts b/packages/cache/mod.ts new file mode 100644 index 0000000..e69de29