From 274b5972dde6df06b2d65efd0d1580a0b34d240f Mon Sep 17 00:00:00 2001 From: Fleny Date: Sun, 24 Aug 2025 23:14:14 +0200 Subject: [PATCH] feat(types,bot): Add RATE_LIMITED & RESUMED handler & event (#4391) Co-authored-by: Link --- packages/bot/src/events.ts | 4 +- packages/bot/src/handlers.ts | 154 +++++++++--------- .../bot/src/handlers/misc/RATE_LIMITED.ts | 9 + packages/bot/src/handlers/misc/RESUMED.ts | 8 + packages/bot/src/handlers/misc/index.ts | 2 + packages/types/src/discord/gateway.ts | 25 +++ 6 files changed, 126 insertions(+), 76 deletions(-) create mode 100644 packages/bot/src/handlers/misc/RATE_LIMITED.ts create mode 100644 packages/bot/src/handlers/misc/RESUMED.ts diff --git a/packages/bot/src/events.ts b/packages/bot/src/events.ts index 73b937b34..4707af65b 100644 --- a/packages/bot/src/events.ts +++ b/packages/bot/src/events.ts @@ -1,4 +1,4 @@ -import type { DiscordGatewayPayload, DiscordReady, DiscordVoiceChannelEffectAnimationType } from '@discordeno/types' +import type { DiscordGatewayPayload, DiscordRateLimited, DiscordReady, DiscordVoiceChannelEffectAnimationType } from '@discordeno/types' import type { Collection } from '@discordeno/utils' import type { DesiredPropertiesBehavior, SetupDesiredProps, TransformersDesiredProperties } from './desiredProperties.js' import type { @@ -62,6 +62,8 @@ export type EventHandlers unknown + resumed: (shardId: number) => unknown + rateLimited: (data: DiscordRateLimited, shardId: number) => unknown interactionCreate: (interaction: SetupDesiredProps) => unknown integrationCreate: (integration: Integration) => unknown integrationDelete: (payload: { id: bigint; guildId: bigint; applicationId?: bigint }) => unknown diff --git a/packages/bot/src/handlers.ts b/packages/bot/src/handlers.ts index 9680fcf34..8faa31f20 100644 --- a/packages/bot/src/handlers.ts +++ b/packages/bot/src/handlers.ts @@ -4,82 +4,86 @@ import type { Bot, DesiredPropertiesBehavior, DiscordGatewayPayload, GatewayDisp export function createBotGatewayHandlers( options: Partial>, ): GatewayHandlers { + const _options = options as Partial> + return { - APPLICATION_COMMAND_PERMISSIONS_UPDATE: options.APPLICATION_COMMAND_PERMISSIONS_UPDATE ?? handlers.handleApplicationCommandPermissionsUpdate, - AUTO_MODERATION_ACTION_EXECUTION: options.AUTO_MODERATION_ACTION_EXECUTION ?? handlers.handleAutoModerationActionExecution, - AUTO_MODERATION_RULE_CREATE: options.AUTO_MODERATION_RULE_CREATE ?? handlers.handleAutoModerationRuleCreate, - AUTO_MODERATION_RULE_DELETE: options.AUTO_MODERATION_RULE_DELETE ?? handlers.handleAutoModerationRuleDelete, - AUTO_MODERATION_RULE_UPDATE: options.AUTO_MODERATION_RULE_UPDATE ?? handlers.handleAutoModerationRuleUpdate, - CHANNEL_CREATE: options.CHANNEL_CREATE ?? handlers.handleChannelCreate, - CHANNEL_DELETE: options.CHANNEL_DELETE ?? handlers.handleChannelDelete, - CHANNEL_PINS_UPDATE: options.CHANNEL_PINS_UPDATE ?? handlers.handleChannelPinsUpdate, - CHANNEL_UPDATE: options.CHANNEL_UPDATE ?? handlers.handleChannelUpdate, - GUILD_AUDIT_LOG_ENTRY_CREATE: options.GUILD_AUDIT_LOG_ENTRY_CREATE ?? handlers.handleGuildAuditLogEntryCreate, - GUILD_BAN_ADD: options.GUILD_BAN_ADD ?? handlers.handleGuildBanAdd, - GUILD_BAN_REMOVE: options.GUILD_BAN_REMOVE ?? handlers.handleGuildBanRemove, - GUILD_CREATE: options.GUILD_CREATE ?? handlers.handleGuildCreate, - GUILD_DELETE: options.GUILD_DELETE ?? handlers.handleGuildDelete, - GUILD_EMOJIS_UPDATE: options.GUILD_EMOJIS_UPDATE ?? handlers.handleGuildEmojisUpdate, - GUILD_INTEGRATIONS_UPDATE: options.GUILD_INTEGRATIONS_UPDATE ?? handlers.handleGuildIntegrationsUpdate, - GUILD_MEMBER_ADD: options.GUILD_MEMBER_ADD ?? handlers.handleGuildMemberAdd, - GUILD_MEMBER_REMOVE: options.GUILD_MEMBER_REMOVE ?? handlers.handleGuildMemberRemove, - GUILD_MEMBER_UPDATE: options.GUILD_MEMBER_UPDATE ?? handlers.handleGuildMemberUpdate, - GUILD_MEMBERS_CHUNK: options.GUILD_MEMBERS_CHUNK ?? handlers.handleGuildMembersChunk, - GUILD_ROLE_CREATE: options.GUILD_ROLE_CREATE ?? handlers.handleGuildRoleCreate, - GUILD_ROLE_DELETE: options.GUILD_ROLE_DELETE ?? handlers.handleGuildRoleDelete, - GUILD_ROLE_UPDATE: options.GUILD_ROLE_UPDATE ?? handlers.handleGuildRoleUpdate, - GUILD_SCHEDULED_EVENT_CREATE: options.GUILD_SCHEDULED_EVENT_CREATE ?? handlers.handleGuildScheduledEventCreate, - GUILD_SCHEDULED_EVENT_DELETE: options.GUILD_SCHEDULED_EVENT_DELETE ?? handlers.handleGuildScheduledEventDelete, - GUILD_SCHEDULED_EVENT_UPDATE: options.GUILD_SCHEDULED_EVENT_UPDATE ?? handlers.handleGuildScheduledEventUpdate, - GUILD_SCHEDULED_EVENT_USER_ADD: options.GUILD_SCHEDULED_EVENT_USER_ADD ?? handlers.handleGuildScheduledEventUserAdd, - GUILD_SCHEDULED_EVENT_USER_REMOVE: options.GUILD_SCHEDULED_EVENT_USER_REMOVE ?? handlers.handleGuildScheduledEventUserRemove, - GUILD_STICKERS_UPDATE: options.GUILD_STICKERS_UPDATE ?? handlers.handleGuildStickersUpdate, - GUILD_UPDATE: options.GUILD_UPDATE ?? handlers.handleGuildUpdate, - INTERACTION_CREATE: options.INTERACTION_CREATE ?? handlers.handleInteractionCreate, - INTEGRATION_CREATE: options.INTEGRATION_CREATE ?? handlers.handleIntegrationCreate, - INTEGRATION_UPDATE: options.INTEGRATION_UPDATE ?? handlers.handleIntegrationUpdate, - INTEGRATION_DELETE: options.INTEGRATION_DELETE ?? handlers.handleIntegrationDelete, - INVITE_CREATE: options.INVITE_CREATE ?? handlers.handleInviteCreate, - INVITE_DELETE: options.INVITE_DELETE ?? handlers.handleInviteDelete, - MESSAGE_CREATE: options.MESSAGE_CREATE ?? handlers.handleMessageCreate, - MESSAGE_DELETE_BULK: options.MESSAGE_DELETE_BULK ?? handlers.handleMessageDeleteBulk, - MESSAGE_DELETE: options.MESSAGE_DELETE ?? handlers.handleMessageDelete, - MESSAGE_REACTION_ADD: options.MESSAGE_REACTION_ADD ?? handlers.handleMessageReactionAdd, - MESSAGE_REACTION_REMOVE_ALL: options.MESSAGE_REACTION_REMOVE_ALL ?? handlers.handleMessageReactionRemoveAll, - MESSAGE_REACTION_REMOVE_EMOJI: options.MESSAGE_REACTION_REMOVE_EMOJI ?? handlers.handleMessageReactionRemoveEmoji, - MESSAGE_REACTION_REMOVE: options.MESSAGE_REACTION_REMOVE ?? handlers.handleMessageReactionRemove, - MESSAGE_UPDATE: options.MESSAGE_UPDATE ?? handlers.handleMessageUpdate, - PRESENCE_UPDATE: options.PRESENCE_UPDATE ?? handlers.handlePresenceUpdate, - READY: options.READY ?? handlers.handleReady, - STAGE_INSTANCE_CREATE: options.STAGE_INSTANCE_CREATE ?? handlers.handleStageInstanceCreate, - STAGE_INSTANCE_DELETE: options.STAGE_INSTANCE_DELETE ?? handlers.handleStageInstanceDelete, - STAGE_INSTANCE_UPDATE: options.STAGE_INSTANCE_UPDATE ?? handlers.handleStageInstanceUpdate, - THREAD_CREATE: options.THREAD_CREATE ?? handlers.handleThreadCreate, - THREAD_DELETE: options.THREAD_DELETE ?? handlers.handleThreadDelete, - THREAD_UPDATE: options.THREAD_UPDATE ?? handlers.handleThreadUpdate, - THREAD_LIST_SYNC: options.THREAD_LIST_SYNC ?? handlers.handleThreadListSync, - THREAD_MEMBER_UPDATE: options.THREAD_MEMBERS_UPDATE ?? handlers.handleThreadMembersUpdate, - THREAD_MEMBERS_UPDATE: options.THREAD_MEMBERS_UPDATE ?? handlers.handleThreadMembersUpdate, - TYPING_START: options.TYPING_START ?? handlers.handleTypingStart, - USER_UPDATE: options.USER_UPDATE ?? handlers.handleUserUpdate, - VOICE_CHANNEL_EFFECT_SEND: options.VOICE_CHANNEL_EFFECT_SEND ?? handlers.handleVoiceChannelEffectSend, - VOICE_SERVER_UPDATE: options.VOICE_SERVER_UPDATE ?? handlers.handleVoiceServerUpdate, - VOICE_STATE_UPDATE: options.VOICE_STATE_UPDATE ?? handlers.handleVoiceStateUpdate, - WEBHOOKS_UPDATE: options.WEBHOOKS_UPDATE ?? handlers.handleWebhooksUpdate, - ENTITLEMENT_CREATE: options.ENTITLEMENT_CREATE ?? handlers.handleEntitlementCreate, - ENTITLEMENT_UPDATE: options.ENTITLEMENT_UPDATE ?? handlers.handleEntitlementUpdate, - ENTITLEMENT_DELETE: options.ENTITLEMENT_DELETE ?? handlers.handleEntitlementDelete, - MESSAGE_POLL_VOTE_ADD: options.MESSAGE_POLL_VOTE_ADD ?? handlers.handleMessagePollVoteAdd, - MESSAGE_POLL_VOTE_REMOVE: options.MESSAGE_POLL_VOTE_REMOVE ?? handlers.handleMessagePollVoteRemove, - SUBSCRIPTION_CREATE: options.SUBSCRIPTION_CREATE ?? handlers.handleSubscriptionCreate, - SUBSCRIPTION_UPDATE: options.SUBSCRIPTION_UPDATE ?? handlers.handleSubscriptionUpdate, - SUBSCRIPTION_DELETE: options.SUBSCRIPTION_DELETE ?? handlers.handleSubscriptionDelete, - GUILD_SOUNDBOARD_SOUND_CREATE: options.GUILD_SOUNDBOARD_SOUND_CREATE ?? handlers.handleGuildSoundboardSoundCreate, - GUILD_SOUNDBOARD_SOUND_DELETE: options.GUILD_SOUNDBOARD_SOUND_DELETE ?? handlers.handleGuildSoundboardSoundDelete, - GUILD_SOUNDBOARD_SOUND_UPDATE: options.GUILD_SOUNDBOARD_SOUND_UPDATE ?? handlers.handleGuildSoundboardSoundUpdate, - GUILD_SOUNDBOARD_SOUNDS_UPDATE: options.GUILD_SOUNDBOARD_SOUNDS_UPDATE ?? handlers.handleGuildSoundboardSoundsUpdate, - SOUNDBOARD_SOUNDS: options.SOUNDBOARD_SOUNDS ?? handlers.handleSoundboardSounds, - } as GatewayHandlers + APPLICATION_COMMAND_PERMISSIONS_UPDATE: _options.APPLICATION_COMMAND_PERMISSIONS_UPDATE ?? handlers.handleApplicationCommandPermissionsUpdate, + AUTO_MODERATION_ACTION_EXECUTION: _options.AUTO_MODERATION_ACTION_EXECUTION ?? handlers.handleAutoModerationActionExecution, + AUTO_MODERATION_RULE_CREATE: _options.AUTO_MODERATION_RULE_CREATE ?? handlers.handleAutoModerationRuleCreate, + AUTO_MODERATION_RULE_DELETE: _options.AUTO_MODERATION_RULE_DELETE ?? handlers.handleAutoModerationRuleDelete, + AUTO_MODERATION_RULE_UPDATE: _options.AUTO_MODERATION_RULE_UPDATE ?? handlers.handleAutoModerationRuleUpdate, + CHANNEL_CREATE: _options.CHANNEL_CREATE ?? handlers.handleChannelCreate, + CHANNEL_DELETE: _options.CHANNEL_DELETE ?? handlers.handleChannelDelete, + CHANNEL_PINS_UPDATE: _options.CHANNEL_PINS_UPDATE ?? handlers.handleChannelPinsUpdate, + CHANNEL_UPDATE: _options.CHANNEL_UPDATE ?? handlers.handleChannelUpdate, + GUILD_AUDIT_LOG_ENTRY_CREATE: _options.GUILD_AUDIT_LOG_ENTRY_CREATE ?? handlers.handleGuildAuditLogEntryCreate, + GUILD_BAN_ADD: _options.GUILD_BAN_ADD ?? handlers.handleGuildBanAdd, + GUILD_BAN_REMOVE: _options.GUILD_BAN_REMOVE ?? handlers.handleGuildBanRemove, + GUILD_CREATE: _options.GUILD_CREATE ?? handlers.handleGuildCreate, + GUILD_DELETE: _options.GUILD_DELETE ?? handlers.handleGuildDelete, + GUILD_EMOJIS_UPDATE: _options.GUILD_EMOJIS_UPDATE ?? handlers.handleGuildEmojisUpdate, + GUILD_INTEGRATIONS_UPDATE: _options.GUILD_INTEGRATIONS_UPDATE ?? handlers.handleGuildIntegrationsUpdate, + GUILD_MEMBER_ADD: _options.GUILD_MEMBER_ADD ?? handlers.handleGuildMemberAdd, + GUILD_MEMBER_REMOVE: _options.GUILD_MEMBER_REMOVE ?? handlers.handleGuildMemberRemove, + GUILD_MEMBER_UPDATE: _options.GUILD_MEMBER_UPDATE ?? handlers.handleGuildMemberUpdate, + GUILD_MEMBERS_CHUNK: _options.GUILD_MEMBERS_CHUNK ?? handlers.handleGuildMembersChunk, + GUILD_ROLE_CREATE: _options.GUILD_ROLE_CREATE ?? handlers.handleGuildRoleCreate, + GUILD_ROLE_DELETE: _options.GUILD_ROLE_DELETE ?? handlers.handleGuildRoleDelete, + GUILD_ROLE_UPDATE: _options.GUILD_ROLE_UPDATE ?? handlers.handleGuildRoleUpdate, + GUILD_SCHEDULED_EVENT_CREATE: _options.GUILD_SCHEDULED_EVENT_CREATE ?? handlers.handleGuildScheduledEventCreate, + GUILD_SCHEDULED_EVENT_DELETE: _options.GUILD_SCHEDULED_EVENT_DELETE ?? handlers.handleGuildScheduledEventDelete, + GUILD_SCHEDULED_EVENT_UPDATE: _options.GUILD_SCHEDULED_EVENT_UPDATE ?? handlers.handleGuildScheduledEventUpdate, + GUILD_SCHEDULED_EVENT_USER_ADD: _options.GUILD_SCHEDULED_EVENT_USER_ADD ?? handlers.handleGuildScheduledEventUserAdd, + GUILD_SCHEDULED_EVENT_USER_REMOVE: _options.GUILD_SCHEDULED_EVENT_USER_REMOVE ?? handlers.handleGuildScheduledEventUserRemove, + GUILD_STICKERS_UPDATE: _options.GUILD_STICKERS_UPDATE ?? handlers.handleGuildStickersUpdate, + GUILD_UPDATE: _options.GUILD_UPDATE ?? handlers.handleGuildUpdate, + INTERACTION_CREATE: _options.INTERACTION_CREATE ?? handlers.handleInteractionCreate, + INTEGRATION_CREATE: _options.INTEGRATION_CREATE ?? handlers.handleIntegrationCreate, + INTEGRATION_UPDATE: _options.INTEGRATION_UPDATE ?? handlers.handleIntegrationUpdate, + INTEGRATION_DELETE: _options.INTEGRATION_DELETE ?? handlers.handleIntegrationDelete, + INVITE_CREATE: _options.INVITE_CREATE ?? handlers.handleInviteCreate, + INVITE_DELETE: _options.INVITE_DELETE ?? handlers.handleInviteDelete, + MESSAGE_CREATE: _options.MESSAGE_CREATE ?? handlers.handleMessageCreate, + MESSAGE_DELETE_BULK: _options.MESSAGE_DELETE_BULK ?? handlers.handleMessageDeleteBulk, + MESSAGE_DELETE: _options.MESSAGE_DELETE ?? handlers.handleMessageDelete, + MESSAGE_REACTION_ADD: _options.MESSAGE_REACTION_ADD ?? handlers.handleMessageReactionAdd, + MESSAGE_REACTION_REMOVE_ALL: _options.MESSAGE_REACTION_REMOVE_ALL ?? handlers.handleMessageReactionRemoveAll, + MESSAGE_REACTION_REMOVE_EMOJI: _options.MESSAGE_REACTION_REMOVE_EMOJI ?? handlers.handleMessageReactionRemoveEmoji, + MESSAGE_REACTION_REMOVE: _options.MESSAGE_REACTION_REMOVE ?? handlers.handleMessageReactionRemove, + MESSAGE_UPDATE: _options.MESSAGE_UPDATE ?? handlers.handleMessageUpdate, + PRESENCE_UPDATE: _options.PRESENCE_UPDATE ?? handlers.handlePresenceUpdate, + READY: _options.READY ?? handlers.handleReady, + RESUMED: _options.RESUMED ?? handlers.handleResumed, + RATE_LIMITED: _options.RATE_LIMITED ?? handlers.handleRateLimited, + STAGE_INSTANCE_CREATE: _options.STAGE_INSTANCE_CREATE ?? handlers.handleStageInstanceCreate, + STAGE_INSTANCE_DELETE: _options.STAGE_INSTANCE_DELETE ?? handlers.handleStageInstanceDelete, + STAGE_INSTANCE_UPDATE: _options.STAGE_INSTANCE_UPDATE ?? handlers.handleStageInstanceUpdate, + THREAD_CREATE: _options.THREAD_CREATE ?? handlers.handleThreadCreate, + THREAD_DELETE: _options.THREAD_DELETE ?? handlers.handleThreadDelete, + THREAD_UPDATE: _options.THREAD_UPDATE ?? handlers.handleThreadUpdate, + THREAD_LIST_SYNC: _options.THREAD_LIST_SYNC ?? handlers.handleThreadListSync, + THREAD_MEMBER_UPDATE: _options.THREAD_MEMBERS_UPDATE ?? handlers.handleThreadMembersUpdate, + THREAD_MEMBERS_UPDATE: _options.THREAD_MEMBERS_UPDATE ?? handlers.handleThreadMembersUpdate, + TYPING_START: _options.TYPING_START ?? handlers.handleTypingStart, + USER_UPDATE: _options.USER_UPDATE ?? handlers.handleUserUpdate, + VOICE_CHANNEL_EFFECT_SEND: _options.VOICE_CHANNEL_EFFECT_SEND ?? handlers.handleVoiceChannelEffectSend, + VOICE_SERVER_UPDATE: _options.VOICE_SERVER_UPDATE ?? handlers.handleVoiceServerUpdate, + VOICE_STATE_UPDATE: _options.VOICE_STATE_UPDATE ?? handlers.handleVoiceStateUpdate, + WEBHOOKS_UPDATE: _options.WEBHOOKS_UPDATE ?? handlers.handleWebhooksUpdate, + ENTITLEMENT_CREATE: _options.ENTITLEMENT_CREATE ?? handlers.handleEntitlementCreate, + ENTITLEMENT_UPDATE: _options.ENTITLEMENT_UPDATE ?? handlers.handleEntitlementUpdate, + ENTITLEMENT_DELETE: _options.ENTITLEMENT_DELETE ?? handlers.handleEntitlementDelete, + MESSAGE_POLL_VOTE_ADD: _options.MESSAGE_POLL_VOTE_ADD ?? handlers.handleMessagePollVoteAdd, + MESSAGE_POLL_VOTE_REMOVE: _options.MESSAGE_POLL_VOTE_REMOVE ?? handlers.handleMessagePollVoteRemove, + SUBSCRIPTION_CREATE: _options.SUBSCRIPTION_CREATE ?? handlers.handleSubscriptionCreate, + SUBSCRIPTION_UPDATE: _options.SUBSCRIPTION_UPDATE ?? handlers.handleSubscriptionUpdate, + SUBSCRIPTION_DELETE: _options.SUBSCRIPTION_DELETE ?? handlers.handleSubscriptionDelete, + GUILD_SOUNDBOARD_SOUND_CREATE: _options.GUILD_SOUNDBOARD_SOUND_CREATE ?? handlers.handleGuildSoundboardSoundCreate, + GUILD_SOUNDBOARD_SOUND_DELETE: _options.GUILD_SOUNDBOARD_SOUND_DELETE ?? handlers.handleGuildSoundboardSoundDelete, + GUILD_SOUNDBOARD_SOUND_UPDATE: _options.GUILD_SOUNDBOARD_SOUND_UPDATE ?? handlers.handleGuildSoundboardSoundUpdate, + GUILD_SOUNDBOARD_SOUNDS_UPDATE: _options.GUILD_SOUNDBOARD_SOUNDS_UPDATE ?? handlers.handleGuildSoundboardSoundsUpdate, + SOUNDBOARD_SOUNDS: _options.SOUNDBOARD_SOUNDS ?? handlers.handleSoundboardSounds, + } satisfies GatewayHandlers as unknown as GatewayHandlers } export type GatewayHandlers = Record< diff --git a/packages/bot/src/handlers/misc/RATE_LIMITED.ts b/packages/bot/src/handlers/misc/RATE_LIMITED.ts new file mode 100644 index 000000000..6cf45e7b6 --- /dev/null +++ b/packages/bot/src/handlers/misc/RATE_LIMITED.ts @@ -0,0 +1,9 @@ +import type { DiscordGatewayPayload, DiscordRateLimited } from '@discordeno/types' +import type { Bot } from '../../index.js' + +export async function handleRateLimited(bot: Bot, data: DiscordGatewayPayload, shardId: number): Promise { + if (!bot.events.rateLimited) return + + const payload = data.d as DiscordRateLimited + bot.events.rateLimited(payload, shardId) +} diff --git a/packages/bot/src/handlers/misc/RESUMED.ts b/packages/bot/src/handlers/misc/RESUMED.ts new file mode 100644 index 000000000..49dfe802c --- /dev/null +++ b/packages/bot/src/handlers/misc/RESUMED.ts @@ -0,0 +1,8 @@ +import type { DiscordGatewayPayload } from '@discordeno/types' +import type { Bot } from '../../index.js' + +export async function handleResumed(bot: Bot, _data: DiscordGatewayPayload, shardId: number): Promise { + if (!bot.events.resumed) return + + bot.events.resumed(shardId) +} diff --git a/packages/bot/src/handlers/misc/index.ts b/packages/bot/src/handlers/misc/index.ts index 7a1c12c68..4be796b12 100644 --- a/packages/bot/src/handlers/misc/index.ts +++ b/packages/bot/src/handlers/misc/index.ts @@ -1,4 +1,6 @@ export * from './PRESENCE_UPDATE.js' +export * from './RATE_LIMITED.js' export * from './READY.js' +export * from './RESUMED.js' export * from './TYPING_START.js' export * from './USER_UPDATE.js' diff --git a/packages/types/src/discord/gateway.ts b/packages/types/src/discord/gateway.ts index 8d6bab6d8..085f6e79e 100644 --- a/packages/types/src/discord/gateway.ts +++ b/packages/types/src/discord/gateway.ts @@ -12,6 +12,7 @@ import type { DiscordIntegration, DiscordMember, DiscordMemberWithUser, DiscordU import type { DiscordScheduledEvent } from './guildScheduledEvent.js' import type { TargetTypes } from './invite.js' import type { DiscordReactionType } from './message.js' +import type { GatewayOpcodes } from './opcodes.js' import type { DiscordRole } from './permissions.js' import type { DiscordSoundboardSound } from './soundboard.js' import type { DiscordStageInstance } from './stageInstance.js' @@ -199,6 +200,7 @@ export interface DiscordSessionStartLimit { export type GatewayDispatchEventNames = | 'READY' | 'RESUMED' + | 'RATE_LIMITED' | 'APPLICATION_COMMAND_PERMISSIONS_UPDATE' | 'AUTO_MODERATION_RULE_CREATE' | 'AUTO_MODERATION_RULE_UPDATE' @@ -1061,3 +1063,26 @@ export interface DiscordPollVoteRemove { /** ID of the answer. */ answer_id: number } + +/** https://discord.com/developers/docs/events/gateway-events#rate-limited-rate-limited-fields */ +export interface DiscordRateLimited { + /** Gateway opcode of the event that was rate limited */ + opcode: GatewayOpcodes + /** The number of seconds to wait before submitting another request */ + retry_after: number + /** + * Metadata for the event that was rate limited + * + * @remarks + * This is dependent on the {@link opcode} field in this object + */ + meta: DiscordRequestGuildMemberRateLimitMetadata +} + +/** https://discord.com/developers/docs/events/gateway-events#rate-limited-request-guild-member-rate-limit-metadata-structure */ +export interface DiscordRequestGuildMemberRateLimitMetadata { + /** ID of the guild to get members for */ + guild_id: string + /** nonce to identify the Guild Members Chunk response */ + nonce?: string +}