@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,413 @@
1
+ 'use strict';
2
+
3
+ const { Collection } = require('@discordjs/collection');
4
+ const { DiscordSnowflake } = require('@sapphire/snowflake');
5
+ const { InteractionType, Routes } = require('discord-api-types/v10');
6
+ const { DiscordjsTypeError, DiscordjsError, ErrorCodes } = require('../../errors');
7
+ const { MaxBulkDeletableMessageAge } = require('../../util/Constants');
8
+ const InteractionCollector = require('../InteractionCollector');
9
+ const MessageCollector = require('../MessageCollector');
10
+ const MessagePayload = require('../MessagePayload');
11
+
12
+ /**
13
+ * Interface for classes that have text-channel-like features.
14
+ * @interface
15
+ */
16
+ class TextBasedChannel {
17
+ constructor() {
18
+ /**
19
+ * A manager of the messages sent to this channel
20
+ * @type {MessageManager}
21
+ */
22
+ this.messages = new MessageManager(this);
23
+
24
+ /**
25
+ * The channel's last message id, if one was sent
26
+ * @type {?Snowflake}
27
+ */
28
+ this.lastMessageId = null;
29
+
30
+ /**
31
+ * The timestamp when the last pinned message was pinned, if there was one
32
+ * @type {?number}
33
+ */
34
+ this.lastPinTimestamp = null;
35
+ }
36
+
37
+ /**
38
+ * The Message object of the last message in the channel, if one was sent
39
+ * @type {?Message}
40
+ * @readonly
41
+ */
42
+ get lastMessage() {
43
+ return this.messages.resolve(this.lastMessageId);
44
+ }
45
+
46
+ /**
47
+ * The date when the last pinned message was pinned, if there was one
48
+ * @type {?Date}
49
+ * @readonly
50
+ */
51
+ get lastPinAt() {
52
+ return this.lastPinTimestamp && new Date(this.lastPinTimestamp);
53
+ }
54
+
55
+ /**
56
+ * The base message options for messages.
57
+ * @typedef {Object} BaseMessageOptions
58
+ * @property {string|null} [content=''] The content for the message. This can only be `null` when editing a message.
59
+ * @property {Array<(EmbedBuilder|Embed|APIEmbed)>} [embeds] The embeds for the message
60
+ * @property {MessageMentionOptions} [allowedMentions] Which mentions should be parsed from the message content
61
+ * (see [here](https://discord.com/developers/docs/resources/channel#allowed-mentions-object) for more details)
62
+ * @property {Array<(AttachmentBuilder|Attachment|AttachmentPayload|BufferResolvable)>} [files]
63
+ * The files to send with the message.
64
+ * @property {Array<(ActionRowBuilder|ActionRow|APIActionRowComponent)>} [components]
65
+ * Action rows containing interactive components for the message (buttons, select menus)
66
+ */
67
+
68
+ /**
69
+ * Options for sending a message with a reply.
70
+ * @typedef {Object} ReplyOptions
71
+ * @property {MessageResolvable} messageReference The message to reply to (must be in the same channel and not system)
72
+ * @property {boolean} [failIfNotExists=this.client.options.failIfNotExists] Whether to error if the referenced
73
+ * message does not exist (creates a standard message in this case when false)
74
+ */
75
+
76
+ /**
77
+ * The options for sending a message.
78
+ * @typedef {BaseMessageOptions} BaseMessageCreateOptions
79
+ * @property {boolean} [tts=false] Whether the message should be spoken aloud
80
+ * @property {string} [nonce=''] The nonce for the message
81
+ * @property {StickerResolvable[]} [stickers=[]] The stickers to send in the message
82
+ * @property {MessageFlags} [flags] Which flags to set for the message.
83
+ * <info>Only `MessageFlags.SuppressEmbeds` and `MessageFlags.SuppressNotifications` can be set.</info>
84
+ */
85
+
86
+ /**
87
+ * The options for sending a message.
88
+ * @typedef {BaseMessageCreateOptions} MessageCreateOptions
89
+ * @property {ReplyOptions} [reply] The options for replying to a message
90
+ */
91
+
92
+ /**
93
+ * Options provided to control parsing of mentions by Discord
94
+ * @typedef {Object} MessageMentionOptions
95
+ * @property {MessageMentionTypes[]} [parse] Types of mentions to be parsed
96
+ * @property {Snowflake[]} [users] Snowflakes of Users to be parsed as mentions
97
+ * @property {Snowflake[]} [roles] Snowflakes of Roles to be parsed as mentions
98
+ * @property {boolean} [repliedUser=true] Whether the author of the Message being replied to should be pinged
99
+ */
100
+
101
+ /**
102
+ * Types of mentions to enable in MessageMentionOptions.
103
+ * - `roles`
104
+ * - `users`
105
+ * - `everyone`
106
+ * @typedef {string} MessageMentionTypes
107
+ */
108
+
109
+ /**
110
+ * @typedef {Object} FileOptions
111
+ * @property {BufferResolvable} attachment File to attach
112
+ * @property {string} [name='file.jpg'] Filename of the attachment
113
+ * @property {string} description The description of the file
114
+ */
115
+
116
+ /**
117
+ * Sends a message to this channel.
118
+ * @param {string|MessagePayload|MessageCreateOptions} options The options to provide
119
+ * @returns {Promise<Message>}
120
+ * @example
121
+ * // Send a basic message
122
+ * channel.send('hello!')
123
+ * .then(message => console.log(`Sent message: ${message.content}`))
124
+ * .catch(console.error);
125
+ * @example
126
+ * // Send a remote file
127
+ * channel.send({
128
+ * files: ['https://cdn.discordapp.com/icons/222078108977594368/6e1019b3179d71046e463a75915e7244.png?size=2048']
129
+ * })
130
+ * .then(console.log)
131
+ * .catch(console.error);
132
+ * @example
133
+ * // Send a local file
134
+ * channel.send({
135
+ * files: [{
136
+ * attachment: 'entire/path/to/file.jpg',
137
+ * name: 'file.jpg',
138
+ * description: 'A description of the file'
139
+ * }]
140
+ * })
141
+ * .then(console.log)
142
+ * .catch(console.error);
143
+ */
144
+ async send(options) {
145
+ const User = require('../User');
146
+ const { GuildMember } = require('../GuildMember');
147
+
148
+ if (this instanceof User || this instanceof GuildMember) {
149
+ const dm = await this.createDM();
150
+ return dm.send(options);
151
+ }
152
+
153
+ let messagePayload;
154
+
155
+ if (options instanceof MessagePayload) {
156
+ messagePayload = options.resolveBody();
157
+ } else {
158
+ messagePayload = MessagePayload.create(this, options).resolveBody();
159
+ }
160
+
161
+ const { body, files } = await messagePayload.resolveFiles();
162
+ const d = await this.client.rest.post(Routes.channelMessages(this.id), { body, files });
163
+
164
+ return this.messages.cache.get(d.id) ?? this.messages._add(d);
165
+ }
166
+
167
+ /**
168
+ * Sends a typing indicator in the channel.
169
+ * @returns {Promise<void>} Resolves upon the typing status being sent
170
+ * @example
171
+ * // Start typing in a channel
172
+ * channel.sendTyping();
173
+ */
174
+ async sendTyping() {
175
+ await this.client.rest.post(Routes.channelTyping(this.id));
176
+ }
177
+
178
+ /**
179
+ * Creates a Message Collector.
180
+ * @param {MessageCollectorOptions} [options={}] The options to pass to the collector
181
+ * @returns {MessageCollector}
182
+ * @example
183
+ * // Create a message collector
184
+ * const filter = m => m.content.includes('discord');
185
+ * const collector = channel.createMessageCollector({ filter, time: 15_000 });
186
+ * collector.on('collect', m => console.log(`Collected ${m.content}`));
187
+ * collector.on('end', collected => console.log(`Collected ${collected.size} items`));
188
+ */
189
+ createMessageCollector(options = {}) {
190
+ return new MessageCollector(this, options);
191
+ }
192
+
193
+ /**
194
+ * An object containing the same properties as CollectorOptions, but a few more:
195
+ * @typedef {MessageCollectorOptions} AwaitMessagesOptions
196
+ * @property {string[]} [errors] Stop/end reasons that cause the promise to reject
197
+ */
198
+
199
+ /**
200
+ * Similar to createMessageCollector but in promise form.
201
+ * Resolves with a collection of messages that pass the specified filter.
202
+ * @param {AwaitMessagesOptions} [options={}] Optional options to pass to the internal collector
203
+ * @returns {Promise<Collection<Snowflake, Message>>}
204
+ * @example
205
+ * // Await !vote messages
206
+ * const filter = m => m.content.startsWith('!vote');
207
+ * // Errors: ['time'] treats ending because of the time limit as an error
208
+ * channel.awaitMessages({ filter, max: 4, time: 60_000, errors: ['time'] })
209
+ * .then(collected => console.log(collected.size))
210
+ * .catch(collected => console.log(`After a minute, only ${collected.size} out of 4 voted.`));
211
+ */
212
+ awaitMessages(options = {}) {
213
+ return new Promise((resolve, reject) => {
214
+ const collector = this.createMessageCollector(options);
215
+ collector.once('end', (collection, reason) => {
216
+ if (options.errors?.includes(reason)) {
217
+ reject(collection);
218
+ } else {
219
+ resolve(collection);
220
+ }
221
+ });
222
+ });
223
+ }
224
+
225
+ /**
226
+ * Creates a component interaction collector.
227
+ * @param {MessageComponentCollectorOptions} [options={}] Options to send to the collector
228
+ * @returns {InteractionCollector}
229
+ * @example
230
+ * // Create a button interaction collector
231
+ * const filter = (interaction) => interaction.customId === 'button' && interaction.user.id === 'someId';
232
+ * const collector = channel.createMessageComponentCollector({ filter, time: 15_000 });
233
+ * collector.on('collect', i => console.log(`Collected ${i.customId}`));
234
+ * collector.on('end', collected => console.log(`Collected ${collected.size} items`));
235
+ */
236
+ createMessageComponentCollector(options = {}) {
237
+ return new InteractionCollector(this.client, {
238
+ ...options,
239
+ interactionType: InteractionType.MessageComponent,
240
+ channel: this,
241
+ });
242
+ }
243
+
244
+ /**
245
+ * Collects a single component interaction that passes the filter.
246
+ * The Promise will reject if the time expires.
247
+ * @param {AwaitMessageComponentOptions} [options={}] Options to pass to the internal collector
248
+ * @returns {Promise<MessageComponentInteraction>}
249
+ * @example
250
+ * // Collect a message component interaction
251
+ * const filter = (interaction) => interaction.customId === 'button' && interaction.user.id === 'someId';
252
+ * channel.awaitMessageComponent({ filter, time: 15_000 })
253
+ * .then(interaction => console.log(`${interaction.customId} was clicked!`))
254
+ * .catch(console.error);
255
+ */
256
+ awaitMessageComponent(options = {}) {
257
+ const _options = { ...options, max: 1 };
258
+ return new Promise((resolve, reject) => {
259
+ const collector = this.createMessageComponentCollector(_options);
260
+ collector.once('end', (interactions, reason) => {
261
+ const interaction = interactions.first();
262
+ if (interaction) resolve(interaction);
263
+ else reject(new DiscordjsError(ErrorCodes.InteractionCollectorError, reason));
264
+ });
265
+ });
266
+ }
267
+
268
+ /**
269
+ * Bulk deletes given messages that are newer than two weeks.
270
+ * @param {Collection<Snowflake, Message>|MessageResolvable[]|number} messages
271
+ * Messages or number of messages to delete
272
+ * @param {boolean} [filterOld=false] Filter messages to remove those which are older than two weeks automatically
273
+ * @returns {Promise<Collection<Snowflake, Message|undefined>>} Returns the deleted messages
274
+ * @example
275
+ * // Bulk delete messages
276
+ * channel.bulkDelete(5)
277
+ * .then(messages => console.log(`Bulk deleted ${messages.size} messages`))
278
+ * .catch(console.error);
279
+ */
280
+ async bulkDelete(messages, filterOld = false) {
281
+ if (Array.isArray(messages) || messages instanceof Collection) {
282
+ let messageIds = messages instanceof Collection ? [...messages.keys()] : messages.map(m => m.id ?? m);
283
+ if (filterOld) {
284
+ messageIds = messageIds.filter(
285
+ id => Date.now() - DiscordSnowflake.timestampFrom(id) < MaxBulkDeletableMessageAge,
286
+ );
287
+ }
288
+ if (messageIds.length === 0) return new Collection();
289
+ if (messageIds.length === 1) {
290
+ const message = this.client.actions.MessageDelete.getMessage(
291
+ {
292
+ message_id: messageIds[0],
293
+ },
294
+ this,
295
+ );
296
+ await this.client.rest.delete(Routes.channelMessage(this.id, messageIds[0]));
297
+ return message ? new Collection([[message.id, message]]) : new Collection();
298
+ }
299
+ await this.client.rest.post(Routes.channelBulkDelete(this.id), { body: { messages: messageIds } });
300
+ return messageIds.reduce(
301
+ (col, id) =>
302
+ col.set(
303
+ id,
304
+ this.client.actions.MessageDeleteBulk.getMessage(
305
+ {
306
+ message_id: id,
307
+ },
308
+ this,
309
+ ),
310
+ ),
311
+ new Collection(),
312
+ );
313
+ }
314
+ if (!isNaN(messages)) {
315
+ const msgs = await this.messages.fetch({ limit: messages });
316
+ return this.bulkDelete(msgs, filterOld);
317
+ }
318
+ throw new DiscordjsTypeError(ErrorCodes.MessageBulkDeleteType);
319
+ }
320
+
321
+ /**
322
+ * Fetches all webhooks for the channel.
323
+ * @returns {Promise<Collection<Snowflake, Webhook>>}
324
+ * @example
325
+ * // Fetch webhooks
326
+ * channel.fetchWebhooks()
327
+ * .then(hooks => console.log(`This channel has ${hooks.size} hooks`))
328
+ * .catch(console.error);
329
+ */
330
+ fetchWebhooks() {
331
+ return this.guild.channels.fetchWebhooks(this.id);
332
+ }
333
+
334
+ /**
335
+ * Options used to create a {@link Webhook}.
336
+ * @typedef {Object} ChannelWebhookCreateOptions
337
+ * @property {string} name The name of the webhook
338
+ * @property {?(BufferResolvable|Base64Resolvable)} [avatar] Avatar for the webhook
339
+ * @property {string} [reason] Reason for creating the webhook
340
+ */
341
+
342
+ /**
343
+ * Creates a webhook for the channel.
344
+ * @param {ChannelWebhookCreateOptions} [options] Options for creating the webhook
345
+ * @returns {Promise<Webhook>} Returns the created Webhook
346
+ * @example
347
+ * // Create a webhook for the current channel
348
+ * channel.createWebhook({
349
+ * name: 'Snek',
350
+ * avatar: 'https://i.imgur.com/mI8XcpG.jpg',
351
+ * reason: 'Needed a cool new Webhook'
352
+ * })
353
+ * .then(console.log)
354
+ * .catch(console.error)
355
+ */
356
+ createWebhook(options) {
357
+ return this.guild.channels.createWebhook({ channel: this.id, ...options });
358
+ }
359
+
360
+ /**
361
+ * Sets the rate limit per user (slowmode) for this channel.
362
+ * @param {number} rateLimitPerUser The new rate limit in seconds
363
+ * @param {string} [reason] Reason for changing the channel's rate limit
364
+ * @returns {Promise<this>}
365
+ */
366
+ setRateLimitPerUser(rateLimitPerUser, reason) {
367
+ return this.edit({ rateLimitPerUser, reason });
368
+ }
369
+
370
+ /**
371
+ * Sets whether this channel is flagged as NSFW.
372
+ * @param {boolean} [nsfw=true] Whether the channel should be considered NSFW
373
+ * @param {string} [reason] Reason for changing the channel's NSFW flag
374
+ * @returns {Promise<this>}
375
+ */
376
+ setNSFW(nsfw = true, reason) {
377
+ return this.edit({ nsfw, reason });
378
+ }
379
+
380
+ static applyToClass(structure, full = false, ignore = []) {
381
+ const props = ['send'];
382
+ if (full) {
383
+ props.push(
384
+ 'lastMessage',
385
+ 'lastPinAt',
386
+ 'bulkDelete',
387
+ 'sendTyping',
388
+ 'createMessageCollector',
389
+ 'awaitMessages',
390
+ 'createMessageComponentCollector',
391
+ 'awaitMessageComponent',
392
+ 'fetchWebhooks',
393
+ 'createWebhook',
394
+ 'setRateLimitPerUser',
395
+ 'setNSFW',
396
+ );
397
+ }
398
+ for (const prop of props) {
399
+ if (ignore.includes(prop)) continue;
400
+ Object.defineProperty(
401
+ structure.prototype,
402
+ prop,
403
+ Object.getOwnPropertyDescriptor(TextBasedChannel.prototype, prop),
404
+ );
405
+ }
406
+ }
407
+ }
408
+
409
+ module.exports = TextBasedChannel;
410
+
411
+ // Fixes Circular
412
+ // eslint-disable-next-line import/order
413
+ const MessageManager = require('../../managers/MessageManager');