djs-selfbot-v13 3.1.8 → 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 (364) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +48 -37
  3. package/package.json +44 -26
  4. package/src/WebSocket.js +39 -39
  5. package/src/client/BaseClient.js +86 -86
  6. package/src/client/Client.js +934 -765
  7. package/src/client/WebhookClient.js +61 -61
  8. package/src/client/actions/Action.js +116 -120
  9. package/src/client/actions/ActionsManager.js +80 -78
  10. package/src/client/actions/ApplicationCommandPermissionsUpdate.js +34 -34
  11. package/src/client/actions/AutoModerationActionExecution.js +27 -27
  12. package/src/client/actions/AutoModerationRuleCreate.js +28 -28
  13. package/src/client/actions/AutoModerationRuleDelete.js +32 -32
  14. package/src/client/actions/AutoModerationRuleUpdate.js +30 -30
  15. package/src/client/actions/ChannelCreate.js +23 -23
  16. package/src/client/actions/ChannelDelete.js +39 -39
  17. package/src/client/actions/ChannelUpdate.js +43 -43
  18. package/src/client/actions/GuildAuditLogEntryCreate.js +29 -29
  19. package/src/client/actions/GuildBanAdd.js +20 -20
  20. package/src/client/actions/GuildBanRemove.js +25 -25
  21. package/src/client/actions/GuildChannelsPositionUpdate.js +21 -21
  22. package/src/client/actions/GuildDelete.js +65 -65
  23. package/src/client/actions/GuildEmojiCreate.js +20 -20
  24. package/src/client/actions/GuildEmojiDelete.js +21 -21
  25. package/src/client/actions/GuildEmojiUpdate.js +20 -20
  26. package/src/client/actions/GuildEmojisUpdate.js +34 -34
  27. package/src/client/actions/GuildIntegrationsUpdate.js +19 -19
  28. package/src/client/actions/GuildMemberRemove.js +33 -33
  29. package/src/client/actions/GuildMemberUpdate.js +44 -44
  30. package/src/client/actions/GuildRoleCreate.js +25 -25
  31. package/src/client/actions/GuildRoleDelete.js +31 -31
  32. package/src/client/actions/GuildRoleUpdate.js +39 -39
  33. package/src/client/actions/GuildRolesPositionUpdate.js +21 -21
  34. package/src/client/actions/GuildScheduledEventCreate.js +27 -27
  35. package/src/client/actions/GuildScheduledEventDelete.js +31 -31
  36. package/src/client/actions/GuildScheduledEventUpdate.js +30 -30
  37. package/src/client/actions/GuildScheduledEventUserAdd.js +32 -32
  38. package/src/client/actions/GuildScheduledEventUserRemove.js +32 -32
  39. package/src/client/actions/GuildStickerCreate.js +20 -20
  40. package/src/client/actions/GuildStickerDelete.js +21 -21
  41. package/src/client/actions/GuildStickerUpdate.js +20 -20
  42. package/src/client/actions/GuildStickersUpdate.js +34 -34
  43. package/src/client/actions/GuildUpdate.js +33 -33
  44. package/src/client/actions/InviteCreate.js +28 -28
  45. package/src/client/actions/InviteDelete.js +30 -30
  46. package/src/client/actions/MessageCreate.js +50 -46
  47. package/src/client/actions/MessageDelete.js +32 -32
  48. package/src/client/actions/MessageDeleteBulk.js +46 -46
  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 -56
  52. package/src/client/actions/MessageReactionRemove.js +50 -45
  53. package/src/client/actions/MessageReactionRemoveAll.js +33 -33
  54. package/src/client/actions/MessageReactionRemoveEmoji.js +28 -28
  55. package/src/client/actions/MessageUpdate.js +26 -26
  56. package/src/client/actions/PresenceUpdate.js +50 -46
  57. package/src/client/actions/StageInstanceCreate.js +28 -28
  58. package/src/client/actions/StageInstanceDelete.js +33 -33
  59. package/src/client/actions/StageInstanceUpdate.js +30 -30
  60. package/src/client/actions/ThreadCreate.js +24 -24
  61. package/src/client/actions/ThreadDelete.js +32 -32
  62. package/src/client/actions/ThreadListSync.js +59 -59
  63. package/src/client/actions/ThreadMemberUpdate.js +30 -30
  64. package/src/client/actions/ThreadMembersUpdate.js +34 -34
  65. package/src/client/actions/TypingStart.js +29 -29
  66. package/src/client/actions/UserUpdate.js +35 -35
  67. package/src/client/actions/VoiceStateUpdate.js +50 -57
  68. package/src/client/actions/WebhooksUpdate.js +20 -20
  69. package/src/client/voice/ClientVoiceManager.js +151 -51
  70. package/src/client/voice/VoiceConnection.js +1249 -0
  71. package/src/client/voice/dispatcher/AnnexBDispatcher.js +120 -0
  72. package/src/client/voice/dispatcher/AudioDispatcher.js +145 -0
  73. package/src/client/voice/dispatcher/BaseDispatcher.js +459 -0
  74. package/src/client/voice/dispatcher/VPxDispatcher.js +54 -0
  75. package/src/client/voice/dispatcher/VideoDispatcher.js +68 -0
  76. package/src/client/voice/networking/VoiceUDPClient.js +173 -0
  77. package/src/client/voice/networking/VoiceWebSocket.js +286 -0
  78. package/src/client/voice/player/MediaPlayer.js +321 -0
  79. package/src/client/voice/player/processing/AnnexBNalSplitter.js +244 -0
  80. package/src/client/voice/player/processing/IvfSplitter.js +106 -0
  81. package/src/client/voice/player/processing/PCMInsertSilence.js +37 -0
  82. package/src/client/voice/receiver/PacketHandler.js +260 -0
  83. package/src/client/voice/receiver/Receiver.js +96 -0
  84. package/src/client/voice/receiver/Recorder.js +173 -0
  85. package/src/client/voice/util/Function.js +116 -0
  86. package/src/client/voice/util/PlayInterface.js +122 -0
  87. package/src/client/voice/util/Secretbox.js +64 -0
  88. package/src/client/voice/util/Silence.js +16 -0
  89. package/src/client/voice/util/Socket.js +62 -0
  90. package/src/client/voice/util/VolumeInterface.js +104 -0
  91. package/src/client/websocket/WebSocketManager.js +392 -392
  92. package/src/client/websocket/WebSocketShard.js +907 -906
  93. package/src/client/websocket/handlers/APPLICATION_COMMAND_CREATE.js +18 -18
  94. package/src/client/websocket/handlers/APPLICATION_COMMAND_DELETE.js +20 -20
  95. package/src/client/websocket/handlers/APPLICATION_COMMAND_PERMISSIONS_UPDATE.js +5 -5
  96. package/src/client/websocket/handlers/APPLICATION_COMMAND_UPDATE.js +20 -20
  97. package/src/client/websocket/handlers/AUTO_MODERATION_ACTION_EXECUTION.js +5 -5
  98. package/src/client/websocket/handlers/AUTO_MODERATION_RULE_CREATE.js +5 -5
  99. package/src/client/websocket/handlers/AUTO_MODERATION_RULE_DELETE.js +5 -5
  100. package/src/client/websocket/handlers/AUTO_MODERATION_RULE_UPDATE.js +5 -5
  101. package/src/client/websocket/handlers/CALL_CREATE.js +14 -14
  102. package/src/client/websocket/handlers/CALL_DELETE.js +11 -11
  103. package/src/client/websocket/handlers/CALL_UPDATE.js +11 -11
  104. package/src/client/websocket/handlers/CHANNEL_CREATE.js +5 -5
  105. package/src/client/websocket/handlers/CHANNEL_DELETE.js +5 -5
  106. package/src/client/websocket/handlers/CHANNEL_PINS_UPDATE.js +22 -22
  107. package/src/client/websocket/handlers/CHANNEL_RECIPIENT_ADD.js +19 -19
  108. package/src/client/websocket/handlers/CHANNEL_RECIPIENT_REMOVE.js +16 -16
  109. package/src/client/websocket/handlers/CHANNEL_UPDATE.js +16 -16
  110. package/src/client/websocket/handlers/GUILD_AUDIT_LOG_ENTRY_CREATE.js +5 -5
  111. package/src/client/websocket/handlers/GUILD_BAN_ADD.js +5 -5
  112. package/src/client/websocket/handlers/GUILD_BAN_REMOVE.js +5 -5
  113. package/src/client/websocket/handlers/GUILD_CREATE.js +52 -53
  114. package/src/client/websocket/handlers/GUILD_DELETE.js +5 -5
  115. package/src/client/websocket/handlers/GUILD_EMOJIS_UPDATE.js +5 -5
  116. package/src/client/websocket/handlers/GUILD_INTEGRATIONS_UPDATE.js +5 -5
  117. package/src/client/websocket/handlers/GUILD_MEMBERS_CHUNK.js +39 -39
  118. package/src/client/websocket/handlers/GUILD_MEMBER_ADD.js +20 -20
  119. package/src/client/websocket/handlers/GUILD_MEMBER_REMOVE.js +5 -5
  120. package/src/client/websocket/handlers/GUILD_MEMBER_UPDATE.js +5 -5
  121. package/src/client/websocket/handlers/GUILD_ROLE_CREATE.js +5 -5
  122. package/src/client/websocket/handlers/GUILD_ROLE_DELETE.js +5 -5
  123. package/src/client/websocket/handlers/GUILD_ROLE_UPDATE.js +5 -5
  124. package/src/client/websocket/handlers/GUILD_SCHEDULED_EVENT_CREATE.js +5 -5
  125. package/src/client/websocket/handlers/GUILD_SCHEDULED_EVENT_DELETE.js +5 -5
  126. package/src/client/websocket/handlers/GUILD_SCHEDULED_EVENT_UPDATE.js +5 -5
  127. package/src/client/websocket/handlers/GUILD_SCHEDULED_EVENT_USER_ADD.js +5 -5
  128. package/src/client/websocket/handlers/GUILD_SCHEDULED_EVENT_USER_REMOVE.js +5 -5
  129. package/src/client/websocket/handlers/GUILD_STICKERS_UPDATE.js +5 -5
  130. package/src/client/websocket/handlers/GUILD_UPDATE.js +5 -5
  131. package/src/client/websocket/handlers/INTERACTION_MODAL_CREATE.js +12 -12
  132. package/src/client/websocket/handlers/INVITE_CREATE.js +5 -5
  133. package/src/client/websocket/handlers/INVITE_DELETE.js +5 -5
  134. package/src/client/websocket/handlers/MESSAGE_CREATE.js +5 -5
  135. package/src/client/websocket/handlers/MESSAGE_DELETE.js +5 -5
  136. package/src/client/websocket/handlers/MESSAGE_DELETE_BULK.js +5 -5
  137. package/src/client/websocket/handlers/MESSAGE_POLL_VOTE_ADD.js +5 -0
  138. package/src/client/websocket/handlers/MESSAGE_POLL_VOTE_REMOVE.js +5 -0
  139. package/src/client/websocket/handlers/MESSAGE_REACTION_ADD.js +5 -5
  140. package/src/client/websocket/handlers/MESSAGE_REACTION_REMOVE.js +5 -5
  141. package/src/client/websocket/handlers/MESSAGE_REACTION_REMOVE_ALL.js +5 -5
  142. package/src/client/websocket/handlers/MESSAGE_REACTION_REMOVE_EMOJI.js +5 -5
  143. package/src/client/websocket/handlers/MESSAGE_UPDATE.js +16 -16
  144. package/src/client/websocket/handlers/PRESENCE_UPDATE.js +5 -5
  145. package/src/client/websocket/handlers/READY.js +121 -80
  146. package/src/client/websocket/handlers/RELATIONSHIP_ADD.js +19 -19
  147. package/src/client/websocket/handlers/RELATIONSHIP_REMOVE.js +17 -17
  148. package/src/client/websocket/handlers/RELATIONSHIP_UPDATE.js +41 -41
  149. package/src/client/websocket/handlers/RESUMED.js +14 -14
  150. package/src/client/websocket/handlers/STAGE_INSTANCE_CREATE.js +5 -5
  151. package/src/client/websocket/handlers/STAGE_INSTANCE_DELETE.js +5 -5
  152. package/src/client/websocket/handlers/STAGE_INSTANCE_UPDATE.js +5 -5
  153. package/src/client/websocket/handlers/THREAD_CREATE.js +5 -5
  154. package/src/client/websocket/handlers/THREAD_DELETE.js +5 -5
  155. package/src/client/websocket/handlers/THREAD_LIST_SYNC.js +5 -5
  156. package/src/client/websocket/handlers/THREAD_MEMBERS_UPDATE.js +5 -5
  157. package/src/client/websocket/handlers/THREAD_MEMBER_UPDATE.js +5 -5
  158. package/src/client/websocket/handlers/THREAD_UPDATE.js +16 -16
  159. package/src/client/websocket/handlers/TYPING_START.js +5 -5
  160. package/src/client/websocket/handlers/USER_GUILD_SETTINGS_UPDATE.js +6 -6
  161. package/src/client/websocket/handlers/USER_NOTE_UPDATE.js +5 -5
  162. package/src/client/websocket/handlers/USER_REQUIRED_ACTION_UPDATE.js +78 -78
  163. package/src/client/websocket/handlers/USER_SETTINGS_UPDATE.js +5 -5
  164. package/src/client/websocket/handlers/USER_UPDATE.js +5 -5
  165. package/src/client/websocket/handlers/VOICE_CHANNEL_EFFECT_SEND.js +16 -0
  166. package/src/client/websocket/handlers/VOICE_CHANNEL_STATUS_UPDATE.js +12 -12
  167. package/src/client/websocket/handlers/VOICE_SERVER_UPDATE.js +6 -6
  168. package/src/client/websocket/handlers/VOICE_STATE_UPDATE.js +5 -5
  169. package/src/client/websocket/handlers/WEBHOOKS_UPDATE.js +5 -5
  170. package/src/client/websocket/handlers/index.js +84 -81
  171. package/src/errors/DJSError.js +61 -61
  172. package/src/errors/Messages.js +217 -182
  173. package/src/errors/index.js +4 -4
  174. package/src/index.js +172 -158
  175. package/src/managers/ApplicationCommandManager.js +264 -264
  176. package/src/managers/ApplicationCommandPermissionsManager.js +417 -417
  177. package/src/managers/AutoModerationRuleManager.js +296 -296
  178. package/src/managers/BaseGuildEmojiManager.js +80 -80
  179. package/src/managers/BaseManager.js +19 -19
  180. package/src/managers/BillingManager.js +66 -66
  181. package/src/managers/CachedManager.js +71 -71
  182. package/src/managers/ChannelManager.js +148 -138
  183. package/src/managers/ClientUserSettingManager.js +372 -372
  184. package/src/managers/DataManager.js +61 -61
  185. package/src/managers/GuildBanManager.js +250 -204
  186. package/src/managers/GuildChannelManager.js +488 -504
  187. package/src/managers/GuildEmojiManager.js +171 -171
  188. package/src/managers/GuildEmojiRoleManager.js +118 -118
  189. package/src/managers/GuildForumThreadManager.js +108 -108
  190. package/src/managers/GuildInviteManager.js +213 -213
  191. package/src/managers/GuildManager.js +338 -304
  192. package/src/managers/GuildMemberManager.js +599 -593
  193. package/src/managers/GuildMemberRoleManager.js +195 -191
  194. package/src/managers/GuildScheduledEventManager.js +314 -296
  195. package/src/managers/GuildSettingManager.js +155 -155
  196. package/src/managers/GuildStickerManager.js +179 -179
  197. package/src/managers/GuildTextThreadManager.js +98 -98
  198. package/src/managers/InteractionManager.js +39 -39
  199. package/src/managers/MessageManager.js +423 -391
  200. package/src/managers/PermissionOverwriteManager.js +164 -166
  201. package/src/managers/PresenceManager.js +71 -58
  202. package/src/managers/ReactionManager.js +67 -67
  203. package/src/managers/ReactionUserManager.js +73 -71
  204. package/src/managers/RelationshipManager.js +278 -265
  205. package/src/managers/RoleManager.js +448 -352
  206. package/src/managers/SessionManager.js +66 -0
  207. package/src/managers/StageInstanceManager.js +162 -162
  208. package/src/managers/ThreadManager.js +175 -174
  209. package/src/managers/ThreadMemberManager.js +186 -186
  210. package/src/managers/UserManager.js +136 -146
  211. package/src/managers/UserNoteManager.js +53 -53
  212. package/src/managers/VoiceStateManager.js +59 -37
  213. package/src/rest/APIRequest.js +154 -154
  214. package/src/rest/APIRouter.js +53 -53
  215. package/src/rest/DiscordAPIError.js +119 -104
  216. package/src/rest/HTTPError.js +62 -62
  217. package/src/rest/RESTManager.js +67 -62
  218. package/src/rest/RateLimitError.js +55 -55
  219. package/src/rest/RequestHandler.js +466 -444
  220. package/src/sharding/Shard.js +444 -443
  221. package/src/sharding/ShardClientUtil.js +279 -275
  222. package/src/sharding/ShardingManager.js +319 -318
  223. package/src/structures/AnonymousGuild.js +98 -98
  224. package/src/structures/ApplicationCommand.js +593 -593
  225. package/src/structures/ApplicationRoleConnectionMetadata.js +48 -48
  226. package/src/structures/AutoModerationActionExecution.js +89 -89
  227. package/src/structures/AutoModerationRule.js +294 -294
  228. package/src/structures/AutocompleteInteraction.js +107 -107
  229. package/src/structures/Base.js +43 -43
  230. package/src/structures/BaseCommandInteraction.js +211 -211
  231. package/src/structures/BaseGuild.js +116 -116
  232. package/src/structures/BaseGuildEmoji.js +56 -56
  233. package/src/structures/BaseGuildTextChannel.js +191 -191
  234. package/src/structures/BaseGuildVoiceChannel.js +241 -241
  235. package/src/structures/BaseMessageComponent.js +181 -114
  236. package/src/structures/ButtonInteraction.js +11 -11
  237. package/src/structures/CallState.js +63 -63
  238. package/src/structures/CategoryChannel.js +85 -85
  239. package/src/structures/Channel.js +284 -270
  240. package/src/structures/ClientPresence.js +77 -88
  241. package/src/structures/ClientUser.js +479 -450
  242. package/src/structures/CommandInteraction.js +41 -41
  243. package/src/structures/CommandInteractionOptionResolver.js +276 -276
  244. package/src/structures/ContainerComponent.js +68 -0
  245. package/src/structures/ContextMenuInteraction.js +65 -65
  246. package/src/structures/DMChannel.js +219 -217
  247. package/src/structures/DirectoryChannel.js +20 -20
  248. package/src/structures/Emoji.js +148 -148
  249. package/src/structures/FileComponent.js +49 -0
  250. package/src/structures/ForumChannel.js +31 -261
  251. package/src/structures/GroupDMChannel.js +394 -387
  252. package/src/structures/Guild.js +1643 -1608
  253. package/src/structures/GuildAuditLogs.js +746 -729
  254. package/src/structures/GuildBan.js +59 -59
  255. package/src/structures/GuildBoost.js +108 -108
  256. package/src/structures/GuildChannel.js +470 -468
  257. package/src/structures/GuildEmoji.js +161 -161
  258. package/src/structures/GuildMember.js +636 -568
  259. package/src/structures/GuildPreview.js +191 -191
  260. package/src/structures/GuildPreviewEmoji.js +27 -27
  261. package/src/structures/GuildScheduledEvent.js +536 -441
  262. package/src/structures/GuildTemplate.js +236 -236
  263. package/src/structures/Integration.js +188 -188
  264. package/src/structures/IntegrationApplication.js +96 -96
  265. package/src/structures/Interaction.js +290 -290
  266. package/src/structures/InteractionCollector.js +248 -248
  267. package/src/structures/InteractionWebhook.js +43 -43
  268. package/src/structures/Invite.js +358 -358
  269. package/src/structures/InviteGuild.js +23 -23
  270. package/src/structures/InviteStageInstance.js +86 -86
  271. package/src/structures/MediaChannel.js +11 -0
  272. package/src/structures/MediaGalleryComponent.js +41 -0
  273. package/src/structures/MediaGalleryItem.js +47 -0
  274. package/src/structures/Message.js +1252 -1236
  275. package/src/structures/MessageActionRow.js +105 -103
  276. package/src/structures/MessageAttachment.js +216 -204
  277. package/src/structures/MessageButton.js +166 -165
  278. package/src/structures/MessageCollector.js +146 -146
  279. package/src/structures/MessageComponentInteraction.js +120 -120
  280. package/src/structures/MessageContextMenuInteraction.js +20 -20
  281. package/src/structures/MessageEmbed.js +596 -586
  282. package/src/structures/MessageMentions.js +273 -273
  283. package/src/structures/MessagePayload.js +354 -316
  284. package/src/structures/MessageReaction.js +181 -171
  285. package/src/structures/MessageSelectMenu.js +141 -140
  286. package/src/structures/Modal.js +161 -174
  287. package/src/structures/ModalSubmitFieldsResolver.js +53 -53
  288. package/src/structures/ModalSubmitInteraction.js +119 -119
  289. package/src/structures/NewsChannel.js +32 -32
  290. package/src/structures/OAuth2Guild.js +28 -28
  291. package/src/structures/PermissionOverwrites.js +198 -196
  292. package/src/structures/Poll.js +108 -0
  293. package/src/structures/PollAnswer.js +88 -0
  294. package/src/structures/Presence.js +1105 -443
  295. package/src/structures/ReactionCollector.js +229 -229
  296. package/src/structures/ReactionEmoji.js +31 -31
  297. package/src/structures/Role.js +590 -531
  298. package/src/structures/SectionComponent.js +48 -0
  299. package/src/structures/SelectMenuInteraction.js +21 -21
  300. package/src/structures/SeparatorComponent.js +48 -0
  301. package/src/structures/Session.js +81 -0
  302. package/src/structures/StageChannel.js +104 -104
  303. package/src/structures/StageInstance.js +208 -208
  304. package/src/structures/Sticker.js +310 -310
  305. package/src/structures/StickerPack.js +95 -95
  306. package/src/structures/StoreChannel.js +56 -56
  307. package/src/structures/Team.js +118 -118
  308. package/src/structures/TeamMember.js +80 -71
  309. package/src/structures/TextChannel.js +33 -33
  310. package/src/structures/TextDisplayComponent.js +40 -0
  311. package/src/structures/TextInputComponent.js +132 -131
  312. package/src/structures/ThreadChannel.js +605 -607
  313. package/src/structures/ThreadMember.js +105 -105
  314. package/src/structures/ThreadOnlyChannel.js +249 -0
  315. package/src/structures/ThumbnailComponent.js +57 -0
  316. package/src/structures/Typing.js +74 -74
  317. package/src/structures/UnfurledMediaItem.js +29 -0
  318. package/src/structures/User.js +640 -509
  319. package/src/structures/UserContextMenuInteraction.js +29 -29
  320. package/src/structures/VoiceChannel.js +110 -110
  321. package/src/structures/VoiceChannelEffect.js +69 -0
  322. package/src/structures/VoiceRegion.js +53 -53
  323. package/src/structures/VoiceState.js +354 -341
  324. package/src/structures/WebEmbed.js +373 -373
  325. package/src/structures/Webhook.js +478 -467
  326. package/src/structures/WelcomeChannel.js +60 -60
  327. package/src/structures/WelcomeScreen.js +48 -48
  328. package/src/structures/Widget.js +87 -87
  329. package/src/structures/WidgetMember.js +99 -99
  330. package/src/structures/interfaces/Application.js +825 -313
  331. package/src/structures/interfaces/Collector.js +300 -300
  332. package/src/structures/interfaces/InteractionResponses.js +313 -313
  333. package/src/structures/interfaces/TextBasedChannel.js +759 -721
  334. package/src/util/APITypes.js +59 -0
  335. package/src/util/ActivityFlags.js +44 -44
  336. package/src/util/ApplicationFlags.js +76 -76
  337. package/src/util/AttachmentFlags.js +38 -38
  338. package/src/util/BitField.js +170 -170
  339. package/src/util/ChannelFlags.js +45 -45
  340. package/src/util/Constants.js +1914 -1760
  341. package/src/util/DataResolver.js +146 -145
  342. package/src/util/Formatters.js +228 -228
  343. package/src/util/GuildMemberFlags.js +43 -43
  344. package/src/util/Intents.js +74 -74
  345. package/src/util/InviteFlags.js +34 -29
  346. package/src/util/LimitedCollection.js +131 -131
  347. package/src/util/MessageFlags.js +63 -54
  348. package/src/util/Options.js +358 -342
  349. package/src/util/Permissions.js +202 -192
  350. package/src/util/PremiumUsageFlags.js +31 -31
  351. package/src/util/PurchasedFlags.js +33 -33
  352. package/src/util/RemoteAuth.js +382 -379
  353. package/src/util/RoleFlags.js +37 -37
  354. package/src/util/SnowflakeUtil.js +92 -92
  355. package/src/util/Speaking.js +33 -0
  356. package/src/util/Sweepers.js +466 -466
  357. package/src/util/SystemChannelFlags.js +55 -55
  358. package/src/util/ThreadMemberFlags.js +30 -30
  359. package/src/util/UserFlags.js +104 -104
  360. package/src/util/Util.js +1048 -803
  361. package/typings/enums.d.ts +439 -291
  362. package/typings/index.d.ts +8247 -7390
  363. package/typings/rawDataTypes.d.ts +403 -342
  364. package/src/structures/RichPresence.js +0 -702
@@ -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;