From 2fe113086e0541dff2b56a8b4b028db4fc847057 Mon Sep 17 00:00:00 2001 From: MARCROCK22 <57925328+MARCROCK22@users.noreply.github.com> Date: Sat, 11 May 2024 23:29:28 -0400 Subject: [PATCH] feat: before and after state --- src/client/base.ts | 9 +++++---- src/client/client.ts | 16 ++++++++++++---- src/client/workerclient.ts | 16 ++++++++++++---- src/events/handler.ts | 5 ----- src/events/hooks/guild.ts | 18 ++++++++++++------ src/events/hooks/message.ts | 6 +++--- src/events/hooks/presence.ts | 4 ++-- src/events/hooks/stage.ts | 11 ++++++++--- src/events/hooks/thread.ts | 7 +++++-- src/events/hooks/user.ts | 7 +++++-- src/events/hooks/voice.ts | 17 ++++++++--------- src/index.ts | 2 +- src/structures/VoiceState.ts | 16 ++++++++-------- 13 files changed, 81 insertions(+), 53 deletions(-) diff --git a/src/client/base.ts b/src/client/base.ts index 5086451..0b35ae5 100644 --- a/src/client/base.ts +++ b/src/client/base.ts @@ -81,9 +81,10 @@ export class BaseClient { return Buffer.from(token.split('.')[0], 'base64').toString('ascii'); } - options: BaseClientOptions | undefined; + options: BaseClientOptions; - static seyfertConfig?: InternalRuntimeConfigHTTP | InternalRuntimeConfig; + /**@internal */ + static _seyferHttpConfig?: InternalRuntimeConfigHTTP | InternalRuntimeConfig; constructor(options?: BaseClientOptions) { this.options = MergeOptions( @@ -330,7 +331,7 @@ export class BaseClient { async getRC< T extends InternalRuntimeConfigHTTP | InternalRuntimeConfig = InternalRuntimeConfigHTTP | InternalRuntimeConfig, >() { - const seyfertConfig = (BaseClient.seyfertConfig || + const seyfertConfig = (BaseClient._seyferHttpConfig || (await magicImport(join(process.cwd(), 'seyfert.config.js')).then(x => x.default ?? x))) as T; const { locations, debug, ...env } = seyfertConfig; @@ -348,7 +349,7 @@ export class BaseClient { output: join(process.cwd(), locations.output), }; - BaseClient.seyfertConfig = seyfertConfig; + BaseClient._seyferHttpConfig = seyfertConfig; return obj; } diff --git a/src/client/client.ts b/src/client/client.ts index 53402dd..ad96735 100644 --- a/src/client/client.ts +++ b/src/client/client.ts @@ -18,7 +18,7 @@ export class Client extends BaseClient { gateway!: ShardManager; events? = new EventHandler(this.logger); me!: If; - declare options: ClientOptions | undefined; + declare options: ClientOptions; memberUpdateHandler = new MemberUpdateHandler(); presenceUpdateHandler = new PresenceUpdateHandler(); @@ -147,15 +147,23 @@ export class Client extends BaseClient { await this.events?.execute(packet.t, packet, this as Client, shardId); await this.cache.onPacket(packet); break; + case 'MESSAGE_UPDATE': case 'MESSAGE_DELETE_BULK': case 'MESSAGE_DELETE': - await this.events?.execute(packet.t, packet, this as Client, shardId); - await this.cache.onPacket(packet); - break; case 'GUILD_DELETE': case 'CHANNEL_UPDATE': + case 'GUILD_EMOJIS_UPDATE': + case 'GUILD_UPDATE': + case 'GUILD_ROLE_UPDATE': + case 'GUILD_ROLE_DELETE': + case 'THREAD_UPDATE': + case 'USER_UPDATE': + case 'VOICE_STATE_UPDATE': + case 'STAGE_INSTANCE_UPDATE': + case 'GUILD_STICKERS_UPDATE': await this.events?.execute(packet.t, packet, this as Client, shardId); + await this.cache.onPacket(packet); break; //rest of the events default: { diff --git a/src/client/workerclient.ts b/src/client/workerclient.ts index 47b0218..ffb4ab4 100644 --- a/src/client/workerclient.ts +++ b/src/client/workerclient.ts @@ -52,7 +52,7 @@ export class WorkerClient extends BaseClient { shards = new Map(); - declare options: WorkerClientOptions | undefined; + declare options: WorkerClientOptions; constructor(options?: WorkerClientOptions) { super(options); @@ -326,15 +326,23 @@ export class WorkerClient extends BaseClient { switch (packet.t) { case 'GUILD_MEMBER_UPDATE': case 'PRESENCE_UPDATE': + case 'MESSAGE_UPDATE': case 'MESSAGE_DELETE_BULK': case 'MESSAGE_DELETE': - await this.events?.execute(packet.t, packet, this as WorkerClient, shardId); - await this.cache.onPacket(packet); - break; case 'GUILD_DELETE': case 'CHANNEL_UPDATE': + case 'GUILD_EMOJIS_UPDATE': + case 'GUILD_UPDATE': + case 'GUILD_ROLE_UPDATE': + case 'GUILD_ROLE_DELETE': + case 'THREAD_UPDATE': + case 'USER_UPDATE': + case 'VOICE_STATE_UPDATE': + case 'STAGE_INSTANCE_UPDATE': + case 'GUILD_STICKERS_UPDATE': await this.events?.execute(packet.t, packet, this as WorkerClient, shardId); + await this.cache.onPacket(packet); break; //rest of the events default: diff --git a/src/events/handler.ts b/src/events/handler.ts index ed00f3b..67f7cdb 100644 --- a/src/events/handler.ts +++ b/src/events/handler.ts @@ -38,11 +38,6 @@ export class EventHandler extends BaseHandler { async execute(name: GatewayEvents, ...args: [GatewayDispatchPayload, Client | WorkerClient, number]) { switch (name) { - case 'GUILD_DELETE': - case 'CHANNEL_UPDATE': - await this.runEvent(args[0].t, args[1], args[0], args[2]); - await args[1].cache.onPacket(args[0]); - return; case 'MESSAGE_CREATE': { const { d: data } = args[0] as GatewayMessageCreateDispatch; diff --git a/src/events/hooks/guild.ts b/src/events/hooks/guild.ts index d5383e9..e996591 100644 --- a/src/events/hooks/guild.ts +++ b/src/events/hooks/guild.ts @@ -118,12 +118,15 @@ export const GUILD_ROLE_CREATE = (self: BaseClient, data: GatewayGuildRoleCreate return new GuildRole(self, data.role, data.guild_id); }; -export const GUILD_ROLE_DELETE = (_self: BaseClient, data: GatewayGuildRoleDeleteDispatchData) => { - return toCamelCase(data); +export const GUILD_ROLE_DELETE = async (self: BaseClient, data: GatewayGuildRoleDeleteDispatchData) => { + return (await self.cache.roles?.get(data.role_id)) || toCamelCase(data); }; -export const GUILD_ROLE_UPDATE = (self: BaseClient, data: GatewayGuildRoleUpdateDispatchData) => { - return new GuildRole(self, data.role, data.guild_id); +export const GUILD_ROLE_UPDATE = async ( + self: BaseClient, + data: GatewayGuildRoleUpdateDispatchData, +): Promise<[role: GuildRole, old?: GuildRole]> => { + return [new GuildRole(self, data.role, data.guild_id), await self.cache.roles?.get(data.role.id)]; }; export const GUILD_STICKERS_UPDATE = (self: BaseClient, data: GatewayGuildStickersUpdateDispatchData) => { @@ -133,6 +136,9 @@ export const GUILD_STICKERS_UPDATE = (self: BaseClient, data: GatewayGuildSticke }; }; -export const GUILD_UPDATE = (self: BaseClient, data: GatewayGuildUpdateDispatchData) => { - return new Guild(self, data); +export const GUILD_UPDATE = async ( + self: BaseClient, + data: GatewayGuildUpdateDispatchData, +): Promise<[guild: Guild, old?: Guild<'cached'>]> => { + return [new Guild(self, data), await self.cache.guilds?.get(data.id)]; }; diff --git a/src/events/hooks/message.ts b/src/events/hooks/message.ts index de40f29..2413cbe 100644 --- a/src/events/hooks/message.ts +++ b/src/events/hooks/message.ts @@ -53,14 +53,14 @@ export const MESSAGE_UPDATE = async ( data: GatewayMessageUpdateDispatchData, ): Promise< [ - undefined | Message, - MakeRequired< + message: MakeRequired< PartialClass, 'id' | 'channelId' | 'createdAt' | 'createdTimestamp' | 'rest' | 'cache' | 'api' | 'client' >, + old: undefined | Message, ] > => { - return [await self.cache.messages?.get(data.id), new Message(self, data as APIMessage)]; + return [new Message(self, data as APIMessage), await self.cache.messages?.get(data.id)]; }; export const MESSAGE_POLL_VOTE_ADD = (_: BaseClient, data: GatewayMessagePollVoteDispatchData) => { diff --git a/src/events/hooks/presence.ts b/src/events/hooks/presence.ts index 07e9507..60a9505 100644 --- a/src/events/hooks/presence.ts +++ b/src/events/hooks/presence.ts @@ -3,6 +3,6 @@ import type { GatewayPresenceUpdateDispatchData } from 'discord-api-types/v10'; import type { BaseClient } from '../../client/base'; import { toCamelCase } from '../../common'; -export const PRESENCE_UPDATE = (_self: BaseClient, data: GatewayPresenceUpdateDispatchData) => { - return toCamelCase(data); +export const PRESENCE_UPDATE = async (self: BaseClient, data: GatewayPresenceUpdateDispatchData) => { + return [toCamelCase(data), await self.cache.presences?.get(data.user.id)]; }; diff --git a/src/events/hooks/stage.ts b/src/events/hooks/stage.ts index 2ac9c29..92d3ef8 100644 --- a/src/events/hooks/stage.ts +++ b/src/events/hooks/stage.ts @@ -1,10 +1,12 @@ import type { GatewayStageInstanceCreateDispatchData, GatewayStageInstanceDeleteDispatchData, + GatewayStageInstanceUpdateDispatchData, } from 'discord-api-types/v10'; import type { BaseClient } from '../../client/base'; -import { toCamelCase } from '../../common'; +import { type ObjectToLower, toCamelCase } from '../../common'; +import type { StageInstances } from '../../cache/resources/stage-instances'; export const STAGE_INSTANCE_CREATE = (_self: BaseClient, data: GatewayStageInstanceCreateDispatchData) => { return toCamelCase(data); @@ -14,6 +16,9 @@ export const STAGE_INSTANCE_DELETE = (_self: BaseClient, data: GatewayStageInsta return toCamelCase(data); }; -export const STAGE_INSTANCE_UPDATE = (_self: BaseClient, data: GatewayStageInstanceDeleteDispatchData) => { - return toCamelCase(data); +export const STAGE_INSTANCE_UPDATE = async ( + self: BaseClient, + data: GatewayStageInstanceUpdateDispatchData, +): Promise<[stage: ObjectToLower, old?: ReturnType]> => { + return [toCamelCase(data), await self.cache.stageInstances?.get(data.id)]; }; diff --git a/src/events/hooks/thread.ts b/src/events/hooks/thread.ts index ca27d14..820e654 100644 --- a/src/events/hooks/thread.ts +++ b/src/events/hooks/thread.ts @@ -30,6 +30,9 @@ export const THREAD_MEMBERS_UPDATE = (_self: BaseClient, data: GatewayThreadMemb return toCamelCase(data); }; -export const THREAD_UPDATE = (self: BaseClient, data: GatewayThreadUpdateDispatchData) => { - return new ThreadChannel(self, data); +export const THREAD_UPDATE = async ( + self: BaseClient, + data: GatewayThreadUpdateDispatchData, +): Promise<[thread: ThreadChannel, old?: ThreadChannel]> => { + return [new ThreadChannel(self, data), await self.cache.threads?.get(data.id)]; }; diff --git a/src/events/hooks/user.ts b/src/events/hooks/user.ts index 5f1b22e..1a24493 100644 --- a/src/events/hooks/user.ts +++ b/src/events/hooks/user.ts @@ -2,6 +2,9 @@ import type { GatewayUserUpdateDispatchData } from 'discord-api-types/v10'; import type { BaseClient } from '../../client/base'; import { User } from '../../structures'; -export const USER_UPDATE = (self: BaseClient, data: GatewayUserUpdateDispatchData) => { - return new User(self, data); +export const USER_UPDATE = async ( + self: BaseClient, + data: GatewayUserUpdateDispatchData, +): Promise<[user: User, old?: User]> => { + return [new User(self, data), await self.cache.users?.get(data.id)]; }; diff --git a/src/events/hooks/voice.ts b/src/events/hooks/voice.ts index a1d6edc..e704f83 100644 --- a/src/events/hooks/voice.ts +++ b/src/events/hooks/voice.ts @@ -1,17 +1,16 @@ -import type { GatewayVoiceServerUpdateDispatchData, GatewayVoiceStateUpdateDispatchData } from 'discord-api-types/v10'; +import type { GatewayVoiceServerUpdateDispatchData, GatewayVoiceStateUpdateDispatchData } from '../../types'; import type { BaseClient } from '../../client/base'; import { toCamelCase } from '../../common'; -import { GuildMember } from '../../structures'; +import { VoiceState } from '../../structures'; export const VOICE_SERVER_UPDATE = (_self: BaseClient, data: GatewayVoiceServerUpdateDispatchData) => { return toCamelCase(data); }; -export const VOICE_STATE_UPDATE = (self: BaseClient, data: GatewayVoiceStateUpdateDispatchData) => { - return data.member?.user - ? { - ...toCamelCase(data), - member: new GuildMember(self, data.member, data.member?.user, data.guild_id!), - } - : toCamelCase(data); +export const VOICE_STATE_UPDATE = async ( + self: BaseClient, + data: GatewayVoiceStateUpdateDispatchData, +): Promise<[VoiceState] | [state: VoiceState, old?: VoiceState]> => { + if (!data.guild_id) return [new VoiceState(self, data)]; + return [new VoiceState(self, data), await self.cache.voiceStates?.get(data.user_id, data.guild_id)]; }; diff --git a/src/index.ts b/src/index.ts index e6f81d1..fa9fb41 100644 --- a/src/index.ts +++ b/src/index.ts @@ -86,7 +86,7 @@ export const config = { port: 8080, ...data, } as InternalRuntimeConfigHTTP; - if (isCloudfareWorker()) BaseClient.seyfertConfig = obj; + if (isCloudfareWorker()) BaseClient._seyferHttpConfig = obj; return obj; }, }; diff --git a/src/structures/VoiceState.ts b/src/structures/VoiceState.ts index 899b01b..64809c0 100644 --- a/src/structures/VoiceState.ts +++ b/src/structures/VoiceState.ts @@ -1,18 +1,18 @@ -import type { GuildMember, UsingClient } from '../'; +import { GuildMember, type UsingClient } from '../'; import type { VoiceStateResource } from '../cache/resources/voice-states'; import type { ObjectToLower } from '../common'; +import type { GatewayVoiceState } from '../types'; import { Base } from './extra/Base'; -export interface VoiceState extends Base, ObjectToLower {} +export interface VoiceState extends Base, ObjectToLower> {} export class VoiceState extends Base { - constructor( - client: UsingClient, - data: VoiceStateResource, - private withMember?: GuildMember, - ) { + protected withMember?: GuildMember; + constructor(client: UsingClient, data: GatewayVoiceState) { super(client); - this.__patchThis(data); + const { member, ...rest } = data; + this.__patchThis(rest); + if (member?.user && data.guild_id) this.withMember = new GuildMember(client, member, member.user, data.guild_id); } isMuted() {