@velliajs/discord 1.0.0

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.
Files changed (317) hide show
  1. package/LICENSE +191 -0
  2. package/README.md +133 -0
  3. package/package.json +82 -0
  4. package/src/client/BaseClient.js +83 -0
  5. package/src/client/Client.js +591 -0
  6. package/src/client/WebhookClient.js +103 -0
  7. package/src/client/actions/Action.js +119 -0
  8. package/src/client/actions/ActionsManager.js +79 -0
  9. package/src/client/actions/ApplicationCommandPermissionsUpdate.js +34 -0
  10. package/src/client/actions/AutoModerationActionExecution.js +26 -0
  11. package/src/client/actions/AutoModerationRuleCreate.js +27 -0
  12. package/src/client/actions/AutoModerationRuleDelete.js +31 -0
  13. package/src/client/actions/AutoModerationRuleUpdate.js +29 -0
  14. package/src/client/actions/ChannelCreate.js +23 -0
  15. package/src/client/actions/ChannelDelete.js +23 -0
  16. package/src/client/actions/ChannelUpdate.js +33 -0
  17. package/src/client/actions/GuildAuditLogEntryCreate.js +29 -0
  18. package/src/client/actions/GuildBanAdd.js +20 -0
  19. package/src/client/actions/GuildBanRemove.js +25 -0
  20. package/src/client/actions/GuildChannelsPositionUpdate.js +21 -0
  21. package/src/client/actions/GuildDelete.js +44 -0
  22. package/src/client/actions/GuildEmojiCreate.js +20 -0
  23. package/src/client/actions/GuildEmojiDelete.js +19 -0
  24. package/src/client/actions/GuildEmojiUpdate.js +20 -0
  25. package/src/client/actions/GuildEmojisUpdate.js +34 -0
  26. package/src/client/actions/GuildIntegrationsUpdate.js +19 -0
  27. package/src/client/actions/GuildMemberRemove.js +31 -0
  28. package/src/client/actions/GuildMemberUpdate.js +44 -0
  29. package/src/client/actions/GuildRoleCreate.js +25 -0
  30. package/src/client/actions/GuildRoleDelete.js +29 -0
  31. package/src/client/actions/GuildRoleUpdate.js +39 -0
  32. package/src/client/actions/GuildRolesPositionUpdate.js +21 -0
  33. package/src/client/actions/GuildScheduledEventCreate.js +27 -0
  34. package/src/client/actions/GuildScheduledEventDelete.js +31 -0
  35. package/src/client/actions/GuildScheduledEventUpdate.js +30 -0
  36. package/src/client/actions/GuildScheduledEventUserAdd.js +32 -0
  37. package/src/client/actions/GuildScheduledEventUserRemove.js +32 -0
  38. package/src/client/actions/GuildStickerCreate.js +20 -0
  39. package/src/client/actions/GuildStickerDelete.js +19 -0
  40. package/src/client/actions/GuildStickerUpdate.js +20 -0
  41. package/src/client/actions/GuildStickersUpdate.js +34 -0
  42. package/src/client/actions/GuildUpdate.js +33 -0
  43. package/src/client/actions/InteractionCreate.js +101 -0
  44. package/src/client/actions/InviteCreate.js +28 -0
  45. package/src/client/actions/InviteDelete.js +30 -0
  46. package/src/client/actions/MessageCreate.js +37 -0
  47. package/src/client/actions/MessageDelete.js +32 -0
  48. package/src/client/actions/MessageDeleteBulk.js +47 -0
  49. package/src/client/actions/MessageReactionAdd.js +55 -0
  50. package/src/client/actions/MessageReactionRemove.js +45 -0
  51. package/src/client/actions/MessageReactionRemoveAll.js +33 -0
  52. package/src/client/actions/MessageReactionRemoveEmoji.js +28 -0
  53. package/src/client/actions/MessageUpdate.js +26 -0
  54. package/src/client/actions/PresenceUpdate.js +42 -0
  55. package/src/client/actions/StageInstanceCreate.js +28 -0
  56. package/src/client/actions/StageInstanceDelete.js +31 -0
  57. package/src/client/actions/StageInstanceUpdate.js +30 -0
  58. package/src/client/actions/ThreadCreate.js +24 -0
  59. package/src/client/actions/ThreadDelete.js +26 -0
  60. package/src/client/actions/ThreadListSync.js +60 -0
  61. package/src/client/actions/ThreadMemberUpdate.js +30 -0
  62. package/src/client/actions/ThreadMembersUpdate.js +47 -0
  63. package/src/client/actions/TypingStart.js +29 -0
  64. package/src/client/actions/UserUpdate.js +36 -0
  65. package/src/client/actions/VoiceStateUpdate.js +43 -0
  66. package/src/client/actions/WebhooksUpdate.js +20 -0
  67. package/src/client/voice/ClientVoiceManager.js +44 -0
  68. package/src/client/websocket/WebSocketManager.js +393 -0
  69. package/src/client/websocket/WebSocketShard.js +231 -0
  70. package/src/client/websocket/handlers/APPLICATION_COMMAND_PERMISSIONS_UPDATE.js +5 -0
  71. package/src/client/websocket/handlers/AUTO_MODERATION_ACTION_EXECUTION.js +5 -0
  72. package/src/client/websocket/handlers/AUTO_MODERATION_RULE_CREATE.js +5 -0
  73. package/src/client/websocket/handlers/AUTO_MODERATION_RULE_DELETE.js +5 -0
  74. package/src/client/websocket/handlers/AUTO_MODERATION_RULE_UPDATE.js +5 -0
  75. package/src/client/websocket/handlers/CHANNEL_CREATE.js +5 -0
  76. package/src/client/websocket/handlers/CHANNEL_DELETE.js +5 -0
  77. package/src/client/websocket/handlers/CHANNEL_PINS_UPDATE.js +22 -0
  78. package/src/client/websocket/handlers/CHANNEL_UPDATE.js +16 -0
  79. package/src/client/websocket/handlers/GUILD_AUDIT_LOG_ENTRY_CREATE.js +5 -0
  80. package/src/client/websocket/handlers/GUILD_BAN_ADD.js +5 -0
  81. package/src/client/websocket/handlers/GUILD_BAN_REMOVE.js +5 -0
  82. package/src/client/websocket/handlers/GUILD_CREATE.js +26 -0
  83. package/src/client/websocket/handlers/GUILD_DELETE.js +5 -0
  84. package/src/client/websocket/handlers/GUILD_EMOJIS_UPDATE.js +5 -0
  85. package/src/client/websocket/handlers/GUILD_INTEGRATIONS_UPDATE.js +5 -0
  86. package/src/client/websocket/handlers/GUILD_MEMBERS_CHUNK.js +39 -0
  87. package/src/client/websocket/handlers/GUILD_MEMBER_ADD.js +20 -0
  88. package/src/client/websocket/handlers/GUILD_MEMBER_REMOVE.js +5 -0
  89. package/src/client/websocket/handlers/GUILD_MEMBER_UPDATE.js +5 -0
  90. package/src/client/websocket/handlers/GUILD_ROLE_CREATE.js +5 -0
  91. package/src/client/websocket/handlers/GUILD_ROLE_DELETE.js +5 -0
  92. package/src/client/websocket/handlers/GUILD_ROLE_UPDATE.js +5 -0
  93. package/src/client/websocket/handlers/GUILD_SCHEDULED_EVENT_CREATE.js +5 -0
  94. package/src/client/websocket/handlers/GUILD_SCHEDULED_EVENT_DELETE.js +5 -0
  95. package/src/client/websocket/handlers/GUILD_SCHEDULED_EVENT_UPDATE.js +5 -0
  96. package/src/client/websocket/handlers/GUILD_SCHEDULED_EVENT_USER_ADD.js +5 -0
  97. package/src/client/websocket/handlers/GUILD_SCHEDULED_EVENT_USER_REMOVE.js +5 -0
  98. package/src/client/websocket/handlers/GUILD_STICKERS_UPDATE.js +5 -0
  99. package/src/client/websocket/handlers/GUILD_UPDATE.js +5 -0
  100. package/src/client/websocket/handlers/INTERACTION_CREATE.js +5 -0
  101. package/src/client/websocket/handlers/INVITE_CREATE.js +5 -0
  102. package/src/client/websocket/handlers/INVITE_DELETE.js +5 -0
  103. package/src/client/websocket/handlers/MESSAGE_CREATE.js +5 -0
  104. package/src/client/websocket/handlers/MESSAGE_DELETE.js +5 -0
  105. package/src/client/websocket/handlers/MESSAGE_DELETE_BULK.js +5 -0
  106. package/src/client/websocket/handlers/MESSAGE_REACTION_ADD.js +5 -0
  107. package/src/client/websocket/handlers/MESSAGE_REACTION_REMOVE.js +5 -0
  108. package/src/client/websocket/handlers/MESSAGE_REACTION_REMOVE_ALL.js +5 -0
  109. package/src/client/websocket/handlers/MESSAGE_REACTION_REMOVE_EMOJI.js +5 -0
  110. package/src/client/websocket/handlers/MESSAGE_UPDATE.js +16 -0
  111. package/src/client/websocket/handlers/PRESENCE_UPDATE.js +5 -0
  112. package/src/client/websocket/handlers/READY.js +27 -0
  113. package/src/client/websocket/handlers/RESUMED.js +14 -0
  114. package/src/client/websocket/handlers/STAGE_INSTANCE_CREATE.js +5 -0
  115. package/src/client/websocket/handlers/STAGE_INSTANCE_DELETE.js +5 -0
  116. package/src/client/websocket/handlers/STAGE_INSTANCE_UPDATE.js +5 -0
  117. package/src/client/websocket/handlers/THREAD_CREATE.js +5 -0
  118. package/src/client/websocket/handlers/THREAD_DELETE.js +5 -0
  119. package/src/client/websocket/handlers/THREAD_LIST_SYNC.js +5 -0
  120. package/src/client/websocket/handlers/THREAD_MEMBERS_UPDATE.js +5 -0
  121. package/src/client/websocket/handlers/THREAD_MEMBER_UPDATE.js +5 -0
  122. package/src/client/websocket/handlers/THREAD_UPDATE.js +16 -0
  123. package/src/client/websocket/handlers/TYPING_START.js +5 -0
  124. package/src/client/websocket/handlers/USER_UPDATE.js +5 -0
  125. package/src/client/websocket/handlers/VOICE_SERVER_UPDATE.js +6 -0
  126. package/src/client/websocket/handlers/VOICE_STATE_UPDATE.js +5 -0
  127. package/src/client/websocket/handlers/WEBHOOKS_UPDATE.js +5 -0
  128. package/src/client/websocket/handlers/index.js +64 -0
  129. package/src/errors/DJSError.js +48 -0
  130. package/src/errors/ErrorCodes.js +319 -0
  131. package/src/errors/Messages.js +170 -0
  132. package/src/errors/index.js +5 -0
  133. package/src/index.js +213 -0
  134. package/src/managers/ApplicationCommandManager.js +263 -0
  135. package/src/managers/ApplicationCommandPermissionsManager.js +434 -0
  136. package/src/managers/AutoModerationRuleManager.js +288 -0
  137. package/src/managers/BaseGuildEmojiManager.js +80 -0
  138. package/src/managers/BaseManager.js +19 -0
  139. package/src/managers/CachedManager.js +57 -0
  140. package/src/managers/CategoryChannelChildManager.js +77 -0
  141. package/src/managers/ChannelManager.js +128 -0
  142. package/src/managers/DataManager.js +61 -0
  143. package/src/managers/GuildApplicationCommandManager.js +28 -0
  144. package/src/managers/GuildBanManager.js +204 -0
  145. package/src/managers/GuildChannelManager.js +494 -0
  146. package/src/managers/GuildEmojiManager.js +174 -0
  147. package/src/managers/GuildEmojiRoleManager.js +118 -0
  148. package/src/managers/GuildForumThreadManager.js +83 -0
  149. package/src/managers/GuildInviteManager.js +213 -0
  150. package/src/managers/GuildManager.js +283 -0
  151. package/src/managers/GuildMemberManager.js +540 -0
  152. package/src/managers/GuildMemberRoleManager.js +204 -0
  153. package/src/managers/GuildScheduledEventManager.js +297 -0
  154. package/src/managers/GuildStickerManager.js +182 -0
  155. package/src/managers/GuildTextThreadManager.js +91 -0
  156. package/src/managers/MessageManager.js +259 -0
  157. package/src/managers/PermissionOverwriteManager.js +168 -0
  158. package/src/managers/PresenceManager.js +58 -0
  159. package/src/managers/ReactionManager.js +68 -0
  160. package/src/managers/ReactionUserManager.js +77 -0
  161. package/src/managers/RoleManager.js +360 -0
  162. package/src/managers/StageInstanceManager.js +154 -0
  163. package/src/managers/ThreadManager.js +204 -0
  164. package/src/managers/ThreadMemberManager.js +182 -0
  165. package/src/managers/UserManager.js +139 -0
  166. package/src/managers/VoiceStateManager.js +37 -0
  167. package/src/sharding/Shard.js +457 -0
  168. package/src/sharding/ShardClientUtil.js +285 -0
  169. package/src/sharding/ShardingManager.js +326 -0
  170. package/src/structures/ActionRow.js +46 -0
  171. package/src/structures/ActionRowBuilder.js +35 -0
  172. package/src/structures/AnonymousGuild.js +97 -0
  173. package/src/structures/ApplicationCommand.js +606 -0
  174. package/src/structures/ApplicationRoleConnectionMetadata.js +46 -0
  175. package/src/structures/Attachment.js +140 -0
  176. package/src/structures/AttachmentBuilder.js +116 -0
  177. package/src/structures/AutoModerationActionExecution.js +116 -0
  178. package/src/structures/AutoModerationRule.js +284 -0
  179. package/src/structures/AutocompleteInteraction.js +97 -0
  180. package/src/structures/Base.js +43 -0
  181. package/src/structures/BaseChannel.js +160 -0
  182. package/src/structures/BaseGuild.js +119 -0
  183. package/src/structures/BaseGuildEmoji.js +56 -0
  184. package/src/structures/BaseGuildTextChannel.js +186 -0
  185. package/src/structures/BaseGuildVoiceChannel.js +234 -0
  186. package/src/structures/BaseInteraction.js +344 -0
  187. package/src/structures/BaseSelectMenuComponent.js +56 -0
  188. package/src/structures/ButtonBuilder.js +44 -0
  189. package/src/structures/ButtonComponent.js +65 -0
  190. package/src/structures/ButtonInteraction.js +11 -0
  191. package/src/structures/CategoryChannel.js +45 -0
  192. package/src/structures/ChannelSelectMenuBuilder.js +31 -0
  193. package/src/structures/ChannelSelectMenuComponent.js +20 -0
  194. package/src/structures/ChannelSelectMenuInteraction.js +33 -0
  195. package/src/structures/ChatInputCommandInteraction.js +41 -0
  196. package/src/structures/ClientApplication.js +193 -0
  197. package/src/structures/ClientPresence.js +82 -0
  198. package/src/structures/ClientUser.js +185 -0
  199. package/src/structures/CommandInteraction.js +224 -0
  200. package/src/structures/CommandInteractionOptionResolver.js +308 -0
  201. package/src/structures/Component.js +47 -0
  202. package/src/structures/ContextMenuCommandInteraction.js +64 -0
  203. package/src/structures/DMChannel.js +129 -0
  204. package/src/structures/DirectoryChannel.js +36 -0
  205. package/src/structures/Embed.js +220 -0
  206. package/src/structures/EmbedBuilder.js +41 -0
  207. package/src/structures/Emoji.js +108 -0
  208. package/src/structures/ForumChannel.js +264 -0
  209. package/src/structures/Guild.js +1361 -0
  210. package/src/structures/GuildAuditLogs.js +91 -0
  211. package/src/structures/GuildAuditLogsEntry.js +527 -0
  212. package/src/structures/GuildBan.js +59 -0
  213. package/src/structures/GuildChannel.js +457 -0
  214. package/src/structures/GuildEmoji.js +148 -0
  215. package/src/structures/GuildMember.js +518 -0
  216. package/src/structures/GuildPreview.js +193 -0
  217. package/src/structures/GuildPreviewEmoji.js +27 -0
  218. package/src/structures/GuildScheduledEvent.js +439 -0
  219. package/src/structures/GuildTemplate.js +241 -0
  220. package/src/structures/Integration.js +220 -0
  221. package/src/structures/IntegrationApplication.js +85 -0
  222. package/src/structures/InteractionCollector.js +263 -0
  223. package/src/structures/InteractionResponse.js +102 -0
  224. package/src/structures/InteractionWebhook.js +59 -0
  225. package/src/structures/Invite.js +322 -0
  226. package/src/structures/InviteGuild.js +22 -0
  227. package/src/structures/InviteStageInstance.js +87 -0
  228. package/src/structures/MentionableSelectMenuBuilder.js +32 -0
  229. package/src/structures/MentionableSelectMenuComponent.js +11 -0
  230. package/src/structures/MentionableSelectMenuInteraction.js +71 -0
  231. package/src/structures/Message.js +997 -0
  232. package/src/structures/MessageCollector.js +146 -0
  233. package/src/structures/MessageComponentInteraction.js +107 -0
  234. package/src/structures/MessageContextMenuCommandInteraction.js +20 -0
  235. package/src/structures/MessageMentions.js +297 -0
  236. package/src/structures/MessagePayload.js +299 -0
  237. package/src/structures/MessageReaction.js +142 -0
  238. package/src/structures/ModalBuilder.js +34 -0
  239. package/src/structures/ModalSubmitFields.js +55 -0
  240. package/src/structures/ModalSubmitInteraction.js +121 -0
  241. package/src/structures/NewsChannel.js +32 -0
  242. package/src/structures/OAuth2Guild.js +28 -0
  243. package/src/structures/PartialGroupDMChannel.js +60 -0
  244. package/src/structures/PermissionOverwrites.js +196 -0
  245. package/src/structures/Presence.js +372 -0
  246. package/src/structures/ReactionCollector.js +229 -0
  247. package/src/structures/ReactionEmoji.js +31 -0
  248. package/src/structures/Role.js +458 -0
  249. package/src/structures/RoleSelectMenuBuilder.js +31 -0
  250. package/src/structures/RoleSelectMenuComponent.js +11 -0
  251. package/src/structures/RoleSelectMenuInteraction.js +33 -0
  252. package/src/structures/SelectMenuBuilder.js +26 -0
  253. package/src/structures/SelectMenuComponent.js +26 -0
  254. package/src/structures/SelectMenuInteraction.js +26 -0
  255. package/src/structures/SelectMenuOptionBuilder.js +26 -0
  256. package/src/structures/StageChannel.js +112 -0
  257. package/src/structures/StageInstance.js +167 -0
  258. package/src/structures/Sticker.js +272 -0
  259. package/src/structures/StickerPack.js +95 -0
  260. package/src/structures/StringSelectMenuBuilder.js +79 -0
  261. package/src/structures/StringSelectMenuComponent.js +20 -0
  262. package/src/structures/StringSelectMenuInteraction.js +21 -0
  263. package/src/structures/StringSelectMenuOptionBuilder.js +49 -0
  264. package/src/structures/Team.js +117 -0
  265. package/src/structures/TeamMember.js +70 -0
  266. package/src/structures/TextChannel.js +33 -0
  267. package/src/structures/TextInputBuilder.js +31 -0
  268. package/src/structures/TextInputComponent.js +29 -0
  269. package/src/structures/ThreadChannel.js +606 -0
  270. package/src/structures/ThreadMember.js +113 -0
  271. package/src/structures/Typing.js +74 -0
  272. package/src/structures/User.js +331 -0
  273. package/src/structures/UserContextMenuCommandInteraction.js +29 -0
  274. package/src/structures/UserSelectMenuBuilder.js +31 -0
  275. package/src/structures/UserSelectMenuComponent.js +11 -0
  276. package/src/structures/UserSelectMenuInteraction.js +51 -0
  277. package/src/structures/VoiceChannel.js +96 -0
  278. package/src/structures/VoiceRegion.js +46 -0
  279. package/src/structures/VoiceState.js +303 -0
  280. package/src/structures/Webhook.js +481 -0
  281. package/src/structures/WelcomeChannel.js +60 -0
  282. package/src/structures/WelcomeScreen.js +49 -0
  283. package/src/structures/Widget.js +88 -0
  284. package/src/structures/WidgetMember.js +99 -0
  285. package/src/structures/interfaces/Application.js +108 -0
  286. package/src/structures/interfaces/Collector.js +335 -0
  287. package/src/structures/interfaces/InteractionResponses.js +320 -0
  288. package/src/structures/interfaces/TextBasedChannel.js +413 -0
  289. package/src/util/APITypes.js +456 -0
  290. package/src/util/ActivityFlagsBitField.js +26 -0
  291. package/src/util/ApplicationFlagsBitField.js +26 -0
  292. package/src/util/BitField.js +176 -0
  293. package/src/util/ChannelFlagsBitField.js +41 -0
  294. package/src/util/Channels.js +150 -0
  295. package/src/util/Colors.js +73 -0
  296. package/src/util/Components.js +152 -0
  297. package/src/util/Constants.js +230 -0
  298. package/src/util/DataResolver.js +140 -0
  299. package/src/util/Enums.js +13 -0
  300. package/src/util/Events.js +160 -0
  301. package/src/util/Formatters.js +413 -0
  302. package/src/util/GuildMemberFlagsBitField.js +41 -0
  303. package/src/util/IntentsBitField.js +34 -0
  304. package/src/util/LimitedCollection.js +68 -0
  305. package/src/util/MessageFlagsBitField.js +32 -0
  306. package/src/util/Options.js +216 -0
  307. package/src/util/Partials.js +44 -0
  308. package/src/util/PermissionsBitField.js +104 -0
  309. package/src/util/ShardEvents.js +27 -0
  310. package/src/util/Status.js +33 -0
  311. package/src/util/Sweepers.js +467 -0
  312. package/src/util/SystemChannelFlagsBitField.js +43 -0
  313. package/src/util/ThreadMemberFlagsBitField.js +31 -0
  314. package/src/util/Transformers.js +36 -0
  315. package/src/util/UserFlagsBitField.js +32 -0
  316. package/src/util/Util.js +394 -0
  317. package/src/util/WebSocketShardEvents.js +25 -0
@@ -0,0 +1,394 @@
1
+ 'use strict';
2
+
3
+ const { parse } = require('node:path');
4
+ const { Collection } = require('@discordjs/collection');
5
+ const { ChannelType, RouteBases, Routes } = require('discord-api-types/v10');
6
+ const { fetch } = require('undici');
7
+ const Colors = require('./Colors');
8
+ const { DiscordjsError, DiscordjsRangeError, DiscordjsTypeError, ErrorCodes } = require('../errors');
9
+ const isObject = d => typeof d === 'object' && d !== null;
10
+
11
+ /**
12
+ * Flatten an object. Any properties that are collections will get converted to an array of keys.
13
+ * @param {Object} obj The object to flatten.
14
+ * @param {...Object<string, boolean|string>} [props] Specific properties to include/exclude.
15
+ * @returns {Object}
16
+ */
17
+ function flatten(obj, ...props) {
18
+ if (!isObject(obj)) return obj;
19
+
20
+ const objProps = Object.keys(obj)
21
+ .filter(k => !k.startsWith('_'))
22
+ .map(k => ({ [k]: true }));
23
+
24
+ props = objProps.length ? Object.assign(...objProps, ...props) : Object.assign({}, ...props);
25
+
26
+ const out = {};
27
+
28
+ for (let [prop, newProp] of Object.entries(props)) {
29
+ if (!newProp) continue;
30
+ newProp = newProp === true ? prop : newProp;
31
+
32
+ const element = obj[prop];
33
+ const elemIsObj = isObject(element);
34
+ const valueOf = elemIsObj && typeof element.valueOf === 'function' ? element.valueOf() : null;
35
+ const hasToJSON = elemIsObj && typeof element.toJSON === 'function';
36
+
37
+ // If it's a Collection, make the array of keys
38
+ if (element instanceof Collection) out[newProp] = Array.from(element.keys());
39
+ // If the valueOf is a Collection, use its array of keys
40
+ else if (valueOf instanceof Collection) out[newProp] = Array.from(valueOf.keys());
41
+ // If it's an array, call toJSON function on each element if present, otherwise flatten each element
42
+ else if (Array.isArray(element)) out[newProp] = element.map(e => e.toJSON?.() ?? flatten(e));
43
+ // If it's an object with a primitive `valueOf`, use that value
44
+ else if (typeof valueOf !== 'object') out[newProp] = valueOf;
45
+ // If it's an object with a toJSON function, use the return value of it
46
+ else if (hasToJSON) out[newProp] = element.toJSON();
47
+ // If element is an object, use the flattened version of it
48
+ else if (typeof element === 'object') out[newProp] = flatten(element);
49
+ // If it's a primitive
50
+ else if (!elemIsObj) out[newProp] = element;
51
+ }
52
+
53
+ return out;
54
+ }
55
+
56
+ /**
57
+ * @typedef {Object} FetchRecommendedShardCountOptions
58
+ * @property {number} [guildsPerShard=1000] Number of guilds assigned per shard
59
+ * @property {number} [multipleOf=1] The multiple the shard count should round up to. (16 for large bot sharding)
60
+ */
61
+
62
+ /**
63
+ * Gets the recommended shard count from Discord.
64
+ * @param {string} token Discord auth token
65
+ * @param {FetchRecommendedShardCountOptions} [options] Options for fetching the recommended shard count
66
+ * @returns {Promise<number>} The recommended number of shards
67
+ */
68
+ async function fetchRecommendedShardCount(token, { guildsPerShard = 1_000, multipleOf = 1 } = {}) {
69
+ if (!token) throw new DiscordjsError(ErrorCodes.TokenMissing);
70
+ const response = await fetch(RouteBases.api + Routes.gatewayBot(), {
71
+ method: 'GET',
72
+ headers: { Authorization: `Bot ${token.replace(/^Bot\s*/i, '')}` },
73
+ });
74
+ if (!response.ok) {
75
+ if (response.status === 401) throw new DiscordjsError(ErrorCodes.TokenInvalid);
76
+ throw response;
77
+ }
78
+ const { shards } = await response.json();
79
+ return Math.ceil((shards * (1_000 / guildsPerShard)) / multipleOf) * multipleOf;
80
+ }
81
+
82
+ /**
83
+ * Parses emoji info out of a string. The string must be one of:
84
+ * * A UTF-8 emoji (no id)
85
+ * * A URL-encoded UTF-8 emoji (no id)
86
+ * * A Discord custom emoji (`<:name:id>` or `<a:name:id>`)
87
+ * @param {string} text Emoji string to parse
88
+ * @returns {APIEmoji} Object with `animated`, `name`, and `id` properties
89
+ */
90
+ function parseEmoji(text) {
91
+ if (text.includes('%')) text = decodeURIComponent(text);
92
+ if (!text.includes(':')) return { animated: false, name: text, id: undefined };
93
+ const match = text.match(/<?(?:(a):)?(\w{2,32}):(\d{17,19})?>?/);
94
+ return match && { animated: Boolean(match[1]), name: match[2], id: match[3] };
95
+ }
96
+
97
+ /**
98
+ * Resolves a partial emoji object from an {@link EmojiIdentifierResolvable}, without checking a Client.
99
+ * @param {EmojiIdentifierResolvable} emoji Emoji identifier to resolve
100
+ * @returns {?RawEmoji}
101
+ * @private
102
+ */
103
+ function resolvePartialEmoji(emoji) {
104
+ if (!emoji) return null;
105
+ if (typeof emoji === 'string') return /^\d{17,19}$/.test(emoji) ? { id: emoji } : parseEmoji(emoji);
106
+ const { id, name, animated } = emoji;
107
+ if (!id && !name) return null;
108
+ return { id, name, animated: Boolean(animated) };
109
+ }
110
+
111
+ /**
112
+ * Sets default properties on an object that aren't already specified.
113
+ * @param {Object} def Default properties
114
+ * @param {Object} given Object to assign defaults to
115
+ * @returns {Object}
116
+ * @private
117
+ */
118
+ function mergeDefault(def, given) {
119
+ if (!given) return def;
120
+ for (const key in def) {
121
+ if (!Object.hasOwn(given, key) || given[key] === undefined) {
122
+ given[key] = def[key];
123
+ } else if (given[key] === Object(given[key])) {
124
+ given[key] = mergeDefault(def[key], given[key]);
125
+ }
126
+ }
127
+
128
+ return given;
129
+ }
130
+
131
+ /**
132
+ * Options used to make an error object.
133
+ * @typedef {Object} MakeErrorOptions
134
+ * @property {string} name Error type
135
+ * @property {string} message Message for the error
136
+ * @property {string} stack Stack for the error
137
+ */
138
+
139
+ /**
140
+ * Makes an Error from a plain info object.
141
+ * @param {MakeErrorOptions} obj Error info
142
+ * @returns {Error}
143
+ * @private
144
+ */
145
+ function makeError(obj) {
146
+ const err = new Error(obj.message);
147
+ err.name = obj.name;
148
+ err.stack = obj.stack;
149
+ return err;
150
+ }
151
+
152
+ /**
153
+ * Makes a plain error info object from an Error.
154
+ * @param {Error} err Error to get info from
155
+ * @returns {MakeErrorOptions}
156
+ * @private
157
+ */
158
+ function makePlainError(err) {
159
+ return {
160
+ name: err.name,
161
+ message: err.message,
162
+ stack: err.stack,
163
+ };
164
+ }
165
+
166
+ /**
167
+ * Moves an element in an array *in place*.
168
+ * @param {Array<*>} array Array to modify
169
+ * @param {*} element Element to move
170
+ * @param {number} newIndex Index or offset to move the element to
171
+ * @param {boolean} [offset=false] Move the element by an offset amount rather than to a set index
172
+ * @returns {number}
173
+ * @private
174
+ */
175
+ function moveElementInArray(array, element, newIndex, offset = false) {
176
+ const index = array.indexOf(element);
177
+ newIndex = (offset ? index : 0) + newIndex;
178
+ if (newIndex > -1 && newIndex < array.length) {
179
+ const removedElement = array.splice(index, 1)[0];
180
+ array.splice(newIndex, 0, removedElement);
181
+ }
182
+ return array.indexOf(element);
183
+ }
184
+
185
+ /**
186
+ * Verifies the provided data is a string, otherwise throws provided error.
187
+ * @param {string} data The string resolvable to resolve
188
+ * @param {Function} [error] The Error constructor to instantiate. Defaults to Error
189
+ * @param {string} [errorMessage] The error message to throw with. Defaults to "Expected string, got <data> instead."
190
+ * @param {boolean} [allowEmpty=true] Whether an empty string should be allowed
191
+ * @returns {string}
192
+ */
193
+ function verifyString(
194
+ data,
195
+ error = Error,
196
+ errorMessage = `Expected a string, got ${data} instead.`,
197
+ allowEmpty = true,
198
+ ) {
199
+ if (typeof data !== 'string') throw new error(errorMessage);
200
+ if (!allowEmpty && data.length === 0) throw new error(errorMessage);
201
+ return data;
202
+ }
203
+
204
+ /**
205
+ * Can be a number, hex string, an RGB array like:
206
+ * ```js
207
+ * [255, 0, 255] // purple
208
+ * ```
209
+ * or one of the following strings:
210
+ * - `Default`
211
+ * - `White`
212
+ * - `Aqua`
213
+ * - `Green`
214
+ * - `Blue`
215
+ * - `Yellow`
216
+ * - `Purple`
217
+ * - `LuminousVividPink`
218
+ * - `Fuchsia`
219
+ * - `Gold`
220
+ * - `Orange`
221
+ * - `Red`
222
+ * - `Grey`
223
+ * - `Navy`
224
+ * - `DarkAqua`
225
+ * - `DarkGreen`
226
+ * - `DarkBlue`
227
+ * - `DarkPurple`
228
+ * - `DarkVividPink`
229
+ * - `DarkGold`
230
+ * - `DarkOrange`
231
+ * - `DarkRed`
232
+ * - `DarkGrey`
233
+ * - `DarkerGrey`
234
+ * - `LightGrey`
235
+ * - `DarkNavy`
236
+ * - `Blurple`
237
+ * - `Greyple`
238
+ * - `DarkButNotBlack`
239
+ * - `NotQuiteBlack`
240
+ * - `Random`
241
+ * @typedef {string|number|number[]} ColorResolvable
242
+ */
243
+
244
+ /**
245
+ * Resolves a ColorResolvable into a color number.
246
+ * @param {ColorResolvable} color Color to resolve
247
+ * @returns {number} A color
248
+ */
249
+ function resolveColor(color) {
250
+ if (typeof color === 'string') {
251
+ if (color === 'Random') return Math.floor(Math.random() * (0xffffff + 1));
252
+ if (color === 'Default') return 0;
253
+ if (/^#?[\da-f]{6}$/i.test(color)) return parseInt(color.replace('#', ''), 16);
254
+ color = Colors[color];
255
+ } else if (Array.isArray(color)) {
256
+ color = (color[0] << 16) + (color[1] << 8) + color[2];
257
+ }
258
+
259
+ if (color < 0 || color > 0xffffff) throw new DiscordjsRangeError(ErrorCodes.ColorRange);
260
+ if (typeof color !== 'number' || Number.isNaN(color)) throw new DiscordjsTypeError(ErrorCodes.ColorConvert);
261
+
262
+ return color;
263
+ }
264
+
265
+ /**
266
+ * Sorts by Discord's position and id.
267
+ * @param {Collection} collection Collection of objects to sort
268
+ * @returns {Collection}
269
+ */
270
+ function discordSort(collection) {
271
+ const isGuildChannel = collection.first() instanceof GuildChannel;
272
+ return collection.sorted(
273
+ isGuildChannel
274
+ ? (a, b) => a.rawPosition - b.rawPosition || Number(BigInt(a.id) - BigInt(b.id))
275
+ : (a, b) => a.rawPosition - b.rawPosition || Number(BigInt(b.id) - BigInt(a.id)),
276
+ );
277
+ }
278
+
279
+ /**
280
+ * Sets the position of a Channel or Role.
281
+ * @param {BaseChannel|Role} item Object to set the position of
282
+ * @param {number} position New position for the object
283
+ * @param {boolean} relative Whether `position` is relative to its current position
284
+ * @param {Collection<string, BaseChannel|Role>} sorted A collection of the objects sorted properly
285
+ * @param {Client} client The client to use to patch the data
286
+ * @param {string} route Route to call PATCH on
287
+ * @param {string} [reason] Reason for the change
288
+ * @returns {Promise<BaseChannel[]|Role[]>} Updated item list, with `id` and `position` properties
289
+ * @private
290
+ */
291
+ async function setPosition(item, position, relative, sorted, client, route, reason) {
292
+ let updatedItems = [...sorted.values()];
293
+ moveElementInArray(updatedItems, item, position, relative);
294
+ updatedItems = updatedItems.map((r, i) => ({ id: r.id, position: i }));
295
+ await client.rest.patch(route, { body: updatedItems, reason });
296
+ return updatedItems;
297
+ }
298
+
299
+ /**
300
+ * Alternative to Node's `path.basename`, removing query string after the extension if it exists.
301
+ * @param {string} path Path to get the basename of
302
+ * @param {string} [ext] File extension to remove
303
+ * @returns {string} Basename of the path
304
+ * @private
305
+ */
306
+ function basename(path, ext) {
307
+ const res = parse(path);
308
+ return ext && res.ext.startsWith(ext) ? res.name : res.base.split('?')[0];
309
+ }
310
+
311
+ /**
312
+ * The content to have all mentions replaced by the equivalent text.
313
+ * @param {string} str The string to be converted
314
+ * @param {TextBasedChannels} channel The channel the string was sent in
315
+ * @returns {string}
316
+ */
317
+ function cleanContent(str, channel) {
318
+ return str.replaceAll(/<(@[!&]?|#)(\d{17,19})>/g, (match, type, id) => {
319
+ switch (type) {
320
+ case '@':
321
+ case '@!': {
322
+ const member = channel.guild?.members.cache.get(id);
323
+ if (member) {
324
+ return `@${member.displayName}`;
325
+ }
326
+
327
+ const user = channel.client.users.cache.get(id);
328
+ return user ? `@${user.username}` : match;
329
+ }
330
+ case '@&': {
331
+ if (channel.type === ChannelType.DM) return match;
332
+ const role = channel.guild.roles.cache.get(id);
333
+ return role ? `@${role.name}` : match;
334
+ }
335
+ case '#': {
336
+ const mentionedChannel = channel.client.channels.cache.get(id);
337
+ return mentionedChannel ? `#${mentionedChannel.name}` : match;
338
+ }
339
+ default: {
340
+ return match;
341
+ }
342
+ }
343
+ });
344
+ }
345
+
346
+ /**
347
+ * The content to put in a code block with all code block fences replaced by the equivalent backticks.
348
+ * @param {string} text The string to be converted
349
+ * @returns {string}
350
+ */
351
+ function cleanCodeBlockContent(text) {
352
+ return text.replaceAll('```', '`\u200b``');
353
+ }
354
+
355
+ /**
356
+ * Parses a webhook URL for the id and token.
357
+ * @param {string} url The URL to parse
358
+ * @returns {?WebhookClientDataIdWithToken} `null` if the URL is invalid, otherwise the id and the token
359
+ */
360
+ function parseWebhookURL(url) {
361
+ const matches = url.match(
362
+ /https?:\/\/(?:ptb\.|canary\.)?discord\.com\/api(?:\/v\d{1,2})?\/webhooks\/(\d{17,19})\/([\w-]{68})/i,
363
+ );
364
+
365
+ if (!matches || matches.length <= 2) return null;
366
+
367
+ const [, id, token] = matches;
368
+ return {
369
+ id,
370
+ token,
371
+ };
372
+ }
373
+
374
+ module.exports = {
375
+ flatten,
376
+ fetchRecommendedShardCount,
377
+ parseEmoji,
378
+ resolvePartialEmoji,
379
+ mergeDefault,
380
+ makeError,
381
+ makePlainError,
382
+ moveElementInArray,
383
+ verifyString,
384
+ resolveColor,
385
+ discordSort,
386
+ setPosition,
387
+ basename,
388
+ cleanContent,
389
+ cleanCodeBlockContent,
390
+ parseWebhookURL,
391
+ };
392
+
393
+ // Fixes Circular
394
+ const GuildChannel = require('../structures/GuildChannel');
@@ -0,0 +1,25 @@
1
+ 'use strict';
2
+
3
+ /**
4
+ * @typedef {Object} WebSocketShardEvents
5
+ * @property {string} Close close
6
+ * @property {string} Destroyed destroyed
7
+ * @property {string} InvalidSession invalidSession
8
+ * @property {string} Ready ready
9
+ * @property {string} Resumed resumed
10
+ * @property {string} AllReady allReady
11
+ */
12
+
13
+ // JSDoc for IntelliSense purposes
14
+ /**
15
+ * @type {WebSocketShardEvents}
16
+ * @ignore
17
+ */
18
+ module.exports = {
19
+ Close: 'close',
20
+ Destroyed: 'destroyed',
21
+ InvalidSession: 'invalidSession',
22
+ Ready: 'ready',
23
+ Resumed: 'resumed',
24
+ AllReady: 'allReady',
25
+ };