discord.js-selfbots-v13 0.0.1-security → 3.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of discord.js-selfbots-v13 might be problematic. Click here for more details.
- package/LICENSE +674 -0
- package/README.md +127 -5
- package/package.json +101 -6
- package/src/WebSocket.js +39 -0
- package/src/client/BaseClient.js +87 -0
- package/src/client/Client.js +1154 -0
- package/src/client/WebhookClient.js +61 -0
- package/src/client/actions/Action.js +115 -0
- package/src/client/actions/ActionsManager.js +72 -0
- package/src/client/actions/ApplicationCommandPermissionsUpdate.js +34 -0
- package/src/client/actions/AutoModerationActionExecution.js +26 -0
- package/src/client/actions/AutoModerationRuleCreate.js +27 -0
- package/src/client/actions/AutoModerationRuleDelete.js +31 -0
- package/src/client/actions/AutoModerationRuleUpdate.js +29 -0
- package/src/client/actions/ChannelCreate.js +23 -0
- package/src/client/actions/ChannelDelete.js +39 -0
- package/src/client/actions/ChannelUpdate.js +34 -0
- package/src/client/actions/GuildAuditLogEntryCreate.js +29 -0
- package/src/client/actions/GuildBanAdd.js +20 -0
- package/src/client/actions/GuildBanRemove.js +25 -0
- package/src/client/actions/GuildChannelsPositionUpdate.js +21 -0
- package/src/client/actions/GuildDelete.js +65 -0
- package/src/client/actions/GuildEmojiCreate.js +20 -0
- package/src/client/actions/GuildEmojiDelete.js +21 -0
- package/src/client/actions/GuildEmojiUpdate.js +20 -0
- package/src/client/actions/GuildEmojisUpdate.js +34 -0
- package/src/client/actions/GuildIntegrationsUpdate.js +19 -0
- package/src/client/actions/GuildMemberRemove.js +33 -0
- package/src/client/actions/GuildMemberUpdate.js +44 -0
- package/src/client/actions/GuildRoleCreate.js +25 -0
- package/src/client/actions/GuildRoleDelete.js +31 -0
- package/src/client/actions/GuildRoleUpdate.js +39 -0
- package/src/client/actions/GuildRolesPositionUpdate.js +21 -0
- package/src/client/actions/GuildScheduledEventCreate.js +27 -0
- package/src/client/actions/GuildScheduledEventDelete.js +31 -0
- package/src/client/actions/GuildScheduledEventUpdate.js +30 -0
- package/src/client/actions/GuildScheduledEventUserAdd.js +32 -0
- package/src/client/actions/GuildScheduledEventUserRemove.js +32 -0
- package/src/client/actions/GuildStickerCreate.js +20 -0
- package/src/client/actions/GuildStickerDelete.js +21 -0
- package/src/client/actions/GuildStickerUpdate.js +20 -0
- package/src/client/actions/GuildStickersUpdate.js +34 -0
- package/src/client/actions/GuildUpdate.js +33 -0
- package/src/client/actions/InteractionCreate.js +115 -0
- package/src/client/actions/InviteCreate.js +28 -0
- package/src/client/actions/InviteDelete.js +30 -0
- package/src/client/actions/MessageCreate.js +50 -0
- package/src/client/actions/MessageDelete.js +32 -0
- package/src/client/actions/MessageDeleteBulk.js +46 -0
- package/src/client/actions/MessageReactionAdd.js +56 -0
- package/src/client/actions/MessageReactionRemove.js +45 -0
- package/src/client/actions/MessageReactionRemoveAll.js +33 -0
- package/src/client/actions/MessageReactionRemoveEmoji.js +28 -0
- package/src/client/actions/MessageUpdate.js +26 -0
- package/src/client/actions/PresenceUpdate.js +45 -0
- package/src/client/actions/StageInstanceCreate.js +28 -0
- package/src/client/actions/StageInstanceDelete.js +33 -0
- package/src/client/actions/StageInstanceUpdate.js +30 -0
- package/src/client/actions/ThreadCreate.js +24 -0
- package/src/client/actions/ThreadDelete.js +32 -0
- package/src/client/actions/ThreadListSync.js +59 -0
- package/src/client/actions/ThreadMemberUpdate.js +30 -0
- package/src/client/actions/ThreadMembersUpdate.js +34 -0
- package/src/client/actions/TypingStart.js +29 -0
- package/src/client/actions/UserUpdate.js +35 -0
- package/src/client/actions/VoiceStateUpdate.js +57 -0
- package/src/client/actions/WebhooksUpdate.js +20 -0
- package/src/client/voice/ClientVoiceManager.js +51 -0
- package/src/client/websocket/WebSocketManager.js +412 -0
- package/src/client/websocket/WebSocketShard.js +908 -0
- package/src/client/websocket/handlers/APPLICATION_COMMAND_AUTOCOMPLETE_RESPONSE.js +23 -0
- package/src/client/websocket/handlers/APPLICATION_COMMAND_CREATE.js +18 -0
- package/src/client/websocket/handlers/APPLICATION_COMMAND_DELETE.js +20 -0
- package/src/client/websocket/handlers/APPLICATION_COMMAND_PERMISSIONS_UPDATE.js +5 -0
- package/src/client/websocket/handlers/APPLICATION_COMMAND_UPDATE.js +20 -0
- package/src/client/websocket/handlers/AUTO_MODERATION_ACTION_EXECUTION.js +5 -0
- package/src/client/websocket/handlers/AUTO_MODERATION_RULE_CREATE.js +5 -0
- package/src/client/websocket/handlers/AUTO_MODERATION_RULE_DELETE.js +5 -0
- package/src/client/websocket/handlers/AUTO_MODERATION_RULE_UPDATE.js +5 -0
- package/src/client/websocket/handlers/CALL_CREATE.js +14 -0
- package/src/client/websocket/handlers/CALL_DELETE.js +11 -0
- package/src/client/websocket/handlers/CALL_UPDATE.js +11 -0
- package/src/client/websocket/handlers/CHANNEL_CREATE.js +5 -0
- package/src/client/websocket/handlers/CHANNEL_DELETE.js +5 -0
- package/src/client/websocket/handlers/CHANNEL_PINS_UPDATE.js +22 -0
- package/src/client/websocket/handlers/CHANNEL_RECIPIENT_ADD.js +16 -0
- package/src/client/websocket/handlers/CHANNEL_RECIPIENT_REMOVE.js +16 -0
- package/src/client/websocket/handlers/CHANNEL_UPDATE.js +16 -0
- package/src/client/websocket/handlers/GUILD_APPLICATION_COMMANDS_UPDATE.js +11 -0
- package/src/client/websocket/handlers/GUILD_AUDIT_LOG_ENTRY_CREATE.js +5 -0
- package/src/client/websocket/handlers/GUILD_BAN_ADD.js +5 -0
- package/src/client/websocket/handlers/GUILD_BAN_REMOVE.js +5 -0
- package/src/client/websocket/handlers/GUILD_CREATE.js +46 -0
- package/src/client/websocket/handlers/GUILD_DELETE.js +5 -0
- package/src/client/websocket/handlers/GUILD_EMOJIS_UPDATE.js +5 -0
- package/src/client/websocket/handlers/GUILD_INTEGRATIONS_UPDATE.js +5 -0
- package/src/client/websocket/handlers/GUILD_MEMBERS_CHUNK.js +39 -0
- package/src/client/websocket/handlers/GUILD_MEMBER_ADD.js +20 -0
- package/src/client/websocket/handlers/GUILD_MEMBER_LIST_UPDATE.js +55 -0
- package/src/client/websocket/handlers/GUILD_MEMBER_REMOVE.js +5 -0
- package/src/client/websocket/handlers/GUILD_MEMBER_UPDATE.js +5 -0
- package/src/client/websocket/handlers/GUILD_ROLE_CREATE.js +5 -0
- package/src/client/websocket/handlers/GUILD_ROLE_DELETE.js +5 -0
- package/src/client/websocket/handlers/GUILD_ROLE_UPDATE.js +5 -0
- package/src/client/websocket/handlers/GUILD_SCHEDULED_EVENT_CREATE.js +5 -0
- package/src/client/websocket/handlers/GUILD_SCHEDULED_EVENT_DELETE.js +5 -0
- package/src/client/websocket/handlers/GUILD_SCHEDULED_EVENT_UPDATE.js +5 -0
- package/src/client/websocket/handlers/GUILD_SCHEDULED_EVENT_USER_ADD.js +5 -0
- package/src/client/websocket/handlers/GUILD_SCHEDULED_EVENT_USER_REMOVE.js +5 -0
- package/src/client/websocket/handlers/GUILD_STICKERS_UPDATE.js +5 -0
- package/src/client/websocket/handlers/GUILD_UPDATE.js +5 -0
- package/src/client/websocket/handlers/INTERACTION_CREATE.js +16 -0
- package/src/client/websocket/handlers/INTERACTION_FAILURE.js +18 -0
- package/src/client/websocket/handlers/INTERACTION_MODAL_CREATE.js +11 -0
- package/src/client/websocket/handlers/INTERACTION_SUCCESS.js +30 -0
- package/src/client/websocket/handlers/INVITE_CREATE.js +5 -0
- package/src/client/websocket/handlers/INVITE_DELETE.js +5 -0
- package/src/client/websocket/handlers/MESSAGE_ACK.js +16 -0
- package/src/client/websocket/handlers/MESSAGE_CREATE.js +5 -0
- package/src/client/websocket/handlers/MESSAGE_DELETE.js +5 -0
- package/src/client/websocket/handlers/MESSAGE_DELETE_BULK.js +5 -0
- package/src/client/websocket/handlers/MESSAGE_REACTION_ADD.js +5 -0
- package/src/client/websocket/handlers/MESSAGE_REACTION_REMOVE.js +5 -0
- package/src/client/websocket/handlers/MESSAGE_REACTION_REMOVE_ALL.js +5 -0
- package/src/client/websocket/handlers/MESSAGE_REACTION_REMOVE_EMOJI.js +5 -0
- package/src/client/websocket/handlers/MESSAGE_UPDATE.js +16 -0
- package/src/client/websocket/handlers/PRESENCE_UPDATE.js +5 -0
- package/src/client/websocket/handlers/READY.js +172 -0
- package/src/client/websocket/handlers/RELATIONSHIP_ADD.js +17 -0
- package/src/client/websocket/handlers/RELATIONSHIP_REMOVE.js +15 -0
- package/src/client/websocket/handlers/RELATIONSHIP_UPDATE.js +18 -0
- package/src/client/websocket/handlers/RESUMED.js +14 -0
- package/src/client/websocket/handlers/STAGE_INSTANCE_CREATE.js +5 -0
- package/src/client/websocket/handlers/STAGE_INSTANCE_DELETE.js +5 -0
- package/src/client/websocket/handlers/STAGE_INSTANCE_UPDATE.js +5 -0
- package/src/client/websocket/handlers/THREAD_CREATE.js +5 -0
- package/src/client/websocket/handlers/THREAD_DELETE.js +5 -0
- package/src/client/websocket/handlers/THREAD_LIST_SYNC.js +5 -0
- package/src/client/websocket/handlers/THREAD_MEMBERS_UPDATE.js +5 -0
- package/src/client/websocket/handlers/THREAD_MEMBER_UPDATE.js +5 -0
- package/src/client/websocket/handlers/THREAD_UPDATE.js +16 -0
- package/src/client/websocket/handlers/TYPING_START.js +5 -0
- package/src/client/websocket/handlers/USER_GUILD_SETTINGS_UPDATE.js +12 -0
- package/src/client/websocket/handlers/USER_NOTE_UPDATE.js +5 -0
- package/src/client/websocket/handlers/USER_SETTINGS_UPDATE.js +9 -0
- package/src/client/websocket/handlers/USER_UPDATE.js +5 -0
- package/src/client/websocket/handlers/VOICE_SERVER_UPDATE.js +6 -0
- package/src/client/websocket/handlers/VOICE_STATE_UPDATE.js +5 -0
- package/src/client/websocket/handlers/WEBHOOKS_UPDATE.js +5 -0
- package/src/client/websocket/handlers/index.js +86 -0
- package/src/errors/DJSError.js +61 -0
- package/src/errors/Messages.js +227 -0
- package/src/errors/index.js +4 -0
- package/src/index.js +190 -0
- package/src/main.js +1 -0
- package/src/managers/ApplicationCommandManager.js +267 -0
- package/src/managers/ApplicationCommandPermissionsManager.js +425 -0
- package/src/managers/AutoModerationRuleManager.js +296 -0
- package/src/managers/BaseGuildEmojiManager.js +80 -0
- package/src/managers/BaseManager.js +19 -0
- package/src/managers/BillingManager.js +66 -0
- package/src/managers/CachedManager.js +71 -0
- package/src/managers/ChannelManager.js +139 -0
- package/src/managers/ClientUserSettingManager.js +490 -0
- package/src/managers/DataManager.js +61 -0
- package/src/managers/DeveloperPortalManager.js +104 -0
- package/src/managers/GuildApplicationCommandManager.js +28 -0
- package/src/managers/GuildBanManager.js +204 -0
- package/src/managers/GuildChannelManager.js +502 -0
- package/src/managers/GuildEmojiManager.js +171 -0
- package/src/managers/GuildEmojiRoleManager.js +118 -0
- package/src/managers/GuildFolderManager.js +24 -0
- package/src/managers/GuildForumThreadManager.js +114 -0
- package/src/managers/GuildInviteManager.js +213 -0
- package/src/managers/GuildManager.js +304 -0
- package/src/managers/GuildMemberManager.js +724 -0
- package/src/managers/GuildMemberRoleManager.js +191 -0
- package/src/managers/GuildScheduledEventManager.js +296 -0
- package/src/managers/GuildSettingManager.js +148 -0
- package/src/managers/GuildStickerManager.js +179 -0
- package/src/managers/GuildTextThreadManager.js +98 -0
- package/src/managers/InteractionManager.js +39 -0
- package/src/managers/MessageManager.js +393 -0
- package/src/managers/PermissionOverwriteManager.js +166 -0
- package/src/managers/PresenceManager.js +58 -0
- package/src/managers/ReactionManager.js +67 -0
- package/src/managers/ReactionUserManager.js +71 -0
- package/src/managers/RelationshipManager.js +258 -0
- package/src/managers/RoleManager.js +352 -0
- package/src/managers/SessionManager.js +57 -0
- package/src/managers/StageInstanceManager.js +162 -0
- package/src/managers/ThreadManager.js +207 -0
- package/src/managers/ThreadMemberManager.js +186 -0
- package/src/managers/UserManager.js +150 -0
- package/src/managers/VoiceStateManager.js +37 -0
- package/src/rest/APIRequest.js +136 -0
- package/src/rest/APIRouter.js +53 -0
- package/src/rest/CaptchaSolver.js +78 -0
- package/src/rest/DiscordAPIError.js +103 -0
- package/src/rest/HTTPError.js +62 -0
- package/src/rest/RESTManager.js +81 -0
- package/src/rest/RateLimitError.js +55 -0
- package/src/rest/RequestHandler.js +446 -0
- package/src/sharding/Shard.js +443 -0
- package/src/sharding/ShardClientUtil.js +275 -0
- package/src/sharding/ShardingManager.js +318 -0
- package/src/structures/AnonymousGuild.js +98 -0
- package/src/structures/ApplicationCommand.js +1028 -0
- package/src/structures/ApplicationRoleConnectionMetadata.js +45 -0
- package/src/structures/AutoModerationActionExecution.js +89 -0
- package/src/structures/AutoModerationRule.js +294 -0
- package/src/structures/AutocompleteInteraction.js +106 -0
- package/src/structures/Base.js +43 -0
- package/src/structures/BaseCommandInteraction.js +211 -0
- package/src/structures/BaseGuild.js +116 -0
- package/src/structures/BaseGuildEmoji.js +56 -0
- package/src/structures/BaseGuildTextChannel.js +193 -0
- package/src/structures/BaseGuildVoiceChannel.js +243 -0
- package/src/structures/BaseMessageComponent.js +114 -0
- package/src/structures/ButtonInteraction.js +11 -0
- package/src/structures/Call.js +58 -0
- package/src/structures/CategoryChannel.js +83 -0
- package/src/structures/Channel.js +271 -0
- package/src/structures/ClientApplication.js +204 -0
- package/src/structures/ClientPresence.js +84 -0
- package/src/structures/ClientUser.js +624 -0
- package/src/structures/CommandInteraction.js +41 -0
- package/src/structures/CommandInteractionOptionResolver.js +276 -0
- package/src/structures/ContextMenuInteraction.js +65 -0
- package/src/structures/DMChannel.js +280 -0
- package/src/structures/DeveloperPortalApplication.js +520 -0
- package/src/structures/DirectoryChannel.js +20 -0
- package/src/structures/Emoji.js +148 -0
- package/src/structures/ForumChannel.js +271 -0
- package/src/structures/Guild.js +1744 -0
- package/src/structures/GuildAuditLogs.js +734 -0
- package/src/structures/GuildBan.js +59 -0
- package/src/structures/GuildBoost.js +108 -0
- package/src/structures/GuildChannel.js +454 -0
- package/src/structures/GuildEmoji.js +161 -0
- package/src/structures/GuildFolder.js +75 -0
- package/src/structures/GuildMember.js +686 -0
- package/src/structures/GuildPreview.js +191 -0
- package/src/structures/GuildPreviewEmoji.js +27 -0
- package/src/structures/GuildScheduledEvent.js +441 -0
- package/src/structures/GuildTemplate.js +236 -0
- package/src/structures/Integration.js +188 -0
- package/src/structures/IntegrationApplication.js +96 -0
- package/src/structures/Interaction.js +351 -0
- package/src/structures/InteractionCollector.js +248 -0
- package/src/structures/InteractionResponse.js +114 -0
- package/src/structures/InteractionWebhook.js +43 -0
- package/src/structures/Invite.js +375 -0
- package/src/structures/InviteGuild.js +23 -0
- package/src/structures/InviteStageInstance.js +86 -0
- package/src/structures/Message.js +1188 -0
- package/src/structures/MessageActionRow.js +103 -0
- package/src/structures/MessageAttachment.js +193 -0
- package/src/structures/MessageButton.js +231 -0
- package/src/structures/MessageCollector.js +146 -0
- package/src/structures/MessageComponentInteraction.js +120 -0
- package/src/structures/MessageContextMenuInteraction.js +20 -0
- package/src/structures/MessageEmbed.js +586 -0
- package/src/structures/MessageMentions.js +272 -0
- package/src/structures/MessagePayload.js +358 -0
- package/src/structures/MessageReaction.js +171 -0
- package/src/structures/MessageSelectMenu.js +391 -0
- package/src/structures/Modal.js +279 -0
- package/src/structures/ModalSubmitFieldsResolver.js +53 -0
- package/src/structures/ModalSubmitInteraction.js +119 -0
- package/src/structures/NewsChannel.js +32 -0
- package/src/structures/OAuth2Guild.js +28 -0
- package/src/structures/PartialGroupDMChannel.js +430 -0
- package/src/structures/PermissionOverwrites.js +196 -0
- package/src/structures/Presence.js +441 -0
- package/src/structures/ReactionCollector.js +229 -0
- package/src/structures/ReactionEmoji.js +31 -0
- package/src/structures/RichPresence.js +722 -0
- package/src/structures/Role.js +515 -0
- package/src/structures/SelectMenuInteraction.js +170 -0
- package/src/structures/Session.js +81 -0
- package/src/structures/StageChannel.js +104 -0
- package/src/structures/StageInstance.js +208 -0
- package/src/structures/Sticker.js +310 -0
- package/src/structures/StickerPack.js +95 -0
- package/src/structures/StoreChannel.js +56 -0
- package/src/structures/Team.js +167 -0
- package/src/structures/TeamMember.js +71 -0
- package/src/structures/TextChannel.js +33 -0
- package/src/structures/TextInputComponent.js +201 -0
- package/src/structures/ThreadChannel.js +626 -0
- package/src/structures/ThreadMember.js +105 -0
- package/src/structures/Typing.js +74 -0
- package/src/structures/User.js +697 -0
- package/src/structures/UserContextMenuInteraction.js +29 -0
- package/src/structures/VoiceChannel.js +110 -0
- package/src/structures/VoiceRegion.js +53 -0
- package/src/structures/VoiceState.js +306 -0
- package/src/structures/WebEmbed.js +401 -0
- package/src/structures/Webhook.js +461 -0
- package/src/structures/WelcomeChannel.js +60 -0
- package/src/structures/WelcomeScreen.js +48 -0
- package/src/structures/Widget.js +87 -0
- package/src/structures/WidgetMember.js +99 -0
- package/src/structures/interfaces/Application.js +190 -0
- package/src/structures/interfaces/Collector.js +300 -0
- package/src/structures/interfaces/InteractionResponses.js +313 -0
- package/src/structures/interfaces/TextBasedChannel.js +566 -0
- package/src/util/ActivityFlags.js +44 -0
- package/src/util/ApplicationFlags.js +74 -0
- package/src/util/BitField.js +170 -0
- package/src/util/ChannelFlags.js +45 -0
- package/src/util/Constants.js +1917 -0
- package/src/util/DataResolver.js +145 -0
- package/src/util/Formatters.js +214 -0
- package/src/util/GuildMemberFlags.js +43 -0
- package/src/util/Intents.js +74 -0
- package/src/util/LimitedCollection.js +131 -0
- package/src/util/MessageFlags.js +54 -0
- package/src/util/Options.js +360 -0
- package/src/util/Permissions.js +187 -0
- package/src/util/PremiumUsageFlags.js +31 -0
- package/src/util/PurchasedFlags.js +31 -0
- package/src/util/RemoteAuth.js +522 -0
- package/src/util/SnowflakeUtil.js +92 -0
- package/src/util/Sweepers.js +466 -0
- package/src/util/SystemChannelFlags.js +55 -0
- package/src/util/ThreadMemberFlags.js +30 -0
- package/src/util/UserFlags.js +104 -0
- package/src/util/Util.js +741 -0
- package/src/util/Voice.js +1456 -0
- package/src/util/arRPC/index.js +229 -0
- package/src/util/arRPC/process/detectable.json +1 -0
- package/src/util/arRPC/process/index.js +102 -0
- package/src/util/arRPC/process/native/index.js +5 -0
- package/src/util/arRPC/process/native/linux.js +37 -0
- package/src/util/arRPC/process/native/win32.js +25 -0
- package/src/util/arRPC/transports/ipc.js +281 -0
- package/src/util/arRPC/transports/websocket.js +128 -0
- package/typings/enums.d.ts +346 -0
- package/typings/index.d.ts +7725 -0
- package/typings/index.test-d.ts +0 -0
- package/typings/rawDataTypes.d.ts +283 -0
@@ -0,0 +1,412 @@
|
|
1
|
+
'use strict';
|
2
|
+
|
3
|
+
const EventEmitter = require('node:events');
|
4
|
+
const { setImmediate } = require('node:timers');
|
5
|
+
const { setTimeout: sleep } = require('node:timers/promises');
|
6
|
+
const { Collection } = require('@discordjs/collection');
|
7
|
+
const { RPCErrorCodes } = require('discord-api-types/v9');
|
8
|
+
const WebSocketShard = require('./WebSocketShard');
|
9
|
+
const PacketHandlers = require('./handlers');
|
10
|
+
const { Error } = require('../../errors');
|
11
|
+
const { Events, ShardEvents, Status, WSCodes, WSEvents } = require('../../util/Constants');
|
12
|
+
|
13
|
+
const BeforeReadyWhitelist = [
|
14
|
+
WSEvents.READY,
|
15
|
+
WSEvents.RESUMED,
|
16
|
+
WSEvents.GUILD_CREATE,
|
17
|
+
WSEvents.GUILD_DELETE,
|
18
|
+
WSEvents.GUILD_MEMBERS_CHUNK,
|
19
|
+
WSEvents.GUILD_MEMBER_ADD,
|
20
|
+
WSEvents.GUILD_MEMBER_REMOVE,
|
21
|
+
];
|
22
|
+
|
23
|
+
const UNRECOVERABLE_CLOSE_CODES = Object.keys(WSCodes).slice(2).map(Number);
|
24
|
+
const UNRESUMABLE_CLOSE_CODES = [
|
25
|
+
RPCErrorCodes.UnknownError,
|
26
|
+
RPCErrorCodes.InvalidPermissions,
|
27
|
+
RPCErrorCodes.InvalidClientId,
|
28
|
+
];
|
29
|
+
|
30
|
+
/**
|
31
|
+
* The WebSocket manager for this client.
|
32
|
+
* <info>This class forwards raw dispatch events,
|
33
|
+
* read more about it here {@link https://discord.com/developers/docs/topics/gateway}</info>
|
34
|
+
* @extends {EventEmitter}
|
35
|
+
*/
|
36
|
+
class WebSocketManager extends EventEmitter {
|
37
|
+
constructor(client) {
|
38
|
+
super();
|
39
|
+
|
40
|
+
/**
|
41
|
+
* The client that instantiated this WebSocketManager
|
42
|
+
* @type {Client}
|
43
|
+
* @readonly
|
44
|
+
* @name WebSocketManager#client
|
45
|
+
*/
|
46
|
+
Object.defineProperty(this, 'client', { value: client });
|
47
|
+
|
48
|
+
/**
|
49
|
+
* The gateway this manager uses
|
50
|
+
* @type {?string}
|
51
|
+
*/
|
52
|
+
this.gateway = null;
|
53
|
+
|
54
|
+
/**
|
55
|
+
* The amount of shards this manager handles
|
56
|
+
* @private
|
57
|
+
* @type {number}
|
58
|
+
*/
|
59
|
+
this.totalShards = this.client.options.shards.length;
|
60
|
+
|
61
|
+
/**
|
62
|
+
* A collection of all shards this manager handles
|
63
|
+
* @type {Collection<number, WebSocketShard>}
|
64
|
+
*/
|
65
|
+
this.shards = new Collection();
|
66
|
+
|
67
|
+
/**
|
68
|
+
* An array of shards to be connected or that need to reconnect
|
69
|
+
* @type {Set<WebSocketShard>}
|
70
|
+
* @private
|
71
|
+
* @name WebSocketManager#shardQueue
|
72
|
+
*/
|
73
|
+
Object.defineProperty(this, 'shardQueue', { value: new Set(), writable: true });
|
74
|
+
|
75
|
+
/**
|
76
|
+
* An array of queued events before this WebSocketManager became ready
|
77
|
+
* @type {Object[]}
|
78
|
+
* @private
|
79
|
+
* @name WebSocketManager#packetQueue
|
80
|
+
*/
|
81
|
+
Object.defineProperty(this, 'packetQueue', { value: [] });
|
82
|
+
|
83
|
+
/**
|
84
|
+
* The current status of this WebSocketManager
|
85
|
+
* @type {Status}
|
86
|
+
*/
|
87
|
+
this.status = Status.IDLE;
|
88
|
+
|
89
|
+
/**
|
90
|
+
* If this manager was destroyed. It will prevent shards from reconnecting
|
91
|
+
* @type {boolean}
|
92
|
+
* @private
|
93
|
+
*/
|
94
|
+
this.destroyed = false;
|
95
|
+
|
96
|
+
/**
|
97
|
+
* If this manager is currently reconnecting one or multiple shards
|
98
|
+
* @type {boolean}
|
99
|
+
* @private
|
100
|
+
*/
|
101
|
+
this.reconnecting = false;
|
102
|
+
}
|
103
|
+
|
104
|
+
/**
|
105
|
+
* The average ping of all WebSocketShards
|
106
|
+
* @type {number}
|
107
|
+
* @readonly
|
108
|
+
*/
|
109
|
+
get ping() {
|
110
|
+
const sum = this.shards.reduce((a, b) => a + b.ping, 0);
|
111
|
+
return sum / this.shards.size;
|
112
|
+
}
|
113
|
+
|
114
|
+
/**
|
115
|
+
* Emits a debug message.
|
116
|
+
* @param {string} message The debug message
|
117
|
+
* @param {?WebSocketShard} [shard] The shard that emitted this message, if any
|
118
|
+
* @private
|
119
|
+
*/
|
120
|
+
debug(message, shard) {
|
121
|
+
this.client.emit(Events.DEBUG, `[WS => ${shard ? `Shard ${shard.id}` : 'Manager'}] ${message}`);
|
122
|
+
}
|
123
|
+
|
124
|
+
/**
|
125
|
+
* Connects this manager to the gateway.
|
126
|
+
* @private
|
127
|
+
*/
|
128
|
+
async connect() {
|
129
|
+
// eslint-disable-next-line no-unused-vars
|
130
|
+
const invalidToken = new Error(WSCodes[4004]);
|
131
|
+
/*
|
132
|
+
BOT
|
133
|
+
const {
|
134
|
+
url: gatewayURL,
|
135
|
+
shards: recommendedShards,
|
136
|
+
session_start_limit: sessionStartLimit,
|
137
|
+
} = await this.client.api.gateway.bot.get().catch(error => {
|
138
|
+
throw error.httpStatus === 401 ? invalidToken : error;
|
139
|
+
});
|
140
|
+
*/
|
141
|
+
|
142
|
+
let gatewayURL = 'wss://gateway.discord.gg';
|
143
|
+
const { url } = await this.client.api.gateway.get({ auth: false }).catch(() => ({ url: gatewayURL }));
|
144
|
+
// eslint-disable-next-line no-unused-vars
|
145
|
+
/*
|
146
|
+
.catch(error => {
|
147
|
+
// Never throw error :v
|
148
|
+
// throw error.httpStatus === 401 ? invalidToken : error;
|
149
|
+
});
|
150
|
+
*/
|
151
|
+
if (url) gatewayURL = url;
|
152
|
+
const recommendedShards = 1;
|
153
|
+
const sessionStartLimit = {
|
154
|
+
total: Infinity,
|
155
|
+
remaining: Infinity,
|
156
|
+
};
|
157
|
+
|
158
|
+
const { total, remaining } = sessionStartLimit;
|
159
|
+
|
160
|
+
this.debug(`Fetched Gateway Information
|
161
|
+
URL: ${gatewayURL}
|
162
|
+
Recommended Shards: ${recommendedShards}`);
|
163
|
+
|
164
|
+
this.debug(`Session Limit Information
|
165
|
+
Total: ${total}
|
166
|
+
Remaining: ${remaining}`);
|
167
|
+
|
168
|
+
this.gateway = `${gatewayURL}/`;
|
169
|
+
|
170
|
+
let { shards } = this.client.options;
|
171
|
+
|
172
|
+
if (shards === 'auto') {
|
173
|
+
this.debug(`Using the recommended shard count provided by Discord: ${recommendedShards}`);
|
174
|
+
this.totalShards = this.client.options.shardCount = recommendedShards;
|
175
|
+
shards = this.client.options.shards = Array.from({ length: recommendedShards }, (_, i) => i);
|
176
|
+
}
|
177
|
+
|
178
|
+
this.totalShards = shards.length;
|
179
|
+
this.debug(`Spawning shards: ${shards.join(', ')}`);
|
180
|
+
this.shardQueue = new Set(shards.map(id => new WebSocketShard(this, id)));
|
181
|
+
|
182
|
+
return this.createShards();
|
183
|
+
}
|
184
|
+
|
185
|
+
/**
|
186
|
+
* Handles the creation of a shard.
|
187
|
+
* @returns {Promise<boolean>}
|
188
|
+
* @private
|
189
|
+
*/
|
190
|
+
async createShards() {
|
191
|
+
// If we don't have any shards to handle, return
|
192
|
+
if (!this.shardQueue.size) return false;
|
193
|
+
|
194
|
+
const [shard] = this.shardQueue;
|
195
|
+
|
196
|
+
this.shardQueue.delete(shard);
|
197
|
+
|
198
|
+
if (!shard.eventsAttached) {
|
199
|
+
shard.on(ShardEvents.ALL_READY, unavailableGuilds => {
|
200
|
+
/**
|
201
|
+
* Emitted when a shard turns ready.
|
202
|
+
* @event Client#shardReady
|
203
|
+
* @param {number} id The shard id that turned ready
|
204
|
+
* @param {?Set<Snowflake>} unavailableGuilds Set of unavailable guild ids, if any
|
205
|
+
*/
|
206
|
+
this.client.emit(Events.SHARD_READY, shard.id, unavailableGuilds);
|
207
|
+
|
208
|
+
if (!this.shardQueue.size) this.reconnecting = false;
|
209
|
+
this.checkShardsReady();
|
210
|
+
});
|
211
|
+
|
212
|
+
shard.on(ShardEvents.CLOSE, event => {
|
213
|
+
if (event.code === 1_000 ? this.destroyed : UNRECOVERABLE_CLOSE_CODES.includes(event.code)) {
|
214
|
+
/**
|
215
|
+
* Emitted when a shard's WebSocket disconnects and will no longer reconnect.
|
216
|
+
* @event Client#shardDisconnect
|
217
|
+
* @param {CloseEvent} event The WebSocket close event
|
218
|
+
* @param {number} id The shard id that disconnected
|
219
|
+
*/
|
220
|
+
this.client.emit(Events.SHARD_DISCONNECT, event, shard.id);
|
221
|
+
this.debug(WSCodes[event.code], shard);
|
222
|
+
return;
|
223
|
+
}
|
224
|
+
|
225
|
+
if (UNRESUMABLE_CLOSE_CODES.includes(event.code)) {
|
226
|
+
// These event codes cannot be resumed
|
227
|
+
shard.sessionId = null;
|
228
|
+
}
|
229
|
+
|
230
|
+
/**
|
231
|
+
* Emitted when a shard is attempting to reconnect or re-identify.
|
232
|
+
* @event Client#shardReconnecting
|
233
|
+
* @param {number} id The shard id that is attempting to reconnect
|
234
|
+
*/
|
235
|
+
this.client.emit(Events.SHARD_RECONNECTING, shard.id);
|
236
|
+
|
237
|
+
this.shardQueue.add(shard);
|
238
|
+
|
239
|
+
if (shard.sessionId) this.debug(`Session id is present, attempting an immediate reconnect...`, shard);
|
240
|
+
this.reconnect();
|
241
|
+
});
|
242
|
+
|
243
|
+
shard.on(ShardEvents.INVALID_SESSION, () => {
|
244
|
+
this.client.emit(Events.SHARD_RECONNECTING, shard.id);
|
245
|
+
});
|
246
|
+
|
247
|
+
shard.on(ShardEvents.DESTROYED, () => {
|
248
|
+
this.debug('Shard was destroyed but no WebSocket connection was present! Reconnecting...', shard);
|
249
|
+
|
250
|
+
this.client.emit(Events.SHARD_RECONNECTING, shard.id);
|
251
|
+
|
252
|
+
this.shardQueue.add(shard);
|
253
|
+
this.reconnect();
|
254
|
+
});
|
255
|
+
|
256
|
+
shard.eventsAttached = true;
|
257
|
+
}
|
258
|
+
|
259
|
+
this.shards.set(shard.id, shard);
|
260
|
+
|
261
|
+
try {
|
262
|
+
await shard.connect();
|
263
|
+
} catch (error) {
|
264
|
+
if (error?.code && UNRECOVERABLE_CLOSE_CODES.includes(error.code)) {
|
265
|
+
throw new Error(WSCodes[error.code]);
|
266
|
+
// Undefined if session is invalid, error event for regular closes
|
267
|
+
} else if (!error || error.code) {
|
268
|
+
this.debug('Failed to connect to the gateway, requeueing...', shard);
|
269
|
+
this.shardQueue.add(shard);
|
270
|
+
} else {
|
271
|
+
throw error;
|
272
|
+
}
|
273
|
+
}
|
274
|
+
// If we have more shards, add a 5s delay
|
275
|
+
if (this.shardQueue.size) {
|
276
|
+
this.debug(`Shard Queue Size: ${this.shardQueue.size}; continuing in 5 seconds...`);
|
277
|
+
await sleep(5_000);
|
278
|
+
return this.createShards();
|
279
|
+
}
|
280
|
+
|
281
|
+
return true;
|
282
|
+
}
|
283
|
+
|
284
|
+
/**
|
285
|
+
* Handles reconnects for this manager.
|
286
|
+
* @private
|
287
|
+
* @returns {Promise<boolean>}
|
288
|
+
*/
|
289
|
+
async reconnect() {
|
290
|
+
if (this.reconnecting || this.status !== Status.READY) return false;
|
291
|
+
this.reconnecting = true;
|
292
|
+
try {
|
293
|
+
await this.createShards();
|
294
|
+
} catch (error) {
|
295
|
+
this.debug(`Couldn't reconnect or fetch information about the gateway. ${error}`);
|
296
|
+
if (error.httpStatus !== 401) {
|
297
|
+
this.debug('Possible network error occurred. Retrying in 5s...');
|
298
|
+
await sleep(5_000);
|
299
|
+
this.reconnecting = false;
|
300
|
+
return this.reconnect();
|
301
|
+
}
|
302
|
+
// If we get an error at this point, it means we cannot reconnect anymore
|
303
|
+
if (this.client.listenerCount(Events.INVALIDATED)) {
|
304
|
+
/**
|
305
|
+
* Emitted when the client's session becomes invalidated.
|
306
|
+
* You are expected to handle closing the process gracefully and preventing a boot loop
|
307
|
+
* if you are listening to this event.
|
308
|
+
* @event Client#invalidated
|
309
|
+
*/
|
310
|
+
this.client.emit(Events.INVALIDATED);
|
311
|
+
// Destroy just the shards. This means you have to handle the cleanup yourself
|
312
|
+
this.destroy();
|
313
|
+
} else {
|
314
|
+
this.client.destroy();
|
315
|
+
}
|
316
|
+
} finally {
|
317
|
+
this.reconnecting = false;
|
318
|
+
}
|
319
|
+
return true;
|
320
|
+
}
|
321
|
+
|
322
|
+
/**
|
323
|
+
* Broadcasts a packet to every shard this manager handles.
|
324
|
+
* @param {Object} packet The packet to send
|
325
|
+
* @private
|
326
|
+
*/
|
327
|
+
broadcast(packet) {
|
328
|
+
for (const shard of this.shards.values()) shard.send(packet);
|
329
|
+
}
|
330
|
+
|
331
|
+
/**
|
332
|
+
* Destroys this manager and all its shards.
|
333
|
+
* @private
|
334
|
+
*/
|
335
|
+
destroy() {
|
336
|
+
if (this.destroyed) return;
|
337
|
+
this.debug(`Manager was destroyed. Called by:\n${new Error('MANAGER_DESTROYED').stack}`);
|
338
|
+
this.destroyed = true;
|
339
|
+
this.shardQueue.clear();
|
340
|
+
for (const shard of this.shards.values()) shard.destroy({ closeCode: 1_000, reset: true, emit: false, log: false });
|
341
|
+
}
|
342
|
+
|
343
|
+
/**
|
344
|
+
* Processes a packet and queues it if this WebSocketManager is not ready.
|
345
|
+
* @param {Object} [packet] The packet to be handled
|
346
|
+
* @param {WebSocketShard} [shard] The shard that will handle this packet
|
347
|
+
* @returns {boolean}
|
348
|
+
* @private
|
349
|
+
*/
|
350
|
+
handlePacket(packet, shard) {
|
351
|
+
if (packet && this.status !== Status.READY) {
|
352
|
+
if (!BeforeReadyWhitelist.includes(packet.t)) {
|
353
|
+
this.packetQueue.push({ packet, shard });
|
354
|
+
return false;
|
355
|
+
}
|
356
|
+
}
|
357
|
+
|
358
|
+
if (this.packetQueue.length) {
|
359
|
+
const item = this.packetQueue.shift();
|
360
|
+
setImmediate(() => {
|
361
|
+
this.handlePacket(item.packet, item.shard);
|
362
|
+
}).unref();
|
363
|
+
}
|
364
|
+
|
365
|
+
if (packet && PacketHandlers[packet.t]) {
|
366
|
+
PacketHandlers[packet.t](this.client, packet, shard);
|
367
|
+
} else if (packet) {
|
368
|
+
/**
|
369
|
+
* Emitted whenever a packet isn't handled.
|
370
|
+
* @event Client#unhandledPacket
|
371
|
+
* @param {Object} packet The packet (t: Event name, d: Data)
|
372
|
+
* @param {Number} shard The shard that received the packet (Auto = 0)
|
373
|
+
*/
|
374
|
+
this.client.emit(Events.UNHANDLED_PACKET, packet, shard);
|
375
|
+
}
|
376
|
+
return true;
|
377
|
+
}
|
378
|
+
|
379
|
+
/**
|
380
|
+
* Checks whether the client is ready to be marked as ready.
|
381
|
+
* @private
|
382
|
+
*/
|
383
|
+
checkShardsReady() {
|
384
|
+
if (this.status === Status.READY) return;
|
385
|
+
if (this.shards.size !== this.totalShards || this.shards.some(s => s.status !== Status.READY)) {
|
386
|
+
return;
|
387
|
+
}
|
388
|
+
|
389
|
+
this.triggerClientReady();
|
390
|
+
}
|
391
|
+
|
392
|
+
/**
|
393
|
+
* Causes the client to be marked as ready and emits the ready event.
|
394
|
+
* @private
|
395
|
+
*/
|
396
|
+
triggerClientReady() {
|
397
|
+
this.status = Status.READY;
|
398
|
+
|
399
|
+
this.client.readyAt = new Date();
|
400
|
+
|
401
|
+
/**
|
402
|
+
* Emitted when the client becomes ready to start working.
|
403
|
+
* @event Client#ready
|
404
|
+
* @param {Client} client The client
|
405
|
+
*/
|
406
|
+
this.client.emit(Events.CLIENT_READY, this.client);
|
407
|
+
|
408
|
+
this.handlePacket();
|
409
|
+
}
|
410
|
+
}
|
411
|
+
|
412
|
+
module.exports = WebSocketManager;
|