@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,204 @@
1
+ 'use strict';
2
+
3
+ const { Collection } = require('@discordjs/collection');
4
+ const { makeURLSearchParams } = require('@discordjs/rest');
5
+ const { Routes } = require('discord-api-types/v10');
6
+ const CachedManager = require('./CachedManager');
7
+ const { DiscordjsTypeError, ErrorCodes } = require('../errors');
8
+ const ThreadChannel = require('../structures/ThreadChannel');
9
+
10
+ /**
11
+ * Manages API methods for thread-based channels and stores their cache.
12
+ * @extends {CachedManager}
13
+ */
14
+ class ThreadManager extends CachedManager {
15
+ constructor(channel, iterable) {
16
+ super(channel.client, ThreadChannel, iterable);
17
+
18
+ /**
19
+ * The channel this Manager belongs to
20
+ * @type {TextChannel|NewsChannel|ForumChannel}
21
+ */
22
+ this.channel = channel;
23
+ }
24
+
25
+ /**
26
+ * Data that can be resolved to a Thread Channel object. This can be:
27
+ * * A ThreadChannel object
28
+ * * A Snowflake
29
+ * @typedef {ThreadChannel|Snowflake} ThreadChannelResolvable
30
+ */
31
+
32
+ /**
33
+ * The cache of this Manager
34
+ * @type {Collection<Snowflake, ThreadChannel>}
35
+ * @name ThreadManager#cache
36
+ */
37
+
38
+ _add(thread) {
39
+ const existing = this.cache.get(thread.id);
40
+ if (existing) return existing;
41
+ this.cache.set(thread.id, thread);
42
+ return thread;
43
+ }
44
+
45
+ /**
46
+ * Resolves a {@link ThreadChannelResolvable} to a {@link ThreadChannel} object.
47
+ * @method resolve
48
+ * @memberof ThreadManager
49
+ * @instance
50
+ * @param {ThreadChannelResolvable} thread The ThreadChannel resolvable to resolve
51
+ * @returns {?ThreadChannel}
52
+ */
53
+
54
+ /**
55
+ * Resolves a {@link ThreadChannelResolvable} to a {@link ThreadChannel} id.
56
+ * @method resolveId
57
+ * @memberof ThreadManager
58
+ * @instance
59
+ * @param {ThreadChannelResolvable} thread The ThreadChannel resolvable to resolve
60
+ * @returns {?Snowflake}
61
+ */
62
+
63
+ /**
64
+ * Options for creating a thread. <warn>Only one of `startMessage` or `type` can be defined.</warn>
65
+ * @typedef {StartThreadOptions} ThreadCreateOptions
66
+ * @property {MessageResolvable} [startMessage] The message to start a thread from. <warn>If this is defined then type
67
+ * of thread gets automatically defined and cannot be changed. The provided `type` field will be ignored</warn>
68
+ * @property {ChannelType.AnnouncementThread|ChannelType.PublicThread|ChannelType.PrivateThread} [type]
69
+ * The type of thread to create.
70
+ * Defaults to {@link ChannelType.PublicThread} if created in a {@link TextChannel}
71
+ * <warn>When creating threads in a {@link NewsChannel} this is ignored and is always
72
+ * {@link ChannelType.AnnouncementThread}</warn>
73
+ * @property {boolean} [invitable] Whether non-moderators can add other non-moderators to the thread
74
+ * <info>Can only be set when type will be {@link ChannelType.PrivateThread}</info>
75
+ */
76
+
77
+ /**
78
+ * Options for fetching multiple threads.
79
+ * @typedef {Object} FetchThreadsOptions
80
+ * @property {FetchArchivedThreadOptions} [archived] Options used to fetch archived threads
81
+ */
82
+
83
+ /**
84
+ * Obtains a thread from Discord, or the channel cache if it's already available.
85
+ * @param {ThreadChannelResolvable|FetchThreadsOptions} [options] The options to fetch threads. If it is a
86
+ * ThreadChannelResolvable then the specified thread will be fetched. Fetches all active threads if `undefined`
87
+ * @param {BaseFetchOptions} [cacheOptions] Additional options for this fetch. <warn>The `force` field gets ignored
88
+ * if `options` is not a {@link ThreadChannelResolvable}</warn>
89
+ * @returns {Promise<?(ThreadChannel|FetchedThreads|FetchedThreadsMore)>}
90
+ * {@link FetchedThreads} if active & {@link FetchedThreadsMore} if archived.
91
+ * @example
92
+ * // Fetch a thread by its id
93
+ * channel.threads.fetch('831955138126104859')
94
+ * .then(channel => console.log(channel.name))
95
+ * .catch(console.error);
96
+ */
97
+ fetch(options, { cache, force } = {}) {
98
+ if (!options) return this.fetchActive(cache);
99
+ const channel = this.client.channels.resolveId(options);
100
+ if (channel) return this.client.channels.fetch(channel, { cache, force });
101
+ if (options.archived) {
102
+ return this.fetchArchived(options.archived, cache);
103
+ }
104
+ return this.fetchActive(cache);
105
+ }
106
+
107
+ /**
108
+ * Data that can be resolved to a Date object. This can be:
109
+ * * A Date object
110
+ * * A number representing a timestamp
111
+ * * An [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) string
112
+ * @typedef {Date|number|string} DateResolvable
113
+ */
114
+
115
+ /**
116
+ * The options used to fetch archived threads.
117
+ * @typedef {Object} FetchArchivedThreadOptions
118
+ * @property {string} [type='public'] The type of threads to fetch (`public` or `private`)
119
+ * @property {boolean} [fetchAll=false] Whether to fetch **all** archived threads when `type` is `private`
120
+ * <info>This property requires the {@link PermissionFlagsBits.ManageThreads} permission if `true`.</info>
121
+ * @property {DateResolvable|ThreadChannelResolvable} [before] Only return threads that were archived before this Date
122
+ * or Snowflake
123
+ * <warn>Must be a {@link ThreadChannelResolvable} when `type` is `private` and `fetchAll` is `false`.</warn>
124
+ * @property {number} [limit] Maximum number of threads to return
125
+ */
126
+
127
+ /**
128
+ * Data returned from fetching multiple threads.
129
+ * @typedef {FetchedThreads} FetchedThreadsMore
130
+ * @property {?boolean} hasMore Whether there are potentially additional threads that require a subsequent call
131
+ */
132
+
133
+ /**
134
+ * Obtains a set of archived threads from Discord.
135
+ * <info>This method requires the {@link PermissionFlagsBits.ReadMessageHistory} permission
136
+ * in the parent channel.</info>
137
+ * @param {FetchArchivedThreadOptions} [options] The options to fetch archived threads
138
+ * @param {boolean} [cache=true] Whether to cache the new thread objects if they aren't already
139
+ * @returns {Promise<FetchedThreadsMore>}
140
+ */
141
+ async fetchArchived({ type = 'public', fetchAll = false, before, limit } = {}, cache = true) {
142
+ let path = Routes.channelThreads(this.channel.id, type);
143
+ if (type === 'private' && !fetchAll) {
144
+ path = Routes.channelJoinedArchivedThreads(this.channel.id);
145
+ }
146
+ let timestamp;
147
+ let id;
148
+ const query = makeURLSearchParams({ limit });
149
+ if (before !== undefined) {
150
+ if (before instanceof ThreadChannel || /^\d{17,19}$/.test(String(before))) {
151
+ id = this.resolveId(before);
152
+ timestamp = this.resolve(before)?.archivedAt?.toISOString();
153
+ const toUse = type === 'private' && !fetchAll ? id : timestamp;
154
+ if (toUse) {
155
+ query.set('before', toUse);
156
+ }
157
+ } else {
158
+ try {
159
+ timestamp = new Date(before).toISOString();
160
+ if (type === 'public' || fetchAll) {
161
+ query.set('before', timestamp);
162
+ }
163
+ } catch {
164
+ throw new DiscordjsTypeError(ErrorCodes.InvalidType, 'before', 'DateResolvable or ThreadChannelResolvable');
165
+ }
166
+ }
167
+ }
168
+
169
+ const raw = await this.client.rest.get(path, { query });
170
+ return this.constructor._mapThreads(raw, this.client, { parent: this.channel, cache });
171
+ }
172
+
173
+ /**
174
+ * Obtains all active thread channels in the guild.
175
+ * This internally calls {@link GuildChannelManager#fetchActiveThreads}.
176
+ * @param {boolean} [cache=true] Whether to cache the fetched data
177
+ * @returns {Promise<FetchedThreads>}
178
+ */
179
+ fetchActive(cache = true) {
180
+ return this.channel.guild.channels.fetchActiveThreads(cache);
181
+ }
182
+
183
+ static _mapThreads(rawThreads, client, { parent, guild, cache }) {
184
+ const threads = rawThreads.threads.reduce((coll, raw) => {
185
+ const thread = client.channels._add(raw, guild ?? parent?.guild, { cache });
186
+ if (parent && thread.parentId !== parent.id) return coll;
187
+ return coll.set(thread.id, thread);
188
+ }, new Collection());
189
+
190
+ // Discord sends the thread id as id in this object
191
+ const threadMembers = rawThreads.members.reduce(
192
+ (coll, raw) => coll.set(raw.user_id, threads.get(raw.id).members._add(raw)),
193
+ new Collection(),
194
+ );
195
+
196
+ const response = { threads, members: threadMembers };
197
+
198
+ // The GET `/guilds/{guild.id}/threads/active` route does not return `has_more`.
199
+ if ('has_more' in rawThreads) response.hasMore = rawThreads.has_more;
200
+ return response;
201
+ }
202
+ }
203
+
204
+ module.exports = ThreadManager;
@@ -0,0 +1,182 @@
1
+ 'use strict';
2
+
3
+ const { Collection } = require('@discordjs/collection');
4
+ const { makeURLSearchParams } = require('@discordjs/rest');
5
+ const { Routes } = require('discord-api-types/v10');
6
+ const CachedManager = require('./CachedManager');
7
+ const { DiscordjsTypeError, ErrorCodes } = require('../errors');
8
+ const ThreadMember = require('../structures/ThreadMember');
9
+
10
+ /**
11
+ * Manages API methods for GuildMembers and stores their cache.
12
+ * @extends {CachedManager}
13
+ */
14
+ class ThreadMemberManager extends CachedManager {
15
+ constructor(thread, iterable) {
16
+ super(thread.client, ThreadMember, iterable);
17
+
18
+ /**
19
+ * The thread this manager belongs to
20
+ * @type {ThreadChannel}
21
+ */
22
+ this.thread = thread;
23
+ }
24
+
25
+ /**
26
+ * The cache of this Manager
27
+ * @type {Collection<Snowflake, ThreadMember>}
28
+ * @name ThreadMemberManager#cache
29
+ */
30
+
31
+ _add(data, cache = true) {
32
+ const existing = this.cache.get(data.user_id);
33
+ if (cache) existing?._patch(data, { cache });
34
+ if (existing) return existing;
35
+
36
+ const member = new ThreadMember(this.thread, data, { cache });
37
+ if (cache) this.cache.set(data.user_id, member);
38
+ return member;
39
+ }
40
+
41
+ /**
42
+ * Fetches the client user as a ThreadMember of the thread.
43
+ * @param {BaseFetchOptions} [options] The options for fetching the member
44
+ * @returns {Promise<ThreadMember>}
45
+ */
46
+ fetchMe(options) {
47
+ return this.fetch({ ...options, member: this.client.user.id });
48
+ }
49
+
50
+ /**
51
+ * The client user as a ThreadMember of this ThreadChannel
52
+ * @type {?ThreadMember}
53
+ * @readonly
54
+ */
55
+ get me() {
56
+ return this.resolve(this.client.user.id);
57
+ }
58
+
59
+ /**
60
+ * Data that resolves to give a ThreadMember object. This can be:
61
+ * * A ThreadMember object
62
+ * * A User resolvable
63
+ * @typedef {ThreadMember|UserResolvable} ThreadMemberResolvable
64
+ */
65
+
66
+ /**
67
+ * Resolves a {@link ThreadMemberResolvable} to a {@link ThreadMember} object.
68
+ * @param {ThreadMemberResolvable} member The user that is part of the thread
69
+ * @returns {?GuildMember}
70
+ */
71
+ resolve(member) {
72
+ const memberResolvable = super.resolve(member);
73
+ if (memberResolvable) return memberResolvable;
74
+ const userResolvable = this.client.users.resolveId(member);
75
+ if (userResolvable) return super.resolve(userResolvable);
76
+ return null;
77
+ }
78
+
79
+ /**
80
+ * Resolves a {@link ThreadMemberResolvable} to a {@link ThreadMember} id string.
81
+ * @param {ThreadMemberResolvable} member The user that is part of the guild
82
+ * @returns {?Snowflake}
83
+ */
84
+ resolveId(member) {
85
+ const memberResolvable = super.resolveId(member);
86
+ if (memberResolvable) return memberResolvable;
87
+ const userResolvable = this.client.users.resolveId(member);
88
+ return this.cache.has(userResolvable) ? userResolvable : null;
89
+ }
90
+
91
+ /**
92
+ * Adds a member to the thread.
93
+ * @param {UserResolvable|'@me'} member The member to add
94
+ * @param {string} [reason] The reason for adding this member
95
+ * @returns {Promise<Snowflake>}
96
+ */
97
+ async add(member, reason) {
98
+ const id = member === '@me' ? member : this.client.users.resolveId(member);
99
+ if (!id) throw new DiscordjsTypeError(ErrorCodes.InvalidType, 'member', 'UserResolvable');
100
+ await this.client.rest.put(Routes.threadMembers(this.thread.id, id), { reason });
101
+ return id;
102
+ }
103
+
104
+ /**
105
+ * Remove a user from the thread.
106
+ * @param {Snowflake|'@me'} id The id of the member to remove
107
+ * @param {string} [reason] The reason for removing this member from the thread
108
+ * @returns {Promise<Snowflake>}
109
+ */
110
+ async remove(id, reason) {
111
+ await this.client.rest.delete(Routes.threadMembers(this.thread.id, id), { reason });
112
+ return id;
113
+ }
114
+
115
+ /**
116
+ * Options used to fetch a thread member.
117
+ * @typedef {BaseFetchOptions} FetchThreadMemberOptions
118
+ * @property {ThreadMemberResolvable} member The thread member to fetch
119
+ * @property {boolean} [withMember] Whether to also return the guild member associated with this thread member
120
+ */
121
+
122
+ /**
123
+ * Options used to fetch multiple thread members with guild member data.
124
+ * <info>With `withMember` set to `true`, pagination is enabled.</info>
125
+ * @typedef {Object} FetchThreadMembersWithGuildMemberDataOptions
126
+ * @property {true} withMember Whether to also return the guild member data
127
+ * @property {Snowflake} [after] Consider only thread members after this id
128
+ * @property {number} [limit] The maximum number of thread members to return
129
+ * @property {boolean} [cache] Whether to cache the fetched thread members and guild members
130
+ */
131
+
132
+ /**
133
+ * Options used to fetch multiple thread members without guild member data.
134
+ * @typedef {Object} FetchThreadMembersWithoutGuildMemberDataOptions
135
+ * @property {false} [withMember] Whether to also return the guild member data
136
+ * @property {boolean} [cache] Whether to cache the fetched thread members
137
+ */
138
+
139
+ /**
140
+ * Options used to fetch multiple thread members.
141
+ * @typedef {FetchThreadMembersWithGuildMemberDataOptions|
142
+ * FetchThreadMembersWithoutGuildMemberDataOptions} FetchThreadMembersOptions
143
+ */
144
+
145
+ /**
146
+ * Fetches thread member(s) from Discord.
147
+ * <info>This method requires the {@link GatewayIntentBits.GuildMembers} privileged gateway intent.</info>
148
+ * @param {ThreadMemberResolvable|FetchThreadMemberOptions|FetchThreadMembersOptions} [options]
149
+ * Options for fetching thread member(s)
150
+ * @returns {Promise<ThreadMember|Collection<Snowflake, ThreadMember>>}
151
+ */
152
+ fetch(options) {
153
+ if (!options) return this._fetchMany();
154
+ const { member, withMember, cache, force } = options;
155
+ const resolvedMember = this.resolveId(member ?? options);
156
+ if (resolvedMember) return this._fetchSingle({ member: resolvedMember, withMember, cache, force });
157
+ return this._fetchMany(options);
158
+ }
159
+
160
+ async _fetchSingle({ member, withMember, cache, force = false }) {
161
+ if (!force) {
162
+ const existing = this.cache.get(member);
163
+ if (existing) return existing;
164
+ }
165
+
166
+ const data = await this.client.rest.get(Routes.threadMembers(this.thread.id, member), {
167
+ query: makeURLSearchParams({ with_member: withMember }),
168
+ });
169
+
170
+ return this._add(data, cache);
171
+ }
172
+
173
+ async _fetchMany({ withMember, after, limit, cache } = {}) {
174
+ const data = await this.client.rest.get(Routes.threadMembers(this.thread.id), {
175
+ query: makeURLSearchParams({ with_member: withMember, after, limit }),
176
+ });
177
+
178
+ return data.reduce((col, member) => col.set(member.user_id, this._add(member, cache)), new Collection());
179
+ }
180
+ }
181
+
182
+ module.exports = ThreadMemberManager;
@@ -0,0 +1,139 @@
1
+ 'use strict';
2
+
3
+ const { ChannelType, Routes } = require('discord-api-types/v10');
4
+ const CachedManager = require('./CachedManager');
5
+ const { DiscordjsError, ErrorCodes } = require('../errors');
6
+ const { GuildMember } = require('../structures/GuildMember');
7
+ const { Message } = require('../structures/Message');
8
+ const ThreadMember = require('../structures/ThreadMember');
9
+ const User = require('../structures/User');
10
+
11
+ /**
12
+ * Manages API methods for users and stores their cache.
13
+ * @extends {CachedManager}
14
+ */
15
+ class UserManager extends CachedManager {
16
+ constructor(client, iterable) {
17
+ super(client, User, iterable);
18
+ }
19
+
20
+ /**
21
+ * The cache of this manager
22
+ * @type {Collection<Snowflake, User>}
23
+ * @name UserManager#cache
24
+ */
25
+
26
+ /**
27
+ * Data that resolves to give a User object. This can be:
28
+ * * A User object
29
+ * * A Snowflake
30
+ * * A Message object (resolves to the message author)
31
+ * * A GuildMember object
32
+ * * A ThreadMember object
33
+ * @typedef {User|Snowflake|Message|GuildMember|ThreadMember} UserResolvable
34
+ */
35
+
36
+ /**
37
+ * The DM between the client's user and a user
38
+ * @param {Snowflake} userId The user id
39
+ * @returns {?DMChannel}
40
+ * @private
41
+ */
42
+ dmChannel(userId) {
43
+ return this.client.channels.cache.find(c => c.type === ChannelType.DM && c.recipientId === userId) ?? null;
44
+ }
45
+
46
+ /**
47
+ * Creates a {@link DMChannel} between the client and a user.
48
+ * @param {UserResolvable} user The UserResolvable to identify
49
+ * @param {BaseFetchOptions} [options] Additional options for this fetch
50
+ * @returns {Promise<DMChannel>}
51
+ */
52
+ async createDM(user, { cache = true, force = false } = {}) {
53
+ const id = this.resolveId(user);
54
+
55
+ if (!force) {
56
+ const dmChannel = this.dmChannel(id);
57
+ if (dmChannel && !dmChannel.partial) return dmChannel;
58
+ }
59
+
60
+ const data = await this.client.rest.post(Routes.userChannels(), { body: { recipient_id: id } });
61
+ return this.client.channels._add(data, null, { cache });
62
+ }
63
+
64
+ /**
65
+ * Deletes a {@link DMChannel} (if one exists) between the client and a user. Resolves with the channel if successful.
66
+ * @param {UserResolvable} user The UserResolvable to identify
67
+ * @returns {Promise<DMChannel>}
68
+ */
69
+ async deleteDM(user) {
70
+ const id = this.resolveId(user);
71
+ const dmChannel = this.dmChannel(id);
72
+ if (!dmChannel) throw new DiscordjsError(ErrorCodes.UserNoDMChannel);
73
+ await this.client.rest.delete(Routes.channel(dmChannel.id));
74
+ this.client.channels._remove(dmChannel.id);
75
+ return dmChannel;
76
+ }
77
+
78
+ /**
79
+ * Obtains a user from Discord, or the user cache if it's already available.
80
+ * @param {UserResolvable} user The user to fetch
81
+ * @param {BaseFetchOptions} [options] Additional options for this fetch
82
+ * @returns {Promise<User>}
83
+ */
84
+ async fetch(user, { cache = true, force = false } = {}) {
85
+ const id = this.resolveId(user);
86
+ if (!force) {
87
+ const existing = this.cache.get(id);
88
+ if (existing && !existing.partial) return existing;
89
+ }
90
+
91
+ const data = await this.client.rest.get(Routes.user(id));
92
+ return this._add(data, cache);
93
+ }
94
+
95
+ /**
96
+ * Fetches a user's flags.
97
+ * @param {UserResolvable} user The UserResolvable to identify
98
+ * @param {BaseFetchOptions} [options] Additional options for this fetch
99
+ * @returns {Promise<UserFlagsBitField>}
100
+ */
101
+ async fetchFlags(user, options) {
102
+ return (await this.fetch(user, options)).flags;
103
+ }
104
+
105
+ /**
106
+ * Sends a message to a user.
107
+ * @param {UserResolvable} user The UserResolvable to identify
108
+ * @param {string|MessagePayload|MessageCreateOptions} options The options to provide
109
+ * @returns {Promise<Message>}
110
+ */
111
+ async send(user, options) {
112
+ return (await this.createDM(user)).send(options);
113
+ }
114
+
115
+ /**
116
+ * Resolves a {@link UserResolvable} to a {@link User} object.
117
+ * @param {UserResolvable} user The UserResolvable to identify
118
+ * @returns {?User}
119
+ */
120
+ resolve(user) {
121
+ if (user instanceof GuildMember || user instanceof ThreadMember) return user.user;
122
+ if (user instanceof Message) return user.author;
123
+ return super.resolve(user);
124
+ }
125
+
126
+ /**
127
+ * Resolves a {@link UserResolvable} to a {@link User} id.
128
+ * @param {UserResolvable} user The UserResolvable to identify
129
+ * @returns {?Snowflake}
130
+ */
131
+ resolveId(user) {
132
+ if (user instanceof ThreadMember) return user.id;
133
+ if (user instanceof GuildMember) return user.user.id;
134
+ if (user instanceof Message) return user.author.id;
135
+ return super.resolveId(user);
136
+ }
137
+ }
138
+
139
+ module.exports = UserManager;
@@ -0,0 +1,37 @@
1
+ 'use strict';
2
+
3
+ const CachedManager = require('./CachedManager');
4
+ const VoiceState = require('../structures/VoiceState');
5
+
6
+ /**
7
+ * Manages API methods for VoiceStates and stores their cache.
8
+ * @extends {CachedManager}
9
+ */
10
+ class VoiceStateManager extends CachedManager {
11
+ constructor(guild, iterable) {
12
+ super(guild.client, VoiceState, iterable);
13
+
14
+ /**
15
+ * The guild this manager belongs to
16
+ * @type {Guild}
17
+ */
18
+ this.guild = guild;
19
+ }
20
+
21
+ /**
22
+ * The cache of this manager
23
+ * @type {Collection<Snowflake, VoiceState>}
24
+ * @name VoiceStateManager#cache
25
+ */
26
+
27
+ _add(data, cache = true) {
28
+ const existing = this.cache.get(data.user_id);
29
+ if (existing) return existing._patch(data);
30
+
31
+ const entry = new this.holds(this.guild, data);
32
+ if (cache) this.cache.set(data.user_id, entry);
33
+ return entry;
34
+ }
35
+ }
36
+
37
+ module.exports = VoiceStateManager;