djs-selfbot-v13 3.2.2 → 3.7.1

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.
Files changed (363) hide show
  1. package/README.md +37 -36
  2. package/package.json +89 -85
  3. package/src/WebSocket.js +39 -39
  4. package/src/client/BaseClient.js +86 -86
  5. package/src/client/Client.js +934 -836
  6. package/src/client/WebhookClient.js +61 -61
  7. package/src/client/actions/Action.js +116 -120
  8. package/src/client/actions/ActionsManager.js +80 -78
  9. package/src/client/actions/ApplicationCommandPermissionsUpdate.js +34 -34
  10. package/src/client/actions/AutoModerationActionExecution.js +27 -27
  11. package/src/client/actions/AutoModerationRuleCreate.js +28 -28
  12. package/src/client/actions/AutoModerationRuleDelete.js +32 -32
  13. package/src/client/actions/AutoModerationRuleUpdate.js +30 -30
  14. package/src/client/actions/ChannelCreate.js +23 -23
  15. package/src/client/actions/ChannelDelete.js +39 -39
  16. package/src/client/actions/ChannelUpdate.js +43 -43
  17. package/src/client/actions/GuildAuditLogEntryCreate.js +29 -29
  18. package/src/client/actions/GuildBanAdd.js +20 -20
  19. package/src/client/actions/GuildBanRemove.js +25 -25
  20. package/src/client/actions/GuildChannelsPositionUpdate.js +21 -21
  21. package/src/client/actions/GuildDelete.js +65 -65
  22. package/src/client/actions/GuildEmojiCreate.js +20 -20
  23. package/src/client/actions/GuildEmojiDelete.js +21 -21
  24. package/src/client/actions/GuildEmojiUpdate.js +20 -20
  25. package/src/client/actions/GuildEmojisUpdate.js +34 -34
  26. package/src/client/actions/GuildIntegrationsUpdate.js +19 -19
  27. package/src/client/actions/GuildMemberRemove.js +33 -32
  28. package/src/client/actions/GuildMemberUpdate.js +44 -43
  29. package/src/client/actions/GuildRoleCreate.js +25 -25
  30. package/src/client/actions/GuildRoleDelete.js +31 -31
  31. package/src/client/actions/GuildRoleUpdate.js +39 -39
  32. package/src/client/actions/GuildRolesPositionUpdate.js +21 -21
  33. package/src/client/actions/GuildScheduledEventCreate.js +27 -27
  34. package/src/client/actions/GuildScheduledEventDelete.js +31 -31
  35. package/src/client/actions/GuildScheduledEventUpdate.js +30 -30
  36. package/src/client/actions/GuildScheduledEventUserAdd.js +32 -32
  37. package/src/client/actions/GuildScheduledEventUserRemove.js +32 -32
  38. package/src/client/actions/GuildStickerCreate.js +20 -20
  39. package/src/client/actions/GuildStickerDelete.js +21 -21
  40. package/src/client/actions/GuildStickerUpdate.js +20 -20
  41. package/src/client/actions/GuildStickersUpdate.js +34 -34
  42. package/src/client/actions/GuildUpdate.js +33 -33
  43. package/src/client/actions/InviteCreate.js +28 -28
  44. package/src/client/actions/InviteDelete.js +30 -30
  45. package/src/client/actions/MessageCreate.js +50 -46
  46. package/src/client/actions/MessageDelete.js +32 -32
  47. package/src/client/actions/MessageDeleteBulk.js +46 -46
  48. package/src/client/actions/MessagePollVoteAdd.js +33 -0
  49. package/src/client/actions/MessagePollVoteRemove.js +33 -0
  50. package/src/client/actions/MessageReactionAdd.js +68 -56
  51. package/src/client/actions/MessageReactionRemove.js +50 -45
  52. package/src/client/actions/MessageReactionRemoveAll.js +33 -33
  53. package/src/client/actions/MessageReactionRemoveEmoji.js +28 -28
  54. package/src/client/actions/MessageUpdate.js +26 -26
  55. package/src/client/actions/PresenceUpdate.js +50 -46
  56. package/src/client/actions/StageInstanceCreate.js +28 -28
  57. package/src/client/actions/StageInstanceDelete.js +33 -33
  58. package/src/client/actions/StageInstanceUpdate.js +30 -30
  59. package/src/client/actions/ThreadCreate.js +24 -24
  60. package/src/client/actions/ThreadDelete.js +32 -32
  61. package/src/client/actions/ThreadListSync.js +59 -59
  62. package/src/client/actions/ThreadMemberUpdate.js +30 -30
  63. package/src/client/actions/ThreadMembersUpdate.js +34 -34
  64. package/src/client/actions/TypingStart.js +29 -29
  65. package/src/client/actions/UserUpdate.js +35 -35
  66. package/src/client/actions/VoiceStateUpdate.js +50 -57
  67. package/src/client/actions/WebhooksUpdate.js +20 -20
  68. package/src/client/voice/ClientVoiceManager.js +151 -51
  69. package/src/client/voice/VoiceConnection.js +1249 -0
  70. package/src/client/voice/dispatcher/AnnexBDispatcher.js +120 -0
  71. package/src/client/voice/dispatcher/AudioDispatcher.js +145 -0
  72. package/src/client/voice/dispatcher/BaseDispatcher.js +459 -0
  73. package/src/client/voice/dispatcher/VPxDispatcher.js +54 -0
  74. package/src/client/voice/dispatcher/VideoDispatcher.js +68 -0
  75. package/src/client/voice/networking/VoiceUDPClient.js +173 -0
  76. package/src/client/voice/networking/VoiceWebSocket.js +286 -0
  77. package/src/client/voice/player/MediaPlayer.js +321 -0
  78. package/src/client/voice/player/processing/AnnexBNalSplitter.js +244 -0
  79. package/src/client/voice/player/processing/IvfSplitter.js +106 -0
  80. package/src/client/voice/player/processing/PCMInsertSilence.js +37 -0
  81. package/src/client/voice/receiver/PacketHandler.js +260 -0
  82. package/src/client/voice/receiver/Receiver.js +96 -0
  83. package/src/client/voice/receiver/Recorder.js +173 -0
  84. package/src/client/voice/util/Function.js +116 -0
  85. package/src/client/voice/util/PlayInterface.js +122 -0
  86. package/src/client/voice/util/Secretbox.js +64 -0
  87. package/src/client/voice/util/Silence.js +16 -0
  88. package/src/client/voice/util/Socket.js +62 -0
  89. package/src/client/voice/util/VolumeInterface.js +104 -0
  90. package/src/client/websocket/WebSocketManager.js +392 -392
  91. package/src/client/websocket/WebSocketShard.js +907 -906
  92. package/src/client/websocket/handlers/APPLICATION_COMMAND_CREATE.js +18 -18
  93. package/src/client/websocket/handlers/APPLICATION_COMMAND_DELETE.js +20 -20
  94. package/src/client/websocket/handlers/APPLICATION_COMMAND_PERMISSIONS_UPDATE.js +5 -5
  95. package/src/client/websocket/handlers/APPLICATION_COMMAND_UPDATE.js +20 -20
  96. package/src/client/websocket/handlers/AUTO_MODERATION_ACTION_EXECUTION.js +5 -5
  97. package/src/client/websocket/handlers/AUTO_MODERATION_RULE_CREATE.js +5 -5
  98. package/src/client/websocket/handlers/AUTO_MODERATION_RULE_DELETE.js +5 -5
  99. package/src/client/websocket/handlers/AUTO_MODERATION_RULE_UPDATE.js +5 -5
  100. package/src/client/websocket/handlers/CALL_CREATE.js +14 -14
  101. package/src/client/websocket/handlers/CALL_DELETE.js +11 -11
  102. package/src/client/websocket/handlers/CALL_UPDATE.js +11 -11
  103. package/src/client/websocket/handlers/CHANNEL_CREATE.js +5 -5
  104. package/src/client/websocket/handlers/CHANNEL_DELETE.js +5 -5
  105. package/src/client/websocket/handlers/CHANNEL_PINS_UPDATE.js +22 -22
  106. package/src/client/websocket/handlers/CHANNEL_RECIPIENT_ADD.js +19 -19
  107. package/src/client/websocket/handlers/CHANNEL_RECIPIENT_REMOVE.js +16 -16
  108. package/src/client/websocket/handlers/CHANNEL_UPDATE.js +16 -16
  109. package/src/client/websocket/handlers/GUILD_AUDIT_LOG_ENTRY_CREATE.js +5 -5
  110. package/src/client/websocket/handlers/GUILD_BAN_ADD.js +5 -5
  111. package/src/client/websocket/handlers/GUILD_BAN_REMOVE.js +5 -5
  112. package/src/client/websocket/handlers/GUILD_CREATE.js +52 -52
  113. package/src/client/websocket/handlers/GUILD_DELETE.js +5 -5
  114. package/src/client/websocket/handlers/GUILD_EMOJIS_UPDATE.js +5 -5
  115. package/src/client/websocket/handlers/GUILD_INTEGRATIONS_UPDATE.js +5 -5
  116. package/src/client/websocket/handlers/GUILD_MEMBERS_CHUNK.js +39 -39
  117. package/src/client/websocket/handlers/GUILD_MEMBER_ADD.js +20 -19
  118. package/src/client/websocket/handlers/GUILD_MEMBER_REMOVE.js +5 -5
  119. package/src/client/websocket/handlers/GUILD_MEMBER_UPDATE.js +5 -5
  120. package/src/client/websocket/handlers/GUILD_ROLE_CREATE.js +5 -5
  121. package/src/client/websocket/handlers/GUILD_ROLE_DELETE.js +5 -5
  122. package/src/client/websocket/handlers/GUILD_ROLE_UPDATE.js +5 -5
  123. package/src/client/websocket/handlers/GUILD_SCHEDULED_EVENT_CREATE.js +5 -5
  124. package/src/client/websocket/handlers/GUILD_SCHEDULED_EVENT_DELETE.js +5 -5
  125. package/src/client/websocket/handlers/GUILD_SCHEDULED_EVENT_UPDATE.js +5 -5
  126. package/src/client/websocket/handlers/GUILD_SCHEDULED_EVENT_USER_ADD.js +5 -5
  127. package/src/client/websocket/handlers/GUILD_SCHEDULED_EVENT_USER_REMOVE.js +5 -5
  128. package/src/client/websocket/handlers/GUILD_STICKERS_UPDATE.js +5 -5
  129. package/src/client/websocket/handlers/GUILD_UPDATE.js +5 -5
  130. package/src/client/websocket/handlers/INTERACTION_MODAL_CREATE.js +12 -12
  131. package/src/client/websocket/handlers/INVITE_CREATE.js +5 -5
  132. package/src/client/websocket/handlers/INVITE_DELETE.js +5 -5
  133. package/src/client/websocket/handlers/MESSAGE_CREATE.js +5 -5
  134. package/src/client/websocket/handlers/MESSAGE_DELETE.js +5 -5
  135. package/src/client/websocket/handlers/MESSAGE_DELETE_BULK.js +5 -5
  136. package/src/client/websocket/handlers/MESSAGE_POLL_VOTE_ADD.js +5 -22
  137. package/src/client/websocket/handlers/MESSAGE_POLL_VOTE_REMOVE.js +5 -12
  138. package/src/client/websocket/handlers/MESSAGE_REACTION_ADD.js +5 -5
  139. package/src/client/websocket/handlers/MESSAGE_REACTION_REMOVE.js +5 -5
  140. package/src/client/websocket/handlers/MESSAGE_REACTION_REMOVE_ALL.js +5 -5
  141. package/src/client/websocket/handlers/MESSAGE_REACTION_REMOVE_EMOJI.js +5 -5
  142. package/src/client/websocket/handlers/MESSAGE_UPDATE.js +16 -16
  143. package/src/client/websocket/handlers/PRESENCE_UPDATE.js +5 -5
  144. package/src/client/websocket/handlers/READY.js +121 -120
  145. package/src/client/websocket/handlers/RELATIONSHIP_ADD.js +19 -19
  146. package/src/client/websocket/handlers/RELATIONSHIP_REMOVE.js +17 -17
  147. package/src/client/websocket/handlers/RELATIONSHIP_UPDATE.js +41 -41
  148. package/src/client/websocket/handlers/RESUMED.js +14 -14
  149. package/src/client/websocket/handlers/STAGE_INSTANCE_CREATE.js +5 -5
  150. package/src/client/websocket/handlers/STAGE_INSTANCE_DELETE.js +5 -5
  151. package/src/client/websocket/handlers/STAGE_INSTANCE_UPDATE.js +5 -5
  152. package/src/client/websocket/handlers/THREAD_CREATE.js +5 -5
  153. package/src/client/websocket/handlers/THREAD_DELETE.js +5 -5
  154. package/src/client/websocket/handlers/THREAD_LIST_SYNC.js +5 -5
  155. package/src/client/websocket/handlers/THREAD_MEMBERS_UPDATE.js +5 -5
  156. package/src/client/websocket/handlers/THREAD_MEMBER_UPDATE.js +5 -5
  157. package/src/client/websocket/handlers/THREAD_UPDATE.js +16 -16
  158. package/src/client/websocket/handlers/TYPING_START.js +5 -5
  159. package/src/client/websocket/handlers/USER_GUILD_SETTINGS_UPDATE.js +6 -6
  160. package/src/client/websocket/handlers/USER_NOTE_UPDATE.js +5 -5
  161. package/src/client/websocket/handlers/USER_REQUIRED_ACTION_UPDATE.js +78 -78
  162. package/src/client/websocket/handlers/USER_SETTINGS_UPDATE.js +5 -5
  163. package/src/client/websocket/handlers/USER_UPDATE.js +5 -5
  164. package/src/client/websocket/handlers/VOICE_CHANNEL_EFFECT_SEND.js +16 -0
  165. package/src/client/websocket/handlers/VOICE_CHANNEL_STATUS_UPDATE.js +12 -12
  166. package/src/client/websocket/handlers/VOICE_SERVER_UPDATE.js +6 -6
  167. package/src/client/websocket/handlers/VOICE_STATE_UPDATE.js +5 -5
  168. package/src/client/websocket/handlers/WEBHOOKS_UPDATE.js +5 -5
  169. package/src/client/websocket/handlers/index.js +84 -83
  170. package/src/errors/DJSError.js +61 -61
  171. package/src/errors/Messages.js +217 -183
  172. package/src/errors/index.js +4 -4
  173. package/src/index.js +172 -159
  174. package/src/managers/ApplicationCommandManager.js +264 -264
  175. package/src/managers/ApplicationCommandPermissionsManager.js +417 -417
  176. package/src/managers/AutoModerationRuleManager.js +296 -296
  177. package/src/managers/BaseGuildEmojiManager.js +80 -80
  178. package/src/managers/BaseManager.js +19 -19
  179. package/src/managers/BillingManager.js +66 -66
  180. package/src/managers/CachedManager.js +71 -71
  181. package/src/managers/ChannelManager.js +148 -138
  182. package/src/managers/ClientUserSettingManager.js +372 -372
  183. package/src/managers/DataManager.js +61 -61
  184. package/src/managers/GuildBanManager.js +250 -250
  185. package/src/managers/GuildChannelManager.js +488 -488
  186. package/src/managers/GuildEmojiManager.js +171 -171
  187. package/src/managers/GuildEmojiRoleManager.js +118 -118
  188. package/src/managers/GuildForumThreadManager.js +108 -108
  189. package/src/managers/GuildInviteManager.js +213 -213
  190. package/src/managers/GuildManager.js +338 -304
  191. package/src/managers/GuildMemberManager.js +599 -597
  192. package/src/managers/GuildMemberRoleManager.js +195 -191
  193. package/src/managers/GuildScheduledEventManager.js +314 -296
  194. package/src/managers/GuildSettingManager.js +155 -155
  195. package/src/managers/GuildStickerManager.js +179 -179
  196. package/src/managers/GuildTextThreadManager.js +98 -98
  197. package/src/managers/InteractionManager.js +39 -39
  198. package/src/managers/MessageManager.js +423 -391
  199. package/src/managers/PermissionOverwriteManager.js +164 -166
  200. package/src/managers/PresenceManager.js +71 -58
  201. package/src/managers/ReactionManager.js +67 -67
  202. package/src/managers/ReactionUserManager.js +73 -71
  203. package/src/managers/RelationshipManager.js +278 -265
  204. package/src/managers/RoleManager.js +448 -352
  205. package/src/managers/SessionManager.js +66 -0
  206. package/src/managers/StageInstanceManager.js +162 -162
  207. package/src/managers/ThreadManager.js +175 -174
  208. package/src/managers/ThreadMemberManager.js +186 -186
  209. package/src/managers/UserManager.js +136 -146
  210. package/src/managers/UserNoteManager.js +53 -53
  211. package/src/managers/VoiceStateManager.js +59 -37
  212. package/src/rest/APIRequest.js +154 -160
  213. package/src/rest/APIRouter.js +53 -53
  214. package/src/rest/DiscordAPIError.js +119 -104
  215. package/src/rest/HTTPError.js +62 -62
  216. package/src/rest/RESTManager.js +67 -62
  217. package/src/rest/RateLimitError.js +55 -55
  218. package/src/rest/RequestHandler.js +466 -444
  219. package/src/sharding/Shard.js +444 -443
  220. package/src/sharding/ShardClientUtil.js +279 -275
  221. package/src/sharding/ShardingManager.js +319 -318
  222. package/src/structures/AnonymousGuild.js +98 -98
  223. package/src/structures/ApplicationCommand.js +593 -593
  224. package/src/structures/ApplicationRoleConnectionMetadata.js +48 -48
  225. package/src/structures/AutoModerationActionExecution.js +89 -89
  226. package/src/structures/AutoModerationRule.js +294 -294
  227. package/src/structures/AutocompleteInteraction.js +107 -107
  228. package/src/structures/Base.js +43 -43
  229. package/src/structures/BaseCommandInteraction.js +211 -211
  230. package/src/structures/BaseGuild.js +116 -116
  231. package/src/structures/BaseGuildEmoji.js +56 -56
  232. package/src/structures/BaseGuildTextChannel.js +191 -191
  233. package/src/structures/BaseGuildVoiceChannel.js +241 -241
  234. package/src/structures/BaseMessageComponent.js +181 -114
  235. package/src/structures/ButtonInteraction.js +11 -11
  236. package/src/structures/CallState.js +63 -63
  237. package/src/structures/CategoryChannel.js +85 -85
  238. package/src/structures/Channel.js +284 -270
  239. package/src/structures/ClientPresence.js +77 -85
  240. package/src/structures/ClientUser.js +479 -448
  241. package/src/structures/CommandInteraction.js +41 -41
  242. package/src/structures/CommandInteractionOptionResolver.js +276 -276
  243. package/src/structures/ContainerComponent.js +68 -0
  244. package/src/structures/ContextMenuInteraction.js +65 -65
  245. package/src/structures/DMChannel.js +219 -217
  246. package/src/structures/DirectoryChannel.js +20 -20
  247. package/src/structures/Emoji.js +148 -148
  248. package/src/structures/FileComponent.js +49 -0
  249. package/src/structures/ForumChannel.js +31 -261
  250. package/src/structures/GroupDMChannel.js +394 -387
  251. package/src/structures/Guild.js +1643 -1608
  252. package/src/structures/GuildAuditLogs.js +746 -729
  253. package/src/structures/GuildBan.js +59 -59
  254. package/src/structures/GuildBoost.js +108 -108
  255. package/src/structures/GuildChannel.js +470 -468
  256. package/src/structures/GuildEmoji.js +161 -161
  257. package/src/structures/GuildMember.js +636 -568
  258. package/src/structures/GuildPreview.js +191 -191
  259. package/src/structures/GuildPreviewEmoji.js +27 -27
  260. package/src/structures/GuildScheduledEvent.js +536 -441
  261. package/src/structures/GuildTemplate.js +236 -236
  262. package/src/structures/Integration.js +188 -188
  263. package/src/structures/IntegrationApplication.js +96 -96
  264. package/src/structures/Interaction.js +290 -290
  265. package/src/structures/InteractionCollector.js +248 -248
  266. package/src/structures/InteractionWebhook.js +43 -43
  267. package/src/structures/Invite.js +358 -358
  268. package/src/structures/InviteGuild.js +23 -23
  269. package/src/structures/InviteStageInstance.js +86 -86
  270. package/src/structures/MediaChannel.js +11 -0
  271. package/src/structures/MediaGalleryComponent.js +41 -0
  272. package/src/structures/MediaGalleryItem.js +47 -0
  273. package/src/structures/Message.js +1252 -1227
  274. package/src/structures/MessageActionRow.js +105 -103
  275. package/src/structures/MessageAttachment.js +216 -204
  276. package/src/structures/MessageButton.js +166 -165
  277. package/src/structures/MessageCollector.js +146 -146
  278. package/src/structures/MessageComponentInteraction.js +120 -120
  279. package/src/structures/MessageContextMenuInteraction.js +20 -20
  280. package/src/structures/MessageEmbed.js +596 -586
  281. package/src/structures/MessageMentions.js +273 -273
  282. package/src/structures/MessagePayload.js +354 -318
  283. package/src/structures/MessageReaction.js +181 -171
  284. package/src/structures/MessageSelectMenu.js +141 -140
  285. package/src/structures/Modal.js +161 -161
  286. package/src/structures/ModalSubmitFieldsResolver.js +53 -53
  287. package/src/structures/ModalSubmitInteraction.js +119 -119
  288. package/src/structures/NewsChannel.js +32 -32
  289. package/src/structures/OAuth2Guild.js +28 -28
  290. package/src/structures/PermissionOverwrites.js +198 -196
  291. package/src/structures/Poll.js +108 -0
  292. package/src/structures/PollAnswer.js +88 -0
  293. package/src/structures/Presence.js +1105 -1101
  294. package/src/structures/ReactionCollector.js +229 -229
  295. package/src/structures/ReactionEmoji.js +31 -31
  296. package/src/structures/Role.js +590 -531
  297. package/src/structures/SectionComponent.js +48 -0
  298. package/src/structures/SelectMenuInteraction.js +21 -21
  299. package/src/structures/SeparatorComponent.js +48 -0
  300. package/src/structures/Session.js +81 -0
  301. package/src/structures/StageChannel.js +104 -104
  302. package/src/structures/StageInstance.js +208 -208
  303. package/src/structures/Sticker.js +310 -310
  304. package/src/structures/StickerPack.js +95 -95
  305. package/src/structures/StoreChannel.js +56 -56
  306. package/src/structures/Team.js +118 -118
  307. package/src/structures/TeamMember.js +80 -71
  308. package/src/structures/TextChannel.js +33 -33
  309. package/src/structures/TextDisplayComponent.js +40 -0
  310. package/src/structures/TextInputComponent.js +132 -131
  311. package/src/structures/ThreadChannel.js +605 -607
  312. package/src/structures/ThreadMember.js +105 -105
  313. package/src/structures/ThreadOnlyChannel.js +249 -0
  314. package/src/structures/ThumbnailComponent.js +57 -0
  315. package/src/structures/Typing.js +74 -74
  316. package/src/structures/UnfurledMediaItem.js +29 -0
  317. package/src/structures/User.js +640 -543
  318. package/src/structures/UserContextMenuInteraction.js +29 -29
  319. package/src/structures/VoiceChannel.js +110 -110
  320. package/src/structures/VoiceChannelEffect.js +69 -0
  321. package/src/structures/VoiceRegion.js +53 -53
  322. package/src/structures/VoiceState.js +354 -341
  323. package/src/structures/WebEmbed.js +373 -373
  324. package/src/structures/Webhook.js +478 -467
  325. package/src/structures/WelcomeChannel.js +60 -60
  326. package/src/structures/WelcomeScreen.js +48 -48
  327. package/src/structures/Widget.js +87 -87
  328. package/src/structures/WidgetMember.js +99 -99
  329. package/src/structures/interfaces/Application.js +825 -313
  330. package/src/structures/interfaces/Collector.js +300 -300
  331. package/src/structures/interfaces/InteractionResponses.js +313 -313
  332. package/src/structures/interfaces/TextBasedChannel.js +759 -719
  333. package/src/util/APITypes.js +59 -0
  334. package/src/util/ActivityFlags.js +44 -44
  335. package/src/util/ApplicationFlags.js +76 -76
  336. package/src/util/AttachmentFlags.js +38 -38
  337. package/src/util/BitField.js +170 -170
  338. package/src/util/ChannelFlags.js +45 -45
  339. package/src/util/Constants.js +1914 -1773
  340. package/src/util/DataResolver.js +146 -145
  341. package/src/util/Formatters.js +228 -228
  342. package/src/util/GuildMemberFlags.js +43 -43
  343. package/src/util/Intents.js +74 -74
  344. package/src/util/InviteFlags.js +34 -29
  345. package/src/util/LimitedCollection.js +131 -131
  346. package/src/util/MessageFlags.js +63 -54
  347. package/src/util/Options.js +358 -336
  348. package/src/util/Permissions.js +202 -202
  349. package/src/util/PremiumUsageFlags.js +31 -31
  350. package/src/util/PurchasedFlags.js +33 -33
  351. package/src/util/RemoteAuth.js +382 -379
  352. package/src/util/RoleFlags.js +37 -37
  353. package/src/util/SnowflakeUtil.js +92 -92
  354. package/src/util/Speaking.js +33 -0
  355. package/src/util/Sweepers.js +466 -466
  356. package/src/util/SystemChannelFlags.js +55 -55
  357. package/src/util/ThreadMemberFlags.js +30 -30
  358. package/src/util/UserFlags.js +104 -104
  359. package/src/util/Util.js +1048 -889
  360. package/typings/enums.d.ts +439 -297
  361. package/typings/index.d.ts +8247 -7432
  362. package/typings/rawDataTypes.d.ts +403 -342
  363. package/src/structures/MessagePoll.js +0 -238
@@ -1,318 +1,319 @@
1
- 'use strict';
2
-
3
- const EventEmitter = require('node:events');
4
- const fs = require('node:fs');
5
- const path = require('node:path');
6
- const process = require('node:process');
7
- const { setTimeout: sleep } = require('node:timers/promises');
8
- const { Collection } = require('@discordjs/collection');
9
- const Shard = require('./Shard');
10
- const { Error, TypeError, RangeError } = require('../errors');
11
- const Util = require('../util/Util');
12
-
13
- /**
14
- * This is a utility class that makes multi-process sharding of a bot an easy and painless experience.
15
- * It works by spawning a self-contained {@link ChildProcess} or {@link Worker} for each individual shard, each
16
- * containing its own instance of your bot's {@link Client}. They all have a line of communication with the master
17
- * process, and there are several useful methods that utilise it in order to simplify tasks that are normally difficult
18
- * with sharding. It can spawn a specific number of shards or the amount that Discord suggests for the bot, and takes a
19
- * path to your main bot script to launch for each one.
20
- * @extends {EventEmitter}
21
- */
22
- class ShardingManager extends EventEmitter {
23
- /**
24
- * The mode to spawn shards with for a {@link ShardingManager}. Can be either one of:
25
- * * 'process' to use child processes
26
- * * 'worker' to use [Worker threads](https://nodejs.org/api/worker_threads.html)
27
- * @typedef {string} ShardingManagerMode
28
- */
29
-
30
- /**
31
- * The options to spawn shards with for a {@link ShardingManager}.
32
- * @typedef {Object} ShardingManagerOptions
33
- * @property {string|number} [totalShards='auto'] Number of total shards of all shard managers or "auto"
34
- * @property {string|number[]} [shardList='auto'] List of shards to spawn or "auto"
35
- * @property {ShardingManagerMode} [mode='process'] Which mode to use for shards
36
- * @property {boolean} [respawn=true] Whether shards should automatically respawn upon exiting
37
- * @property {string[]} [shardArgs=[]] Arguments to pass to the shard script when spawning
38
- * (only available when mode is set to 'process')
39
- * @property {string[]} [execArgv=[]] Arguments to pass to the shard script executable when spawning
40
- * (only available when mode is set to 'process')
41
- * @property {string} [token] Token to use for automatic shard count and passing to shards
42
- */
43
-
44
- /**
45
- * @param {string} file Path to your shard script file
46
- * @param {ShardingManagerOptions} [options] Options for the sharding manager
47
- */
48
- constructor(file, options = {}) {
49
- super();
50
- options = Util.mergeDefault(
51
- {
52
- totalShards: 'auto',
53
- mode: 'process',
54
- respawn: true,
55
- shardArgs: [],
56
- execArgv: [],
57
- token: process.env.DISCORD_TOKEN,
58
- },
59
- options,
60
- );
61
-
62
- /**
63
- * Path to the shard script file
64
- * @type {string}
65
- */
66
- this.file = file;
67
- if (!file) throw new Error('CLIENT_INVALID_OPTION', 'File', 'specified.');
68
- if (!path.isAbsolute(file)) this.file = path.resolve(process.cwd(), file);
69
- const stats = fs.statSync(this.file);
70
- if (!stats.isFile()) throw new Error('CLIENT_INVALID_OPTION', 'File', 'a file');
71
-
72
- /**
73
- * List of shards this sharding manager spawns
74
- * @type {string|number[]}
75
- */
76
- this.shardList = options.shardList ?? 'auto';
77
- if (this.shardList !== 'auto') {
78
- if (!Array.isArray(this.shardList)) {
79
- throw new TypeError('CLIENT_INVALID_OPTION', 'shardList', 'an array.');
80
- }
81
- this.shardList = [...new Set(this.shardList)];
82
- if (this.shardList.length < 1) throw new RangeError('CLIENT_INVALID_OPTION', 'shardList', 'at least 1 id.');
83
- if (
84
- this.shardList.some(
85
- shardId => typeof shardId !== 'number' || isNaN(shardId) || !Number.isInteger(shardId) || shardId < 0,
86
- )
87
- ) {
88
- throw new TypeError('CLIENT_INVALID_OPTION', 'shardList', 'an array of positive integers.');
89
- }
90
- }
91
-
92
- /**
93
- * Amount of shards that all sharding managers spawn in total
94
- * @type {number}
95
- */
96
- this.totalShards = options.totalShards || 'auto';
97
- if (this.totalShards !== 'auto') {
98
- if (typeof this.totalShards !== 'number' || isNaN(this.totalShards)) {
99
- throw new TypeError('CLIENT_INVALID_OPTION', 'Amount of shards', 'a number.');
100
- }
101
- if (this.totalShards < 1) throw new RangeError('CLIENT_INVALID_OPTION', 'Amount of shards', 'at least 1.');
102
- if (!Number.isInteger(this.totalShards)) {
103
- throw new RangeError('CLIENT_INVALID_OPTION', 'Amount of shards', 'an integer.');
104
- }
105
- }
106
-
107
- /**
108
- * Mode for shards to spawn with
109
- * @type {ShardingManagerMode}
110
- */
111
- this.mode = options.mode;
112
- if (this.mode !== 'process' && this.mode !== 'worker') {
113
- throw new RangeError('CLIENT_INVALID_OPTION', 'Sharding mode', '"process" or "worker"');
114
- }
115
-
116
- /**
117
- * Whether shards should automatically respawn upon exiting
118
- * @type {boolean}
119
- */
120
- this.respawn = options.respawn;
121
-
122
- /**
123
- * An array of arguments to pass to shards (only when {@link ShardingManager#mode} is `process`)
124
- * @type {string[]}
125
- */
126
- this.shardArgs = options.shardArgs;
127
-
128
- /**
129
- * An array of arguments to pass to the executable (only when {@link ShardingManager#mode} is `process`)
130
- * @type {string[]}
131
- */
132
- this.execArgv = options.execArgv;
133
-
134
- /**
135
- * Token to use for obtaining the automatic shard count, and passing to shards
136
- * @type {?string}
137
- */
138
- this.token = options.token?.replace(/^Bot\s*/i, '') ?? null;
139
-
140
- /**
141
- * A collection of shards that this manager has spawned
142
- * @type {Collection<number, Shard>}
143
- */
144
- this.shards = new Collection();
145
-
146
- process.env.SHARDING_MANAGER = true;
147
- process.env.SHARDING_MANAGER_MODE = this.mode;
148
- process.env.DISCORD_TOKEN = this.token;
149
- }
150
-
151
- /**
152
- * Creates a single shard.
153
- * <warn>Using this method is usually not necessary if you use the spawn method.</warn>
154
- * @param {number} [id=this.shards.size] Id of the shard to create
155
- * <info>This is usually not necessary to manually specify.</info>
156
- * @returns {Shard} Note that the created shard needs to be explicitly spawned using its spawn method.
157
- */
158
- createShard(id = this.shards.size) {
159
- const shard = new Shard(this, id);
160
- this.shards.set(id, shard);
161
- /**
162
- * Emitted upon creating a shard.
163
- * @event ShardingManager#shardCreate
164
- * @param {Shard} shard Shard that was created
165
- */
166
- this.emit('shardCreate', shard);
167
- return shard;
168
- }
169
-
170
- /**
171
- * Options used to spawn multiple shards.
172
- * @typedef {Object} MultipleShardSpawnOptions
173
- * @property {number|string} [amount=this.totalShards] Number of shards to spawn
174
- * @property {number} [delay=5500] How long to wait in between spawning each shard (in milliseconds)
175
- * @property {number} [timeout=30000] The amount in milliseconds to wait until the {@link Client} has become ready
176
- */
177
-
178
- /**
179
- * Spawns multiple shards.
180
- * @param {MultipleShardSpawnOptions} [options] Options for spawning shards
181
- * @returns {Promise<Collection<number, Shard>>}
182
- */
183
- async spawn({ amount = this.totalShards, delay = 5500, timeout = 30_000 } = {}) {
184
- // Obtain/verify the number of shards to spawn
185
- if (amount === 'auto') {
186
- amount = 1;
187
- } else {
188
- if (typeof amount !== 'number' || isNaN(amount)) {
189
- throw new TypeError('CLIENT_INVALID_OPTION', 'Amount of shards', 'a number.');
190
- }
191
- if (amount < 1) throw new RangeError('CLIENT_INVALID_OPTION', 'Amount of shards', 'at least 1.');
192
- if (!Number.isInteger(amount)) {
193
- throw new TypeError('CLIENT_INVALID_OPTION', 'Amount of shards', 'an integer.');
194
- }
195
- }
196
-
197
- // Make sure this many shards haven't already been spawned
198
- if (this.shards.size >= amount) throw new Error('SHARDING_ALREADY_SPAWNED', this.shards.size);
199
- if (this.shardList === 'auto' || this.totalShards === 'auto' || this.totalShards !== amount) {
200
- this.shardList = [...Array(amount).keys()];
201
- }
202
- if (this.totalShards === 'auto' || this.totalShards !== amount) {
203
- this.totalShards = amount;
204
- }
205
-
206
- if (this.shardList.some(shardId => shardId >= amount)) {
207
- throw new RangeError(
208
- 'CLIENT_INVALID_OPTION',
209
- 'Amount of shards',
210
- 'bigger than the highest shardId in the shardList option.',
211
- );
212
- }
213
-
214
- // Spawn the shards
215
- for (const shardId of this.shardList) {
216
- const promises = [];
217
- const shard = this.createShard(shardId);
218
- promises.push(shard.spawn(timeout));
219
- if (delay > 0 && this.shards.size !== this.shardList.length) promises.push(sleep(delay));
220
- await Promise.all(promises); // eslint-disable-line no-await-in-loop
221
- }
222
-
223
- return this.shards;
224
- }
225
-
226
- /**
227
- * Sends a message to all shards.
228
- * @param {*} message Message to be sent to the shards
229
- * @returns {Promise<Shard[]>}
230
- */
231
- broadcast(message) {
232
- const promises = [];
233
- for (const shard of this.shards.values()) promises.push(shard.send(message));
234
- return Promise.all(promises);
235
- }
236
-
237
- /**
238
- * Options for {@link ShardingManager#broadcastEval} and {@link ShardClientUtil#broadcastEval}.
239
- * @typedef {Object} BroadcastEvalOptions
240
- * @property {number} [shard] Shard to run script on, all if undefined
241
- * @property {*} [context] The JSON-serializable values to call the script with
242
- */
243
-
244
- /**
245
- * Evaluates a script on all shards, or a given shard, in the context of the {@link Client}s.
246
- * @param {Function} script JavaScript to run on each shard
247
- * @param {BroadcastEvalOptions} [options={}] The options for the broadcast
248
- * @returns {Promise<*|Array<*>>} Results of the script execution
249
- */
250
- broadcastEval(script, options = {}) {
251
- if (typeof script !== 'function') return Promise.reject(new TypeError('SHARDING_INVALID_EVAL_BROADCAST'));
252
- return this._performOnShards('eval', [`(${script})(this, ${JSON.stringify(options.context)})`], options.shard);
253
- }
254
-
255
- /**
256
- * Fetches a client property value of each shard, or a given shard.
257
- * @param {string} prop Name of the client property to get, using periods for nesting
258
- * @param {number} [shard] Shard to fetch property from, all if undefined
259
- * @returns {Promise<*|Array<*>>}
260
- * @example
261
- * manager.fetchClientValues('guilds.cache.size')
262
- * .then(results => console.log(`${results.reduce((prev, val) => prev + val, 0)} total guilds`))
263
- * .catch(console.error);
264
- */
265
- fetchClientValues(prop, shard) {
266
- return this._performOnShards('fetchClientValue', [prop], shard);
267
- }
268
-
269
- /**
270
- * Runs a method with given arguments on all shards, or a given shard.
271
- * @param {string} method Method name to run on each shard
272
- * @param {Array<*>} args Arguments to pass through to the method call
273
- * @param {number} [shard] Shard to run on, all if undefined
274
- * @returns {Promise<*|Array<*>>} Results of the method execution
275
- * @private
276
- */
277
- _performOnShards(method, args, shard) {
278
- if (this.shards.size === 0) return Promise.reject(new Error('SHARDING_NO_SHARDS'));
279
-
280
- if (typeof shard === 'number') {
281
- if (this.shards.has(shard)) return this.shards.get(shard)[method](...args);
282
- return Promise.reject(new Error('SHARDING_SHARD_NOT_FOUND', shard));
283
- }
284
-
285
- if (this.shards.size !== this.shardList.length) return Promise.reject(new Error('SHARDING_IN_PROCESS'));
286
-
287
- const promises = [];
288
- for (const sh of this.shards.values()) promises.push(sh[method](...args));
289
- return Promise.all(promises);
290
- }
291
-
292
- /**
293
- * Options used to respawn all shards.
294
- * @typedef {Object} MultipleShardRespawnOptions
295
- * @property {number} [shardDelay=5000] How long to wait between shards (in milliseconds)
296
- * @property {number} [respawnDelay=500] How long to wait between killing a shard's process and restarting it
297
- * (in milliseconds)
298
- * @property {number} [timeout=30000] The amount in milliseconds to wait for a shard to become ready before
299
- * continuing to another (`-1` or `Infinity` for no wait)
300
- */
301
-
302
- /**
303
- * Kills all running shards and respawns them.
304
- * @param {MultipleShardRespawnOptions} [options] Options for respawning shards
305
- * @returns {Promise<Collection<number, Shard>>}
306
- */
307
- async respawnAll({ shardDelay = 5_000, respawnDelay = 500, timeout = 30_000 } = {}) {
308
- let s = 0;
309
- for (const shard of this.shards.values()) {
310
- const promises = [shard.respawn({ delay: respawnDelay, timeout })];
311
- if (++s < this.shards.size && shardDelay > 0) promises.push(sleep(shardDelay));
312
- await Promise.all(promises); // eslint-disable-line no-await-in-loop
313
- }
314
- return this.shards;
315
- }
316
- }
317
-
318
- module.exports = ShardingManager;
1
+ 'use strict';
2
+
3
+ const EventEmitter = require('node:events');
4
+ const fs = require('node:fs');
5
+ const path = require('node:path');
6
+ const process = require('node:process');
7
+ const { setTimeout: sleep } = require('node:timers/promises');
8
+ const { Collection } = require('@discordjs/collection');
9
+ const Shard = require('./Shard');
10
+ const { Error, TypeError, RangeError } = require('../errors');
11
+ const Util = require('../util/Util');
12
+
13
+ /**
14
+ * This is a utility class that makes multi-process sharding of a bot an easy and painless experience.
15
+ * It works by spawning a self-contained {@link ChildProcess} or {@link Worker} for each individual shard, each
16
+ * containing its own instance of your bot's {@link Client}. They all have a line of communication with the master
17
+ * process, and there are several useful methods that utilize it in order to simplify tasks that are normally difficult
18
+ * with sharding. It can spawn a specific number of shards or the amount that Discord suggests for the bot, and takes a
19
+ * path to your main bot script to launch for each one.
20
+ * @extends {EventEmitter}
21
+ * @deprecated
22
+ */
23
+ class ShardingManager extends EventEmitter {
24
+ /**
25
+ * The mode to spawn shards with for a {@link ShardingManager}. Can be either one of:
26
+ * * 'process' to use child processes
27
+ * * 'worker' to use [Worker threads](https://nodejs.org/api/worker_threads.html)
28
+ * @typedef {string} ShardingManagerMode
29
+ */
30
+
31
+ /**
32
+ * The options to spawn shards with for a {@link ShardingManager}.
33
+ * @typedef {Object} ShardingManagerOptions
34
+ * @property {string|number} [totalShards='auto'] Number of total shards of all shard managers or "auto"
35
+ * @property {string|number[]} [shardList='auto'] List of shards to spawn or "auto"
36
+ * @property {ShardingManagerMode} [mode='process'] Which mode to use for shards
37
+ * @property {boolean} [respawn=true] Whether shards should automatically respawn upon exiting
38
+ * @property {string[]} [shardArgs=[]] Arguments to pass to the shard script when spawning
39
+ * (only available when mode is set to 'process')
40
+ * @property {string[]} [execArgv=[]] Arguments to pass to the shard script executable when spawning
41
+ * (only available when mode is set to 'process')
42
+ * @property {string} [token] Token to use for automatic shard count and passing to shards
43
+ */
44
+
45
+ /**
46
+ * @param {string} file Path to your shard script file
47
+ * @param {ShardingManagerOptions} [options] Options for the sharding manager
48
+ */
49
+ constructor(file, options = {}) {
50
+ super();
51
+ options = Util.mergeDefault(
52
+ {
53
+ totalShards: 'auto',
54
+ mode: 'process',
55
+ respawn: true,
56
+ shardArgs: [],
57
+ execArgv: [],
58
+ token: process.env.DISCORD_TOKEN,
59
+ },
60
+ options,
61
+ );
62
+
63
+ /**
64
+ * Path to the shard script file
65
+ * @type {string}
66
+ */
67
+ this.file = file;
68
+ if (!file) throw new Error('CLIENT_INVALID_OPTION', 'File', 'specified.');
69
+ if (!path.isAbsolute(file)) this.file = path.resolve(process.cwd(), file);
70
+ const stats = fs.statSync(this.file);
71
+ if (!stats.isFile()) throw new Error('CLIENT_INVALID_OPTION', 'File', 'a file');
72
+
73
+ /**
74
+ * List of shards this sharding manager spawns
75
+ * @type {string|number[]}
76
+ */
77
+ this.shardList = options.shardList ?? 'auto';
78
+ if (this.shardList !== 'auto') {
79
+ if (!Array.isArray(this.shardList)) {
80
+ throw new TypeError('CLIENT_INVALID_OPTION', 'shardList', 'an array.');
81
+ }
82
+ this.shardList = [...new Set(this.shardList)];
83
+ if (this.shardList.length < 1) throw new RangeError('CLIENT_INVALID_OPTION', 'shardList', 'at least 1 id.');
84
+ if (
85
+ this.shardList.some(
86
+ shardId => typeof shardId !== 'number' || isNaN(shardId) || !Number.isInteger(shardId) || shardId < 0,
87
+ )
88
+ ) {
89
+ throw new TypeError('CLIENT_INVALID_OPTION', 'shardList', 'an array of positive integers.');
90
+ }
91
+ }
92
+
93
+ /**
94
+ * Amount of shards that all sharding managers spawn in total
95
+ * @type {number}
96
+ */
97
+ this.totalShards = options.totalShards || 'auto';
98
+ if (this.totalShards !== 'auto') {
99
+ if (typeof this.totalShards !== 'number' || isNaN(this.totalShards)) {
100
+ throw new TypeError('CLIENT_INVALID_OPTION', 'Amount of shards', 'a number.');
101
+ }
102
+ if (this.totalShards < 1) throw new RangeError('CLIENT_INVALID_OPTION', 'Amount of shards', 'at least 1.');
103
+ if (!Number.isInteger(this.totalShards)) {
104
+ throw new RangeError('CLIENT_INVALID_OPTION', 'Amount of shards', 'an integer.');
105
+ }
106
+ }
107
+
108
+ /**
109
+ * Mode for shards to spawn with
110
+ * @type {ShardingManagerMode}
111
+ */
112
+ this.mode = options.mode;
113
+ if (this.mode !== 'process' && this.mode !== 'worker') {
114
+ throw new RangeError('CLIENT_INVALID_OPTION', 'Sharding mode', '"process" or "worker"');
115
+ }
116
+
117
+ /**
118
+ * Whether shards should automatically respawn upon exiting
119
+ * @type {boolean}
120
+ */
121
+ this.respawn = options.respawn;
122
+
123
+ /**
124
+ * An array of arguments to pass to shards (only when {@link ShardingManager#mode} is `process`)
125
+ * @type {string[]}
126
+ */
127
+ this.shardArgs = options.shardArgs;
128
+
129
+ /**
130
+ * An array of arguments to pass to the executable (only when {@link ShardingManager#mode} is `process`)
131
+ * @type {string[]}
132
+ */
133
+ this.execArgv = options.execArgv;
134
+
135
+ /**
136
+ * Token to use for obtaining the automatic shard count, and passing to shards
137
+ * @type {?string}
138
+ */
139
+ this.token = options.token?.replace(/^Bot\s*/i, '') ?? null;
140
+
141
+ /**
142
+ * A collection of shards that this manager has spawned
143
+ * @type {Collection<number, Shard>}
144
+ */
145
+ this.shards = new Collection();
146
+
147
+ process.env.SHARDING_MANAGER = true;
148
+ process.env.SHARDING_MANAGER_MODE = this.mode;
149
+ process.env.DISCORD_TOKEN = this.token;
150
+ }
151
+
152
+ /**
153
+ * Creates a single shard.
154
+ * <warn>Using this method is usually not necessary if you use the spawn method.</warn>
155
+ * @param {number} [id=this.shards.size] Id of the shard to create
156
+ * <info>This is usually not necessary to manually specify.</info>
157
+ * @returns {Shard} Note that the created shard needs to be explicitly spawned using its spawn method.
158
+ */
159
+ createShard(id = this.shards.size) {
160
+ const shard = new Shard(this, id);
161
+ this.shards.set(id, shard);
162
+ /**
163
+ * Emitted upon creating a shard.
164
+ * @event ShardingManager#shardCreate
165
+ * @param {Shard} shard Shard that was created
166
+ */
167
+ this.emit('shardCreate', shard);
168
+ return shard;
169
+ }
170
+
171
+ /**
172
+ * Options used to spawn multiple shards.
173
+ * @typedef {Object} MultipleShardSpawnOptions
174
+ * @property {number|string} [amount=this.totalShards] Number of shards to spawn
175
+ * @property {number} [delay=5500] How long to wait in between spawning each shard (in milliseconds)
176
+ * @property {number} [timeout=30000] The amount in milliseconds to wait until the {@link Client} has become ready
177
+ */
178
+
179
+ /**
180
+ * Spawns multiple shards.
181
+ * @param {MultipleShardSpawnOptions} [options] Options for spawning shards
182
+ * @returns {Promise<Collection<number, Shard>>}
183
+ */
184
+ async spawn({ amount = this.totalShards, delay = 5500, timeout = 30_000 } = {}) {
185
+ // Obtain/verify the number of shards to spawn
186
+ if (amount === 'auto') {
187
+ amount = 1;
188
+ } else {
189
+ if (typeof amount !== 'number' || isNaN(amount)) {
190
+ throw new TypeError('CLIENT_INVALID_OPTION', 'Amount of shards', 'a number.');
191
+ }
192
+ if (amount < 1) throw new RangeError('CLIENT_INVALID_OPTION', 'Amount of shards', 'at least 1.');
193
+ if (!Number.isInteger(amount)) {
194
+ throw new TypeError('CLIENT_INVALID_OPTION', 'Amount of shards', 'an integer.');
195
+ }
196
+ }
197
+
198
+ // Make sure this many shards haven't already been spawned
199
+ if (this.shards.size >= amount) throw new Error('SHARDING_ALREADY_SPAWNED', this.shards.size);
200
+ if (this.shardList === 'auto' || this.totalShards === 'auto' || this.totalShards !== amount) {
201
+ this.shardList = [...Array(amount).keys()];
202
+ }
203
+ if (this.totalShards === 'auto' || this.totalShards !== amount) {
204
+ this.totalShards = amount;
205
+ }
206
+
207
+ if (this.shardList.some(shardId => shardId >= amount)) {
208
+ throw new RangeError(
209
+ 'CLIENT_INVALID_OPTION',
210
+ 'Amount of shards',
211
+ 'bigger than the highest shardId in the shardList option.',
212
+ );
213
+ }
214
+
215
+ // Spawn the shards
216
+ for (const shardId of this.shardList) {
217
+ const promises = [];
218
+ const shard = this.createShard(shardId);
219
+ promises.push(shard.spawn(timeout));
220
+ if (delay > 0 && this.shards.size !== this.shardList.length) promises.push(sleep(delay));
221
+ await Promise.all(promises); // eslint-disable-line no-await-in-loop
222
+ }
223
+
224
+ return this.shards;
225
+ }
226
+
227
+ /**
228
+ * Sends a message to all shards.
229
+ * @param {*} message Message to be sent to the shards
230
+ * @returns {Promise<Shard[]>}
231
+ */
232
+ broadcast(message) {
233
+ const promises = [];
234
+ for (const shard of this.shards.values()) promises.push(shard.send(message));
235
+ return Promise.all(promises);
236
+ }
237
+
238
+ /**
239
+ * Options for {@link ShardingManager#broadcastEval} and {@link ShardClientUtil#broadcastEval}.
240
+ * @typedef {Object} BroadcastEvalOptions
241
+ * @property {number} [shard] Shard to run script on, all if undefined
242
+ * @property {*} [context] The JSON-serializable values to call the script with
243
+ */
244
+
245
+ /**
246
+ * Evaluates a script on all shards, or a given shard, in the context of the {@link Client}s.
247
+ * @param {Function} script JavaScript to run on each shard
248
+ * @param {BroadcastEvalOptions} [options={}] The options for the broadcast
249
+ * @returns {Promise<*|Array<*>>} Results of the script execution
250
+ */
251
+ async broadcastEval(script, options = {}) {
252
+ if (typeof script !== 'function') throw new TypeError('SHARDING_INVALID_EVAL_BROADCAST');
253
+ return this._performOnShards('eval', [`(${script})(this, ${JSON.stringify(options.context)})`], options.shard);
254
+ }
255
+
256
+ /**
257
+ * Fetches a client property value of each shard, or a given shard.
258
+ * @param {string} prop Name of the client property to get, using periods for nesting
259
+ * @param {number} [shard] Shard to fetch property from, all if undefined
260
+ * @returns {Promise<*|Array<*>>}
261
+ * @example
262
+ * manager.fetchClientValues('guilds.cache.size')
263
+ * .then(results => console.log(`${results.reduce((prev, val) => prev + val, 0)} total guilds`))
264
+ * .catch(console.error);
265
+ */
266
+ fetchClientValues(prop, shard) {
267
+ return this._performOnShards('fetchClientValue', [prop], shard);
268
+ }
269
+
270
+ /**
271
+ * Runs a method with given arguments on all shards, or a given shard.
272
+ * @param {string} method Method name to run on each shard
273
+ * @param {Array<*>} args Arguments to pass through to the method call
274
+ * @param {number} [shard] Shard to run on, all if undefined
275
+ * @returns {Promise<*|Array<*>>} Results of the method execution
276
+ * @private
277
+ */
278
+ async _performOnShards(method, args, shard) {
279
+ if (this.shards.size === 0) throw new Error('SHARDING_NO_SHARDS');
280
+
281
+ if (typeof shard === 'number') {
282
+ if (this.shards.has(shard)) return this.shards.get(shard)[method](...args);
283
+ throw new Error('SHARDING_SHARD_NOT_FOUND', shard);
284
+ }
285
+
286
+ if (this.shards.size !== this.shardList.length) throw new Error('SHARDING_IN_PROCESS');
287
+
288
+ const promises = [];
289
+ for (const sh of this.shards.values()) promises.push(sh[method](...args));
290
+ return Promise.all(promises);
291
+ }
292
+
293
+ /**
294
+ * Options used to respawn all shards.
295
+ * @typedef {Object} MultipleShardRespawnOptions
296
+ * @property {number} [shardDelay=5000] How long to wait between shards (in milliseconds)
297
+ * @property {number} [respawnDelay=500] How long to wait between killing a shard's process and restarting it
298
+ * (in milliseconds)
299
+ * @property {number} [timeout=30000] The amount in milliseconds to wait for a shard to become ready before
300
+ * continuing to another (`-1` or `Infinity` for no wait)
301
+ */
302
+
303
+ /**
304
+ * Kills all running shards and respawns them.
305
+ * @param {MultipleShardRespawnOptions} [options] Options for respawning shards
306
+ * @returns {Promise<Collection<number, Shard>>}
307
+ */
308
+ async respawnAll({ shardDelay = 5_000, respawnDelay = 500, timeout = 30_000 } = {}) {
309
+ let s = 0;
310
+ for (const shard of this.shards.values()) {
311
+ const promises = [shard.respawn({ delay: respawnDelay, timeout })];
312
+ if (++s < this.shards.size && shardDelay > 0) promises.push(sleep(shardDelay));
313
+ await Promise.all(promises); // eslint-disable-line no-await-in-loop
314
+ }
315
+ return this.shards;
316
+ }
317
+ }
318
+
319
+ module.exports = ShardingManager;