rockcord 4.0.0-dev.4

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 (366) hide show
  1. package/LICENSE +674 -0
  2. package/README.md +48 -0
  3. package/package.json +107 -0
  4. package/src/WebSocket.js +39 -0
  5. package/src/client/BaseClient.js +86 -0
  6. package/src/client/Client.js +946 -0
  7. package/src/client/WebhookClient.js +61 -0
  8. package/src/client/actions/Action.js +116 -0
  9. package/src/client/actions/ActionsManager.js +80 -0
  10. package/src/client/actions/ApplicationCommandPermissionsUpdate.js +34 -0
  11. package/src/client/actions/AutoModerationActionExecution.js +27 -0
  12. package/src/client/actions/AutoModerationRuleCreate.js +28 -0
  13. package/src/client/actions/AutoModerationRuleDelete.js +32 -0
  14. package/src/client/actions/AutoModerationRuleUpdate.js +30 -0
  15. package/src/client/actions/ChannelCreate.js +23 -0
  16. package/src/client/actions/ChannelDelete.js +39 -0
  17. package/src/client/actions/ChannelUpdate.js +43 -0
  18. package/src/client/actions/GuildAuditLogEntryCreate.js +29 -0
  19. package/src/client/actions/GuildBanAdd.js +20 -0
  20. package/src/client/actions/GuildBanRemove.js +25 -0
  21. package/src/client/actions/GuildChannelsPositionUpdate.js +21 -0
  22. package/src/client/actions/GuildDelete.js +65 -0
  23. package/src/client/actions/GuildEmojiCreate.js +20 -0
  24. package/src/client/actions/GuildEmojiDelete.js +21 -0
  25. package/src/client/actions/GuildEmojiUpdate.js +20 -0
  26. package/src/client/actions/GuildEmojisUpdate.js +34 -0
  27. package/src/client/actions/GuildIntegrationsUpdate.js +19 -0
  28. package/src/client/actions/GuildMemberRemove.js +33 -0
  29. package/src/client/actions/GuildMemberUpdate.js +44 -0
  30. package/src/client/actions/GuildRoleCreate.js +25 -0
  31. package/src/client/actions/GuildRoleDelete.js +31 -0
  32. package/src/client/actions/GuildRoleUpdate.js +39 -0
  33. package/src/client/actions/GuildRolesPositionUpdate.js +21 -0
  34. package/src/client/actions/GuildScheduledEventCreate.js +27 -0
  35. package/src/client/actions/GuildScheduledEventDelete.js +31 -0
  36. package/src/client/actions/GuildScheduledEventUpdate.js +30 -0
  37. package/src/client/actions/GuildScheduledEventUserAdd.js +32 -0
  38. package/src/client/actions/GuildScheduledEventUserRemove.js +32 -0
  39. package/src/client/actions/GuildStickerCreate.js +20 -0
  40. package/src/client/actions/GuildStickerDelete.js +21 -0
  41. package/src/client/actions/GuildStickerUpdate.js +20 -0
  42. package/src/client/actions/GuildStickersUpdate.js +34 -0
  43. package/src/client/actions/GuildUpdate.js +33 -0
  44. package/src/client/actions/InviteCreate.js +28 -0
  45. package/src/client/actions/InviteDelete.js +30 -0
  46. package/src/client/actions/MessageCreate.js +50 -0
  47. package/src/client/actions/MessageDelete.js +32 -0
  48. package/src/client/actions/MessageDeleteBulk.js +46 -0
  49. package/src/client/actions/MessagePollVoteAdd.js +33 -0
  50. package/src/client/actions/MessagePollVoteRemove.js +33 -0
  51. package/src/client/actions/MessageReactionAdd.js +68 -0
  52. package/src/client/actions/MessageReactionRemove.js +50 -0
  53. package/src/client/actions/MessageReactionRemoveAll.js +33 -0
  54. package/src/client/actions/MessageReactionRemoveEmoji.js +28 -0
  55. package/src/client/actions/MessageUpdate.js +26 -0
  56. package/src/client/actions/PresenceUpdate.js +50 -0
  57. package/src/client/actions/StageInstanceCreate.js +28 -0
  58. package/src/client/actions/StageInstanceDelete.js +33 -0
  59. package/src/client/actions/StageInstanceUpdate.js +30 -0
  60. package/src/client/actions/ThreadCreate.js +24 -0
  61. package/src/client/actions/ThreadDelete.js +32 -0
  62. package/src/client/actions/ThreadListSync.js +59 -0
  63. package/src/client/actions/ThreadMemberUpdate.js +30 -0
  64. package/src/client/actions/ThreadMembersUpdate.js +34 -0
  65. package/src/client/actions/TypingStart.js +29 -0
  66. package/src/client/actions/UserUpdate.js +35 -0
  67. package/src/client/actions/VoiceStateUpdate.js +50 -0
  68. package/src/client/actions/WebhooksUpdate.js +20 -0
  69. package/src/client/voice/ClientVoiceManager.js +151 -0
  70. package/src/client/voice/VoiceConnection.js +1295 -0
  71. package/src/client/voice/dispatcher/AnnexBDispatcher.js +136 -0
  72. package/src/client/voice/dispatcher/AudioDispatcher.js +145 -0
  73. package/src/client/voice/dispatcher/BaseDispatcher.js +473 -0
  74. package/src/client/voice/dispatcher/VPxDispatcher.js +58 -0
  75. package/src/client/voice/dispatcher/VideoDispatcher.js +68 -0
  76. package/src/client/voice/networking/DAVE.js +184 -0
  77. package/src/client/voice/networking/VoiceUDPClient.js +190 -0
  78. package/src/client/voice/networking/VoiceWebSocket.js +366 -0
  79. package/src/client/voice/player/MediaPlayer.js +321 -0
  80. package/src/client/voice/player/processing/AnnexBNalSplitter.js +267 -0
  81. package/src/client/voice/player/processing/IvfSplitter.js +106 -0
  82. package/src/client/voice/player/processing/PCMInsertSilence.js +37 -0
  83. package/src/client/voice/receiver/PacketHandler.js +329 -0
  84. package/src/client/voice/receiver/Receiver.js +115 -0
  85. package/src/client/voice/receiver/Recorder.js +197 -0
  86. package/src/client/voice/util/Function.js +122 -0
  87. package/src/client/voice/util/PlayInterface.js +122 -0
  88. package/src/client/voice/util/Secretbox.js +64 -0
  89. package/src/client/voice/util/Silence.js +16 -0
  90. package/src/client/voice/util/Socket.js +68 -0
  91. package/src/client/voice/util/VideoFrames.js +183 -0
  92. package/src/client/voice/util/VolumeInterface.js +105 -0
  93. package/src/client/websocket/WebSocketManager.js +405 -0
  94. package/src/client/websocket/WebSocketShard.js +908 -0
  95. package/src/client/websocket/handlers/APPLICATION_COMMAND_CREATE.js +18 -0
  96. package/src/client/websocket/handlers/APPLICATION_COMMAND_DELETE.js +20 -0
  97. package/src/client/websocket/handlers/APPLICATION_COMMAND_PERMISSIONS_UPDATE.js +5 -0
  98. package/src/client/websocket/handlers/APPLICATION_COMMAND_UPDATE.js +20 -0
  99. package/src/client/websocket/handlers/AUTO_MODERATION_ACTION_EXECUTION.js +5 -0
  100. package/src/client/websocket/handlers/AUTO_MODERATION_RULE_CREATE.js +5 -0
  101. package/src/client/websocket/handlers/AUTO_MODERATION_RULE_DELETE.js +5 -0
  102. package/src/client/websocket/handlers/AUTO_MODERATION_RULE_UPDATE.js +5 -0
  103. package/src/client/websocket/handlers/CALL_CREATE.js +14 -0
  104. package/src/client/websocket/handlers/CALL_DELETE.js +11 -0
  105. package/src/client/websocket/handlers/CALL_UPDATE.js +11 -0
  106. package/src/client/websocket/handlers/CHANNEL_CREATE.js +5 -0
  107. package/src/client/websocket/handlers/CHANNEL_DELETE.js +5 -0
  108. package/src/client/websocket/handlers/CHANNEL_PINS_UPDATE.js +22 -0
  109. package/src/client/websocket/handlers/CHANNEL_RECIPIENT_ADD.js +19 -0
  110. package/src/client/websocket/handlers/CHANNEL_RECIPIENT_REMOVE.js +16 -0
  111. package/src/client/websocket/handlers/CHANNEL_UPDATE.js +16 -0
  112. package/src/client/websocket/handlers/GUILD_AUDIT_LOG_ENTRY_CREATE.js +5 -0
  113. package/src/client/websocket/handlers/GUILD_BAN_ADD.js +5 -0
  114. package/src/client/websocket/handlers/GUILD_BAN_REMOVE.js +5 -0
  115. package/src/client/websocket/handlers/GUILD_CREATE.js +52 -0
  116. package/src/client/websocket/handlers/GUILD_DELETE.js +5 -0
  117. package/src/client/websocket/handlers/GUILD_EMOJIS_UPDATE.js +5 -0
  118. package/src/client/websocket/handlers/GUILD_INTEGRATIONS_UPDATE.js +5 -0
  119. package/src/client/websocket/handlers/GUILD_MEMBERS_CHUNK.js +39 -0
  120. package/src/client/websocket/handlers/GUILD_MEMBER_ADD.js +20 -0
  121. package/src/client/websocket/handlers/GUILD_MEMBER_REMOVE.js +5 -0
  122. package/src/client/websocket/handlers/GUILD_MEMBER_UPDATE.js +5 -0
  123. package/src/client/websocket/handlers/GUILD_ROLE_CREATE.js +5 -0
  124. package/src/client/websocket/handlers/GUILD_ROLE_DELETE.js +5 -0
  125. package/src/client/websocket/handlers/GUILD_ROLE_UPDATE.js +5 -0
  126. package/src/client/websocket/handlers/GUILD_SCHEDULED_EVENT_CREATE.js +5 -0
  127. package/src/client/websocket/handlers/GUILD_SCHEDULED_EVENT_DELETE.js +5 -0
  128. package/src/client/websocket/handlers/GUILD_SCHEDULED_EVENT_UPDATE.js +5 -0
  129. package/src/client/websocket/handlers/GUILD_SCHEDULED_EVENT_USER_ADD.js +5 -0
  130. package/src/client/websocket/handlers/GUILD_SCHEDULED_EVENT_USER_REMOVE.js +5 -0
  131. package/src/client/websocket/handlers/GUILD_STICKERS_UPDATE.js +5 -0
  132. package/src/client/websocket/handlers/GUILD_UPDATE.js +5 -0
  133. package/src/client/websocket/handlers/INTERACTION_MODAL_CREATE.js +12 -0
  134. package/src/client/websocket/handlers/INVITE_CREATE.js +5 -0
  135. package/src/client/websocket/handlers/INVITE_DELETE.js +5 -0
  136. package/src/client/websocket/handlers/MESSAGE_CREATE.js +5 -0
  137. package/src/client/websocket/handlers/MESSAGE_DELETE.js +5 -0
  138. package/src/client/websocket/handlers/MESSAGE_DELETE_BULK.js +5 -0
  139. package/src/client/websocket/handlers/MESSAGE_POLL_VOTE_ADD.js +5 -0
  140. package/src/client/websocket/handlers/MESSAGE_POLL_VOTE_REMOVE.js +5 -0
  141. package/src/client/websocket/handlers/MESSAGE_REACTION_ADD.js +5 -0
  142. package/src/client/websocket/handlers/MESSAGE_REACTION_REMOVE.js +5 -0
  143. package/src/client/websocket/handlers/MESSAGE_REACTION_REMOVE_ALL.js +5 -0
  144. package/src/client/websocket/handlers/MESSAGE_REACTION_REMOVE_EMOJI.js +5 -0
  145. package/src/client/websocket/handlers/MESSAGE_UPDATE.js +16 -0
  146. package/src/client/websocket/handlers/PRESENCE_UPDATE.js +5 -0
  147. package/src/client/websocket/handlers/READY.js +121 -0
  148. package/src/client/websocket/handlers/RELATIONSHIP_ADD.js +19 -0
  149. package/src/client/websocket/handlers/RELATIONSHIP_REMOVE.js +17 -0
  150. package/src/client/websocket/handlers/RELATIONSHIP_UPDATE.js +41 -0
  151. package/src/client/websocket/handlers/RESUMED.js +14 -0
  152. package/src/client/websocket/handlers/STAGE_INSTANCE_CREATE.js +5 -0
  153. package/src/client/websocket/handlers/STAGE_INSTANCE_DELETE.js +5 -0
  154. package/src/client/websocket/handlers/STAGE_INSTANCE_UPDATE.js +5 -0
  155. package/src/client/websocket/handlers/THREAD_CREATE.js +5 -0
  156. package/src/client/websocket/handlers/THREAD_DELETE.js +5 -0
  157. package/src/client/websocket/handlers/THREAD_LIST_SYNC.js +5 -0
  158. package/src/client/websocket/handlers/THREAD_MEMBERS_UPDATE.js +5 -0
  159. package/src/client/websocket/handlers/THREAD_MEMBER_UPDATE.js +5 -0
  160. package/src/client/websocket/handlers/THREAD_UPDATE.js +16 -0
  161. package/src/client/websocket/handlers/TYPING_START.js +5 -0
  162. package/src/client/websocket/handlers/USER_GUILD_SETTINGS_UPDATE.js +6 -0
  163. package/src/client/websocket/handlers/USER_NOTE_UPDATE.js +5 -0
  164. package/src/client/websocket/handlers/USER_REQUIRED_ACTION_UPDATE.js +78 -0
  165. package/src/client/websocket/handlers/USER_SETTINGS_UPDATE.js +5 -0
  166. package/src/client/websocket/handlers/USER_UPDATE.js +5 -0
  167. package/src/client/websocket/handlers/VOICE_CHANNEL_EFFECT_SEND.js +16 -0
  168. package/src/client/websocket/handlers/VOICE_CHANNEL_STATUS_UPDATE.js +12 -0
  169. package/src/client/websocket/handlers/VOICE_SERVER_UPDATE.js +6 -0
  170. package/src/client/websocket/handlers/VOICE_STATE_UPDATE.js +5 -0
  171. package/src/client/websocket/handlers/WEBHOOKS_UPDATE.js +5 -0
  172. package/src/client/websocket/handlers/index.js +84 -0
  173. package/src/errors/DJSError.js +61 -0
  174. package/src/errors/Messages.js +219 -0
  175. package/src/errors/index.js +4 -0
  176. package/src/index.js +218 -0
  177. package/src/managers/ApplicationCommandManager.js +264 -0
  178. package/src/managers/ApplicationCommandPermissionsManager.js +417 -0
  179. package/src/managers/AutoModerationRuleManager.js +296 -0
  180. package/src/managers/BaseGuildEmojiManager.js +80 -0
  181. package/src/managers/BaseManager.js +19 -0
  182. package/src/managers/BillingManager.js +66 -0
  183. package/src/managers/CachedManager.js +71 -0
  184. package/src/managers/ChannelManager.js +148 -0
  185. package/src/managers/ClientUserSettingManager.js +372 -0
  186. package/src/managers/DataManager.js +61 -0
  187. package/src/managers/GuildBanManager.js +250 -0
  188. package/src/managers/GuildChannelManager.js +488 -0
  189. package/src/managers/GuildEmojiManager.js +171 -0
  190. package/src/managers/GuildEmojiRoleManager.js +118 -0
  191. package/src/managers/GuildForumThreadManager.js +94 -0
  192. package/src/managers/GuildInviteManager.js +213 -0
  193. package/src/managers/GuildManager.js +338 -0
  194. package/src/managers/GuildMemberManager.js +599 -0
  195. package/src/managers/GuildMemberRoleManager.js +195 -0
  196. package/src/managers/GuildScheduledEventManager.js +314 -0
  197. package/src/managers/GuildSettingManager.js +155 -0
  198. package/src/managers/GuildStickerManager.js +179 -0
  199. package/src/managers/GuildTextThreadManager.js +98 -0
  200. package/src/managers/InteractionManager.js +39 -0
  201. package/src/managers/MessageManager.js +426 -0
  202. package/src/managers/PermissionOverwriteManager.js +164 -0
  203. package/src/managers/PresenceManager.js +71 -0
  204. package/src/managers/ReactionManager.js +67 -0
  205. package/src/managers/ReactionUserManager.js +73 -0
  206. package/src/managers/RelationshipManager.js +278 -0
  207. package/src/managers/RoleManager.js +448 -0
  208. package/src/managers/SessionManager.js +66 -0
  209. package/src/managers/StageInstanceManager.js +162 -0
  210. package/src/managers/ThreadManager.js +175 -0
  211. package/src/managers/ThreadMemberManager.js +186 -0
  212. package/src/managers/UserManager.js +136 -0
  213. package/src/managers/UserNoteManager.js +53 -0
  214. package/src/managers/VoiceStateManager.js +59 -0
  215. package/src/rest/APIRequest.js +149 -0
  216. package/src/rest/APIRouter.js +53 -0
  217. package/src/rest/DiscordAPIError.js +121 -0
  218. package/src/rest/HTTPError.js +64 -0
  219. package/src/rest/RESTManager.js +97 -0
  220. package/src/rest/RateLimitError.js +55 -0
  221. package/src/rest/RequestHandler.js +476 -0
  222. package/src/sharding/Shard.js +476 -0
  223. package/src/sharding/ShardClientUtil.js +279 -0
  224. package/src/sharding/ShardingManager.js +319 -0
  225. package/src/structures/AnonymousGuild.js +98 -0
  226. package/src/structures/ApplicationCommand.js +593 -0
  227. package/src/structures/ApplicationRoleConnectionMetadata.js +48 -0
  228. package/src/structures/AutoModerationActionExecution.js +89 -0
  229. package/src/structures/AutoModerationRule.js +294 -0
  230. package/src/structures/AutocompleteInteraction.js +107 -0
  231. package/src/structures/Base.js +43 -0
  232. package/src/structures/BaseCommandInteraction.js +211 -0
  233. package/src/structures/BaseGuild.js +116 -0
  234. package/src/structures/BaseGuildEmoji.js +56 -0
  235. package/src/structures/BaseGuildTextChannel.js +191 -0
  236. package/src/structures/BaseGuildVoiceChannel.js +241 -0
  237. package/src/structures/BaseMessageComponent.js +181 -0
  238. package/src/structures/ButtonInteraction.js +11 -0
  239. package/src/structures/CallState.js +63 -0
  240. package/src/structures/CategoryChannel.js +85 -0
  241. package/src/structures/Channel.js +284 -0
  242. package/src/structures/ClientPresence.js +77 -0
  243. package/src/structures/ClientUser.js +449 -0
  244. package/src/structures/CommandInteraction.js +41 -0
  245. package/src/structures/CommandInteractionOptionResolver.js +276 -0
  246. package/src/structures/ContainerComponent.js +68 -0
  247. package/src/structures/ContextMenuInteraction.js +65 -0
  248. package/src/structures/DMChannel.js +219 -0
  249. package/src/structures/DirectoryChannel.js +20 -0
  250. package/src/structures/Emoji.js +148 -0
  251. package/src/structures/FileComponent.js +49 -0
  252. package/src/structures/ForumChannel.js +31 -0
  253. package/src/structures/GroupDMChannel.js +394 -0
  254. package/src/structures/Guild.js +1638 -0
  255. package/src/structures/GuildAuditLogs.js +746 -0
  256. package/src/structures/GuildBan.js +59 -0
  257. package/src/structures/GuildBoost.js +108 -0
  258. package/src/structures/GuildChannel.js +470 -0
  259. package/src/structures/GuildEmoji.js +161 -0
  260. package/src/structures/GuildMember.js +639 -0
  261. package/src/structures/GuildPreview.js +191 -0
  262. package/src/structures/GuildPreviewEmoji.js +27 -0
  263. package/src/structures/GuildScheduledEvent.js +536 -0
  264. package/src/structures/GuildTemplate.js +236 -0
  265. package/src/structures/Integration.js +188 -0
  266. package/src/structures/IntegrationApplication.js +96 -0
  267. package/src/structures/Interaction.js +290 -0
  268. package/src/structures/InteractionCollector.js +248 -0
  269. package/src/structures/InteractionWebhook.js +43 -0
  270. package/src/structures/Invite.js +358 -0
  271. package/src/structures/InviteGuild.js +23 -0
  272. package/src/structures/InviteStageInstance.js +86 -0
  273. package/src/structures/MediaChannel.js +11 -0
  274. package/src/structures/MediaGalleryComponent.js +41 -0
  275. package/src/structures/MediaGalleryItem.js +47 -0
  276. package/src/structures/Message.js +1257 -0
  277. package/src/structures/MessageActionRow.js +105 -0
  278. package/src/structures/MessageAttachment.js +216 -0
  279. package/src/structures/MessageButton.js +166 -0
  280. package/src/structures/MessageCollector.js +146 -0
  281. package/src/structures/MessageComponentInteraction.js +120 -0
  282. package/src/structures/MessageContextMenuInteraction.js +20 -0
  283. package/src/structures/MessageEmbed.js +596 -0
  284. package/src/structures/MessageMentions.js +273 -0
  285. package/src/structures/MessagePayload.js +352 -0
  286. package/src/structures/MessageReaction.js +184 -0
  287. package/src/structures/MessageSelectMenu.js +141 -0
  288. package/src/structures/Modal.js +161 -0
  289. package/src/structures/ModalSubmitFieldsResolver.js +53 -0
  290. package/src/structures/ModalSubmitInteraction.js +119 -0
  291. package/src/structures/NewsChannel.js +32 -0
  292. package/src/structures/OAuth2Guild.js +28 -0
  293. package/src/structures/PermissionOverwrites.js +198 -0
  294. package/src/structures/Poll.js +108 -0
  295. package/src/structures/PollAnswer.js +88 -0
  296. package/src/structures/Presence.js +1105 -0
  297. package/src/structures/ReactionCollector.js +229 -0
  298. package/src/structures/ReactionEmoji.js +31 -0
  299. package/src/structures/Role.js +590 -0
  300. package/src/structures/SectionComponent.js +48 -0
  301. package/src/structures/SelectMenuInteraction.js +21 -0
  302. package/src/structures/SeparatorComponent.js +48 -0
  303. package/src/structures/Session.js +81 -0
  304. package/src/structures/StageChannel.js +104 -0
  305. package/src/structures/StageInstance.js +208 -0
  306. package/src/structures/Sticker.js +310 -0
  307. package/src/structures/StickerPack.js +95 -0
  308. package/src/structures/StoreChannel.js +56 -0
  309. package/src/structures/Team.js +118 -0
  310. package/src/structures/TeamMember.js +80 -0
  311. package/src/structures/TextChannel.js +33 -0
  312. package/src/structures/TextDisplayComponent.js +40 -0
  313. package/src/structures/TextInputComponent.js +132 -0
  314. package/src/structures/ThreadChannel.js +605 -0
  315. package/src/structures/ThreadMember.js +105 -0
  316. package/src/structures/ThreadOnlyChannel.js +249 -0
  317. package/src/structures/ThumbnailComponent.js +57 -0
  318. package/src/structures/Typing.js +74 -0
  319. package/src/structures/UnfurledMediaItem.js +29 -0
  320. package/src/structures/User.js +624 -0
  321. package/src/structures/UserContextMenuInteraction.js +29 -0
  322. package/src/structures/VoiceChannel.js +110 -0
  323. package/src/structures/VoiceChannelEffect.js +69 -0
  324. package/src/structures/VoiceRegion.js +53 -0
  325. package/src/structures/VoiceState.js +354 -0
  326. package/src/structures/WebEmbed.js +373 -0
  327. package/src/structures/Webhook.js +478 -0
  328. package/src/structures/WelcomeChannel.js +60 -0
  329. package/src/structures/WelcomeScreen.js +48 -0
  330. package/src/structures/Widget.js +87 -0
  331. package/src/structures/WidgetMember.js +99 -0
  332. package/src/structures/interfaces/Application.js +825 -0
  333. package/src/structures/interfaces/Collector.js +301 -0
  334. package/src/structures/interfaces/InteractionResponses.js +313 -0
  335. package/src/structures/interfaces/TextBasedChannel.js +743 -0
  336. package/src/util/APITypes.js +59 -0
  337. package/src/util/ActivityFlags.js +44 -0
  338. package/src/util/ApplicationFlags.js +76 -0
  339. package/src/util/AttachmentFlags.js +38 -0
  340. package/src/util/BitField.js +182 -0
  341. package/src/util/ChannelFlags.js +45 -0
  342. package/src/util/Constants.js +1927 -0
  343. package/src/util/DataResolver.js +146 -0
  344. package/src/util/Formatters.js +228 -0
  345. package/src/util/GuildMemberFlags.js +43 -0
  346. package/src/util/Intents.js +74 -0
  347. package/src/util/InviteFlags.js +34 -0
  348. package/src/util/LimitedCollection.js +134 -0
  349. package/src/util/MessageFlags.js +63 -0
  350. package/src/util/Options.js +358 -0
  351. package/src/util/Permissions.js +202 -0
  352. package/src/util/PremiumUsageFlags.js +31 -0
  353. package/src/util/PurchasedFlags.js +33 -0
  354. package/src/util/Redact.js +26 -0
  355. package/src/util/RemoteAuth.js +449 -0
  356. package/src/util/RoleFlags.js +37 -0
  357. package/src/util/SnowflakeUtil.js +92 -0
  358. package/src/util/Speaking.js +33 -0
  359. package/src/util/Sweepers.js +466 -0
  360. package/src/util/SystemChannelFlags.js +55 -0
  361. package/src/util/ThreadMemberFlags.js +30 -0
  362. package/src/util/UserFlags.js +104 -0
  363. package/src/util/Util.js +1079 -0
  364. package/typings/enums.d.ts +437 -0
  365. package/typings/index.d.ts +8197 -0
  366. package/typings/rawDataTypes.d.ts +403 -0
@@ -0,0 +1,1257 @@
1
+ 'use strict';
2
+
3
+ const process = require('node:process');
4
+ const { Collection } = require('@discordjs/collection');
5
+ const Base = require('./Base');
6
+ const BaseMessageComponent = require('./BaseMessageComponent');
7
+ const MessageAttachment = require('./MessageAttachment');
8
+ const Embed = require('./MessageEmbed');
9
+ const Mentions = require('./MessageMentions');
10
+ const MessagePayload = require('./MessagePayload');
11
+ const { Poll } = require('./Poll');
12
+ const ReactionCollector = require('./ReactionCollector');
13
+ const { Sticker } = require('./Sticker');
14
+ const Application = require('./interfaces/Application');
15
+ const { Error } = require('../errors');
16
+ const ReactionManager = require('../managers/ReactionManager');
17
+ const {
18
+ InteractionTypes,
19
+ MessageTypes,
20
+ SystemMessageTypes,
21
+ MessageComponentTypes,
22
+ MessageReferenceTypes,
23
+ } = require('../util/Constants');
24
+ const MessageFlags = require('../util/MessageFlags');
25
+ const Permissions = require('../util/Permissions');
26
+ const SnowflakeUtil = require('../util/SnowflakeUtil');
27
+ const Util = require('../util/Util');
28
+
29
+ /**
30
+ * @type {WeakSet<Message>}
31
+ * @private
32
+ * @internal
33
+ */
34
+ const deletedMessages = new WeakSet();
35
+ let deprecationEmittedForDeleted = false;
36
+
37
+ /**
38
+ * Represents a message on Discord.
39
+ * @extends {Base}
40
+ */
41
+ class Message extends Base {
42
+ constructor(client, data) {
43
+ super(client);
44
+
45
+ /**
46
+ * The id of the channel the message was sent in
47
+ * @type {Snowflake}
48
+ */
49
+ this.channelId = data.channel_id;
50
+
51
+ /**
52
+ * The id of the guild the message was sent in, if any
53
+ * @type {?Snowflake}
54
+ */
55
+ this.guildId = data.guild_id ?? this.channel?.guild?.id ?? null;
56
+
57
+ this._patch(data);
58
+ }
59
+
60
+ _patch(data) {
61
+ /**
62
+ * The message's id
63
+ * @type {Snowflake}
64
+ */
65
+ this.id = data.id;
66
+
67
+ if ('position' in data) {
68
+ /**
69
+ * A generally increasing integer (there may be gaps or duplicates) that represents
70
+ * the approximate position of the message in a thread.
71
+ * @type {?number}
72
+ */
73
+ this.position = data.position;
74
+ } else {
75
+ this.position ??= null;
76
+ }
77
+
78
+ /**
79
+ * The timestamp the message was sent at
80
+ * @type {number}
81
+ */
82
+ this.createdTimestamp = this.id ? SnowflakeUtil.timestampFrom(this.id) : new Date(data.timestamp).getTime();
83
+
84
+ if ('type' in data) {
85
+ /**
86
+ * The type of the message
87
+ * @type {?MessageType}
88
+ */
89
+ this.type = MessageTypes[data.type];
90
+
91
+ /**
92
+ * Whether or not this message was sent by Discord, not actually a user (e.g. pin notifications)
93
+ * @type {?boolean}
94
+ */
95
+ this.system = SystemMessageTypes.includes(this.type);
96
+ } else {
97
+ this.system ??= null;
98
+ this.type ??= null;
99
+ }
100
+
101
+ if ('content' in data) {
102
+ /**
103
+ * The content of the message
104
+ * @type {?string}
105
+ */
106
+ this.content = data.content;
107
+ } else {
108
+ this.content ??= null;
109
+ }
110
+
111
+ if ('author' in data) {
112
+ /**
113
+ * The author of the message
114
+ * @type {?User}
115
+ */
116
+ this.author = this.client.users._add(data.author, !data.webhook_id);
117
+ } else {
118
+ this.author ??= null;
119
+ }
120
+
121
+ if ('pinned' in data) {
122
+ /**
123
+ * Whether or not this message is pinned
124
+ * @type {?boolean}
125
+ */
126
+ this.pinned = Boolean(data.pinned);
127
+ } else {
128
+ this.pinned ??= null;
129
+ }
130
+
131
+ if ('tts' in data) {
132
+ /**
133
+ * Whether or not the message was Text-To-Speech
134
+ * @type {?boolean}
135
+ */
136
+ this.tts = data.tts;
137
+ } else {
138
+ this.tts ??= null;
139
+ }
140
+
141
+ if ('nonce' in data) {
142
+ /**
143
+ * A random number or string used for checking message delivery
144
+ * <warn>This is only received after the message was sent successfully, and
145
+ * lost if re-fetched</warn>
146
+ * @type {?string}
147
+ */
148
+ this.nonce = data.nonce;
149
+ } else {
150
+ this.nonce ??= null;
151
+ }
152
+
153
+ if ('embeds' in data) {
154
+ /**
155
+ * A list of embeds in the message - e.g. YouTube Player
156
+ * @type {MessageEmbed[]}
157
+ */
158
+ this.embeds = data.embeds.map(e => new Embed(e, true));
159
+ } else {
160
+ this.embeds = this.embeds?.slice() ?? [];
161
+ }
162
+
163
+ /**
164
+ * @typedef {MessageActionRow|ContainerComponent|FileComponent|MediaGalleryComponent|SectionComponent|SeparatorComponent|TextDisplayComponent} TopLevelComponent
165
+ */
166
+
167
+ if ('components' in data) {
168
+ /**
169
+ * An array of components in the message
170
+ * @type {TopLevelComponent[]}
171
+ */
172
+ this.components = data.components.map(c => BaseMessageComponent.create(c, this.client));
173
+ } else {
174
+ this.components = this.components?.slice() ?? [];
175
+ }
176
+
177
+ if ('attachments' in data) {
178
+ /**
179
+ * A collection of attachments in the message - e.g. Pictures - mapped by their ids
180
+ * @type {Collection<Snowflake, MessageAttachment>}
181
+ */
182
+ this.attachments = new Collection();
183
+ if (data.attachments) {
184
+ for (const attachment of data.attachments) {
185
+ this.attachments.set(attachment.id, new MessageAttachment(attachment.url, attachment.filename, attachment));
186
+ }
187
+ }
188
+ } else {
189
+ this.attachments = new Collection(this.attachments);
190
+ }
191
+
192
+ if ('sticker_items' in data || 'stickers' in data) {
193
+ /**
194
+ * A collection of stickers in the message
195
+ * @type {Collection<Snowflake, Sticker>}
196
+ */
197
+ this.stickers = new Collection(
198
+ (data.sticker_items ?? data.stickers)?.map(s => [s.id, new Sticker(this.client, s)]),
199
+ );
200
+ } else {
201
+ this.stickers = new Collection(this.stickers);
202
+ }
203
+
204
+ // Discord sends null if the message has not been edited
205
+ if (data.edited_timestamp) {
206
+ /**
207
+ * The timestamp the message was last edited at (if applicable)
208
+ * @type {?number}
209
+ */
210
+ this.editedTimestamp = data.edited_timestamp ? Date.parse(data.edited_timestamp) : null;
211
+ } else {
212
+ this.editedTimestamp ??= null;
213
+ }
214
+
215
+ if ('reactions' in data) {
216
+ /**
217
+ * A manager of the reactions belonging to this message
218
+ * @type {ReactionManager}
219
+ */
220
+ this.reactions = new ReactionManager(this);
221
+ if (data.reactions?.length > 0) {
222
+ for (const reaction of data.reactions) {
223
+ this.reactions._add(reaction);
224
+ }
225
+ }
226
+ } else {
227
+ this.reactions ??= new ReactionManager(this);
228
+ }
229
+
230
+ if (!this.mentions) {
231
+ /**
232
+ * All valid mentions that the message contains
233
+ * @type {MessageMentions}
234
+ */
235
+ this.mentions = new Mentions(
236
+ this,
237
+ data.mentions,
238
+ data.mention_roles,
239
+ data.mention_everyone,
240
+ data.mention_channels,
241
+ data.referenced_message?.author,
242
+ );
243
+ } else {
244
+ this.mentions = new Mentions(
245
+ this,
246
+ data.mentions ?? this.mentions.users,
247
+ data.mention_roles ?? this.mentions.roles,
248
+ data.mention_everyone ?? this.mentions.everyone,
249
+ data.mention_channels ?? this.mentions.crosspostedChannels,
250
+ data.referenced_message?.author ?? this.mentions.repliedUser,
251
+ );
252
+ }
253
+
254
+ if ('webhook_id' in data) {
255
+ /**
256
+ * The id of the webhook that sent the message, if applicable
257
+ * @type {?Snowflake}
258
+ */
259
+ this.webhookId = data.webhook_id;
260
+ } else {
261
+ this.webhookId ??= null;
262
+ }
263
+
264
+ if (data.poll) {
265
+ /**
266
+ * The poll that was sent with the message
267
+ * @type {?Poll}
268
+ */
269
+ this.poll = new Poll(this.client, data.poll, this);
270
+ } else {
271
+ this.poll ??= null;
272
+ }
273
+
274
+ if ('application' in data) {
275
+ /**
276
+ * Supplemental application information for group activities
277
+ * @type {?Application}
278
+ */
279
+ this.groupActivityApplication = new Application(this.client, data.application);
280
+ } else {
281
+ this.groupActivityApplication ??= null;
282
+ }
283
+
284
+ if ('application_id' in data) {
285
+ /**
286
+ * The id of the application of the interaction that sent this message, if any
287
+ * @type {?Snowflake}
288
+ */
289
+ this.applicationId = data.application_id;
290
+ } else {
291
+ this.applicationId ??= null;
292
+ }
293
+
294
+ if ('activity' in data) {
295
+ /**
296
+ * Group activity
297
+ * @type {?MessageActivity}
298
+ */
299
+ this.activity = {
300
+ partyId: data.activity.party_id,
301
+ type: data.activity.type,
302
+ };
303
+ } else {
304
+ this.activity ??= null;
305
+ }
306
+
307
+ if ('thread' in data) {
308
+ this.client.channels._add(data.thread, this.guild);
309
+ }
310
+
311
+ if (this.member && data.member) {
312
+ this.member._patch(data.member);
313
+ } else if (data.member && this.guild && this.author) {
314
+ this.guild.members._add(Object.assign(data.member, { user: this.author }));
315
+ }
316
+
317
+ if ('flags' in data) {
318
+ /**
319
+ * Flags that are applied to the message
320
+ * @type {Readonly<MessageFlags>}
321
+ */
322
+ this.flags = new MessageFlags(data.flags).freeze();
323
+ } else {
324
+ this.flags = new MessageFlags(this.flags).freeze();
325
+ }
326
+
327
+ /**
328
+ * Reference data sent in a message that contains ids identifying the referenced message.
329
+ * This can be present in the following types of message:
330
+ * * Crossposted messages (IS_CROSSPOST {@link MessageFlags.FLAGS message flag})
331
+ * * CHANNEL_FOLLOW_ADD
332
+ * * CHANNEL_PINNED_MESSAGE
333
+ * * REPLY
334
+ * * THREAD_STARTER_MESSAGE
335
+ * @see {@link https://discord.com/developers/docs/resources/channel#message-types}
336
+ * @typedef {Object} MessageReference
337
+ * @property {Snowflake} channelId The channel's id the message was referenced
338
+ * @property {?Snowflake} guildId The guild's id the message was referenced
339
+ * @property {?Snowflake} messageId The message's id that was referenced
340
+ * @property {MessageReferenceType} type The type of the message reference
341
+ */
342
+
343
+ if ('message_reference' in data) {
344
+ /**
345
+ * Message reference data
346
+ * @type {?MessageReference}
347
+ */
348
+ this.reference = {
349
+ channelId: data.message_reference.channel_id,
350
+ guildId: data.message_reference.guild_id,
351
+ messageId: data.message_reference.message_id,
352
+ type: MessageReferenceTypes[data.message_reference.type ?? 0],
353
+ };
354
+ } else {
355
+ this.reference ??= null;
356
+ }
357
+
358
+ if (data.referenced_message) {
359
+ this.channel?.messages._add({ guild_id: data.message_reference?.guild_id, ...data.referenced_message });
360
+ }
361
+
362
+ /**
363
+ * Partial data of the interaction that a message is a reply to
364
+ * @typedef {Object} MessageInteraction
365
+ * @property {Snowflake} id The interaction's id
366
+ * @property {InteractionType} type The type of the interaction
367
+ * @property {string} commandName The name of the interaction's application command,
368
+ * as well as the subcommand and subcommand group, where applicable
369
+ * @property {User} user The user that invoked the interaction
370
+ */
371
+
372
+ if (data.interaction) {
373
+ /**
374
+ * Partial data of the interaction that this message is a reply to
375
+ * @type {?MessageInteraction}
376
+ */
377
+ this.interaction = {
378
+ id: data.interaction.id,
379
+ type: InteractionTypes[data.interaction.type],
380
+ commandName: data.interaction.name,
381
+ user: this.client.users._add(data.interaction.user),
382
+ };
383
+ } else {
384
+ this.interaction ??= null;
385
+ }
386
+
387
+ if (data.message_snapshots) {
388
+ /**
389
+ * The message snapshots associated with the message reference
390
+ * @type {Collection<Snowflake, Message>}
391
+ */
392
+ this.messageSnapshots = data.message_snapshots.reduce((coll, snapshot) => {
393
+ const snapshotData = {
394
+ ...snapshot.message,
395
+ id: this.reference.messageId,
396
+ channel_id: this.reference.channelId,
397
+ guild_id: this.reference.guildId,
398
+ };
399
+
400
+ return coll.set(this.reference.messageId, new this.constructor(this.client, snapshotData));
401
+ }, new Collection());
402
+ } else {
403
+ this.messageSnapshots ??= new Collection();
404
+ }
405
+
406
+ /**
407
+ * A call associated with a message
408
+ * @typedef {Object} MessageCall
409
+ * @property {Readonly<?Date>} endedAt The time the call ended
410
+ * @property {?number} endedTimestamp The timestamp the call ended
411
+ * @property {Snowflake[]} participants The ids of the users that participated in the call
412
+ */
413
+
414
+ if (data.call) {
415
+ /**
416
+ * The call associated with the message
417
+ * @type {?MessageCall}
418
+ */
419
+ this.call = {
420
+ endedTimestamp: data.call.ended_timestamp ? Date.parse(data.call.ended_timestamp) : null,
421
+ participants: data.call.participants,
422
+ get endedAt() {
423
+ return this.endedTimestamp && new Date(this.endedTimestamp);
424
+ },
425
+ };
426
+ } else {
427
+ this.call ??= null;
428
+ }
429
+ }
430
+
431
+ /**
432
+ * Whether or not the structure has been deleted
433
+ * @type {boolean}
434
+ * @deprecated This will be removed in the next major version, see https://github.com/discordjs/discord.js/issues/7091
435
+ */
436
+ get deleted() {
437
+ if (!deprecationEmittedForDeleted) {
438
+ deprecationEmittedForDeleted = true;
439
+ process.emitWarning(
440
+ 'Message#deleted is deprecated, see https://github.com/discordjs/discord.js/issues/7091.',
441
+ 'DeprecationWarning',
442
+ );
443
+ }
444
+
445
+ return deletedMessages.has(this);
446
+ }
447
+
448
+ set deleted(value) {
449
+ if (!deprecationEmittedForDeleted) {
450
+ deprecationEmittedForDeleted = true;
451
+ process.emitWarning(
452
+ 'Message#deleted is deprecated, see https://github.com/discordjs/discord.js/issues/7091.',
453
+ 'DeprecationWarning',
454
+ );
455
+ }
456
+
457
+ if (value) deletedMessages.add(this);
458
+ else deletedMessages.delete(this);
459
+ }
460
+
461
+ /**
462
+ * The channel that the message was sent in
463
+ * @type {TextBasedChannels}
464
+ * @readonly
465
+ */
466
+ get channel() {
467
+ return this.client.channels.cache.get(this.channelId) ?? null;
468
+ }
469
+
470
+ /**
471
+ * Whether or not this message is a partial
472
+ * @type {boolean}
473
+ * @readonly
474
+ */
475
+ get partial() {
476
+ return typeof this.content !== 'string' || !this.author;
477
+ }
478
+
479
+ /**
480
+ * Represents the author of the message as a guild member.
481
+ * Only available if the message comes from a guild where the author is still a member
482
+ * @type {?GuildMember}
483
+ * @readonly
484
+ */
485
+ get member() {
486
+ return this.guild?.members.resolve(this.author) ?? null;
487
+ }
488
+
489
+ /**
490
+ * The time the message was sent at
491
+ * @type {Date}
492
+ * @readonly
493
+ */
494
+ get createdAt() {
495
+ return new Date(this.createdTimestamp);
496
+ }
497
+
498
+ /**
499
+ * The time the message was last edited at (if applicable)
500
+ * @type {?Date}
501
+ * @readonly
502
+ */
503
+ get editedAt() {
504
+ return this.editedTimestamp ? new Date(this.editedTimestamp) : null;
505
+ }
506
+
507
+ /**
508
+ * The guild the message was sent in (if in a guild channel)
509
+ * @type {?Guild}
510
+ * @readonly
511
+ */
512
+ get guild() {
513
+ return this.client.guilds.cache.get(this.guildId) ?? this.channel?.guild ?? null;
514
+ }
515
+
516
+ /**
517
+ * Whether this message has a thread associated with it
518
+ * @type {boolean}
519
+ * @readonly
520
+ */
521
+ get hasThread() {
522
+ return this.flags.has(MessageFlags.FLAGS.HAS_THREAD);
523
+ }
524
+
525
+ /**
526
+ * The thread started by this message
527
+ * <info>This property is not suitable for checking whether a message has a thread,
528
+ * use {@link Message#hasThread} instead.</info>
529
+ * @type {?ThreadChannel}
530
+ * @readonly
531
+ */
532
+ get thread() {
533
+ return this.channel?.threads?.cache.get(this.id) ?? null;
534
+ }
535
+
536
+ /**
537
+ * The URL to jump to this message
538
+ * @type {string}
539
+ * @readonly
540
+ */
541
+ get url() {
542
+ return `https://discord.com/channels/${this.guildId ?? '@me'}/${this.channelId}/${this.id}`;
543
+ }
544
+
545
+ /**
546
+ * The message contents with all mentions replaced by the equivalent text.
547
+ * If mentions cannot be resolved to a name, the relevant mention in the message content will not be converted.
548
+ * @type {?string}
549
+ * @readonly
550
+ */
551
+ get cleanContent() {
552
+ // eslint-disable-next-line eqeqeq
553
+ return this.content != null && this.channel ? Util.cleanContent(this.content, this.channel) : null;
554
+ }
555
+
556
+ /**
557
+ * Creates a reaction collector.
558
+ * @param {ReactionCollectorOptions} [options={}] Options to send to the collector
559
+ * @returns {ReactionCollector}
560
+ * @example
561
+ * // Create a reaction collector
562
+ * const filter = (reaction, user) => reaction.emoji.name === '👌' && user.id === 'someId';
563
+ * const collector = message.createReactionCollector({ filter, time: 15_000 });
564
+ * collector.on('collect', r => console.log(`Collected ${r.emoji.name}`));
565
+ * collector.on('end', collected => console.log(`Collected ${collected.size} items`));
566
+ */
567
+ createReactionCollector(options = {}) {
568
+ return new ReactionCollector(this, options);
569
+ }
570
+
571
+ /**
572
+ * An object containing the same properties as CollectorOptions, but a few more:
573
+ * @typedef {ReactionCollectorOptions} AwaitReactionsOptions
574
+ * @property {string[]} [errors] Stop/end reasons that cause the promise to reject
575
+ */
576
+
577
+ /**
578
+ * Similar to createReactionCollector but in promise form.
579
+ * Resolves with a collection of reactions that pass the specified filter.
580
+ * @param {AwaitReactionsOptions} [options={}] Optional options to pass to the internal collector
581
+ * @returns {Promise<Collection<string | Snowflake, MessageReaction>>}
582
+ * @example
583
+ * // Create a reaction collector
584
+ * const filter = (reaction, user) => reaction.emoji.name === '👌' && user.id === 'someId'
585
+ * message.awaitReactions({ filter, time: 15_000 })
586
+ * .then(collected => console.log(`Collected ${collected.size} reactions`))
587
+ * .catch(console.error);
588
+ */
589
+ awaitReactions(options = {}) {
590
+ return new Promise((resolve, reject) => {
591
+ const collector = this.createReactionCollector(options);
592
+ collector.once('end', (reactions, reason) => {
593
+ if (options.errors?.includes(reason)) reject(reactions);
594
+ else resolve(reactions);
595
+ });
596
+ });
597
+ }
598
+
599
+ /**
600
+ * Whether the message is editable by the client user
601
+ * @type {boolean}
602
+ * @readonly
603
+ */
604
+ get editable() {
605
+ const precheck = Boolean(
606
+ this.author.id === this.client.user.id &&
607
+ !deletedMessages.has(this) &&
608
+ (!this.guild || this.channel?.viewable) &&
609
+ this.reference?.type !== 'FORWARD',
610
+ );
611
+
612
+ // Regardless of permissions thread messages cannot be edited if
613
+ // the thread is archived or the thread is locked and the bot does not have permission to manage threads.
614
+ if (this.channel?.isThread()) {
615
+ if (this.channel.archived) return false;
616
+ if (this.channel.locked) {
617
+ const permissions = this.channel.permissionsFor(this.client.user);
618
+ if (!permissions?.has(Permissions.FLAGS.MANAGE_THREADS, true)) return false;
619
+ }
620
+ }
621
+
622
+ return precheck;
623
+ }
624
+
625
+ /**
626
+ * Whether the message is deletable by the client user
627
+ * @type {boolean}
628
+ * @readonly
629
+ */
630
+ get deletable() {
631
+ if (deletedMessages.has(this)) {
632
+ return false;
633
+ }
634
+ if (!this.guild) {
635
+ return this.author.id === this.client.user.id;
636
+ }
637
+ // DMChannel does not have viewable property, so check viewable after proved that message is on a guild.
638
+ if (!this.channel?.viewable) {
639
+ return false;
640
+ }
641
+
642
+ const permissions = this.channel?.permissionsFor(this.client.user);
643
+ if (!permissions) return false;
644
+ // This flag allows deleting even if timed out
645
+ if (permissions.has(Permissions.FLAGS.ADMINISTRATOR, false)) return true;
646
+
647
+ return Boolean(
648
+ this.author.id === this.client.user.id ||
649
+ (permissions.has(Permissions.FLAGS.MANAGE_MESSAGES, false) &&
650
+ this.guild.members.me.communicationDisabledUntilTimestamp < Date.now()),
651
+ );
652
+ }
653
+
654
+ /**
655
+ * Whether the message is bulk deletable by the client user
656
+ * @type {boolean}
657
+ * @readonly
658
+ * @example
659
+ * // Filter for bulk deletable messages
660
+ * channel.bulkDelete(messages.filter(message => message.bulkDeletable));
661
+ */
662
+ get bulkDeletable() {
663
+ return false;
664
+ }
665
+
666
+ /**
667
+ * Whether the message is pinnable by the client user
668
+ * @type {boolean}
669
+ * @readonly
670
+ */
671
+ get pinnable() {
672
+ const { channel } = this;
673
+ return Boolean(
674
+ !this.system &&
675
+ !deletedMessages.has(this) &&
676
+ (!this.guild ||
677
+ (channel?.viewable &&
678
+ channel?.permissionsFor(this.client.user)?.has(Permissions.FLAGS.MANAGE_MESSAGES, false))),
679
+ );
680
+ }
681
+
682
+ /**
683
+ * Fetches the Message this crosspost/reply/pin-add references, if available to the client
684
+ * @returns {Promise<Message>}
685
+ */
686
+ async fetchReference() {
687
+ if (!this.reference) throw new Error('MESSAGE_REFERENCE_MISSING');
688
+ const { channelId, messageId } = this.reference;
689
+ if (!messageId) throw new Error('MESSAGE_REFERENCE_MISSING');
690
+ const channel = this.client.channels.resolve(channelId);
691
+ if (!channel) throw new Error('GUILD_CHANNEL_RESOLVE');
692
+ const message = await channel.messages.fetch(messageId);
693
+ return message;
694
+ }
695
+
696
+ /**
697
+ * Whether the message is crosspostable by the client user
698
+ * @type {boolean}
699
+ * @readonly
700
+ */
701
+ get crosspostable() {
702
+ const bitfield =
703
+ Permissions.FLAGS.SEND_MESSAGES |
704
+ (this.author.id === this.client.user.id ? Permissions.defaultBit : Permissions.FLAGS.MANAGE_MESSAGES);
705
+ const { channel } = this;
706
+ return Boolean(
707
+ channel?.type === 'GUILD_NEWS' &&
708
+ !this.flags.has(MessageFlags.FLAGS.CROSSPOSTED) &&
709
+ this.reference?.type !== 'FORWARD' &&
710
+ this.type === 'DEFAULT' &&
711
+ !this.poll &&
712
+ channel.viewable &&
713
+ channel.permissionsFor(this.client.user)?.has(bitfield, false) &&
714
+ !deletedMessages.has(this),
715
+ );
716
+ }
717
+
718
+ /**
719
+ * Options that can be passed into {@link Message#edit}.
720
+ * @typedef {Object} MessageEditOptions
721
+ * @property {?string} [content] Content to be edited
722
+ * @property {MessageEmbed[]|APIEmbed[]} [embeds] Embeds to be added/edited
723
+ * @property {MessageMentionOptions} [allowedMentions] Which mentions should be parsed from the message content
724
+ * @property {MessageFlags} [flags] Which flags to set for the message. Only `SUPPRESS_EMBEDS` can be edited.
725
+ * @property {MessageAttachment[]} [attachments] An array of attachments to keep,
726
+ * all attachments will be kept if omitted
727
+ * @property {FileOptions[]|BufferResolvable[]|MessageAttachment[]} [files] Files to add to the message
728
+ * @property {MessageActionRow[]|MessageActionRowOptions[]} [components]
729
+ * Action rows containing interactive components for the message (buttons, select menus)
730
+ */
731
+
732
+ /**
733
+ * Edits the content of the message.
734
+ * @param {string|MessagePayload|MessageEditOptions} options The options to provide
735
+ * @returns {Promise<Message>}
736
+ * @example
737
+ * // Update the content of a message
738
+ * message.edit('This is my new content!')
739
+ * .then(msg => console.log(`Updated the content of a message to ${msg.content}`))
740
+ * .catch(console.error);
741
+ */
742
+ async edit(options) {
743
+ if (!this.channel) throw new Error('CHANNEL_NOT_CACHED');
744
+ return this.channel.messages.edit(this, options);
745
+ }
746
+
747
+ /**
748
+ * Publishes a message in an announcement channel to all channels following it.
749
+ * @returns {Promise<Message>}
750
+ * @example
751
+ * // Crosspost a message
752
+ * if (message.channel.type === 'GUILD_NEWS') {
753
+ * message.crosspost()
754
+ * .then(() => console.log('Crossposted message'))
755
+ * .catch(console.error);
756
+ * }
757
+ */
758
+ async crosspost() {
759
+ if (!this.channel) throw new Error('CHANNEL_NOT_CACHED');
760
+ return this.channel.messages.crosspost(this.id);
761
+ }
762
+
763
+ /**
764
+ * Pins this message to the channel's pinned messages.
765
+ * @param {string} [reason] Reason for pinning
766
+ * @returns {Promise<Message>}
767
+ * @example
768
+ * // Pin a message
769
+ * message.pin()
770
+ * .then(console.log)
771
+ * .catch(console.error)
772
+ */
773
+ async pin(reason) {
774
+ if (!this.channel) throw new Error('CHANNEL_NOT_CACHED');
775
+ await this.channel.messages.pin(this.id, reason);
776
+ return this;
777
+ }
778
+
779
+ /**
780
+ * Unpins this message from the channel's pinned messages.
781
+ * @param {string} [reason] Reason for unpinning
782
+ * @returns {Promise<Message>}
783
+ * @example
784
+ * // Unpin a message
785
+ * message.unpin()
786
+ * .then(console.log)
787
+ * .catch(console.error)
788
+ */
789
+ async unpin(reason) {
790
+ if (!this.channel) throw new Error('CHANNEL_NOT_CACHED');
791
+ await this.channel.messages.unpin(this.id, reason);
792
+ return this;
793
+ }
794
+
795
+ /**
796
+ * Adds a reaction to the message.
797
+ * @param {EmojiIdentifierResolvable} emoji The emoji to react with
798
+ * @param {boolean} [burst=false] Super Reactions
799
+ * @returns {Promise<MessageReaction>}
800
+ * @example
801
+ * // React to a message with a unicode emoji
802
+ * message.react('🤔')
803
+ * .then(console.log)
804
+ * .catch(console.error);
805
+ * @example
806
+ * // React to a message with a custom emoji
807
+ * message.react(message.guild.emojis.cache.get('123456789012345678'))
808
+ * .then(console.log)
809
+ * .catch(console.error);
810
+ */
811
+ async react(emoji, burst = false) {
812
+ if (!this.channel) throw new Error('CHANNEL_NOT_CACHED');
813
+ await this.channel.messages.react(this.id, emoji, burst);
814
+
815
+ return this.client.actions.MessageReactionAdd.handle(
816
+ {
817
+ [this.client.actions.injectedUser]: this.client.user,
818
+ [this.client.actions.injectedChannel]: this.channel,
819
+ [this.client.actions.injectedMessage]: this,
820
+ emoji: Util.resolvePartialEmoji(emoji),
821
+ me_burst: burst,
822
+ },
823
+ true,
824
+ ).reaction;
825
+ }
826
+
827
+ /**
828
+ * Deletes the message.
829
+ * @returns {Promise<Message>}
830
+ * @example
831
+ * // Delete a message
832
+ * message.delete()
833
+ * .then(msg => console.log(`Deleted message from ${msg.author.username}`))
834
+ * .catch(console.error);
835
+ */
836
+ async delete() {
837
+ if (!this.channel) throw new Error('CHANNEL_NOT_CACHED');
838
+ await this.channel.messages.delete(this.id);
839
+ return this;
840
+ }
841
+
842
+ /**
843
+ * Options provided when sending a message as an inline reply.
844
+ * @typedef {BaseMessageOptions} ReplyMessageOptions
845
+ * @property {boolean} [failIfNotExists=true] Whether to error if the referenced message
846
+ * does not exist (creates a standard message in this case when false)
847
+ * @property {StickerResolvable[]} [stickers=[]] Stickers to send in the message
848
+ */
849
+
850
+ /**
851
+ * Send an inline reply to this message.
852
+ * @param {string|MessagePayload|ReplyMessageOptions} options The options to provide
853
+ * @returns {Promise<Message>}
854
+ * @example
855
+ * // Reply to a message
856
+ * message.reply('This is a reply!')
857
+ * .then(() => console.log(`Replied to message "${message.content}"`))
858
+ * .catch(console.error);
859
+ */
860
+ async reply(options) {
861
+ if (!this.channel) throw new Error('CHANNEL_NOT_CACHED');
862
+ let data;
863
+
864
+ if (options instanceof MessagePayload) {
865
+ data = options;
866
+ } else {
867
+ data = MessagePayload.create(this, options, {
868
+ reply: {
869
+ messageReference: this,
870
+ failIfNotExists: options?.failIfNotExists ?? this.client.options.failIfNotExists,
871
+ },
872
+ });
873
+ }
874
+ return this.channel.send(data);
875
+ }
876
+
877
+ /**
878
+ * Forwards this message
879
+ * @param {TextBasedChannelResolvable} channel The channel to forward this message to.
880
+ * @returns {Promise<Message>}
881
+ */
882
+ forward(channel) {
883
+ const resolvedChannel = this.client.channels.resolve(channel);
884
+ if (!resolvedChannel) throw new Error('INVALID_TYPE', 'channel', 'TextBasedChannelResolvable');
885
+ return resolvedChannel.send({
886
+ forward: {
887
+ message: this.id,
888
+ channel: this.channelId,
889
+ guild: this.guildId,
890
+ },
891
+ });
892
+ }
893
+
894
+ /**
895
+ * A number that is allowed to be the duration (in minutes) of inactivity after which a thread is automatically
896
+ * archived. This can be:
897
+ * * `60` (1 hour)
898
+ * * `1440` (1 day)
899
+ * * `4320` (3 days)
900
+ * * `10080` (7 days)
901
+ * * `'MAX'` (7 days)
902
+ * <warn>This option is deprecated and will be removed in the next major version.</warn>
903
+ * @typedef {number|string} ThreadAutoArchiveDuration
904
+ */
905
+
906
+ /**
907
+ * Options for starting a thread on a message.
908
+ * @typedef {Object} StartThreadOptions
909
+ * @property {string} name The name of the new thread
910
+ * @property {ThreadAutoArchiveDuration} [autoArchiveDuration=this.channel.defaultAutoArchiveDuration] The amount of
911
+ * time (in minutes) after which the thread should automatically archive in case of no recent activity
912
+ * @property {string} [reason] Reason for creating the thread
913
+ * @property {number} [rateLimitPerUser] The rate limit per user (slowmode) for the thread in seconds
914
+ */
915
+
916
+ /**
917
+ * Create a new public thread from this message
918
+ * @see GuildTextThreadManager#create
919
+ * @param {StartThreadOptions} [options] Options for starting a thread on this message
920
+ * @returns {Promise<ThreadChannel>}
921
+ */
922
+ async startThread(options = {}) {
923
+ if (!this.channel) throw new Error('CHANNEL_NOT_CACHED');
924
+ if (!['GUILD_TEXT', 'GUILD_NEWS'].includes(this.channel.type)) {
925
+ throw new Error('MESSAGE_THREAD_PARENT');
926
+ }
927
+ if (this.hasThread) throw new Error('MESSAGE_EXISTING_THREAD');
928
+ return this.channel.threads.create({ ...options, startMessage: this });
929
+ }
930
+
931
+ /**
932
+ * Submits a poll vote for the current user. Returns a 204 empty response on success.
933
+ * @param {...number[]} ids ID of the answer
934
+ * @returns {Promise<void>}
935
+ * @example
936
+ * // Vote multi choices
937
+ * message.vote(1,2);
938
+ * // Remove vote
939
+ * message.vote();
940
+ */
941
+ vote(...ids) {
942
+ return this.client.api
943
+ .channels(this.channel.id)
944
+ .polls(this.id)
945
+ .answers['@me'].put({
946
+ data: {
947
+ answer_ids: ids.flat(1).map(value => value.toString()),
948
+ },
949
+ });
950
+ }
951
+
952
+ /**
953
+ * Fetch this message.
954
+ * @param {boolean} [force=true] Whether to skip the cache check and request the API
955
+ * @returns {Promise<Message>}
956
+ */
957
+ async fetch(force = true) {
958
+ if (!this.channel) throw new Error('CHANNEL_NOT_CACHED');
959
+ return this.channel.messages.fetch(this.id, { force });
960
+ }
961
+
962
+ /**
963
+ * Fetches the webhook used to create this message.
964
+ * @returns {Promise<?Webhook>}
965
+ */
966
+ async fetchWebhook() {
967
+ if (!this.webhookId) throw new Error('WEBHOOK_MESSAGE');
968
+ if (this.webhookId === this.applicationId) throw new Error('WEBHOOK_APPLICATION');
969
+ return this.client.fetchWebhook(this.webhookId);
970
+ }
971
+
972
+ /**
973
+ * Suppresses or unsuppresses embeds on a message.
974
+ * @param {boolean} [suppress=true] If the embeds should be suppressed or not
975
+ * @returns {Promise<Message>}
976
+ */
977
+ suppressEmbeds(suppress = true) {
978
+ const flags = new MessageFlags(this.flags.bitfield);
979
+
980
+ if (suppress) {
981
+ flags.add(MessageFlags.FLAGS.SUPPRESS_EMBEDS);
982
+ } else {
983
+ flags.remove(MessageFlags.FLAGS.SUPPRESS_EMBEDS);
984
+ }
985
+
986
+ return this.edit({ flags });
987
+ }
988
+
989
+ /**
990
+ * Removes the attachments from this message.
991
+ * @returns {Promise<Message>}
992
+ */
993
+ removeAttachments() {
994
+ return this.edit({ attachments: [] });
995
+ }
996
+
997
+ /**
998
+ * Resolves a component by a custom id.
999
+ * @param {string} customId The custom id to resolve against
1000
+ * @returns {?MessageActionRowComponent}
1001
+ */
1002
+ resolveComponent(customId) {
1003
+ return (
1004
+ this.components
1005
+ .flatMap(BaseMessageComponent.extractInteractiveComponents)
1006
+ .find(component => (component.customId ?? component.custom_id) === customId) ?? null
1007
+ );
1008
+ }
1009
+
1010
+ /**
1011
+ * Used mainly internally. Whether two messages are identical in properties. If you want to compare messages
1012
+ * without checking all the properties, use `message.id === message2.id`, which is much more efficient. This
1013
+ * method allows you to see if there are differences in content, embeds, attachments, nonce and tts properties.
1014
+ * @param {Message} message The message to compare it to
1015
+ * @param {APIMessage} rawData Raw data passed through the WebSocket about this message
1016
+ * @returns {boolean}
1017
+ */
1018
+ equals(message, rawData) {
1019
+ if (!message) return false;
1020
+ const embedUpdate = !message.author && !message.attachments;
1021
+ if (embedUpdate) return this.id === message.id && this.embeds.length === message.embeds.length;
1022
+
1023
+ let equal =
1024
+ this.id === message.id &&
1025
+ this.author.id === message.author.id &&
1026
+ this.content === message.content &&
1027
+ this.tts === message.tts &&
1028
+ this.nonce === message.nonce &&
1029
+ this.embeds.length === message.embeds.length &&
1030
+ this.attachments.size === message.attachments.size &&
1031
+ this.attachments.every(attachment => message.attachments.has(attachment.id)) &&
1032
+ this.embeds.every((embed, index) => embed.equals(message.embeds[index]));
1033
+
1034
+ if (equal && rawData) {
1035
+ equal =
1036
+ this.mentions.everyone === message.mentions.everyone &&
1037
+ this.createdTimestamp === new Date(rawData.timestamp).getTime() &&
1038
+ this.editedTimestamp === new Date(rawData.edited_timestamp).getTime();
1039
+ }
1040
+
1041
+ return equal;
1042
+ }
1043
+
1044
+ /**
1045
+ * Whether this message is from a guild.
1046
+ * @returns {boolean}
1047
+ */
1048
+ inGuild() {
1049
+ return Boolean(this.guildId);
1050
+ }
1051
+
1052
+ /**
1053
+ * When concatenated with a string, this automatically concatenates the message's content instead of the object.
1054
+ * @returns {string}
1055
+ * @example
1056
+ * // Logs: Message: This is a message!
1057
+ * console.log(`Message: ${message}`);
1058
+ */
1059
+ toString() {
1060
+ return this.content;
1061
+ }
1062
+
1063
+ toJSON() {
1064
+ return super.toJSON({
1065
+ channel: 'channelId',
1066
+ author: 'authorId',
1067
+ groupActivityApplication: 'groupActivityApplicationId',
1068
+ guild: 'guildId',
1069
+ cleanContent: true,
1070
+ member: false,
1071
+ reactions: false,
1072
+ });
1073
+ }
1074
+
1075
+ // TypeScript
1076
+ /**
1077
+ * Check data
1078
+ * @type {boolean}
1079
+ * @readonly
1080
+ */
1081
+ get isMessage() {
1082
+ return true;
1083
+ }
1084
+
1085
+ /**
1086
+ * Click a specified button in the message based on the button's CustomID
1087
+ * @param {string} buttonid customId of the button to click
1088
+ *
1089
+ * To be compatible with Components V2, the following methods have been removed in this version:
1090
+ * - Clicking by coordinates (using ActionRow)
1091
+ * - Clicking the first button in the message
1092
+ *
1093
+ * Currently, only clicking by CustomID is supported.
1094
+ * @returns {Promise<Message|Modal>}
1095
+ */
1096
+ clickButton(buttonid) {
1097
+ const button = this.resolveComponent(buttonid);
1098
+ if (!button || button.type !== 'BUTTON') throw new TypeError('BUTTON_NOT_FOUND');
1099
+ if (button.disabled) throw new TypeError('BUTTON_CANNOT_CLICK');
1100
+ const nonce = SnowflakeUtil.generate();
1101
+ const data = {
1102
+ type: InteractionTypes.MESSAGE_COMPONENT,
1103
+ nonce,
1104
+ guild_id: this.guildId,
1105
+ channel_id: this.channelId,
1106
+ message_id: this.id,
1107
+ application_id: this.applicationId ?? this.author.id,
1108
+ session_id: this.client.sessionId,
1109
+ message_flags: this.flags.bitfield,
1110
+ data: {
1111
+ component_type: MessageComponentTypes.BUTTON,
1112
+ custom_id: button.customId,
1113
+ },
1114
+ };
1115
+ return Util.createPromiseInteraction(this.client, nonce, 5_000, true, this, () =>
1116
+ this.client.api.interactions.post({ data }),
1117
+ );
1118
+ }
1119
+
1120
+ /**
1121
+ * Select specific menu
1122
+ * @param {number|string} menu Target
1123
+ * @param {Array<UserResolvable | RoleResolvable | ChannelResolvable | string>} values Any value
1124
+ * @returns {Promise<Message|Modal>}
1125
+ */
1126
+ selectMenu(menu, values = []) {
1127
+ let selectMenu = menu;
1128
+ if (Number.isInteger(menu) && menu >= 0) {
1129
+ selectMenu = this.components[menu]?.components[0];
1130
+ } else if (typeof menu == 'string') {
1131
+ const flatten = components =>
1132
+ components.flatMap(component => [component, ...flatten(component.components ?? [])]);
1133
+ selectMenu = flatten(this.components).find(
1134
+ b =>
1135
+ ['STRING_SELECT', 'USER_SELECT', 'ROLE_SELECT', 'MENTIONABLE_SELECT', 'CHANNEL_SELECT'].includes(b.type) &&
1136
+ b.customId == menu &&
1137
+ !b.disabled,
1138
+ );
1139
+ }
1140
+ if (
1141
+ !selectMenu ||
1142
+ !['STRING_SELECT', 'USER_SELECT', 'ROLE_SELECT', 'MENTIONABLE_SELECT', 'CHANNEL_SELECT'].includes(
1143
+ selectMenu.type,
1144
+ ) ||
1145
+ selectMenu.disabled
1146
+ ) {
1147
+ throw new TypeError('INVALID_TYPE', 'menu', 'select menu');
1148
+ }
1149
+ if (values.length < selectMenu.minValues) {
1150
+ throw new RangeError(`[SELECT_MENU_MIN_VALUES] The minimum number of values is ${selectMenu.minValues}`);
1151
+ }
1152
+ if (values.length > selectMenu?.maxValues) {
1153
+ throw new RangeError(`[SELECT_MENU_MAX_VALUES] The maximum number of values is ${selectMenu.maxValues}`);
1154
+ }
1155
+ values = values.map(value => {
1156
+ switch (selectMenu.type) {
1157
+ case 'STRING_SELECT': {
1158
+ const option = selectMenu.options.find(obj => obj.value === value || obj.label === value);
1159
+ if (!option) throw new TypeError('INVALID_TYPE', 'value', 'select menu option');
1160
+ return option.value;
1161
+ }
1162
+ case 'USER_SELECT': {
1163
+ return this.client.users.resolveId(value);
1164
+ }
1165
+ case 'ROLE_SELECT': {
1166
+ return this.guild.roles.resolveId(value);
1167
+ }
1168
+ case 'MENTIONABLE_SELECT': {
1169
+ return this.client.users.resolveId(value) || this.guild.roles.resolveId(value);
1170
+ }
1171
+ case 'CHANNEL_SELECT': {
1172
+ return this.client.channels.resolveId(value);
1173
+ }
1174
+ default: {
1175
+ return value;
1176
+ }
1177
+ }
1178
+ });
1179
+ const nonce = SnowflakeUtil.generate();
1180
+ const data = {
1181
+ type: InteractionTypes.MESSAGE_COMPONENT,
1182
+ guild_id: this.guildId,
1183
+ channel_id: this.channelId,
1184
+ message_id: this.id,
1185
+ application_id: this.applicationId ?? this.author.id,
1186
+ session_id: this.client.sessionId,
1187
+ message_flags: this.flags.bitfield,
1188
+ data: {
1189
+ component_type: MessageComponentTypes[selectMenu.type],
1190
+ custom_id: selectMenu.customId,
1191
+ type: MessageComponentTypes[selectMenu.type],
1192
+ values,
1193
+ },
1194
+ nonce,
1195
+ };
1196
+ return Util.createPromiseInteraction(this.client, nonce, 5_000, true, this, () =>
1197
+ this.client.api.interactions.post({ data }),
1198
+ );
1199
+ }
1200
+
1201
+ /**
1202
+ * Marks the message as unread.
1203
+ * @returns {Promise<void>}
1204
+ */
1205
+ markUnread() {
1206
+ return this.client.api.channels[this.channelId].messages[this.id].ack.post({
1207
+ data: {
1208
+ manual: true,
1209
+ mention_count: 1,
1210
+ },
1211
+ });
1212
+ }
1213
+
1214
+ /**
1215
+ * Marks the message as read.
1216
+ * @returns {Promise<void>}
1217
+ */
1218
+ markRead() {
1219
+ return this.client.api.channels[this.channelId].messages[this.id].ack.post({
1220
+ data: {
1221
+ token: null,
1222
+ },
1223
+ });
1224
+ }
1225
+
1226
+ /**
1227
+ * Report Message
1228
+ * @param {Arrray<number>} breadcrumbs Options for reporting
1229
+ * @param {Object} [elements={}] Metadata
1230
+ * @returns {Promise<{ report_id: Snowflake }>}
1231
+ * @example
1232
+ * // GET https://discord.com/api/v9/reporting/menu/message?variant=4
1233
+ * // Report Category
1234
+ * // - <hidden>MESSAGE_WELCOME (3)</hidden>
1235
+ * // - Something else (28)
1236
+ * // - Hacks, cheats, phishing or malicious links (72)
1237
+ * message.report([3, 28, 72]).then(console.log);
1238
+ * // { "report_id": "1199663489988440124" }
1239
+ */
1240
+ report(breadcrumbs, elements = {}) {
1241
+ return this.client.api.reporting.message.post({
1242
+ data: {
1243
+ version: '1.0',
1244
+ variant: '4',
1245
+ language: 'en',
1246
+ breadcrumbs,
1247
+ elements,
1248
+ channel_id: this.channelId,
1249
+ message_id: this.id,
1250
+ name: 'message',
1251
+ },
1252
+ });
1253
+ }
1254
+ }
1255
+
1256
+ exports.Message = Message;
1257
+ exports.deletedMessages = deletedMessages;