@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,220 @@
1
+ 'use strict';
2
+
3
+ const { embedLength } = require('@discordjs/builders');
4
+ const isEqual = require('fast-deep-equal');
5
+
6
+ /**
7
+ * Represents an embed.
8
+ */
9
+ class Embed {
10
+ constructor(data) {
11
+ /**
12
+ * The API embed data.
13
+ * @type {APIEmbed}
14
+ * @readonly
15
+ */
16
+ this.data = { ...data };
17
+ }
18
+
19
+ /**
20
+ * An array of fields of this embed.
21
+ * @type {Array<APIEmbedField>}
22
+ * @readonly
23
+ */
24
+ get fields() {
25
+ return this.data.fields ?? [];
26
+ }
27
+
28
+ /**
29
+ * The title of this embed.
30
+ * @type {?string}
31
+ * @readonly
32
+ */
33
+ get title() {
34
+ return this.data.title ?? null;
35
+ }
36
+
37
+ /**
38
+ * The description of this embed.
39
+ * @type {?string}
40
+ * @readonly
41
+ */
42
+ get description() {
43
+ return this.data.description ?? null;
44
+ }
45
+
46
+ /**
47
+ * The URL of this embed.
48
+ * @type {?string}
49
+ * @readonly
50
+ */
51
+ get url() {
52
+ return this.data.url ?? null;
53
+ }
54
+
55
+ /**
56
+ * The color of this embed.
57
+ * @type {?number}
58
+ * @readonly
59
+ */
60
+ get color() {
61
+ return this.data.color ?? null;
62
+ }
63
+
64
+ /**
65
+ * The timestamp of this embed. This is in an ISO 8601 format.
66
+ * @type {?string}
67
+ * @readonly
68
+ */
69
+ get timestamp() {
70
+ return this.data.timestamp ?? null;
71
+ }
72
+
73
+ /**
74
+ * @typedef {Object} EmbedAssetData
75
+ * @property {?string} url The URL of the image
76
+ * @property {?string} proxyURL The proxy URL of the image
77
+ * @property {?number} height The height of the image
78
+ * @property {?number} width The width of the image
79
+ */
80
+
81
+ /**
82
+ * The thumbnail of this embed.
83
+ * @type {?EmbedAssetData}
84
+ * @readonly
85
+ */
86
+ get thumbnail() {
87
+ if (!this.data.thumbnail) return null;
88
+ return {
89
+ url: this.data.thumbnail.url,
90
+ proxyURL: this.data.thumbnail.proxy_url,
91
+ height: this.data.thumbnail.height,
92
+ width: this.data.thumbnail.width,
93
+ };
94
+ }
95
+
96
+ /**
97
+ * The image of this embed.
98
+ * @type {?EmbedAssetData}
99
+ * @readonly
100
+ */
101
+ get image() {
102
+ if (!this.data.image) return null;
103
+ return {
104
+ url: this.data.image.url,
105
+ proxyURL: this.data.image.proxy_url,
106
+ height: this.data.image.height,
107
+ width: this.data.image.width,
108
+ };
109
+ }
110
+
111
+ /**
112
+ * The video of this embed.
113
+ * @type {?EmbedAssetData}
114
+ * @readonly
115
+ */
116
+ get video() {
117
+ if (!this.data.video) return null;
118
+ return {
119
+ url: this.data.video.url,
120
+ proxyURL: this.data.video.proxy_url,
121
+ height: this.data.video.height,
122
+ width: this.data.video.width,
123
+ };
124
+ }
125
+
126
+ /**
127
+ * @typedef {Object} EmbedAuthorData
128
+ * @property {string} name The name of the author
129
+ * @property {?string} url The URL of the author
130
+ * @property {?string} iconURL The icon URL of the author
131
+ * @property {?string} proxyIconURL The proxy icon URL of the author
132
+ */
133
+
134
+ /**
135
+ * The author of this embed.
136
+ * @type {?EmbedAuthorData}
137
+ * @readonly
138
+ */
139
+ get author() {
140
+ if (!this.data.author) return null;
141
+ return {
142
+ name: this.data.author.name,
143
+ url: this.data.author.url,
144
+ iconURL: this.data.author.icon_url,
145
+ proxyIconURL: this.data.author.proxy_icon_url,
146
+ };
147
+ }
148
+
149
+ /**
150
+ * The provider of this embed.
151
+ * @type {?APIEmbedProvider}
152
+ * @readonly
153
+ */
154
+ get provider() {
155
+ return this.data.provider ?? null;
156
+ }
157
+
158
+ /**
159
+ * @typedef {Object} EmbedFooterData
160
+ * @property {string} text The text of the footer
161
+ * @property {?string} iconURL The URL of the icon
162
+ * @property {?string} proxyIconURL The proxy URL of the icon
163
+ */
164
+
165
+ /**
166
+ * The footer of this embed.
167
+ * @type {?EmbedFooterData}
168
+ * @readonly
169
+ */
170
+ get footer() {
171
+ if (!this.data.footer) return null;
172
+ return {
173
+ text: this.data.footer.text,
174
+ iconURL: this.data.footer.icon_url,
175
+ proxyIconURL: this.data.footer.proxy_icon_url,
176
+ };
177
+ }
178
+
179
+ /**
180
+ * The accumulated length for the embed title, description, fields, footer text, and author name.
181
+ * @type {number}
182
+ * @readonly
183
+ */
184
+ get length() {
185
+ return embedLength(this.data);
186
+ }
187
+
188
+ /**
189
+ * The hex color of this embed.
190
+ * @type {?string}
191
+ * @readonly
192
+ */
193
+ get hexColor() {
194
+ return typeof this.data.color === 'number'
195
+ ? `#${this.data.color.toString(16).padStart(6, '0')}`
196
+ : this.data.color ?? null;
197
+ }
198
+
199
+ /**
200
+ * Returns the API-compatible JSON for this embed.
201
+ * @returns {APIEmbed}
202
+ */
203
+ toJSON() {
204
+ return { ...this.data };
205
+ }
206
+
207
+ /**
208
+ * Whether the given embeds are equal.
209
+ * @param {Embed|APIEmbed} other The embed to compare against
210
+ * @returns {boolean}
211
+ */
212
+ equals(other) {
213
+ if (other instanceof Embed) {
214
+ return isEqual(other.data, this.data);
215
+ }
216
+ return isEqual(other, this.data);
217
+ }
218
+ }
219
+
220
+ module.exports = Embed;
@@ -0,0 +1,41 @@
1
+ 'use strict';
2
+
3
+ const { EmbedBuilder: BuildersEmbed } = require('@discordjs/builders');
4
+ const { isJSONEncodable } = require('@discordjs/util');
5
+ const { toSnakeCase } = require('../util/Transformers');
6
+ const { resolveColor } = require('../util/Util');
7
+
8
+ /**
9
+ * Represents an embed builder.
10
+ * @extends {BuildersEmbed}
11
+ */
12
+ class EmbedBuilder extends BuildersEmbed {
13
+ constructor(data) {
14
+ super(toSnakeCase(data));
15
+ }
16
+
17
+ /**
18
+ * Sets the color of this embed
19
+ * @param {?ColorResolvable} color The color of the embed
20
+ * @returns {EmbedBuilder}
21
+ */
22
+ setColor(color) {
23
+ return super.setColor(color && resolveColor(color));
24
+ }
25
+
26
+ /**
27
+ * Creates a new embed builder from JSON data
28
+ * @param {EmbedBuilder|Embed|APIEmbed} other The other data
29
+ * @returns {EmbedBuilder}
30
+ */
31
+ static from(other) {
32
+ return new this(isJSONEncodable(other) ? other.toJSON() : other);
33
+ }
34
+ }
35
+
36
+ module.exports = EmbedBuilder;
37
+
38
+ /**
39
+ * @external BuildersEmbed
40
+ * @see {@link https://discord.js.org/docs/packages/builders/stable/EmbedBuilder:Class}
41
+ */
@@ -0,0 +1,108 @@
1
+ 'use strict';
2
+
3
+ const { DiscordSnowflake } = require('@sapphire/snowflake');
4
+ const Base = require('./Base');
5
+
6
+ /**
7
+ * Represents raw emoji data from the API
8
+ * @typedef {APIEmoji} RawEmoji
9
+ * @property {?Snowflake} id The emoji's id
10
+ * @property {?string} name The emoji's name
11
+ * @property {?boolean} animated Whether the emoji is animated
12
+ */
13
+
14
+ /**
15
+ * Represents an emoji, see {@link GuildEmoji} and {@link ReactionEmoji}.
16
+ * @extends {Base}
17
+ */
18
+ class Emoji extends Base {
19
+ constructor(client, emoji) {
20
+ super(client);
21
+ /**
22
+ * Whether or not the emoji is animated
23
+ * @type {?boolean}
24
+ */
25
+ this.animated = emoji.animated ?? null;
26
+
27
+ /**
28
+ * The emoji's name
29
+ * @type {?string}
30
+ */
31
+ this.name = emoji.name ?? null;
32
+
33
+ /**
34
+ * The emoji's id
35
+ * @type {?Snowflake}
36
+ */
37
+ this.id = emoji.id;
38
+ }
39
+
40
+ /**
41
+ * The identifier of this emoji, used for message reactions
42
+ * @type {string}
43
+ * @readonly
44
+ */
45
+ get identifier() {
46
+ if (this.id) return `${this.animated ? 'a:' : ''}${this.name}:${this.id}`;
47
+ return encodeURIComponent(this.name);
48
+ }
49
+
50
+ /**
51
+ * The URL to the emoji file if it's a custom emoji
52
+ * @type {?string}
53
+ * @readonly
54
+ */
55
+ get url() {
56
+ return this.id && this.client.rest.cdn.emoji(this.id, this.animated ? 'gif' : 'png');
57
+ }
58
+
59
+ /**
60
+ * The timestamp the emoji was created at, or null if unicode
61
+ * @type {?number}
62
+ * @readonly
63
+ */
64
+ get createdTimestamp() {
65
+ return this.id && DiscordSnowflake.timestampFrom(this.id);
66
+ }
67
+
68
+ /**
69
+ * The time the emoji was created at, or null if unicode
70
+ * @type {?Date}
71
+ * @readonly
72
+ */
73
+ get createdAt() {
74
+ return this.id && new Date(this.createdTimestamp);
75
+ }
76
+
77
+ /**
78
+ * When concatenated with a string, this automatically returns the text required to form a graphical emoji on Discord
79
+ * instead of the Emoji object.
80
+ * @returns {string}
81
+ * @example
82
+ * // Send a custom emoji from a guild:
83
+ * const emoji = guild.emojis.cache.first();
84
+ * msg.channel.send(`Hello! ${emoji}`);
85
+ * @example
86
+ * // Send the emoji used in a reaction to the channel the reaction is part of
87
+ * reaction.message.channel.send(`The emoji used was: ${reaction.emoji}`);
88
+ */
89
+ toString() {
90
+ return this.id ? `<${this.animated ? 'a' : ''}:${this.name}:${this.id}>` : this.name;
91
+ }
92
+
93
+ toJSON() {
94
+ return super.toJSON({
95
+ guild: 'guildId',
96
+ createdTimestamp: true,
97
+ url: true,
98
+ identifier: true,
99
+ });
100
+ }
101
+ }
102
+
103
+ exports.Emoji = Emoji;
104
+
105
+ /**
106
+ * @external APIEmoji
107
+ * @see {@link https://discord.com/developers/docs/resources/emoji#emoji-object}
108
+ */
@@ -0,0 +1,264 @@
1
+ 'use strict';
2
+
3
+ const GuildChannel = require('./GuildChannel');
4
+ const TextBasedChannel = require('./interfaces/TextBasedChannel');
5
+ const GuildForumThreadManager = require('../managers/GuildForumThreadManager');
6
+ const { transformAPIGuildForumTag, transformAPIGuildDefaultReaction } = require('../util/Channels');
7
+
8
+ /**
9
+ * @typedef {Object} GuildForumTagEmoji
10
+ * @property {?Snowflake} id The id of a guild's custom emoji
11
+ * @property {?string} name The unicode character of the emoji
12
+ */
13
+
14
+ /**
15
+ * @typedef {Object} GuildForumTag
16
+ * @property {Snowflake} id The id of the tag
17
+ * @property {string} name The name of the tag
18
+ * @property {boolean} moderated Whether this tag can only be added to or removed from threads
19
+ * by a member with the `ManageThreads` permission
20
+ * @property {?GuildForumTagEmoji} emoji The emoji of this tag
21
+ */
22
+
23
+ /**
24
+ * @typedef {Object} GuildForumTagData
25
+ * @property {Snowflake} [id] The id of the tag
26
+ * @property {string} name The name of the tag
27
+ * @property {boolean} [moderated] Whether this tag can only be added to or removed from threads
28
+ * by a member with the `ManageThreads` permission
29
+ * @property {?GuildForumTagEmoji} [emoji] The emoji of this tag
30
+ */
31
+
32
+ /**
33
+ * @typedef {Object} DefaultReactionEmoji
34
+ * @property {?Snowflake} id The id of a guild's custom emoji
35
+ * @property {?string} name The unicode character of the emoji
36
+ */
37
+
38
+ /**
39
+ * Represents a channel that only contains threads
40
+ * @extends {GuildChannel}
41
+ * @implements {TextBasedChannel}
42
+ */
43
+ class ForumChannel extends GuildChannel {
44
+ constructor(guild, data, client) {
45
+ super(guild, data, client, false);
46
+
47
+ /**
48
+ * A manager of the threads belonging to this channel
49
+ * @type {GuildForumThreadManager}
50
+ */
51
+ this.threads = new GuildForumThreadManager(this);
52
+
53
+ this._patch(data);
54
+ }
55
+
56
+ _patch(data) {
57
+ super._patch(data);
58
+ if ('available_tags' in data) {
59
+ /**
60
+ * The set of tags that can be used in this channel.
61
+ * @type {GuildForumTag[]}
62
+ */
63
+ this.availableTags = data.available_tags.map(tag => transformAPIGuildForumTag(tag));
64
+ } else {
65
+ this.availableTags ??= [];
66
+ }
67
+
68
+ if ('default_reaction_emoji' in data) {
69
+ /**
70
+ * The emoji to show in the add reaction button on a thread in a guild forum channel
71
+ * @type {?DefaultReactionEmoji}
72
+ */
73
+ this.defaultReactionEmoji = data.default_reaction_emoji
74
+ ? transformAPIGuildDefaultReaction(data.default_reaction_emoji)
75
+ : null;
76
+ } else {
77
+ this.defaultReactionEmoji ??= null;
78
+ }
79
+
80
+ if ('default_thread_rate_limit_per_user' in data) {
81
+ /**
82
+ * The initial rate limit per user (slowmode) to set on newly created threads in a channel.
83
+ * @type {?number}
84
+ */
85
+ this.defaultThreadRateLimitPerUser = data.default_thread_rate_limit_per_user;
86
+ } else {
87
+ this.defaultThreadRateLimitPerUser ??= null;
88
+ }
89
+
90
+ if ('rate_limit_per_user' in data) {
91
+ /**
92
+ * The rate limit per user (slowmode) for this channel.
93
+ * @type {?number}
94
+ */
95
+ this.rateLimitPerUser = data.rate_limit_per_user;
96
+ } else {
97
+ this.rateLimitPerUser ??= null;
98
+ }
99
+
100
+ if ('default_auto_archive_duration' in data) {
101
+ /**
102
+ * The default auto archive duration for newly created threads in this channel.
103
+ * @type {?ThreadAutoArchiveDuration}
104
+ */
105
+ this.defaultAutoArchiveDuration = data.default_auto_archive_duration;
106
+ } else {
107
+ this.defaultAutoArchiveDuration ??= null;
108
+ }
109
+
110
+ if ('nsfw' in data) {
111
+ /**
112
+ * If this channel is considered NSFW.
113
+ * @type {boolean}
114
+ */
115
+ this.nsfw = data.nsfw;
116
+ } else {
117
+ this.nsfw ??= false;
118
+ }
119
+
120
+ if ('topic' in data) {
121
+ /**
122
+ * The topic of this channel.
123
+ * @type {?string}
124
+ */
125
+ this.topic = data.topic;
126
+ }
127
+
128
+ if ('default_sort_order' in data) {
129
+ /**
130
+ * The default sort order mode used to order posts
131
+ * @type {?SortOrderType}
132
+ */
133
+ this.defaultSortOrder = data.default_sort_order;
134
+ } else {
135
+ this.defaultSortOrder ??= null;
136
+ }
137
+
138
+ /**
139
+ * The default layout type used to display posts
140
+ * @type {ForumLayoutType}
141
+ */
142
+ this.defaultForumLayout = data.default_forum_layout;
143
+ }
144
+
145
+ /**
146
+ * Sets the available tags for this forum channel
147
+ * @param {GuildForumTagData[]} availableTags The tags to set as available in this channel
148
+ * @param {string} [reason] Reason for changing the available tags
149
+ * @returns {Promise<ForumChannel>}
150
+ */
151
+ setAvailableTags(availableTags, reason) {
152
+ return this.edit({ availableTags, reason });
153
+ }
154
+
155
+ /**
156
+ * Sets the default reaction emoji for this channel
157
+ * @param {?DefaultReactionEmoji} defaultReactionEmoji The emoji to set as the default reaction emoji
158
+ * @param {string} [reason] Reason for changing the default reaction emoji
159
+ * @returns {Promise<ForumChannel>}
160
+ */
161
+ setDefaultReactionEmoji(defaultReactionEmoji, reason) {
162
+ return this.edit({ defaultReactionEmoji, reason });
163
+ }
164
+
165
+ /**
166
+ * Sets the default rate limit per user (slowmode) for new threads in this channel
167
+ * @param {number} defaultThreadRateLimitPerUser The rate limit to set on newly created threads in this channel
168
+ * @param {string} [reason] Reason for changing the default rate limit
169
+ * @returns {Promise<ForumChannel>}
170
+ */
171
+ setDefaultThreadRateLimitPerUser(defaultThreadRateLimitPerUser, reason) {
172
+ return this.edit({ defaultThreadRateLimitPerUser, reason });
173
+ }
174
+
175
+ /**
176
+ * Creates an invite to this guild channel.
177
+ * @param {InviteCreateOptions} [options={}] The options for creating the invite
178
+ * @returns {Promise<Invite>}
179
+ * @example
180
+ * // Create an invite to a channel
181
+ * channel.createInvite()
182
+ * .then(invite => console.log(`Created an invite with a code of ${invite.code}`))
183
+ * .catch(console.error);
184
+ */
185
+ createInvite(options) {
186
+ return this.guild.invites.create(this.id, options);
187
+ }
188
+
189
+ /**
190
+ * Fetches a collection of invites to this guild channel.
191
+ * Resolves with a collection mapping invites by their codes.
192
+ * @param {boolean} [cache=true] Whether to cache the fetched invites
193
+ * @returns {Promise<Collection<string, Invite>>}
194
+ */
195
+ fetchInvites(cache) {
196
+ return this.guild.invites.fetch({ channelId: this.id, cache });
197
+ }
198
+
199
+ /**
200
+ * Sets the default auto archive duration for all newly created threads in this channel.
201
+ * @param {ThreadAutoArchiveDuration} defaultAutoArchiveDuration The new default auto archive duration
202
+ * @param {string} [reason] Reason for changing the channel's default auto archive duration
203
+ * @returns {Promise<ForumChannel>}
204
+ */
205
+ setDefaultAutoArchiveDuration(defaultAutoArchiveDuration, reason) {
206
+ return this.edit({ defaultAutoArchiveDuration, reason });
207
+ }
208
+
209
+ /**
210
+ * Sets a new topic for the guild channel.
211
+ * @param {?string} topic The new topic for the guild channel
212
+ * @param {string} [reason] Reason for changing the guild channel's topic
213
+ * @returns {Promise<ForumChannel>}
214
+ * @example
215
+ * // Set a new channel topic
216
+ * channel.setTopic('needs more rate limiting')
217
+ * .then(newChannel => console.log(`Channel's new topic is ${newChannel.topic}`))
218
+ * .catch(console.error);
219
+ */
220
+ setTopic(topic, reason) {
221
+ return this.edit({ topic, reason });
222
+ }
223
+
224
+ /**
225
+ * Sets the default sort order mode used to order posts
226
+ * @param {?SortOrderType} defaultSortOrder The default sort order mode to set on this channel
227
+ * @param {string} [reason] Reason for changing the default sort order
228
+ * @returns {Promise<ForumChannel>}
229
+ */
230
+ setDefaultSortOrder(defaultSortOrder, reason) {
231
+ return this.edit({ defaultSortOrder, reason });
232
+ }
233
+
234
+ /**
235
+ * Sets the default forum layout type used to display posts
236
+ * @param {ForumLayoutType} defaultForumLayout The default forum layout type to set on this channel
237
+ * @param {string} [reason] Reason for changing the default forum layout
238
+ * @returns {Promise<ForumChannel>}
239
+ */
240
+ setDefaultForumLayout(defaultForumLayout, reason) {
241
+ return this.edit({ defaultForumLayout, reason });
242
+ }
243
+
244
+ // These are here only for documentation purposes - they are implemented by TextBasedChannel
245
+ /* eslint-disable no-empty-function */
246
+ createWebhook() {}
247
+ fetchWebhooks() {}
248
+ setNSFW() {}
249
+ setRateLimitPerUser() {}
250
+ }
251
+
252
+ TextBasedChannel.applyToClass(ForumChannel, true, [
253
+ 'send',
254
+ 'lastMessage',
255
+ 'lastPinAt',
256
+ 'bulkDelete',
257
+ 'sendTyping',
258
+ 'createMessageCollector',
259
+ 'awaitMessages',
260
+ 'createMessageComponentCollector',
261
+ 'awaitMessageComponent',
262
+ ]);
263
+
264
+ module.exports = ForumChannel;