mirror of
https://github.com/tiramisulabs/seyfert.git
synced 2025-07-04 05:56:09 +00:00
feat: cache almost done
This commit is contained in:
parent
e211ec9b8c
commit
16399562f7
1
mod.ts
1
mod.ts
@ -1,2 +1,3 @@
|
|||||||
export * from "./packages/biscuit/mod.ts";
|
export * from "./packages/biscuit/mod.ts";
|
||||||
export * from "./packages/discordeno/mod.ts";
|
export * from "./packages/discordeno/mod.ts";
|
||||||
|
export * from "./packages/cache/mod.ts";
|
||||||
|
@ -365,7 +365,7 @@ export class Message implements Model {
|
|||||||
const message = await this.session.rest.runMethod<DiscordMessage>(
|
const message = await this.session.rest.runMethod<DiscordMessage>(
|
||||||
this.session.rest,
|
this.session.rest,
|
||||||
"GET",
|
"GET",
|
||||||
Routes.CHANNEL_MESSAGE(this.channelId, this.message),
|
Routes.CHANNEL_MESSAGE(this.channelId, this.id),
|
||||||
);
|
);
|
||||||
|
|
||||||
if (!message?.id) return;
|
if (!message?.id) return;
|
||||||
|
@ -130,8 +130,6 @@ export class TextChannel {
|
|||||||
if (data.last_pin_timestamp) {
|
if (data.last_pin_timestamp) {
|
||||||
this.lastPinTimestamp = data.last_pin_timestamp;
|
this.lastPinTimestamp = data.last_pin_timestamp;
|
||||||
}
|
}
|
||||||
|
|
||||||
this.messages = new Map();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
readonly session: Session;
|
readonly session: Session;
|
||||||
@ -143,9 +141,6 @@ export class TextChannel {
|
|||||||
rateLimitPerUser: number;
|
rateLimitPerUser: number;
|
||||||
nsfw: boolean;
|
nsfw: boolean;
|
||||||
|
|
||||||
/** Meant to be used with cache */
|
|
||||||
messages: Map<Snowflake, Message>;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Mixin
|
* Mixin
|
||||||
*/
|
*/
|
||||||
@ -538,10 +533,10 @@ export class DMChannel extends BaseChannel implements Model {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
TextChannel.applyTo(DMChannel);
|
|
||||||
|
|
||||||
export interface DMChannel extends Omit<TextChannel, "type">, Omit<BaseChannel, "type"> {}
|
export interface DMChannel extends Omit<TextChannel, "type">, Omit<BaseChannel, "type"> {}
|
||||||
|
|
||||||
|
TextChannel.applyTo(DMChannel);
|
||||||
|
|
||||||
/** VoiceChannel */
|
/** VoiceChannel */
|
||||||
export class VoiceChannel extends BaseVoiceChannel {
|
export class VoiceChannel extends BaseVoiceChannel {
|
||||||
constructor(session: Session, data: DiscordChannel, guildId: Snowflake) {
|
constructor(session: Session, data: DiscordChannel, guildId: Snowflake) {
|
||||||
@ -661,12 +656,26 @@ export class ThreadChannel extends GuildChannel implements Model {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export interface ThreadChannel extends Omit<GuildChannel, "type">, Omit<TextChannel, "type"> {}
|
||||||
|
|
||||||
TextChannel.applyTo(ThreadChannel);
|
TextChannel.applyTo(ThreadChannel);
|
||||||
|
|
||||||
export interface ThreadChannel extends Omit<GuildChannel, "type">, Omit<TextChannel, "type"> {}
|
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 */
|
/** ChannelFactory */
|
||||||
export type Channel =
|
export type Channel =
|
||||||
|
| GuildTextChannel
|
||||||
| TextChannel
|
| TextChannel
|
||||||
| VoiceChannel
|
| VoiceChannel
|
||||||
| DMChannel
|
| DMChannel
|
||||||
@ -674,12 +683,23 @@ export type Channel =
|
|||||||
| ThreadChannel
|
| ThreadChannel
|
||||||
| StageChannel;
|
| StageChannel;
|
||||||
|
|
||||||
|
export type ChannelWithMessages =
|
||||||
|
| GuildTextChannel
|
||||||
|
| VoiceChannel
|
||||||
|
| DMChannel
|
||||||
|
| NewsChannel
|
||||||
|
| ThreadChannel;
|
||||||
|
|
||||||
|
export type ChannelWithMessagesInGuild = Exclude<ChannelWithMessages, DMChannel>;
|
||||||
|
|
||||||
export class ChannelFactory {
|
export class ChannelFactory {
|
||||||
static from(session: Session, channel: DiscordChannel): Channel {
|
static from(session: Session, channel: DiscordChannel): Channel {
|
||||||
switch (channel.type) {
|
switch (channel.type) {
|
||||||
case ChannelTypes.GuildPublicThread:
|
case ChannelTypes.GuildPublicThread:
|
||||||
case ChannelTypes.GuildPrivateThread:
|
case ChannelTypes.GuildPrivateThread:
|
||||||
return new ThreadChannel(session, channel, channel.guild_id!);
|
return new ThreadChannel(session, channel, channel.guild_id!);
|
||||||
|
case ChannelTypes.GuildText:
|
||||||
|
return new GuildTextChannel(session, channel, channel.guild_id!);
|
||||||
case ChannelTypes.GuildNews:
|
case ChannelTypes.GuildNews:
|
||||||
return new NewsChannel(session, channel, channel.guild_id!);
|
return new NewsChannel(session, channel, channel.guild_id!);
|
||||||
case ChannelTypes.DM:
|
case ChannelTypes.DM:
|
||||||
|
73
packages/cache/mod.ts
vendored
73
packages/cache/mod.ts
vendored
@ -1,4 +1,5 @@
|
|||||||
import type {
|
import type {
|
||||||
|
ChannelTypes,
|
||||||
SymCache,
|
SymCache,
|
||||||
Session,
|
Session,
|
||||||
Snowflake,
|
Snowflake,
|
||||||
@ -6,19 +7,62 @@ import type {
|
|||||||
DiscordEmoji,
|
DiscordEmoji,
|
||||||
DiscordUser,
|
DiscordUser,
|
||||||
DiscordChannel,
|
DiscordChannel,
|
||||||
|
DiscordMemberWithUser,
|
||||||
} from "./deps.ts";
|
} from "./deps.ts";
|
||||||
|
|
||||||
import {
|
import {
|
||||||
|
ChannelFactory,
|
||||||
Guild,
|
Guild,
|
||||||
User,
|
User,
|
||||||
DMChannel,
|
DMChannel,
|
||||||
GuildEmoji,
|
GuildEmoji,
|
||||||
|
GuildTextChannel,
|
||||||
|
Member,
|
||||||
|
Message,
|
||||||
|
VoiceChannel,
|
||||||
|
ThreadChannel,
|
||||||
|
NewsChannel,
|
||||||
} from "./deps.ts";
|
} from "./deps.ts";
|
||||||
|
|
||||||
export const cache_sym = Symbol("@cache");
|
export const cache_sym = Symbol("@cache");
|
||||||
|
|
||||||
|
export interface CachedMessage extends Omit<Message, "author"> {
|
||||||
|
authorId: Snowflake;
|
||||||
|
author?: User;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface CachedMember extends Omit<Member, "user"> {
|
||||||
|
userId: Snowflake;
|
||||||
|
user?: User;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface CachedGuild extends Omit<Guild, "members" | "channels"> {
|
||||||
|
channels: Map<Snowflake, CachedGuildChannel>;
|
||||||
|
members: Map<Snowflake, CachedMember>;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface CachedGuildChannel extends Omit<GuildTextChannel, "type"> {
|
||||||
|
type: ChannelTypes;
|
||||||
|
messages: Map<Snowflake, CachedMessage>;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface CachedGuildChannel extends Omit<VoiceChannel, "type"> {
|
||||||
|
type: ChannelTypes;
|
||||||
|
messages: Map<Snowflake, CachedMessage>;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface CachedGuildChannel extends Omit<NewsChannel, "type"> {
|
||||||
|
type: ChannelTypes;
|
||||||
|
messages: Map<Snowflake, CachedMessage>;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface CachedGuildChannel extends Omit<ThreadChannel, "type"> {
|
||||||
|
type: ChannelTypes
|
||||||
|
messages: Map<Snowflake, CachedMessage>;
|
||||||
|
}
|
||||||
|
|
||||||
export interface SessionCache extends SymCache {
|
export interface SessionCache extends SymCache {
|
||||||
guilds: StructCache<Guild>;
|
guilds: StructCache<CachedGuild>;
|
||||||
users: StructCache<User>;
|
users: StructCache<User>;
|
||||||
dms: StructCache<DMChannel>;
|
dms: StructCache<DMChannel>;
|
||||||
emojis: StructCache<GuildEmoji>;
|
emojis: StructCache<GuildEmoji>;
|
||||||
@ -27,7 +71,7 @@ export interface SessionCache extends SymCache {
|
|||||||
|
|
||||||
export default function (session: Session): SessionCache {
|
export default function (session: Session): SessionCache {
|
||||||
return {
|
return {
|
||||||
guilds: new StructCache<Guild>(session),
|
guilds: new StructCache<CachedGuild>(session),
|
||||||
users: new StructCache<User>(session),
|
users: new StructCache<User>(session),
|
||||||
dms: new StructCache<DMChannel>(session),
|
dms: new StructCache<DMChannel>(session),
|
||||||
emojis: new StructCache<GuildEmoji>(session),
|
emojis: new StructCache<GuildEmoji>(session),
|
||||||
@ -59,6 +103,27 @@ export function DMChannelBootstrapper(cache: SessionCache, channel: DiscordChann
|
|||||||
}
|
}
|
||||||
|
|
||||||
export function guildBootstrapper(guild: DiscordGuild, cache: SessionCache) {
|
export function guildBootstrapper(guild: DiscordGuild, cache: SessionCache) {
|
||||||
// TODO: optimizee this garbage
|
const members = new Map(guild.members?.map((data) => {
|
||||||
cache.guilds.set(guild.id, new Guild(cache.session, guild));
|
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 },
|
||||||
|
));
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user