@velliajs/discord 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (317) hide show
  1. package/LICENSE +191 -0
  2. package/README.md +133 -0
  3. package/package.json +82 -0
  4. package/src/client/BaseClient.js +83 -0
  5. package/src/client/Client.js +591 -0
  6. package/src/client/WebhookClient.js +103 -0
  7. package/src/client/actions/Action.js +119 -0
  8. package/src/client/actions/ActionsManager.js +79 -0
  9. package/src/client/actions/ApplicationCommandPermissionsUpdate.js +34 -0
  10. package/src/client/actions/AutoModerationActionExecution.js +26 -0
  11. package/src/client/actions/AutoModerationRuleCreate.js +27 -0
  12. package/src/client/actions/AutoModerationRuleDelete.js +31 -0
  13. package/src/client/actions/AutoModerationRuleUpdate.js +29 -0
  14. package/src/client/actions/ChannelCreate.js +23 -0
  15. package/src/client/actions/ChannelDelete.js +23 -0
  16. package/src/client/actions/ChannelUpdate.js +33 -0
  17. package/src/client/actions/GuildAuditLogEntryCreate.js +29 -0
  18. package/src/client/actions/GuildBanAdd.js +20 -0
  19. package/src/client/actions/GuildBanRemove.js +25 -0
  20. package/src/client/actions/GuildChannelsPositionUpdate.js +21 -0
  21. package/src/client/actions/GuildDelete.js +44 -0
  22. package/src/client/actions/GuildEmojiCreate.js +20 -0
  23. package/src/client/actions/GuildEmojiDelete.js +19 -0
  24. package/src/client/actions/GuildEmojiUpdate.js +20 -0
  25. package/src/client/actions/GuildEmojisUpdate.js +34 -0
  26. package/src/client/actions/GuildIntegrationsUpdate.js +19 -0
  27. package/src/client/actions/GuildMemberRemove.js +31 -0
  28. package/src/client/actions/GuildMemberUpdate.js +44 -0
  29. package/src/client/actions/GuildRoleCreate.js +25 -0
  30. package/src/client/actions/GuildRoleDelete.js +29 -0
  31. package/src/client/actions/GuildRoleUpdate.js +39 -0
  32. package/src/client/actions/GuildRolesPositionUpdate.js +21 -0
  33. package/src/client/actions/GuildScheduledEventCreate.js +27 -0
  34. package/src/client/actions/GuildScheduledEventDelete.js +31 -0
  35. package/src/client/actions/GuildScheduledEventUpdate.js +30 -0
  36. package/src/client/actions/GuildScheduledEventUserAdd.js +32 -0
  37. package/src/client/actions/GuildScheduledEventUserRemove.js +32 -0
  38. package/src/client/actions/GuildStickerCreate.js +20 -0
  39. package/src/client/actions/GuildStickerDelete.js +19 -0
  40. package/src/client/actions/GuildStickerUpdate.js +20 -0
  41. package/src/client/actions/GuildStickersUpdate.js +34 -0
  42. package/src/client/actions/GuildUpdate.js +33 -0
  43. package/src/client/actions/InteractionCreate.js +101 -0
  44. package/src/client/actions/InviteCreate.js +28 -0
  45. package/src/client/actions/InviteDelete.js +30 -0
  46. package/src/client/actions/MessageCreate.js +37 -0
  47. package/src/client/actions/MessageDelete.js +32 -0
  48. package/src/client/actions/MessageDeleteBulk.js +47 -0
  49. package/src/client/actions/MessageReactionAdd.js +55 -0
  50. package/src/client/actions/MessageReactionRemove.js +45 -0
  51. package/src/client/actions/MessageReactionRemoveAll.js +33 -0
  52. package/src/client/actions/MessageReactionRemoveEmoji.js +28 -0
  53. package/src/client/actions/MessageUpdate.js +26 -0
  54. package/src/client/actions/PresenceUpdate.js +42 -0
  55. package/src/client/actions/StageInstanceCreate.js +28 -0
  56. package/src/client/actions/StageInstanceDelete.js +31 -0
  57. package/src/client/actions/StageInstanceUpdate.js +30 -0
  58. package/src/client/actions/ThreadCreate.js +24 -0
  59. package/src/client/actions/ThreadDelete.js +26 -0
  60. package/src/client/actions/ThreadListSync.js +60 -0
  61. package/src/client/actions/ThreadMemberUpdate.js +30 -0
  62. package/src/client/actions/ThreadMembersUpdate.js +47 -0
  63. package/src/client/actions/TypingStart.js +29 -0
  64. package/src/client/actions/UserUpdate.js +36 -0
  65. package/src/client/actions/VoiceStateUpdate.js +43 -0
  66. package/src/client/actions/WebhooksUpdate.js +20 -0
  67. package/src/client/voice/ClientVoiceManager.js +44 -0
  68. package/src/client/websocket/WebSocketManager.js +393 -0
  69. package/src/client/websocket/WebSocketShard.js +231 -0
  70. package/src/client/websocket/handlers/APPLICATION_COMMAND_PERMISSIONS_UPDATE.js +5 -0
  71. package/src/client/websocket/handlers/AUTO_MODERATION_ACTION_EXECUTION.js +5 -0
  72. package/src/client/websocket/handlers/AUTO_MODERATION_RULE_CREATE.js +5 -0
  73. package/src/client/websocket/handlers/AUTO_MODERATION_RULE_DELETE.js +5 -0
  74. package/src/client/websocket/handlers/AUTO_MODERATION_RULE_UPDATE.js +5 -0
  75. package/src/client/websocket/handlers/CHANNEL_CREATE.js +5 -0
  76. package/src/client/websocket/handlers/CHANNEL_DELETE.js +5 -0
  77. package/src/client/websocket/handlers/CHANNEL_PINS_UPDATE.js +22 -0
  78. package/src/client/websocket/handlers/CHANNEL_UPDATE.js +16 -0
  79. package/src/client/websocket/handlers/GUILD_AUDIT_LOG_ENTRY_CREATE.js +5 -0
  80. package/src/client/websocket/handlers/GUILD_BAN_ADD.js +5 -0
  81. package/src/client/websocket/handlers/GUILD_BAN_REMOVE.js +5 -0
  82. package/src/client/websocket/handlers/GUILD_CREATE.js +26 -0
  83. package/src/client/websocket/handlers/GUILD_DELETE.js +5 -0
  84. package/src/client/websocket/handlers/GUILD_EMOJIS_UPDATE.js +5 -0
  85. package/src/client/websocket/handlers/GUILD_INTEGRATIONS_UPDATE.js +5 -0
  86. package/src/client/websocket/handlers/GUILD_MEMBERS_CHUNK.js +39 -0
  87. package/src/client/websocket/handlers/GUILD_MEMBER_ADD.js +20 -0
  88. package/src/client/websocket/handlers/GUILD_MEMBER_REMOVE.js +5 -0
  89. package/src/client/websocket/handlers/GUILD_MEMBER_UPDATE.js +5 -0
  90. package/src/client/websocket/handlers/GUILD_ROLE_CREATE.js +5 -0
  91. package/src/client/websocket/handlers/GUILD_ROLE_DELETE.js +5 -0
  92. package/src/client/websocket/handlers/GUILD_ROLE_UPDATE.js +5 -0
  93. package/src/client/websocket/handlers/GUILD_SCHEDULED_EVENT_CREATE.js +5 -0
  94. package/src/client/websocket/handlers/GUILD_SCHEDULED_EVENT_DELETE.js +5 -0
  95. package/src/client/websocket/handlers/GUILD_SCHEDULED_EVENT_UPDATE.js +5 -0
  96. package/src/client/websocket/handlers/GUILD_SCHEDULED_EVENT_USER_ADD.js +5 -0
  97. package/src/client/websocket/handlers/GUILD_SCHEDULED_EVENT_USER_REMOVE.js +5 -0
  98. package/src/client/websocket/handlers/GUILD_STICKERS_UPDATE.js +5 -0
  99. package/src/client/websocket/handlers/GUILD_UPDATE.js +5 -0
  100. package/src/client/websocket/handlers/INTERACTION_CREATE.js +5 -0
  101. package/src/client/websocket/handlers/INVITE_CREATE.js +5 -0
  102. package/src/client/websocket/handlers/INVITE_DELETE.js +5 -0
  103. package/src/client/websocket/handlers/MESSAGE_CREATE.js +5 -0
  104. package/src/client/websocket/handlers/MESSAGE_DELETE.js +5 -0
  105. package/src/client/websocket/handlers/MESSAGE_DELETE_BULK.js +5 -0
  106. package/src/client/websocket/handlers/MESSAGE_REACTION_ADD.js +5 -0
  107. package/src/client/websocket/handlers/MESSAGE_REACTION_REMOVE.js +5 -0
  108. package/src/client/websocket/handlers/MESSAGE_REACTION_REMOVE_ALL.js +5 -0
  109. package/src/client/websocket/handlers/MESSAGE_REACTION_REMOVE_EMOJI.js +5 -0
  110. package/src/client/websocket/handlers/MESSAGE_UPDATE.js +16 -0
  111. package/src/client/websocket/handlers/PRESENCE_UPDATE.js +5 -0
  112. package/src/client/websocket/handlers/READY.js +27 -0
  113. package/src/client/websocket/handlers/RESUMED.js +14 -0
  114. package/src/client/websocket/handlers/STAGE_INSTANCE_CREATE.js +5 -0
  115. package/src/client/websocket/handlers/STAGE_INSTANCE_DELETE.js +5 -0
  116. package/src/client/websocket/handlers/STAGE_INSTANCE_UPDATE.js +5 -0
  117. package/src/client/websocket/handlers/THREAD_CREATE.js +5 -0
  118. package/src/client/websocket/handlers/THREAD_DELETE.js +5 -0
  119. package/src/client/websocket/handlers/THREAD_LIST_SYNC.js +5 -0
  120. package/src/client/websocket/handlers/THREAD_MEMBERS_UPDATE.js +5 -0
  121. package/src/client/websocket/handlers/THREAD_MEMBER_UPDATE.js +5 -0
  122. package/src/client/websocket/handlers/THREAD_UPDATE.js +16 -0
  123. package/src/client/websocket/handlers/TYPING_START.js +5 -0
  124. package/src/client/websocket/handlers/USER_UPDATE.js +5 -0
  125. package/src/client/websocket/handlers/VOICE_SERVER_UPDATE.js +6 -0
  126. package/src/client/websocket/handlers/VOICE_STATE_UPDATE.js +5 -0
  127. package/src/client/websocket/handlers/WEBHOOKS_UPDATE.js +5 -0
  128. package/src/client/websocket/handlers/index.js +64 -0
  129. package/src/errors/DJSError.js +48 -0
  130. package/src/errors/ErrorCodes.js +319 -0
  131. package/src/errors/Messages.js +170 -0
  132. package/src/errors/index.js +5 -0
  133. package/src/index.js +213 -0
  134. package/src/managers/ApplicationCommandManager.js +263 -0
  135. package/src/managers/ApplicationCommandPermissionsManager.js +434 -0
  136. package/src/managers/AutoModerationRuleManager.js +288 -0
  137. package/src/managers/BaseGuildEmojiManager.js +80 -0
  138. package/src/managers/BaseManager.js +19 -0
  139. package/src/managers/CachedManager.js +57 -0
  140. package/src/managers/CategoryChannelChildManager.js +77 -0
  141. package/src/managers/ChannelManager.js +128 -0
  142. package/src/managers/DataManager.js +61 -0
  143. package/src/managers/GuildApplicationCommandManager.js +28 -0
  144. package/src/managers/GuildBanManager.js +204 -0
  145. package/src/managers/GuildChannelManager.js +494 -0
  146. package/src/managers/GuildEmojiManager.js +174 -0
  147. package/src/managers/GuildEmojiRoleManager.js +118 -0
  148. package/src/managers/GuildForumThreadManager.js +83 -0
  149. package/src/managers/GuildInviteManager.js +213 -0
  150. package/src/managers/GuildManager.js +283 -0
  151. package/src/managers/GuildMemberManager.js +540 -0
  152. package/src/managers/GuildMemberRoleManager.js +204 -0
  153. package/src/managers/GuildScheduledEventManager.js +297 -0
  154. package/src/managers/GuildStickerManager.js +182 -0
  155. package/src/managers/GuildTextThreadManager.js +91 -0
  156. package/src/managers/MessageManager.js +259 -0
  157. package/src/managers/PermissionOverwriteManager.js +168 -0
  158. package/src/managers/PresenceManager.js +58 -0
  159. package/src/managers/ReactionManager.js +68 -0
  160. package/src/managers/ReactionUserManager.js +77 -0
  161. package/src/managers/RoleManager.js +360 -0
  162. package/src/managers/StageInstanceManager.js +154 -0
  163. package/src/managers/ThreadManager.js +204 -0
  164. package/src/managers/ThreadMemberManager.js +182 -0
  165. package/src/managers/UserManager.js +139 -0
  166. package/src/managers/VoiceStateManager.js +37 -0
  167. package/src/sharding/Shard.js +457 -0
  168. package/src/sharding/ShardClientUtil.js +285 -0
  169. package/src/sharding/ShardingManager.js +326 -0
  170. package/src/structures/ActionRow.js +46 -0
  171. package/src/structures/ActionRowBuilder.js +35 -0
  172. package/src/structures/AnonymousGuild.js +97 -0
  173. package/src/structures/ApplicationCommand.js +606 -0
  174. package/src/structures/ApplicationRoleConnectionMetadata.js +46 -0
  175. package/src/structures/Attachment.js +140 -0
  176. package/src/structures/AttachmentBuilder.js +116 -0
  177. package/src/structures/AutoModerationActionExecution.js +116 -0
  178. package/src/structures/AutoModerationRule.js +284 -0
  179. package/src/structures/AutocompleteInteraction.js +97 -0
  180. package/src/structures/Base.js +43 -0
  181. package/src/structures/BaseChannel.js +160 -0
  182. package/src/structures/BaseGuild.js +119 -0
  183. package/src/structures/BaseGuildEmoji.js +56 -0
  184. package/src/structures/BaseGuildTextChannel.js +186 -0
  185. package/src/structures/BaseGuildVoiceChannel.js +234 -0
  186. package/src/structures/BaseInteraction.js +344 -0
  187. package/src/structures/BaseSelectMenuComponent.js +56 -0
  188. package/src/structures/ButtonBuilder.js +44 -0
  189. package/src/structures/ButtonComponent.js +65 -0
  190. package/src/structures/ButtonInteraction.js +11 -0
  191. package/src/structures/CategoryChannel.js +45 -0
  192. package/src/structures/ChannelSelectMenuBuilder.js +31 -0
  193. package/src/structures/ChannelSelectMenuComponent.js +20 -0
  194. package/src/structures/ChannelSelectMenuInteraction.js +33 -0
  195. package/src/structures/ChatInputCommandInteraction.js +41 -0
  196. package/src/structures/ClientApplication.js +193 -0
  197. package/src/structures/ClientPresence.js +82 -0
  198. package/src/structures/ClientUser.js +185 -0
  199. package/src/structures/CommandInteraction.js +224 -0
  200. package/src/structures/CommandInteractionOptionResolver.js +308 -0
  201. package/src/structures/Component.js +47 -0
  202. package/src/structures/ContextMenuCommandInteraction.js +64 -0
  203. package/src/structures/DMChannel.js +129 -0
  204. package/src/structures/DirectoryChannel.js +36 -0
  205. package/src/structures/Embed.js +220 -0
  206. package/src/structures/EmbedBuilder.js +41 -0
  207. package/src/structures/Emoji.js +108 -0
  208. package/src/structures/ForumChannel.js +264 -0
  209. package/src/structures/Guild.js +1361 -0
  210. package/src/structures/GuildAuditLogs.js +91 -0
  211. package/src/structures/GuildAuditLogsEntry.js +527 -0
  212. package/src/structures/GuildBan.js +59 -0
  213. package/src/structures/GuildChannel.js +457 -0
  214. package/src/structures/GuildEmoji.js +148 -0
  215. package/src/structures/GuildMember.js +518 -0
  216. package/src/structures/GuildPreview.js +193 -0
  217. package/src/structures/GuildPreviewEmoji.js +27 -0
  218. package/src/structures/GuildScheduledEvent.js +439 -0
  219. package/src/structures/GuildTemplate.js +241 -0
  220. package/src/structures/Integration.js +220 -0
  221. package/src/structures/IntegrationApplication.js +85 -0
  222. package/src/structures/InteractionCollector.js +263 -0
  223. package/src/structures/InteractionResponse.js +102 -0
  224. package/src/structures/InteractionWebhook.js +59 -0
  225. package/src/structures/Invite.js +322 -0
  226. package/src/structures/InviteGuild.js +22 -0
  227. package/src/structures/InviteStageInstance.js +87 -0
  228. package/src/structures/MentionableSelectMenuBuilder.js +32 -0
  229. package/src/structures/MentionableSelectMenuComponent.js +11 -0
  230. package/src/structures/MentionableSelectMenuInteraction.js +71 -0
  231. package/src/structures/Message.js +997 -0
  232. package/src/structures/MessageCollector.js +146 -0
  233. package/src/structures/MessageComponentInteraction.js +107 -0
  234. package/src/structures/MessageContextMenuCommandInteraction.js +20 -0
  235. package/src/structures/MessageMentions.js +297 -0
  236. package/src/structures/MessagePayload.js +299 -0
  237. package/src/structures/MessageReaction.js +142 -0
  238. package/src/structures/ModalBuilder.js +34 -0
  239. package/src/structures/ModalSubmitFields.js +55 -0
  240. package/src/structures/ModalSubmitInteraction.js +121 -0
  241. package/src/structures/NewsChannel.js +32 -0
  242. package/src/structures/OAuth2Guild.js +28 -0
  243. package/src/structures/PartialGroupDMChannel.js +60 -0
  244. package/src/structures/PermissionOverwrites.js +196 -0
  245. package/src/structures/Presence.js +372 -0
  246. package/src/structures/ReactionCollector.js +229 -0
  247. package/src/structures/ReactionEmoji.js +31 -0
  248. package/src/structures/Role.js +458 -0
  249. package/src/structures/RoleSelectMenuBuilder.js +31 -0
  250. package/src/structures/RoleSelectMenuComponent.js +11 -0
  251. package/src/structures/RoleSelectMenuInteraction.js +33 -0
  252. package/src/structures/SelectMenuBuilder.js +26 -0
  253. package/src/structures/SelectMenuComponent.js +26 -0
  254. package/src/structures/SelectMenuInteraction.js +26 -0
  255. package/src/structures/SelectMenuOptionBuilder.js +26 -0
  256. package/src/structures/StageChannel.js +112 -0
  257. package/src/structures/StageInstance.js +167 -0
  258. package/src/structures/Sticker.js +272 -0
  259. package/src/structures/StickerPack.js +95 -0
  260. package/src/structures/StringSelectMenuBuilder.js +79 -0
  261. package/src/structures/StringSelectMenuComponent.js +20 -0
  262. package/src/structures/StringSelectMenuInteraction.js +21 -0
  263. package/src/structures/StringSelectMenuOptionBuilder.js +49 -0
  264. package/src/structures/Team.js +117 -0
  265. package/src/structures/TeamMember.js +70 -0
  266. package/src/structures/TextChannel.js +33 -0
  267. package/src/structures/TextInputBuilder.js +31 -0
  268. package/src/structures/TextInputComponent.js +29 -0
  269. package/src/structures/ThreadChannel.js +606 -0
  270. package/src/structures/ThreadMember.js +113 -0
  271. package/src/structures/Typing.js +74 -0
  272. package/src/structures/User.js +331 -0
  273. package/src/structures/UserContextMenuCommandInteraction.js +29 -0
  274. package/src/structures/UserSelectMenuBuilder.js +31 -0
  275. package/src/structures/UserSelectMenuComponent.js +11 -0
  276. package/src/structures/UserSelectMenuInteraction.js +51 -0
  277. package/src/structures/VoiceChannel.js +96 -0
  278. package/src/structures/VoiceRegion.js +46 -0
  279. package/src/structures/VoiceState.js +303 -0
  280. package/src/structures/Webhook.js +481 -0
  281. package/src/structures/WelcomeChannel.js +60 -0
  282. package/src/structures/WelcomeScreen.js +49 -0
  283. package/src/structures/Widget.js +88 -0
  284. package/src/structures/WidgetMember.js +99 -0
  285. package/src/structures/interfaces/Application.js +108 -0
  286. package/src/structures/interfaces/Collector.js +335 -0
  287. package/src/structures/interfaces/InteractionResponses.js +320 -0
  288. package/src/structures/interfaces/TextBasedChannel.js +413 -0
  289. package/src/util/APITypes.js +456 -0
  290. package/src/util/ActivityFlagsBitField.js +26 -0
  291. package/src/util/ApplicationFlagsBitField.js +26 -0
  292. package/src/util/BitField.js +176 -0
  293. package/src/util/ChannelFlagsBitField.js +41 -0
  294. package/src/util/Channels.js +150 -0
  295. package/src/util/Colors.js +73 -0
  296. package/src/util/Components.js +152 -0
  297. package/src/util/Constants.js +230 -0
  298. package/src/util/DataResolver.js +140 -0
  299. package/src/util/Enums.js +13 -0
  300. package/src/util/Events.js +160 -0
  301. package/src/util/Formatters.js +413 -0
  302. package/src/util/GuildMemberFlagsBitField.js +41 -0
  303. package/src/util/IntentsBitField.js +34 -0
  304. package/src/util/LimitedCollection.js +68 -0
  305. package/src/util/MessageFlagsBitField.js +32 -0
  306. package/src/util/Options.js +216 -0
  307. package/src/util/Partials.js +44 -0
  308. package/src/util/PermissionsBitField.js +104 -0
  309. package/src/util/ShardEvents.js +27 -0
  310. package/src/util/Status.js +33 -0
  311. package/src/util/Sweepers.js +467 -0
  312. package/src/util/SystemChannelFlagsBitField.js +43 -0
  313. package/src/util/ThreadMemberFlagsBitField.js +31 -0
  314. package/src/util/Transformers.js +36 -0
  315. package/src/util/UserFlagsBitField.js +32 -0
  316. package/src/util/Util.js +394 -0
  317. package/src/util/WebSocketShardEvents.js +25 -0
@@ -0,0 +1,299 @@
1
+ 'use strict';
2
+
3
+ const { Buffer } = require('node:buffer');
4
+ const { lazy, isJSONEncodable } = require('@discordjs/util');
5
+ const { MessageFlags } = require('discord-api-types/v10');
6
+ const ActionRowBuilder = require('./ActionRowBuilder');
7
+ const { DiscordjsRangeError, ErrorCodes } = require('../errors');
8
+ const DataResolver = require('../util/DataResolver');
9
+ const MessageFlagsBitField = require('../util/MessageFlagsBitField');
10
+ const { basename, verifyString } = require('../util/Util');
11
+
12
+ const getBaseInteraction = lazy(() => require('./BaseInteraction'));
13
+
14
+ /**
15
+ * Represents a message to be sent to the API.
16
+ */
17
+ class MessagePayload {
18
+ /**
19
+ * @param {MessageTarget} target The target for this message to be sent to
20
+ * @param {MessagePayloadOption} options The payload of this message
21
+ */
22
+ constructor(target, options) {
23
+ /**
24
+ * The target for this message to be sent to
25
+ * @type {MessageTarget}
26
+ */
27
+ this.target = target;
28
+
29
+ /**
30
+ * The payload of this message.
31
+ * @type {MessagePayloadOption}
32
+ */
33
+ this.options = options;
34
+
35
+ /**
36
+ * Body sendable to the API
37
+ * @type {?APIMessage}
38
+ */
39
+ this.body = null;
40
+
41
+ /**
42
+ * Files sendable to the API
43
+ * @type {?RawFile[]}
44
+ */
45
+ this.files = null;
46
+ }
47
+
48
+ /**
49
+ * Whether or not the target is a {@link Webhook} or a {@link WebhookClient}
50
+ * @type {boolean}
51
+ * @readonly
52
+ */
53
+ get isWebhook() {
54
+ const Webhook = require('./Webhook');
55
+ const WebhookClient = require('../client/WebhookClient');
56
+ return this.target instanceof Webhook || this.target instanceof WebhookClient;
57
+ }
58
+
59
+ /**
60
+ * Whether or not the target is a {@link User}
61
+ * @type {boolean}
62
+ * @readonly
63
+ */
64
+ get isUser() {
65
+ const User = require('./User');
66
+ const { GuildMember } = require('./GuildMember');
67
+ return this.target instanceof User || this.target instanceof GuildMember;
68
+ }
69
+
70
+ /**
71
+ * Whether or not the target is a {@link Message}
72
+ * @type {boolean}
73
+ * @readonly
74
+ */
75
+ get isMessage() {
76
+ const { Message } = require('./Message');
77
+ return this.target instanceof Message;
78
+ }
79
+
80
+ /**
81
+ * Whether or not the target is a {@link MessageManager}
82
+ * @type {boolean}
83
+ * @readonly
84
+ */
85
+ get isMessageManager() {
86
+ const MessageManager = require('../managers/MessageManager');
87
+ return this.target instanceof MessageManager;
88
+ }
89
+
90
+ /**
91
+ * Whether or not the target is an {@link BaseInteraction} or an {@link InteractionWebhook}
92
+ * @type {boolean}
93
+ * @readonly
94
+ */
95
+ get isInteraction() {
96
+ const BaseInteraction = getBaseInteraction();
97
+ const InteractionWebhook = require('./InteractionWebhook');
98
+ return this.target instanceof BaseInteraction || this.target instanceof InteractionWebhook;
99
+ }
100
+
101
+ /**
102
+ * Makes the content of this message.
103
+ * @returns {?string}
104
+ */
105
+ makeContent() {
106
+ let content;
107
+ if (this.options.content === null) {
108
+ content = '';
109
+ } else if (this.options.content !== undefined) {
110
+ content = verifyString(this.options.content, DiscordjsRangeError, ErrorCodes.MessageContentType, true);
111
+ }
112
+
113
+ return content;
114
+ }
115
+
116
+ /**
117
+ * Resolves the body.
118
+ * @returns {MessagePayload}
119
+ */
120
+ resolveBody() {
121
+ if (this.body) return this;
122
+ const isInteraction = this.isInteraction;
123
+ const isWebhook = this.isWebhook;
124
+
125
+ const content = this.makeContent();
126
+ const tts = Boolean(this.options.tts);
127
+
128
+ let nonce;
129
+ if (this.options.nonce !== undefined) {
130
+ nonce = this.options.nonce;
131
+ if (typeof nonce === 'number' ? !Number.isInteger(nonce) : typeof nonce !== 'string') {
132
+ throw new DiscordjsRangeError(ErrorCodes.MessageNonceType);
133
+ }
134
+ }
135
+
136
+ const components = this.options.components?.map(c => (isJSONEncodable(c) ? c : new ActionRowBuilder(c)).toJSON());
137
+
138
+ let username;
139
+ let avatarURL;
140
+ let threadName;
141
+ if (isWebhook) {
142
+ username = this.options.username ?? this.target.name;
143
+ if (this.options.avatarURL) avatarURL = this.options.avatarURL;
144
+ if (this.options.threadName) threadName = this.options.threadName;
145
+ }
146
+
147
+ let flags;
148
+ if (
149
+ this.options.flags !== undefined ||
150
+ (this.isMessage && this.options.reply === undefined) ||
151
+ this.isMessageManager
152
+ ) {
153
+ flags =
154
+ // eslint-disable-next-line eqeqeq
155
+ this.options.flags != null
156
+ ? new MessageFlagsBitField(this.options.flags).bitfield
157
+ : this.target.flags?.bitfield;
158
+ }
159
+
160
+ if (isInteraction && this.options.ephemeral) {
161
+ flags |= MessageFlags.Ephemeral;
162
+ }
163
+
164
+ let allowedMentions =
165
+ this.options.allowedMentions === undefined
166
+ ? this.target.client.options.allowedMentions
167
+ : this.options.allowedMentions;
168
+
169
+ if (allowedMentions?.repliedUser !== undefined) {
170
+ allowedMentions = { ...allowedMentions, replied_user: allowedMentions.repliedUser };
171
+ delete allowedMentions.repliedUser;
172
+ }
173
+
174
+ let message_reference;
175
+ if (typeof this.options.reply === 'object') {
176
+ const reference = this.options.reply.messageReference;
177
+ const message_id = this.isMessage ? reference.id ?? reference : this.target.messages.resolveId(reference);
178
+ if (message_id) {
179
+ message_reference = {
180
+ message_id,
181
+ fail_if_not_exists: this.options.reply.failIfNotExists ?? this.target.client.options.failIfNotExists,
182
+ };
183
+ }
184
+ }
185
+
186
+ const attachments = this.options.files?.map((file, index) => ({
187
+ id: index.toString(),
188
+ description: file.description,
189
+ }));
190
+ if (Array.isArray(this.options.attachments)) {
191
+ this.options.attachments.push(...(attachments ?? []));
192
+ } else {
193
+ this.options.attachments = attachments;
194
+ }
195
+
196
+ this.body = {
197
+ content,
198
+ tts,
199
+ nonce,
200
+ embeds: this.options.embeds?.map(embed =>
201
+ isJSONEncodable(embed) ? embed.toJSON() : this.target.client.options.jsonTransformer(embed),
202
+ ),
203
+ components,
204
+ username,
205
+ avatar_url: avatarURL,
206
+ allowed_mentions: content === undefined && message_reference === undefined ? undefined : allowedMentions,
207
+ flags,
208
+ message_reference,
209
+ attachments: this.options.attachments,
210
+ sticker_ids: this.options.stickers?.map(sticker => sticker.id ?? sticker),
211
+ thread_name: threadName,
212
+ };
213
+ return this;
214
+ }
215
+
216
+ /**
217
+ * Resolves files.
218
+ * @returns {Promise<MessagePayload>}
219
+ */
220
+ async resolveFiles() {
221
+ if (this.files) return this;
222
+
223
+ this.files = await Promise.all(this.options.files?.map(file => this.constructor.resolveFile(file)) ?? []);
224
+ return this;
225
+ }
226
+
227
+ /**
228
+ * Resolves a single file into an object sendable to the API.
229
+ * @param {AttachmentPayload|BufferResolvable|Stream} fileLike Something that could be resolved to a file
230
+ * @returns {Promise<RawFile>}
231
+ */
232
+ static async resolveFile(fileLike) {
233
+ let attachment;
234
+ let name;
235
+
236
+ const findName = thing => {
237
+ if (typeof thing === 'string') {
238
+ return basename(thing);
239
+ }
240
+
241
+ if (thing.path) {
242
+ return basename(thing.path);
243
+ }
244
+
245
+ return 'file.jpg';
246
+ };
247
+
248
+ const ownAttachment =
249
+ typeof fileLike === 'string' || fileLike instanceof Buffer || typeof fileLike.pipe === 'function';
250
+ if (ownAttachment) {
251
+ attachment = fileLike;
252
+ name = findName(attachment);
253
+ } else {
254
+ attachment = fileLike.attachment;
255
+ name = fileLike.name ?? findName(attachment);
256
+ }
257
+
258
+ const { data, contentType } = await DataResolver.resolveFile(attachment);
259
+ return { data, name, contentType };
260
+ }
261
+
262
+ /**
263
+ * Creates a {@link MessagePayload} from user-level arguments.
264
+ * @param {MessageTarget} target Target to send to
265
+ * @param {string|MessagePayloadOption} options Options or content to use
266
+ * @param {MessagePayloadOption} [extra={}] Extra options to add onto specified options
267
+ * @returns {MessagePayload}
268
+ */
269
+ static create(target, options, extra = {}) {
270
+ return new this(
271
+ target,
272
+ typeof options !== 'object' || options === null ? { content: options, ...extra } : { ...options, ...extra },
273
+ );
274
+ }
275
+ }
276
+
277
+ module.exports = MessagePayload;
278
+
279
+ /**
280
+ * A target for a message.
281
+ * @typedef {TextBasedChannels|User|GuildMember|Webhook|WebhookClient|BaseInteraction|InteractionWebhook|
282
+ * Message|MessageManager} MessageTarget
283
+ */
284
+
285
+ /**
286
+ * A possible payload option.
287
+ * @typedef {MessageCreateOptions|MessageEditOptions|WebhookMessageCreateOptions|WebhookMessageEditOptions|
288
+ * InteractionReplyOptions|InteractionUpdateOptions} MessagePayloadOption
289
+ */
290
+
291
+ /**
292
+ * @external APIMessage
293
+ * @see {@link https://discord.com/developers/docs/resources/channel#message-object}
294
+ */
295
+
296
+ /**
297
+ * @external RawFile
298
+ * @see {@link https://discord.js.org/docs/packages/rest/stable/RawFile:Interface}
299
+ */
@@ -0,0 +1,142 @@
1
+ 'use strict';
2
+
3
+ const { Routes } = require('discord-api-types/v10');
4
+ const GuildEmoji = require('./GuildEmoji');
5
+ const ReactionEmoji = require('./ReactionEmoji');
6
+ const ReactionUserManager = require('../managers/ReactionUserManager');
7
+ const { flatten } = require('../util/Util');
8
+
9
+ /**
10
+ * Represents a reaction to a message.
11
+ */
12
+ class MessageReaction {
13
+ constructor(client, data, message) {
14
+ /**
15
+ * The client that instantiated this message reaction
16
+ * @name MessageReaction#client
17
+ * @type {Client}
18
+ * @readonly
19
+ */
20
+ Object.defineProperty(this, 'client', { value: client });
21
+
22
+ /**
23
+ * The message that this reaction refers to
24
+ * @type {Message}
25
+ */
26
+ this.message = message;
27
+
28
+ /**
29
+ * Whether the client has given this reaction
30
+ * @type {boolean}
31
+ */
32
+ this.me = data.me;
33
+
34
+ /**
35
+ * A manager of the users that have given this reaction
36
+ * @type {ReactionUserManager}
37
+ */
38
+ this.users = new ReactionUserManager(this, this.me ? [client.user] : []);
39
+
40
+ this._emoji = new ReactionEmoji(this, data.emoji);
41
+
42
+ this._patch(data);
43
+ }
44
+
45
+ _patch(data) {
46
+ if ('count' in data) {
47
+ /**
48
+ * The number of people that have given the same reaction
49
+ * @type {?number}
50
+ */
51
+ this.count ??= data.count;
52
+ }
53
+ }
54
+
55
+ /**
56
+ * Makes the client user react with this reaction
57
+ * @returns {Promise<MessageReaction>}
58
+ */
59
+ react() {
60
+ return this.message.react(this.emoji);
61
+ }
62
+
63
+ /**
64
+ * Removes all users from this reaction.
65
+ * @returns {Promise<MessageReaction>}
66
+ */
67
+ async remove() {
68
+ await this.client.rest.delete(
69
+ Routes.channelMessageReaction(this.message.channelId, this.message.id, this._emoji.identifier),
70
+ );
71
+ return this;
72
+ }
73
+
74
+ /**
75
+ * The emoji of this reaction. Either a {@link GuildEmoji} object for known custom emojis, or a {@link ReactionEmoji}
76
+ * object which has fewer properties. Whatever the prototype of the emoji, it will still have
77
+ * `name`, `id`, `identifier` and `toString()`
78
+ * @type {GuildEmoji|ReactionEmoji}
79
+ * @readonly
80
+ */
81
+ get emoji() {
82
+ if (this._emoji instanceof GuildEmoji) return this._emoji;
83
+ // Check to see if the emoji has become known to the client
84
+ if (this._emoji.id) {
85
+ const emojis = this.message.client.emojis.cache;
86
+ if (emojis.has(this._emoji.id)) {
87
+ const emoji = emojis.get(this._emoji.id);
88
+ this._emoji = emoji;
89
+ return emoji;
90
+ }
91
+ }
92
+ return this._emoji;
93
+ }
94
+
95
+ /**
96
+ * Whether or not this reaction is a partial
97
+ * @type {boolean}
98
+ * @readonly
99
+ */
100
+ get partial() {
101
+ return this.count === null;
102
+ }
103
+
104
+ /**
105
+ * Fetch this reaction.
106
+ * @returns {Promise<MessageReaction>}
107
+ */
108
+ async fetch() {
109
+ const message = await this.message.fetch();
110
+ const existing = message.reactions.cache.get(this.emoji.id ?? this.emoji.name);
111
+ // The reaction won't get set when it has been completely removed
112
+ this._patch(existing ?? { count: 0 });
113
+ return this;
114
+ }
115
+
116
+ toJSON() {
117
+ return flatten(this, { emoji: 'emojiId', message: 'messageId' });
118
+ }
119
+
120
+ valueOf() {
121
+ return this._emoji.id ?? this._emoji.name;
122
+ }
123
+
124
+ _add(user) {
125
+ if (this.partial) return;
126
+ this.users.cache.set(user.id, user);
127
+ if (!this.me || user.id !== this.message.client.user.id || this.count === 0) this.count++;
128
+ this.me ||= user.id === this.message.client.user.id;
129
+ }
130
+
131
+ _remove(user) {
132
+ if (this.partial) return;
133
+ this.users.cache.delete(user.id);
134
+ if (!this.me || user.id !== this.message.client.user.id) this.count--;
135
+ if (user.id === this.message.client.user.id) this.me = false;
136
+ if (this.count <= 0 && this.users.cache.size === 0) {
137
+ this.message.reactions.cache.delete(this.emoji.id ?? this.emoji.name);
138
+ }
139
+ }
140
+ }
141
+
142
+ module.exports = MessageReaction;
@@ -0,0 +1,34 @@
1
+ 'use strict';
2
+
3
+ const { ModalBuilder: BuildersModal, ComponentBuilder } = require('@discordjs/builders');
4
+ const { isJSONEncodable } = require('@discordjs/util');
5
+ const { toSnakeCase } = require('../util/Transformers');
6
+
7
+ /**
8
+ * Represents a modal builder.
9
+ * @extends {BuildersModal}
10
+ */
11
+ class ModalBuilder extends BuildersModal {
12
+ constructor({ components, ...data } = {}) {
13
+ super({
14
+ ...toSnakeCase(data),
15
+ components: components?.map(c => (c instanceof ComponentBuilder ? c : toSnakeCase(c))),
16
+ });
17
+ }
18
+
19
+ /**
20
+ * Creates a new modal builder from JSON data
21
+ * @param {ModalBuilder|APIModalComponent} other The other data
22
+ * @returns {ModalBuilder}
23
+ */
24
+ static from(other) {
25
+ return new this(isJSONEncodable(other) ? other.toJSON() : other);
26
+ }
27
+ }
28
+
29
+ module.exports = ModalBuilder;
30
+
31
+ /**
32
+ * @external BuildersModal
33
+ * @see {@link https://discord.js.org/docs/packages/builders/stable/ModalBuilder:Class}
34
+ */
@@ -0,0 +1,55 @@
1
+ 'use strict';
2
+
3
+ const { Collection } = require('@discordjs/collection');
4
+ const { ComponentType } = require('discord-api-types/v10');
5
+ const { DiscordjsTypeError, ErrorCodes } = require('../errors');
6
+
7
+ /**
8
+ * Represents the serialized fields from a modal submit interaction
9
+ */
10
+ class ModalSubmitFields {
11
+ constructor(components) {
12
+ /**
13
+ * The components within the modal
14
+ * @type {ActionRowModalData[]}
15
+ */
16
+ this.components = components;
17
+
18
+ /**
19
+ * The extracted fields from the modal
20
+ * @type {Collection<string, ModalData>}
21
+ */
22
+ this.fields = components.reduce((accumulator, next) => {
23
+ next.components.forEach(c => accumulator.set(c.customId, c));
24
+ return accumulator;
25
+ }, new Collection());
26
+ }
27
+
28
+ /**
29
+ * Gets a field given a custom id from a component
30
+ * @param {string} customId The custom id of the component
31
+ * @param {ComponentType} [type] The type of the component
32
+ * @returns {ModalData}
33
+ */
34
+ getField(customId, type) {
35
+ const field = this.fields.get(customId);
36
+ if (!field) throw new DiscordjsTypeError(ErrorCodes.ModalSubmitInteractionFieldNotFound, customId);
37
+
38
+ if (type !== undefined && type !== field.type) {
39
+ throw new DiscordjsTypeError(ErrorCodes.ModalSubmitInteractionFieldType, customId, field.type, type);
40
+ }
41
+
42
+ return field;
43
+ }
44
+
45
+ /**
46
+ * Gets the value of a text input component given a custom id
47
+ * @param {string} customId The custom id of the text input component
48
+ * @returns {string}
49
+ */
50
+ getTextInputValue(customId) {
51
+ return this.getField(customId, ComponentType.TextInput).value;
52
+ }
53
+ }
54
+
55
+ module.exports = ModalSubmitFields;
@@ -0,0 +1,121 @@
1
+ 'use strict';
2
+
3
+ const { lazy } = require('@discordjs/util');
4
+ const BaseInteraction = require('./BaseInteraction');
5
+ const InteractionWebhook = require('./InteractionWebhook');
6
+ const ModalSubmitFields = require('./ModalSubmitFields');
7
+ const InteractionResponses = require('./interfaces/InteractionResponses');
8
+
9
+ const getMessage = lazy(() => require('./Message').Message);
10
+
11
+ /**
12
+ * @typedef {Object} ModalData
13
+ * @property {string} value The value of the field
14
+ * @property {ComponentType} type The component type of the field
15
+ * @property {string} customId The custom id of the field
16
+ */
17
+
18
+ /**
19
+ * @typedef {Object} ActionRowModalData
20
+ * @property {ModalData[]} components The components of this action row
21
+ * @property {ComponentType} type The component type of the action row
22
+ */
23
+
24
+ /**
25
+ * Represents a modal interaction
26
+ * @extends {BaseInteraction}
27
+ * @implements {InteractionResponses}
28
+ */
29
+ class ModalSubmitInteraction extends BaseInteraction {
30
+ constructor(client, data) {
31
+ super(client, data);
32
+ /**
33
+ * The custom id of the modal.
34
+ * @type {string}
35
+ */
36
+ this.customId = data.data.custom_id;
37
+
38
+ if ('message' in data) {
39
+ /**
40
+ * The message associated with this interaction
41
+ * @type {?Message}
42
+ */
43
+ this.message = this.channel?.messages._add(data.message) ?? new (getMessage())(this.client, data.message);
44
+ } else {
45
+ this.message = null;
46
+ }
47
+
48
+ /**
49
+ * The components within the modal
50
+ * @type {ActionRowModalData[]}
51
+ */
52
+ this.components = data.data.components?.map(c => ModalSubmitInteraction.transformComponent(c));
53
+
54
+ /**
55
+ * The fields within the modal
56
+ * @type {ModalSubmitFields}
57
+ */
58
+ this.fields = new ModalSubmitFields(this.components);
59
+
60
+ /**
61
+ * Whether the reply to this interaction has been deferred
62
+ * @type {boolean}
63
+ */
64
+ this.deferred = false;
65
+
66
+ /**
67
+ * Whether this interaction has already been replied to
68
+ * @type {boolean}
69
+ */
70
+ this.replied = false;
71
+
72
+ /**
73
+ * Whether the reply to this interaction is ephemeral
74
+ * @type {?boolean}
75
+ */
76
+ this.ephemeral = null;
77
+
78
+ /**
79
+ * An associated interaction webhook, can be used to further interact with this interaction
80
+ * @type {InteractionWebhook}
81
+ */
82
+ this.webhook = new InteractionWebhook(this.client, this.applicationId, this.token);
83
+ }
84
+
85
+ /**
86
+ * Transforms component data to discord.js-compatible data
87
+ * @param {*} rawComponent The data to transform
88
+ * @returns {ModalData[]}
89
+ */
90
+ static transformComponent(rawComponent) {
91
+ return {
92
+ value: rawComponent.value,
93
+ type: rawComponent.type,
94
+ customId: rawComponent.custom_id,
95
+ components: rawComponent.components?.map(c => this.transformComponent(c)),
96
+ };
97
+ }
98
+
99
+ /**
100
+ * Whether this is from a {@link MessageComponentInteraction}.
101
+ * @returns {boolean}
102
+ */
103
+ isFromMessage() {
104
+ return Boolean(this.message);
105
+ }
106
+
107
+ // These are here only for documentation purposes - they are implemented by InteractionResponses
108
+ /* eslint-disable no-empty-function */
109
+ deferReply() {}
110
+ reply() {}
111
+ fetchReply() {}
112
+ editReply() {}
113
+ deleteReply() {}
114
+ followUp() {}
115
+ deferUpdate() {}
116
+ update() {}
117
+ }
118
+
119
+ InteractionResponses.applyToClass(ModalSubmitInteraction, 'showModal');
120
+
121
+ module.exports = ModalSubmitInteraction;
@@ -0,0 +1,32 @@
1
+ 'use strict';
2
+
3
+ const { Routes } = require('discord-api-types/v10');
4
+ const BaseGuildTextChannel = require('./BaseGuildTextChannel');
5
+ const { DiscordjsError, ErrorCodes } = require('../errors');
6
+
7
+ /**
8
+ * Represents a guild news channel on Discord.
9
+ * @extends {BaseGuildTextChannel}
10
+ */
11
+ class NewsChannel extends BaseGuildTextChannel {
12
+ /**
13
+ * Adds the target to this channel's followers.
14
+ * @param {TextChannelResolvable} channel The channel where the webhook should be created
15
+ * @param {string} [reason] Reason for creating the webhook
16
+ * @returns {Promise<NewsChannel>}
17
+ * @example
18
+ * if (channel.type === ChannelType.GuildAnnouncement) {
19
+ * channel.addFollower('222197033908436994', 'Important announcements')
20
+ * .then(() => console.log('Added follower'))
21
+ * .catch(console.error);
22
+ * }
23
+ */
24
+ async addFollower(channel, reason) {
25
+ const channelId = this.guild.channels.resolveId(channel);
26
+ if (!channelId) throw new DiscordjsError(ErrorCodes.GuildChannelResolve);
27
+ await this.client.rest.post(Routes.channelFollowers(this.id), { body: { webhook_channel_id: channelId }, reason });
28
+ return this;
29
+ }
30
+ }
31
+
32
+ module.exports = NewsChannel;