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,882 @@
1
+ 'use strict';
2
+
3
+ const { parse } = require('node:path');
4
+ const process = require('node:process');
5
+ const { Collection } = require('@discordjs/collection');
6
+ const fetch = require('node-fetch');
7
+ const { Colors } = require('./Constants');
8
+ const { RangeError, TypeError } = require('../errors');
9
+ const has = (o, k) => Object.prototype.hasOwnProperty.call(o, k);
10
+ const isObject = d => typeof d === 'object' && d !== null;
11
+
12
+ let deprecationEmittedForSplitMessage = false;
13
+ let deprecationEmittedForRemoveMentions = false;
14
+
15
+ const TextSortableGroupTypes = ['GUILD_TEXT', 'GUILD_ANNOUCMENT', 'GUILD_FORUM'];
16
+ const VoiceSortableGroupTypes = ['GUILD_VOICE', 'GUILD_STAGE_VOICE'];
17
+ const CategorySortableGroupTypes = ['GUILD_CATEGORY'];
18
+
19
+ /**
20
+ * Contains various general-purpose utility methods.
21
+ */
22
+ class Util extends null {
23
+ /**
24
+ * Flatten an object. Any properties that are collections will get converted to an array of keys.
25
+ * @param {Object} obj The object to flatten.
26
+ * @param {...Object<string, boolean|string>} [props] Specific properties to include/exclude.
27
+ * @returns {Object}
28
+ */
29
+ static flatten(obj, ...props) {
30
+ if (!isObject(obj)) return obj;
31
+
32
+ const objProps = Object.keys(obj)
33
+ .filter(k => !k.startsWith('_'))
34
+ .map(k => ({ [k]: true }));
35
+
36
+ props = objProps.length ? Object.assign(...objProps, ...props) : Object.assign({}, ...props);
37
+
38
+ const out = {};
39
+
40
+ for (let [prop, newProp] of Object.entries(props)) {
41
+ if (!newProp) continue;
42
+ newProp = newProp === true ? prop : newProp;
43
+
44
+ const element = obj[prop];
45
+ const elemIsObj = isObject(element);
46
+ const valueOf = elemIsObj && typeof element.valueOf === 'function' ? element.valueOf() : null;
47
+ const hasToJSON = elemIsObj && typeof element.toJSON === 'function';
48
+
49
+ // If it's a Collection, make the array of keys
50
+ if (element instanceof Collection) out[newProp] = Array.from(element.keys());
51
+ // If the valueOf is a Collection, use its array of keys
52
+ else if (valueOf instanceof Collection) out[newProp] = Array.from(valueOf.keys());
53
+ // If it's an array, call toJSON function on each element if present, otherwise flatten each element
54
+ else if (Array.isArray(element)) out[newProp] = element.map(e => e.toJSON?.() ?? Util.flatten(e));
55
+ // If it's an object with a primitive `valueOf`, use that value
56
+ else if (typeof valueOf !== 'object') out[newProp] = valueOf;
57
+ // If it's an object with a toJSON function, use the return value of it
58
+ else if (hasToJSON) out[newProp] = element.toJSON();
59
+ // If element is an object, use the flattened version of it
60
+ else if (typeof element === 'object') out[newProp] = Util.flatten(element);
61
+ // If it's a primitive
62
+ else if (!elemIsObj) out[newProp] = element;
63
+ }
64
+
65
+ return out;
66
+ }
67
+
68
+ /**
69
+ * Options for splitting a message.
70
+ * @typedef {Object} SplitOptions
71
+ * @property {number} [maxLength=2000] Maximum character length per message piece
72
+ * @property {string|string[]|RegExp|RegExp[]} [char='\n'] Character(s) or Regex(es) to split the message with,
73
+ * an array can be used to split multiple times
74
+ * @property {string} [prepend=''] Text to prepend to every piece except the first
75
+ * @property {string} [append=''] Text to append to every piece except the last
76
+ */
77
+
78
+ /**
79
+ * Splits a string into multiple chunks at a designated character that do not exceed a specific length.
80
+ * @param {string} text Content to split
81
+ * @param {SplitOptions} [options] Options controlling the behavior of the split
82
+ * @deprecated This will be removed in the next major version.
83
+ * @returns {string[]}
84
+ */
85
+ static splitMessage(text, { maxLength = 2_000, char = '\n', prepend = '', append = '' } = {}) {
86
+ if (!deprecationEmittedForSplitMessage) {
87
+ process.emitWarning(
88
+ 'The Util.splitMessage method is deprecated and will be removed in the next major version.',
89
+ 'DeprecationWarning',
90
+ );
91
+
92
+ deprecationEmittedForSplitMessage = true;
93
+ }
94
+
95
+ text = Util.verifyString(text);
96
+ if (text.length <= maxLength) return [text];
97
+ let splitText = [text];
98
+ if (Array.isArray(char)) {
99
+ while (char.length > 0 && splitText.some(elem => elem.length > maxLength)) {
100
+ const currentChar = char.shift();
101
+ if (currentChar instanceof RegExp) {
102
+ splitText = splitText.flatMap(chunk => chunk.match(currentChar));
103
+ } else {
104
+ splitText = splitText.flatMap(chunk => chunk.split(currentChar));
105
+ }
106
+ }
107
+ } else {
108
+ splitText = text.split(char);
109
+ }
110
+ if (splitText.some(elem => elem.length > maxLength)) throw new RangeError('SPLIT_MAX_LEN');
111
+ const messages = [];
112
+ let msg = '';
113
+ for (const chunk of splitText) {
114
+ if (msg && (msg + char + chunk + append).length > maxLength) {
115
+ messages.push(msg + append);
116
+ msg = prepend;
117
+ }
118
+ msg += (msg && msg !== prepend ? char : '') + chunk;
119
+ }
120
+ return messages.concat(msg).filter(m => m);
121
+ }
122
+
123
+ /**
124
+ * Options used to escape markdown.
125
+ * @typedef {Object} EscapeMarkdownOptions
126
+ * @property {boolean} [codeBlock=true] Whether to escape code blocks
127
+ * @property {boolean} [inlineCode=true] Whether to escape inline code
128
+ * @property {boolean} [bold=true] Whether to escape bolds
129
+ * @property {boolean} [italic=true] Whether to escape italics
130
+ * @property {boolean} [underline=true] Whether to escape underlines
131
+ * @property {boolean} [strikethrough=true] Whether to escape strikethroughs
132
+ * @property {boolean} [spoiler=true] Whether to escape spoilers
133
+ * @property {boolean} [codeBlockContent=true] Whether to escape text inside code blocks
134
+ * @property {boolean} [inlineCodeContent=true] Whether to escape text inside inline code
135
+ * @property {boolean} [escape=true] Whether to escape escape characters
136
+ * @property {boolean} [heading=false] Whether to escape headings
137
+ * @property {boolean} [bulletedList=false] Whether to escape bulleted lists
138
+ * @property {boolean} [numberedList=false] Whether to escape numbered lists
139
+ * @property {boolean} [maskedLink=false] Whether to escape masked links
140
+ */
141
+ /**
142
+ * Escapes any Discord-flavour markdown in a string.
143
+ * @param {string} text Content to escape
144
+ * @param {EscapeMarkdownOptions} [options={}] Options for escaping the markdown
145
+ * @returns {string}
146
+ */
147
+ static escapeMarkdown(
148
+ text,
149
+ {
150
+ codeBlock = true,
151
+ inlineCode = true,
152
+ bold = true,
153
+ italic = true,
154
+ underline = true,
155
+ strikethrough = true,
156
+ spoiler = true,
157
+ codeBlockContent = true,
158
+ inlineCodeContent = true,
159
+ escape = true,
160
+ heading = false,
161
+ bulletedList = false,
162
+ numberedList = false,
163
+ maskedLink = false,
164
+ } = {},
165
+ ) {
166
+ if (!codeBlockContent) {
167
+ return text
168
+ .split('```')
169
+ .map((subString, index, array) => {
170
+ if (index % 2 && index !== array.length - 1) return subString;
171
+ return Util.escapeMarkdown(subString, {
172
+ inlineCode,
173
+ bold,
174
+ italic,
175
+ underline,
176
+ strikethrough,
177
+ spoiler,
178
+ inlineCodeContent,
179
+ escape,
180
+ heading,
181
+ bulletedList,
182
+ numberedList,
183
+ maskedLink,
184
+ });
185
+ })
186
+ .join(codeBlock ? '\\`\\`\\`' : '```');
187
+ }
188
+ if (!inlineCodeContent) {
189
+ return text
190
+ .split(/(?<=^|[^`])`(?=[^`]|$)/g)
191
+ .map((subString, index, array) => {
192
+ if (index % 2 && index !== array.length - 1) return subString;
193
+ return Util.escapeMarkdown(subString, {
194
+ codeBlock,
195
+ bold,
196
+ italic,
197
+ underline,
198
+ strikethrough,
199
+ spoiler,
200
+ escape,
201
+ heading,
202
+ bulletedList,
203
+ numberedList,
204
+ maskedLink,
205
+ });
206
+ })
207
+ .join(inlineCode ? '\\`' : '`');
208
+ }
209
+ if (escape) text = Util.escapeEscape(text);
210
+ if (inlineCode) text = Util.escapeInlineCode(text);
211
+ if (codeBlock) text = Util.escapeCodeBlock(text);
212
+ if (italic) text = Util.escapeItalic(text);
213
+ if (bold) text = Util.escapeBold(text);
214
+ if (underline) text = Util.escapeUnderline(text);
215
+ if (strikethrough) text = Util.escapeStrikethrough(text);
216
+ if (spoiler) text = Util.escapeSpoiler(text);
217
+ if (heading) text = Util.escapeHeading(text);
218
+ if (bulletedList) text = Util.escapeBulletedList(text);
219
+ if (numberedList) text = Util.escapeNumberedList(text);
220
+ if (maskedLink) text = Util.escapeMaskedLink(text);
221
+ return text;
222
+ }
223
+ /**
224
+ * Escapes code block markdown in a string.
225
+ * @param {string} text Content to escape
226
+ * @returns {string}
227
+ */
228
+ static escapeCodeBlock(text) {
229
+ return text.replaceAll('```', '\\`\\`\\`');
230
+ }
231
+ /**
232
+ * Escapes inline code markdown in a string.
233
+ * @param {string} text Content to escape
234
+ * @returns {string}
235
+ */
236
+ static escapeInlineCode(text) {
237
+ return text.replace(/(?<=^|[^`])``?(?=[^`]|$)/g, match => (match.length === 2 ? '\\`\\`' : '\\`'));
238
+ }
239
+ /**
240
+ * Escapes italic markdown in a string.
241
+ * @param {string} text Content to escape
242
+ * @returns {string}
243
+ */
244
+ static escapeItalic(text) {
245
+ let i = 0;
246
+ text = text.replace(/(?<=^|[^*])\*([^*]|\*\*|$)/g, (_, match) => {
247
+ if (match === '**') return ++i % 2 ? `\\*${match}` : `${match}\\*`;
248
+ return `\\*${match}`;
249
+ });
250
+ i = 0;
251
+ return text.replace(/(?<=^|[^_])_([^_]|__|$)/g, (_, match) => {
252
+ if (match === '__') return ++i % 2 ? `\\_${match}` : `${match}\\_`;
253
+ return `\\_${match}`;
254
+ });
255
+ }
256
+ /**
257
+ * Escapes bold markdown in a string.
258
+ * @param {string} text Content to escape
259
+ * @returns {string}
260
+ */
261
+ static escapeBold(text) {
262
+ let i = 0;
263
+ return text.replace(/\*\*(\*)?/g, (_, match) => {
264
+ if (match) return ++i % 2 ? `${match}\\*\\*` : `\\*\\*${match}`;
265
+ return '\\*\\*';
266
+ });
267
+ }
268
+ /**
269
+ * Escapes underline markdown in a string.
270
+ * @param {string} text Content to escape
271
+ * @returns {string}
272
+ */
273
+ static escapeUnderline(text) {
274
+ let i = 0;
275
+ return text.replace(/__(_)?/g, (_, match) => {
276
+ if (match) return ++i % 2 ? `${match}\\_\\_` : `\\_\\_${match}`;
277
+ return '\\_\\_';
278
+ });
279
+ }
280
+ /**
281
+ * Escapes strikethrough markdown in a string.
282
+ * @param {string} text Content to escape
283
+ * @returns {string}
284
+ */
285
+ static escapeStrikethrough(text) {
286
+ return text.replaceAll('~~', '\\~\\~');
287
+ }
288
+ /**
289
+ * Escapes spoiler markdown in a string.
290
+ * @param {string} text Content to escape
291
+ * @returns {string}
292
+ */
293
+ static escapeSpoiler(text) {
294
+ return text.replaceAll('||', '\\|\\|');
295
+ }
296
+ /**
297
+ * Escapes escape characters in a string.
298
+ * @param {string} text Content to escape
299
+ * @returns {string}
300
+ */
301
+ static escapeEscape(text) {
302
+ return text.replaceAll('\\', '\\\\');
303
+ }
304
+ /**
305
+ * Escapes heading characters in a string.
306
+ * @param {string} text Content to escape
307
+ * @returns {string}
308
+ */
309
+ static escapeHeading(text) {
310
+ return text.replaceAll(/^( {0,2}[*-] +)?(#{1,3} )/gm, '$1\\$2');
311
+ }
312
+ /**
313
+ * Escapes bulleted list characters in a string.
314
+ * @param {string} text Content to escape
315
+ * @returns {string}
316
+ */
317
+ static escapeBulletedList(text) {
318
+ return text.replaceAll(/^( *)[*-]( +)/gm, '$1\\-$2');
319
+ }
320
+ /**
321
+ * Escapes numbered list characters in a string.
322
+ * @param {string} text Content to escape
323
+ * @returns {string}
324
+ */
325
+ static escapeNumberedList(text) {
326
+ return text.replaceAll(/^( *\d+)\./gm, '$1\\.');
327
+ }
328
+ /**
329
+ * Escapes masked link characters in a string.
330
+ * @param {string} text Content to escape
331
+ * @returns {string}
332
+ */
333
+ static escapeMaskedLink(text) {
334
+ return text.replaceAll(/\[.+\]\(.+\)/gm, '\\$&');
335
+ }
336
+
337
+ /**
338
+ * Parses emoji info out of a string. The string must be one of:
339
+ * * A UTF-8 emoji (no id)
340
+ * * A URL-encoded UTF-8 emoji (no id)
341
+ * * A Discord custom emoji (`<:name:id>` or `<a:name:id>`)
342
+ * @param {string} text Emoji string to parse
343
+ * @returns {APIEmoji} Object with `animated`, `name`, and `id` properties
344
+ * @private
345
+ */
346
+ static parseEmoji(text) {
347
+ if (text.includes('%')) text = decodeURIComponent(text);
348
+ if (!text.includes(':')) return { animated: false, name: text, id: null };
349
+ const match = text.match(/<?(?:(a):)?(\w{2,32}):(\d{17,19})?>?/);
350
+ return match && { animated: Boolean(match[1]), name: match[2], id: match[3] ?? null };
351
+ }
352
+
353
+ /**
354
+ * Resolves a partial emoji object from an {@link EmojiIdentifierResolvable}, without checking a Client.
355
+ * @param {EmojiIdentifierResolvable} emoji Emoji identifier to resolve
356
+ * @returns {?RawEmoji}
357
+ * @private
358
+ */
359
+ static resolvePartialEmoji(emoji) {
360
+ if (!emoji) return null;
361
+ if (typeof emoji === 'string') return /^\d{17,19}$/.test(emoji) ? { id: emoji } : Util.parseEmoji(emoji);
362
+ const { id, name, animated } = emoji;
363
+ if (!id && !name) return null;
364
+ return { id, name, animated: Boolean(animated) };
365
+ }
366
+
367
+ /**
368
+ * Shallow-copies an object with its class/prototype intact.
369
+ * @param {Object} obj Object to clone
370
+ * @returns {Object}
371
+ * @private
372
+ */
373
+ static cloneObject(obj) {
374
+ return Object.assign(Object.create(obj), obj);
375
+ }
376
+
377
+ /**
378
+ * Sets default properties on an object that aren't already specified.
379
+ * @param {Object} def Default properties
380
+ * @param {Object} given Object to assign defaults to
381
+ * @returns {Object}
382
+ * @private
383
+ */
384
+ static mergeDefault(def, given) {
385
+ if (!given) return def;
386
+ for (const key in def) {
387
+ if (!has(given, key) || given[key] === undefined) {
388
+ given[key] = def[key];
389
+ } else if (given[key] === Object(given[key])) {
390
+ given[key] = Util.mergeDefault(def[key], given[key]);
391
+ }
392
+ }
393
+
394
+ return given;
395
+ }
396
+
397
+ /**
398
+ * Options used to make an error object.
399
+ * @typedef {Object} MakeErrorOptions
400
+ * @property {string} name Error type
401
+ * @property {string} message Message for the error
402
+ * @property {string} stack Stack for the error
403
+ */
404
+
405
+ /**
406
+ * Makes an Error from a plain info object.
407
+ * @param {MakeErrorOptions} obj Error info
408
+ * @returns {Error}
409
+ * @private
410
+ */
411
+ static makeError(obj) {
412
+ const err = new Error(obj.message);
413
+ err.name = obj.name;
414
+ err.stack = obj.stack;
415
+ return err;
416
+ }
417
+
418
+ /**
419
+ * Makes a plain error info object from an Error.
420
+ * @param {Error} err Error to get info from
421
+ * @returns {MakeErrorOptions}
422
+ * @private
423
+ */
424
+ static makePlainError(err) {
425
+ return {
426
+ name: err.name,
427
+ message: err.message,
428
+ stack: err.stack,
429
+ };
430
+ }
431
+
432
+ /**
433
+ * Moves an element in an array *in place*.
434
+ * @param {Array<*>} array Array to modify
435
+ * @param {*} element Element to move
436
+ * @param {number} newIndex Index or offset to move the element to
437
+ * @param {boolean} [offset=false] Move the element by an offset amount rather than to a set index
438
+ * @returns {number}
439
+ * @private
440
+ */
441
+ static moveElementInArray(array, element, newIndex, offset = false) {
442
+ const index = array.indexOf(element);
443
+ newIndex = (offset ? index : 0) + newIndex;
444
+ if (newIndex > -1 && newIndex < array.length) {
445
+ const removedElement = array.splice(index, 1)[0];
446
+ array.splice(newIndex, 0, removedElement);
447
+ }
448
+ return array.indexOf(element);
449
+ }
450
+
451
+ /**
452
+ * Verifies the provided data is a string, otherwise throws provided error.
453
+ * @param {string} data The string resolvable to resolve
454
+ * @param {Function} [error] The Error constructor to instantiate. Defaults to Error
455
+ * @param {string} [errorMessage] The error message to throw with. Defaults to "Expected string, got <data> instead."
456
+ * @param {boolean} [allowEmpty=true] Whether an empty string should be allowed
457
+ * @returns {string}
458
+ */
459
+ static verifyString(
460
+ data,
461
+ error = Error,
462
+ errorMessage = `Expected a string, got ${data} instead.`,
463
+ allowEmpty = true,
464
+ ) {
465
+ if (typeof data !== 'string') throw new error(errorMessage);
466
+ if (!allowEmpty && data.length === 0) throw new error(errorMessage);
467
+ return data;
468
+ }
469
+
470
+ /**
471
+ * Can be a number, hex string, a {@link Color}, or an RGB array like:
472
+ * ```js
473
+ * [255, 0, 255] // purple
474
+ * ```
475
+ * @typedef {string|Color|number|number[]} ColorResolvable
476
+ */
477
+
478
+ /**
479
+ * Resolves a ColorResolvable into a color number.
480
+ * @param {ColorResolvable} color Color to resolve
481
+ * @returns {number} A color
482
+ */
483
+ static resolveColor(color) {
484
+ if (typeof color === 'string') {
485
+ if (color === 'RANDOM') return Math.floor(Math.random() * (0xffffff + 1));
486
+ if (color === 'DEFAULT') return 0;
487
+ color = Colors[color] ?? parseInt(color.replace('#', ''), 16);
488
+ } else if (Array.isArray(color)) {
489
+ color = (color[0] << 16) + (color[1] << 8) + color[2];
490
+ }
491
+
492
+ if (color < 0 || color > 0xffffff) throw new RangeError('COLOR_RANGE');
493
+ else if (Number.isNaN(color)) throw new TypeError('COLOR_CONVERT');
494
+
495
+ return color;
496
+ }
497
+
498
+ /**
499
+ * Sorts by Discord's position and id.
500
+ * @param {Collection} collection Collection of objects to sort
501
+ * @returns {Collection}
502
+ */
503
+ static discordSort(collection) {
504
+ const isGuildChannel = collection.first() instanceof GuildChannel;
505
+ return collection.sorted(
506
+ isGuildChannel
507
+ ? (a, b) => a.rawPosition - b.rawPosition || Number(BigInt(a.id) - BigInt(b.id))
508
+ : (a, b) => a.rawPosition - b.rawPosition || Number(BigInt(b.id) - BigInt(a.id)),
509
+ );
510
+ }
511
+
512
+ /**
513
+ * Sets the position of a Channel or Role.
514
+ * @param {Channel|Role} item Object to set the position of
515
+ * @param {number} position New position for the object
516
+ * @param {boolean} relative Whether `position` is relative to its current position
517
+ * @param {Collection<string, Channel|Role>} sorted A collection of the objects sorted properly
518
+ * @param {APIRouter} route Route to call PATCH on
519
+ * @param {string} [reason] Reason for the change
520
+ * @returns {Promise<Channel[]|Role[]>} Updated item list, with `id` and `position` properties
521
+ * @private
522
+ */
523
+ static async setPosition(item, position, relative, sorted, route, reason) {
524
+ let updatedItems = [...sorted.values()];
525
+ Util.moveElementInArray(updatedItems, item, position, relative);
526
+ updatedItems = updatedItems.map((r, i) => ({ id: r.id, position: i }));
527
+ await route.patch({ data: updatedItems, reason });
528
+ return updatedItems;
529
+ }
530
+
531
+ /**
532
+ * Alternative to Node's `path.basename`, removing query string after the extension if it exists.
533
+ * @param {string} path Path to get the basename of
534
+ * @param {string} [ext] File extension to remove
535
+ * @returns {string} Basename of the path
536
+ * @private
537
+ */
538
+ static basename(path, ext) {
539
+ const res = parse(path);
540
+ return ext && res.ext.startsWith(ext) ? res.name : res.base.split('?')[0];
541
+ }
542
+
543
+ /**
544
+ * Breaks user, role and everyone/here mentions by adding a zero width space after every @ character
545
+ * @param {string} str The string to sanitize
546
+ * @returns {string}
547
+ * @deprecated Use {@link BaseMessageOptions#allowedMentions} instead.
548
+ */
549
+ static removeMentions(str) {
550
+ if (!deprecationEmittedForRemoveMentions) {
551
+ process.emitWarning(
552
+ 'The Util.removeMentions method is deprecated. Use MessageOptions#allowedMentions instead.',
553
+ 'DeprecationWarning',
554
+ );
555
+
556
+ deprecationEmittedForRemoveMentions = true;
557
+ }
558
+
559
+ return Util._removeMentions(str);
560
+ }
561
+
562
+ static _removeMentions(str) {
563
+ return str.replaceAll('@', '@\u200b');
564
+ }
565
+
566
+ /**
567
+ * The content to have all mentions replaced by the equivalent text.
568
+ * <warn>When {@link Util.removeMentions} is removed, this method will no longer sanitize mentions.
569
+ * Use {@link BaseMessageOptions#allowedMentions} instead to prevent mentions when sending a message.</warn>
570
+ * @param {string} str The string to be converted
571
+ * @param {TextBasedChannels} channel The channel the string was sent in
572
+ * @returns {string}
573
+ */
574
+ static cleanContent(str, channel) {
575
+ str = str
576
+ .replace(/<@!?[0-9]+>/g, input => {
577
+ const id = input.replace(/<|!|>|@/g, '');
578
+ if (channel.type === 'DM') {
579
+ const user = channel.client.users.cache.get(id);
580
+ return user ? Util._removeMentions(`@${user.username}`) : input;
581
+ }
582
+
583
+ const member = channel.guild.members.cache.get(id);
584
+ if (member) {
585
+ return Util._removeMentions(`@${member.displayName}`);
586
+ } else {
587
+ const user = channel.client.users.cache.get(id);
588
+ return user ? Util._removeMentions(`@${user.username}`) : input;
589
+ }
590
+ })
591
+ .replace(/<#[0-9]+>/g, input => {
592
+ const mentionedChannel = channel.client.channels.cache.get(input.replace(/<|#|>/g, ''));
593
+ return mentionedChannel ? `#${mentionedChannel.name}` : input;
594
+ })
595
+ .replace(/<@&[0-9]+>/g, input => {
596
+ if (channel.type === 'DM') return input;
597
+ const role = channel.guild.roles.cache.get(input.replace(/<|@|>|&/g, ''));
598
+ return role ? `@${role.name}` : input;
599
+ });
600
+ return str;
601
+ }
602
+
603
+ /**
604
+ * The content to put in a code block with all code block fences replaced by the equivalent backticks.
605
+ * @param {string} text The string to be converted
606
+ * @returns {string}
607
+ */
608
+ static cleanCodeBlockContent(text) {
609
+ return text.replaceAll('```', '`\u200b``');
610
+ }
611
+
612
+ /**
613
+ * Creates a sweep filter that sweeps archived threads
614
+ * @param {number} [lifetime=14400] How long a thread has to be archived to be valid for sweeping
615
+ * @deprecated When not using with `makeCache` use `Sweepers.archivedThreadSweepFilter` instead
616
+ * @returns {SweepFilter}
617
+ */
618
+ static archivedThreadSweepFilter(lifetime = 14400) {
619
+ const filter = require('./Sweepers').archivedThreadSweepFilter(lifetime);
620
+ filter.isDefault = true;
621
+ return filter;
622
+ }
623
+
624
+ /**
625
+ * Resolves the maximum time a guild's thread channels should automatically archive in case of no recent activity.
626
+ * @deprecated
627
+ * @returns {number}
628
+ */
629
+ static resolveAutoArchiveMaxLimit() {
630
+ return 10080;
631
+ }
632
+
633
+ /**
634
+ * Lazily evaluates a callback function (yea it's v14 :yay:)
635
+ * @param {Function} cb The callback to lazily evaluate
636
+ * @returns {Function}
637
+ * @example
638
+ * const User = lazy(() => require('./User'));
639
+ * const user = new (User())(client, data);
640
+ */
641
+ static lazy(cb) {
642
+ let defaultValue;
643
+ return () => (defaultValue ??= cb());
644
+ }
645
+
646
+ /**
647
+ * Transforms an API guild forum tag to camel-cased guild forum tag.
648
+ * @param {APIGuildForumTag} tag The tag to transform
649
+ * @returns {GuildForumTag}
650
+ * @ignore
651
+ */
652
+ static transformAPIGuildForumTag(tag) {
653
+ return {
654
+ id: tag.id,
655
+ name: tag.name,
656
+ moderated: tag.moderated,
657
+ emoji:
658
+ tag.emoji_id ?? tag.emoji_name
659
+ ? {
660
+ id: tag.emoji_id,
661
+ name: tag.emoji_name,
662
+ }
663
+ : null,
664
+ };
665
+ }
666
+
667
+ /**
668
+ * Transforms a camel-cased guild forum tag to an API guild forum tag.
669
+ * @param {GuildForumTag} tag The tag to transform
670
+ * @returns {APIGuildForumTag}
671
+ * @ignore
672
+ */
673
+ static transformGuildForumTag(tag) {
674
+ return {
675
+ id: tag.id,
676
+ name: tag.name,
677
+ moderated: tag.moderated,
678
+ emoji_id: tag.emoji?.id ?? null,
679
+ emoji_name: tag.emoji?.name ?? null,
680
+ };
681
+ }
682
+
683
+ /**
684
+ * Transforms an API guild forum default reaction object to a
685
+ * camel-cased guild forum default reaction object.
686
+ * @param {APIGuildForumDefaultReactionEmoji} defaultReaction The default reaction to transform
687
+ * @returns {DefaultReactionEmoji}
688
+ * @ignore
689
+ */
690
+ static transformAPIGuildDefaultReaction(defaultReaction) {
691
+ return {
692
+ id: defaultReaction.emoji_id,
693
+ name: defaultReaction.emoji_name,
694
+ };
695
+ }
696
+
697
+ /**
698
+ * Transforms a camel-cased guild forum default reaction object to an
699
+ * API guild forum default reaction object.
700
+ * @param {DefaultReactionEmoji} defaultReaction The default reaction to transform
701
+ * @returns {APIGuildForumDefaultReactionEmoji}
702
+ * @ignore
703
+ */
704
+ static transformGuildDefaultReaction(defaultReaction) {
705
+ return {
706
+ emoji_id: defaultReaction.id,
707
+ emoji_name: defaultReaction.name,
708
+ };
709
+ }
710
+
711
+ static async getAttachments(client, channelId, ...files) {
712
+ files = files.flat(2);
713
+ if (!files.length) return [];
714
+ files = files.map((file, i) => ({
715
+ filename: file.name ?? file.attachment?.name ?? file.attachment?.filename ?? 'file.jpg',
716
+ // 25MB = 26_214_400bytes
717
+ file_size: Math.floor((26_214_400 / 10) * Math.random()),
718
+ id: `${i}`,
719
+ }));
720
+ const { attachments } = await client.api.channels[channelId].attachments.post({
721
+ data: {
722
+ files,
723
+ },
724
+ });
725
+ return attachments;
726
+ }
727
+
728
+ static uploadFile(data, url) {
729
+ return new Promise((resolve, reject) => {
730
+ fetch(url, {
731
+ method: 'PUT',
732
+ body: data,
733
+ })
734
+ .then(res => {
735
+ if (res.ok) {
736
+ resolve(res);
737
+ } else {
738
+ reject(res);
739
+ }
740
+ })
741
+ .catch(reject);
742
+ });
743
+ }
744
+
745
+ static testImportModule(name) {
746
+ try {
747
+ require.resolve(name);
748
+ return true;
749
+ } catch {
750
+ return false;
751
+ }
752
+ }
753
+
754
+ /**
755
+ * Gets an array of the channel types that can be moved in the channel group. For example, a GuildText channel would
756
+ * return an array containing the types that can be ordered within the text channels (always at the top), and a voice
757
+ * channel would return an array containing the types that can be ordered within the voice channels (always at the
758
+ * bottom).
759
+ * @param {ChannelType} type The type of the channel
760
+ * @returns {ChannelType[]}
761
+ * @ignore
762
+ */
763
+ static getSortableGroupTypes(type) {
764
+ switch (type) {
765
+ case 'GUILD_TEXT':
766
+ case 'GUILD_ANNOUNCEMENT':
767
+ case 'GUILD_FORUM':
768
+ return TextSortableGroupTypes;
769
+ case 'GUILD_VOICE':
770
+ case 'GUILD_STAGE_VOICE':
771
+ return VoiceSortableGroupTypes;
772
+ case 'GUILD_CATEGORY':
773
+ return CategorySortableGroupTypes;
774
+ default:
775
+ return [type];
776
+ }
777
+ }
778
+
779
+ /**
780
+ * Calculates the default avatar index for a given user id.
781
+ * @param {Snowflake} userId - The user id to calculate the default avatar index for
782
+ * @returns {number}
783
+ */
784
+ static calculateUserDefaultAvatarIndex(userId) {
785
+ return Number(BigInt(userId) >> 22n) % 6;
786
+ }
787
+
788
+ static clientRequiredAction(client, code) {
789
+ let msg = '';
790
+ let stopClient = false;
791
+ switch (code) {
792
+ case null: {
793
+ msg = 'All required actions have been completed.';
794
+ break;
795
+ }
796
+ case 'AGREEMENTS': {
797
+ msg = 'You need to accept the new Terms of Service and Privacy Policy.';
798
+ // https://discord.com/api/v9/users/@me/agreements
799
+ client.api
800
+ .users('@me')
801
+ .agreements.patch({
802
+ data: {
803
+ terms: true,
804
+ privacy: true,
805
+ },
806
+ })
807
+ .then(() => {
808
+ client.emit(
809
+ 'debug',
810
+ '[USER_REQUIRED_ACTION] Successfully accepted the new Terms of Service and Privacy Policy.',
811
+ );
812
+ })
813
+ .catch(e => {
814
+ client.emit(
815
+ 'debug',
816
+ `[USER_REQUIRED_ACTION] Failed to accept the new Terms of Service and Privacy Policy: ${e}`,
817
+ );
818
+ });
819
+ break;
820
+ }
821
+ case 'REQUIRE_CAPTCHA': {
822
+ msg = 'You need to complete a captcha.';
823
+ stopClient = true;
824
+ break;
825
+ }
826
+ case 'REQUIRE_VERIFIED_EMAIL': {
827
+ msg = 'You need to verify your email.';
828
+ stopClient = true;
829
+ break;
830
+ }
831
+ case 'REQUIRE_REVERIFIED_EMAIL': {
832
+ msg = 'You need to reverify your email.';
833
+ stopClient = true;
834
+ break;
835
+ }
836
+ case 'REQUIRE_VERIFIED_PHONE': {
837
+ msg = 'You need to verify your phone number.';
838
+ stopClient = true;
839
+ break;
840
+ }
841
+ case 'REQUIRE_REVERIFIED_PHONE': {
842
+ msg = 'You need to reverify your phone number.';
843
+ stopClient = true;
844
+ break;
845
+ }
846
+ case 'REQUIRE_VERIFIED_EMAIL_OR_VERIFIED_PHONE': {
847
+ msg = 'You need to verify your email or verify your phone number.';
848
+ stopClient = true; // Maybe not
849
+ break;
850
+ }
851
+ case 'REQUIRE_REVERIFIED_EMAIL_OR_VERIFIED_PHONE': {
852
+ msg = 'You need to reverify your email or verify your phone number.';
853
+ stopClient = true;
854
+ break;
855
+ }
856
+ case 'REQUIRE_VERIFIED_EMAIL_OR_REVERIFIED_PHONE': {
857
+ msg = 'You need to verify your email or reverify your phone number.';
858
+ stopClient = true;
859
+ break;
860
+ }
861
+ case 'REQUIRE_REVERIFIED_EMAIL_OR_REVERIFIED_PHONE': {
862
+ msg = 'You need to reverify your email or reverify your phone number.';
863
+ stopClient = true;
864
+ break;
865
+ }
866
+ default: {
867
+ msg = `Unknown required action: ${code}`;
868
+ break;
869
+ }
870
+ }
871
+ if (stopClient) {
872
+ client.emit('error', new Error(`[USER_REQUIRED_ACTION] ${msg}`));
873
+ } else {
874
+ client.emit('debug', `[USER_REQUIRED_ACTION] ${msg}`);
875
+ }
876
+ }
877
+ }
878
+
879
+ module.exports = Util;
880
+
881
+ // Fixes Circular
882
+ const GuildChannel = require('../structures/GuildChannel');