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

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

Potentially problematic release.


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

Files changed (343) hide show
  1. package/LICENSE +674 -0
  2. package/README.md +119 -5
  3. package/package.json +101 -6
  4. package/src/WebSocket.js +39 -0
  5. package/src/client/BaseClient.js +87 -0
  6. package/src/client/Client.js +1154 -0
  7. package/src/client/WebhookClient.js +61 -0
  8. package/src/client/actions/Action.js +115 -0
  9. package/src/client/actions/ActionsManager.js +72 -0
  10. package/src/client/actions/ApplicationCommandPermissionsUpdate.js +34 -0
  11. package/src/client/actions/AutoModerationActionExecution.js +26 -0
  12. package/src/client/actions/AutoModerationRuleCreate.js +27 -0
  13. package/src/client/actions/AutoModerationRuleDelete.js +31 -0
  14. package/src/client/actions/AutoModerationRuleUpdate.js +29 -0
  15. package/src/client/actions/ChannelCreate.js +23 -0
  16. package/src/client/actions/ChannelDelete.js +39 -0
  17. package/src/client/actions/ChannelUpdate.js +34 -0
  18. package/src/client/actions/GuildAuditLogEntryCreate.js +29 -0
  19. package/src/client/actions/GuildBanAdd.js +20 -0
  20. package/src/client/actions/GuildBanRemove.js +25 -0
  21. package/src/client/actions/GuildChannelsPositionUpdate.js +21 -0
  22. package/src/client/actions/GuildDelete.js +65 -0
  23. package/src/client/actions/GuildEmojiCreate.js +20 -0
  24. package/src/client/actions/GuildEmojiDelete.js +21 -0
  25. package/src/client/actions/GuildEmojiUpdate.js +20 -0
  26. package/src/client/actions/GuildEmojisUpdate.js +34 -0
  27. package/src/client/actions/GuildIntegrationsUpdate.js +19 -0
  28. package/src/client/actions/GuildMemberRemove.js +33 -0
  29. package/src/client/actions/GuildMemberUpdate.js +44 -0
  30. package/src/client/actions/GuildRoleCreate.js +25 -0
  31. package/src/client/actions/GuildRoleDelete.js +31 -0
  32. package/src/client/actions/GuildRoleUpdate.js +39 -0
  33. package/src/client/actions/GuildRolesPositionUpdate.js +21 -0
  34. package/src/client/actions/GuildScheduledEventCreate.js +27 -0
  35. package/src/client/actions/GuildScheduledEventDelete.js +31 -0
  36. package/src/client/actions/GuildScheduledEventUpdate.js +30 -0
  37. package/src/client/actions/GuildScheduledEventUserAdd.js +32 -0
  38. package/src/client/actions/GuildScheduledEventUserRemove.js +32 -0
  39. package/src/client/actions/GuildStickerCreate.js +20 -0
  40. package/src/client/actions/GuildStickerDelete.js +21 -0
  41. package/src/client/actions/GuildStickerUpdate.js +20 -0
  42. package/src/client/actions/GuildStickersUpdate.js +34 -0
  43. package/src/client/actions/GuildUpdate.js +33 -0
  44. package/src/client/actions/InteractionCreate.js +115 -0
  45. package/src/client/actions/InviteCreate.js +28 -0
  46. package/src/client/actions/InviteDelete.js +30 -0
  47. package/src/client/actions/MessageCreate.js +50 -0
  48. package/src/client/actions/MessageDelete.js +32 -0
  49. package/src/client/actions/MessageDeleteBulk.js +46 -0
  50. package/src/client/actions/MessageReactionAdd.js +56 -0
  51. package/src/client/actions/MessageReactionRemove.js +45 -0
  52. package/src/client/actions/MessageReactionRemoveAll.js +33 -0
  53. package/src/client/actions/MessageReactionRemoveEmoji.js +28 -0
  54. package/src/client/actions/MessageUpdate.js +26 -0
  55. package/src/client/actions/PresenceUpdate.js +45 -0
  56. package/src/client/actions/StageInstanceCreate.js +28 -0
  57. package/src/client/actions/StageInstanceDelete.js +33 -0
  58. package/src/client/actions/StageInstanceUpdate.js +30 -0
  59. package/src/client/actions/ThreadCreate.js +24 -0
  60. package/src/client/actions/ThreadDelete.js +32 -0
  61. package/src/client/actions/ThreadListSync.js +59 -0
  62. package/src/client/actions/ThreadMemberUpdate.js +30 -0
  63. package/src/client/actions/ThreadMembersUpdate.js +34 -0
  64. package/src/client/actions/TypingStart.js +29 -0
  65. package/src/client/actions/UserUpdate.js +35 -0
  66. package/src/client/actions/VoiceStateUpdate.js +57 -0
  67. package/src/client/actions/WebhooksUpdate.js +20 -0
  68. package/src/client/voice/ClientVoiceManager.js +51 -0
  69. package/src/client/websocket/WebSocketManager.js +412 -0
  70. package/src/client/websocket/WebSocketShard.js +908 -0
  71. package/src/client/websocket/handlers/APPLICATION_COMMAND_AUTOCOMPLETE_RESPONSE.js +23 -0
  72. package/src/client/websocket/handlers/APPLICATION_COMMAND_CREATE.js +18 -0
  73. package/src/client/websocket/handlers/APPLICATION_COMMAND_DELETE.js +20 -0
  74. package/src/client/websocket/handlers/APPLICATION_COMMAND_PERMISSIONS_UPDATE.js +5 -0
  75. package/src/client/websocket/handlers/APPLICATION_COMMAND_UPDATE.js +20 -0
  76. package/src/client/websocket/handlers/AUTO_MODERATION_ACTION_EXECUTION.js +5 -0
  77. package/src/client/websocket/handlers/AUTO_MODERATION_RULE_CREATE.js +5 -0
  78. package/src/client/websocket/handlers/AUTO_MODERATION_RULE_DELETE.js +5 -0
  79. package/src/client/websocket/handlers/AUTO_MODERATION_RULE_UPDATE.js +5 -0
  80. package/src/client/websocket/handlers/CALL_CREATE.js +14 -0
  81. package/src/client/websocket/handlers/CALL_DELETE.js +11 -0
  82. package/src/client/websocket/handlers/CALL_UPDATE.js +11 -0
  83. package/src/client/websocket/handlers/CHANNEL_CREATE.js +5 -0
  84. package/src/client/websocket/handlers/CHANNEL_DELETE.js +5 -0
  85. package/src/client/websocket/handlers/CHANNEL_PINS_UPDATE.js +22 -0
  86. package/src/client/websocket/handlers/CHANNEL_RECIPIENT_ADD.js +16 -0
  87. package/src/client/websocket/handlers/CHANNEL_RECIPIENT_REMOVE.js +16 -0
  88. package/src/client/websocket/handlers/CHANNEL_UPDATE.js +16 -0
  89. package/src/client/websocket/handlers/GUILD_APPLICATION_COMMANDS_UPDATE.js +11 -0
  90. package/src/client/websocket/handlers/GUILD_AUDIT_LOG_ENTRY_CREATE.js +5 -0
  91. package/src/client/websocket/handlers/GUILD_BAN_ADD.js +5 -0
  92. package/src/client/websocket/handlers/GUILD_BAN_REMOVE.js +5 -0
  93. package/src/client/websocket/handlers/GUILD_CREATE.js +46 -0
  94. package/src/client/websocket/handlers/GUILD_DELETE.js +5 -0
  95. package/src/client/websocket/handlers/GUILD_EMOJIS_UPDATE.js +5 -0
  96. package/src/client/websocket/handlers/GUILD_INTEGRATIONS_UPDATE.js +5 -0
  97. package/src/client/websocket/handlers/GUILD_MEMBERS_CHUNK.js +39 -0
  98. package/src/client/websocket/handlers/GUILD_MEMBER_ADD.js +20 -0
  99. package/src/client/websocket/handlers/GUILD_MEMBER_LIST_UPDATE.js +55 -0
  100. package/src/client/websocket/handlers/GUILD_MEMBER_REMOVE.js +5 -0
  101. package/src/client/websocket/handlers/GUILD_MEMBER_UPDATE.js +5 -0
  102. package/src/client/websocket/handlers/GUILD_ROLE_CREATE.js +5 -0
  103. package/src/client/websocket/handlers/GUILD_ROLE_DELETE.js +5 -0
  104. package/src/client/websocket/handlers/GUILD_ROLE_UPDATE.js +5 -0
  105. package/src/client/websocket/handlers/GUILD_SCHEDULED_EVENT_CREATE.js +5 -0
  106. package/src/client/websocket/handlers/GUILD_SCHEDULED_EVENT_DELETE.js +5 -0
  107. package/src/client/websocket/handlers/GUILD_SCHEDULED_EVENT_UPDATE.js +5 -0
  108. package/src/client/websocket/handlers/GUILD_SCHEDULED_EVENT_USER_ADD.js +5 -0
  109. package/src/client/websocket/handlers/GUILD_SCHEDULED_EVENT_USER_REMOVE.js +5 -0
  110. package/src/client/websocket/handlers/GUILD_STICKERS_UPDATE.js +5 -0
  111. package/src/client/websocket/handlers/GUILD_UPDATE.js +5 -0
  112. package/src/client/websocket/handlers/INTERACTION_CREATE.js +16 -0
  113. package/src/client/websocket/handlers/INTERACTION_FAILURE.js +18 -0
  114. package/src/client/websocket/handlers/INTERACTION_MODAL_CREATE.js +11 -0
  115. package/src/client/websocket/handlers/INTERACTION_SUCCESS.js +30 -0
  116. package/src/client/websocket/handlers/INVITE_CREATE.js +5 -0
  117. package/src/client/websocket/handlers/INVITE_DELETE.js +5 -0
  118. package/src/client/websocket/handlers/MESSAGE_ACK.js +16 -0
  119. package/src/client/websocket/handlers/MESSAGE_CREATE.js +5 -0
  120. package/src/client/websocket/handlers/MESSAGE_DELETE.js +5 -0
  121. package/src/client/websocket/handlers/MESSAGE_DELETE_BULK.js +5 -0
  122. package/src/client/websocket/handlers/MESSAGE_REACTION_ADD.js +5 -0
  123. package/src/client/websocket/handlers/MESSAGE_REACTION_REMOVE.js +5 -0
  124. package/src/client/websocket/handlers/MESSAGE_REACTION_REMOVE_ALL.js +5 -0
  125. package/src/client/websocket/handlers/MESSAGE_REACTION_REMOVE_EMOJI.js +5 -0
  126. package/src/client/websocket/handlers/MESSAGE_UPDATE.js +16 -0
  127. package/src/client/websocket/handlers/PRESENCE_UPDATE.js +5 -0
  128. package/src/client/websocket/handlers/READY.js +172 -0
  129. package/src/client/websocket/handlers/RELATIONSHIP_ADD.js +17 -0
  130. package/src/client/websocket/handlers/RELATIONSHIP_REMOVE.js +15 -0
  131. package/src/client/websocket/handlers/RELATIONSHIP_UPDATE.js +18 -0
  132. package/src/client/websocket/handlers/RESUMED.js +14 -0
  133. package/src/client/websocket/handlers/STAGE_INSTANCE_CREATE.js +5 -0
  134. package/src/client/websocket/handlers/STAGE_INSTANCE_DELETE.js +5 -0
  135. package/src/client/websocket/handlers/STAGE_INSTANCE_UPDATE.js +5 -0
  136. package/src/client/websocket/handlers/THREAD_CREATE.js +5 -0
  137. package/src/client/websocket/handlers/THREAD_DELETE.js +5 -0
  138. package/src/client/websocket/handlers/THREAD_LIST_SYNC.js +5 -0
  139. package/src/client/websocket/handlers/THREAD_MEMBERS_UPDATE.js +5 -0
  140. package/src/client/websocket/handlers/THREAD_MEMBER_UPDATE.js +5 -0
  141. package/src/client/websocket/handlers/THREAD_UPDATE.js +16 -0
  142. package/src/client/websocket/handlers/TYPING_START.js +5 -0
  143. package/src/client/websocket/handlers/USER_GUILD_SETTINGS_UPDATE.js +12 -0
  144. package/src/client/websocket/handlers/USER_NOTE_UPDATE.js +5 -0
  145. package/src/client/websocket/handlers/USER_SETTINGS_UPDATE.js +9 -0
  146. package/src/client/websocket/handlers/USER_UPDATE.js +5 -0
  147. package/src/client/websocket/handlers/VOICE_SERVER_UPDATE.js +6 -0
  148. package/src/client/websocket/handlers/VOICE_STATE_UPDATE.js +5 -0
  149. package/src/client/websocket/handlers/WEBHOOKS_UPDATE.js +5 -0
  150. package/src/client/websocket/handlers/index.js +86 -0
  151. package/src/errors/DJSError.js +61 -0
  152. package/src/errors/Messages.js +227 -0
  153. package/src/errors/index.js +4 -0
  154. package/src/index.js +190 -0
  155. package/src/main.js +42 -0
  156. package/src/managers/ApplicationCommandManager.js +267 -0
  157. package/src/managers/ApplicationCommandPermissionsManager.js +425 -0
  158. package/src/managers/AutoModerationRuleManager.js +296 -0
  159. package/src/managers/BaseGuildEmojiManager.js +80 -0
  160. package/src/managers/BaseManager.js +19 -0
  161. package/src/managers/BillingManager.js +66 -0
  162. package/src/managers/CachedManager.js +71 -0
  163. package/src/managers/ChannelManager.js +139 -0
  164. package/src/managers/ClientUserSettingManager.js +490 -0
  165. package/src/managers/DataManager.js +61 -0
  166. package/src/managers/DeveloperPortalManager.js +104 -0
  167. package/src/managers/GuildApplicationCommandManager.js +28 -0
  168. package/src/managers/GuildBanManager.js +204 -0
  169. package/src/managers/GuildChannelManager.js +502 -0
  170. package/src/managers/GuildEmojiManager.js +171 -0
  171. package/src/managers/GuildEmojiRoleManager.js +118 -0
  172. package/src/managers/GuildFolderManager.js +24 -0
  173. package/src/managers/GuildForumThreadManager.js +114 -0
  174. package/src/managers/GuildInviteManager.js +213 -0
  175. package/src/managers/GuildManager.js +304 -0
  176. package/src/managers/GuildMemberManager.js +724 -0
  177. package/src/managers/GuildMemberRoleManager.js +191 -0
  178. package/src/managers/GuildScheduledEventManager.js +296 -0
  179. package/src/managers/GuildSettingManager.js +148 -0
  180. package/src/managers/GuildStickerManager.js +179 -0
  181. package/src/managers/GuildTextThreadManager.js +98 -0
  182. package/src/managers/InteractionManager.js +39 -0
  183. package/src/managers/MessageManager.js +393 -0
  184. package/src/managers/PermissionOverwriteManager.js +166 -0
  185. package/src/managers/PresenceManager.js +58 -0
  186. package/src/managers/ReactionManager.js +67 -0
  187. package/src/managers/ReactionUserManager.js +71 -0
  188. package/src/managers/RelationshipManager.js +258 -0
  189. package/src/managers/RoleManager.js +352 -0
  190. package/src/managers/SessionManager.js +57 -0
  191. package/src/managers/StageInstanceManager.js +162 -0
  192. package/src/managers/ThreadManager.js +207 -0
  193. package/src/managers/ThreadMemberManager.js +186 -0
  194. package/src/managers/UserManager.js +150 -0
  195. package/src/managers/VoiceStateManager.js +37 -0
  196. package/src/rest/APIRequest.js +136 -0
  197. package/src/rest/APIRouter.js +53 -0
  198. package/src/rest/CaptchaSolver.js +78 -0
  199. package/src/rest/DiscordAPIError.js +103 -0
  200. package/src/rest/HTTPError.js +62 -0
  201. package/src/rest/RESTManager.js +81 -0
  202. package/src/rest/RateLimitError.js +55 -0
  203. package/src/rest/RequestHandler.js +446 -0
  204. package/src/sharding/Shard.js +443 -0
  205. package/src/sharding/ShardClientUtil.js +275 -0
  206. package/src/sharding/ShardingManager.js +318 -0
  207. package/src/structures/AnonymousGuild.js +98 -0
  208. package/src/structures/ApplicationCommand.js +1028 -0
  209. package/src/structures/ApplicationRoleConnectionMetadata.js +45 -0
  210. package/src/structures/AutoModerationActionExecution.js +89 -0
  211. package/src/structures/AutoModerationRule.js +294 -0
  212. package/src/structures/AutocompleteInteraction.js +106 -0
  213. package/src/structures/Base.js +43 -0
  214. package/src/structures/BaseCommandInteraction.js +211 -0
  215. package/src/structures/BaseGuild.js +116 -0
  216. package/src/structures/BaseGuildEmoji.js +56 -0
  217. package/src/structures/BaseGuildTextChannel.js +193 -0
  218. package/src/structures/BaseGuildVoiceChannel.js +243 -0
  219. package/src/structures/BaseMessageComponent.js +114 -0
  220. package/src/structures/ButtonInteraction.js +11 -0
  221. package/src/structures/Call.js +58 -0
  222. package/src/structures/CategoryChannel.js +83 -0
  223. package/src/structures/Channel.js +271 -0
  224. package/src/structures/ClientApplication.js +204 -0
  225. package/src/structures/ClientPresence.js +84 -0
  226. package/src/structures/ClientUser.js +624 -0
  227. package/src/structures/CommandInteraction.js +41 -0
  228. package/src/structures/CommandInteractionOptionResolver.js +276 -0
  229. package/src/structures/ContextMenuInteraction.js +65 -0
  230. package/src/structures/DMChannel.js +280 -0
  231. package/src/structures/DeveloperPortalApplication.js +520 -0
  232. package/src/structures/DirectoryChannel.js +20 -0
  233. package/src/structures/Emoji.js +148 -0
  234. package/src/structures/ForumChannel.js +271 -0
  235. package/src/structures/Guild.js +1744 -0
  236. package/src/structures/GuildAuditLogs.js +734 -0
  237. package/src/structures/GuildBan.js +59 -0
  238. package/src/structures/GuildBoost.js +108 -0
  239. package/src/structures/GuildChannel.js +454 -0
  240. package/src/structures/GuildEmoji.js +161 -0
  241. package/src/structures/GuildFolder.js +75 -0
  242. package/src/structures/GuildMember.js +686 -0
  243. package/src/structures/GuildPreview.js +191 -0
  244. package/src/structures/GuildPreviewEmoji.js +27 -0
  245. package/src/structures/GuildScheduledEvent.js +441 -0
  246. package/src/structures/GuildTemplate.js +236 -0
  247. package/src/structures/Integration.js +188 -0
  248. package/src/structures/IntegrationApplication.js +96 -0
  249. package/src/structures/Interaction.js +351 -0
  250. package/src/structures/InteractionCollector.js +248 -0
  251. package/src/structures/InteractionResponse.js +114 -0
  252. package/src/structures/InteractionWebhook.js +43 -0
  253. package/src/structures/Invite.js +375 -0
  254. package/src/structures/InviteGuild.js +23 -0
  255. package/src/structures/InviteStageInstance.js +86 -0
  256. package/src/structures/Message.js +1188 -0
  257. package/src/structures/MessageActionRow.js +103 -0
  258. package/src/structures/MessageAttachment.js +193 -0
  259. package/src/structures/MessageButton.js +231 -0
  260. package/src/structures/MessageCollector.js +146 -0
  261. package/src/structures/MessageComponentInteraction.js +120 -0
  262. package/src/structures/MessageContextMenuInteraction.js +20 -0
  263. package/src/structures/MessageEmbed.js +586 -0
  264. package/src/structures/MessageMentions.js +272 -0
  265. package/src/structures/MessagePayload.js +358 -0
  266. package/src/structures/MessageReaction.js +171 -0
  267. package/src/structures/MessageSelectMenu.js +391 -0
  268. package/src/structures/Modal.js +279 -0
  269. package/src/structures/ModalSubmitFieldsResolver.js +53 -0
  270. package/src/structures/ModalSubmitInteraction.js +119 -0
  271. package/src/structures/NewsChannel.js +32 -0
  272. package/src/structures/OAuth2Guild.js +28 -0
  273. package/src/structures/PartialGroupDMChannel.js +430 -0
  274. package/src/structures/PermissionOverwrites.js +196 -0
  275. package/src/structures/Presence.js +441 -0
  276. package/src/structures/ReactionCollector.js +229 -0
  277. package/src/structures/ReactionEmoji.js +31 -0
  278. package/src/structures/RichPresence.js +722 -0
  279. package/src/structures/Role.js +515 -0
  280. package/src/structures/SelectMenuInteraction.js +170 -0
  281. package/src/structures/Session.js +81 -0
  282. package/src/structures/StageChannel.js +104 -0
  283. package/src/structures/StageInstance.js +208 -0
  284. package/src/structures/Sticker.js +310 -0
  285. package/src/structures/StickerPack.js +95 -0
  286. package/src/structures/StoreChannel.js +56 -0
  287. package/src/structures/Team.js +167 -0
  288. package/src/structures/TeamMember.js +71 -0
  289. package/src/structures/TextChannel.js +33 -0
  290. package/src/structures/TextInputComponent.js +201 -0
  291. package/src/structures/ThreadChannel.js +626 -0
  292. package/src/structures/ThreadMember.js +105 -0
  293. package/src/structures/Typing.js +74 -0
  294. package/src/structures/User.js +697 -0
  295. package/src/structures/UserContextMenuInteraction.js +29 -0
  296. package/src/structures/VoiceChannel.js +110 -0
  297. package/src/structures/VoiceRegion.js +53 -0
  298. package/src/structures/VoiceState.js +306 -0
  299. package/src/structures/WebEmbed.js +401 -0
  300. package/src/structures/Webhook.js +461 -0
  301. package/src/structures/WelcomeChannel.js +60 -0
  302. package/src/structures/WelcomeScreen.js +48 -0
  303. package/src/structures/Widget.js +87 -0
  304. package/src/structures/WidgetMember.js +99 -0
  305. package/src/structures/interfaces/Application.js +190 -0
  306. package/src/structures/interfaces/Collector.js +300 -0
  307. package/src/structures/interfaces/InteractionResponses.js +313 -0
  308. package/src/structures/interfaces/TextBasedChannel.js +566 -0
  309. package/src/util/ActivityFlags.js +44 -0
  310. package/src/util/ApplicationFlags.js +74 -0
  311. package/src/util/BitField.js +170 -0
  312. package/src/util/ChannelFlags.js +45 -0
  313. package/src/util/Constants.js +1917 -0
  314. package/src/util/DataResolver.js +145 -0
  315. package/src/util/Formatters.js +214 -0
  316. package/src/util/GuildMemberFlags.js +43 -0
  317. package/src/util/Intents.js +74 -0
  318. package/src/util/LimitedCollection.js +131 -0
  319. package/src/util/MessageFlags.js +54 -0
  320. package/src/util/Options.js +360 -0
  321. package/src/util/Permissions.js +187 -0
  322. package/src/util/PremiumUsageFlags.js +31 -0
  323. package/src/util/PurchasedFlags.js +31 -0
  324. package/src/util/RemoteAuth.js +522 -0
  325. package/src/util/SnowflakeUtil.js +92 -0
  326. package/src/util/Sweepers.js +466 -0
  327. package/src/util/SystemChannelFlags.js +55 -0
  328. package/src/util/ThreadMemberFlags.js +30 -0
  329. package/src/util/UserFlags.js +104 -0
  330. package/src/util/Util.js +741 -0
  331. package/src/util/Voice.js +1456 -0
  332. package/src/util/arRPC/index.js +229 -0
  333. package/src/util/arRPC/process/detectable.json +1 -0
  334. package/src/util/arRPC/process/index.js +102 -0
  335. package/src/util/arRPC/process/native/index.js +5 -0
  336. package/src/util/arRPC/process/native/linux.js +37 -0
  337. package/src/util/arRPC/process/native/win32.js +25 -0
  338. package/src/util/arRPC/transports/ipc.js +281 -0
  339. package/src/util/arRPC/transports/websocket.js +128 -0
  340. package/typings/enums.d.ts +346 -0
  341. package/typings/index.d.ts +7725 -0
  342. package/typings/index.test-d.ts +0 -0
  343. package/typings/rawDataTypes.d.ts +283 -0
@@ -0,0 +1,741 @@
1
+ 'use strict';
2
+
3
+ const { parse } = require('node:path');
4
+ const process = require('node:process');
5
+ const { Collection } = require('@discordjs/collection');
6
+ const axios = require('axios');
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
+ /**
16
+ * Contains various general-purpose utility methods.
17
+ */
18
+ class Util extends null {
19
+ /**
20
+ * Flatten an object. Any properties that are collections will get converted to an array of keys.
21
+ * @param {Object} obj The object to flatten.
22
+ * @param {...Object<string, boolean|string>} [props] Specific properties to include/exclude.
23
+ * @returns {Object}
24
+ */
25
+ static flatten(obj, ...props) {
26
+ if (!isObject(obj)) return obj;
27
+
28
+ const objProps = Object.keys(obj)
29
+ .filter(k => !k.startsWith('_'))
30
+ .map(k => ({ [k]: true }));
31
+
32
+ props = objProps.length ? Object.assign(...objProps, ...props) : Object.assign({}, ...props);
33
+
34
+ const out = {};
35
+
36
+ for (let [prop, newProp] of Object.entries(props)) {
37
+ if (!newProp) continue;
38
+ newProp = newProp === true ? prop : newProp;
39
+
40
+ const element = obj[prop];
41
+ const elemIsObj = isObject(element);
42
+ const valueOf = elemIsObj && typeof element.valueOf === 'function' ? element.valueOf() : null;
43
+ const hasToJSON = elemIsObj && typeof element.toJSON === 'function';
44
+
45
+ // If it's a Collection, make the array of keys
46
+ if (element instanceof Collection) out[newProp] = Array.from(element.keys());
47
+ // If the valueOf is a Collection, use its array of keys
48
+ else if (valueOf instanceof Collection) out[newProp] = Array.from(valueOf.keys());
49
+ // If it's an array, call toJSON function on each element if present, otherwise flatten each element
50
+ else if (Array.isArray(element)) out[newProp] = element.map(e => e.toJSON?.() ?? Util.flatten(e));
51
+ // If it's an object with a primitive `valueOf`, use that value
52
+ else if (typeof valueOf !== 'object') out[newProp] = valueOf;
53
+ // If it's an object with a toJSON function, use the return value of it
54
+ else if (hasToJSON) out[newProp] = element.toJSON();
55
+ // If element is an object, use the flattened version of it
56
+ else if (typeof element === 'object') out[newProp] = Util.flatten(element);
57
+ // If it's a primitive
58
+ else if (!elemIsObj) out[newProp] = element;
59
+ }
60
+
61
+ return out;
62
+ }
63
+
64
+ /**
65
+ * Options for splitting a message.
66
+ * @typedef {Object} SplitOptions
67
+ * @property {number} [maxLength=2000] Maximum character length per message piece
68
+ * @property {string|string[]|RegExp|RegExp[]} [char='\n'] Character(s) or Regex(es) to split the message with,
69
+ * an array can be used to split multiple times
70
+ * @property {string} [prepend=''] Text to prepend to every piece except the first
71
+ * @property {string} [append=''] Text to append to every piece except the last
72
+ */
73
+
74
+ /**
75
+ * Splits a string into multiple chunks at a designated character that do not exceed a specific length.
76
+ * @param {string} text Content to split
77
+ * @param {SplitOptions} [options] Options controlling the behavior of the split
78
+ * @deprecated This will be removed in the next major version.
79
+ * @returns {string[]}
80
+ */
81
+ static splitMessage(text, { maxLength = 2_000, char = '\n', prepend = '', append = '' } = {}) {
82
+ if (!deprecationEmittedForSplitMessage) {
83
+ process.emitWarning(
84
+ 'The Util.splitMessage method is deprecated and will be removed in the next major version.',
85
+ 'DeprecationWarning',
86
+ );
87
+
88
+ deprecationEmittedForSplitMessage = true;
89
+ }
90
+
91
+ text = Util.verifyString(text);
92
+ if (text.length <= maxLength) return [text];
93
+ let splitText = [text];
94
+ if (Array.isArray(char)) {
95
+ while (char.length > 0 && splitText.some(elem => elem.length > maxLength)) {
96
+ const currentChar = char.shift();
97
+ if (currentChar instanceof RegExp) {
98
+ splitText = splitText.flatMap(chunk => chunk.match(currentChar));
99
+ } else {
100
+ splitText = splitText.flatMap(chunk => chunk.split(currentChar));
101
+ }
102
+ }
103
+ } else {
104
+ splitText = text.split(char);
105
+ }
106
+ if (splitText.some(elem => elem.length > maxLength)) throw new RangeError('SPLIT_MAX_LEN');
107
+ const messages = [];
108
+ let msg = '';
109
+ for (const chunk of splitText) {
110
+ if (msg && (msg + char + chunk + append).length > maxLength) {
111
+ messages.push(msg + append);
112
+ msg = prepend;
113
+ }
114
+ msg += (msg && msg !== prepend ? char : '') + chunk;
115
+ }
116
+ return messages.concat(msg).filter(m => m);
117
+ }
118
+
119
+ /**
120
+ * Options used to escape markdown.
121
+ * @typedef {Object} EscapeMarkdownOptions
122
+ * @property {boolean} [codeBlock=true] Whether to escape code blocks
123
+ * @property {boolean} [inlineCode=true] Whether to escape inline code
124
+ * @property {boolean} [bold=true] Whether to escape bolds
125
+ * @property {boolean} [italic=true] Whether to escape italics
126
+ * @property {boolean} [underline=true] Whether to escape underlines
127
+ * @property {boolean} [strikethrough=true] Whether to escape strikethroughs
128
+ * @property {boolean} [spoiler=true] Whether to escape spoilers
129
+ * @property {boolean} [codeBlockContent=true] Whether to escape text inside code blocks
130
+ * @property {boolean} [inlineCodeContent=true] Whether to escape text inside inline code
131
+ * @property {boolean} [escape=true] Whether to escape escape characters
132
+ * @property {boolean} [heading=false] Whether to escape headings
133
+ * @property {boolean} [bulletedList=false] Whether to escape bulleted lists
134
+ * @property {boolean} [numberedList=false] Whether to escape numbered lists
135
+ * @property {boolean} [maskedLink=false] Whether to escape masked links
136
+ */
137
+ /**
138
+ * Escapes any Discord-flavour markdown in a string.
139
+ * @param {string} text Content to escape
140
+ * @param {EscapeMarkdownOptions} [options={}] Options for escaping the markdown
141
+ * @returns {string}
142
+ */
143
+ static escapeMarkdown(
144
+ text,
145
+ {
146
+ codeBlock = true,
147
+ inlineCode = true,
148
+ bold = true,
149
+ italic = true,
150
+ underline = true,
151
+ strikethrough = true,
152
+ spoiler = true,
153
+ codeBlockContent = true,
154
+ inlineCodeContent = true,
155
+ escape = true,
156
+ heading = false,
157
+ bulletedList = false,
158
+ numberedList = false,
159
+ maskedLink = false,
160
+ } = {},
161
+ ) {
162
+ if (!codeBlockContent) {
163
+ return text
164
+ .split('```')
165
+ .map((subString, index, array) => {
166
+ if (index % 2 && index !== array.length - 1) return subString;
167
+ return Util.escapeMarkdown(subString, {
168
+ inlineCode,
169
+ bold,
170
+ italic,
171
+ underline,
172
+ strikethrough,
173
+ spoiler,
174
+ inlineCodeContent,
175
+ escape,
176
+ heading,
177
+ bulletedList,
178
+ numberedList,
179
+ maskedLink,
180
+ });
181
+ })
182
+ .join(codeBlock ? '\\`\\`\\`' : '```');
183
+ }
184
+ if (!inlineCodeContent) {
185
+ return text
186
+ .split(/(?<=^|[^`])`(?=[^`]|$)/g)
187
+ .map((subString, index, array) => {
188
+ if (index % 2 && index !== array.length - 1) return subString;
189
+ return Util.escapeMarkdown(subString, {
190
+ codeBlock,
191
+ bold,
192
+ italic,
193
+ underline,
194
+ strikethrough,
195
+ spoiler,
196
+ escape,
197
+ heading,
198
+ bulletedList,
199
+ numberedList,
200
+ maskedLink,
201
+ });
202
+ })
203
+ .join(inlineCode ? '\\`' : '`');
204
+ }
205
+ if (escape) text = Util.escapeEscape(text);
206
+ if (inlineCode) text = Util.escapeInlineCode(text);
207
+ if (codeBlock) text = Util.escapeCodeBlock(text);
208
+ if (italic) text = Util.escapeItalic(text);
209
+ if (bold) text = Util.escapeBold(text);
210
+ if (underline) text = Util.escapeUnderline(text);
211
+ if (strikethrough) text = Util.escapeStrikethrough(text);
212
+ if (spoiler) text = Util.escapeSpoiler(text);
213
+ if (heading) text = Util.escapeHeading(text);
214
+ if (bulletedList) text = Util.escapeBulletedList(text);
215
+ if (numberedList) text = Util.escapeNumberedList(text);
216
+ if (maskedLink) text = Util.escapeMaskedLink(text);
217
+ return text;
218
+ }
219
+ /**
220
+ * Escapes code block markdown in a string.
221
+ * @param {string} text Content to escape
222
+ * @returns {string}
223
+ */
224
+ static escapeCodeBlock(text) {
225
+ return text.replaceAll('```', '\\`\\`\\`');
226
+ }
227
+ /**
228
+ * Escapes inline code markdown in a string.
229
+ * @param {string} text Content to escape
230
+ * @returns {string}
231
+ */
232
+ static escapeInlineCode(text) {
233
+ return text.replace(/(?<=^|[^`])``?(?=[^`]|$)/g, match => (match.length === 2 ? '\\`\\`' : '\\`'));
234
+ }
235
+ /**
236
+ * Escapes italic markdown in a string.
237
+ * @param {string} text Content to escape
238
+ * @returns {string}
239
+ */
240
+ static escapeItalic(text) {
241
+ let i = 0;
242
+ text = text.replace(/(?<=^|[^*])\*([^*]|\*\*|$)/g, (_, match) => {
243
+ if (match === '**') return ++i % 2 ? `\\*${match}` : `${match}\\*`;
244
+ return `\\*${match}`;
245
+ });
246
+ i = 0;
247
+ return text.replace(/(?<=^|[^_])_([^_]|__|$)/g, (_, match) => {
248
+ if (match === '__') return ++i % 2 ? `\\_${match}` : `${match}\\_`;
249
+ return `\\_${match}`;
250
+ });
251
+ }
252
+ /**
253
+ * Escapes bold markdown in a string.
254
+ * @param {string} text Content to escape
255
+ * @returns {string}
256
+ */
257
+ static escapeBold(text) {
258
+ let i = 0;
259
+ return text.replace(/\*\*(\*)?/g, (_, match) => {
260
+ if (match) return ++i % 2 ? `${match}\\*\\*` : `\\*\\*${match}`;
261
+ return '\\*\\*';
262
+ });
263
+ }
264
+ /**
265
+ * Escapes underline markdown in a string.
266
+ * @param {string} text Content to escape
267
+ * @returns {string}
268
+ */
269
+ static escapeUnderline(text) {
270
+ let i = 0;
271
+ return text.replace(/__(_)?/g, (_, match) => {
272
+ if (match) return ++i % 2 ? `${match}\\_\\_` : `\\_\\_${match}`;
273
+ return '\\_\\_';
274
+ });
275
+ }
276
+ /**
277
+ * Escapes strikethrough markdown in a string.
278
+ * @param {string} text Content to escape
279
+ * @returns {string}
280
+ */
281
+ static escapeStrikethrough(text) {
282
+ return text.replaceAll('~~', '\\~\\~');
283
+ }
284
+ /**
285
+ * Escapes spoiler markdown in a string.
286
+ * @param {string} text Content to escape
287
+ * @returns {string}
288
+ */
289
+ static escapeSpoiler(text) {
290
+ return text.replaceAll('||', '\\|\\|');
291
+ }
292
+ /**
293
+ * Escapes escape characters in a string.
294
+ * @param {string} text Content to escape
295
+ * @returns {string}
296
+ */
297
+ static escapeEscape(text) {
298
+ return text.replaceAll('\\', '\\\\');
299
+ }
300
+ /**
301
+ * Escapes heading characters in a string.
302
+ * @param {string} text Content to escape
303
+ * @returns {string}
304
+ */
305
+ static escapeHeading(text) {
306
+ return text.replaceAll(/^( {0,2}[*-] +)?(#{1,3} )/gm, '$1\\$2');
307
+ }
308
+ /**
309
+ * Escapes bulleted list characters in a string.
310
+ * @param {string} text Content to escape
311
+ * @returns {string}
312
+ */
313
+ static escapeBulletedList(text) {
314
+ return text.replaceAll(/^( *)[*-]( +)/gm, '$1\\-$2');
315
+ }
316
+ /**
317
+ * Escapes numbered list characters in a string.
318
+ * @param {string} text Content to escape
319
+ * @returns {string}
320
+ */
321
+ static escapeNumberedList(text) {
322
+ return text.replaceAll(/^( *\d+)\./gm, '$1\\.');
323
+ }
324
+ /**
325
+ * Escapes masked link characters in a string.
326
+ * @param {string} text Content to escape
327
+ * @returns {string}
328
+ */
329
+ static escapeMaskedLink(text) {
330
+ return text.replaceAll(/\[.+\]\(.+\)/gm, '\\$&');
331
+ }
332
+
333
+ /**
334
+ * Parses emoji info out of a string. The string must be one of:
335
+ * * A UTF-8 emoji (no id)
336
+ * * A URL-encoded UTF-8 emoji (no id)
337
+ * * A Discord custom emoji (`<:name:id>` or `<a:name:id>`)
338
+ * @param {string} text Emoji string to parse
339
+ * @returns {APIEmoji} Object with `animated`, `name`, and `id` properties
340
+ * @private
341
+ */
342
+ static parseEmoji(text) {
343
+ if (text.includes('%')) text = decodeURIComponent(text);
344
+ if (!text.includes(':')) return { animated: false, name: text, id: null };
345
+ const match = text.match(/<?(?:(a):)?(\w{2,32}):(\d{17,19})?>?/);
346
+ return match && { animated: Boolean(match[1]), name: match[2], id: match[3] ?? null };
347
+ }
348
+
349
+ /**
350
+ * Resolves a partial emoji object from an {@link EmojiIdentifierResolvable}, without checking a Client.
351
+ * @param {EmojiIdentifierResolvable} emoji Emoji identifier to resolve
352
+ * @returns {?RawEmoji}
353
+ * @private
354
+ */
355
+ static resolvePartialEmoji(emoji) {
356
+ if (!emoji) return null;
357
+ if (typeof emoji === 'string') return /^\d{17,19}$/.test(emoji) ? { id: emoji } : Util.parseEmoji(emoji);
358
+ const { id, name, animated } = emoji;
359
+ if (!id && !name) return null;
360
+ return { id, name, animated: Boolean(animated) };
361
+ }
362
+
363
+ /**
364
+ * Shallow-copies an object with its class/prototype intact.
365
+ * @param {Object} obj Object to clone
366
+ * @returns {Object}
367
+ * @private
368
+ */
369
+ static cloneObject(obj) {
370
+ return Object.assign(Object.create(obj), obj);
371
+ }
372
+
373
+ /**
374
+ * Sets default properties on an object that aren't already specified.
375
+ * @param {Object} def Default properties
376
+ * @param {Object} given Object to assign defaults to
377
+ * @returns {Object}
378
+ * @private
379
+ */
380
+ static mergeDefault(def, given) {
381
+ if (!given) return def;
382
+ for (const key in def) {
383
+ if (!has(given, key) || given[key] === undefined) {
384
+ given[key] = def[key];
385
+ } else if (given[key] === Object(given[key])) {
386
+ given[key] = Util.mergeDefault(def[key], given[key]);
387
+ }
388
+ }
389
+
390
+ return given;
391
+ }
392
+
393
+ /**
394
+ * Options used to make an error object.
395
+ * @typedef {Object} MakeErrorOptions
396
+ * @property {string} name Error type
397
+ * @property {string} message Message for the error
398
+ * @property {string} stack Stack for the error
399
+ */
400
+
401
+ /**
402
+ * Makes an Error from a plain info object.
403
+ * @param {MakeErrorOptions} obj Error info
404
+ * @returns {Error}
405
+ * @private
406
+ */
407
+ static makeError(obj) {
408
+ const err = new Error(obj.message);
409
+ err.name = obj.name;
410
+ err.stack = obj.stack;
411
+ return err;
412
+ }
413
+
414
+ /**
415
+ * Makes a plain error info object from an Error.
416
+ * @param {Error} err Error to get info from
417
+ * @returns {MakeErrorOptions}
418
+ * @private
419
+ */
420
+ static makePlainError(err) {
421
+ return {
422
+ name: err.name,
423
+ message: err.message,
424
+ stack: err.stack,
425
+ };
426
+ }
427
+
428
+ /**
429
+ * Moves an element in an array *in place*.
430
+ * @param {Array<*>} array Array to modify
431
+ * @param {*} element Element to move
432
+ * @param {number} newIndex Index or offset to move the element to
433
+ * @param {boolean} [offset=false] Move the element by an offset amount rather than to a set index
434
+ * @returns {number}
435
+ * @private
436
+ */
437
+ static moveElementInArray(array, element, newIndex, offset = false) {
438
+ const index = array.indexOf(element);
439
+ newIndex = (offset ? index : 0) + newIndex;
440
+ if (newIndex > -1 && newIndex < array.length) {
441
+ const removedElement = array.splice(index, 1)[0];
442
+ array.splice(newIndex, 0, removedElement);
443
+ }
444
+ return array.indexOf(element);
445
+ }
446
+
447
+ /**
448
+ * Verifies the provided data is a string, otherwise throws provided error.
449
+ * @param {string} data The string resolvable to resolve
450
+ * @param {Function} [error] The Error constructor to instantiate. Defaults to Error
451
+ * @param {string} [errorMessage] The error message to throw with. Defaults to "Expected string, got <data> instead."
452
+ * @param {boolean} [allowEmpty=true] Whether an empty string should be allowed
453
+ * @returns {string}
454
+ */
455
+ static verifyString(
456
+ data,
457
+ error = Error,
458
+ errorMessage = `Expected a string, got ${data} instead.`,
459
+ allowEmpty = true,
460
+ ) {
461
+ if (typeof data !== 'string') throw new error(errorMessage);
462
+ if (!allowEmpty && data.length === 0) throw new error(errorMessage);
463
+ return data;
464
+ }
465
+
466
+ /**
467
+ * Can be a number, hex string, a {@link Color}, or an RGB array like:
468
+ * ```js
469
+ * [255, 0, 255] // purple
470
+ * ```
471
+ * @typedef {string|Color|number|number[]} ColorResolvable
472
+ */
473
+
474
+ /**
475
+ * Resolves a ColorResolvable into a color number.
476
+ * @param {ColorResolvable} color Color to resolve
477
+ * @returns {number} A color
478
+ */
479
+ static resolveColor(color) {
480
+ if (typeof color === 'string') {
481
+ if (color === 'RANDOM') return Math.floor(Math.random() * (0xffffff + 1));
482
+ if (color === 'DEFAULT') return 0;
483
+ color = Colors[color] ?? parseInt(color.replace('#', ''), 16);
484
+ } else if (Array.isArray(color)) {
485
+ color = (color[0] << 16) + (color[1] << 8) + color[2];
486
+ }
487
+
488
+ if (color < 0 || color > 0xffffff) throw new RangeError('COLOR_RANGE');
489
+ else if (Number.isNaN(color)) throw new TypeError('COLOR_CONVERT');
490
+
491
+ return color;
492
+ }
493
+
494
+ /**
495
+ * Sorts by Discord's position and id.
496
+ * @param {Collection} collection Collection of objects to sort
497
+ * @returns {Collection}
498
+ */
499
+ static discordSort(collection) {
500
+ const isGuildChannel = collection.first() instanceof GuildChannel;
501
+ return collection.sorted(
502
+ isGuildChannel
503
+ ? (a, b) => a.rawPosition - b.rawPosition || Number(BigInt(a.id) - BigInt(b.id))
504
+ : (a, b) => a.rawPosition - b.rawPosition || Number(BigInt(b.id) - BigInt(a.id)),
505
+ );
506
+ }
507
+
508
+ /**
509
+ * Sets the position of a Channel or Role.
510
+ * @param {Channel|Role} item Object to set the position of
511
+ * @param {number} position New position for the object
512
+ * @param {boolean} relative Whether `position` is relative to its current position
513
+ * @param {Collection<string, Channel|Role>} sorted A collection of the objects sorted properly
514
+ * @param {APIRouter} route Route to call PATCH on
515
+ * @param {string} [reason] Reason for the change
516
+ * @returns {Promise<Channel[]|Role[]>} Updated item list, with `id` and `position` properties
517
+ * @private
518
+ */
519
+ static async setPosition(item, position, relative, sorted, route, reason) {
520
+ let updatedItems = [...sorted.values()];
521
+ Util.moveElementInArray(updatedItems, item, position, relative);
522
+ updatedItems = updatedItems.map((r, i) => ({ id: r.id, position: i }));
523
+ await route.patch({ data: updatedItems, reason });
524
+ return updatedItems;
525
+ }
526
+
527
+ /**
528
+ * Alternative to Node's `path.basename`, removing query string after the extension if it exists.
529
+ * @param {string} path Path to get the basename of
530
+ * @param {string} [ext] File extension to remove
531
+ * @returns {string} Basename of the path
532
+ * @private
533
+ */
534
+ static basename(path, ext) {
535
+ const res = parse(path);
536
+ return ext && res.ext.startsWith(ext) ? res.name : res.base.split('?')[0];
537
+ }
538
+
539
+ /**
540
+ * Breaks user, role and everyone/here mentions by adding a zero width space after every @ character
541
+ * @param {string} str The string to sanitize
542
+ * @returns {string}
543
+ * @deprecated Use {@link BaseMessageOptions#allowedMentions} instead.
544
+ */
545
+ static removeMentions(str) {
546
+ if (!deprecationEmittedForRemoveMentions) {
547
+ process.emitWarning(
548
+ 'The Util.removeMentions method is deprecated. Use MessageOptions#allowedMentions instead.',
549
+ 'DeprecationWarning',
550
+ );
551
+
552
+ deprecationEmittedForRemoveMentions = true;
553
+ }
554
+
555
+ return Util._removeMentions(str);
556
+ }
557
+
558
+ static _removeMentions(str) {
559
+ return str.replaceAll('@', '@\u200b');
560
+ }
561
+
562
+ /**
563
+ * The content to have all mentions replaced by the equivalent text.
564
+ * <warn>When {@link Util.removeMentions} is removed, this method will no longer sanitize mentions.
565
+ * Use {@link BaseMessageOptions#allowedMentions} instead to prevent mentions when sending a message.</warn>
566
+ * @param {string} str The string to be converted
567
+ * @param {TextBasedChannels} channel The channel the string was sent in
568
+ * @returns {string}
569
+ */
570
+ static cleanContent(str, channel) {
571
+ str = str
572
+ .replace(/<@!?[0-9]+>/g, input => {
573
+ const id = input.replace(/<|!|>|@/g, '');
574
+ if (channel.type === 'DM') {
575
+ const user = channel.client.users.cache.get(id);
576
+ return user ? Util._removeMentions(`@${user.username}`) : input;
577
+ }
578
+
579
+ const member = channel.guild.members.cache.get(id);
580
+ if (member) {
581
+ return Util._removeMentions(`@${member.displayName}`);
582
+ } else {
583
+ const user = channel.client.users.cache.get(id);
584
+ return user ? Util._removeMentions(`@${user.username}`) : input;
585
+ }
586
+ })
587
+ .replace(/<#[0-9]+>/g, input => {
588
+ const mentionedChannel = channel.client.channels.cache.get(input.replace(/<|#|>/g, ''));
589
+ return mentionedChannel ? `#${mentionedChannel.name}` : input;
590
+ })
591
+ .replace(/<@&[0-9]+>/g, input => {
592
+ if (channel.type === 'DM') return input;
593
+ const role = channel.guild.roles.cache.get(input.replace(/<|@|>|&/g, ''));
594
+ return role ? `@${role.name}` : input;
595
+ });
596
+ return str;
597
+ }
598
+
599
+ /**
600
+ * The content to put in a code block with all code block fences replaced by the equivalent backticks.
601
+ * @param {string} text The string to be converted
602
+ * @returns {string}
603
+ */
604
+ static cleanCodeBlockContent(text) {
605
+ return text.replaceAll('```', '`\u200b``');
606
+ }
607
+
608
+ /**
609
+ * Creates a sweep filter that sweeps archived threads
610
+ * @param {number} [lifetime=14400] How long a thread has to be archived to be valid for sweeping
611
+ * @deprecated When not using with `makeCache` use `Sweepers.archivedThreadSweepFilter` instead
612
+ * @returns {SweepFilter}
613
+ */
614
+ static archivedThreadSweepFilter(lifetime = 14400) {
615
+ const filter = require('./Sweepers').archivedThreadSweepFilter(lifetime);
616
+ filter.isDefault = true;
617
+ return filter;
618
+ }
619
+
620
+ /**
621
+ * Resolves the maximum time a guild's thread channels should automatically archive in case of no recent activity.
622
+ * @deprecated
623
+ * @returns {number}
624
+ */
625
+ static resolveAutoArchiveMaxLimit() {
626
+ return 10080;
627
+ }
628
+
629
+ /**
630
+ * Lazily evaluates a callback function (yea it's v14 :yay:)
631
+ * @param {Function} cb The callback to lazily evaluate
632
+ * @returns {Function}
633
+ * @example
634
+ * const User = lazy(() => require('./User'));
635
+ * const user = new (User())(client, data);
636
+ */
637
+ static lazy(cb) {
638
+ let defaultValue;
639
+ return () => (defaultValue ??= cb());
640
+ }
641
+
642
+ /**
643
+ * Transforms an API guild forum tag to camel-cased guild forum tag.
644
+ * @param {APIGuildForumTag} tag The tag to transform
645
+ * @returns {GuildForumTag}
646
+ * @ignore
647
+ */
648
+ static transformAPIGuildForumTag(tag) {
649
+ return {
650
+ id: tag.id,
651
+ name: tag.name,
652
+ moderated: tag.moderated,
653
+ emoji:
654
+ tag.emoji_id ?? tag.emoji_name
655
+ ? {
656
+ id: tag.emoji_id,
657
+ name: tag.emoji_name,
658
+ }
659
+ : null,
660
+ };
661
+ }
662
+
663
+ /**
664
+ * Transforms a camel-cased guild forum tag to an API guild forum tag.
665
+ * @param {GuildForumTag} tag The tag to transform
666
+ * @returns {APIGuildForumTag}
667
+ * @ignore
668
+ */
669
+ static transformGuildForumTag(tag) {
670
+ return {
671
+ id: tag.id,
672
+ name: tag.name,
673
+ moderated: tag.moderated,
674
+ emoji_id: tag.emoji?.id ?? null,
675
+ emoji_name: tag.emoji?.name ?? null,
676
+ };
677
+ }
678
+
679
+ /**
680
+ * Transforms an API guild forum default reaction object to a
681
+ * camel-cased guild forum default reaction object.
682
+ * @param {APIGuildForumDefaultReactionEmoji} defaultReaction The default reaction to transform
683
+ * @returns {DefaultReactionEmoji}
684
+ * @ignore
685
+ */
686
+ static transformAPIGuildDefaultReaction(defaultReaction) {
687
+ return {
688
+ id: defaultReaction.emoji_id,
689
+ name: defaultReaction.emoji_name,
690
+ };
691
+ }
692
+
693
+ /**
694
+ * Transforms a camel-cased guild forum default reaction object to an
695
+ * API guild forum default reaction object.
696
+ * @param {DefaultReactionEmoji} defaultReaction The default reaction to transform
697
+ * @returns {APIGuildForumDefaultReactionEmoji}
698
+ * @ignore
699
+ */
700
+ static transformGuildDefaultReaction(defaultReaction) {
701
+ return {
702
+ emoji_id: defaultReaction.id,
703
+ emoji_name: defaultReaction.name,
704
+ };
705
+ }
706
+
707
+ static async getAttachments(client, channelId, ...files) {
708
+ files = files.flat(2);
709
+ if (!files.length) return [];
710
+ files = files.map((file, i) => ({
711
+ filename: file.name ?? file.attachment?.name ?? file.attachment?.filename ?? 'file.jpg',
712
+ // 8MB = 8388608 bytes
713
+ file_size: Math.floor((8_388_608 / 10) * Math.random()),
714
+ id: `${i}`,
715
+ }));
716
+ const { attachments } = await client.api.channels[channelId].attachments.post({
717
+ data: {
718
+ files,
719
+ },
720
+ });
721
+ return attachments;
722
+ }
723
+
724
+ static uploadFile(data, url) {
725
+ return axios.put(url, data);
726
+ }
727
+
728
+ static testImportModule(name) {
729
+ try {
730
+ require.resolve(name);
731
+ return true;
732
+ } catch {
733
+ return false;
734
+ }
735
+ }
736
+ }
737
+
738
+ module.exports = Util;
739
+
740
+ // Fixes Circular
741
+ const GuildChannel = require('../structures/GuildChannel');