feat: before and after state

This commit is contained in:
MARCROCK22 2024-05-11 23:29:28 -04:00
parent b44e7d456a
commit 2fe113086e
13 changed files with 81 additions and 53 deletions

View File

@ -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;
}

View File

@ -18,7 +18,7 @@ export class Client<Ready extends boolean = boolean> extends BaseClient {
gateway!: ShardManager;
events? = new EventHandler(this.logger);
me!: If<Ready, ClientUser>;
declare options: ClientOptions | undefined;
declare options: ClientOptions;
memberUpdateHandler = new MemberUpdateHandler();
presenceUpdateHandler = new PresenceUpdateHandler();
@ -147,15 +147,23 @@ export class Client<Ready extends boolean = boolean> extends BaseClient {
await this.events?.execute(packet.t, packet, this as Client<true>, 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<true>, 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<true>, shardId);
await this.cache.onPacket(packet);
break;
//rest of the events
default: {

View File

@ -52,7 +52,7 @@ export class WorkerClient<Ready extends boolean = boolean> extends BaseClient {
shards = new Map<number, Shard>();
declare options: WorkerClientOptions | undefined;
declare options: WorkerClientOptions;
constructor(options?: WorkerClientOptions) {
super(options);
@ -326,15 +326,23 @@ export class WorkerClient<Ready extends boolean = boolean> 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<true>, 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<true>, shardId);
await this.cache.onPacket(packet);
break;
//rest of the events
default:

View File

@ -38,11 +38,6 @@ export class EventHandler extends BaseHandler {
async execute(name: GatewayEvents, ...args: [GatewayDispatchPayload, Client<true> | WorkerClient<true>, 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;

View File

@ -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)];
};

View File

@ -53,14 +53,14 @@ export const MESSAGE_UPDATE = async (
data: GatewayMessageUpdateDispatchData,
): Promise<
[
undefined | Message,
MakeRequired<
message: MakeRequired<
PartialClass<Message>,
'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) => {

View File

@ -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)];
};

View File

@ -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<GatewayStageInstanceUpdateDispatchData>, old?: ReturnType<StageInstances['get']>]> => {
return [toCamelCase(data), await self.cache.stageInstances?.get(data.id)];
};

View File

@ -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)];
};

View File

@ -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)];
};

View File

@ -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)];
};

View File

@ -86,7 +86,7 @@ export const config = {
port: 8080,
...data,
} as InternalRuntimeConfigHTTP;
if (isCloudfareWorker()) BaseClient.seyfertConfig = obj;
if (isCloudfareWorker()) BaseClient._seyferHttpConfig = obj;
return obj;
},
};

View File

@ -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<VoiceStateResource> {}
export interface VoiceState extends Base, ObjectToLower<Omit<VoiceStateResource, 'member'>> {}
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() {