discord.js-selfbott-v13 2.15.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


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

Files changed (351) hide show
  1. package/LICENSE +674 -0
  2. package/README.md +137 -0
  3. package/package.json +100 -0
  4. package/src/WebSocket.js +39 -0
  5. package/src/client/BaseClient.js +87 -0
  6. package/src/client/Client.js +1097 -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 +173 -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 +928 -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,928 @@
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, Error: DJSError } = 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
+ static getProxyObject(proxy) {
755
+ const protocol = new URL(proxy).protocol.slice(0, -1);
756
+ const mapObject = {
757
+ http: 'https', // Cuz we can't use http for discord
758
+ https: 'https',
759
+ socks4: 'socks',
760
+ socks5: 'socks',
761
+ 'pac+http': 'pac',
762
+ 'pac+https': 'pac',
763
+ };
764
+ const proxyType = mapObject[protocol];
765
+ switch (proxyType) {
766
+ case 'https': {
767
+ if (!Util.testImportModule('https-proxy-agent')) {
768
+ throw new DJSError('MISSING_MODULE', 'https-proxy-agent', 'npm install https-proxy-agent');
769
+ }
770
+ const httpsProxyAgent = require('https-proxy-agent');
771
+ return new httpsProxyAgent.HttpsProxyAgent(proxy);
772
+ }
773
+
774
+ case 'socks': {
775
+ if (!Util.testImportModule('socks-proxy-agent')) {
776
+ throw new DJSError('MISSING_MODULE', 'socks-proxy-agent', 'npm install socks-proxy-agent');
777
+ }
778
+ const socksProxyAgent = require('socks-proxy-agent');
779
+ return new socksProxyAgent.SocksProxyAgent(proxy);
780
+ }
781
+
782
+ case 'pac': {
783
+ if (!Util.testImportModule('pac-proxy-agent')) {
784
+ throw new DJSError('MISSING_MODULE', 'pac-proxy-agent', 'npm install pac-proxy-agent');
785
+ }
786
+ const pacProxyAgent = require('pac-proxy-agent');
787
+ return new pacProxyAgent.PacProxyAgent(proxy);
788
+ }
789
+
790
+ default: {
791
+ if (!Util.testImportModule('proxy-agent')) {
792
+ throw new DJSError('MISSING_MODULE', 'proxy-agent', 'npm install proxy-agent@5');
793
+ }
794
+ const proxyAgent = require('proxy-agent');
795
+ return new proxyAgent(proxy);
796
+ }
797
+ }
798
+ }
799
+
800
+ /**
801
+ * Gets an array of the channel types that can be moved in the channel group. For example, a GuildText channel would
802
+ * return an array containing the types that can be ordered within the text channels (always at the top), and a voice
803
+ * channel would return an array containing the types that can be ordered within the voice channels (always at the
804
+ * bottom).
805
+ * @param {ChannelType} type The type of the channel
806
+ * @returns {ChannelType[]}
807
+ * @ignore
808
+ */
809
+ static getSortableGroupTypes(type) {
810
+ switch (type) {
811
+ case 'GUILD_TEXT':
812
+ case 'GUILD_ANNOUNCEMENT':
813
+ case 'GUILD_FORUM':
814
+ return TextSortableGroupTypes;
815
+ case 'GUILD_VOICE':
816
+ case 'GUILD_STAGE_VOICE':
817
+ return VoiceSortableGroupTypes;
818
+ case 'GUILD_CATEGORY':
819
+ return CategorySortableGroupTypes;
820
+ default:
821
+ return [type];
822
+ }
823
+ }
824
+
825
+ /**
826
+ * Calculates the default avatar index for a given user id.
827
+ * @param {Snowflake} userId - The user id to calculate the default avatar index for
828
+ * @returns {number}
829
+ */
830
+ static calculateUserDefaultAvatarIndex(userId) {
831
+ return Number(BigInt(userId) >> 22n) % 6;
832
+ }
833
+
834
+ static clientRequiredAction(client, code) {
835
+ let msg = '';
836
+ let stopClient = false;
837
+ switch (code) {
838
+ case null: {
839
+ msg = 'All required actions have been completed.';
840
+ break;
841
+ }
842
+ case 'AGREEMENTS': {
843
+ msg = 'You need to accept the new Terms of Service and Privacy Policy.';
844
+ // https://discord.com/api/v9/users/@me/agreements
845
+ client.api
846
+ .users('@me')
847
+ .agreements.patch({
848
+ data: {
849
+ terms: true,
850
+ privacy: true,
851
+ },
852
+ })
853
+ .then(() => {
854
+ client.emit(
855
+ 'debug',
856
+ '[USER_REQUIRED_ACTION] Successfully accepted the new Terms of Service and Privacy Policy.',
857
+ );
858
+ })
859
+ .catch(e => {
860
+ client.emit(
861
+ 'debug',
862
+ `[USER_REQUIRED_ACTION] Failed to accept the new Terms of Service and Privacy Policy: ${e}`,
863
+ );
864
+ });
865
+ break;
866
+ }
867
+ case 'REQUIRE_CAPTCHA': {
868
+ msg = 'You need to complete a captcha.';
869
+ stopClient = true;
870
+ break;
871
+ }
872
+ case 'REQUIRE_VERIFIED_EMAIL': {
873
+ msg = 'You need to verify your email.';
874
+ stopClient = true;
875
+ break;
876
+ }
877
+ case 'REQUIRE_REVERIFIED_EMAIL': {
878
+ msg = 'You need to reverify your email.';
879
+ stopClient = true;
880
+ break;
881
+ }
882
+ case 'REQUIRE_VERIFIED_PHONE': {
883
+ msg = 'You need to verify your phone number.';
884
+ stopClient = true;
885
+ break;
886
+ }
887
+ case 'REQUIRE_REVERIFIED_PHONE': {
888
+ msg = 'You need to reverify your phone number.';
889
+ stopClient = true;
890
+ break;
891
+ }
892
+ case 'REQUIRE_VERIFIED_EMAIL_OR_VERIFIED_PHONE': {
893
+ msg = 'You need to verify your email or verify your phone number.';
894
+ stopClient = true; // Maybe not
895
+ break;
896
+ }
897
+ case 'REQUIRE_REVERIFIED_EMAIL_OR_VERIFIED_PHONE': {
898
+ msg = 'You need to reverify your email or verify your phone number.';
899
+ stopClient = true;
900
+ break;
901
+ }
902
+ case 'REQUIRE_VERIFIED_EMAIL_OR_REVERIFIED_PHONE': {
903
+ msg = 'You need to verify your email or reverify your phone number.';
904
+ stopClient = true;
905
+ break;
906
+ }
907
+ case 'REQUIRE_REVERIFIED_EMAIL_OR_REVERIFIED_PHONE': {
908
+ msg = 'You need to reverify your email or reverify your phone number.';
909
+ stopClient = true;
910
+ break;
911
+ }
912
+ default: {
913
+ msg = `Unknown required action: ${code}`;
914
+ break;
915
+ }
916
+ }
917
+ if (stopClient) {
918
+ client.emit('error', new Error(`[USER_REQUIRED_ACTION] ${msg}`));
919
+ } else {
920
+ client.emit('debug', `[USER_REQUIRED_ACTION] ${msg}`);
921
+ }
922
+ }
923
+ }
924
+
925
+ module.exports = Util;
926
+
927
+ // Fixes Circular
928
+ const GuildChannel = require('../structures/GuildChannel');