diff --git a/src/client/client.ts b/src/client/client.ts index 9d13578..5ea5cbb 100644 --- a/src/client/client.ts +++ b/src/client/client.ts @@ -143,7 +143,7 @@ export class Client extends BaseClient { if (!this.memberUpdateHandler.check(packet.d)) { return; } - await this.events?.execute(packet.t, packet, this as Client, shardId); + await this.events?.execute(packet, this as Client, shardId); } break; case 'PRESENCE_UPDATE': @@ -151,7 +151,7 @@ export class Client extends BaseClient { if (!this.presenceUpdateHandler.check(packet.d)) { return; } - await this.events?.execute(packet.t, packet, this as Client, shardId); + await this.events?.execute(packet, this as Client, shardId); } break; case 'GUILD_DELETE': @@ -166,7 +166,7 @@ export class Client extends BaseClient { if (!this.__handleGuilds?.length) delete this.__handleGuilds; return this.cache.onPacket(packet); } - await this.events?.execute(packet.t, packet, this as Client, shardId); + await this.events?.execute(packet, this as Client, shardId); break; } //rest of the events @@ -174,13 +174,13 @@ export class Client extends BaseClient { switch (packet.t) { case 'INTERACTION_CREATE': { - await this.events?.execute(packet.t as never, packet, this as Client, shardId); + await this.events?.execute(packet, this as Client, shardId); await this.handleCommand.interaction(packet.d, shardId); } break; case 'MESSAGE_CREATE': { - await this.events?.execute(packet.t as never, packet, this as Client, shardId); + await this.events?.execute(packet, this as Client, shardId); await this.handleCommand.message(packet.d, shardId); } break; @@ -199,11 +199,11 @@ export class Client extends BaseClient { delete this.__handleGuilds; } this.debugger?.debug(`#${shardId}[${packet.d.user.username}](${this.botId}) is online...`); - await this.events?.execute(packet.t as never, packet, this as Client, shardId); + await this.events?.execute(packet, this as Client, shardId); break; } default: - await this.events?.execute(packet.t as never, packet, this as Client, shardId); + await this.events?.execute(packet, this as Client, shardId); break; } break; diff --git a/src/client/workerclient.ts b/src/client/workerclient.ts index 2a8bc1f..b7840b7 100644 --- a/src/client/workerclient.ts +++ b/src/client/workerclient.ts @@ -499,7 +499,7 @@ export class WorkerClient extends BaseClient { if (!this.memberUpdateHandler.check(packet.d)) { return; } - await this.events?.execute(packet.t, packet, this as WorkerClient, shardId); + await this.events?.execute(packet, this as WorkerClient, shardId); } break; case 'PRESENCE_UPDATE': @@ -507,7 +507,7 @@ export class WorkerClient extends BaseClient { if (!this.presenceUpdateHandler.check(packet.d)) { return; } - await this.events?.execute(packet.t, packet, this as WorkerClient, shardId); + await this.events?.execute(packet, this as WorkerClient, shardId); } break; case 'GUILD_DELETE': @@ -526,20 +526,20 @@ export class WorkerClient extends BaseClient { if (!this.__handleGuilds?.length) delete this.__handleGuilds; return this.cache.onPacket(packet); } - await this.events?.execute(packet.t, packet, this, shardId); + await this.events?.execute(packet, this, shardId); break; } default: { switch (packet.t) { case 'INTERACTION_CREATE': { - await this.events?.execute(packet.t as never, packet, this, shardId); + await this.events?.execute(packet, this, shardId); await this.handleCommand.interaction(packet.d, shardId); } break; case 'MESSAGE_CREATE': { - await this.events?.execute(packet.t as never, packet, this, shardId); + await this.events?.execute(packet, this, shardId); await this.handleCommand.message(packet.d, shardId); } break; @@ -552,7 +552,7 @@ export class WorkerClient extends BaseClient { this.botId = packet.d.user.id; this.applicationId = packet.d.application.id; this.me = Transformers.ClientUser(this, packet.d.user, packet.d.application) as never; - await this.events?.execute(packet.t as never, packet, this, shardId); + await this.events?.execute(packet, this, shardId); if (!this._ready && [...this.shards.values()].every(shard => shard.data.session_id)) { this._ready = true; this.postMessage({ @@ -575,7 +575,7 @@ export class WorkerClient extends BaseClient { } break; default: - await this.events?.execute(packet.t as never, packet, this, shardId); + await this.events?.execute(packet, this, shardId); break; } break; diff --git a/src/events/handler.ts b/src/events/handler.ts index 17c2086..1378cd0 100644 --- a/src/events/handler.ts +++ b/src/events/handler.ts @@ -12,16 +12,7 @@ import { } from '../common'; import type { ClientEvents } from '../events/hooks'; import * as RawEvents from '../events/hooks'; -import { - type APIThreadChannel, - ChannelType, - type GatewayChannelDeleteDispatch, - type GatewayDispatchPayload, - type GatewayGuildDeleteDispatch, - type GatewayMessageDeleteBulkDispatch, - type GatewayMessageDeleteDispatch, - type GatewayThreadDeleteDispatch, -} from '../types'; +import { type APIThreadChannel, ChannelType, type GatewayDispatchPayload } from '../types'; import type { ClientEvent, ClientNameEvents, CustomEvents, CustomEventsKeys, EventContext } from './event'; export type EventValue = MakeRequired & { fired?: boolean }; @@ -105,66 +96,62 @@ export class EventHandler extends BaseHandler { } } - async execute(name: GatewayEvents, ...args: [GatewayDispatchPayload, Client | WorkerClient, number]) { - switch (name) { + async execute(raw: GatewayDispatchPayload, client: Client | WorkerClient, shardId: number) { + switch (raw.t) { case 'MESSAGE_DELETE': { - if (!args[1].components?.values.size) break; - const { d: data } = args[0] as GatewayMessageDeleteDispatch; - const value = args[1].components.values.get(data.id); + if (!client.components?.values.size) break; + const value = client.components.values.get(raw.d.id); if (value) { - args[1].components.deleteValue(value.messageId, 'messageDelete'); + client.components.deleteValue(value.messageId, 'messageDelete'); } } break; case 'MESSAGE_DELETE_BULK': { - if (!args[1].components?.values.size) break; - const { d: payload } = args[0] as GatewayMessageDeleteBulkDispatch; - for (const id of payload.ids) { - const value = args[1].components.values.get(id); + if (!client.components?.values.size) break; + for (const id of raw.d.ids) { + const value = client.components.values.get(id); if (value) { - args[1].components.deleteValue(value.messageId, 'messageDelete'); + client.components.deleteValue(value.messageId, 'messageDelete'); } } } break; case 'GUILD_DELETE': { - if (!args[1].components?.values.size) break; - const { d: payload } = args[0] as GatewayGuildDeleteDispatch; + if (!client.components?.values.size) break; // ignore unavailable guilds? - if (payload.unavailable) break; - for (const [messageId, value] of args[1].components.values) { - if (value.guildId === payload.id) args[1].components.deleteValue(messageId, 'guildDelete'); + if (raw.d.unavailable) break; + for (const [messageId, value] of client.components.values) { + if (value.guildId === raw.d.id) client.components.deleteValue(messageId, 'guildDelete'); } } break; case 'CHANNEL_DELETE': { - if (!args[1].components?.values.size) break; - const { d: payload } = args[0] as GatewayChannelDeleteDispatch; + if (!client.components?.values.size) break; - if (payload.type === ChannelType.DM || payload.type === ChannelType.GroupDM) { - for (const value of args[1].components.values) { - if (payload.id === value[1].channelId) args[1].components.deleteValue(value[0], 'channelDelete'); + if (raw.d.type === ChannelType.DM || raw.d.type === ChannelType.GroupDM) { + for (const value of client.components.values) { + if (raw.d.id === value[1].channelId) client.components.deleteValue(value[0], 'channelDelete'); } } else { - if (!payload.guild_id) break; + if (!raw.d.guild_id) break; // this is why we dont recommend to use collectors, use ComponentCommand instead - const channels = await args[1].cache.channels?.valuesRaw(payload.guild_id); + const channels = await client.cache.channels?.valuesRaw(raw.d.guild_id); const threads = channels ?.filter( x => [ChannelType.PublicThread, ChannelType.PrivateThread, ChannelType.AnnouncementThread].includes( x.type, - ) && (x as APIThreadChannel).parent_id === payload.id, + ) && (x as APIThreadChannel).parent_id === raw.d.id, ) .map(x => x.id); - for (const value of args[1].components.values) { + for (const value of client.components.values) { const channelId = value[1].channelId; - if (payload.id === channelId || threads?.includes(channelId)) { - args[1].components.deleteValue(value[0], 'channelDelete'); + if (raw.d.id === channelId || threads?.includes(channelId)) { + client.components.deleteValue(value[0], 'channelDelete'); } } } @@ -172,11 +159,10 @@ export class EventHandler extends BaseHandler { break; case 'THREAD_DELETE': { - if (!args[1].components?.values.size) break; - const { d: payload } = args[0] as GatewayThreadDeleteDispatch; - for (const value of args[1].components.values) { - if (value[1].channelId === payload.id) { - args[1].components.deleteValue(value[0], 'channelDelete'); + if (!client.components?.values.size) break; + for (const value of client.components.values) { + if (value[1].channelId === raw.d.id) { + client.components.deleteValue(value[0], 'channelDelete'); } } } @@ -184,12 +170,18 @@ export class EventHandler extends BaseHandler { } await Promise.all([ - this.runEvent(args[0].t as never, args[1], args[0].d, args[2]), - this.client.collectors.run(args[0].t as never, args[0].d as never, this.client), + this.runEvent(raw.t as never, client, raw.d, shardId), + this.client.collectors.run(raw.t as never, raw.d as never, this.client), ]); } - async runEvent(name: GatewayEvents, client: Client | WorkerClient, packet: any, shardId: number, runCache = true) { + async runEvent( + name: GatewayEvents, + client: Client | WorkerClient, + packet: unknown, + shardId: number, + runCache = true, + ) { const Event = this.values[name]; if (!Event) { return runCache diff --git a/src/structures/channels.ts b/src/structures/channels.ts index f298c53..3a3019b 100644 --- a/src/structures/channels.ts +++ b/src/structures/channels.ts @@ -1,5 +1,6 @@ import { Collection, Formatter, type RawFile, type ReturnCache } from '..'; import { ActionRow, Embed, PollBuilder, resolveAttachment } from '../builders'; +import type { Overwrites } from '../cache/resources/overwrites'; import { type BaseChannelStructure, type BaseGuildChannelStructure, @@ -162,11 +163,11 @@ export class BaseNoEditableChannel extends DiscordBase extends BaseNoEditableChannel { - edit(body: RESTPatchAPIChannelJSONBody, reason?: string) { + edit(body: RESTPatchAPIChannelJSONBody, reason?: string): Promise { return this.client.channels.edit(this.id, body, { reason, guildId: 'guildId' in this ? (this.guildId as string) : '@me', - }); + }) as Promise; } } @@ -193,8 +194,16 @@ export class BaseGuildChannel extends BaseChannel { } permissionOverwrites = { - fetch: () => this.client.cache.overwrites?.get(this.id), - values: () => (this.guildId ? (this.client.cache.overwrites?.values(this.guildId) ?? []) : []), + fetch: (): ReturnType => + this.client.cache.overwrites?.get(this.id) || + (this.client.cache.adapter.isAsync ? (Promise.resolve() as never) : undefined), + values: (): ReturnCache> => + this.guildId + ? this.client.cache.overwrites?.values(this.guildId) || + (this.client.cache.adapter.isAsync ? (Promise.resolve([]) as never) : []) + : this.client.cache.adapter.isAsync + ? (Promise.resolve([]) as never) + : [], }; memberPermissions(member: GuildMember, checkAdmin = true) { @@ -410,9 +419,7 @@ export class VoiceChannelMethods extends DiscordBase { if (!this.guildId) return this.cache.adapter.isAsync ? (Promise.resolve([]) as never) : []; return fakePromise( this.cache.voiceStates?.values(this.guildId) ?? - (this.cache.adapter.isAsync - ? (Promise.resolve([]) as Promise) - : ([] as VoiceStateStructure[])), + (this.cache.adapter.isAsync ? (Promise.resolve([]) as never) : []), ).then(states => { return states.filter(state => state.channelId === this.id); }); @@ -484,7 +491,7 @@ export class DMChannel extends BaseNoEditableChannel { } export interface VoiceChannel extends ObjectToLower>, - Omit, + Omit, VoiceChannelMethods, WebhookChannelMethods {} @mix(TextGuildChannel, WebhookChannelMethods, VoiceChannelMethods) @@ -509,7 +516,7 @@ export class MediaChannel extends BaseChannel { export interface ForumChannel extends ObjectToLower, - Omit, + Omit, WebhookChannelMethods {} @mix(ThreadOnlyMethods, WebhookChannelMethods) export class ForumChannel extends BaseChannel {