discord-selfbot-v13.js 0.0.1-security → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of discord-selfbot-v13.js might be problematic. Click here for more details.

Files changed (351) hide show
  1. package/LICENSE +674 -0
  2. package/README.md +128 -5
  3. package/package.json +98 -3
  4. package/src/WebSocket.js +39 -0
  5. package/src/client/BaseClient.js +87 -0
  6. package/src/client/Client.js +1124 -0
  7. package/src/client/WebhookClient.js +61 -0
  8. package/src/client/actions/Action.js +120 -0
  9. package/src/client/actions/ActionsManager.js +78 -0
  10. package/src/client/actions/ApplicationCommandPermissionsUpdate.js +34 -0
  11. package/src/client/actions/AutoModerationActionExecution.js +26 -0
  12. package/src/client/actions/AutoModerationRuleCreate.js +27 -0
  13. package/src/client/actions/AutoModerationRuleDelete.js +31 -0
  14. package/src/client/actions/AutoModerationRuleUpdate.js +29 -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/InteractionCreate.js +115 -0
  45. package/src/client/actions/InviteCreate.js +28 -0
  46. package/src/client/actions/InviteDelete.js +30 -0
  47. package/src/client/actions/MessageCreate.js +61 -0
  48. package/src/client/actions/MessageDelete.js +32 -0
  49. package/src/client/actions/MessageDeleteBulk.js +46 -0
  50. package/src/client/actions/MessageReactionAdd.js +56 -0
  51. package/src/client/actions/MessageReactionRemove.js +45 -0
  52. package/src/client/actions/MessageReactionRemoveAll.js +33 -0
  53. package/src/client/actions/MessageReactionRemoveEmoji.js +28 -0
  54. package/src/client/actions/MessageUpdate.js +26 -0
  55. package/src/client/actions/PresenceUpdate.js +45 -0
  56. package/src/client/actions/StageInstanceCreate.js +28 -0
  57. package/src/client/actions/StageInstanceDelete.js +33 -0
  58. package/src/client/actions/StageInstanceUpdate.js +30 -0
  59. package/src/client/actions/ThreadCreate.js +24 -0
  60. package/src/client/actions/ThreadDelete.js +32 -0
  61. package/src/client/actions/ThreadListSync.js +59 -0
  62. package/src/client/actions/ThreadMemberUpdate.js +30 -0
  63. package/src/client/actions/ThreadMembersUpdate.js +34 -0
  64. package/src/client/actions/TypingStart.js +29 -0
  65. package/src/client/actions/UserUpdate.js +35 -0
  66. package/src/client/actions/VoiceStateUpdate.js +57 -0
  67. package/src/client/actions/WebhooksUpdate.js +20 -0
  68. package/src/client/voice/ClientVoiceManager.js +51 -0
  69. package/src/client/websocket/WebSocketManager.js +412 -0
  70. package/src/client/websocket/WebSocketShard.js +905 -0
  71. package/src/client/websocket/handlers/APPLICATION_COMMAND_AUTOCOMPLETE_RESPONSE.js +23 -0
  72. package/src/client/websocket/handlers/APPLICATION_COMMAND_CREATE.js +18 -0
  73. package/src/client/websocket/handlers/APPLICATION_COMMAND_DELETE.js +20 -0
  74. package/src/client/websocket/handlers/APPLICATION_COMMAND_PERMISSIONS_UPDATE.js +5 -0
  75. package/src/client/websocket/handlers/APPLICATION_COMMAND_UPDATE.js +20 -0
  76. package/src/client/websocket/handlers/AUTO_MODERATION_ACTION_EXECUTION.js +5 -0
  77. package/src/client/websocket/handlers/AUTO_MODERATION_RULE_CREATE.js +5 -0
  78. package/src/client/websocket/handlers/AUTO_MODERATION_RULE_DELETE.js +5 -0
  79. package/src/client/websocket/handlers/AUTO_MODERATION_RULE_UPDATE.js +5 -0
  80. package/src/client/websocket/handlers/CALL_CREATE.js +14 -0
  81. package/src/client/websocket/handlers/CALL_DELETE.js +11 -0
  82. package/src/client/websocket/handlers/CALL_UPDATE.js +11 -0
  83. package/src/client/websocket/handlers/CHANNEL_CREATE.js +5 -0
  84. package/src/client/websocket/handlers/CHANNEL_DELETE.js +5 -0
  85. package/src/client/websocket/handlers/CHANNEL_PINS_UPDATE.js +22 -0
  86. package/src/client/websocket/handlers/CHANNEL_RECIPIENT_ADD.js +16 -0
  87. package/src/client/websocket/handlers/CHANNEL_RECIPIENT_REMOVE.js +16 -0
  88. package/src/client/websocket/handlers/CHANNEL_UPDATE.js +16 -0
  89. package/src/client/websocket/handlers/GUILD_APPLICATION_COMMANDS_UPDATE.js +11 -0
  90. package/src/client/websocket/handlers/GUILD_AUDIT_LOG_ENTRY_CREATE.js +5 -0
  91. package/src/client/websocket/handlers/GUILD_BAN_ADD.js +5 -0
  92. package/src/client/websocket/handlers/GUILD_BAN_REMOVE.js +5 -0
  93. package/src/client/websocket/handlers/GUILD_CREATE.js +53 -0
  94. package/src/client/websocket/handlers/GUILD_DELETE.js +5 -0
  95. package/src/client/websocket/handlers/GUILD_EMOJIS_UPDATE.js +5 -0
  96. package/src/client/websocket/handlers/GUILD_INTEGRATIONS_UPDATE.js +5 -0
  97. package/src/client/websocket/handlers/GUILD_MEMBERS_CHUNK.js +39 -0
  98. package/src/client/websocket/handlers/GUILD_MEMBER_ADD.js +20 -0
  99. package/src/client/websocket/handlers/GUILD_MEMBER_LIST_UPDATE.js +55 -0
  100. package/src/client/websocket/handlers/GUILD_MEMBER_REMOVE.js +5 -0
  101. package/src/client/websocket/handlers/GUILD_MEMBER_UPDATE.js +5 -0
  102. package/src/client/websocket/handlers/GUILD_ROLE_CREATE.js +5 -0
  103. package/src/client/websocket/handlers/GUILD_ROLE_DELETE.js +5 -0
  104. package/src/client/websocket/handlers/GUILD_ROLE_UPDATE.js +5 -0
  105. package/src/client/websocket/handlers/GUILD_SCHEDULED_EVENT_CREATE.js +5 -0
  106. package/src/client/websocket/handlers/GUILD_SCHEDULED_EVENT_DELETE.js +5 -0
  107. package/src/client/websocket/handlers/GUILD_SCHEDULED_EVENT_UPDATE.js +5 -0
  108. package/src/client/websocket/handlers/GUILD_SCHEDULED_EVENT_USER_ADD.js +5 -0
  109. package/src/client/websocket/handlers/GUILD_SCHEDULED_EVENT_USER_REMOVE.js +5 -0
  110. package/src/client/websocket/handlers/GUILD_SOUNDBOARD_SOUNDS_UPDATE.js +0 -0
  111. package/src/client/websocket/handlers/GUILD_SOUNDBOARD_SOUND_CREATE.js +0 -0
  112. package/src/client/websocket/handlers/GUILD_SOUNDBOARD_SOUND_DELETE.js +0 -0
  113. package/src/client/websocket/handlers/GUILD_SOUNDBOARD_SOUND_UPDATE.js +0 -0
  114. package/src/client/websocket/handlers/GUILD_STICKERS_UPDATE.js +5 -0
  115. package/src/client/websocket/handlers/GUILD_UPDATE.js +5 -0
  116. package/src/client/websocket/handlers/INTERACTION_CREATE.js +16 -0
  117. package/src/client/websocket/handlers/INTERACTION_FAILURE.js +18 -0
  118. package/src/client/websocket/handlers/INTERACTION_MODAL_CREATE.js +11 -0
  119. package/src/client/websocket/handlers/INTERACTION_SUCCESS.js +30 -0
  120. package/src/client/websocket/handlers/INVITE_CREATE.js +5 -0
  121. package/src/client/websocket/handlers/INVITE_DELETE.js +5 -0
  122. package/src/client/websocket/handlers/MESSAGE_ACK.js +16 -0
  123. package/src/client/websocket/handlers/MESSAGE_CREATE.js +5 -0
  124. package/src/client/websocket/handlers/MESSAGE_DELETE.js +5 -0
  125. package/src/client/websocket/handlers/MESSAGE_DELETE_BULK.js +5 -0
  126. package/src/client/websocket/handlers/MESSAGE_REACTION_ADD.js +5 -0
  127. package/src/client/websocket/handlers/MESSAGE_REACTION_REMOVE.js +5 -0
  128. package/src/client/websocket/handlers/MESSAGE_REACTION_REMOVE_ALL.js +5 -0
  129. package/src/client/websocket/handlers/MESSAGE_REACTION_REMOVE_EMOJI.js +5 -0
  130. package/src/client/websocket/handlers/MESSAGE_UPDATE.js +16 -0
  131. package/src/client/websocket/handlers/PRESENCE_UPDATE.js +5 -0
  132. package/src/client/websocket/handlers/READY.js +171 -0
  133. package/src/client/websocket/handlers/RELATIONSHIP_ADD.js +17 -0
  134. package/src/client/websocket/handlers/RELATIONSHIP_REMOVE.js +15 -0
  135. package/src/client/websocket/handlers/RELATIONSHIP_UPDATE.js +18 -0
  136. package/src/client/websocket/handlers/RESUMED.js +14 -0
  137. package/src/client/websocket/handlers/SOUNDBOARD_SOUNDS.js +0 -0
  138. package/src/client/websocket/handlers/STAGE_INSTANCE_CREATE.js +5 -0
  139. package/src/client/websocket/handlers/STAGE_INSTANCE_DELETE.js +5 -0
  140. package/src/client/websocket/handlers/STAGE_INSTANCE_UPDATE.js +5 -0
  141. package/src/client/websocket/handlers/THREAD_CREATE.js +5 -0
  142. package/src/client/websocket/handlers/THREAD_DELETE.js +5 -0
  143. package/src/client/websocket/handlers/THREAD_LIST_SYNC.js +5 -0
  144. package/src/client/websocket/handlers/THREAD_MEMBERS_UPDATE.js +5 -0
  145. package/src/client/websocket/handlers/THREAD_MEMBER_UPDATE.js +5 -0
  146. package/src/client/websocket/handlers/THREAD_UPDATE.js +16 -0
  147. package/src/client/websocket/handlers/TYPING_START.js +5 -0
  148. package/src/client/websocket/handlers/USER_GUILD_SETTINGS_UPDATE.js +12 -0
  149. package/src/client/websocket/handlers/USER_NOTE_UPDATE.js +5 -0
  150. package/src/client/websocket/handlers/USER_REQUIRED_ACTION_UPDATE.js +5 -0
  151. package/src/client/websocket/handlers/USER_SETTINGS_UPDATE.js +9 -0
  152. package/src/client/websocket/handlers/USER_UPDATE.js +5 -0
  153. package/src/client/websocket/handlers/VOICE_CHANNEL_EFFECT_SEND.js +0 -0
  154. package/src/client/websocket/handlers/VOICE_SERVER_UPDATE.js +6 -0
  155. package/src/client/websocket/handlers/VOICE_STATE_UPDATE.js +5 -0
  156. package/src/client/websocket/handlers/WEBHOOKS_UPDATE.js +5 -0
  157. package/src/client/websocket/handlers/index.js +87 -0
  158. package/src/errors/DJSError.js +61 -0
  159. package/src/errors/Messages.js +228 -0
  160. package/src/errors/index.js +4 -0
  161. package/src/index.js +194 -0
  162. package/src/managers/ApplicationCommandManager.js +267 -0
  163. package/src/managers/ApplicationCommandPermissionsManager.js +425 -0
  164. package/src/managers/AutoModerationRuleManager.js +296 -0
  165. package/src/managers/BaseGuildEmojiManager.js +80 -0
  166. package/src/managers/BaseManager.js +19 -0
  167. package/src/managers/BillingManager.js +66 -0
  168. package/src/managers/CachedManager.js +71 -0
  169. package/src/managers/ChannelManager.js +139 -0
  170. package/src/managers/ClientUserSettingManager.js +490 -0
  171. package/src/managers/DataManager.js +61 -0
  172. package/src/managers/DeveloperPortalManager.js +104 -0
  173. package/src/managers/GuildApplicationCommandManager.js +28 -0
  174. package/src/managers/GuildBanManager.js +204 -0
  175. package/src/managers/GuildChannelManager.js +504 -0
  176. package/src/managers/GuildEmojiManager.js +171 -0
  177. package/src/managers/GuildEmojiRoleManager.js +118 -0
  178. package/src/managers/GuildFolderManager.js +24 -0
  179. package/src/managers/GuildForumThreadManager.js +114 -0
  180. package/src/managers/GuildInviteManager.js +213 -0
  181. package/src/managers/GuildManager.js +304 -0
  182. package/src/managers/GuildMemberManager.js +772 -0
  183. package/src/managers/GuildMemberRoleManager.js +191 -0
  184. package/src/managers/GuildScheduledEventManager.js +296 -0
  185. package/src/managers/GuildSettingManager.js +148 -0
  186. package/src/managers/GuildStickerManager.js +179 -0
  187. package/src/managers/GuildTextThreadManager.js +98 -0
  188. package/src/managers/InteractionManager.js +39 -0
  189. package/src/managers/MessageManager.js +393 -0
  190. package/src/managers/PermissionOverwriteManager.js +166 -0
  191. package/src/managers/PresenceManager.js +58 -0
  192. package/src/managers/ReactionManager.js +67 -0
  193. package/src/managers/ReactionUserManager.js +71 -0
  194. package/src/managers/RelationshipManager.js +258 -0
  195. package/src/managers/RoleManager.js +352 -0
  196. package/src/managers/SessionManager.js +57 -0
  197. package/src/managers/StageInstanceManager.js +162 -0
  198. package/src/managers/ThreadManager.js +207 -0
  199. package/src/managers/ThreadMemberManager.js +186 -0
  200. package/src/managers/UserManager.js +150 -0
  201. package/src/managers/VoiceStateManager.js +37 -0
  202. package/src/rest/APIRequest.js +133 -0
  203. package/src/rest/APIRouter.js +53 -0
  204. package/src/rest/CaptchaSolver.js +139 -0
  205. package/src/rest/DiscordAPIError.js +103 -0
  206. package/src/rest/HTTPError.js +62 -0
  207. package/src/rest/RESTManager.js +82 -0
  208. package/src/rest/RateLimitError.js +55 -0
  209. package/src/rest/RequestHandler.js +430 -0
  210. package/src/sharding/Shard.js +443 -0
  211. package/src/sharding/ShardClientUtil.js +275 -0
  212. package/src/sharding/ShardingManager.js +318 -0
  213. package/src/structures/AnonymousGuild.js +98 -0
  214. package/src/structures/ApplicationCommand.js +1030 -0
  215. package/src/structures/ApplicationRoleConnectionMetadata.js +45 -0
  216. package/src/structures/AutoModerationActionExecution.js +89 -0
  217. package/src/structures/AutoModerationRule.js +294 -0
  218. package/src/structures/AutocompleteInteraction.js +106 -0
  219. package/src/structures/Base.js +43 -0
  220. package/src/structures/BaseCommandInteraction.js +211 -0
  221. package/src/structures/BaseGuild.js +116 -0
  222. package/src/structures/BaseGuildEmoji.js +56 -0
  223. package/src/structures/BaseGuildTextChannel.js +203 -0
  224. package/src/structures/BaseGuildVoiceChannel.js +243 -0
  225. package/src/structures/BaseMessageComponent.js +114 -0
  226. package/src/structures/ButtonInteraction.js +11 -0
  227. package/src/structures/Call.js +58 -0
  228. package/src/structures/CategoryChannel.js +85 -0
  229. package/src/structures/Channel.js +271 -0
  230. package/src/structures/ClientApplication.js +233 -0
  231. package/src/structures/ClientPresence.js +92 -0
  232. package/src/structures/ClientUser.js +635 -0
  233. package/src/structures/CommandInteraction.js +41 -0
  234. package/src/structures/CommandInteractionOptionResolver.js +276 -0
  235. package/src/structures/ContextMenuInteraction.js +65 -0
  236. package/src/structures/DMChannel.js +289 -0
  237. package/src/structures/DeveloperPortalApplication.js +520 -0
  238. package/src/structures/DirectoryChannel.js +20 -0
  239. package/src/structures/Emoji.js +148 -0
  240. package/src/structures/ForumChannel.js +271 -0
  241. package/src/structures/Guild.js +1744 -0
  242. package/src/structures/GuildAuditLogs.js +734 -0
  243. package/src/structures/GuildBan.js +59 -0
  244. package/src/structures/GuildBoost.js +108 -0
  245. package/src/structures/GuildChannel.js +468 -0
  246. package/src/structures/GuildEmoji.js +161 -0
  247. package/src/structures/GuildFolder.js +75 -0
  248. package/src/structures/GuildMember.js +686 -0
  249. package/src/structures/GuildPreview.js +191 -0
  250. package/src/structures/GuildPreviewEmoji.js +27 -0
  251. package/src/structures/GuildScheduledEvent.js +441 -0
  252. package/src/structures/GuildTemplate.js +236 -0
  253. package/src/structures/Integration.js +188 -0
  254. package/src/structures/IntegrationApplication.js +96 -0
  255. package/src/structures/Interaction.js +351 -0
  256. package/src/structures/InteractionCollector.js +248 -0
  257. package/src/structures/InteractionResponse.js +114 -0
  258. package/src/structures/InteractionWebhook.js +43 -0
  259. package/src/structures/Invite.js +375 -0
  260. package/src/structures/InviteGuild.js +23 -0
  261. package/src/structures/InviteStageInstance.js +86 -0
  262. package/src/structures/Message.js +1188 -0
  263. package/src/structures/MessageActionRow.js +103 -0
  264. package/src/structures/MessageAttachment.js +204 -0
  265. package/src/structures/MessageButton.js +231 -0
  266. package/src/structures/MessageCollector.js +146 -0
  267. package/src/structures/MessageComponentInteraction.js +120 -0
  268. package/src/structures/MessageContextMenuInteraction.js +20 -0
  269. package/src/structures/MessageEmbed.js +586 -0
  270. package/src/structures/MessageMentions.js +272 -0
  271. package/src/structures/MessagePayload.js +358 -0
  272. package/src/structures/MessageReaction.js +171 -0
  273. package/src/structures/MessageSelectMenu.js +391 -0
  274. package/src/structures/Modal.js +279 -0
  275. package/src/structures/ModalSubmitFieldsResolver.js +53 -0
  276. package/src/structures/ModalSubmitInteraction.js +119 -0
  277. package/src/structures/NewsChannel.js +32 -0
  278. package/src/structures/OAuth2Guild.js +28 -0
  279. package/src/structures/PartialGroupDMChannel.js +449 -0
  280. package/src/structures/PermissionOverwrites.js +196 -0
  281. package/src/structures/Presence.js +443 -0
  282. package/src/structures/ReactionCollector.js +229 -0
  283. package/src/structures/ReactionEmoji.js +31 -0
  284. package/src/structures/RichPresence.js +722 -0
  285. package/src/structures/Role.js +531 -0
  286. package/src/structures/SelectMenuInteraction.js +170 -0
  287. package/src/structures/Session.js +81 -0
  288. package/src/structures/StageChannel.js +104 -0
  289. package/src/structures/StageInstance.js +208 -0
  290. package/src/structures/Sticker.js +310 -0
  291. package/src/structures/StickerPack.js +95 -0
  292. package/src/structures/StoreChannel.js +56 -0
  293. package/src/structures/Team.js +167 -0
  294. package/src/structures/TeamMember.js +71 -0
  295. package/src/structures/TextChannel.js +33 -0
  296. package/src/structures/TextInputComponent.js +201 -0
  297. package/src/structures/ThreadChannel.js +626 -0
  298. package/src/structures/ThreadMember.js +105 -0
  299. package/src/structures/Typing.js +74 -0
  300. package/src/structures/User.js +730 -0
  301. package/src/structures/UserContextMenuInteraction.js +29 -0
  302. package/src/structures/VoiceChannel.js +110 -0
  303. package/src/structures/VoiceRegion.js +53 -0
  304. package/src/structures/VoiceState.js +353 -0
  305. package/src/structures/WebEmbed.js +412 -0
  306. package/src/structures/Webhook.js +461 -0
  307. package/src/structures/WelcomeChannel.js +60 -0
  308. package/src/structures/WelcomeScreen.js +48 -0
  309. package/src/structures/Widget.js +87 -0
  310. package/src/structures/WidgetMember.js +99 -0
  311. package/src/structures/interfaces/Application.js +190 -0
  312. package/src/structures/interfaces/Collector.js +300 -0
  313. package/src/structures/interfaces/InteractionResponses.js +313 -0
  314. package/src/structures/interfaces/TextBasedChannel.js +566 -0
  315. package/src/util/ActivityFlags.js +44 -0
  316. package/src/util/ApplicationFlags.js +76 -0
  317. package/src/util/AttachmentFlags.js +38 -0
  318. package/src/util/BitField.js +170 -0
  319. package/src/util/ChannelFlags.js +45 -0
  320. package/src/util/Constants.js +1940 -0
  321. package/src/util/DataResolver.js +145 -0
  322. package/src/util/Formatters.js +214 -0
  323. package/src/util/GuildMemberFlags.js +43 -0
  324. package/src/util/Intents.js +74 -0
  325. package/src/util/LimitedCollection.js +131 -0
  326. package/src/util/MessageFlags.js +54 -0
  327. package/src/util/Options.js +364 -0
  328. package/src/util/Permissions.js +187 -0
  329. package/src/util/PremiumUsageFlags.js +31 -0
  330. package/src/util/PurchasedFlags.js +31 -0
  331. package/src/util/RemoteAuth.js +514 -0
  332. package/src/util/RoleFlags.js +37 -0
  333. package/src/util/SnowflakeUtil.js +92 -0
  334. package/src/util/Sweepers.js +466 -0
  335. package/src/util/SystemChannelFlags.js +55 -0
  336. package/src/util/ThreadMemberFlags.js +30 -0
  337. package/src/util/UserFlags.js +104 -0
  338. package/src/util/Util.js +882 -0
  339. package/src/util/Voice.js +1456 -0
  340. package/src/util/arRPC/index.js +229 -0
  341. package/src/util/arRPC/process/detectable.json +1 -0
  342. package/src/util/arRPC/process/index.js +102 -0
  343. package/src/util/arRPC/process/native/index.js +5 -0
  344. package/src/util/arRPC/process/native/linux.js +37 -0
  345. package/src/util/arRPC/process/native/win32.js +25 -0
  346. package/src/util/arRPC/transports/ipc.js +281 -0
  347. package/src/util/arRPC/transports/websocket.js +128 -0
  348. package/typings/enums.d.ts +346 -0
  349. package/typings/index.d.ts +7776 -0
  350. package/typings/index.test-d.ts +0 -0
  351. package/typings/rawDataTypes.d.ts +283 -0
@@ -0,0 +1,514 @@
1
+ 'use strict';
2
+ const { Buffer } = require('buffer');
3
+ const crypto = require('crypto');
4
+ const EventEmitter = require('node:events');
5
+ const { setTimeout } = require('node:timers');
6
+ const { StringDecoder } = require('string_decoder');
7
+ const chalk = require('chalk');
8
+ const fetch = require('node-fetch');
9
+ const { encode: urlsafe_b64encode } = require('safe-base64');
10
+ const WebSocket = require('ws');
11
+ const { defaultUA } = require('./Constants');
12
+ const Options = require('./Options');
13
+
14
+ const defaultClientOptions = Options.createDefault();
15
+
16
+ const baseURL = 'https://discord.com/ra/';
17
+
18
+ const wsURL = 'wss://remote-auth-gateway.discord.gg/?v=2';
19
+
20
+ const receiveEvent = {
21
+ HELLO: 'hello',
22
+ NONCE_PROOF: 'nonce_proof',
23
+ PENDING_REMOTE_INIT: 'pending_remote_init',
24
+ HEARTBEAT_ACK: 'heartbeat_ack',
25
+ PENDING_LOGIN: 'pending_ticket',
26
+ CANCEL: 'cancel',
27
+ SUCCESS: 'pending_login',
28
+ };
29
+
30
+ const sendEvent = {
31
+ INIT: 'init',
32
+ NONCE_PROOF: 'nonce_proof',
33
+ HEARTBEAT: 'heartbeat',
34
+ };
35
+
36
+ const Event = {
37
+ READY: 'ready',
38
+ ERROR: 'error',
39
+ CANCEL: 'cancel',
40
+ WAIT: 'pending',
41
+ SUCCESS: 'success',
42
+ FINISH: 'finish',
43
+ CLOSED: 'closed',
44
+ };
45
+
46
+ /**
47
+ * @typedef {Object} DiscordAuthWebsocketOptions
48
+ * @property {?boolean} [debug=false] Log debug info
49
+ * @property {?boolean} [hiddenLog=false] Hide log ?
50
+ * @property {?boolean} [autoLogin=false] Automatically login (DiscordJS.Client Login) ?
51
+ * @property {?boolean} [failIfError=true] Throw error ?
52
+ * @property {?boolean} [generateQR=true] Create QR Code ?
53
+ * @property {?number} [apiVersion=9] API Version
54
+ * @property {?string} [userAgent] User Agent
55
+ * @property {?Object.<string,string>} [wsProperties] Web Socket Properties
56
+ */
57
+
58
+ /**
59
+ * Discord Auth QR (Discord.RemoteAuth will be removed in the future, v13.9.0 release)
60
+ * @extends {EventEmitter}
61
+ * @abstract
62
+ */
63
+ class DiscordAuthWebsocket extends EventEmitter {
64
+ /**
65
+ * Creates a new DiscordAuthWebsocket instance.
66
+ * @param {?DiscordAuthWebsocketOptions} options Options
67
+ */
68
+ constructor(options) {
69
+ super();
70
+ /**
71
+ * WebSocket
72
+ * @type {?WebSocket}
73
+ */
74
+ this.ws = null;
75
+ /**
76
+ * Heartbeat Interval
77
+ * @type {?number}
78
+ */
79
+ this.heartbeatInterval = NaN;
80
+ this._expire = NaN;
81
+ this.key = null;
82
+ /**
83
+ * User (Scan QR Code)
84
+ * @type {?Object}
85
+ */
86
+ this.user = null;
87
+ /**
88
+ * Temporary Token (Scan QR Code)
89
+ * @type {?string}
90
+ */
91
+ this.token = undefined;
92
+ /**
93
+ * Real Token (Login)
94
+ * @type {?string}
95
+ */
96
+ this.realToken = undefined;
97
+ /**
98
+ * Fingerprint (QR Code)
99
+ * @type {?string}
100
+ */
101
+ this.fingerprint = null;
102
+
103
+ /**
104
+ * Captcha Handler
105
+ * @type {Function}
106
+ * @param {Captcha} data hcaptcha data
107
+ * @returns {Promise<string>} Captcha token
108
+ */
109
+ // eslint-disable-next-line no-unused-vars
110
+ this.captchaSolver = data =>
111
+ new Promise((resolve, reject) => {
112
+ reject(
113
+ new Error(`
114
+ Captcha Handler not found - Please set captchaSolver option
115
+ Example captchaSolver function:
116
+
117
+ new DiscordAuthWebsocket({
118
+ captchaSolver: async (data) => {
119
+ const token = await hcaptchaSolver(data.captcha_sitekey, 'discord.com');
120
+ return token;
121
+ }
122
+ });
123
+
124
+ `),
125
+ );
126
+ });
127
+
128
+ /**
129
+ * Captcha Cache
130
+ * @type {?Captcha}
131
+ */
132
+ this.captchaCache = null;
133
+
134
+ this._validateOptions(options);
135
+
136
+ this.callFindRealTokenCount = 0;
137
+ }
138
+ /**
139
+ * Get expire time
140
+ * @type {string} Expire time
141
+ * @readonly
142
+ */
143
+ get exprireTime() {
144
+ return this._expire.toLocaleString('en-US');
145
+ }
146
+ _validateOptions(options = {}) {
147
+ /**
148
+ * Options
149
+ * @type {?DiscordAuthWebsocketOptions}
150
+ */
151
+ this.options = {
152
+ debug: false,
153
+ hiddenLog: false,
154
+ autoLogin: false,
155
+ failIfError: true,
156
+ generateQR: true,
157
+ apiVersion: 9,
158
+ userAgent: defaultUA,
159
+ wsProperties: defaultClientOptions.ws.properties,
160
+ captchaSolver: () => new Error('Captcha Handler not found. Please set captchaSolver option.'),
161
+ };
162
+ if (typeof options == 'object') {
163
+ if (typeof options.debug == 'boolean') this.options.debug = options.debug;
164
+ if (typeof options.hiddenLog == 'boolean') this.options.hiddenLog = options.hiddenLog;
165
+ if (typeof options.autoLogin == 'boolean') this.options.autoLogin = options.autoLogin;
166
+ if (typeof options.failIfError == 'boolean') this.options.failIfError = options.failIfError;
167
+ if (typeof options.generateQR == 'boolean') this.options.generateQR = options.generateQR;
168
+ if (typeof options.apiVersion == 'number') this.options.apiVersion = options.apiVersion;
169
+ if (typeof options.userAgent == 'string') this.options.userAgent = options.userAgent;
170
+ if (typeof options.wsProperties == 'object') this.options.wsProperties = options.wsProperties;
171
+ if (typeof options.captchaSolver == 'function') this.captchaSolver = options.captchaSolver;
172
+ }
173
+ }
174
+ _createWebSocket(url) {
175
+ this.ws = new WebSocket(url, {
176
+ headers: {
177
+ Origin: 'https://discord.com',
178
+ 'User-Agent': this.options.userAgent,
179
+ },
180
+ });
181
+ this._handleWebSocket();
182
+ }
183
+ _handleWebSocket() {
184
+ this.ws.on('error', error => {
185
+ this._logger('error', error);
186
+ });
187
+ this.ws.on('open', () => {
188
+ this._logger('debug', 'Client Connected');
189
+ });
190
+ this.ws.on('close', () => {
191
+ this._logger('debug', 'Connection closed.');
192
+ });
193
+ this.ws.on('message', message => {
194
+ this._handleMessage(JSON.parse(message));
195
+ });
196
+ }
197
+ _handleMessage(message) {
198
+ switch (message.op) {
199
+ case receiveEvent.HELLO: {
200
+ this._ready(message);
201
+ break;
202
+ }
203
+ case receiveEvent.NONCE_PROOF: {
204
+ this._receiveNonceProof(message);
205
+ break;
206
+ }
207
+ case receiveEvent.PENDING_REMOTE_INIT: {
208
+ this._pendingRemoteInit(message);
209
+ break;
210
+ }
211
+ case receiveEvent.HEARTBEAT_ACK: {
212
+ this._logger('debug', 'Heartbeat acknowledged.');
213
+ this._heartbeatAck();
214
+ break;
215
+ }
216
+ case receiveEvent.PENDING_LOGIN: {
217
+ this._pendingLogin(message);
218
+ break;
219
+ }
220
+ case receiveEvent.CANCEL: {
221
+ this._logger('debug', 'Cancel login.');
222
+ /**
223
+ * Emitted whenever a user cancels the login process.
224
+ * @event DiscordAuthWebsocket#cancel
225
+ * @param {object} user User (Raw)
226
+ */
227
+ this.emit(Event.CANCEL, this.user);
228
+ this.destroy();
229
+ break;
230
+ }
231
+ case receiveEvent.SUCCESS: {
232
+ this._logger('debug', 'Receive Token - Login Success.', message.ticket);
233
+ /**
234
+ * Emitted whenever a token is created. (Fake token)
235
+ * @event DiscordAuthWebsocket#success
236
+ * @param {object} user Discord User
237
+ * @param {string} token Discord Token (Fake)
238
+ */
239
+ this.emit(Event.SUCCESS, this.user, message.ticket);
240
+ this.token = message.ticket;
241
+ this._findRealToken();
242
+ this._logger('default', 'Get token success.');
243
+ break;
244
+ }
245
+ default: {
246
+ this._logger('debug', `Unknown op: ${message.op}`, message);
247
+ }
248
+ }
249
+ }
250
+ _logger(type = 'default', ...message) {
251
+ if (this.options.hiddenLog) return;
252
+ switch (type.toLowerCase()) {
253
+ case 'error': {
254
+ // eslint-disable-next-line no-unused-expressions
255
+ this.options.failIfError
256
+ ? this._throwError(new Error(message[0]))
257
+ : console.error(chalk.red(`[DiscordRemoteAuth] ERROR`), ...message);
258
+ break;
259
+ }
260
+ case 'default': {
261
+ console.log(chalk.green(`[DiscordRemoteAuth]`), ...message);
262
+ break;
263
+ }
264
+ case 'debug': {
265
+ if (this.options.debug) console.log(chalk.yellow(`[DiscordRemoteAuth] DEBUG`), ...message);
266
+ break;
267
+ }
268
+ }
269
+ }
270
+ _throwError(error) {
271
+ console.log(chalk.red(`[DiscordRemoteAuth] ERROR`), error);
272
+ throw error;
273
+ }
274
+ _send(op, data) {
275
+ if (!this.ws) this._throwError(new Error('WebSocket is not connected.'));
276
+ let payload = { op: op };
277
+ if (data !== null) payload = { ...payload, ...data };
278
+ this._logger('debug', `Send Data:`, payload);
279
+ this.ws.send(JSON.stringify(payload));
280
+ }
281
+ _heartbeat() {
282
+ this._send(sendEvent.HEARTBEAT);
283
+ }
284
+ _heartbeatAck() {
285
+ setTimeout(() => {
286
+ this._heartbeat();
287
+ }, this.heartbeatInterval).unref();
288
+ }
289
+ _ready(data) {
290
+ this._logger('debug', 'Attempting server handshake...');
291
+ this._expire = new Date(Date.now() + data.timeout_ms);
292
+ this.heartbeatInterval = data.heartbeat_interval;
293
+ this._createKey();
294
+ this._heartbeatAck();
295
+ this._init();
296
+ }
297
+ _createKey() {
298
+ if (this.key) this._throwError(new Error('Key is already created.'));
299
+ this.key = crypto.generateKeyPairSync('rsa', {
300
+ modulusLength: 2048,
301
+ publicKeyEncoding: {
302
+ type: 'spki',
303
+ format: 'pem',
304
+ },
305
+ privateKeyEncoding: {
306
+ type: 'pkcs1',
307
+ format: 'pem',
308
+ },
309
+ });
310
+ }
311
+ _createPublicKey() {
312
+ if (!this.key) this._throwError(new Error('Key is not created.'));
313
+ this._logger('debug', 'Generating public key...');
314
+ const decoder = new StringDecoder('utf-8');
315
+ let pub_key = decoder.write(this.key.publicKey);
316
+ pub_key = pub_key.split('\n').slice(1, -2).join('');
317
+ this._logger('debug', 'Public key generated.', pub_key);
318
+ return pub_key;
319
+ }
320
+ _init() {
321
+ const public_key = this._createPublicKey();
322
+ this._send(sendEvent.INIT, { encoded_public_key: public_key });
323
+ }
324
+ _receiveNonceProof(data) {
325
+ const nonce = data.encrypted_nonce;
326
+ const decrypted_nonce = this._decryptPayload(nonce);
327
+ let proof = crypto.createHash('sha256').update(decrypted_nonce).digest();
328
+ proof = urlsafe_b64encode(proof);
329
+ proof = proof.replace(/\s+$/, '');
330
+ this._send(sendEvent.NONCE_PROOF, { proof: proof });
331
+ this._logger('debug', `Nonce proof decrypted:`, proof);
332
+ }
333
+ _decryptPayload(encrypted_payload) {
334
+ if (!this.key) this._throwError(new Error('Key is not created.'));
335
+ const payload = Buffer.from(encrypted_payload, 'base64');
336
+ this._logger('debug', `Encrypted Payload (Buffer):`, payload);
337
+ const decoder = new StringDecoder('utf-8');
338
+ const private_key = decoder.write(this.key.privateKey);
339
+ const data = crypto.privateDecrypt(
340
+ {
341
+ key: private_key,
342
+ padding: crypto.constants.RSA_PKCS1_OAEP_PADDING,
343
+ oaepHash: 'sha256',
344
+ },
345
+ payload,
346
+ );
347
+ this._logger('debug', `Decrypted Payload:`, data.toString());
348
+ return data;
349
+ }
350
+ _pendingLogin(data) {
351
+ const user_data = this._decryptPayload(data.encrypted_user_payload);
352
+ const user = new User(user_data.toString());
353
+ this.user = user;
354
+ /**
355
+ * Emitted whenever a user is scan QR Code.
356
+ * @event DiscordAuthWebsocket#pending
357
+ * @param {object} user Discord User Raw
358
+ */
359
+ this.emit(Event.WAIT, user);
360
+ this._logger('debug', 'Waiting for user to finish login...');
361
+ this.user.prettyPrint(this);
362
+ this._logger('default', 'Please check your phone again to confirm login.');
363
+ }
364
+ _pendingRemoteInit(data) {
365
+ this._logger('debug', `Pending Remote Init:`, data);
366
+ /**
367
+ * Emitted whenever a url is created.
368
+ * @event DiscordAuthWebsocket#ready
369
+ * @param {string} fingerprint Fingerprint
370
+ * @param {string} url DiscordAuthWebsocket
371
+ */
372
+ this.emit(Event.READY, data.fingerprint, `${baseURL}${data.fingerprint}`);
373
+ this.fingerprint = data.fingerprint;
374
+ if (this.options.generateQR) this.generateQR();
375
+ }
376
+ _awaitLogin(client) {
377
+ this.once(Event.FINISH, (user, token) => {
378
+ this._logger('debug', 'Create login state...', user, token);
379
+ client.login(token);
380
+ });
381
+ }
382
+ /**
383
+ * Connect to DiscordAuthWebsocket.
384
+ * @param {?Client} client Using only for auto login.
385
+ * @returns {undefined}
386
+ */
387
+ connect(client) {
388
+ this._createWebSocket(wsURL);
389
+ if (client && this.options.autoLogin) this._awaitLogin(client);
390
+ }
391
+ /**
392
+ * Disconnect from DiscordAuthWebsocket.
393
+ * @returns {undefined}
394
+ */
395
+ destroy() {
396
+ if (!this.ws) this._throwError(new Error('WebSocket is not connected.'));
397
+ this.ws.close();
398
+ /**
399
+ * Emitted whenever a connection is closed.
400
+ * @event DiscordAuthWebsocket#closed
401
+ * @param {boolean} loginState Login state
402
+ */
403
+ this.emit(Event.CLOSED, this.token);
404
+ this._logger('debug', 'WebSocket closed.');
405
+ }
406
+ /**
407
+ * Generate QR code for user to scan (Terminal)
408
+ * @returns {undefined}
409
+ */
410
+ generateQR() {
411
+ if (!this.fingerprint) this._throwError(new Error('Fingerprint is not created.'));
412
+ require('@aikochan2k6/qrcode-terminal').generate(`${baseURL}${this.fingerprint}`, {
413
+ small: true,
414
+ });
415
+ this._logger('default', `Please scan the QR code to continue.\nQR Code will expire in ${this.exprireTime}`);
416
+ }
417
+
418
+ async _findRealToken(captchaSolveData) {
419
+ this.callFindRealTokenCount++;
420
+ if (!this.token) return this._throwError(new Error('Token is not created.'));
421
+ if (!captchaSolveData && this.captchaCache) return this._throwError(new Error('Captcha is not solved.'));
422
+ if (this.callFindRealTokenCount > 5) {
423
+ return this._throwError(
424
+ new Error(
425
+ `Failed to find real token (${this.callFindRealTokenCount} times) ${this.captchaCache ? '[Captcha]' : ''}`,
426
+ ),
427
+ );
428
+ }
429
+ this._logger('debug', 'Find real token...');
430
+ const res = await (
431
+ await fetch(`https://discord.com/api/v${this.options.apiVersion}/users/@me/remote-auth/login`, {
432
+ method: 'POST',
433
+ headers: {
434
+ Accept: '*/*',
435
+ 'Accept-Language': 'en-US',
436
+ 'Content-Type': 'application/json',
437
+ 'Sec-Fetch-Dest': 'empty',
438
+ 'Sec-Fetch-Mode': 'cors',
439
+ 'Sec-Fetch-Site': 'same-origin',
440
+ 'X-Debug-Options': 'bugReporterEnabled',
441
+ 'X-Super-Properties': `${Buffer.from(JSON.stringify(this.options.wsProperties), 'ascii').toString('base64')}`,
442
+ 'X-Discord-Locale': 'en-US',
443
+ 'User-Agent': this.options.userAgent,
444
+ Referer: 'https://discord.com/channels/@me',
445
+ Connection: 'keep-alive',
446
+ Origin: 'https://discord.com',
447
+ },
448
+ body: JSON.stringify(
449
+ captchaSolveData
450
+ ? {
451
+ ticket: this.token,
452
+ captcha_rqtoken: this.captchaCache.captcha_rqtoken,
453
+ captcha_key: captchaSolveData,
454
+ }
455
+ : {
456
+ ticket: this.token,
457
+ },
458
+ ),
459
+ })
460
+ ).json();
461
+ if (res?.captcha_key) {
462
+ this.captchaCache = res;
463
+ } else if (!res.encrypted_token) {
464
+ this._throwError(new Error('Request failed. Please try again.', res));
465
+ this.captchaCache = null;
466
+ }
467
+ if (!res && this.captchaCache) {
468
+ this._logger('default', 'Captcha is detected. Please solve the captcha to continue.');
469
+ this._logger('debug', 'Try call captchaSolver()', this.captchaCache);
470
+ const token = await this.options.captchaSolver(this.captchaCache);
471
+ return this._findRealToken(token);
472
+ }
473
+ this.realToken = this._decryptPayload(res.encrypted_token).toString();
474
+ /**
475
+ * Emitted whenever a real token is found.
476
+ * @event DiscordAuthWebsocket#finish
477
+ * @param {object} user User
478
+ * @param {string} token Real token
479
+ */
480
+ this.emit(Event.FINISH, this.user, this.realToken);
481
+ return this;
482
+ }
483
+ }
484
+
485
+ class User {
486
+ constructor(payload) {
487
+ const values = payload.split(':');
488
+ this.id = values[0];
489
+ this.username = values[3];
490
+ this.discriminator = values[1];
491
+ this.avatar = values[2];
492
+ return this;
493
+ }
494
+ get avatarURL() {
495
+ return `https://cdn.discordapp.com/avatars/${this.id}/${this.avatar}.${
496
+ this.avatar.startsWith('a_') ? 'gif' : 'png'
497
+ }`;
498
+ }
499
+ get tag() {
500
+ return `${this.username}#${this.discriminator}`;
501
+ }
502
+ prettyPrint(RemoteAuth) {
503
+ let string = `\n`;
504
+ string += ` ${chalk.bgBlue('User:')} `;
505
+ string += `${this.tag} (${this.id})\n`;
506
+ string += ` ${chalk.bgGreen('Avatar URL:')} `;
507
+ string += chalk.cyan(`${this.avatarURL}\n`);
508
+ string += ` ${chalk.bgMagenta('Token:')} `;
509
+ string += chalk.red(`${this.token ? this.token : 'Unknown'}`);
510
+ RemoteAuth._logger('default', string);
511
+ }
512
+ }
513
+
514
+ module.exports = DiscordAuthWebsocket;
@@ -0,0 +1,37 @@
1
+ 'use strict';
2
+
3
+ const BitField = require('./BitField');
4
+
5
+ /**
6
+ * Data structure that makes it easy to interact with an {@link GuildMember#flags} bitfield.
7
+ * @extends {BitField}
8
+ */
9
+ class RoleFlags extends BitField {}
10
+
11
+ /**
12
+ * @name RoleFlags
13
+ * @kind constructor
14
+ * @memberof RoleFlags
15
+ * @param {BitFieldResolvable} [bits=0] Bit(s) to read from
16
+ */
17
+
18
+ /**
19
+ * Numeric guild member flags. All available properties:
20
+ * * `IN_PROMPT`
21
+ * @type {Object}
22
+ * @see {@link https://discord.com/developers/docs/topics/permissions#role-object-role-flags}
23
+ */
24
+ RoleFlags.FLAGS = {
25
+ IN_PROMPT: 1 << 0,
26
+ };
27
+
28
+ /**
29
+ * Data that can be resolved to give a role flag bitfield. This can be:
30
+ * * A string (see {@link RoleFlags.FLAGS})
31
+ * * A role flag
32
+ * * An instance of RoleFlags
33
+ * * An Array of RoleFlagsResolvable
34
+ * @typedef {string|number|RoleFlags|RoleFlagsResolvable[]} RoleFlagsResolvable
35
+ */
36
+
37
+ module.exports = RoleFlags;
@@ -0,0 +1,92 @@
1
+ 'use strict';
2
+
3
+ // Discord epoch (2015-01-01T00:00:00.000Z)
4
+ const EPOCH = 1_420_070_400_000;
5
+ let INCREMENT = BigInt(0);
6
+
7
+ /**
8
+ * A container for useful snowflake-related methods.
9
+ */
10
+ class SnowflakeUtil extends null {
11
+ /**
12
+ * A {@link https://developer.twitter.com/en/docs/twitter-ids Twitter snowflake},
13
+ * except the epoch is 2015-01-01T00:00:00.000Z.
14
+ *
15
+ * If we have a snowflake '266241948824764416' we can represent it as binary:
16
+ * ```
17
+ * 64 22 17 12 0
18
+ * 000000111011000111100001101001000101000000 00001 00000 000000000000
19
+ * number of milliseconds since Discord epoch worker pid increment
20
+ * ```
21
+ * @typedef {string} Snowflake
22
+ */
23
+
24
+ /**
25
+ * Generates a Discord snowflake.
26
+ * <info>This hardcodes the worker's id as 1 and the process's id as 0.</info>
27
+ * @param {number|Date} [timestamp=Date.now()] Timestamp or date of the snowflake to generate
28
+ * @returns {Snowflake} The generated snowflake
29
+ */
30
+ static generate(timestamp = Date.now()) {
31
+ if (timestamp instanceof Date) timestamp = timestamp.getTime();
32
+ if (typeof timestamp !== 'number' || isNaN(timestamp)) {
33
+ throw new TypeError(
34
+ `"timestamp" argument must be a number (received ${isNaN(timestamp) ? 'NaN' : typeof timestamp})`,
35
+ );
36
+ }
37
+ if (INCREMENT >= 4095n) INCREMENT = BigInt(0);
38
+
39
+ // Assign WorkerId as 1 and ProcessId as 0:
40
+ return ((BigInt(timestamp - EPOCH) << 22n) | (1n << 17n) | INCREMENT++).toString();
41
+ }
42
+
43
+ /**
44
+ * A deconstructed snowflake.
45
+ * @typedef {Object} DeconstructedSnowflake
46
+ * @property {number} timestamp Timestamp the snowflake was created
47
+ * @property {Date} date Date the snowflake was created
48
+ * @property {number} workerId The worker's id in the snowflake
49
+ * @property {number} processId The process's id in the snowflake
50
+ * @property {number} increment Increment in the snowflake
51
+ * @property {string} binary Binary representation of the snowflake
52
+ */
53
+
54
+ /**
55
+ * Deconstructs a Discord snowflake.
56
+ * @param {Snowflake} snowflake Snowflake to deconstruct
57
+ * @returns {DeconstructedSnowflake}
58
+ */
59
+ static deconstruct(snowflake) {
60
+ const bigIntSnowflake = BigInt(snowflake);
61
+ return {
62
+ timestamp: Number(bigIntSnowflake >> 22n) + EPOCH,
63
+ get date() {
64
+ return new Date(this.timestamp);
65
+ },
66
+ workerId: Number((bigIntSnowflake >> 17n) & 0b11111n),
67
+ processId: Number((bigIntSnowflake >> 12n) & 0b11111n),
68
+ increment: Number(bigIntSnowflake & 0b111111111111n),
69
+ binary: bigIntSnowflake.toString(2).padStart(64, '0'),
70
+ };
71
+ }
72
+
73
+ /**
74
+ * Retrieves the timestamp field's value from a Discord snowflake.
75
+ * @param {Snowflake} snowflake Snowflake to get the timestamp value from
76
+ * @returns {number}
77
+ */
78
+ static timestampFrom(snowflake) {
79
+ return Number(BigInt(snowflake) >> 22n) + EPOCH;
80
+ }
81
+
82
+ /**
83
+ * Discord's epoch value (2015-01-01T00:00:00.000Z).
84
+ * @type {number}
85
+ * @readonly
86
+ */
87
+ static get EPOCH() {
88
+ return EPOCH;
89
+ }
90
+ }
91
+
92
+ module.exports = SnowflakeUtil;