djs-selfbot-v13 3.2.2 → 3.7.1

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 (363) hide show
  1. package/README.md +37 -36
  2. package/package.json +89 -85
  3. package/src/WebSocket.js +39 -39
  4. package/src/client/BaseClient.js +86 -86
  5. package/src/client/Client.js +934 -836
  6. package/src/client/WebhookClient.js +61 -61
  7. package/src/client/actions/Action.js +116 -120
  8. package/src/client/actions/ActionsManager.js +80 -78
  9. package/src/client/actions/ApplicationCommandPermissionsUpdate.js +34 -34
  10. package/src/client/actions/AutoModerationActionExecution.js +27 -27
  11. package/src/client/actions/AutoModerationRuleCreate.js +28 -28
  12. package/src/client/actions/AutoModerationRuleDelete.js +32 -32
  13. package/src/client/actions/AutoModerationRuleUpdate.js +30 -30
  14. package/src/client/actions/ChannelCreate.js +23 -23
  15. package/src/client/actions/ChannelDelete.js +39 -39
  16. package/src/client/actions/ChannelUpdate.js +43 -43
  17. package/src/client/actions/GuildAuditLogEntryCreate.js +29 -29
  18. package/src/client/actions/GuildBanAdd.js +20 -20
  19. package/src/client/actions/GuildBanRemove.js +25 -25
  20. package/src/client/actions/GuildChannelsPositionUpdate.js +21 -21
  21. package/src/client/actions/GuildDelete.js +65 -65
  22. package/src/client/actions/GuildEmojiCreate.js +20 -20
  23. package/src/client/actions/GuildEmojiDelete.js +21 -21
  24. package/src/client/actions/GuildEmojiUpdate.js +20 -20
  25. package/src/client/actions/GuildEmojisUpdate.js +34 -34
  26. package/src/client/actions/GuildIntegrationsUpdate.js +19 -19
  27. package/src/client/actions/GuildMemberRemove.js +33 -32
  28. package/src/client/actions/GuildMemberUpdate.js +44 -43
  29. package/src/client/actions/GuildRoleCreate.js +25 -25
  30. package/src/client/actions/GuildRoleDelete.js +31 -31
  31. package/src/client/actions/GuildRoleUpdate.js +39 -39
  32. package/src/client/actions/GuildRolesPositionUpdate.js +21 -21
  33. package/src/client/actions/GuildScheduledEventCreate.js +27 -27
  34. package/src/client/actions/GuildScheduledEventDelete.js +31 -31
  35. package/src/client/actions/GuildScheduledEventUpdate.js +30 -30
  36. package/src/client/actions/GuildScheduledEventUserAdd.js +32 -32
  37. package/src/client/actions/GuildScheduledEventUserRemove.js +32 -32
  38. package/src/client/actions/GuildStickerCreate.js +20 -20
  39. package/src/client/actions/GuildStickerDelete.js +21 -21
  40. package/src/client/actions/GuildStickerUpdate.js +20 -20
  41. package/src/client/actions/GuildStickersUpdate.js +34 -34
  42. package/src/client/actions/GuildUpdate.js +33 -33
  43. package/src/client/actions/InviteCreate.js +28 -28
  44. package/src/client/actions/InviteDelete.js +30 -30
  45. package/src/client/actions/MessageCreate.js +50 -46
  46. package/src/client/actions/MessageDelete.js +32 -32
  47. package/src/client/actions/MessageDeleteBulk.js +46 -46
  48. package/src/client/actions/MessagePollVoteAdd.js +33 -0
  49. package/src/client/actions/MessagePollVoteRemove.js +33 -0
  50. package/src/client/actions/MessageReactionAdd.js +68 -56
  51. package/src/client/actions/MessageReactionRemove.js +50 -45
  52. package/src/client/actions/MessageReactionRemoveAll.js +33 -33
  53. package/src/client/actions/MessageReactionRemoveEmoji.js +28 -28
  54. package/src/client/actions/MessageUpdate.js +26 -26
  55. package/src/client/actions/PresenceUpdate.js +50 -46
  56. package/src/client/actions/StageInstanceCreate.js +28 -28
  57. package/src/client/actions/StageInstanceDelete.js +33 -33
  58. package/src/client/actions/StageInstanceUpdate.js +30 -30
  59. package/src/client/actions/ThreadCreate.js +24 -24
  60. package/src/client/actions/ThreadDelete.js +32 -32
  61. package/src/client/actions/ThreadListSync.js +59 -59
  62. package/src/client/actions/ThreadMemberUpdate.js +30 -30
  63. package/src/client/actions/ThreadMembersUpdate.js +34 -34
  64. package/src/client/actions/TypingStart.js +29 -29
  65. package/src/client/actions/UserUpdate.js +35 -35
  66. package/src/client/actions/VoiceStateUpdate.js +50 -57
  67. package/src/client/actions/WebhooksUpdate.js +20 -20
  68. package/src/client/voice/ClientVoiceManager.js +151 -51
  69. package/src/client/voice/VoiceConnection.js +1249 -0
  70. package/src/client/voice/dispatcher/AnnexBDispatcher.js +120 -0
  71. package/src/client/voice/dispatcher/AudioDispatcher.js +145 -0
  72. package/src/client/voice/dispatcher/BaseDispatcher.js +459 -0
  73. package/src/client/voice/dispatcher/VPxDispatcher.js +54 -0
  74. package/src/client/voice/dispatcher/VideoDispatcher.js +68 -0
  75. package/src/client/voice/networking/VoiceUDPClient.js +173 -0
  76. package/src/client/voice/networking/VoiceWebSocket.js +286 -0
  77. package/src/client/voice/player/MediaPlayer.js +321 -0
  78. package/src/client/voice/player/processing/AnnexBNalSplitter.js +244 -0
  79. package/src/client/voice/player/processing/IvfSplitter.js +106 -0
  80. package/src/client/voice/player/processing/PCMInsertSilence.js +37 -0
  81. package/src/client/voice/receiver/PacketHandler.js +260 -0
  82. package/src/client/voice/receiver/Receiver.js +96 -0
  83. package/src/client/voice/receiver/Recorder.js +173 -0
  84. package/src/client/voice/util/Function.js +116 -0
  85. package/src/client/voice/util/PlayInterface.js +122 -0
  86. package/src/client/voice/util/Secretbox.js +64 -0
  87. package/src/client/voice/util/Silence.js +16 -0
  88. package/src/client/voice/util/Socket.js +62 -0
  89. package/src/client/voice/util/VolumeInterface.js +104 -0
  90. package/src/client/websocket/WebSocketManager.js +392 -392
  91. package/src/client/websocket/WebSocketShard.js +907 -906
  92. package/src/client/websocket/handlers/APPLICATION_COMMAND_CREATE.js +18 -18
  93. package/src/client/websocket/handlers/APPLICATION_COMMAND_DELETE.js +20 -20
  94. package/src/client/websocket/handlers/APPLICATION_COMMAND_PERMISSIONS_UPDATE.js +5 -5
  95. package/src/client/websocket/handlers/APPLICATION_COMMAND_UPDATE.js +20 -20
  96. package/src/client/websocket/handlers/AUTO_MODERATION_ACTION_EXECUTION.js +5 -5
  97. package/src/client/websocket/handlers/AUTO_MODERATION_RULE_CREATE.js +5 -5
  98. package/src/client/websocket/handlers/AUTO_MODERATION_RULE_DELETE.js +5 -5
  99. package/src/client/websocket/handlers/AUTO_MODERATION_RULE_UPDATE.js +5 -5
  100. package/src/client/websocket/handlers/CALL_CREATE.js +14 -14
  101. package/src/client/websocket/handlers/CALL_DELETE.js +11 -11
  102. package/src/client/websocket/handlers/CALL_UPDATE.js +11 -11
  103. package/src/client/websocket/handlers/CHANNEL_CREATE.js +5 -5
  104. package/src/client/websocket/handlers/CHANNEL_DELETE.js +5 -5
  105. package/src/client/websocket/handlers/CHANNEL_PINS_UPDATE.js +22 -22
  106. package/src/client/websocket/handlers/CHANNEL_RECIPIENT_ADD.js +19 -19
  107. package/src/client/websocket/handlers/CHANNEL_RECIPIENT_REMOVE.js +16 -16
  108. package/src/client/websocket/handlers/CHANNEL_UPDATE.js +16 -16
  109. package/src/client/websocket/handlers/GUILD_AUDIT_LOG_ENTRY_CREATE.js +5 -5
  110. package/src/client/websocket/handlers/GUILD_BAN_ADD.js +5 -5
  111. package/src/client/websocket/handlers/GUILD_BAN_REMOVE.js +5 -5
  112. package/src/client/websocket/handlers/GUILD_CREATE.js +52 -52
  113. package/src/client/websocket/handlers/GUILD_DELETE.js +5 -5
  114. package/src/client/websocket/handlers/GUILD_EMOJIS_UPDATE.js +5 -5
  115. package/src/client/websocket/handlers/GUILD_INTEGRATIONS_UPDATE.js +5 -5
  116. package/src/client/websocket/handlers/GUILD_MEMBERS_CHUNK.js +39 -39
  117. package/src/client/websocket/handlers/GUILD_MEMBER_ADD.js +20 -19
  118. package/src/client/websocket/handlers/GUILD_MEMBER_REMOVE.js +5 -5
  119. package/src/client/websocket/handlers/GUILD_MEMBER_UPDATE.js +5 -5
  120. package/src/client/websocket/handlers/GUILD_ROLE_CREATE.js +5 -5
  121. package/src/client/websocket/handlers/GUILD_ROLE_DELETE.js +5 -5
  122. package/src/client/websocket/handlers/GUILD_ROLE_UPDATE.js +5 -5
  123. package/src/client/websocket/handlers/GUILD_SCHEDULED_EVENT_CREATE.js +5 -5
  124. package/src/client/websocket/handlers/GUILD_SCHEDULED_EVENT_DELETE.js +5 -5
  125. package/src/client/websocket/handlers/GUILD_SCHEDULED_EVENT_UPDATE.js +5 -5
  126. package/src/client/websocket/handlers/GUILD_SCHEDULED_EVENT_USER_ADD.js +5 -5
  127. package/src/client/websocket/handlers/GUILD_SCHEDULED_EVENT_USER_REMOVE.js +5 -5
  128. package/src/client/websocket/handlers/GUILD_STICKERS_UPDATE.js +5 -5
  129. package/src/client/websocket/handlers/GUILD_UPDATE.js +5 -5
  130. package/src/client/websocket/handlers/INTERACTION_MODAL_CREATE.js +12 -12
  131. package/src/client/websocket/handlers/INVITE_CREATE.js +5 -5
  132. package/src/client/websocket/handlers/INVITE_DELETE.js +5 -5
  133. package/src/client/websocket/handlers/MESSAGE_CREATE.js +5 -5
  134. package/src/client/websocket/handlers/MESSAGE_DELETE.js +5 -5
  135. package/src/client/websocket/handlers/MESSAGE_DELETE_BULK.js +5 -5
  136. package/src/client/websocket/handlers/MESSAGE_POLL_VOTE_ADD.js +5 -22
  137. package/src/client/websocket/handlers/MESSAGE_POLL_VOTE_REMOVE.js +5 -12
  138. package/src/client/websocket/handlers/MESSAGE_REACTION_ADD.js +5 -5
  139. package/src/client/websocket/handlers/MESSAGE_REACTION_REMOVE.js +5 -5
  140. package/src/client/websocket/handlers/MESSAGE_REACTION_REMOVE_ALL.js +5 -5
  141. package/src/client/websocket/handlers/MESSAGE_REACTION_REMOVE_EMOJI.js +5 -5
  142. package/src/client/websocket/handlers/MESSAGE_UPDATE.js +16 -16
  143. package/src/client/websocket/handlers/PRESENCE_UPDATE.js +5 -5
  144. package/src/client/websocket/handlers/READY.js +121 -120
  145. package/src/client/websocket/handlers/RELATIONSHIP_ADD.js +19 -19
  146. package/src/client/websocket/handlers/RELATIONSHIP_REMOVE.js +17 -17
  147. package/src/client/websocket/handlers/RELATIONSHIP_UPDATE.js +41 -41
  148. package/src/client/websocket/handlers/RESUMED.js +14 -14
  149. package/src/client/websocket/handlers/STAGE_INSTANCE_CREATE.js +5 -5
  150. package/src/client/websocket/handlers/STAGE_INSTANCE_DELETE.js +5 -5
  151. package/src/client/websocket/handlers/STAGE_INSTANCE_UPDATE.js +5 -5
  152. package/src/client/websocket/handlers/THREAD_CREATE.js +5 -5
  153. package/src/client/websocket/handlers/THREAD_DELETE.js +5 -5
  154. package/src/client/websocket/handlers/THREAD_LIST_SYNC.js +5 -5
  155. package/src/client/websocket/handlers/THREAD_MEMBERS_UPDATE.js +5 -5
  156. package/src/client/websocket/handlers/THREAD_MEMBER_UPDATE.js +5 -5
  157. package/src/client/websocket/handlers/THREAD_UPDATE.js +16 -16
  158. package/src/client/websocket/handlers/TYPING_START.js +5 -5
  159. package/src/client/websocket/handlers/USER_GUILD_SETTINGS_UPDATE.js +6 -6
  160. package/src/client/websocket/handlers/USER_NOTE_UPDATE.js +5 -5
  161. package/src/client/websocket/handlers/USER_REQUIRED_ACTION_UPDATE.js +78 -78
  162. package/src/client/websocket/handlers/USER_SETTINGS_UPDATE.js +5 -5
  163. package/src/client/websocket/handlers/USER_UPDATE.js +5 -5
  164. package/src/client/websocket/handlers/VOICE_CHANNEL_EFFECT_SEND.js +16 -0
  165. package/src/client/websocket/handlers/VOICE_CHANNEL_STATUS_UPDATE.js +12 -12
  166. package/src/client/websocket/handlers/VOICE_SERVER_UPDATE.js +6 -6
  167. package/src/client/websocket/handlers/VOICE_STATE_UPDATE.js +5 -5
  168. package/src/client/websocket/handlers/WEBHOOKS_UPDATE.js +5 -5
  169. package/src/client/websocket/handlers/index.js +84 -83
  170. package/src/errors/DJSError.js +61 -61
  171. package/src/errors/Messages.js +217 -183
  172. package/src/errors/index.js +4 -4
  173. package/src/index.js +172 -159
  174. package/src/managers/ApplicationCommandManager.js +264 -264
  175. package/src/managers/ApplicationCommandPermissionsManager.js +417 -417
  176. package/src/managers/AutoModerationRuleManager.js +296 -296
  177. package/src/managers/BaseGuildEmojiManager.js +80 -80
  178. package/src/managers/BaseManager.js +19 -19
  179. package/src/managers/BillingManager.js +66 -66
  180. package/src/managers/CachedManager.js +71 -71
  181. package/src/managers/ChannelManager.js +148 -138
  182. package/src/managers/ClientUserSettingManager.js +372 -372
  183. package/src/managers/DataManager.js +61 -61
  184. package/src/managers/GuildBanManager.js +250 -250
  185. package/src/managers/GuildChannelManager.js +488 -488
  186. package/src/managers/GuildEmojiManager.js +171 -171
  187. package/src/managers/GuildEmojiRoleManager.js +118 -118
  188. package/src/managers/GuildForumThreadManager.js +108 -108
  189. package/src/managers/GuildInviteManager.js +213 -213
  190. package/src/managers/GuildManager.js +338 -304
  191. package/src/managers/GuildMemberManager.js +599 -597
  192. package/src/managers/GuildMemberRoleManager.js +195 -191
  193. package/src/managers/GuildScheduledEventManager.js +314 -296
  194. package/src/managers/GuildSettingManager.js +155 -155
  195. package/src/managers/GuildStickerManager.js +179 -179
  196. package/src/managers/GuildTextThreadManager.js +98 -98
  197. package/src/managers/InteractionManager.js +39 -39
  198. package/src/managers/MessageManager.js +423 -391
  199. package/src/managers/PermissionOverwriteManager.js +164 -166
  200. package/src/managers/PresenceManager.js +71 -58
  201. package/src/managers/ReactionManager.js +67 -67
  202. package/src/managers/ReactionUserManager.js +73 -71
  203. package/src/managers/RelationshipManager.js +278 -265
  204. package/src/managers/RoleManager.js +448 -352
  205. package/src/managers/SessionManager.js +66 -0
  206. package/src/managers/StageInstanceManager.js +162 -162
  207. package/src/managers/ThreadManager.js +175 -174
  208. package/src/managers/ThreadMemberManager.js +186 -186
  209. package/src/managers/UserManager.js +136 -146
  210. package/src/managers/UserNoteManager.js +53 -53
  211. package/src/managers/VoiceStateManager.js +59 -37
  212. package/src/rest/APIRequest.js +154 -160
  213. package/src/rest/APIRouter.js +53 -53
  214. package/src/rest/DiscordAPIError.js +119 -104
  215. package/src/rest/HTTPError.js +62 -62
  216. package/src/rest/RESTManager.js +67 -62
  217. package/src/rest/RateLimitError.js +55 -55
  218. package/src/rest/RequestHandler.js +466 -444
  219. package/src/sharding/Shard.js +444 -443
  220. package/src/sharding/ShardClientUtil.js +279 -275
  221. package/src/sharding/ShardingManager.js +319 -318
  222. package/src/structures/AnonymousGuild.js +98 -98
  223. package/src/structures/ApplicationCommand.js +593 -593
  224. package/src/structures/ApplicationRoleConnectionMetadata.js +48 -48
  225. package/src/structures/AutoModerationActionExecution.js +89 -89
  226. package/src/structures/AutoModerationRule.js +294 -294
  227. package/src/structures/AutocompleteInteraction.js +107 -107
  228. package/src/structures/Base.js +43 -43
  229. package/src/structures/BaseCommandInteraction.js +211 -211
  230. package/src/structures/BaseGuild.js +116 -116
  231. package/src/structures/BaseGuildEmoji.js +56 -56
  232. package/src/structures/BaseGuildTextChannel.js +191 -191
  233. package/src/structures/BaseGuildVoiceChannel.js +241 -241
  234. package/src/structures/BaseMessageComponent.js +181 -114
  235. package/src/structures/ButtonInteraction.js +11 -11
  236. package/src/structures/CallState.js +63 -63
  237. package/src/structures/CategoryChannel.js +85 -85
  238. package/src/structures/Channel.js +284 -270
  239. package/src/structures/ClientPresence.js +77 -85
  240. package/src/structures/ClientUser.js +479 -448
  241. package/src/structures/CommandInteraction.js +41 -41
  242. package/src/structures/CommandInteractionOptionResolver.js +276 -276
  243. package/src/structures/ContainerComponent.js +68 -0
  244. package/src/structures/ContextMenuInteraction.js +65 -65
  245. package/src/structures/DMChannel.js +219 -217
  246. package/src/structures/DirectoryChannel.js +20 -20
  247. package/src/structures/Emoji.js +148 -148
  248. package/src/structures/FileComponent.js +49 -0
  249. package/src/structures/ForumChannel.js +31 -261
  250. package/src/structures/GroupDMChannel.js +394 -387
  251. package/src/structures/Guild.js +1643 -1608
  252. package/src/structures/GuildAuditLogs.js +746 -729
  253. package/src/structures/GuildBan.js +59 -59
  254. package/src/structures/GuildBoost.js +108 -108
  255. package/src/structures/GuildChannel.js +470 -468
  256. package/src/structures/GuildEmoji.js +161 -161
  257. package/src/structures/GuildMember.js +636 -568
  258. package/src/structures/GuildPreview.js +191 -191
  259. package/src/structures/GuildPreviewEmoji.js +27 -27
  260. package/src/structures/GuildScheduledEvent.js +536 -441
  261. package/src/structures/GuildTemplate.js +236 -236
  262. package/src/structures/Integration.js +188 -188
  263. package/src/structures/IntegrationApplication.js +96 -96
  264. package/src/structures/Interaction.js +290 -290
  265. package/src/structures/InteractionCollector.js +248 -248
  266. package/src/structures/InteractionWebhook.js +43 -43
  267. package/src/structures/Invite.js +358 -358
  268. package/src/structures/InviteGuild.js +23 -23
  269. package/src/structures/InviteStageInstance.js +86 -86
  270. package/src/structures/MediaChannel.js +11 -0
  271. package/src/structures/MediaGalleryComponent.js +41 -0
  272. package/src/structures/MediaGalleryItem.js +47 -0
  273. package/src/structures/Message.js +1252 -1227
  274. package/src/structures/MessageActionRow.js +105 -103
  275. package/src/structures/MessageAttachment.js +216 -204
  276. package/src/structures/MessageButton.js +166 -165
  277. package/src/structures/MessageCollector.js +146 -146
  278. package/src/structures/MessageComponentInteraction.js +120 -120
  279. package/src/structures/MessageContextMenuInteraction.js +20 -20
  280. package/src/structures/MessageEmbed.js +596 -586
  281. package/src/structures/MessageMentions.js +273 -273
  282. package/src/structures/MessagePayload.js +354 -318
  283. package/src/structures/MessageReaction.js +181 -171
  284. package/src/structures/MessageSelectMenu.js +141 -140
  285. package/src/structures/Modal.js +161 -161
  286. package/src/structures/ModalSubmitFieldsResolver.js +53 -53
  287. package/src/structures/ModalSubmitInteraction.js +119 -119
  288. package/src/structures/NewsChannel.js +32 -32
  289. package/src/structures/OAuth2Guild.js +28 -28
  290. package/src/structures/PermissionOverwrites.js +198 -196
  291. package/src/structures/Poll.js +108 -0
  292. package/src/structures/PollAnswer.js +88 -0
  293. package/src/structures/Presence.js +1105 -1101
  294. package/src/structures/ReactionCollector.js +229 -229
  295. package/src/structures/ReactionEmoji.js +31 -31
  296. package/src/structures/Role.js +590 -531
  297. package/src/structures/SectionComponent.js +48 -0
  298. package/src/structures/SelectMenuInteraction.js +21 -21
  299. package/src/structures/SeparatorComponent.js +48 -0
  300. package/src/structures/Session.js +81 -0
  301. package/src/structures/StageChannel.js +104 -104
  302. package/src/structures/StageInstance.js +208 -208
  303. package/src/structures/Sticker.js +310 -310
  304. package/src/structures/StickerPack.js +95 -95
  305. package/src/structures/StoreChannel.js +56 -56
  306. package/src/structures/Team.js +118 -118
  307. package/src/structures/TeamMember.js +80 -71
  308. package/src/structures/TextChannel.js +33 -33
  309. package/src/structures/TextDisplayComponent.js +40 -0
  310. package/src/structures/TextInputComponent.js +132 -131
  311. package/src/structures/ThreadChannel.js +605 -607
  312. package/src/structures/ThreadMember.js +105 -105
  313. package/src/structures/ThreadOnlyChannel.js +249 -0
  314. package/src/structures/ThumbnailComponent.js +57 -0
  315. package/src/structures/Typing.js +74 -74
  316. package/src/structures/UnfurledMediaItem.js +29 -0
  317. package/src/structures/User.js +640 -543
  318. package/src/structures/UserContextMenuInteraction.js +29 -29
  319. package/src/structures/VoiceChannel.js +110 -110
  320. package/src/structures/VoiceChannelEffect.js +69 -0
  321. package/src/structures/VoiceRegion.js +53 -53
  322. package/src/structures/VoiceState.js +354 -341
  323. package/src/structures/WebEmbed.js +373 -373
  324. package/src/structures/Webhook.js +478 -467
  325. package/src/structures/WelcomeChannel.js +60 -60
  326. package/src/structures/WelcomeScreen.js +48 -48
  327. package/src/structures/Widget.js +87 -87
  328. package/src/structures/WidgetMember.js +99 -99
  329. package/src/structures/interfaces/Application.js +825 -313
  330. package/src/structures/interfaces/Collector.js +300 -300
  331. package/src/structures/interfaces/InteractionResponses.js +313 -313
  332. package/src/structures/interfaces/TextBasedChannel.js +759 -719
  333. package/src/util/APITypes.js +59 -0
  334. package/src/util/ActivityFlags.js +44 -44
  335. package/src/util/ApplicationFlags.js +76 -76
  336. package/src/util/AttachmentFlags.js +38 -38
  337. package/src/util/BitField.js +170 -170
  338. package/src/util/ChannelFlags.js +45 -45
  339. package/src/util/Constants.js +1914 -1773
  340. package/src/util/DataResolver.js +146 -145
  341. package/src/util/Formatters.js +228 -228
  342. package/src/util/GuildMemberFlags.js +43 -43
  343. package/src/util/Intents.js +74 -74
  344. package/src/util/InviteFlags.js +34 -29
  345. package/src/util/LimitedCollection.js +131 -131
  346. package/src/util/MessageFlags.js +63 -54
  347. package/src/util/Options.js +358 -336
  348. package/src/util/Permissions.js +202 -202
  349. package/src/util/PremiumUsageFlags.js +31 -31
  350. package/src/util/PurchasedFlags.js +33 -33
  351. package/src/util/RemoteAuth.js +382 -379
  352. package/src/util/RoleFlags.js +37 -37
  353. package/src/util/SnowflakeUtil.js +92 -92
  354. package/src/util/Speaking.js +33 -0
  355. package/src/util/Sweepers.js +466 -466
  356. package/src/util/SystemChannelFlags.js +55 -55
  357. package/src/util/ThreadMemberFlags.js +30 -30
  358. package/src/util/UserFlags.js +104 -104
  359. package/src/util/Util.js +1048 -889
  360. package/typings/enums.d.ts +439 -297
  361. package/typings/index.d.ts +8247 -7432
  362. package/typings/rawDataTypes.d.ts +403 -342
  363. package/src/structures/MessagePoll.js +0 -238
@@ -1,467 +1,478 @@
1
- 'use strict';
2
-
3
- const process = require('node:process');
4
- const MessagePayload = require('./MessagePayload');
5
- const { Error } = require('../errors');
6
- const { WebhookTypes } = require('../util/Constants');
7
- const DataResolver = require('../util/DataResolver');
8
- const SnowflakeUtil = require('../util/SnowflakeUtil');
9
-
10
- let deprecationEmittedForFetchMessage = false;
11
-
12
- /**
13
- * Represents a webhook.
14
- */
15
- class Webhook {
16
- constructor(client, data) {
17
- /**
18
- * The client that instantiated the webhook
19
- * @name Webhook#client
20
- * @type {Client}
21
- * @readonly
22
- */
23
- Object.defineProperty(this, 'client', { value: client });
24
- if (data) this._patch(data);
25
- }
26
-
27
- _patch(data) {
28
- if ('name' in data) {
29
- /**
30
- * The name of the webhook
31
- * @type {string}
32
- */
33
- this.name = data.name;
34
- }
35
-
36
- /**
37
- * The token for the webhook, unavailable for follower webhooks and webhooks owned by another application.
38
- * @name Webhook#token
39
- * @type {?string}
40
- */
41
- Object.defineProperty(this, 'token', { value: data.token ?? null, writable: true, configurable: true });
42
-
43
- if ('avatar' in data) {
44
- /**
45
- * The avatar for the webhook
46
- * @type {?string}
47
- */
48
- this.avatar = data.avatar;
49
- }
50
-
51
- /**
52
- * The webhook's id
53
- * @type {Snowflake}
54
- */
55
- this.id = data.id;
56
-
57
- if ('type' in data) {
58
- /**
59
- * The type of the webhook
60
- * @type {WebhookType}
61
- */
62
- this.type = WebhookTypes[data.type];
63
- }
64
-
65
- if ('guild_id' in data) {
66
- /**
67
- * The guild the webhook belongs to
68
- * @type {Snowflake}
69
- */
70
- this.guildId = data.guild_id;
71
- }
72
-
73
- if ('channel_id' in data) {
74
- /**
75
- * The id of the channel the webhook belongs to
76
- * @type {Snowflake}
77
- */
78
- this.channelId = data.channel_id;
79
- }
80
-
81
- if ('user' in data) {
82
- /**
83
- * The owner of the webhook
84
- * @type {?(User|APIUser)}
85
- */
86
- this.owner = this.client.users?._add(data.user) ?? data.user;
87
- } else {
88
- this.owner ??= null;
89
- }
90
-
91
- if ('source_guild' in data) {
92
- /**
93
- * The source guild of the webhook
94
- * @type {?(Guild|APIGuild)}
95
- */
96
- this.sourceGuild = this.client.guilds?.resolve(data.source_guild.id) ?? data.source_guild;
97
- } else {
98
- this.sourceGuild ??= null;
99
- }
100
-
101
- if ('source_channel' in data) {
102
- /**
103
- * The source channel of the webhook
104
- * @type {?(NewsChannel|APIChannel)}
105
- */
106
- this.sourceChannel = this.client.channels?.resolve(data.source_channel?.id) ?? data.source_channel;
107
- } else {
108
- this.sourceChannel ??= null;
109
- }
110
- }
111
-
112
- /**
113
- * Options that can be passed into send.
114
- * @typedef {BaseMessageOptions} WebhookMessageOptions
115
- * @property {string} [username=this.name] Username override for the message
116
- * @property {string} [avatarURL] Avatar URL override for the message
117
- * @property {Snowflake} [threadId] The id of the thread in the channel to send to.
118
- * <info>For interaction webhooks, this property is ignored</info>
119
- * @property {string} [threadName] Name of the thread to create (only available if webhook is in a forum channel)
120
- * @property {MessageFlags} [flags] Which flags to set for the message. Only `SUPPRESS_EMBEDS` can be set.
121
- */
122
-
123
- /**
124
- * Options that can be passed into editMessage.
125
- * @typedef {Object} WebhookEditMessageOptions
126
- * @property {MessageEmbed[]|APIEmbed[]} [embeds] See {@link WebhookMessageOptions#embeds}
127
- * @property {string} [content] See {@link BaseMessageOptions#content}
128
- * @property {FileOptions[]|BufferResolvable[]|MessageAttachment[]} [files] See {@link BaseMessageOptions#files}
129
- * @property {MessageMentionOptions} [allowedMentions] See {@link BaseMessageOptions#allowedMentions}
130
- * @property {MessageAttachment[]} [attachments] Attachments to send with the message
131
- * @property {MessageActionRow[]|MessageActionRowOptions[]} [components]
132
- * Action rows containing interactive components for the message (buttons, select menus)
133
- * @property {Snowflake} [threadId] The id of the thread this message belongs to
134
- * <info>For interaction webhooks, this property is ignored</info>
135
- */
136
-
137
- /**
138
- * Sends a message with this webhook.
139
- * @param {string|MessagePayload|WebhookMessageOptions} options The options to provide
140
- * @returns {Promise<Message|APIMessage>}
141
- * @example
142
- * // Send a basic message
143
- * webhook.send('hello!')
144
- * .then(message => console.log(`Sent message: ${message.content}`))
145
- * .catch(console.error);
146
- * @example
147
- * // Send a basic message in a thread
148
- * webhook.send({ content: 'hello!', threadId: '836856309672348295' })
149
- * .then(message => console.log(`Sent message: ${message.content}`))
150
- * .catch(console.error);
151
- * @example
152
- * // Send a remote file
153
- * webhook.send({
154
- * files: ['https://cdn.discordapp.com/icons/222078108977594368/6e1019b3179d71046e463a75915e7244.png?size=2048']
155
- * })
156
- * .then(console.log)
157
- * .catch(console.error);
158
- * @example
159
- * // Send a local file
160
- * webhook.send({
161
- * files: [{
162
- * attachment: 'entire/path/to/file.jpg',
163
- * name: 'file.jpg'
164
- * }]
165
- * })
166
- * .then(console.log)
167
- * .catch(console.error);
168
- * @example
169
- * // Send an embed with a local image inside
170
- * webhook.send({
171
- * content: 'This is an embed',
172
- * embeds: [{
173
- * thumbnail: {
174
- * url: 'attachment://file.jpg'
175
- * }
176
- * }],
177
- * files: [{
178
- * attachment: 'entire/path/to/file.jpg',
179
- * name: 'file.jpg'
180
- * }]
181
- * })
182
- * .then(console.log)
183
- * .catch(console.error);
184
- */
185
- async send(options) {
186
- if (!this.token) throw new Error('WEBHOOK_TOKEN_UNAVAILABLE');
187
-
188
- let messagePayload;
189
-
190
- if (options instanceof MessagePayload) {
191
- messagePayload = options.resolveData();
192
- } else {
193
- messagePayload = MessagePayload.create(this, options).resolveData();
194
- }
195
-
196
- const { data, files } = await messagePayload.resolveFiles();
197
- const d = await this.client.api.webhooks(this.id, this.token).post({
198
- data,
199
- files,
200
- query: { thread_id: messagePayload.options.threadId, wait: true },
201
- auth: false,
202
- webhook: true,
203
- });
204
- return this.client.channels?.cache.get(d.channel_id)?.messages._add(d, false) ?? d;
205
- }
206
-
207
- /**
208
- * Sends a raw slack message with this webhook.
209
- * @param {Object} body The raw body to send
210
- * @returns {Promise<boolean>}
211
- * @example
212
- * // Send a slack message
213
- * webhook.sendSlackMessage({
214
- * 'username': 'Wumpus',
215
- * 'attachments': [{
216
- * 'pretext': 'this looks pretty cool',
217
- * 'color': '#F0F',
218
- * 'footer_icon': 'http://snek.s3.amazonaws.com/topSnek.png',
219
- * 'footer': 'Powered by sneks',
220
- * 'ts': Date.now() / 1_000
221
- * }]
222
- * }).catch(console.error);
223
- * @see {@link https://api.slack.com/messaging/webhooks}
224
- */
225
- async sendSlackMessage(body) {
226
- if (!this.token) throw new Error('WEBHOOK_TOKEN_UNAVAILABLE');
227
-
228
- const data = await this.client.api.webhooks(this.id, this.token).slack.post({
229
- query: { wait: true },
230
- auth: false,
231
- data: body,
232
- webhook: true,
233
- });
234
- return data.toString() === 'ok';
235
- }
236
-
237
- /**
238
- * Options used to edit a {@link Webhook}.
239
- * @typedef {Object} WebhookEditData
240
- * @property {string} [name=this.name] The new name for the webhook
241
- * @property {?(BufferResolvable)} [avatar] The new avatar for the webhook
242
- * @property {GuildTextChannelResolvable|VoiceChannel|StageChannel|ForumChannel} [channel]
243
- * The new channel for the webhook
244
- */
245
-
246
- /**
247
- * Edits this webhook.
248
- * @param {WebhookEditData} options Options for editing the webhook
249
- * @param {string} [reason] Reason for editing the webhook
250
- * @returns {Promise<Webhook>}
251
- */
252
- async edit({ name = this.name, avatar, channel }, reason) {
253
- if (avatar && !(typeof avatar === 'string' && avatar.startsWith('data:'))) {
254
- avatar = await DataResolver.resolveImage(avatar);
255
- }
256
- channel &&= channel.id ?? channel;
257
- const data = await this.client.api.webhooks(this.id, channel ? undefined : this.token).patch({
258
- data: { name, avatar, channel_id: channel },
259
- reason,
260
- auth: !this.token || Boolean(channel),
261
- webhook: true,
262
- });
263
-
264
- this.name = data.name;
265
- this.avatar = data.avatar;
266
- this.channelId = data.channel_id;
267
- return this;
268
- }
269
-
270
- /**
271
- * Options that can be passed into fetchMessage.
272
- * @typedef {options} WebhookFetchMessageOptions
273
- * @property {boolean} [cache=true] Whether to cache the message.
274
- * @property {Snowflake} [threadId] The id of the thread this message belongs to.
275
- * <info>For interaction webhooks, this property is ignored</info>
276
- */
277
-
278
- /**
279
- * Gets a message that was sent by this webhook.
280
- * @param {Snowflake|'@original'} message The id of the message to fetch
281
- * @param {WebhookFetchMessageOptions|boolean} [cacheOrOptions={}] The options to provide to fetch the message.
282
- * <warn>A **deprecated** boolean may be passed instead to specify whether to cache the message.</warn>
283
- * @returns {Promise<Message|APIMessage>} Returns the raw message data if the webhook was instantiated as a
284
- * {@link WebhookClient} or if the channel is uncached, otherwise a {@link Message} will be returned
285
- */
286
- async fetchMessage(message, cacheOrOptions = { cache: true }) {
287
- if (typeof cacheOrOptions === 'boolean') {
288
- if (!deprecationEmittedForFetchMessage) {
289
- process.emitWarning(
290
- 'Passing a boolean to cache the message in Webhook#fetchMessage is deprecated. Pass an object instead.',
291
- 'DeprecationWarning',
292
- );
293
-
294
- deprecationEmittedForFetchMessage = true;
295
- }
296
-
297
- cacheOrOptions = { cache: cacheOrOptions };
298
- }
299
-
300
- if (!this.token) throw new Error('WEBHOOK_TOKEN_UNAVAILABLE');
301
-
302
- const data = await this.client.api
303
- .webhooks(this.id, this.token)
304
- .messages(message)
305
- .get({
306
- query: {
307
- thread_id: cacheOrOptions.threadId,
308
- },
309
- auth: false,
310
- webhook: true,
311
- });
312
- return this.client.channels?.cache.get(data.channel_id)?.messages._add(data, cacheOrOptions.cache) ?? data;
313
- }
314
-
315
- /**
316
- * Edits a message that was sent by this webhook.
317
- * @param {MessageResolvable|'@original'} message The message to edit
318
- * @param {string|MessagePayload|WebhookEditMessageOptions} options The options to provide
319
- * @returns {Promise<Message|APIMessage>} Returns the raw message data if the webhook was instantiated as a
320
- * {@link WebhookClient} or if the channel is uncached, otherwise a {@link Message} will be returned
321
- */
322
- async editMessage(message, options) {
323
- if (!this.token) throw new Error('WEBHOOK_TOKEN_UNAVAILABLE');
324
-
325
- let messagePayload;
326
-
327
- if (options instanceof MessagePayload) messagePayload = options;
328
- else messagePayload = MessagePayload.create(this, options);
329
-
330
- const { data, files } = await messagePayload.resolveData().resolveFiles();
331
-
332
- const d = await this.client.api
333
- .webhooks(this.id, this.token)
334
- .messages(typeof message === 'string' ? message : message.id)
335
- .patch({
336
- data,
337
- files,
338
- query: {
339
- thread_id: messagePayload.options.threadId,
340
- },
341
- auth: false,
342
- webhook: true,
343
- });
344
-
345
- const messageManager = this.client.channels?.cache.get(d.channel_id)?.messages;
346
- if (!messageManager) return d;
347
-
348
- const existing = messageManager.cache.get(d.id);
349
- if (!existing) return messageManager._add(d);
350
-
351
- const clone = existing._clone();
352
- clone._patch(d);
353
- return clone;
354
- }
355
-
356
- /**
357
- * Deletes the webhook.
358
- * @param {string} [reason] Reason for deleting this webhook
359
- * @returns {Promise<void>}
360
- */
361
- async delete(reason) {
362
- await this.client.api.webhooks(this.id, this.token).delete({ reason, auth: !this.token, webhook: true });
363
- }
364
-
365
- /**
366
- * Delete a message that was sent by this webhook.
367
- * @param {MessageResolvable|'@original'} message The message to delete
368
- * @param {Snowflake} [threadId] The id of the thread this message belongs to
369
- * @returns {Promise<void>}
370
- */
371
- async deleteMessage(message, threadId) {
372
- if (!this.token) throw new Error('WEBHOOK_TOKEN_UNAVAILABLE');
373
-
374
- await this.client.api
375
- .webhooks(this.id, this.token)
376
- .messages(typeof message === 'string' ? message : message.id)
377
- .delete({
378
- query: {
379
- thread_id: threadId,
380
- },
381
- auth: false,
382
- webhook: true,
383
- });
384
- }
385
-
386
- /**
387
- * The channel the webhook belongs to
388
- * @type {?(TextChannel|VoiceChannel|NewsChannel|ForumChannel)}
389
- * @readonly
390
- */
391
- get channel() {
392
- return this.client.channels.resolve(this.channelId);
393
- }
394
-
395
- /**
396
- * The timestamp the webhook was created at
397
- * @type {number}
398
- * @readonly
399
- */
400
- get createdTimestamp() {
401
- return SnowflakeUtil.timestampFrom(this.id);
402
- }
403
-
404
- /**
405
- * The time the webhook was created at
406
- * @type {Date}
407
- * @readonly
408
- */
409
- get createdAt() {
410
- return new Date(this.createdTimestamp);
411
- }
412
-
413
- /**
414
- * The URL of this webhook
415
- * @type {string}
416
- * @readonly
417
- */
418
- get url() {
419
- return this.client.options.http.api + this.client.api.webhooks(this.id, this.token);
420
- }
421
-
422
- /**
423
- * A link to the webhook's avatar.
424
- * @param {StaticImageURLOptions} [options={}] Options for the Image URL
425
- * @returns {?string}
426
- */
427
- avatarURL({ format, size } = {}) {
428
- if (!this.avatar) return null;
429
- return this.client.rest.cdn.Avatar(this.id, this.avatar, format, size);
430
- }
431
-
432
- /**
433
- * Whether or not this webhook is a channel follower webhook.
434
- * @returns {boolean}
435
- */
436
- isChannelFollower() {
437
- return this.type === 'Channel Follower';
438
- }
439
-
440
- /**
441
- * Whether or not this webhook is an incoming webhook.
442
- * @returns {boolean}
443
- */
444
- isIncoming() {
445
- return this.type === 'Incoming';
446
- }
447
-
448
- static applyToClass(structure, ignore = []) {
449
- for (const prop of [
450
- 'send',
451
- 'sendSlackMessage',
452
- 'fetchMessage',
453
- 'edit',
454
- 'editMessage',
455
- 'delete',
456
- 'deleteMessage',
457
- 'createdTimestamp',
458
- 'createdAt',
459
- 'url',
460
- ]) {
461
- if (ignore.includes(prop)) continue;
462
- Object.defineProperty(structure.prototype, prop, Object.getOwnPropertyDescriptor(Webhook.prototype, prop));
463
- }
464
- }
465
- }
466
-
467
- module.exports = Webhook;
1
+ 'use strict';
2
+
3
+ const process = require('node:process');
4
+ const MessagePayload = require('./MessagePayload');
5
+ const { Error } = require('../errors');
6
+ const { WebhookTypes } = require('../util/Constants');
7
+ const DataResolver = require('../util/DataResolver');
8
+ const SnowflakeUtil = require('../util/SnowflakeUtil');
9
+
10
+ let deprecationEmittedForFetchMessage = false;
11
+
12
+ /**
13
+ * Represents a webhook.
14
+ */
15
+ class Webhook {
16
+ constructor(client, data) {
17
+ /**
18
+ * The client that instantiated the webhook
19
+ * @name Webhook#client
20
+ * @type {Client}
21
+ * @readonly
22
+ */
23
+ Object.defineProperty(this, 'client', { value: client });
24
+ if (data) this._patch(data);
25
+ }
26
+
27
+ _patch(data) {
28
+ if ('name' in data) {
29
+ /**
30
+ * The name of the webhook
31
+ * @type {string}
32
+ */
33
+ this.name = data.name;
34
+ }
35
+
36
+ /**
37
+ * The token for the webhook, unavailable for follower webhooks and webhooks owned by another application.
38
+ * @name Webhook#token
39
+ * @type {?string}
40
+ */
41
+ Object.defineProperty(this, 'token', { value: data.token ?? null, writable: true, configurable: true });
42
+
43
+ if ('avatar' in data) {
44
+ /**
45
+ * The avatar for the webhook
46
+ * @type {?string}
47
+ */
48
+ this.avatar = data.avatar;
49
+ }
50
+
51
+ /**
52
+ * The webhook's id
53
+ * @type {Snowflake}
54
+ */
55
+ this.id = data.id;
56
+
57
+ if ('type' in data) {
58
+ /**
59
+ * The type of the webhook
60
+ * @type {WebhookType}
61
+ */
62
+ this.type = WebhookTypes[data.type];
63
+ }
64
+
65
+ if ('guild_id' in data) {
66
+ /**
67
+ * The guild the webhook belongs to
68
+ * @type {Snowflake}
69
+ */
70
+ this.guildId = data.guild_id;
71
+ }
72
+
73
+ if ('channel_id' in data) {
74
+ /**
75
+ * The id of the channel the webhook belongs to
76
+ * @type {Snowflake}
77
+ */
78
+ this.channelId = data.channel_id;
79
+ }
80
+
81
+ if ('user' in data) {
82
+ /**
83
+ * The owner of the webhook
84
+ * @type {?(User|APIUser)}
85
+ */
86
+ this.owner = this.client.users?._add(data.user) ?? data.user;
87
+ } else {
88
+ this.owner ??= null;
89
+ }
90
+
91
+ if ('source_guild' in data) {
92
+ /**
93
+ * The source guild of the webhook
94
+ * @type {?(Guild|APIGuild)}
95
+ */
96
+ this.sourceGuild = this.client.guilds?.cache.get(data.source_guild.id) ?? data.source_guild;
97
+ } else {
98
+ this.sourceGuild ??= null;
99
+ }
100
+
101
+ if ('source_channel' in data) {
102
+ /**
103
+ * The source channel of the webhook
104
+ * @type {?(NewsChannel|APIChannel)}
105
+ */
106
+ this.sourceChannel = this.client.channels?.cache.get(data.source_channel?.id) ?? data.source_channel;
107
+ } else {
108
+ this.sourceChannel ??= null;
109
+ }
110
+ }
111
+
112
+ /**
113
+ * Options that can be passed into send.
114
+ * @typedef {BaseMessageOptionsWithPoll} WebhookMessageOptions
115
+ * @property {string} [username=this.name] Username override for the message
116
+ * @property {string} [avatarURL] Avatar URL override for the message
117
+ * @property {Snowflake} [threadId] The id of the thread in the channel to send to.
118
+ * <info>For interaction webhooks, this property is ignored</info>
119
+ * @property {string} [threadName] Name of the thread to create (only available if webhook is in a forum channel)
120
+ * @property {MessageFlags} [flags] Which flags to set for the message. Only `SUPPRESS_EMBEDS` can be set.
121
+ * @property {Snowflake[]} [appliedTags]
122
+ * The tags to apply to the created thread (only available if the webhook is in a forum channel)
123
+ * @property {boolean} [withComponents] Whether to allow sending non-interactive components in the message.
124
+ * <info>For application-owned webhooks, this property is ignored</info>
125
+ */
126
+
127
+ /**
128
+ * Options that can be passed into editMessage.
129
+ * @typedef {Object} WebhookEditMessageOptions
130
+ * @property {MessageEmbed[]|APIEmbed[]} [embeds] See {@link WebhookMessageOptions#embeds}
131
+ * @property {string} [content] See {@link BaseMessageOptions#content}
132
+ * @property {FileOptions[]|BufferResolvable[]|MessageAttachment[]} [files] See {@link BaseMessageOptions#files}
133
+ * @property {MessageMentionOptions} [allowedMentions] See {@link BaseMessageOptions#allowedMentions}
134
+ * @property {MessageAttachment[]} [attachments] Attachments to send with the message
135
+ * @property {MessageActionRow[]|MessageActionRowOptions[]} [components]
136
+ * Action rows containing interactive components for the message (buttons, select menus)
137
+ * @property {Snowflake} [threadId] The id of the thread this message belongs to
138
+ * <info>For interaction webhooks, this property is ignored</info>
139
+ * @property {boolean} [withComponents] Whether to allow sending non-interactive components in the message.
140
+ * <info>For application-owned webhooks, this property is ignored</info>
141
+ */
142
+
143
+ /**
144
+ * Sends a message with this webhook.
145
+ * @param {string|MessagePayload|WebhookMessageOptions} options The options to provide
146
+ * @returns {Promise<Message|APIMessage>}
147
+ * @example
148
+ * // Send a basic message
149
+ * webhook.send('hello!')
150
+ * .then(message => console.log(`Sent message: ${message.content}`))
151
+ * .catch(console.error);
152
+ * @example
153
+ * // Send a basic message in a thread
154
+ * webhook.send({ content: 'hello!', threadId: '836856309672348295' })
155
+ * .then(message => console.log(`Sent message: ${message.content}`))
156
+ * .catch(console.error);
157
+ * @example
158
+ * // Send a remote file
159
+ * webhook.send({
160
+ * files: ['https://cdn.discordapp.com/icons/222078108977594368/6e1019b3179d71046e463a75915e7244.png?size=2048']
161
+ * })
162
+ * .then(console.log)
163
+ * .catch(console.error);
164
+ * @example
165
+ * // Send a local file
166
+ * webhook.send({
167
+ * files: [{
168
+ * attachment: 'entire/path/to/file.jpg',
169
+ * name: 'file.jpg'
170
+ * }]
171
+ * })
172
+ * .then(console.log)
173
+ * .catch(console.error);
174
+ * @example
175
+ * // Send an embed with a local image inside
176
+ * webhook.send({
177
+ * content: 'This is an embed',
178
+ * embeds: [{
179
+ * thumbnail: {
180
+ * url: 'attachment://file.jpg'
181
+ * }
182
+ * }],
183
+ * files: [{
184
+ * attachment: 'entire/path/to/file.jpg',
185
+ * name: 'file.jpg'
186
+ * }]
187
+ * })
188
+ * .then(console.log)
189
+ * .catch(console.error);
190
+ */
191
+ async send(options) {
192
+ if (!this.token) throw new Error('WEBHOOK_TOKEN_UNAVAILABLE');
193
+
194
+ let messagePayload;
195
+
196
+ if (options instanceof MessagePayload) {
197
+ messagePayload = options.resolveData();
198
+ } else {
199
+ messagePayload = MessagePayload.create(this, options).resolveData();
200
+ }
201
+
202
+ const { data, files } = await messagePayload.resolveFiles();
203
+ const d = await this.client.api.webhooks(this.id, this.token).post({
204
+ data,
205
+ files,
206
+ query: {
207
+ thread_id: messagePayload.options.threadId,
208
+ wait: true,
209
+ with_components: messagePayload.options.withComponents,
210
+ },
211
+ auth: false,
212
+ webhook: true,
213
+ });
214
+ return this.client.channels?.cache.get(d.channel_id)?.messages._add(d, false) ?? d;
215
+ }
216
+
217
+ /**
218
+ * Sends a raw slack message with this webhook.
219
+ * @param {Object} body The raw body to send
220
+ * @returns {Promise<boolean>}
221
+ * @example
222
+ * // Send a slack message
223
+ * webhook.sendSlackMessage({
224
+ * 'username': 'Wumpus',
225
+ * 'attachments': [{
226
+ * 'pretext': 'this looks pretty cool',
227
+ * 'color': '#F0F',
228
+ * 'footer_icon': 'http://snek.s3.amazonaws.com/topSnek.png',
229
+ * 'footer': 'Powered by sneks',
230
+ * 'ts': Date.now() / 1_000
231
+ * }]
232
+ * }).catch(console.error);
233
+ * @see {@link https://api.slack.com/messaging/webhooks}
234
+ */
235
+ async sendSlackMessage(body) {
236
+ if (!this.token) throw new Error('WEBHOOK_TOKEN_UNAVAILABLE');
237
+
238
+ const data = await this.client.api.webhooks(this.id, this.token).slack.post({
239
+ query: { wait: true },
240
+ auth: false,
241
+ data: body,
242
+ webhook: true,
243
+ });
244
+ return data.toString() === 'ok';
245
+ }
246
+
247
+ /**
248
+ * Options used to edit a {@link Webhook}.
249
+ * @typedef {Object} WebhookEditData
250
+ * @property {string} [name=this.name] The new name for the webhook
251
+ * @property {?(BufferResolvable)} [avatar] The new avatar for the webhook
252
+ * @property {GuildTextChannelResolvable|VoiceChannel|StageChannel|ForumChannel|MediaChannel} [channel]
253
+ * The new channel for the webhook
254
+ */
255
+
256
+ /**
257
+ * Edits this webhook.
258
+ * @param {WebhookEditData} options Options for editing the webhook
259
+ * @param {string} [reason] Reason for editing the webhook
260
+ * @returns {Promise<Webhook>}
261
+ */
262
+ async edit({ name = this.name, avatar, channel }, reason) {
263
+ if (avatar && !(typeof avatar === 'string' && avatar.startsWith('data:'))) {
264
+ avatar = await DataResolver.resolveImage(avatar);
265
+ }
266
+ channel &&= channel.id ?? channel;
267
+ const data = await this.client.api.webhooks(this.id, channel ? undefined : this.token).patch({
268
+ data: { name, avatar, channel_id: channel },
269
+ reason,
270
+ auth: !this.token || Boolean(channel),
271
+ webhook: true,
272
+ });
273
+
274
+ this.name = data.name;
275
+ this.avatar = data.avatar;
276
+ this.channelId = data.channel_id;
277
+ return this;
278
+ }
279
+
280
+ /**
281
+ * Options that can be passed into fetchMessage.
282
+ * @typedef {options} WebhookFetchMessageOptions
283
+ * @property {boolean} [cache=true] Whether to cache the message.
284
+ * @property {Snowflake} [threadId] The id of the thread this message belongs to.
285
+ * <info>For interaction webhooks, this property is ignored</info>
286
+ */
287
+
288
+ /**
289
+ * Gets a message that was sent by this webhook.
290
+ * @param {Snowflake|'@original'} message The id of the message to fetch
291
+ * @param {WebhookFetchMessageOptions|boolean} [cacheOrOptions={}] The options to provide to fetch the message.
292
+ * <warn>A **deprecated** boolean may be passed instead to specify whether to cache the message.</warn>
293
+ * @returns {Promise<Message|APIMessage>} Returns the raw message data if the webhook was instantiated as a
294
+ * {@link WebhookClient} or if the channel is uncached, otherwise a {@link Message} will be returned
295
+ */
296
+ async fetchMessage(message, cacheOrOptions = { cache: true }) {
297
+ if (typeof cacheOrOptions === 'boolean') {
298
+ if (!deprecationEmittedForFetchMessage) {
299
+ process.emitWarning(
300
+ 'Passing a boolean to cache the message in Webhook#fetchMessage is deprecated. Pass an object instead.',
301
+ 'DeprecationWarning',
302
+ );
303
+
304
+ deprecationEmittedForFetchMessage = true;
305
+ }
306
+
307
+ cacheOrOptions = { cache: cacheOrOptions };
308
+ }
309
+
310
+ if (!this.token) throw new Error('WEBHOOK_TOKEN_UNAVAILABLE');
311
+
312
+ const data = await this.client.api
313
+ .webhooks(this.id, this.token)
314
+ .messages(message)
315
+ .get({
316
+ query: {
317
+ thread_id: cacheOrOptions.threadId,
318
+ },
319
+ auth: false,
320
+ webhook: true,
321
+ });
322
+ return this.client.channels?.cache.get(data.channel_id)?.messages._add(data, cacheOrOptions.cache) ?? data;
323
+ }
324
+
325
+ /**
326
+ * Edits a message that was sent by this webhook.
327
+ * @param {MessageResolvable|'@original'} message The message to edit
328
+ * @param {string|MessagePayload|WebhookEditMessageOptions} options The options to provide
329
+ * @returns {Promise<Message|APIMessage>} Returns the raw message data if the webhook was instantiated as a
330
+ * {@link WebhookClient} or if the channel is uncached, otherwise a {@link Message} will be returned
331
+ */
332
+ async editMessage(message, options) {
333
+ if (!this.token) throw new Error('WEBHOOK_TOKEN_UNAVAILABLE');
334
+
335
+ let messagePayload;
336
+
337
+ if (options instanceof MessagePayload) messagePayload = options;
338
+ else messagePayload = MessagePayload.create(this, options);
339
+
340
+ const { data, files } = await messagePayload.resolveData().resolveFiles();
341
+
342
+ const d = await this.client.api
343
+ .webhooks(this.id, this.token)
344
+ .messages(typeof message === 'string' ? message : message.id)
345
+ .patch({
346
+ data,
347
+ files,
348
+ query: {
349
+ thread_id: messagePayload.options.threadId,
350
+ with_components: messagePayload.options.withComponents,
351
+ },
352
+ auth: false,
353
+ webhook: true,
354
+ });
355
+
356
+ const messageManager = this.client.channels?.cache.get(d.channel_id)?.messages;
357
+ if (!messageManager) return d;
358
+
359
+ const existing = messageManager.cache.get(d.id);
360
+ if (!existing) return messageManager._add(d);
361
+
362
+ const clone = existing._clone();
363
+ clone._patch(d);
364
+ return clone;
365
+ }
366
+
367
+ /**
368
+ * Deletes the webhook.
369
+ * @param {string} [reason] Reason for deleting this webhook
370
+ * @returns {Promise<void>}
371
+ */
372
+ async delete(reason) {
373
+ await this.client.api.webhooks(this.id, this.token).delete({ reason, auth: !this.token, webhook: true });
374
+ }
375
+
376
+ /**
377
+ * Delete a message that was sent by this webhook.
378
+ * @param {MessageResolvable|'@original'} message The message to delete
379
+ * @param {Snowflake} [threadId] The id of the thread this message belongs to
380
+ * @returns {Promise<void>}
381
+ */
382
+ async deleteMessage(message, threadId) {
383
+ if (!this.token) throw new Error('WEBHOOK_TOKEN_UNAVAILABLE');
384
+
385
+ await this.client.api
386
+ .webhooks(this.id, this.token)
387
+ .messages(typeof message === 'string' ? message : message.id)
388
+ .delete({
389
+ query: {
390
+ thread_id: threadId,
391
+ },
392
+ auth: false,
393
+ webhook: true,
394
+ });
395
+ }
396
+
397
+ /**
398
+ * The channel the webhook belongs to
399
+ * @type {?(TextChannel|VoiceChannel|NewsChannel|ForumChannel|MediaChannel)}
400
+ * @readonly
401
+ */
402
+ get channel() {
403
+ return this.client.channels.resolve(this.channelId);
404
+ }
405
+
406
+ /**
407
+ * The timestamp the webhook was created at
408
+ * @type {number}
409
+ * @readonly
410
+ */
411
+ get createdTimestamp() {
412
+ return SnowflakeUtil.timestampFrom(this.id);
413
+ }
414
+
415
+ /**
416
+ * The time the webhook was created at
417
+ * @type {Date}
418
+ * @readonly
419
+ */
420
+ get createdAt() {
421
+ return new Date(this.createdTimestamp);
422
+ }
423
+
424
+ /**
425
+ * The URL of this webhook
426
+ * @type {string}
427
+ * @readonly
428
+ */
429
+ get url() {
430
+ return this.client.options.http.api + this.client.api.webhooks(this.id, this.token);
431
+ }
432
+
433
+ /**
434
+ * A link to the webhook's avatar.
435
+ * @param {StaticImageURLOptions} [options={}] Options for the Image URL
436
+ * @returns {?string}
437
+ */
438
+ avatarURL({ format, size } = {}) {
439
+ if (!this.avatar) return null;
440
+ return this.client.rest.cdn.Avatar(this.id, this.avatar, format, size);
441
+ }
442
+
443
+ /**
444
+ * Whether or not this webhook is a channel follower webhook.
445
+ * @returns {boolean}
446
+ */
447
+ isChannelFollower() {
448
+ return this.type === 'Channel Follower';
449
+ }
450
+
451
+ /**
452
+ * Whether or not this webhook is an incoming webhook.
453
+ * @returns {boolean}
454
+ */
455
+ isIncoming() {
456
+ return this.type === 'Incoming';
457
+ }
458
+
459
+ static applyToClass(structure, ignore = []) {
460
+ for (const prop of [
461
+ 'send',
462
+ 'sendSlackMessage',
463
+ 'fetchMessage',
464
+ 'edit',
465
+ 'editMessage',
466
+ 'delete',
467
+ 'deleteMessage',
468
+ 'createdTimestamp',
469
+ 'createdAt',
470
+ 'url',
471
+ ]) {
472
+ if (ignore.includes(prop)) continue;
473
+ Object.defineProperty(structure.prototype, prop, Object.getOwnPropertyDescriptor(Webhook.prototype, prop));
474
+ }
475
+ }
476
+ }
477
+
478
+ module.exports = Webhook;