rockcord 4.0.0-dev.4

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 (366) hide show
  1. package/LICENSE +674 -0
  2. package/README.md +48 -0
  3. package/package.json +107 -0
  4. package/src/WebSocket.js +39 -0
  5. package/src/client/BaseClient.js +86 -0
  6. package/src/client/Client.js +946 -0
  7. package/src/client/WebhookClient.js +61 -0
  8. package/src/client/actions/Action.js +116 -0
  9. package/src/client/actions/ActionsManager.js +80 -0
  10. package/src/client/actions/ApplicationCommandPermissionsUpdate.js +34 -0
  11. package/src/client/actions/AutoModerationActionExecution.js +27 -0
  12. package/src/client/actions/AutoModerationRuleCreate.js +28 -0
  13. package/src/client/actions/AutoModerationRuleDelete.js +32 -0
  14. package/src/client/actions/AutoModerationRuleUpdate.js +30 -0
  15. package/src/client/actions/ChannelCreate.js +23 -0
  16. package/src/client/actions/ChannelDelete.js +39 -0
  17. package/src/client/actions/ChannelUpdate.js +43 -0
  18. package/src/client/actions/GuildAuditLogEntryCreate.js +29 -0
  19. package/src/client/actions/GuildBanAdd.js +20 -0
  20. package/src/client/actions/GuildBanRemove.js +25 -0
  21. package/src/client/actions/GuildChannelsPositionUpdate.js +21 -0
  22. package/src/client/actions/GuildDelete.js +65 -0
  23. package/src/client/actions/GuildEmojiCreate.js +20 -0
  24. package/src/client/actions/GuildEmojiDelete.js +21 -0
  25. package/src/client/actions/GuildEmojiUpdate.js +20 -0
  26. package/src/client/actions/GuildEmojisUpdate.js +34 -0
  27. package/src/client/actions/GuildIntegrationsUpdate.js +19 -0
  28. package/src/client/actions/GuildMemberRemove.js +33 -0
  29. package/src/client/actions/GuildMemberUpdate.js +44 -0
  30. package/src/client/actions/GuildRoleCreate.js +25 -0
  31. package/src/client/actions/GuildRoleDelete.js +31 -0
  32. package/src/client/actions/GuildRoleUpdate.js +39 -0
  33. package/src/client/actions/GuildRolesPositionUpdate.js +21 -0
  34. package/src/client/actions/GuildScheduledEventCreate.js +27 -0
  35. package/src/client/actions/GuildScheduledEventDelete.js +31 -0
  36. package/src/client/actions/GuildScheduledEventUpdate.js +30 -0
  37. package/src/client/actions/GuildScheduledEventUserAdd.js +32 -0
  38. package/src/client/actions/GuildScheduledEventUserRemove.js +32 -0
  39. package/src/client/actions/GuildStickerCreate.js +20 -0
  40. package/src/client/actions/GuildStickerDelete.js +21 -0
  41. package/src/client/actions/GuildStickerUpdate.js +20 -0
  42. package/src/client/actions/GuildStickersUpdate.js +34 -0
  43. package/src/client/actions/GuildUpdate.js +33 -0
  44. package/src/client/actions/InviteCreate.js +28 -0
  45. package/src/client/actions/InviteDelete.js +30 -0
  46. package/src/client/actions/MessageCreate.js +50 -0
  47. package/src/client/actions/MessageDelete.js +32 -0
  48. package/src/client/actions/MessageDeleteBulk.js +46 -0
  49. package/src/client/actions/MessagePollVoteAdd.js +33 -0
  50. package/src/client/actions/MessagePollVoteRemove.js +33 -0
  51. package/src/client/actions/MessageReactionAdd.js +68 -0
  52. package/src/client/actions/MessageReactionRemove.js +50 -0
  53. package/src/client/actions/MessageReactionRemoveAll.js +33 -0
  54. package/src/client/actions/MessageReactionRemoveEmoji.js +28 -0
  55. package/src/client/actions/MessageUpdate.js +26 -0
  56. package/src/client/actions/PresenceUpdate.js +50 -0
  57. package/src/client/actions/StageInstanceCreate.js +28 -0
  58. package/src/client/actions/StageInstanceDelete.js +33 -0
  59. package/src/client/actions/StageInstanceUpdate.js +30 -0
  60. package/src/client/actions/ThreadCreate.js +24 -0
  61. package/src/client/actions/ThreadDelete.js +32 -0
  62. package/src/client/actions/ThreadListSync.js +59 -0
  63. package/src/client/actions/ThreadMemberUpdate.js +30 -0
  64. package/src/client/actions/ThreadMembersUpdate.js +34 -0
  65. package/src/client/actions/TypingStart.js +29 -0
  66. package/src/client/actions/UserUpdate.js +35 -0
  67. package/src/client/actions/VoiceStateUpdate.js +50 -0
  68. package/src/client/actions/WebhooksUpdate.js +20 -0
  69. package/src/client/voice/ClientVoiceManager.js +151 -0
  70. package/src/client/voice/VoiceConnection.js +1295 -0
  71. package/src/client/voice/dispatcher/AnnexBDispatcher.js +136 -0
  72. package/src/client/voice/dispatcher/AudioDispatcher.js +145 -0
  73. package/src/client/voice/dispatcher/BaseDispatcher.js +473 -0
  74. package/src/client/voice/dispatcher/VPxDispatcher.js +58 -0
  75. package/src/client/voice/dispatcher/VideoDispatcher.js +68 -0
  76. package/src/client/voice/networking/DAVE.js +184 -0
  77. package/src/client/voice/networking/VoiceUDPClient.js +190 -0
  78. package/src/client/voice/networking/VoiceWebSocket.js +366 -0
  79. package/src/client/voice/player/MediaPlayer.js +321 -0
  80. package/src/client/voice/player/processing/AnnexBNalSplitter.js +267 -0
  81. package/src/client/voice/player/processing/IvfSplitter.js +106 -0
  82. package/src/client/voice/player/processing/PCMInsertSilence.js +37 -0
  83. package/src/client/voice/receiver/PacketHandler.js +329 -0
  84. package/src/client/voice/receiver/Receiver.js +115 -0
  85. package/src/client/voice/receiver/Recorder.js +197 -0
  86. package/src/client/voice/util/Function.js +122 -0
  87. package/src/client/voice/util/PlayInterface.js +122 -0
  88. package/src/client/voice/util/Secretbox.js +64 -0
  89. package/src/client/voice/util/Silence.js +16 -0
  90. package/src/client/voice/util/Socket.js +68 -0
  91. package/src/client/voice/util/VideoFrames.js +183 -0
  92. package/src/client/voice/util/VolumeInterface.js +105 -0
  93. package/src/client/websocket/WebSocketManager.js +405 -0
  94. package/src/client/websocket/WebSocketShard.js +908 -0
  95. package/src/client/websocket/handlers/APPLICATION_COMMAND_CREATE.js +18 -0
  96. package/src/client/websocket/handlers/APPLICATION_COMMAND_DELETE.js +20 -0
  97. package/src/client/websocket/handlers/APPLICATION_COMMAND_PERMISSIONS_UPDATE.js +5 -0
  98. package/src/client/websocket/handlers/APPLICATION_COMMAND_UPDATE.js +20 -0
  99. package/src/client/websocket/handlers/AUTO_MODERATION_ACTION_EXECUTION.js +5 -0
  100. package/src/client/websocket/handlers/AUTO_MODERATION_RULE_CREATE.js +5 -0
  101. package/src/client/websocket/handlers/AUTO_MODERATION_RULE_DELETE.js +5 -0
  102. package/src/client/websocket/handlers/AUTO_MODERATION_RULE_UPDATE.js +5 -0
  103. package/src/client/websocket/handlers/CALL_CREATE.js +14 -0
  104. package/src/client/websocket/handlers/CALL_DELETE.js +11 -0
  105. package/src/client/websocket/handlers/CALL_UPDATE.js +11 -0
  106. package/src/client/websocket/handlers/CHANNEL_CREATE.js +5 -0
  107. package/src/client/websocket/handlers/CHANNEL_DELETE.js +5 -0
  108. package/src/client/websocket/handlers/CHANNEL_PINS_UPDATE.js +22 -0
  109. package/src/client/websocket/handlers/CHANNEL_RECIPIENT_ADD.js +19 -0
  110. package/src/client/websocket/handlers/CHANNEL_RECIPIENT_REMOVE.js +16 -0
  111. package/src/client/websocket/handlers/CHANNEL_UPDATE.js +16 -0
  112. package/src/client/websocket/handlers/GUILD_AUDIT_LOG_ENTRY_CREATE.js +5 -0
  113. package/src/client/websocket/handlers/GUILD_BAN_ADD.js +5 -0
  114. package/src/client/websocket/handlers/GUILD_BAN_REMOVE.js +5 -0
  115. package/src/client/websocket/handlers/GUILD_CREATE.js +52 -0
  116. package/src/client/websocket/handlers/GUILD_DELETE.js +5 -0
  117. package/src/client/websocket/handlers/GUILD_EMOJIS_UPDATE.js +5 -0
  118. package/src/client/websocket/handlers/GUILD_INTEGRATIONS_UPDATE.js +5 -0
  119. package/src/client/websocket/handlers/GUILD_MEMBERS_CHUNK.js +39 -0
  120. package/src/client/websocket/handlers/GUILD_MEMBER_ADD.js +20 -0
  121. package/src/client/websocket/handlers/GUILD_MEMBER_REMOVE.js +5 -0
  122. package/src/client/websocket/handlers/GUILD_MEMBER_UPDATE.js +5 -0
  123. package/src/client/websocket/handlers/GUILD_ROLE_CREATE.js +5 -0
  124. package/src/client/websocket/handlers/GUILD_ROLE_DELETE.js +5 -0
  125. package/src/client/websocket/handlers/GUILD_ROLE_UPDATE.js +5 -0
  126. package/src/client/websocket/handlers/GUILD_SCHEDULED_EVENT_CREATE.js +5 -0
  127. package/src/client/websocket/handlers/GUILD_SCHEDULED_EVENT_DELETE.js +5 -0
  128. package/src/client/websocket/handlers/GUILD_SCHEDULED_EVENT_UPDATE.js +5 -0
  129. package/src/client/websocket/handlers/GUILD_SCHEDULED_EVENT_USER_ADD.js +5 -0
  130. package/src/client/websocket/handlers/GUILD_SCHEDULED_EVENT_USER_REMOVE.js +5 -0
  131. package/src/client/websocket/handlers/GUILD_STICKERS_UPDATE.js +5 -0
  132. package/src/client/websocket/handlers/GUILD_UPDATE.js +5 -0
  133. package/src/client/websocket/handlers/INTERACTION_MODAL_CREATE.js +12 -0
  134. package/src/client/websocket/handlers/INVITE_CREATE.js +5 -0
  135. package/src/client/websocket/handlers/INVITE_DELETE.js +5 -0
  136. package/src/client/websocket/handlers/MESSAGE_CREATE.js +5 -0
  137. package/src/client/websocket/handlers/MESSAGE_DELETE.js +5 -0
  138. package/src/client/websocket/handlers/MESSAGE_DELETE_BULK.js +5 -0
  139. package/src/client/websocket/handlers/MESSAGE_POLL_VOTE_ADD.js +5 -0
  140. package/src/client/websocket/handlers/MESSAGE_POLL_VOTE_REMOVE.js +5 -0
  141. package/src/client/websocket/handlers/MESSAGE_REACTION_ADD.js +5 -0
  142. package/src/client/websocket/handlers/MESSAGE_REACTION_REMOVE.js +5 -0
  143. package/src/client/websocket/handlers/MESSAGE_REACTION_REMOVE_ALL.js +5 -0
  144. package/src/client/websocket/handlers/MESSAGE_REACTION_REMOVE_EMOJI.js +5 -0
  145. package/src/client/websocket/handlers/MESSAGE_UPDATE.js +16 -0
  146. package/src/client/websocket/handlers/PRESENCE_UPDATE.js +5 -0
  147. package/src/client/websocket/handlers/READY.js +121 -0
  148. package/src/client/websocket/handlers/RELATIONSHIP_ADD.js +19 -0
  149. package/src/client/websocket/handlers/RELATIONSHIP_REMOVE.js +17 -0
  150. package/src/client/websocket/handlers/RELATIONSHIP_UPDATE.js +41 -0
  151. package/src/client/websocket/handlers/RESUMED.js +14 -0
  152. package/src/client/websocket/handlers/STAGE_INSTANCE_CREATE.js +5 -0
  153. package/src/client/websocket/handlers/STAGE_INSTANCE_DELETE.js +5 -0
  154. package/src/client/websocket/handlers/STAGE_INSTANCE_UPDATE.js +5 -0
  155. package/src/client/websocket/handlers/THREAD_CREATE.js +5 -0
  156. package/src/client/websocket/handlers/THREAD_DELETE.js +5 -0
  157. package/src/client/websocket/handlers/THREAD_LIST_SYNC.js +5 -0
  158. package/src/client/websocket/handlers/THREAD_MEMBERS_UPDATE.js +5 -0
  159. package/src/client/websocket/handlers/THREAD_MEMBER_UPDATE.js +5 -0
  160. package/src/client/websocket/handlers/THREAD_UPDATE.js +16 -0
  161. package/src/client/websocket/handlers/TYPING_START.js +5 -0
  162. package/src/client/websocket/handlers/USER_GUILD_SETTINGS_UPDATE.js +6 -0
  163. package/src/client/websocket/handlers/USER_NOTE_UPDATE.js +5 -0
  164. package/src/client/websocket/handlers/USER_REQUIRED_ACTION_UPDATE.js +78 -0
  165. package/src/client/websocket/handlers/USER_SETTINGS_UPDATE.js +5 -0
  166. package/src/client/websocket/handlers/USER_UPDATE.js +5 -0
  167. package/src/client/websocket/handlers/VOICE_CHANNEL_EFFECT_SEND.js +16 -0
  168. package/src/client/websocket/handlers/VOICE_CHANNEL_STATUS_UPDATE.js +12 -0
  169. package/src/client/websocket/handlers/VOICE_SERVER_UPDATE.js +6 -0
  170. package/src/client/websocket/handlers/VOICE_STATE_UPDATE.js +5 -0
  171. package/src/client/websocket/handlers/WEBHOOKS_UPDATE.js +5 -0
  172. package/src/client/websocket/handlers/index.js +84 -0
  173. package/src/errors/DJSError.js +61 -0
  174. package/src/errors/Messages.js +219 -0
  175. package/src/errors/index.js +4 -0
  176. package/src/index.js +218 -0
  177. package/src/managers/ApplicationCommandManager.js +264 -0
  178. package/src/managers/ApplicationCommandPermissionsManager.js +417 -0
  179. package/src/managers/AutoModerationRuleManager.js +296 -0
  180. package/src/managers/BaseGuildEmojiManager.js +80 -0
  181. package/src/managers/BaseManager.js +19 -0
  182. package/src/managers/BillingManager.js +66 -0
  183. package/src/managers/CachedManager.js +71 -0
  184. package/src/managers/ChannelManager.js +148 -0
  185. package/src/managers/ClientUserSettingManager.js +372 -0
  186. package/src/managers/DataManager.js +61 -0
  187. package/src/managers/GuildBanManager.js +250 -0
  188. package/src/managers/GuildChannelManager.js +488 -0
  189. package/src/managers/GuildEmojiManager.js +171 -0
  190. package/src/managers/GuildEmojiRoleManager.js +118 -0
  191. package/src/managers/GuildForumThreadManager.js +94 -0
  192. package/src/managers/GuildInviteManager.js +213 -0
  193. package/src/managers/GuildManager.js +338 -0
  194. package/src/managers/GuildMemberManager.js +599 -0
  195. package/src/managers/GuildMemberRoleManager.js +195 -0
  196. package/src/managers/GuildScheduledEventManager.js +314 -0
  197. package/src/managers/GuildSettingManager.js +155 -0
  198. package/src/managers/GuildStickerManager.js +179 -0
  199. package/src/managers/GuildTextThreadManager.js +98 -0
  200. package/src/managers/InteractionManager.js +39 -0
  201. package/src/managers/MessageManager.js +426 -0
  202. package/src/managers/PermissionOverwriteManager.js +164 -0
  203. package/src/managers/PresenceManager.js +71 -0
  204. package/src/managers/ReactionManager.js +67 -0
  205. package/src/managers/ReactionUserManager.js +73 -0
  206. package/src/managers/RelationshipManager.js +278 -0
  207. package/src/managers/RoleManager.js +448 -0
  208. package/src/managers/SessionManager.js +66 -0
  209. package/src/managers/StageInstanceManager.js +162 -0
  210. package/src/managers/ThreadManager.js +175 -0
  211. package/src/managers/ThreadMemberManager.js +186 -0
  212. package/src/managers/UserManager.js +136 -0
  213. package/src/managers/UserNoteManager.js +53 -0
  214. package/src/managers/VoiceStateManager.js +59 -0
  215. package/src/rest/APIRequest.js +149 -0
  216. package/src/rest/APIRouter.js +53 -0
  217. package/src/rest/DiscordAPIError.js +121 -0
  218. package/src/rest/HTTPError.js +64 -0
  219. package/src/rest/RESTManager.js +97 -0
  220. package/src/rest/RateLimitError.js +55 -0
  221. package/src/rest/RequestHandler.js +476 -0
  222. package/src/sharding/Shard.js +476 -0
  223. package/src/sharding/ShardClientUtil.js +279 -0
  224. package/src/sharding/ShardingManager.js +319 -0
  225. package/src/structures/AnonymousGuild.js +98 -0
  226. package/src/structures/ApplicationCommand.js +593 -0
  227. package/src/structures/ApplicationRoleConnectionMetadata.js +48 -0
  228. package/src/structures/AutoModerationActionExecution.js +89 -0
  229. package/src/structures/AutoModerationRule.js +294 -0
  230. package/src/structures/AutocompleteInteraction.js +107 -0
  231. package/src/structures/Base.js +43 -0
  232. package/src/structures/BaseCommandInteraction.js +211 -0
  233. package/src/structures/BaseGuild.js +116 -0
  234. package/src/structures/BaseGuildEmoji.js +56 -0
  235. package/src/structures/BaseGuildTextChannel.js +191 -0
  236. package/src/structures/BaseGuildVoiceChannel.js +241 -0
  237. package/src/structures/BaseMessageComponent.js +181 -0
  238. package/src/structures/ButtonInteraction.js +11 -0
  239. package/src/structures/CallState.js +63 -0
  240. package/src/structures/CategoryChannel.js +85 -0
  241. package/src/structures/Channel.js +284 -0
  242. package/src/structures/ClientPresence.js +77 -0
  243. package/src/structures/ClientUser.js +449 -0
  244. package/src/structures/CommandInteraction.js +41 -0
  245. package/src/structures/CommandInteractionOptionResolver.js +276 -0
  246. package/src/structures/ContainerComponent.js +68 -0
  247. package/src/structures/ContextMenuInteraction.js +65 -0
  248. package/src/structures/DMChannel.js +219 -0
  249. package/src/structures/DirectoryChannel.js +20 -0
  250. package/src/structures/Emoji.js +148 -0
  251. package/src/structures/FileComponent.js +49 -0
  252. package/src/structures/ForumChannel.js +31 -0
  253. package/src/structures/GroupDMChannel.js +394 -0
  254. package/src/structures/Guild.js +1638 -0
  255. package/src/structures/GuildAuditLogs.js +746 -0
  256. package/src/structures/GuildBan.js +59 -0
  257. package/src/structures/GuildBoost.js +108 -0
  258. package/src/structures/GuildChannel.js +470 -0
  259. package/src/structures/GuildEmoji.js +161 -0
  260. package/src/structures/GuildMember.js +639 -0
  261. package/src/structures/GuildPreview.js +191 -0
  262. package/src/structures/GuildPreviewEmoji.js +27 -0
  263. package/src/structures/GuildScheduledEvent.js +536 -0
  264. package/src/structures/GuildTemplate.js +236 -0
  265. package/src/structures/Integration.js +188 -0
  266. package/src/structures/IntegrationApplication.js +96 -0
  267. package/src/structures/Interaction.js +290 -0
  268. package/src/structures/InteractionCollector.js +248 -0
  269. package/src/structures/InteractionWebhook.js +43 -0
  270. package/src/structures/Invite.js +358 -0
  271. package/src/structures/InviteGuild.js +23 -0
  272. package/src/structures/InviteStageInstance.js +86 -0
  273. package/src/structures/MediaChannel.js +11 -0
  274. package/src/structures/MediaGalleryComponent.js +41 -0
  275. package/src/structures/MediaGalleryItem.js +47 -0
  276. package/src/structures/Message.js +1257 -0
  277. package/src/structures/MessageActionRow.js +105 -0
  278. package/src/structures/MessageAttachment.js +216 -0
  279. package/src/structures/MessageButton.js +166 -0
  280. package/src/structures/MessageCollector.js +146 -0
  281. package/src/structures/MessageComponentInteraction.js +120 -0
  282. package/src/structures/MessageContextMenuInteraction.js +20 -0
  283. package/src/structures/MessageEmbed.js +596 -0
  284. package/src/structures/MessageMentions.js +273 -0
  285. package/src/structures/MessagePayload.js +352 -0
  286. package/src/structures/MessageReaction.js +184 -0
  287. package/src/structures/MessageSelectMenu.js +141 -0
  288. package/src/structures/Modal.js +161 -0
  289. package/src/structures/ModalSubmitFieldsResolver.js +53 -0
  290. package/src/structures/ModalSubmitInteraction.js +119 -0
  291. package/src/structures/NewsChannel.js +32 -0
  292. package/src/structures/OAuth2Guild.js +28 -0
  293. package/src/structures/PermissionOverwrites.js +198 -0
  294. package/src/structures/Poll.js +108 -0
  295. package/src/structures/PollAnswer.js +88 -0
  296. package/src/structures/Presence.js +1105 -0
  297. package/src/structures/ReactionCollector.js +229 -0
  298. package/src/structures/ReactionEmoji.js +31 -0
  299. package/src/structures/Role.js +590 -0
  300. package/src/structures/SectionComponent.js +48 -0
  301. package/src/structures/SelectMenuInteraction.js +21 -0
  302. package/src/structures/SeparatorComponent.js +48 -0
  303. package/src/structures/Session.js +81 -0
  304. package/src/structures/StageChannel.js +104 -0
  305. package/src/structures/StageInstance.js +208 -0
  306. package/src/structures/Sticker.js +310 -0
  307. package/src/structures/StickerPack.js +95 -0
  308. package/src/structures/StoreChannel.js +56 -0
  309. package/src/structures/Team.js +118 -0
  310. package/src/structures/TeamMember.js +80 -0
  311. package/src/structures/TextChannel.js +33 -0
  312. package/src/structures/TextDisplayComponent.js +40 -0
  313. package/src/structures/TextInputComponent.js +132 -0
  314. package/src/structures/ThreadChannel.js +605 -0
  315. package/src/structures/ThreadMember.js +105 -0
  316. package/src/structures/ThreadOnlyChannel.js +249 -0
  317. package/src/structures/ThumbnailComponent.js +57 -0
  318. package/src/structures/Typing.js +74 -0
  319. package/src/structures/UnfurledMediaItem.js +29 -0
  320. package/src/structures/User.js +624 -0
  321. package/src/structures/UserContextMenuInteraction.js +29 -0
  322. package/src/structures/VoiceChannel.js +110 -0
  323. package/src/structures/VoiceChannelEffect.js +69 -0
  324. package/src/structures/VoiceRegion.js +53 -0
  325. package/src/structures/VoiceState.js +354 -0
  326. package/src/structures/WebEmbed.js +373 -0
  327. package/src/structures/Webhook.js +478 -0
  328. package/src/structures/WelcomeChannel.js +60 -0
  329. package/src/structures/WelcomeScreen.js +48 -0
  330. package/src/structures/Widget.js +87 -0
  331. package/src/structures/WidgetMember.js +99 -0
  332. package/src/structures/interfaces/Application.js +825 -0
  333. package/src/structures/interfaces/Collector.js +301 -0
  334. package/src/structures/interfaces/InteractionResponses.js +313 -0
  335. package/src/structures/interfaces/TextBasedChannel.js +743 -0
  336. package/src/util/APITypes.js +59 -0
  337. package/src/util/ActivityFlags.js +44 -0
  338. package/src/util/ApplicationFlags.js +76 -0
  339. package/src/util/AttachmentFlags.js +38 -0
  340. package/src/util/BitField.js +182 -0
  341. package/src/util/ChannelFlags.js +45 -0
  342. package/src/util/Constants.js +1927 -0
  343. package/src/util/DataResolver.js +146 -0
  344. package/src/util/Formatters.js +228 -0
  345. package/src/util/GuildMemberFlags.js +43 -0
  346. package/src/util/Intents.js +74 -0
  347. package/src/util/InviteFlags.js +34 -0
  348. package/src/util/LimitedCollection.js +134 -0
  349. package/src/util/MessageFlags.js +63 -0
  350. package/src/util/Options.js +358 -0
  351. package/src/util/Permissions.js +202 -0
  352. package/src/util/PremiumUsageFlags.js +31 -0
  353. package/src/util/PurchasedFlags.js +33 -0
  354. package/src/util/Redact.js +26 -0
  355. package/src/util/RemoteAuth.js +449 -0
  356. package/src/util/RoleFlags.js +37 -0
  357. package/src/util/SnowflakeUtil.js +92 -0
  358. package/src/util/Speaking.js +33 -0
  359. package/src/util/Sweepers.js +466 -0
  360. package/src/util/SystemChannelFlags.js +55 -0
  361. package/src/util/ThreadMemberFlags.js +30 -0
  362. package/src/util/UserFlags.js +104 -0
  363. package/src/util/Util.js +1079 -0
  364. package/typings/enums.d.ts +437 -0
  365. package/typings/index.d.ts +8197 -0
  366. package/typings/rawDataTypes.d.ts +403 -0
@@ -0,0 +1,476 @@
1
+ 'use strict';
2
+
3
+ const { setTimeout: sleep } = require('node:timers/promises');
4
+ const { AsyncQueue } = require('@sapphire/async-queue');
5
+ const DiscordAPIError = require('./DiscordAPIError');
6
+ const HTTPError = require('./HTTPError');
7
+ const RateLimitError = require('./RateLimitError');
8
+ const {
9
+ Events: { DEBUG, RATE_LIMIT, INVALID_REQUEST_WARNING, API_RESPONSE, API_REQUEST },
10
+ } = require('../util/Constants');
11
+ const redact = require('../util/Redact');
12
+
13
+ const captchaMessage = [
14
+ 'incorrect-captcha',
15
+ 'response-already-used',
16
+ 'captcha-required',
17
+ 'invalid-input-response',
18
+ 'invalid-response',
19
+ 'You need to update your app',
20
+ 'response-already-used-error',
21
+ 'rqkey-mismatch',
22
+ 'sitekey-secret-mismatch',
23
+ ];
24
+
25
+ function parseResponse(res) {
26
+ if (res.headers.get('content-type')?.startsWith('application/json')) return res.json();
27
+ return res.arrayBuffer();
28
+ }
29
+
30
+ function getAPIOffset(serverDate) {
31
+ return new Date(serverDate).getTime() - Date.now();
32
+ }
33
+
34
+ function calculateReset(reset, resetAfter, serverDate) {
35
+ // Use direct reset time when available, server date becomes irrelevant in this case
36
+ if (resetAfter) {
37
+ return Date.now() + Number(resetAfter) * 1_000;
38
+ }
39
+ return new Date(Number(reset) * 1_000).getTime() - getAPIOffset(serverDate);
40
+ }
41
+
42
+ /* Invalid request limiting is done on a per-IP basis, not a per-token basis.
43
+ * The best we can do is track invalid counts process-wide (on the theory that
44
+ * users could have multiple bots run from one process) rather than per-bot.
45
+ * Therefore, store these at file scope here rather than in the client's
46
+ * RESTManager object.
47
+ */
48
+ let invalidCount = 0;
49
+ let invalidCountResetTime = null;
50
+
51
+ class RequestHandler {
52
+ constructor(manager) {
53
+ this.manager = manager;
54
+ this.queue = new AsyncQueue();
55
+ this.reset = -1;
56
+ this.remaining = -1;
57
+ this.limit = -1;
58
+ }
59
+
60
+ async push(request) {
61
+ await this.queue.wait();
62
+ try {
63
+ return await this.execute(request);
64
+ } finally {
65
+ this.queue.shift();
66
+ }
67
+ }
68
+
69
+ get globalLimited() {
70
+ return this.manager.globalRemaining <= 0 && Date.now() < this.manager.globalReset;
71
+ }
72
+
73
+ get localLimited() {
74
+ return this.remaining <= 0 && Date.now() < this.reset;
75
+ }
76
+
77
+ get limited() {
78
+ return this.globalLimited || this.localLimited;
79
+ }
80
+
81
+ get _inactive() {
82
+ return this.queue.remaining === 0 && !this.limited;
83
+ }
84
+
85
+ async globalDelayFor(ms) {
86
+ try {
87
+ await sleep(ms, undefined, { signal: this.manager.abortController?.signal, ref: false });
88
+ } finally {
89
+ this.manager.globalDelay = null;
90
+ }
91
+ }
92
+
93
+ /*
94
+ * Determines whether the request should be queued or whether a RateLimitError should be thrown
95
+ */
96
+ async onRateLimit(request, limit, timeout, isGlobal) {
97
+ const { options } = this.manager.client;
98
+ if (!options.rejectOnRateLimit) return;
99
+
100
+ const rateLimitData = {
101
+ timeout,
102
+ limit,
103
+ method: request.method,
104
+ path: redact.path(request.path),
105
+ route: redact.path(request.route),
106
+ global: isGlobal,
107
+ };
108
+ const shouldThrow =
109
+ typeof options.rejectOnRateLimit === 'function'
110
+ ? await options.rejectOnRateLimit(rateLimitData)
111
+ : options.rejectOnRateLimit.some(route => rateLimitData.route.startsWith(route.toLowerCase()));
112
+ if (shouldThrow) {
113
+ throw new RateLimitError(rateLimitData);
114
+ }
115
+ }
116
+
117
+ async execute(request, captchaKey, captchaToken) {
118
+ request.transportRetries ??= 0;
119
+ request.captchaRetries ??= 0;
120
+ request.mfaRetries ??= 0;
121
+ if (this.manager.destroyed) throw new Error('REST manager has been destroyed');
122
+ /*
123
+ * After calculations have been done, pre-emptively stop further requests
124
+ * Potentially loop until this task can run if e.g. the global rate limit is hit twice
125
+ */
126
+ while (this.limited) {
127
+ const isGlobal = this.globalLimited;
128
+ let limit, timeout, delayPromise;
129
+
130
+ if (isGlobal) {
131
+ // Set the variables based on the global rate limit
132
+ limit = this.manager.globalLimit;
133
+ timeout = this.manager.globalReset + this.manager.client.options.restTimeOffset - Date.now();
134
+ } else {
135
+ // Set the variables based on the route-specific rate limit
136
+ limit = this.limit;
137
+ timeout = this.reset + this.manager.client.options.restTimeOffset - Date.now();
138
+ }
139
+
140
+ if (this.manager.client.listenerCount(RATE_LIMIT)) {
141
+ /**
142
+ * Emitted when the client hits a rate limit while making a request
143
+ * @event BaseClient#rateLimit
144
+ * @param {RateLimitData} rateLimitData Object containing the rate limit info
145
+ */
146
+ this.manager.client.emit(RATE_LIMIT, {
147
+ timeout,
148
+ limit,
149
+ method: request.method,
150
+ path: redact.path(request.path),
151
+ route: redact.path(request.route),
152
+ global: isGlobal,
153
+ });
154
+ }
155
+
156
+ // Decide before allocating a delay: a rejected limit must not leave an unused promise/timer.
157
+ await this.onRateLimit(request, limit, timeout, isGlobal); // eslint-disable-line no-await-in-loop
158
+
159
+ if (isGlobal) {
160
+ // If this is the first task to reach the global timeout, set the global delay
161
+ if (!this.manager.globalDelay) {
162
+ // The global delay function should clear the global delay state when it is resolved
163
+ this.manager.globalDelay = this.globalDelayFor(timeout);
164
+ }
165
+ delayPromise = this.manager.globalDelay;
166
+ } else {
167
+ delayPromise = sleep(timeout, undefined, { signal: this.manager.abortController?.signal });
168
+ }
169
+
170
+ // Wait for the timeout to expire in order to avoid an actual 429
171
+ await delayPromise; // eslint-disable-line no-await-in-loop
172
+ }
173
+
174
+ // As the request goes out, update the global usage information
175
+ if (!this.manager.globalReset || this.manager.globalReset < Date.now()) {
176
+ this.manager.globalReset = Date.now() + 1_000;
177
+ this.manager.globalRemaining = this.manager.globalLimit;
178
+ }
179
+ this.manager.globalRemaining--;
180
+
181
+ /**
182
+ * Represents a request that will or has been made to the Discord API
183
+ * @typedef {Object} APIRequest
184
+ * @property {HTTPMethod} method The HTTP method used in this request
185
+ * @property {string} path The full path used to make the request
186
+ * @property {string} route The API route identifying the rate limit for this request
187
+ * @property {Object} options Additional options for this request
188
+ * @property {number} retries The number of times this request has been attempted
189
+ */
190
+
191
+ if (this.manager.client.listenerCount(API_REQUEST)) {
192
+ /**
193
+ * Emitted before every API request.
194
+ * This event can emit several times for the same request, e.g. when hitting a rate limit.
195
+ * <info>This is an informational event that is emitted quite frequently,
196
+ * it is highly recommended to check `request.path` to filter the data.</info>
197
+ * @event BaseClient#apiRequest
198
+ * @param {APIRequest} request The request that is about to be sent
199
+ */
200
+ this.manager.client.emit(API_REQUEST, {
201
+ method: request.method,
202
+ path: redact.path(request.path),
203
+ route: redact.path(request.route),
204
+ options: redact(request.options),
205
+ retries: request.retries,
206
+ });
207
+ }
208
+
209
+ // Perform the request
210
+ let res;
211
+ try {
212
+ res = await request.make(captchaKey, captchaToken);
213
+ } catch (error) {
214
+ // Retry the specified number of times for request abortions
215
+ if (request.transportRetries >= this.manager.client.options.retryLimit || this.manager.destroyed) {
216
+ throw new HTTPError(error.message, error.constructor.name, error.status, request);
217
+ }
218
+
219
+ request.retries++;
220
+ request.transportRetries++;
221
+ return this.execute(request, captchaKey, captchaToken);
222
+ }
223
+
224
+ if (this.manager.client.listenerCount(API_RESPONSE)) {
225
+ /**
226
+ * Emitted after every API request has received a response.
227
+ * This event does not necessarily correlate to completion of the request, e.g. when hitting a rate limit.
228
+ * <info>This is an informational event that is emitted quite frequently,
229
+ * it is highly recommended to check `request.path` to filter the data.</info>
230
+ * @event BaseClient#apiResponse
231
+ * @param {APIRequest} request The request that triggered this response
232
+ * @param {Response} response The response received from the Discord API
233
+ */
234
+ this.manager.client.emit(
235
+ API_RESPONSE,
236
+ {
237
+ method: request.method,
238
+ path: redact.path(request.path),
239
+ route: redact.path(request.route),
240
+ options: redact(request.options),
241
+ retries: request.retries,
242
+ },
243
+ res.clone(),
244
+ );
245
+ }
246
+
247
+ let sublimitTimeout;
248
+ if (res.headers) {
249
+ const serverDate = res.headers.get('date');
250
+ const limit = res.headers.get('x-ratelimit-limit');
251
+ const remaining = res.headers.get('x-ratelimit-remaining');
252
+ const reset = res.headers.get('x-ratelimit-reset');
253
+ const resetAfter = res.headers.get('x-ratelimit-reset-after');
254
+ this.limit = limit ? Number(limit) : Infinity;
255
+ this.remaining = remaining ? Number(remaining) : 1;
256
+
257
+ this.reset = reset || resetAfter ? calculateReset(reset, resetAfter, serverDate) : Date.now();
258
+
259
+ // https://github.com/discord/discord-api-docs/issues/182
260
+ if (!resetAfter && request.route.includes('reactions')) {
261
+ this.reset = new Date(serverDate).getTime() - getAPIOffset(serverDate) + 250;
262
+ }
263
+
264
+ // Handle retryAfter, which means we have actually hit a rate limit
265
+ let retryAfter = res.headers.get('retry-after');
266
+ retryAfter = retryAfter ? Number(retryAfter) * 1_000 : -1;
267
+ if (retryAfter > 0) {
268
+ // If the global rate limit header is set, that means we hit the global rate limit
269
+ if (res.headers.get('x-ratelimit-global')) {
270
+ this.manager.globalRemaining = 0;
271
+ this.manager.globalReset = Date.now() + retryAfter;
272
+ } else if (!this.localLimited) {
273
+ /*
274
+ * This is a sublimit (e.g. 2 channel name changes/10 minutes) since the headers don't indicate a
275
+ * route-wide rate limit. Don't update remaining or reset to avoid rate limiting the whole
276
+ * endpoint, just set a reset time on the request itself to avoid retrying too soon.
277
+ */
278
+ sublimitTimeout = retryAfter;
279
+ }
280
+ }
281
+ }
282
+
283
+ // Count the invalid requests
284
+ if (res.status === 401 || res.status === 403 || res.status === 429) {
285
+ if (!invalidCountResetTime || invalidCountResetTime < Date.now()) {
286
+ invalidCountResetTime = Date.now() + 1_000 * 60 * 10;
287
+ invalidCount = 0;
288
+ }
289
+ invalidCount++;
290
+
291
+ const emitInvalid =
292
+ this.manager.client.listenerCount(INVALID_REQUEST_WARNING) &&
293
+ this.manager.client.options.invalidRequestWarningInterval > 0 &&
294
+ invalidCount % this.manager.client.options.invalidRequestWarningInterval === 0;
295
+ if (emitInvalid) {
296
+ /**
297
+ * @typedef {Object} InvalidRequestWarningData
298
+ * @property {number} count Number of invalid requests that have been made in the window
299
+ * @property {number} remainingTime Time in milliseconds remaining before the count resets
300
+ */
301
+
302
+ /**
303
+ * Emitted periodically when the process sends invalid requests to let users avoid the
304
+ * 10k invalid requests in 10 minutes threshold that causes a ban
305
+ * @event BaseClient#invalidRequestWarning
306
+ * @param {InvalidRequestWarningData} invalidRequestWarningData Object containing the invalid request info
307
+ */
308
+ this.manager.client.emit(INVALID_REQUEST_WARNING, {
309
+ count: invalidCount,
310
+ remainingTime: invalidCountResetTime - Date.now(),
311
+ });
312
+ }
313
+ }
314
+
315
+ // Handle 2xx and 3xx responses
316
+ if (res.ok) {
317
+ // Nothing wrong with the request, proceed with the next one
318
+ return parseResponse(res);
319
+ }
320
+
321
+ // Handle 4xx responses
322
+ if (res.status >= 400 && res.status < 500) {
323
+ // Handle ratelimited requests
324
+ if (res.status === 429) {
325
+ const isGlobal = this.globalLimited;
326
+ let limit, timeout;
327
+ if (isGlobal) {
328
+ // Set the variables based on the global rate limit
329
+ limit = this.manager.globalLimit;
330
+ timeout = this.manager.globalReset + this.manager.client.options.restTimeOffset - Date.now();
331
+ } else {
332
+ // Set the variables based on the route-specific rate limit
333
+ limit = this.limit;
334
+ timeout = this.reset + this.manager.client.options.restTimeOffset - Date.now();
335
+ }
336
+
337
+ this.manager.client.emit(
338
+ DEBUG,
339
+ `[Request Handler] Hit a 429 while executing a request.
340
+ Global : ${isGlobal}
341
+ Method : ${request.method}
342
+ Path : ${redact.path(request.path)}
343
+ Route : ${redact.path(request.route)}
344
+ Limit : ${limit}
345
+ Timeout : ${timeout}ms
346
+ Sublimit: ${sublimitTimeout ? `${sublimitTimeout}ms` : 'None'}`,
347
+ );
348
+
349
+ await this.onRateLimit(request, limit, timeout, isGlobal);
350
+
351
+ // If caused by a sublimit, wait it out here so other requests on the route can be handled
352
+ if (sublimitTimeout) {
353
+ await sleep(sublimitTimeout, undefined, { signal: this.manager.abortController?.signal });
354
+ }
355
+ return this.execute(request, captchaKey, captchaToken);
356
+ }
357
+
358
+ // Handle possible malformed requests
359
+ let data;
360
+ try {
361
+ data = await parseResponse(res);
362
+ // Captcha
363
+ if (
364
+ data?.captcha_service &&
365
+ typeof this.manager.client.options.captchaSolver == 'function' &&
366
+ request.captchaRetries < this.manager.client.options.captchaRetryLimit &&
367
+ Array.isArray(data.captcha_key) &&
368
+ captchaMessage.some(s => data.captcha_key.some(key => String(key).includes(s)))
369
+ ) {
370
+ // Retry the request after a captcha is solved
371
+ this.manager.client.emit(
372
+ DEBUG,
373
+ `[Request Handler] Hit a captcha while executing a request (${data.captcha_key.join(', ')})
374
+ Method : ${request.method}
375
+ Path : ${redact.path(request.path)}
376
+ Route : ${redact.path(request.route)}
377
+ Sitekey : ${data.captcha_sitekey}
378
+ rqToken : [REDACTED]`,
379
+ );
380
+ const solved = await this.manager.client.options.captchaSolver(data, request.fullUserAgent);
381
+ const captcha = typeof solved === 'string' ? solved : solved?.token ?? solved?.data;
382
+ if (typeof captcha !== 'string' || !captcha) throw new Error('Captcha solver must return a non-empty token');
383
+ this.manager.client.emit(
384
+ DEBUG,
385
+ `[Request Handler] Captcha details:
386
+ Method : ${request.method}
387
+ Path : ${redact.path(request.path)}
388
+ Route : ${redact.path(request.route)}
389
+ Key : [REDACTED]
390
+ rqToken : [REDACTED]`,
391
+ );
392
+ request.retries++;
393
+ request.captchaRetries++;
394
+ return this.execute(request, captcha, data.captcha_rqtoken);
395
+ }
396
+ // Two factor handling
397
+ if (data?.code && data.code == 60003 && request.options.auth !== false && request.mfaRetries < 1) {
398
+ // https://gist.github.com/Dziurwa14/de2498e5ee28d2089f095aa037957cbb
399
+ // 60003: Two factor is required for this operation
400
+ /**
401
+ * {
402
+ * message: "Two factor is required for this operation";
403
+ * code: 60003;
404
+ * mfa: {
405
+ * ticket: string;
406
+ * methods: {
407
+ * type: "password" | "totp" | "sms" | "backup" | "webauthn";
408
+ * backup_codes_allowed?: boolean;
409
+ * }[];
410
+ * };
411
+ * };
412
+ */
413
+ if (
414
+ data.mfa.methods.find(o => o.type === 'totp') &&
415
+ typeof this.manager.client.options.TOTPKey === 'string'
416
+ ) {
417
+ // Get mfa code
418
+ const otp = this.manager.client.authenticator.generate(this.manager.client.options.TOTPKey);
419
+ this.manager.client.emit(
420
+ DEBUG,
421
+ `[Request Handler] ${data.message}
422
+ Method : ${request.method}
423
+ Path : ${redact.path(request.path)}
424
+ Route : ${redact.path(request.route)}
425
+ mfaCode : [REDACTED]`,
426
+ );
427
+ // Get ticket
428
+ const mfaData = data.mfa;
429
+ const mfaPost = await this.manager.client.api.mfa.finish.post({
430
+ data: {
431
+ ticket: mfaData.ticket,
432
+ data: otp,
433
+ mfa_type: 'totp',
434
+ },
435
+ });
436
+ request.options.mfaToken = mfaPost.token;
437
+ request.retries++;
438
+ request.mfaRetries++;
439
+ return this.execute(request, captchaKey, captchaToken);
440
+ }
441
+ }
442
+ } catch (err) {
443
+ throw new HTTPError(err.message, err.constructor.name, err.status, request);
444
+ }
445
+
446
+ throw new DiscordAPIError(data, res.status, request);
447
+ }
448
+
449
+ // Handle 5xx responses
450
+ if (res.status >= 500 && res.status < 600) {
451
+ // Retry the specified number of times for possible serverside issues
452
+ if (request.transportRetries >= this.manager.client.options.retryLimit) {
453
+ throw new HTTPError(res.statusText, res.constructor.name, res.status, request);
454
+ }
455
+
456
+ request.retries++;
457
+ request.transportRetries++;
458
+ return this.execute(request, captchaKey, captchaToken);
459
+ }
460
+
461
+ // Fallback in the rare case a status code outside the range 200..=599 is returned
462
+ return null;
463
+ }
464
+ }
465
+
466
+ module.exports = RequestHandler;
467
+
468
+ /**
469
+ * @external HTTPMethod
470
+ * @see {@link https://developer.mozilla.org/docs/Web/HTTP/Methods}
471
+ */
472
+
473
+ /**
474
+ * @external Response
475
+ * @see {@link https://developer.mozilla.org/docs/Web/API/Response}
476
+ */