diff --git a/gateway/common.ts b/gateway/common.ts new file mode 100644 index 0000000..e630418 --- /dev/null +++ b/gateway/common.ts @@ -0,0 +1,8 @@ +/** + * https://discord.com/developers/docs/topics/gateway#connecting-gateway-url-query-string-params + */ +export interface GatewayURLQuery { + v: string; + encoding: 'json' | 'etf'; + compress?: 'zlib-stream'; +} \ No newline at end of file diff --git a/gateway/index.ts b/gateway/index.ts new file mode 100644 index 0000000..f53b21c --- /dev/null +++ b/gateway/index.ts @@ -0,0 +1,4 @@ +// This file exports all the types available in the recommended gateway version +// Thereby, things MAY break in the future. Try sticking to imports from a specific version + +export * from './v9'; \ No newline at end of file diff --git a/gateway/v9.ts b/gateway/v9.ts new file mode 100644 index 0000000..1acfa7b --- /dev/null +++ b/gateway/v9.ts @@ -0,0 +1,2262 @@ +/** + * Types extracted from https://discord.com/developers/docs/topics/gateway + */ + +import type { Snowflake } from '../globals'; +import type { GatewayPresenceUpdate } from '../payloads/v9/gateway'; +import type { + APIApplication, + APIApplicationCommandPermission, + APIAutoModerationRule, + APIAutoModerationAction, + APIChannel, + APIEmoji, + APIGuild, + APIGuildIntegration, + APIGuildMember, + APIGuildScheduledEvent, + APIInteraction, + APIMessage, + APIRole, + APIStageInstance, + APISticker, + APIThreadChannel, + APIThreadMember, + APIUnavailableGuild, + APIUser, + GatewayActivity, + GatewayPresenceUpdate as RawGatewayPresenceUpdate, + GatewayThreadListSync as RawGatewayThreadListSync, + GatewayThreadMembersUpdate as RawGatewayThreadMembersUpdate, + GatewayVoiceState, + InviteTargetType, + PresenceUpdateStatus, + AutoModerationRuleTriggerType, + APIAuditLogEntry, + APIConnection, + APIUserSettings, + APIReadState, + APIRelationship, +} from '../payloads/v9/index'; +import type { Nullable } from '../utils/internals'; + +export * from './common'; + +export const GatewayVersion = '9'; + +/** + * https://discord.com/developers/docs/topics/opcodes-and-status-codes#gateway-gateway-opcodes + */ +export enum GatewayOpcodes { + /** + * An event was dispatched + */ + Dispatch, + /** + * A bidirectional opcode to maintain an active gateway connection. + * Fired periodically by the client, or fired by the gateway to request an immediate heartbeat from the client. + */ + Heartbeat, + /** + * Starts a new session during the initial handshake + */ + Identify, + /** + * Update the client's presence + */ + PresenceUpdate, + /** + * Used to join/leave or move between voice channels + */ + VoiceStateUpdate, + /** + * Resume a previous session that was disconnected + */ + Resume = 6, + /** + * You should attempt to reconnect and resume immediately + */ + Reconnect, + /** + * Request information about offline guild members in a large guild + */ + RequestGuildMembers, + /** + * The session has been invalidated. You should reconnect and identify/resume accordingly + */ + InvalidSession, + /** + * Sent immediately after connecting, contains the `heartbeat_interval` to use + */ + Hello, + /** + * Sent in response to receiving a heartbeat to acknowledge that it has been received + */ + HeartbeatAck, + GuildSync, + LazyRequest = 14, +} + +/** + * https://discord.com/developers/docs/topics/opcodes-and-status-codes#gateway-gateway-close-event-codes + */ +export enum GatewayCloseCodes { + /** + * We're not sure what went wrong. Try reconnecting? + */ + UnknownError = 4000, + /** + * You sent an invalid Gateway opcode or an invalid payload for an opcode. Don't do that! + * + * See https://discord.com/developers/docs/topics/gateway-events#payload-structure + */ + UnknownOpcode, + /** + * You sent an invalid payload to us. Don't do that! + * + * See https://discord.com/developers/docs/topics/gateway#sending-events + */ + DecodeError, + /** + * You sent us a payload prior to identifying + * + * See https://discord.com/developers/docs/topics/gateway-events#identify + */ + NotAuthenticated, + /** + * The account token sent with your identify payload is incorrect + * + * See https://discord.com/developers/docs/topics/gateway-events#identify + */ + AuthenticationFailed, + /** + * You sent more than one identify payload. Don't do that! + */ + AlreadyAuthenticated, + /** + * The sequence sent when resuming the session was invalid. Reconnect and start a new session + * + * See https://discord.com/developers/docs/topics/gateway-events#resume + */ + InvalidSeq = 4007, + /** + * Woah nelly! You're sending payloads to us too quickly. Slow it down! You will be disconnected on receiving this + */ + RateLimited, + /** + * Your session timed out. Reconnect and start a new one + */ + SessionTimedOut, + /** + * You sent us an invalid shard when identifying + * + * See https://discord.com/developers/docs/topics/gateway#sharding + */ + InvalidShard, + /** + * The session would have handled too many guilds - you are required to shard your connection in order to connect + * + * See https://discord.com/developers/docs/topics/gateway#sharding + */ + ShardingRequired, + /** + * You sent an invalid version for the gateway + */ + InvalidAPIVersion, + /** + * You sent an invalid intent for a Gateway Intent. You may have incorrectly calculated the bitwise value + * + * See https://discord.com/developers/docs/topics/gateway#gateway-intents + */ + InvalidIntents, + /** + * You sent a disallowed intent for a Gateway Intent. You may have tried to specify an intent that you have not + * enabled or are not whitelisted for + * + * See https://discord.com/developers/docs/topics/gateway#gateway-intents + * + * See https://discord.com/developers/docs/topics/gateway#privileged-intents + */ + DisallowedIntents, +} + +/** + * https://discord.com/developers/docs/topics/gateway#list-of-intents + */ +export enum GatewayIntentBits { + Guilds = 1 << 0, + GuildMembers = 1 << 1, + GuildModeration = 1 << 2, + /** + * @deprecated This is the old name for {@apilink GatewayIntentBits#GuildModeration} + */ + GuildBans = GuildModeration, + GuildEmojisAndStickers = 1 << 3, + GuildIntegrations = 1 << 4, + GuildWebhooks = 1 << 5, + GuildInvites = 1 << 6, + GuildVoiceStates = 1 << 7, + GuildPresences = 1 << 8, + GuildMessages = 1 << 9, + GuildMessageReactions = 1 << 10, + GuildMessageTyping = 1 << 11, + DirectMessages = 1 << 12, + DirectMessageReactions = 1 << 13, + DirectMessageTyping = 1 << 14, + GuildScheduledEvents = 1 << 16, + AutoModerationConfiguration = 1 << 20, + AutoModerationExecution = 1 << 21, +} + +/** + * https://discord.com/developers/docs/topics/gateway-events#receive-events + */ +export enum GatewayDispatchEvents { + ApplicationCommandPermissionsUpdate = 'APPLICATION_COMMAND_PERMISSIONS_UPDATE', + ChannelCreate = 'CHANNEL_CREATE', + ChannelDelete = 'CHANNEL_DELETE', + ChannelPinsUpdate = 'CHANNEL_PINS_UPDATE', + ChannelUpdate = 'CHANNEL_UPDATE', + GuildBanAdd = 'GUILD_BAN_ADD', + GuildBanRemove = 'GUILD_BAN_REMOVE', + GuildCreate = 'GUILD_CREATE', + GuildDelete = 'GUILD_DELETE', + GuildEmojisUpdate = 'GUILD_EMOJIS_UPDATE', + GuildIntegrationsUpdate = 'GUILD_INTEGRATIONS_UPDATE', + GuildMemberAdd = 'GUILD_MEMBER_ADD', + GuildMemberListUpdate = 'GUILD_MEMBER_LIST_UPDATE', + GuildMemberRemove = 'GUILD_MEMBER_REMOVE', + GuildMembersChunk = 'GUILD_MEMBERS_CHUNK', + GuildMemberUpdate = 'GUILD_MEMBER_UPDATE', + GuildRoleCreate = 'GUILD_ROLE_CREATE', + GuildRoleDelete = 'GUILD_ROLE_DELETE', + GuildRoleUpdate = 'GUILD_ROLE_UPDATE', + GuildStickersUpdate = 'GUILD_STICKERS_UPDATE', + GuildUpdate = 'GUILD_UPDATE', + IntegrationCreate = 'INTEGRATION_CREATE', + IntegrationDelete = 'INTEGRATION_DELETE', + IntegrationUpdate = 'INTEGRATION_UPDATE', + InteractionCreate = 'INTERACTION_CREATE', + InviteCreate = 'INVITE_CREATE', + InviteDelete = 'INVITE_DELETE', + MessageCreate = 'MESSAGE_CREATE', + MessageDelete = 'MESSAGE_DELETE', + MessageDeleteBulk = 'MESSAGE_DELETE_BULK', + MessageReactionAdd = 'MESSAGE_REACTION_ADD', + MessageReactionRemove = 'MESSAGE_REACTION_REMOVE', + MessageReactionRemoveAll = 'MESSAGE_REACTION_REMOVE_ALL', + MessageReactionRemoveEmoji = 'MESSAGE_REACTION_REMOVE_EMOJI', + MessageUpdate = 'MESSAGE_UPDATE', + PresenceUpdate = 'PRESENCE_UPDATE', + StageInstanceCreate = 'STAGE_INSTANCE_CREATE', + StageInstanceDelete = 'STAGE_INSTANCE_DELETE', + StageInstanceUpdate = 'STAGE_INSTANCE_UPDATE', + Ready = 'READY', + Resumed = 'RESUMED', + ThreadCreate = 'THREAD_CREATE', + ThreadDelete = 'THREAD_DELETE', + ThreadListSync = 'THREAD_LIST_SYNC', + ThreadMembersUpdate = 'THREAD_MEMBERS_UPDATE', + ThreadMemberUpdate = 'THREAD_MEMBER_UPDATE', + ThreadUpdate = 'THREAD_UPDATE', + TypingStart = 'TYPING_START', + UserUpdate = 'USER_UPDATE', + VoiceServerUpdate = 'VOICE_SERVER_UPDATE', + VoiceStateUpdate = 'VOICE_STATE_UPDATE', + WebhooksUpdate = 'WEBHOOKS_UPDATE', + GuildScheduledEventCreate = 'GUILD_SCHEDULED_EVENT_CREATE', + GuildScheduledEventUpdate = 'GUILD_SCHEDULED_EVENT_UPDATE', + GuildScheduledEventDelete = 'GUILD_SCHEDULED_EVENT_DELETE', + GuildScheduledEventUserAdd = 'GUILD_SCHEDULED_EVENT_USER_ADD', + GuildScheduledEventUserRemove = 'GUILD_SCHEDULED_EVENT_USER_REMOVE', + AutoModerationRuleCreate = 'AUTO_MODERATION_RULE_CREATE', + AutoModerationRuleUpdate = 'AUTO_MODERATION_RULE_UPDATE', + AutoModerationRuleDelete = 'AUTO_MODERATION_RULE_DELETE', + AutoModerationActionExecution = 'AUTO_MODERATION_ACTION_EXECUTION', + GuildAuditLogEntryCreate = 'GUILD_AUDIT_LOG_ENTRY_CREATE', +} + +export type GatewaySendPayload = + | GatewayHeartbeat + | GatewayIdentify + | GatewayUpdatePresence + | GatewayVoiceStateUpdate + | GatewayResume + | GatewayRequestGuildMembers + | GatewayLazyRequest; + +export type GatewayReceivePayload = + | GatewayHello + | GatewayHeartbeatRequest + | GatewayHeartbeatAck + | GatewayInvalidSession + | GatewayReconnect + | GatewayDispatchPayload; + +export type GatewayDispatchPayload = + | GatewayApplicationCommandPermissionsUpdateDispatch + | GatewayAutoModerationRuleModifyDispatch + | GatewayAutoModerationRuleCreateDispatch + | GatewayAutoModerationRuleDeleteDispatch + | GatewayAutoModerationActionExecutionDispatch + | GatewayChannelModifyDispatch + | GatewayChannelPinsUpdateDispatch + | GatewayGuildBanModifyDispatch + | GatewayGuildCreateDispatch + | GatewayGuildDeleteDispatch + | GatewayGuildEmojisUpdateDispatch + | GatewayGuildIntegrationsUpdateDispatch + | GatewayGuildMemberAddDispatch + | GatewayGuildMemberListUpdateDispatch + | GatewayGuildMemberRemoveDispatch + | GatewayGuildMembersChunkDispatch + | GatewayGuildMemberUpdateDispatch + | GatewayGuildModifyDispatch + | GatewayGuildRoleDeleteDispatch + | GatewayGuildRoleModifyDispatch + | GatewayGuildScheduledEventCreateDispatch + | GatewayGuildScheduledEventUpdateDispatch + | GatewayGuildScheduledEventDeleteDispatch + | GatewayGuildScheduledEventUserAddDispatch + | GatewayGuildScheduledEventUserRemoveDispatch + | GatewayGuildStickersUpdateDispatch + | GatewayIntegrationCreateDispatch + | GatewayIntegrationDeleteDispatch + | GatewayIntegrationUpdateDispatch + | GatewayInteractionCreateDispatch + | GatewayInviteCreateDispatch + | GatewayInviteDeleteDispatch + | GatewayMessageCreateDispatch + | GatewayMessageDeleteBulkDispatch + | GatewayMessageDeleteDispatch + | GatewayMessageReactionAddDispatch + | GatewayMessageReactionRemoveAllDispatch + | GatewayMessageReactionRemoveDispatch + | GatewayMessageReactionRemoveEmojiDispatch + | GatewayMessageUpdateDispatch + | GatewayPresenceUpdateDispatch + | GatewayStageInstanceCreateDispatch + | GatewayStageInstanceDeleteDispatch + | GatewayStageInstanceUpdateDispatch + | GatewayReadyDispatch + | GatewayResumedDispatch + | GatewayThreadListSyncDispatch + | GatewayThreadMembersUpdateDispatch + | GatewayThreadMemberUpdateDispatch + | GatewayThreadModifyDispatch + | GatewayTypingStartDispatch + | GatewayUserUpdateDispatch + | GatewayVoiceServerUpdateDispatch + | GatewayVoiceStateUpdateDispatch + | GatewayWebhooksUpdateDispatch + | GatewayGuildAuditLogEntryCreateDispatch; + +export type GatewayGuildProperties = Pick< + APIGuild, + | 'name' + | 'description' + | 'icon' + | 'splash' + | 'banner' + | 'features' + | 'preferred_locale' + | 'owner_id' + | 'application_id' + | 'afk_channel_id' + | 'afk_timeout' + | 'system_channel_id' + | 'verification_level' + | 'explicit_content_filter' + | 'default_message_notifications' + | 'mfa_level' + | 'vanity_url_code' + | 'premium_tier' + | 'system_channel_flags' + | 'discovery_splash' + | 'rules_channel_id' + | 'public_updates_channel_id' + | 'max_video_channel_users' + | 'max_members' + | 'nsfw_level' + | 'hub_type' +>; + +export type GatewayGuild = Pick & { + application_command_counts?: { 1: number; 2: number; 3: number }; // ???????????? + data_mode: string; // known types are "partial" and "full" + lazy: boolean; + version: string; + + /** + * When this guild was joined at + * + */ + joined_at: string; + /** + * `true` if this is considered a large guild + * + */ + large: boolean; + /** + * Total number of members in this guild + * + */ + member_count: number; + /** + * Users in the guild + * + * See https://discord.com/developers/docs/resources/guild#guild-member-object + */ + members: APIGuildMember[]; + /** + * Channels in the guild + * + * See https://discord.com/developers/docs/resources/channel#channel-object + */ + channels: APIChannel[]; + /** + * Threads in the guild + * + * See https://discord.com/developers/docs/resources/channel#channel-object + */ + threads: APIChannel[]; + /** + * Presences of the members in the guild, will only include non-offline members if the size is greater than `large_threshold` + * + * See https://discord.com/developers/docs/topics/gateway-events#presence-update + */ + presences: GatewayPresenceUpdate[]; + /** + * The stage instances in the guild + * + * See https://discord.com/developers/docs/resources/stage-instance#stage-instance-object-stage-instance-structure + */ + stage_instances: APIStageInstance[]; + /** + * The scheduled events in the guild + * + * https://discord.com/developers/docs/resources/guild-scheduled-event#guild-scheduled-event-object + */ + guild_scheduled_events: APIGuildScheduledEvent[]; + properties: GatewayGuildProperties; +}; + +// #region Dispatch Payloads + +/** + * https://discord.com/developers/docs/topics/gateway-events#hello + */ +export interface GatewayHello extends NonDispatchPayload { + op: GatewayOpcodes.Hello; + d: GatewayHelloData; +} + +/** + * https://discord.com/developers/docs/topics/gateway-events#hello + */ +export interface GatewayHelloData { + /** + * The interval (in milliseconds) the client should heartbeat with + */ + heartbeat_interval: number; +} + +/** + * https://discord.com/developers/docs/topics/gateway#sending-heartbeats + */ +export interface GatewayHeartbeatRequest extends NonDispatchPayload { + op: GatewayOpcodes.Heartbeat; + d: never; +} + +/** + * https://discord.com/developers/docs/topics/gateway-events#heartbeat + */ +export interface GatewayHeartbeatAck extends NonDispatchPayload { + op: GatewayOpcodes.HeartbeatAck; + d: never; +} + +/** + * https://discord.com/developers/docs/topics/gateway-events#invalid-session + */ +export interface GatewayInvalidSession extends NonDispatchPayload { + op: GatewayOpcodes.InvalidSession; + d: GatewayInvalidSessionData; +} + +/** + * https://discord.com/developers/docs/topics/gateway-events#invalid-session + */ +export type GatewayInvalidSessionData = boolean; + +/** + * https://discord.com/developers/docs/topics/gateway-events#reconnect + */ +export interface GatewayReconnect extends NonDispatchPayload { + op: GatewayOpcodes.Reconnect; + d: never; +} + +/** + * https://discord.com/developers/docs/topics/gateway-events#ready + */ +export type GatewayReadyDispatch = DataPayload; + +/** + * https://discord.com/developers/docs/topics/gateway-events#ready + */ +export interface GatewayReadyDispatchData { + /** + * Gateway version + * + * See https://discord.com/developers/docs/reference#api-versioning + */ + v: number; + /** + * Information about the user including email + * + * See https://discord.com/developers/docs/resources/user#user-object + */ + user: APIUser; + /** + * The private channels the user is in + */ + private_channels: APIChannel[]; + + /** + * The guilds the user is in + * + * See https://discord.com/developers/docs/resources/guild#unavailable-guild-object + */ + guilds: GatewayGuild[]; + analytics_token?: string; + connected_accounts?: APIConnection[]; + consents?: { + personalization?: { + consented?: boolean; + }; + }; + country_code?: string; + friend_suggestion_count?: number; + geo_ordered_rtc_regions?: string[]; // ["europe","russie","india","us-east","us-central"] + experiments?: [number, number, number, number, number][]; + guild_experiments?: [ + number, + null, + number, + [ + [ + number, + { + e: number; + s: number; + }[], + ], + ], + [number, [[number, [number, number]]]], + { + b: number; + k: bigint[]; + }[], + ][]; + guild_join_requests?: unknown[]; + user_settings?: APIUserSettings; + relationships?: APIRelationship[]; // TODO + read_state: { + entries: APIReadState[]; // TODO + partial: boolean; + version: number; + }; + user_guild_settings?: { + entries: unknown[]; // TODO: types + version: number; + partial: boolean; + }; + merged_members?: APIGuildMember[][]; + users?: APIUser[]; + sessions: unknown[]; + /** + * Used for resuming connections + */ + session_id: string; + /** + * Gateway url for resuming connections + */ + resume_gateway_url: string; + /** + * The shard information associated with this session, if sent when identifying + * + * See https://discord.com/developers/docs/topics/gateway#sharding + */ + shard?: [shard_id: number, shard_count: number]; + /** + * Contains `id` and `flags` + * + * See https://discord.com/developers/docs/resources/application#application-object + */ + application: Pick; +} +/** + * https://discord.com/developers/docs/topics/gateway-events#resumed + */ +export type GatewayResumedDispatch = DataPayload; + +/** + * https://discord.com/developers/docs/topics/gateway-events#auto-moderation-rule-create + * https://discord.com/developers/docs/topics/gateway-events#auto-moderation-rule-update + * https://discord.com/developers/docs/topics/gateway-events#auto-moderation-rule-delete + */ +export type GatewayAutoModerationRuleModifyDispatch = DataPayload< + | GatewayDispatchEvents.AutoModerationRuleCreate + | GatewayDispatchEvents.AutoModerationRuleUpdate + | GatewayDispatchEvents.AutoModerationRuleDelete, + GatewayAutoModerationRuleModifyDispatchData +>; + +/** + * https://discord.com/developers/docs/topics/gateway-events#auto-moderation-rule-create + * https://discord.com/developers/docs/topics/gateway-events#auto-moderation-rule-update + * https://discord.com/developers/docs/topics/gateway-events#auto-moderation-rule-delete + */ +export type GatewayAutoModerationRuleModifyDispatchData = APIAutoModerationRule; + +/** + * https://discord.com/developers/docs/topics/gateway-events#auto-moderation-rule-create + */ +export type GatewayAutoModerationRuleCreateDispatch = GatewayAutoModerationRuleModifyDispatch; + +/** + * https://discord.com/developers/docs/topics/gateway-events#auto-moderation-rule-create + */ +export type GatewayAutoModerationRuleCreateDispatchData = GatewayAutoModerationRuleModifyDispatchData; + +/** + * https://discord.com/developers/docs/topics/gateway-events#auto-moderation-rule-update + */ +export type GatewayAutoModerationRuleUpdateDispatch = GatewayAutoModerationRuleModifyDispatch; + +/** + * https://discord.com/developers/docs/topics/gateway-events#auto-moderation-rule-update + */ +export type GatewayAutoModerationRuleUpdateDispatchData = GatewayAutoModerationRuleModifyDispatchData; + +/** + * https://discord.com/developers/docs/topics/gateway-events#auto-moderation-rule-delete + */ +export type GatewayAutoModerationRuleDeleteDispatch = GatewayAutoModerationRuleModifyDispatch; + +/** + * https://discord.com/developers/docs/topics/gateway-events#auto-moderation-rule-delete + */ +export type GatewayAutoModerationRuleDeleteDispatchData = GatewayAutoModerationRuleModifyDispatchData; + +/** + * https://discord.com/developers/docs/topics/gateway-events#auto-moderation-action-execution + */ +export type GatewayAutoModerationActionExecutionDispatch = DataPayload< + GatewayDispatchEvents.AutoModerationActionExecution, + GatewayAutoModerationActionExecutionDispatchData +>; + +/** + * https://discord.com/developers/docs/topics/gateway-events#auto-moderation-action-execution + */ +export interface GatewayAutoModerationActionExecutionDispatchData { + /** + * The id of the guild in which action was executed + */ + guild_id: Snowflake; + /** + * The action which was executed + */ + action: APIAutoModerationAction; + /** + * The id of the rule which action belongs to + */ + rule_id: Snowflake; + /** + * The trigger type of rule which was triggered + */ + rule_trigger_type: AutoModerationRuleTriggerType; + /** + * The id of the user which generated the content which triggered the rule + */ + user_id: Snowflake; + /** + * The id of the channel in which user content was posted + */ + channel_id?: Snowflake; + /** + * The id of any user message which content belongs to + * + * This field will not be present if message was blocked by AutoMod or content was not part of any message + */ + message_id?: Snowflake; + /** + * The id of any system auto moderation messages posted as a result of this action + * + * This field will not be present if this event does not correspond to an action with type {@link AutoModerationActionType.SendAlertMessage} + */ + alert_system_message_id?: Snowflake; + /** + * The user generated text content + * + * `MESSAGE_CONTENT` (`1 << 15`) gateway intent is required to receive non-empty values from this field + */ + content: string; + /** + * The word or phrase configured in the rule that triggered the rule + */ + matched_keyword: string | null; + /** + * The substring in content that triggered the rule + * + * `MESSAGE_CONTENT` (`1 << 15`) gateway intent is required to receive non-empty values from this field + */ + matched_content: string | null; +} + +/** + * https://discord.com/developers/docs/topics/gateway-events#application-command-permissions-update + */ +export type GatewayApplicationCommandPermissionsUpdateDispatch = DataPayload< + GatewayDispatchEvents.ApplicationCommandPermissionsUpdate, + GatewayApplicationCommandPermissionsUpdateDispatchData +>; + +/** + * https://discord.com/developers/docs/topics/gateway-events#application-command-permissions-update + */ +export interface GatewayApplicationCommandPermissionsUpdateDispatchData { + /** + * ID of the command or the application ID + */ + id: Snowflake; + /** + * ID of the application the command belongs to + */ + application_id: Snowflake; + /** + * ID of the guild + */ + guild_id: Snowflake; + /** + * Permissions for the command in the guild, max of 100 + */ + permissions: APIApplicationCommandPermission[]; +} + +/** + * https://discord.com/developers/docs/topics/gateway-events#channel-create + * https://discord.com/developers/docs/topics/gateway-events#channel-update + * https://discord.com/developers/docs/topics/gateway-events#channel-delete + */ +export type GatewayChannelModifyDispatch = DataPayload< + GatewayDispatchEvents.ChannelCreate | GatewayDispatchEvents.ChannelDelete | GatewayDispatchEvents.ChannelUpdate, + GatewayChannelModifyDispatchData +>; + +/** + * https://discord.com/developers/docs/topics/gateway-events#channel-create + * https://discord.com/developers/docs/topics/gateway-events#channel-update + * https://discord.com/developers/docs/topics/gateway-events#channel-delete + */ +export type GatewayChannelModifyDispatchData = APIChannel; + +/** + * https://discord.com/developers/docs/topics/gateway-events#channel-create + */ +export type GatewayChannelCreateDispatch = GatewayChannelModifyDispatch; + +/** + * https://discord.com/developers/docs/topics/gateway-events#channel-create + */ +export type GatewayChannelCreateDispatchData = GatewayChannelModifyDispatchData; + +/** + * https://discord.com/developers/docs/topics/gateway-events#channel-update + */ +export type GatewayChannelUpdateDispatch = GatewayChannelModifyDispatch; + +/** + * https://discord.com/developers/docs/topics/gateway-events#channel-update + */ +export type GatewayChannelUpdateDispatchData = GatewayChannelModifyDispatchData; + +/** + * https://discord.com/developers/docs/topics/gateway-events#channel-delete + */ +export type GatewayChannelDeleteDispatch = GatewayChannelModifyDispatch; + +/** + * https://discord.com/developers/docs/topics/gateway-events#channel-delete + */ +export type GatewayChannelDeleteDispatchData = GatewayChannelModifyDispatchData; + +/** + * https://discord.com/developers/docs/topics/gateway-events#channel-pins-update + */ +export type GatewayChannelPinsUpdateDispatch = DataPayload< + GatewayDispatchEvents.ChannelPinsUpdate, + GatewayChannelPinsUpdateDispatchData +>; + +/** + * https://discord.com/developers/docs/topics/gateway-events#channel-pins-update + */ +export interface GatewayChannelPinsUpdateDispatchData { + /** + * The id of the guild + */ + guild_id?: Snowflake; + /** + * The id of the channel + */ + channel_id: Snowflake; + /** + * The time at which the most recent pinned message was pinned + */ + last_pin_timestamp?: string | null; +} + +/** + * https://discord.com/developers/docs/topics/gateway-events#guild-update + */ +export type GatewayGuildModifyDispatch = DataPayload; + +/** + * https://discord.com/developers/docs/topics/gateway-events#guild-update + */ +export type GatewayGuildModifyDispatchData = APIGuild; + +/** + * https://discord.com/developers/docs/topics/gateway-events#guild-create + */ +export type GatewayGuildCreateDispatch = DataPayload; + +/** + * https://discord.com/developers/docs/topics/gateway-events#guild-create + * https://discord.com/developers/docs/topics/gateway-events#guild-create-guild-create-extra-fields + */ +export interface GatewayGuildCreateDispatchData { + /** + * When this guild was joined at + * + * **This field is only sent within the [GUILD_CREATE](https://discord.com/developers/docs/topics/gateway-events#guild-create) event** + */ + joined_at: string; + /** + * Total number of members in this guild + * + * **This field is only sent within the [GUILD_CREATE](https://discord.com/developers/docs/topics/gateway-events#guild-create) event** + */ + member_count: number; + /** + * Users in the guild + * + * **This field is only sent within the [GUILD_CREATE](https://discord.com/developers/docs/topics/gateway-events#guild-create) event** + * + * See https://discord.com/developers/docs/resources/guild#guild-member-object + */ + members: APIGuildMember[]; + /** + * Channels in the guild + * + * **This field is only sent within the [GUILD_CREATE](https://discord.com/developers/docs/topics/gateway-events#guild-create) event** + * + * See https://discord.com/developers/docs/resources/channel#channel-object + */ + channels: APIChannel[]; + /** + * Threads in the guild + * + * **This field is only sent within the [GUILD_CREATE](https://discord.com/developers/docs/topics/gateway-events#guild-create) event** + * + * See https://discord.com/developers/docs/resources/channel#channel-object + */ + threads: APIChannel[]; + /** + * Presences of the members in the guild, will only include non-offline members if the size is greater than `large_threshold` + * + * **This field is only sent within the [GUILD_CREATE](https://discord.com/developers/docs/topics/gateway-events#guild-create) event** + * + * See https://discord.com/developers/docs/topics/gateway-events#presence-update + */ + presences: GatewayPresenceUpdate[]; + /** + * The stage instances in the guild + * + * **This field is only sent within the [GUILD_CREATE](https://discord.com/developers/docs/topics/gateway-events#guild-create) event** + * + * See https://discord.com/developers/docs/resources/stage-instance#stage-instance-object-stage-instance-structure + */ + stage_instances: APIStageInstance[]; + /** + * The scheduled events in the guild + * + * **This field is only sent within the [GUILD_CREATE](https://discord.com/developers/docs/topics/gateway-events#guild-create) event** + * + * https://discord.com/developers/docs/resources/guild-scheduled-event#guild-scheduled-event-object + */ + guild_scheduled_events: APIGuildScheduledEvent[]; + guild_hashes: unknown; + properties: GatewayGuildProperties; +} + +/** + * https://discord.com/developers/docs/topics/gateway-events#guild-update + */ +export type GatewayGuildUpdateDispatch = GatewayGuildModifyDispatch; +/** + * https://discord.com/developers/docs/topics/gateway-events#guild-update + */ +export type GatewayGuildUpdateDispatchData = GatewayGuildModifyDispatchData; + +/** + * https://discord.com/developers/docs/topics/gateway-events#guild-delete + */ +export type GatewayGuildDeleteDispatch = DataPayload; + +/** + * https://discord.com/developers/docs/topics/gateway-events#guild-delete + */ +export type GatewayGuildDeleteDispatchData = APIUnavailableGuild; + +/** + * https://discord.com/developers/docs/topics/gateway-events#guild-ban-add + * https://discord.com/developers/docs/topics/gateway-events#guild-ban-remove + */ +export type GatewayGuildBanModifyDispatch = DataPayload< + GatewayDispatchEvents.GuildBanAdd | GatewayDispatchEvents.GuildBanRemove, + GatewayGuildBanModifyDispatchData +>; + +/** + * https://discord.com/developers/docs/topics/gateway-events#guild-ban-add + * https://discord.com/developers/docs/topics/gateway-events#guild-ban-remove + */ +export interface GatewayGuildBanModifyDispatchData { + /** + * ID of the guild + */ + guild_id: Snowflake; + /** + * The banned user + * + * See https://discord.com/developers/docs/resources/user#user-object + */ + user: APIUser; +} + +/** + * https://discord.com/developers/docs/topics/gateway-events#guild-ban-add + */ +export type GatewayGuildBanAddDispatch = GatewayGuildBanModifyDispatch; + +/** + * https://discord.com/developers/docs/topics/gateway-events#guild-ban-add + */ +export type GatewayGuildBanAddDispatchData = GatewayGuildBanModifyDispatchData; + +/** + * https://discord.com/developers/docs/topics/gateway-events#guild-ban-remove + */ +export type GatewayGuildBanRemoveDispatch = GatewayGuildBanModifyDispatch; + +/** + * https://discord.com/developers/docs/topics/gateway-events#guild-ban-remove + */ +export type GatewayGuildBanRemoveDispatchData = GatewayGuildBanModifyDispatchData; + +/** + * https://discord.com/developers/docs/topics/gateway-events#guild-emojis-update + */ +export type GatewayGuildEmojisUpdateDispatch = DataPayload< + GatewayDispatchEvents.GuildEmojisUpdate, + GatewayGuildEmojisUpdateDispatchData +>; + +/** + * https://discord.com/developers/docs/topics/gateway-events#guild-emojis-update + */ +export interface GatewayGuildEmojisUpdateDispatchData { + /** + * ID of the guild + */ + guild_id: Snowflake; + /** + * Array of emojis + * + * See https://discord.com/developers/docs/resources/emoji#emoji-object + */ + emojis: APIEmoji[]; +} + +/** + * https://discord.com/developers/docs/topics/gateway-events#guild-stickers-update + */ +export type GatewayGuildStickersUpdateDispatch = DataPayload< + GatewayDispatchEvents.GuildStickersUpdate, + GatewayGuildStickersUpdateDispatchData +>; + +/** + * https://discord.com/developers/docs/topics/gateway-events#guild-stickers-update + */ +export interface GatewayGuildStickersUpdateDispatchData { + /** + * ID of the guild + */ + guild_id: Snowflake; + /** + * Array of stickers + * + * See https://discord.com/developers/docs/resources/sticker#sticker-object + */ + stickers: APISticker[]; +} + +/** + * https://discord.com/developers/docs/topics/gateway-events#guild-integrations-update + */ +export type GatewayGuildIntegrationsUpdateDispatch = DataPayload< + GatewayDispatchEvents.GuildIntegrationsUpdate, + GatewayGuildIntegrationsUpdateDispatchData +>; + +/** + * https://discord.com/developers/docs/topics/gateway-events#guild-integrations-update + */ +export interface GatewayGuildIntegrationsUpdateDispatchData { + /** + * ID of the guild whose integrations were updated + */ + guild_id: Snowflake; +} + +/** + * https://discord.com/developers/docs/topics/gateway-events#guild-member-add + */ +export type GatewayGuildMemberAddDispatch = DataPayload< + GatewayDispatchEvents.GuildMemberAdd, + GatewayGuildMemberAddDispatchData +>; + +/** + * https://discord.com/developers/docs/topics/gateway-events#guild-member-add + */ +export interface GatewayGuildMemberAddDispatchData extends APIGuildMember { + /** + * The id of the guild + */ + guild_id: Snowflake; +} + +export type GatewayGuildMemberListUpdateDispatch = DataPayload< + GatewayDispatchEvents.GuildMemberListUpdate, + GatewayGuildMemberListUpdateDispatchData +>; + +export enum GatewayGuildMemberListUpdateOperation { + SYNC = 'SYNC', + INVALIDATE = 'INVALIDATE', + INSERT = 'INSERT', + DELETE = 'DELETE', + UPDATE = 'UPDATE', +} +export interface GatewayGuildMemberListUpdateGroup { + count: number; + id: string; +} + +export interface GatewayGuildMemberListUpdateMember extends APIGuildMember { + index: number; + id: Snowflake; + guild_id: Snowflake; + presence: { + id: Snowflake; + user_id: Snowflake; + user: { id: Snowflake }; + activities: GatewayActivity[]; + status: PresenceUpdateStatus; + }; +} + +export interface GatewayGuildMemberListUpdateDispatchData { + groups: GatewayGuildMemberListUpdateGroup[]; + guild_id: Snowflake; + id: string; + member_count: number; + online_count: number; + ops: { + op: keyof typeof GatewayGuildMemberListUpdateOperation; + range: number[]; + items: ({ group: GatewayGuildMemberListUpdateGroup } | { member: GatewayGuildMemberListUpdateMember })[]; + index: number; + item: { group: GatewayGuildMemberListUpdateGroup } | { member: GatewayGuildMemberListUpdateMember }; + }[]; +} + +/** + * https://discord.com/developers/docs/topics/gateway-events#guild-member-remove + */ +export type GatewayGuildMemberRemoveDispatch = DataPayload< + GatewayDispatchEvents.GuildMemberRemove, + GatewayGuildMemberRemoveDispatchData +>; + +/** + * https://discord.com/developers/docs/topics/gateway-events#guild-member-remove + */ +export interface GatewayGuildMemberRemoveDispatchData { + /** + * The id of the guild + */ + guild_id: Snowflake; + /** + * The user who was removed + * + * See https://discord.com/developers/docs/resources/user#user-object + */ + user: APIUser; +} + +/** + * https://discord.com/developers/docs/topics/gateway-events#guild-member-update + */ +export type GatewayGuildMemberUpdateDispatch = DataPayload< + GatewayDispatchEvents.GuildMemberUpdate, + GatewayGuildMemberUpdateDispatchData +>; + +/** + * https://discord.com/developers/docs/topics/gateway-events#guild-member-update + */ +export type GatewayGuildMemberUpdateDispatchData = Omit & + Partial> & + Required> & + Nullable> & { + /** + * The id of the guild + */ + guild_id: Snowflake; + }; + +/** + * https://discord.com/developers/docs/topics/gateway-events#guild-members-chunk + */ +export type GatewayGuildMembersChunkDispatch = DataPayload< + GatewayDispatchEvents.GuildMembersChunk, + GatewayGuildMembersChunkDispatchData +>; + +/** + * https://discord.com/developers/docs/topics/gateway-events#guild-members-chunk + */ +export interface GatewayGuildMembersChunkDispatchData { + /** + * The id of the guild + */ + guild_id: Snowflake; + /** + * Set of guild members + * + * See https://discord.com/developers/docs/resources/guild#guild-member-object + */ + members: APIGuildMember[]; + /** + * The chunk index in the expected chunks for this response (`0 <= chunk_index < chunk_count`) + */ + chunk_index: number; + /** + * The total number of expected chunks for this response + */ + chunk_count: number; + /** + * If passing an invalid id to `REQUEST_GUILD_MEMBERS`, it will be returned here + */ + not_found?: unknown[]; + /** + * If passing true to `REQUEST_GUILD_MEMBERS`, presences of the returned members will be here + * + * See https://discord.com/developers/docs/topics/gateway-events#update-presence + */ + presences?: RawGatewayPresenceUpdate[]; + /** + * The nonce used in the Guild Members Request + * + * See https://discord.com/developers/docs/topics/gateway-events#request-guild-members + */ + nonce?: string; +} + +/** + * https://discord.com/developers/docs/topics/gateway-events#guild-role-create + * https://discord.com/developers/docs/topics/gateway-events#guild-role-update + */ +export type GatewayGuildRoleModifyDispatch = DataPayload< + GatewayDispatchEvents.GuildRoleCreate | GatewayDispatchEvents.GuildRoleUpdate, + GatewayGuildRoleModifyDispatchData +>; + +/** + * https://discord.com/developers/docs/topics/gateway-events#guild-role-create + * https://discord.com/developers/docs/topics/gateway-events#guild-role-update + */ +export interface GatewayGuildRoleModifyDispatchData { + /** + * The id of the guild + */ + guild_id: Snowflake; + /** + * The role created or updated + * + * See https://discord.com/developers/docs/topics/permissions#role-object + */ + role: APIRole; +} + +/** + * https://discord.com/developers/docs/topics/gateway-events#guild-role-create + */ +export type GatewayGuildRoleCreateDispatch = GatewayGuildRoleModifyDispatch; + +/** + * https://discord.com/developers/docs/topics/gateway-events#guild-role-create + */ +export type GatewayGuildRoleCreateDispatchData = GatewayGuildRoleModifyDispatchData; + +/** + * https://discord.com/developers/docs/topics/gateway-events#guild-role-update + */ +export type GatewayGuildRoleUpdateDispatch = GatewayGuildRoleModifyDispatch; + +/** + * https://discord.com/developers/docs/topics/gateway-events#guild-role-update + */ +export type GatewayGuildRoleUpdateDispatchData = GatewayGuildRoleModifyDispatchData; + +/** + * https://discord.com/developers/docs/topics/gateway-events#guild-role-delete + */ +export type GatewayGuildRoleDeleteDispatch = DataPayload< + GatewayDispatchEvents.GuildRoleDelete, + GatewayGuildRoleDeleteDispatchData +>; + +/** + * https://discord.com/developers/docs/topics/gateway-events#guild-role-delete + */ +export interface GatewayGuildRoleDeleteDispatchData { + /** + * The id of the guild + */ + guild_id: Snowflake; + /** + * The id of the role + */ + role_id: Snowflake; +} + +export type GatewayGuildScheduledEventCreateDispatch = DataPayload< + GatewayDispatchEvents.GuildScheduledEventCreate, + GatewayGuildScheduledEventCreateDispatchData +>; + +export type GatewayGuildScheduledEventCreateDispatchData = APIGuildScheduledEvent; + +export type GatewayGuildScheduledEventUpdateDispatch = DataPayload< + GatewayDispatchEvents.GuildScheduledEventUpdate, + GatewayGuildScheduledEventUpdateDispatchData +>; + +export type GatewayGuildScheduledEventUpdateDispatchData = APIGuildScheduledEvent; + +export type GatewayGuildScheduledEventDeleteDispatch = DataPayload< + GatewayDispatchEvents.GuildScheduledEventDelete, + GatewayGuildScheduledEventDeleteDispatchData +>; + +export type GatewayGuildScheduledEventDeleteDispatchData = APIGuildScheduledEvent; + +export type GatewayGuildScheduledEventUserAddDispatch = DataPayload< + GatewayDispatchEvents.GuildScheduledEventUserAdd, + GatewayGuildScheduledEventUserAddDispatchData +>; + +export interface GatewayGuildScheduledEventUserAddDispatchData { + guild_scheduled_event_id: Snowflake; + user_id: Snowflake; + guild_id: Snowflake; +} + +export type GatewayGuildScheduledEventUserRemoveDispatch = DataPayload< + GatewayDispatchEvents.GuildScheduledEventUserRemove, + GatewayGuildScheduledEventUserAddDispatchData +>; + +export interface GatewayGuildScheduledEventUserRemoveDispatchData { + guild_scheduled_event_id: Snowflake; + user_id: Snowflake; + guild_id: Snowflake; +} + +/** + * https://discord.com/developers/docs/topics/gateway-events#integration-create + */ +export type GatewayIntegrationCreateDispatch = DataPayload< + GatewayDispatchEvents.IntegrationCreate, + GatewayIntegrationCreateDispatchData +>; + +/** + * https://discord.com/developers/docs/topics/gateway-events#integration-create + */ +export type GatewayIntegrationCreateDispatchData = APIGuildIntegration & { guild_id: Snowflake }; + +/** + * https://discord.com/developers/docs/topics/gateway-events#integration-update + */ +export type GatewayIntegrationUpdateDispatch = DataPayload< + GatewayDispatchEvents.IntegrationUpdate, + GatewayIntegrationUpdateDispatchData +>; + +/** + * https://discord.com/developers/docs/topics/gateway-events#integration-update + */ +export type GatewayIntegrationUpdateDispatchData = APIGuildIntegration & { guild_id: Snowflake }; + +/** + * https://discord.com/developers/docs/topics/gateway-events#integration-update + */ +export type GatewayIntegrationDeleteDispatch = DataPayload< + GatewayDispatchEvents.IntegrationDelete, + GatewayIntegrationDeleteDispatchData +>; + +/** + * https://discord.com/developers/docs/topics/gateway-events#integration-delete + */ +export interface GatewayIntegrationDeleteDispatchData { + /** + * Integration id + */ + id: Snowflake; + /** + * ID of the guild + */ + guild_id: Snowflake; + /** + * ID of the bot/OAuth2 application for this Discord integration + */ + application_id?: Snowflake; +} + +/** + * https://discord.com/developers/docs/topics/gateway-events#interaction-create + */ +export type GatewayInteractionCreateDispatch = DataPayload< + GatewayDispatchEvents.InteractionCreate, + GatewayInteractionCreateDispatchData +>; + +/** + * https://discord.com/developers/docs/topics/gateway-events#interaction-create + */ +export type GatewayInteractionCreateDispatchData = APIInteraction; + +/** + * https://discord.com/developers/docs/topics/gateway-events#invite-create + */ +export type GatewayInviteCreateDispatch = DataPayload< + GatewayDispatchEvents.InviteCreate, + GatewayInviteCreateDispatchData +>; + +/** + * https://discord.com/developers/docs/topics/gateway-events#invite-create + */ +export interface GatewayInviteCreateDispatchData { + /** + * The channel the invite is for + */ + channel_id: Snowflake; + /** + * The unique invite code + * + * See https://discord.com/developers/docs/resources/invite#invite-object + */ + code: string; + /** + * The time at which the invite was created + */ + created_at: number; + /** + * The guild of the invite + */ + guild_id?: Snowflake; + /** + * The user that created the invite + * + * See https://discord.com/developers/docs/resources/user#user-object + */ + inviter?: APIUser; + /** + * How long the invite is valid for (in seconds) + */ + max_age: number; + /** + * The maximum number of times the invite can be used + */ + max_uses: number; + /** + * The type of target for this voice channel invite + * + * See https://discord.com/developers/docs/resources/invite#invite-object-invite-target-types + */ + target_type?: InviteTargetType; + /** + * The user whose stream to display for this voice channel stream invite + * + * See https://discord.com/developers/docs/resources/user#user-object + */ + target_user?: APIUser; + /** + * The embedded application to open for this voice channel embedded application invite + */ + target_application?: Partial; + /** + * Whether or not the invite is temporary (invited users will be kicked on disconnect unless they're assigned a role) + */ + temporary: boolean; + /** + * How many times the invite has been used (always will be `0`) + */ + uses: 0; +} + +/** + * https://discord.com/developers/docs/topics/gateway-events#invite-delete + */ +export type GatewayInviteDeleteDispatch = DataPayload< + GatewayDispatchEvents.InviteDelete, + GatewayInviteDeleteDispatchData +>; + +/** + * https://discord.com/developers/docs/topics/gateway-events#invite-delete + */ +export interface GatewayInviteDeleteDispatchData { + /** + * The channel of the invite + */ + channel_id: Snowflake; + /** + * The guild of the invite + */ + guild_id?: Snowflake; + /** + * The unique invite code + * + * See https://discord.com/developers/docs/resources/invite#invite-object + */ + code: string; +} + +/** + * https://discord.com/developers/docs/topics/gateway-events#message-create + */ +export type GatewayMessageCreateDispatch = DataPayload< + GatewayDispatchEvents.MessageCreate, + GatewayMessageCreateDispatchData +>; + +/** + * https://discord.com/developers/docs/topics/gateway-events#message-create + */ +export type GatewayMessageCreateDispatchData = Omit & GatewayMessageEventExtraFields; + +/** + * https://discord.com/developers/docs/topics/gateway-events#message-update + */ +export type GatewayMessageUpdateDispatch = DataPayload< + GatewayDispatchEvents.MessageUpdate, + GatewayMessageUpdateDispatchData +>; + +/** + * https://discord.com/developers/docs/topics/gateway-events#message-update + */ +export type GatewayMessageUpdateDispatchData = Omit, 'mentions'> & + GatewayMessageEventExtraFields & { + /** + * ID of the message + */ + id: Snowflake; + /** + * ID of the channel the message was sent in + */ + channel_id: Snowflake; + }; + +export interface GatewayMessageEventExtraFields { + /** + * ID of the guild the message was sent in + */ + guild_id?: Snowflake; + /** + * Member properties for this message's author + * + * The member object exists in `MESSAGE_CREATE` and `MESSAGE_UPDATE` events + * from text-based guild channels + * + * See https://discord.com/developers/docs/resources/guild#guild-member-object + */ + member?: APIGuildMember; + /** + * Users specifically mentioned in the message + * + * The `member` field is only present in `MESSAGE_CREATE` and `MESSAGE_UPDATE` events + * from text-based guild channels + * + * See https://discord.com/developers/docs/resources/user#user-object + * See https://discord.com/developers/docs/resources/guild#guild-member-object + */ + mentions: (APIUser & { member?: Omit })[]; +} + +/** + * https://discord.com/developers/docs/topics/gateway-events#message-delete + */ +export type GatewayMessageDeleteDispatch = DataPayload< + GatewayDispatchEvents.MessageDelete, + GatewayMessageDeleteDispatchData +>; + +/** + * https://discord.com/developers/docs/topics/gateway-events#message-delete + */ +export interface GatewayMessageDeleteDispatchData { + /** + * The id of the message + */ + id: Snowflake; + /** + * The id of the channel + */ + channel_id: Snowflake; + /** + * The id of the guild + */ + guild_id?: Snowflake; +} + +/** + * https://discord.com/developers/docs/topics/gateway-events#message-delete-bulk + */ +export type GatewayMessageDeleteBulkDispatch = DataPayload< + GatewayDispatchEvents.MessageDeleteBulk, + GatewayMessageDeleteBulkDispatchData +>; + +/** + * https://discord.com/developers/docs/topics/gateway-events#message-delete-bulk + */ +export interface GatewayMessageDeleteBulkDispatchData { + /** + * The ids of the messages + */ + ids: Snowflake[]; + /** + * The id of the channel + */ + channel_id: Snowflake; + /** + * The id of the guild + */ + guild_id?: Snowflake; +} + +/** + * https://discord.com/developers/docs/topics/gateway-events#message-reaction-add + */ +export type GatewayMessageReactionAddDispatch = ReactionData; + +/** + * https://discord.com/developers/docs/topics/gateway-events#message-reaction-add + */ +export type GatewayMessageReactionAddDispatchData = GatewayMessageReactionAddDispatch['d']; + +/** + * https://discord.com/developers/docs/topics/gateway-events#message-reaction-remove + */ +export type GatewayMessageReactionRemoveDispatch = ReactionData; + +/** + * https://discord.com/developers/docs/topics/gateway-events#message-reaction-remove + */ +export type GatewayMessageReactionRemoveDispatchData = GatewayMessageReactionRemoveDispatch['d']; + +/** + * https://discord.com/developers/docs/topics/gateway-events#message-reaction-remove-all + */ +export type GatewayMessageReactionRemoveAllDispatch = DataPayload< + GatewayDispatchEvents.MessageReactionRemoveAll, + GatewayMessageReactionRemoveAllDispatchData +>; + +/** + * https://discord.com/developers/docs/topics/gateway-events#message-reaction-remove-all + */ +export type GatewayMessageReactionRemoveAllDispatchData = MessageReactionRemoveData; + +/** + * https://discord.com/developers/docs/topics/gateway-events#message-reaction-remove-emoji + */ +export type GatewayMessageReactionRemoveEmojiDispatch = DataPayload< + GatewayDispatchEvents.MessageReactionRemoveEmoji, + GatewayMessageReactionRemoveEmojiDispatchData +>; + +/** + * https://discord.com/developers/docs/topics/gateway-events#message-reaction-remove-emoji + */ +export interface GatewayMessageReactionRemoveEmojiDispatchData extends MessageReactionRemoveData { + /** + * The emoji that was removed + */ + emoji: APIEmoji; +} + +/** + * https://discord.com/developers/docs/topics/gateway-events#presence-update + */ +export type GatewayPresenceUpdateDispatch = DataPayload< + GatewayDispatchEvents.PresenceUpdate, + GatewayPresenceUpdateDispatchData +>; + +/** + * https://discord.com/developers/docs/topics/gateway-events#presence-update + */ +export type GatewayPresenceUpdateDispatchData = RawGatewayPresenceUpdate; + +/** + * https://discord.com/developers/docs/topics/gateway-events#stage-instance-create + */ +export type GatewayStageInstanceCreateDispatch = DataPayload< + GatewayDispatchEvents.StageInstanceCreate, + GatewayStageInstanceCreateDispatchData +>; + +/** + * https://discord.com/developers/docs/topics/gateway-events#stage-instance-create + */ +export type GatewayStageInstanceCreateDispatchData = APIStageInstance; + +/** + * https://discord.com/developers/docs/topics/gateway-events#stage-instance-delete + */ +export type GatewayStageInstanceDeleteDispatch = DataPayload< + GatewayDispatchEvents.StageInstanceDelete, + GatewayStageInstanceDeleteDispatchData +>; + +/** + * https://discord.com/developers/docs/topics/gateway-events#stage-instance-delete + */ +export type GatewayStageInstanceDeleteDispatchData = APIStageInstance; + +/** + * https://discord.com/developers/docs/topics/gateway-events#stage-instance-update + */ +export type GatewayStageInstanceUpdateDispatch = DataPayload< + GatewayDispatchEvents.StageInstanceUpdate, + GatewayStageInstanceUpdateDispatchData +>; + +/** + * https://discord.com/developers/docs/topics/gateway-events#stage-instance-update + */ +export type GatewayStageInstanceUpdateDispatchData = APIStageInstance; + +/** + * https://discord.com/developers/docs/topics/gateway-events#thread-list-sync + */ +export type GatewayThreadListSyncDispatch = DataPayload< + GatewayDispatchEvents.ThreadListSync, + GatewayThreadListSyncDispatchData +>; + +/** + * https://discord.com/developers/docs/topics/gateway-events#thread-list-sync + */ +export type GatewayThreadListSyncDispatchData = RawGatewayThreadListSync; + +/** + * https://discord.com/developers/docs/topics/gateway-events#thread-members-update + */ +export type GatewayThreadMembersUpdateDispatch = DataPayload< + GatewayDispatchEvents.ThreadMembersUpdate, + GatewayThreadMembersUpdateDispatchData +>; + +/** + * https://discord.com/developers/docs/topics/gateway-events#thread-members-update + */ +export type GatewayThreadMembersUpdateDispatchData = RawGatewayThreadMembersUpdate; + +/** + * https://discord.com/developers/docs/topics/gateway-events#thread-member-update + */ +export type GatewayThreadMemberUpdateDispatch = DataPayload< + GatewayDispatchEvents.ThreadMemberUpdate, + GatewayThreadMemberUpdateDispatchData +>; + +/** + * https://discord.com/developers/docs/topics/gateway-events#thread-member-update + */ +export type GatewayThreadMemberUpdateDispatchData = APIThreadMember & { guild_id: Snowflake }; + +/** + * https://discord.com/developers/docs/topics/gateway-events#thread-create + * https://discord.com/developers/docs/topics/gateway-events#thread-update + * https://discord.com/developers/docs/topics/gateway-events#thread-delete + */ +export type GatewayThreadModifyDispatch = DataPayload< + GatewayDispatchEvents.ThreadCreate | GatewayDispatchEvents.ThreadDelete | GatewayDispatchEvents.ThreadUpdate, + GatewayChannelModifyDispatchData +>; + +/** + * https://discord.com/developers/docs/topics/gateway-events#thread-create + */ +export type GatewayThreadCreateDispatch = GatewayChannelModifyDispatch; + +/** + * https://discord.com/developers/docs/topics/gateway-events#thread-create + */ +export interface GatewayThreadCreateDispatchData extends APIThreadChannel { + /** + * Whether the thread is newly created or not. + */ + newly_created?: true; +} + +/** + * https://discord.com/developers/docs/topics/gateway-events#thread-update + */ +export type GatewayThreadUpdateDispatch = GatewayChannelModifyDispatch; + +/** + * https://discord.com/developers/docs/topics/gateway-events#thread-update + */ +export type GatewayThreadUpdateDispatchData = GatewayChannelModifyDispatchData; + +/** + * https://discord.com/developers/docs/topics/gateway-events#thread-delete + */ +export type GatewayThreadDeleteDispatch = GatewayChannelModifyDispatch; + +/** + * https://discord.com/developers/docs/topics/gateway-events#thread-delete + */ +export type GatewayThreadDeleteDispatchData = GatewayChannelModifyDispatchData; + +/** + * https://discord.com/developers/docs/topics/gateway-events#typing-start + */ +export type GatewayTypingStartDispatch = DataPayload; + +/** + * https://discord.com/developers/docs/topics/gateway-events#typing-start + */ +export interface GatewayTypingStartDispatchData { + /** + * The id of the channel + */ + channel_id: Snowflake; + /** + * The id of the guild + */ + guild_id?: Snowflake; + /** + * The id of the user + */ + user_id: Snowflake; + /** + * Unix time (in seconds) of when the user started typing + */ + timestamp: number; + /** + * The member who started typing if this happened in a guild + * + * See https://discord.com/developers/docs/resources/guild#guild-member-object + */ + member?: APIGuildMember; +} + +/** + * https://discord.com/developers/docs/topics/gateway-events#user-update + */ +export type GatewayUserUpdateDispatch = DataPayload; + +/** + * https://discord.com/developers/docs/topics/gateway-events#user-update + */ +export type GatewayUserUpdateDispatchData = APIUser; + +/** + * https://discord.com/developers/docs/topics/gateway-events#voice-state-update + */ +export type GatewayVoiceStateUpdateDispatch = DataPayload< + GatewayDispatchEvents.VoiceStateUpdate, + GatewayVoiceStateUpdateDispatchData +>; + +/** + * https://discord.com/developers/docs/topics/gateway-events#voice-state-update + */ +export type GatewayVoiceStateUpdateDispatchData = GatewayVoiceState; + +/** + * https://discord.com/developers/docs/topics/gateway-events#voice-server-update + */ +export type GatewayVoiceServerUpdateDispatch = DataPayload< + GatewayDispatchEvents.VoiceServerUpdate, + GatewayVoiceServerUpdateDispatchData +>; + +/** + * https://discord.com/developers/docs/topics/gateway-events#voice-server-update + */ +export interface GatewayVoiceServerUpdateDispatchData { + /** + * Voice connection token + */ + token: string; + /** + * The guild this voice server update is for + */ + guild_id: Snowflake; + /** + * The voice server host + * + * A `null` endpoint means that the voice server allocated has gone away and is trying to be reallocated. + * You should attempt to disconnect from the currently connected voice server, and not attempt to reconnect + * until a new voice server is allocated + */ + endpoint: string | null; +} + +/** + * https://discord.com/developers/docs/topics/gateway-events#webhooks-update + */ +export type GatewayWebhooksUpdateDispatch = DataPayload< + GatewayDispatchEvents.WebhooksUpdate, + GatewayWebhooksUpdateDispatchData +>; + +/** + * https://discord.com/developers/docs/topics/gateway-events#webhooks-update + */ +export interface GatewayWebhooksUpdateDispatchData { + /** + * The id of the guild + */ + guild_id: Snowflake; + /** + * The id of the channel + */ + channel_id: Snowflake; +} + +/** + * https://discord.com/developers/docs/topics/gateway-events#guild-audit-log-entry-create + */ +export type GatewayGuildAuditLogEntryCreateDispatch = DataPayload< + GatewayDispatchEvents.GuildAuditLogEntryCreate, + GatewayGuildAuditLogEntryCreateDispatchData +>; + +/** + * https://discord.com/developers/docs/topics/gateway-events#guild-audit-log-entry-create + */ +export interface GatewayGuildAuditLogEntryCreateDispatchData extends APIAuditLogEntry { + /** + * ID of the guild + */ + guild_id: Snowflake; +} + +// #endregion Dispatch Payloads + +// #region Sendable Payloads + +/** + * https://discord.com/developers/docs/topics/gateway#sending-heartbeats + */ +export interface GatewayHeartbeat { + op: GatewayOpcodes.Heartbeat; + d: GatewayHeartbeatData; +} + +/** + * https://discord.com/developers/docs/topics/gateway#sending-heartbeats + */ +export type GatewayHeartbeatData = number | null; + +/** + * https://discord.com/developers/docs/topics/gateway-events#identify + */ +export interface GatewayIdentify { + op: GatewayOpcodes.Identify; + d: GatewayIdentifyData; +} + +/** + * https://discord.com/developers/docs/topics/gateway-events#identify + */ +export interface GatewayIdentifyData { + /** + * Authentication token + */ + token: string; + /** + * Connection properties + * + * See https://discord.com/developers/docs/topics/gateway-events#identify-identify-connection-properties + */ + properties: GatewayIdentifyProperties; + /** + * Whether this connection supports compression of packets + * + * @default false + */ + compress?: boolean; + /** + * Value between 50 and 250, total number of members where the gateway will stop sending + * offline members in the guild member list + * + * @default 50 + */ + large_threshold?: number; + largeThreshold?: number; + /** + * Used for Guild Sharding + * + * See https://discord.com/developers/docs/topics/gateway#sharding + */ + shard?: [shard_id: number, shard_count: number]; + /** + * Presence structure for initial presence information + * + * See https://discord.com/developers/docs/topics/gateway-events#update-presence + */ + presence?: GatewayPresenceUpdateData; + /** + * The Gateway Intents you wish to receive + * + * See https://discord.com/developers/docs/topics/gateway#gateway-intents + */ + intents?: number; + guild_subscriptions?: boolean; + capabilities?: number; + client_state?: { + guild_hashes?: unknown; + highest_last_message_id?: string | number; + read_state_version?: number; + user_guild_settings_version?: number; + user_settings_version?: number; + useruser_guild_settings_version?: number; + private_channels_version?: number; + guild_versions?: unknown; + api_code_version?: number; + }; + clientState?: { + guildHashes?: unknown; + highestLastMessageId?: string | number; + readStateVersion?: number; + userGuildSettingsVersion?: number; + useruserGuildSettingsVersion?: number; + guildVersions?: unknown; + apiCodeVersion?: number; + }; +} + +/** + * https://discord.com/developers/docs/topics/gateway-events#identify-identify-connection-properties + */ +export interface GatewayIdentifyProperties { + os?: string; + os_atch?: string; + browser?: string; + device?: string; + $os?: string; + $browser?: string; + $device?: string; + browser_user_agent?: string; + browser_version?: string; + os_version?: string; + referrer?: string; + referring_domain?: string; + referrer_current?: string; + referring_domain_current?: string; + release_channel?: 'stable' | 'dev' | 'ptb' | 'canary'; + client_build_number?: number; + client_event_source?: string; + client_version?: string; + system_locale?: string; +} + +/** + * https://discord.com/developers/docs/topics/gateway-events#resume + */ +export interface GatewayResume { + op: GatewayOpcodes.Resume; + d: GatewayResumeData; +} + +/** + * https://discord.com/developers/docs/topics/gateway-events#resume + */ +export interface GatewayResumeData { + /** + * Session token + */ + token: string; + /** + * Session id + */ + session_id: string; + /** + * Last sequence number received + */ + seq: number; +} + +/** + * https://discord.com/developers/docs/topics/gateway-events#request-guild-members + */ +export interface GatewayRequestGuildMembers { + op: GatewayOpcodes.RequestGuildMembers; + d: GatewayRequestGuildMembersData; +} + +export interface GatewayRequestGuildMembersDataBase { + /** + * ID of the guild to get members for + */ + guild_id: Snowflake; + /** + * Used to specify if we want the presences of the matched members + */ + presences?: boolean; + /** + * Nonce to identify the Guild Members Chunk response + * + * Nonce can only be up to 32 bytes. If you send an invalid nonce it will be ignored and the reply member_chunk(s) will not have a `nonce` set. + * + * See https://discord.com/developers/docs/topics/gateway-events#guild-members-chunk + */ + nonce?: string; +} + +export interface GatewayLazyRequest { + op: GatewayOpcodes.LazyRequest; + d: GatewayLazyRequestData; +} + +export interface GatewayLazyRequestData { + guild_id: string; + channels?: Record; + activities?: boolean; + threads?: boolean; + typing?: boolean; + members?: string[]; + thread_member_lists?: unknown[]; +} + +export interface GatewayRequestGuildMembersDataWithUserIds extends GatewayRequestGuildMembersDataBase { + /** + * Used to specify which users you wish to fetch + */ + user_ids: Snowflake | Snowflake[]; +} + +export interface GatewayRequestGuildMembersDataWithQuery extends GatewayRequestGuildMembersDataBase { + /** + * String that username starts with, or an empty string to return all members + */ + query: string; + /** + * Maximum number of members to send matching the `query`; + * a limit of `0` can be used with an empty string `query` to return all members + */ + limit: number; +} + +/** + * https://discord.com/developers/docs/topics/gateway-events#request-guild-members + */ +export type GatewayRequestGuildMembersData = + | GatewayRequestGuildMembersDataWithUserIds + | GatewayRequestGuildMembersDataWithQuery; + +/** + * https://discord.com/developers/docs/topics/gateway-events#update-voice-state + */ +export interface GatewayVoiceStateUpdate { + op: GatewayOpcodes.VoiceStateUpdate; + d: GatewayVoiceStateUpdateData; +} + +/** + * https://discord.com/developers/docs/topics/gateway-events#update-voice-state + */ +export interface GatewayVoiceStateUpdateData { + /** + * ID of the guild + */ + guild_id: Snowflake; + /** + * ID of the voice channel client wants to join (`null` if disconnecting) + */ + channel_id: Snowflake | null; + /** + * Is the client muted + */ + self_mute: boolean; + /** + * Is the client deafened + */ + self_deaf: boolean; +} + +/** + * https://discord.com/developers/docs/topics/gateway-events#update-presence + */ +export interface GatewayUpdatePresence { + op: GatewayOpcodes.PresenceUpdate; + d: GatewayPresenceUpdateData; +} + +/** + * https://discord.com/developers/docs/topics/gateway-events#update-presence-gateway-presence-update-structure + */ +export interface GatewayPresenceUpdateData { + /** + * Unix time (in milliseconds) of when the client went idle, or `null` if the client is not idle + */ + since: number | null; + /** + * The user's activities + * + * See https://discord.com/developers/docs/topics/gateway-events#activity-object + */ + activities: GatewayActivityUpdateData[]; + /** + * The user's new status + * + * See https://discord.com/developers/docs/topics/gateway-events#update-presence-status-types + */ + status: PresenceUpdateStatus; + /** + * Whether or not the client is afk + */ + afk: boolean; +} + +/** + * https://discord.com/developers/docs/topics/gateway-events#activity-object-activity-structure + */ +export type GatewayActivityUpdateData = Pick; + +// #endregion Sendable Payloads + +// #region Shared +interface BasePayload { + /** + * Opcode for the payload + */ + op: GatewayOpcodes; + /** + * Event data + */ + d?: unknown; + /** + * Sequence number, used for resuming sessions and heartbeats + */ + s: number; + /** + * The event name for this payload + */ + t?: string; +} + +type NonDispatchPayload = Omit & { + t: null; + s: null; +}; + +interface DataPayload extends BasePayload { + op: GatewayOpcodes.Dispatch; + t: Event; + d: D; +} + +type ReactionData = DataPayload< + E, + Omit< + { + /** + * The id of the user + */ + user_id: Snowflake; + /** + * The id of the channel + */ + channel_id: Snowflake; + /** + * The id of the message + */ + message_id: Snowflake; + /** + * The id of the guild + */ + guild_id?: Snowflake; + /** + * The member who reacted if this happened in a guild + * + * See https://discord.com/developers/docs/resources/guild#guild-member-object + */ + member?: APIGuildMember; + /** + * The emoji used to react + * + * See https://discord.com/developers/docs/resources/emoji#emoji-object + */ + emoji: APIEmoji; + }, + O + > +>; + +interface MessageReactionRemoveData { + /** + * The id of the channel + */ + channel_id: Snowflake; + /** + * The id of the message + */ + message_id: Snowflake; + /** + * The id of the guild + */ + guild_id?: Snowflake; +} +// #endregion Shared \ No newline at end of file