discord-selfbot-v13.js 0.0.1-security → 2.5.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 (343) hide show
  1. package/LICENSE +674 -0
  2. package/README.md +119 -5
  3. package/package.json +101 -6
  4. package/src/WebSocket.js +39 -0
  5. package/src/client/BaseClient.js +87 -0
  6. package/src/client/Client.js +1154 -0
  7. package/src/client/WebhookClient.js +61 -0
  8. package/src/client/actions/Action.js +115 -0
  9. package/src/client/actions/ActionsManager.js +72 -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 +34 -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 +50 -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 +908 -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 +46 -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_STICKERS_UPDATE.js +5 -0
  111. package/src/client/websocket/handlers/GUILD_UPDATE.js +5 -0
  112. package/src/client/websocket/handlers/INTERACTION_CREATE.js +16 -0
  113. package/src/client/websocket/handlers/INTERACTION_FAILURE.js +18 -0
  114. package/src/client/websocket/handlers/INTERACTION_MODAL_CREATE.js +11 -0
  115. package/src/client/websocket/handlers/INTERACTION_SUCCESS.js +30 -0
  116. package/src/client/websocket/handlers/INVITE_CREATE.js +5 -0
  117. package/src/client/websocket/handlers/INVITE_DELETE.js +5 -0
  118. package/src/client/websocket/handlers/MESSAGE_ACK.js +16 -0
  119. package/src/client/websocket/handlers/MESSAGE_CREATE.js +5 -0
  120. package/src/client/websocket/handlers/MESSAGE_DELETE.js +5 -0
  121. package/src/client/websocket/handlers/MESSAGE_DELETE_BULK.js +5 -0
  122. package/src/client/websocket/handlers/MESSAGE_REACTION_ADD.js +5 -0
  123. package/src/client/websocket/handlers/MESSAGE_REACTION_REMOVE.js +5 -0
  124. package/src/client/websocket/handlers/MESSAGE_REACTION_REMOVE_ALL.js +5 -0
  125. package/src/client/websocket/handlers/MESSAGE_REACTION_REMOVE_EMOJI.js +5 -0
  126. package/src/client/websocket/handlers/MESSAGE_UPDATE.js +16 -0
  127. package/src/client/websocket/handlers/PRESENCE_UPDATE.js +5 -0
  128. package/src/client/websocket/handlers/READY.js +172 -0
  129. package/src/client/websocket/handlers/RELATIONSHIP_ADD.js +17 -0
  130. package/src/client/websocket/handlers/RELATIONSHIP_REMOVE.js +15 -0
  131. package/src/client/websocket/handlers/RELATIONSHIP_UPDATE.js +18 -0
  132. package/src/client/websocket/handlers/RESUMED.js +14 -0
  133. package/src/client/websocket/handlers/STAGE_INSTANCE_CREATE.js +5 -0
  134. package/src/client/websocket/handlers/STAGE_INSTANCE_DELETE.js +5 -0
  135. package/src/client/websocket/handlers/STAGE_INSTANCE_UPDATE.js +5 -0
  136. package/src/client/websocket/handlers/THREAD_CREATE.js +5 -0
  137. package/src/client/websocket/handlers/THREAD_DELETE.js +5 -0
  138. package/src/client/websocket/handlers/THREAD_LIST_SYNC.js +5 -0
  139. package/src/client/websocket/handlers/THREAD_MEMBERS_UPDATE.js +5 -0
  140. package/src/client/websocket/handlers/THREAD_MEMBER_UPDATE.js +5 -0
  141. package/src/client/websocket/handlers/THREAD_UPDATE.js +16 -0
  142. package/src/client/websocket/handlers/TYPING_START.js +5 -0
  143. package/src/client/websocket/handlers/USER_GUILD_SETTINGS_UPDATE.js +12 -0
  144. package/src/client/websocket/handlers/USER_NOTE_UPDATE.js +5 -0
  145. package/src/client/websocket/handlers/USER_SETTINGS_UPDATE.js +9 -0
  146. package/src/client/websocket/handlers/USER_UPDATE.js +5 -0
  147. package/src/client/websocket/handlers/VOICE_SERVER_UPDATE.js +6 -0
  148. package/src/client/websocket/handlers/VOICE_STATE_UPDATE.js +5 -0
  149. package/src/client/websocket/handlers/WEBHOOKS_UPDATE.js +5 -0
  150. package/src/client/websocket/handlers/index.js +86 -0
  151. package/src/errors/DJSError.js +61 -0
  152. package/src/errors/Messages.js +227 -0
  153. package/src/errors/index.js +4 -0
  154. package/src/index.js +190 -0
  155. package/src/main.js +48 -0
  156. package/src/managers/ApplicationCommandManager.js +267 -0
  157. package/src/managers/ApplicationCommandPermissionsManager.js +425 -0
  158. package/src/managers/AutoModerationRuleManager.js +296 -0
  159. package/src/managers/BaseGuildEmojiManager.js +80 -0
  160. package/src/managers/BaseManager.js +19 -0
  161. package/src/managers/BillingManager.js +66 -0
  162. package/src/managers/CachedManager.js +71 -0
  163. package/src/managers/ChannelManager.js +139 -0
  164. package/src/managers/ClientUserSettingManager.js +490 -0
  165. package/src/managers/DataManager.js +61 -0
  166. package/src/managers/DeveloperPortalManager.js +104 -0
  167. package/src/managers/GuildApplicationCommandManager.js +28 -0
  168. package/src/managers/GuildBanManager.js +204 -0
  169. package/src/managers/GuildChannelManager.js +502 -0
  170. package/src/managers/GuildEmojiManager.js +171 -0
  171. package/src/managers/GuildEmojiRoleManager.js +118 -0
  172. package/src/managers/GuildFolderManager.js +24 -0
  173. package/src/managers/GuildForumThreadManager.js +114 -0
  174. package/src/managers/GuildInviteManager.js +213 -0
  175. package/src/managers/GuildManager.js +304 -0
  176. package/src/managers/GuildMemberManager.js +724 -0
  177. package/src/managers/GuildMemberRoleManager.js +191 -0
  178. package/src/managers/GuildScheduledEventManager.js +296 -0
  179. package/src/managers/GuildSettingManager.js +148 -0
  180. package/src/managers/GuildStickerManager.js +179 -0
  181. package/src/managers/GuildTextThreadManager.js +98 -0
  182. package/src/managers/InteractionManager.js +39 -0
  183. package/src/managers/MessageManager.js +393 -0
  184. package/src/managers/PermissionOverwriteManager.js +166 -0
  185. package/src/managers/PresenceManager.js +58 -0
  186. package/src/managers/ReactionManager.js +67 -0
  187. package/src/managers/ReactionUserManager.js +71 -0
  188. package/src/managers/RelationshipManager.js +258 -0
  189. package/src/managers/RoleManager.js +352 -0
  190. package/src/managers/SessionManager.js +57 -0
  191. package/src/managers/StageInstanceManager.js +162 -0
  192. package/src/managers/ThreadManager.js +207 -0
  193. package/src/managers/ThreadMemberManager.js +186 -0
  194. package/src/managers/UserManager.js +150 -0
  195. package/src/managers/VoiceStateManager.js +37 -0
  196. package/src/rest/APIRequest.js +136 -0
  197. package/src/rest/APIRouter.js +53 -0
  198. package/src/rest/CaptchaSolver.js +78 -0
  199. package/src/rest/DiscordAPIError.js +103 -0
  200. package/src/rest/HTTPError.js +62 -0
  201. package/src/rest/RESTManager.js +81 -0
  202. package/src/rest/RateLimitError.js +55 -0
  203. package/src/rest/RequestHandler.js +446 -0
  204. package/src/sharding/Shard.js +443 -0
  205. package/src/sharding/ShardClientUtil.js +275 -0
  206. package/src/sharding/ShardingManager.js +318 -0
  207. package/src/structures/AnonymousGuild.js +98 -0
  208. package/src/structures/ApplicationCommand.js +1028 -0
  209. package/src/structures/ApplicationRoleConnectionMetadata.js +45 -0
  210. package/src/structures/AutoModerationActionExecution.js +89 -0
  211. package/src/structures/AutoModerationRule.js +294 -0
  212. package/src/structures/AutocompleteInteraction.js +106 -0
  213. package/src/structures/Base.js +43 -0
  214. package/src/structures/BaseCommandInteraction.js +211 -0
  215. package/src/structures/BaseGuild.js +116 -0
  216. package/src/structures/BaseGuildEmoji.js +56 -0
  217. package/src/structures/BaseGuildTextChannel.js +193 -0
  218. package/src/structures/BaseGuildVoiceChannel.js +243 -0
  219. package/src/structures/BaseMessageComponent.js +114 -0
  220. package/src/structures/ButtonInteraction.js +11 -0
  221. package/src/structures/Call.js +58 -0
  222. package/src/structures/CategoryChannel.js +83 -0
  223. package/src/structures/Channel.js +271 -0
  224. package/src/structures/ClientApplication.js +204 -0
  225. package/src/structures/ClientPresence.js +84 -0
  226. package/src/structures/ClientUser.js +624 -0
  227. package/src/structures/CommandInteraction.js +41 -0
  228. package/src/structures/CommandInteractionOptionResolver.js +276 -0
  229. package/src/structures/ContextMenuInteraction.js +65 -0
  230. package/src/structures/DMChannel.js +280 -0
  231. package/src/structures/DeveloperPortalApplication.js +520 -0
  232. package/src/structures/DirectoryChannel.js +20 -0
  233. package/src/structures/Emoji.js +148 -0
  234. package/src/structures/ForumChannel.js +271 -0
  235. package/src/structures/Guild.js +1744 -0
  236. package/src/structures/GuildAuditLogs.js +734 -0
  237. package/src/structures/GuildBan.js +59 -0
  238. package/src/structures/GuildBoost.js +108 -0
  239. package/src/structures/GuildChannel.js +454 -0
  240. package/src/structures/GuildEmoji.js +161 -0
  241. package/src/structures/GuildFolder.js +75 -0
  242. package/src/structures/GuildMember.js +686 -0
  243. package/src/structures/GuildPreview.js +191 -0
  244. package/src/structures/GuildPreviewEmoji.js +27 -0
  245. package/src/structures/GuildScheduledEvent.js +441 -0
  246. package/src/structures/GuildTemplate.js +236 -0
  247. package/src/structures/Integration.js +188 -0
  248. package/src/structures/IntegrationApplication.js +96 -0
  249. package/src/structures/Interaction.js +351 -0
  250. package/src/structures/InteractionCollector.js +248 -0
  251. package/src/structures/InteractionResponse.js +114 -0
  252. package/src/structures/InteractionWebhook.js +43 -0
  253. package/src/structures/Invite.js +375 -0
  254. package/src/structures/InviteGuild.js +23 -0
  255. package/src/structures/InviteStageInstance.js +86 -0
  256. package/src/structures/Message.js +1188 -0
  257. package/src/structures/MessageActionRow.js +103 -0
  258. package/src/structures/MessageAttachment.js +193 -0
  259. package/src/structures/MessageButton.js +231 -0
  260. package/src/structures/MessageCollector.js +146 -0
  261. package/src/structures/MessageComponentInteraction.js +120 -0
  262. package/src/structures/MessageContextMenuInteraction.js +20 -0
  263. package/src/structures/MessageEmbed.js +586 -0
  264. package/src/structures/MessageMentions.js +272 -0
  265. package/src/structures/MessagePayload.js +358 -0
  266. package/src/structures/MessageReaction.js +171 -0
  267. package/src/structures/MessageSelectMenu.js +391 -0
  268. package/src/structures/Modal.js +279 -0
  269. package/src/structures/ModalSubmitFieldsResolver.js +53 -0
  270. package/src/structures/ModalSubmitInteraction.js +119 -0
  271. package/src/structures/NewsChannel.js +32 -0
  272. package/src/structures/OAuth2Guild.js +28 -0
  273. package/src/structures/PartialGroupDMChannel.js +430 -0
  274. package/src/structures/PermissionOverwrites.js +196 -0
  275. package/src/structures/Presence.js +441 -0
  276. package/src/structures/ReactionCollector.js +229 -0
  277. package/src/structures/ReactionEmoji.js +31 -0
  278. package/src/structures/RichPresence.js +722 -0
  279. package/src/structures/Role.js +515 -0
  280. package/src/structures/SelectMenuInteraction.js +170 -0
  281. package/src/structures/Session.js +81 -0
  282. package/src/structures/StageChannel.js +104 -0
  283. package/src/structures/StageInstance.js +208 -0
  284. package/src/structures/Sticker.js +310 -0
  285. package/src/structures/StickerPack.js +95 -0
  286. package/src/structures/StoreChannel.js +56 -0
  287. package/src/structures/Team.js +167 -0
  288. package/src/structures/TeamMember.js +71 -0
  289. package/src/structures/TextChannel.js +33 -0
  290. package/src/structures/TextInputComponent.js +201 -0
  291. package/src/structures/ThreadChannel.js +626 -0
  292. package/src/structures/ThreadMember.js +105 -0
  293. package/src/structures/Typing.js +74 -0
  294. package/src/structures/User.js +697 -0
  295. package/src/structures/UserContextMenuInteraction.js +29 -0
  296. package/src/structures/VoiceChannel.js +110 -0
  297. package/src/structures/VoiceRegion.js +53 -0
  298. package/src/structures/VoiceState.js +306 -0
  299. package/src/structures/WebEmbed.js +401 -0
  300. package/src/structures/Webhook.js +461 -0
  301. package/src/structures/WelcomeChannel.js +60 -0
  302. package/src/structures/WelcomeScreen.js +48 -0
  303. package/src/structures/Widget.js +87 -0
  304. package/src/structures/WidgetMember.js +99 -0
  305. package/src/structures/interfaces/Application.js +190 -0
  306. package/src/structures/interfaces/Collector.js +300 -0
  307. package/src/structures/interfaces/InteractionResponses.js +313 -0
  308. package/src/structures/interfaces/TextBasedChannel.js +566 -0
  309. package/src/util/ActivityFlags.js +44 -0
  310. package/src/util/ApplicationFlags.js +74 -0
  311. package/src/util/BitField.js +170 -0
  312. package/src/util/ChannelFlags.js +45 -0
  313. package/src/util/Constants.js +1917 -0
  314. package/src/util/DataResolver.js +145 -0
  315. package/src/util/Formatters.js +214 -0
  316. package/src/util/GuildMemberFlags.js +43 -0
  317. package/src/util/Intents.js +74 -0
  318. package/src/util/LimitedCollection.js +131 -0
  319. package/src/util/MessageFlags.js +54 -0
  320. package/src/util/Options.js +360 -0
  321. package/src/util/Permissions.js +187 -0
  322. package/src/util/PremiumUsageFlags.js +31 -0
  323. package/src/util/PurchasedFlags.js +31 -0
  324. package/src/util/RemoteAuth.js +522 -0
  325. package/src/util/SnowflakeUtil.js +92 -0
  326. package/src/util/Sweepers.js +466 -0
  327. package/src/util/SystemChannelFlags.js +55 -0
  328. package/src/util/ThreadMemberFlags.js +30 -0
  329. package/src/util/UserFlags.js +104 -0
  330. package/src/util/Util.js +741 -0
  331. package/src/util/Voice.js +1456 -0
  332. package/src/util/arRPC/index.js +229 -0
  333. package/src/util/arRPC/process/detectable.json +1 -0
  334. package/src/util/arRPC/process/index.js +102 -0
  335. package/src/util/arRPC/process/native/index.js +5 -0
  336. package/src/util/arRPC/process/native/linux.js +37 -0
  337. package/src/util/arRPC/process/native/win32.js +25 -0
  338. package/src/util/arRPC/transports/ipc.js +281 -0
  339. package/src/util/arRPC/transports/websocket.js +128 -0
  340. package/typings/enums.d.ts +346 -0
  341. package/typings/index.d.ts +7725 -0
  342. package/typings/index.test-d.ts +0 -0
  343. package/typings/rawDataTypes.d.ts +283 -0
@@ -0,0 +1,522 @@
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 axios = require('axios');
8
+ const chalk = require('chalk');
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
+ if (error.request) {
272
+ // Axios error
273
+ console.log(chalk.red(`[DiscordRemoteAuth] ERROR`), error.message, error.response);
274
+ throw new Error(`Request failed with status code ${error.response.status}`);
275
+ } else {
276
+ throw error;
277
+ }
278
+ }
279
+ _send(op, data) {
280
+ if (!this.ws) this._throwError(new Error('WebSocket is not connected.'));
281
+ let payload = { op: op };
282
+ if (data !== null) payload = { ...payload, ...data };
283
+ this._logger('debug', `Send Data:`, payload);
284
+ this.ws.send(JSON.stringify(payload));
285
+ }
286
+ _heartbeat() {
287
+ this._send(sendEvent.HEARTBEAT);
288
+ }
289
+ _heartbeatAck() {
290
+ setTimeout(() => {
291
+ this._heartbeat();
292
+ }, this.heartbeatInterval).unref();
293
+ }
294
+ _ready(data) {
295
+ this._logger('debug', 'Attempting server handshake...');
296
+ this._expire = new Date(Date.now() + data.timeout_ms);
297
+ this.heartbeatInterval = data.heartbeat_interval;
298
+ this._createKey();
299
+ this._heartbeatAck();
300
+ this._init();
301
+ }
302
+ _createKey() {
303
+ if (this.key) this._throwError(new Error('Key is already created.'));
304
+ this.key = crypto.generateKeyPairSync('rsa', {
305
+ modulusLength: 2048,
306
+ publicKeyEncoding: {
307
+ type: 'spki',
308
+ format: 'pem',
309
+ },
310
+ privateKeyEncoding: {
311
+ type: 'pkcs1',
312
+ format: 'pem',
313
+ },
314
+ });
315
+ }
316
+ _createPublicKey() {
317
+ if (!this.key) this._throwError(new Error('Key is not created.'));
318
+ this._logger('debug', 'Generating public key...');
319
+ const decoder = new StringDecoder('utf-8');
320
+ let pub_key = decoder.write(this.key.publicKey);
321
+ pub_key = pub_key.split('\n').slice(1, -2).join('');
322
+ this._logger('debug', 'Public key generated.', pub_key);
323
+ return pub_key;
324
+ }
325
+ _init() {
326
+ const public_key = this._createPublicKey();
327
+ this._send(sendEvent.INIT, { encoded_public_key: public_key });
328
+ }
329
+ _receiveNonceProof(data) {
330
+ const nonce = data.encrypted_nonce;
331
+ const decrypted_nonce = this._decryptPayload(nonce);
332
+ let proof = crypto.createHash('sha256').update(decrypted_nonce).digest();
333
+ proof = urlsafe_b64encode(proof);
334
+ proof = proof.replace(/\s+$/, '');
335
+ this._send(sendEvent.NONCE_PROOF, { proof: proof });
336
+ this._logger('debug', `Nonce proof decrypted:`, proof);
337
+ }
338
+ _decryptPayload(encrypted_payload) {
339
+ if (!this.key) this._throwError(new Error('Key is not created.'));
340
+ const payload = Buffer.from(encrypted_payload, 'base64');
341
+ this._logger('debug', `Encrypted Payload (Buffer):`, payload);
342
+ const decoder = new StringDecoder('utf-8');
343
+ const private_key = decoder.write(this.key.privateKey);
344
+ const data = crypto.privateDecrypt(
345
+ {
346
+ key: private_key,
347
+ padding: crypto.constants.RSA_PKCS1_OAEP_PADDING,
348
+ oaepHash: 'sha256',
349
+ },
350
+ payload,
351
+ );
352
+ this._logger('debug', `Decrypted Payload:`, data.toString());
353
+ return data;
354
+ }
355
+ _pendingLogin(data) {
356
+ const user_data = this._decryptPayload(data.encrypted_user_payload);
357
+ const user = new User(user_data.toString());
358
+ this.user = user;
359
+ /**
360
+ * Emitted whenever a user is scan QR Code.
361
+ * @event DiscordAuthWebsocket#pending
362
+ * @param {object} user Discord User Raw
363
+ */
364
+ this.emit(Event.WAIT, user);
365
+ this._logger('debug', 'Waiting for user to finish login...');
366
+ this.user.prettyPrint(this);
367
+ this._logger('default', 'Please check your phone again to confirm login.');
368
+ }
369
+ _pendingRemoteInit(data) {
370
+ this._logger('debug', `Pending Remote Init:`, data);
371
+ /**
372
+ * Emitted whenever a url is created.
373
+ * @event DiscordAuthWebsocket#ready
374
+ * @param {string} fingerprint Fingerprint
375
+ * @param {string} url DiscordAuthWebsocket
376
+ */
377
+ this.emit(Event.READY, data.fingerprint, `${baseURL}${data.fingerprint}`);
378
+ this.fingerprint = data.fingerprint;
379
+ if (this.options.generateQR) this.generateQR();
380
+ }
381
+ _awaitLogin(client) {
382
+ this.once(Event.FINISH, (user, token) => {
383
+ this._logger('debug', 'Create login state...', user, token);
384
+ client.login(token);
385
+ });
386
+ }
387
+ /**
388
+ * Connect to DiscordAuthWebsocket.
389
+ * @param {?Client} client Using only for auto login.
390
+ * @returns {undefined}
391
+ */
392
+ connect(client) {
393
+ this._createWebSocket(wsURL);
394
+ if (client && this.options.autoLogin) this._awaitLogin(client);
395
+ }
396
+ /**
397
+ * Disconnect from DiscordAuthWebsocket.
398
+ * @returns {undefined}
399
+ */
400
+ destroy() {
401
+ if (!this.ws) this._throwError(new Error('WebSocket is not connected.'));
402
+ this.ws.close();
403
+ /**
404
+ * Emitted whenever a connection is closed.
405
+ * @event DiscordAuthWebsocket#closed
406
+ * @param {boolean} loginState Login state
407
+ */
408
+ this.emit(Event.CLOSED, this.token);
409
+ this._logger('debug', 'WebSocket closed.');
410
+ }
411
+ /**
412
+ * Generate QR code for user to scan (Terminal)
413
+ * @returns {undefined}
414
+ */
415
+ generateQR() {
416
+ if (!this.fingerprint) this._throwError(new Error('Fingerprint is not created.'));
417
+ require('@aikochan2k6/qrcode-terminal').generate(`${baseURL}${this.fingerprint}`, {
418
+ small: true,
419
+ });
420
+ this._logger('default', `Please scan the QR code to continue.\nQR Code will expire in ${this.exprireTime}`);
421
+ }
422
+
423
+ async _findRealToken(captchaSolveData) {
424
+ this.callFindRealTokenCount++;
425
+ if (!this.token) return this._throwError(new Error('Token is not created.'));
426
+ if (!captchaSolveData && this.captchaCache) return this._throwError(new Error('Captcha is not solved.'));
427
+ if (this.callFindRealTokenCount > 5) {
428
+ return this._throwError(
429
+ new Error(
430
+ `Failed to find real token (${this.callFindRealTokenCount} times) ${this.captchaCache ? '[Captcha]' : ''}`,
431
+ ),
432
+ );
433
+ }
434
+ this._logger('debug', 'Find real token...');
435
+ const res = await axios
436
+ .post(
437
+ `https://discord.com/api/v${this.options.apiVersion}/users/@me/remote-auth/login`,
438
+ captchaSolveData
439
+ ? {
440
+ ticket: this.token,
441
+ captcha_rqtoken: this.captchaCache.captcha_rqtoken,
442
+ captcha_key: captchaSolveData,
443
+ }
444
+ : {
445
+ ticket: this.token,
446
+ },
447
+ {
448
+ headers: {
449
+ Accept: '*/*',
450
+ 'Accept-Language': 'en-US',
451
+ 'Content-Type': 'application/json',
452
+ 'Sec-Fetch-Dest': 'empty',
453
+ 'Sec-Fetch-Mode': 'cors',
454
+ 'Sec-Fetch-Site': 'same-origin',
455
+ 'X-Debug-Options': 'bugReporterEnabled',
456
+ 'X-Super-Properties': `${Buffer.from(JSON.stringify(this.options.wsProperties), 'ascii').toString(
457
+ 'base64',
458
+ )}`,
459
+ 'X-Discord-Locale': 'en-US',
460
+ 'User-Agent': this.options.userAgent,
461
+ Referer: 'https://discord.com/channels/@me',
462
+ Connection: 'keep-alive',
463
+ Origin: 'https://discord.com',
464
+ },
465
+ },
466
+ )
467
+ .catch(e => {
468
+ if (e.response.data?.captcha_key) {
469
+ this.captchaCache = e.response.data;
470
+ } else {
471
+ this._throwError(e);
472
+ this.captchaCache = null;
473
+ }
474
+ });
475
+ if (!res && this.captchaCache) {
476
+ this._logger('default', 'Captcha is detected. Please solve the captcha to continue.');
477
+ this._logger('debug', 'Try call captchaSolver()', this.captchaCache);
478
+ const token = await this.options.captchaSolver(this.captchaCache);
479
+ return this._findRealToken(token);
480
+ }
481
+ this.realToken = this._decryptPayload(res.data.encrypted_token).toString();
482
+ /**
483
+ * Emitted whenever a real token is found.
484
+ * @event DiscordAuthWebsocket#finish
485
+ * @param {object} user User
486
+ * @param {string} token Real token
487
+ */
488
+ this.emit(Event.FINISH, this.user, this.realToken);
489
+ return this;
490
+ }
491
+ }
492
+
493
+ class User {
494
+ constructor(payload) {
495
+ const values = payload.split(':');
496
+ this.id = values[0];
497
+ this.username = values[3];
498
+ this.discriminator = values[1];
499
+ this.avatar = values[2];
500
+ return this;
501
+ }
502
+ get avatarURL() {
503
+ return `https://cdn.discordapp.com/avatars/${this.id}/${this.avatar}.${
504
+ this.avatar.startsWith('a_') ? 'gif' : 'png'
505
+ }`;
506
+ }
507
+ get tag() {
508
+ return `${this.username}#${this.discriminator}`;
509
+ }
510
+ prettyPrint(RemoteAuth) {
511
+ let string = `\n`;
512
+ string += ` ${chalk.bgBlue('User:')} `;
513
+ string += `${this.tag} (${this.id})\n`;
514
+ string += ` ${chalk.bgGreen('Avatar URL:')} `;
515
+ string += chalk.cyan(`${this.avatarURL}\n`);
516
+ string += ` ${chalk.bgMagenta('Token:')} `;
517
+ string += chalk.red(`${this.token ? this.token : 'Unknown'}`);
518
+ RemoteAuth._logger('default', string);
519
+ }
520
+ }
521
+
522
+ module.exports = DiscordAuthWebsocket;
@@ -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;