import type { REST } from '@discordjs/rest'; import { WebSocketShardEvents, type WebSocketManager } from '@discordjs/ws'; import { AsyncEventEmitter } from '@vladfrangu/async_event_emitter'; import type { GatewayAutoModerationActionExecutionDispatchData, GatewayAutoModerationRuleCreateDispatchData, GatewayAutoModerationRuleDeleteDispatchData, GatewayAutoModerationRuleUpdateDispatchData, GatewayChannelCreateDispatchData, GatewayChannelDeleteDispatchData, GatewayChannelPinsUpdateDispatchData, GatewayChannelUpdateDispatchData, GatewayDispatchEvents, GatewayGuildBanAddDispatchData, GatewayGuildBanRemoveDispatchData, GatewayGuildCreateDispatchData, GatewayGuildDeleteDispatchData, GatewayGuildEmojisUpdateDispatchData, GatewayGuildIntegrationsUpdateDispatchData, GatewayGuildMemberAddDispatchData, GatewayGuildMemberRemoveDispatchData, GatewayGuildMembersChunkDispatchData, GatewayGuildMemberUpdateDispatchData, GatewayGuildRoleCreateDispatchData, GatewayGuildRoleDeleteDispatchData, GatewayGuildRoleUpdateDispatchData, GatewayGuildScheduledEventCreateDispatchData, GatewayGuildScheduledEventDeleteDispatchData, GatewayGuildScheduledEventUpdateDispatchData, GatewayGuildScheduledEventUserAddDispatchData, GatewayGuildScheduledEventUserRemoveDispatchData, GatewayGuildStickersUpdateDispatchData, GatewayGuildUpdateDispatchData, GatewayIntegrationCreateDispatchData, GatewayIntegrationDeleteDispatchData, GatewayIntegrationUpdateDispatchData, GatewayInteractionCreateDispatchData, GatewayInviteCreateDispatchData, GatewayInviteDeleteDispatchData, GatewayMessageCreateDispatchData, GatewayMessageDeleteBulkDispatchData, GatewayMessageDeleteDispatchData, GatewayMessageReactionAddDispatchData, GatewayMessageReactionRemoveAllDispatchData, GatewayMessageReactionRemoveDispatchData, GatewayMessageReactionRemoveEmojiDispatchData, GatewayMessageUpdateDispatchData, GatewayPresenceUpdateDispatchData, GatewayReadyDispatchData, GatewayStageInstanceCreateDispatchData, GatewayStageInstanceDeleteDispatchData, GatewayStageInstanceUpdateDispatchData, GatewayThreadCreateDispatchData, GatewayThreadDeleteDispatchData, GatewayThreadListSyncDispatchData, GatewayThreadMembersUpdateDispatchData, GatewayThreadMemberUpdateDispatchData, GatewayThreadUpdateDispatchData, GatewayTypingStartDispatchData, GatewayUserUpdateDispatchData, GatewayVoiceServerUpdateDispatchData, GatewayVoiceStateUpdateDispatchData, GatewayWebhooksUpdateDispatchData, } from 'discord-api-types/v10'; import { API } from './api/index.js'; export interface IntrinsicProps { /** * The REST API */ api: API; /** * The id of the shard that emitted the event */ shardId: number; } export interface WithIntrinsicProps extends IntrinsicProps { data: T; } export interface MappedEvents { [GatewayDispatchEvents.ChannelCreate]: [WithIntrinsicProps]; [GatewayDispatchEvents.ChannelDelete]: [WithIntrinsicProps]; [GatewayDispatchEvents.ChannelPinsUpdate]: [WithIntrinsicProps]; [GatewayDispatchEvents.ChannelUpdate]: [WithIntrinsicProps]; [GatewayDispatchEvents.GuildBanAdd]: [WithIntrinsicProps]; [GatewayDispatchEvents.GuildBanRemove]: [WithIntrinsicProps]; [GatewayDispatchEvents.GuildCreate]: [WithIntrinsicProps]; [GatewayDispatchEvents.GuildDelete]: [WithIntrinsicProps]; [GatewayDispatchEvents.GuildEmojisUpdate]: [WithIntrinsicProps]; [GatewayDispatchEvents.GuildIntegrationsUpdate]: [WithIntrinsicProps]; [GatewayDispatchEvents.GuildMemberAdd]: [WithIntrinsicProps]; [GatewayDispatchEvents.GuildMemberRemove]: [WithIntrinsicProps]; [GatewayDispatchEvents.GuildMemberUpdate]: [WithIntrinsicProps]; [GatewayDispatchEvents.GuildMembersChunk]: [WithIntrinsicProps]; [GatewayDispatchEvents.GuildRoleCreate]: [WithIntrinsicProps]; [GatewayDispatchEvents.GuildRoleDelete]: [WithIntrinsicProps]; [GatewayDispatchEvents.GuildRoleUpdate]: [WithIntrinsicProps]; [GatewayDispatchEvents.GuildScheduledEventCreate]: [WithIntrinsicProps]; [GatewayDispatchEvents.GuildScheduledEventDelete]: [WithIntrinsicProps]; [GatewayDispatchEvents.GuildScheduledEventUpdate]: [WithIntrinsicProps]; [GatewayDispatchEvents.GuildScheduledEventUserAdd]: [ WithIntrinsicProps, ]; [GatewayDispatchEvents.GuildScheduledEventUserRemove]: [ WithIntrinsicProps, ]; [GatewayDispatchEvents.GuildStickersUpdate]: [WithIntrinsicProps]; [GatewayDispatchEvents.GuildUpdate]: [WithIntrinsicProps]; [GatewayDispatchEvents.IntegrationCreate]: [WithIntrinsicProps]; [GatewayDispatchEvents.IntegrationDelete]: [WithIntrinsicProps]; [GatewayDispatchEvents.IntegrationUpdate]: [WithIntrinsicProps]; [GatewayDispatchEvents.InteractionCreate]: [WithIntrinsicProps]; [GatewayDispatchEvents.InviteCreate]: [WithIntrinsicProps]; [GatewayDispatchEvents.InviteDelete]: [WithIntrinsicProps]; [GatewayDispatchEvents.MessageCreate]: [WithIntrinsicProps]; [GatewayDispatchEvents.MessageDelete]: [WithIntrinsicProps]; [GatewayDispatchEvents.MessageDeleteBulk]: [WithIntrinsicProps]; [GatewayDispatchEvents.MessageReactionAdd]: [WithIntrinsicProps]; [GatewayDispatchEvents.MessageReactionRemove]: [WithIntrinsicProps]; [GatewayDispatchEvents.MessageReactionRemoveAll]: [WithIntrinsicProps]; [GatewayDispatchEvents.MessageReactionRemoveEmoji]: [ WithIntrinsicProps, ]; [GatewayDispatchEvents.MessageUpdate]: [WithIntrinsicProps]; [GatewayDispatchEvents.PresenceUpdate]: [WithIntrinsicProps]; [GatewayDispatchEvents.Ready]: [WithIntrinsicProps]; [GatewayDispatchEvents.StageInstanceCreate]: [WithIntrinsicProps]; [GatewayDispatchEvents.StageInstanceDelete]: [WithIntrinsicProps]; [GatewayDispatchEvents.StageInstanceUpdate]: [WithIntrinsicProps]; [GatewayDispatchEvents.ThreadCreate]: [WithIntrinsicProps]; [GatewayDispatchEvents.ThreadDelete]: [WithIntrinsicProps]; [GatewayDispatchEvents.ThreadListSync]: [WithIntrinsicProps]; [GatewayDispatchEvents.ThreadMemberUpdate]: [WithIntrinsicProps]; [GatewayDispatchEvents.ThreadMembersUpdate]: [WithIntrinsicProps]; [GatewayDispatchEvents.ThreadUpdate]: [WithIntrinsicProps]; [GatewayDispatchEvents.UserUpdate]: [WithIntrinsicProps]; [GatewayDispatchEvents.VoiceServerUpdate]: [WithIntrinsicProps]; [GatewayDispatchEvents.VoiceStateUpdate]: [WithIntrinsicProps]; [GatewayDispatchEvents.WebhooksUpdate]: [WithIntrinsicProps]; [GatewayDispatchEvents.Resumed]: [WithIntrinsicProps]; [GatewayDispatchEvents.TypingStart]: [WithIntrinsicProps]; [GatewayDispatchEvents.AutoModerationActionExecution]: [ WithIntrinsicProps, ]; [GatewayDispatchEvents.AutoModerationRuleCreate]: [WithIntrinsicProps]; [GatewayDispatchEvents.AutoModerationRuleDelete]: [WithIntrinsicProps]; [GatewayDispatchEvents.AutoModerationRuleUpdate]: [WithIntrinsicProps]; } export type ManagerShardEventsMap = { [K in keyof MappedEvents]: MappedEvents[K]; }; export interface ClientOptions { rest: REST; ws: WebSocketManager; } export function createClient({ rest, ws }: ClientOptions) { const api = new API(rest); const emitter = new AsyncEventEmitter(); function wrapIntrinsicProps(obj: T, shardId: number): WithIntrinsicProps { return { api, shardId, data: obj, }; } ws.on(WebSocketShardEvents.Dispatch, ({ data: dispatch, shardId }) => { // @ts-expect-error event props can't be resolved properly, but they are correct emitter.emit(dispatch.t, wrapIntrinsicProps(dispatch.d, shardId)); }); return emitter; }