@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 { Routes } = require('discord-api-types/v10');
4
+ const Base = require('./Base');
5
+ const IntegrationApplication = require('./IntegrationApplication');
6
+
7
+ /**
8
+ * The information account for an integration
9
+ * @typedef {Object} IntegrationAccount
10
+ * @property {Snowflake|string} id The id of the account
11
+ * @property {string} name The name of the account
12
+ */
13
+
14
+ /**
15
+ * The type of an {@link Integration}. This can be:
16
+ * * `twitch`
17
+ * * `youtube`
18
+ * * `discord`
19
+ * * `guild_subscription`
20
+ * @typedef {string} IntegrationType
21
+ */
22
+
23
+ /**
24
+ * Represents a guild integration.
25
+ * @extends {Base}
26
+ */
27
+ class Integration extends Base {
28
+ constructor(client, data, guild) {
29
+ super(client);
30
+
31
+ /**
32
+ * The guild this integration belongs to
33
+ * @type {Guild}
34
+ */
35
+ this.guild = guild;
36
+
37
+ /**
38
+ * The integration id
39
+ * @type {Snowflake|string}
40
+ */
41
+ this.id = data.id;
42
+
43
+ /**
44
+ * The integration name
45
+ * @type {string}
46
+ */
47
+ this.name = data.name;
48
+
49
+ /**
50
+ * The integration type
51
+ * @type {IntegrationType}
52
+ */
53
+ this.type = data.type;
54
+
55
+ /**
56
+ * Whether this integration is enabled
57
+ * @type {?boolean}
58
+ */
59
+ this.enabled = data.enabled ?? null;
60
+
61
+ if ('syncing' in data) {
62
+ /**
63
+ * Whether this integration is syncing
64
+ * @type {?boolean}
65
+ */
66
+ this.syncing = data.syncing;
67
+ } else {
68
+ this.syncing ??= null;
69
+ }
70
+
71
+ /**
72
+ * The role that this integration uses for subscribers
73
+ * @type {?Role}
74
+ */
75
+ this.role = this.guild.roles.resolve(data.role_id);
76
+
77
+ if ('enable_emoticons' in data) {
78
+ /**
79
+ * Whether emoticons should be synced for this integration (twitch only currently)
80
+ * @type {?boolean}
81
+ */
82
+ this.enableEmoticons = data.enable_emoticons;
83
+ } else {
84
+ this.enableEmoticons ??= null;
85
+ }
86
+
87
+ if (data.user) {
88
+ /**
89
+ * The user for this integration
90
+ * @type {?User}
91
+ */
92
+ this.user = this.client.users._add(data.user);
93
+ } else {
94
+ this.user ??= null;
95
+ }
96
+
97
+ /**
98
+ * The account integration information
99
+ * @type {IntegrationAccount}
100
+ */
101
+ this.account = data.account;
102
+
103
+ if ('synced_at' in data) {
104
+ /**
105
+ * The timestamp at which this integration was last synced at
106
+ * @type {?number}
107
+ */
108
+ this.syncedTimestamp = Date.parse(data.synced_at);
109
+ } else {
110
+ this.syncedTimestamp ??= null;
111
+ }
112
+
113
+ if ('subscriber_count' in data) {
114
+ /**
115
+ * How many subscribers this integration has
116
+ * @type {?number}
117
+ */
118
+ this.subscriberCount = data.subscriber_count;
119
+ } else {
120
+ this.subscriberCount ??= null;
121
+ }
122
+
123
+ if ('revoked' in data) {
124
+ /**
125
+ * Whether this integration has been revoked
126
+ * @type {?boolean}
127
+ */
128
+ this.revoked = data.revoked;
129
+ } else {
130
+ this.revoked ??= null;
131
+ }
132
+
133
+ this._patch(data);
134
+ }
135
+
136
+ /**
137
+ * The date at which this integration was last synced at
138
+ * @type {?Date}
139
+ * @readonly
140
+ */
141
+ get syncedAt() {
142
+ return this.syncedTimestamp && new Date(this.syncedTimestamp);
143
+ }
144
+
145
+ /**
146
+ * All roles that are managed by this integration
147
+ * @type {Collection<Snowflake, Role>}
148
+ * @readonly
149
+ */
150
+ get roles() {
151
+ const roles = this.guild.roles.cache;
152
+ return roles.filter(role => role.tags?.integrationId === this.id);
153
+ }
154
+
155
+ _patch(data) {
156
+ if ('expire_behavior' in data) {
157
+ /**
158
+ * The behavior of expiring subscribers
159
+ * @type {?IntegrationExpireBehavior}
160
+ */
161
+ this.expireBehavior = data.expire_behavior;
162
+ } else {
163
+ this.expireBehavior ??= null;
164
+ }
165
+
166
+ if ('expire_grace_period' in data) {
167
+ /**
168
+ * The grace period (in days) before expiring subscribers
169
+ * @type {?number}
170
+ */
171
+ this.expireGracePeriod = data.expire_grace_period;
172
+ } else {
173
+ this.expireGracePeriod ??= null;
174
+ }
175
+
176
+ if ('application' in data) {
177
+ if (this.application) {
178
+ this.application._patch(data.application);
179
+ } else {
180
+ /**
181
+ * The application for this integration
182
+ * @type {?IntegrationApplication}
183
+ */
184
+ this.application = new IntegrationApplication(this.client, data.application);
185
+ }
186
+ } else {
187
+ this.application ??= null;
188
+ }
189
+
190
+ if ('scopes' in data) {
191
+ /**
192
+ * The scopes this application has been authorized for
193
+ * @type {OAuth2Scopes[]}
194
+ */
195
+ this.scopes = data.scopes;
196
+ } else {
197
+ this.scopes ??= [];
198
+ }
199
+ }
200
+
201
+ /**
202
+ * Deletes this integration.
203
+ * @returns {Promise<Integration>}
204
+ * @param {string} [reason] Reason for deleting this integration
205
+ */
206
+ async delete(reason) {
207
+ await this.client.rest.delete(Routes.guildIntegration(this.guild.id, this.id), { reason });
208
+ return this;
209
+ }
210
+
211
+ toJSON() {
212
+ return super.toJSON({
213
+ role: 'roleId',
214
+ guild: 'guildId',
215
+ user: 'userId',
216
+ });
217
+ }
218
+ }
219
+
220
+ module.exports = Integration;
@@ -0,0 +1,85 @@
1
+ 'use strict';
2
+
3
+ const Application = require('./interfaces/Application');
4
+
5
+ /**
6
+ * Represents an Integration's OAuth2 Application.
7
+ * @extends {Application}
8
+ */
9
+ class IntegrationApplication extends Application {
10
+ _patch(data) {
11
+ super._patch(data);
12
+
13
+ if ('bot' in data) {
14
+ /**
15
+ * The bot user for this application
16
+ * @type {?User}
17
+ */
18
+ this.bot = this.client.users._add(data.bot);
19
+ } else {
20
+ this.bot ??= null;
21
+ }
22
+
23
+ if ('terms_of_service_url' in data) {
24
+ /**
25
+ * The URL of the application's terms of service
26
+ * @type {?string}
27
+ */
28
+ this.termsOfServiceURL = data.terms_of_service_url;
29
+ } else {
30
+ this.termsOfServiceURL ??= null;
31
+ }
32
+
33
+ if ('privacy_policy_url' in data) {
34
+ /**
35
+ * The URL of the application's privacy policy
36
+ * @type {?string}
37
+ */
38
+ this.privacyPolicyURL = data.privacy_policy_url;
39
+ } else {
40
+ this.privacyPolicyURL ??= null;
41
+ }
42
+
43
+ if ('rpc_origins' in data) {
44
+ /**
45
+ * The Array of RPC origin URLs
46
+ * @type {string[]}
47
+ */
48
+ this.rpcOrigins = data.rpc_origins;
49
+ } else {
50
+ this.rpcOrigins ??= [];
51
+ }
52
+
53
+ if ('hook' in data) {
54
+ /**
55
+ * Whether the application can be default hooked by the client
56
+ * @type {?boolean}
57
+ */
58
+ this.hook = data.hook;
59
+ } else {
60
+ this.hook ??= null;
61
+ }
62
+
63
+ if ('cover_image' in data) {
64
+ /**
65
+ * The hash of the application's cover image
66
+ * @type {?string}
67
+ */
68
+ this.cover = data.cover_image;
69
+ } else {
70
+ this.cover ??= null;
71
+ }
72
+
73
+ if ('verify_key' in data) {
74
+ /**
75
+ * The hex-encoded key for verification in interactions and the GameSDK's GetTicket
76
+ * @type {?string}
77
+ */
78
+ this.verifyKey = data.verify_key;
79
+ } else {
80
+ this.verifyKey ??= null;
81
+ }
82
+ }
83
+ }
84
+
85
+ module.exports = IntegrationApplication;
@@ -0,0 +1,263 @@
1
+ 'use strict';
2
+
3
+ const { Collection } = require('@discordjs/collection');
4
+ const Collector = require('./interfaces/Collector');
5
+ const Events = require('../util/Events');
6
+
7
+ /**
8
+ * @typedef {CollectorOptions} InteractionCollectorOptions
9
+ * @property {TextBasedChannelsResolvable} [channel] The channel to listen to interactions from
10
+ * @property {ComponentType} [componentType] The type of component to listen for
11
+ * @property {GuildResolvable} [guild] The guild to listen to interactions from
12
+ * @property {InteractionType} [interactionType] The type of interaction to listen for
13
+ * @property {number} [max] The maximum total amount of interactions to collect
14
+ * @property {number} [maxComponents] The maximum number of components to collect
15
+ * @property {number} [maxUsers] The maximum number of users to interact
16
+ * @property {Message|APIMessage} [message] The message to listen to interactions from
17
+ * @property {InteractionResponse} [interactionResponse] The interaction response to listen
18
+ * to message component interactions from
19
+ */
20
+
21
+ /**
22
+ * Collects interactions.
23
+ * Will automatically stop if the message ({@link Client#event:messageDelete messageDelete} or
24
+ * {@link Client#event:messageDeleteBulk messageDeleteBulk}),
25
+ * channel ({@link Client#event:channelDelete channelDelete}), or
26
+ * guild ({@link Client#event:guildDelete guildDelete}) is deleted.
27
+ * <info>Interaction collectors that do not specify `time` or `idle` may be prone to always running.
28
+ * Ensure your interaction collectors end via either of these options or manual cancellation.</info>
29
+ * @extends {Collector}
30
+ */
31
+ class InteractionCollector extends Collector {
32
+ /**
33
+ * @param {Client} client The client on which to collect interactions
34
+ * @param {InteractionCollectorOptions} [options={}] The options to apply to this collector
35
+ */
36
+ constructor(client, options = {}) {
37
+ super(client, options);
38
+
39
+ /**
40
+ * The message from which to collect interactions, if provided
41
+ * @type {?Snowflake}
42
+ */
43
+ this.messageId = options.message?.id ?? null;
44
+
45
+ /**
46
+ * The message interaction id from which to collect interactions, if provided
47
+ * @type {?Snowflake}
48
+ */
49
+ this.messageInteractionId = options.interactionResponse?.id ?? null;
50
+
51
+ /**
52
+ * The channel from which to collect interactions, if provided
53
+ * @type {?Snowflake}
54
+ */
55
+ this.channelId =
56
+ options.interactionResponse?.interaction.channelId ??
57
+ options.message?.channelId ??
58
+ options.message?.channel_id ??
59
+ this.client.channels.resolveId(options.channel);
60
+
61
+ /**
62
+ * The guild from which to collect interactions, if provided
63
+ * @type {?Snowflake}
64
+ */
65
+ this.guildId =
66
+ options.interactionResponse?.interaction.guildId ??
67
+ options.message?.guildId ??
68
+ options.message?.guild_id ??
69
+ this.client.guilds.resolveId(options.channel?.guild) ??
70
+ this.client.guilds.resolveId(options.guild);
71
+
72
+ /**
73
+ * The type of interaction to collect
74
+ * @type {?InteractionType}
75
+ */
76
+ this.interactionType = options.interactionType ?? null;
77
+
78
+ /**
79
+ * The type of component to collect
80
+ * @type {?ComponentType}
81
+ */
82
+ this.componentType = options.componentType ?? null;
83
+
84
+ /**
85
+ * The users that have interacted with this collector
86
+ * @type {Collection<Snowflake, User>}
87
+ */
88
+ this.users = new Collection();
89
+
90
+ /**
91
+ * The total number of interactions collected
92
+ * @type {number}
93
+ */
94
+ this.total = 0;
95
+
96
+ this.client.incrementMaxListeners();
97
+
98
+ const bulkDeleteListener = messages => {
99
+ if (messages.has(this.messageId)) this.stop('messageDelete');
100
+ };
101
+
102
+ if (this.messageId || this.messageInteractionId) {
103
+ this._handleMessageDeletion = this._handleMessageDeletion.bind(this);
104
+ this.client.on(Events.MessageDelete, this._handleMessageDeletion);
105
+ this.client.on(Events.MessageBulkDelete, bulkDeleteListener);
106
+ }
107
+
108
+ if (this.channelId) {
109
+ this._handleChannelDeletion = this._handleChannelDeletion.bind(this);
110
+ this._handleThreadDeletion = this._handleThreadDeletion.bind(this);
111
+ this.client.on(Events.ChannelDelete, this._handleChannelDeletion);
112
+ this.client.on(Events.ThreadDelete, this._handleThreadDeletion);
113
+ }
114
+
115
+ if (this.guildId) {
116
+ this._handleGuildDeletion = this._handleGuildDeletion.bind(this);
117
+ this.client.on(Events.GuildDelete, this._handleGuildDeletion);
118
+ }
119
+
120
+ this.client.on(Events.InteractionCreate, this.handleCollect);
121
+
122
+ this.once('end', () => {
123
+ this.client.removeListener(Events.InteractionCreate, this.handleCollect);
124
+ this.client.removeListener(Events.MessageDelete, this._handleMessageDeletion);
125
+ this.client.removeListener(Events.MessageBulkDelete, bulkDeleteListener);
126
+ this.client.removeListener(Events.ChannelDelete, this._handleChannelDeletion);
127
+ this.client.removeListener(Events.ThreadDelete, this._handleThreadDeletion);
128
+ this.client.removeListener(Events.GuildDelete, this._handleGuildDeletion);
129
+ this.client.decrementMaxListeners();
130
+ });
131
+
132
+ this.on('collect', interaction => {
133
+ this.total++;
134
+ this.users.set(interaction.user.id, interaction.user);
135
+ });
136
+ }
137
+
138
+ /**
139
+ * Handles an incoming interaction for possible collection.
140
+ * @param {BaseInteraction} interaction The interaction to possibly collect
141
+ * @returns {?Snowflake}
142
+ * @private
143
+ */
144
+ collect(interaction) {
145
+ /**
146
+ * Emitted whenever an interaction is collected.
147
+ * @event InteractionCollector#collect
148
+ * @param {BaseInteraction} interaction The interaction that was collected
149
+ */
150
+
151
+ if (this.interactionType && interaction.type !== this.interactionType) return null;
152
+ if (this.componentType && interaction.componentType !== this.componentType) return null;
153
+ if (this.messageId && interaction.message?.id !== this.messageId) return null;
154
+ if (
155
+ this.messageInteractionId &&
156
+ interaction.message?.interaction?.id &&
157
+ interaction.message.interaction.id !== this.messageInteractionId
158
+ ) {
159
+ return null;
160
+ }
161
+ if (this.channelId && interaction.channelId !== this.channelId) return null;
162
+ if (this.guildId && interaction.guildId !== this.guildId) return null;
163
+
164
+ return interaction.id;
165
+ }
166
+
167
+ /**
168
+ * Handles an interaction for possible disposal.
169
+ * @param {BaseInteraction} interaction The interaction that could be disposed of
170
+ * @returns {?Snowflake}
171
+ */
172
+ dispose(interaction) {
173
+ /**
174
+ * Emitted whenever an interaction is disposed of.
175
+ * @event InteractionCollector#dispose
176
+ * @param {BaseInteraction} interaction The interaction that was disposed of
177
+ */
178
+ if (this.type && interaction.type !== this.type) return null;
179
+ if (this.componentType && interaction.componentType !== this.componentType) return null;
180
+ if (this.messageId && interaction.message?.id !== this.messageId) return null;
181
+ if (this.messageInteractionId && interaction.message?.interaction?.id !== this.messageInteractionId) return null;
182
+ if (this.channelId && interaction.channelId !== this.channelId) return null;
183
+ if (this.guildId && interaction.guildId !== this.guildId) return null;
184
+
185
+ return interaction.id;
186
+ }
187
+
188
+ /**
189
+ * Empties this interaction collector.
190
+ */
191
+ empty() {
192
+ this.total = 0;
193
+ this.collected.clear();
194
+ this.users.clear();
195
+ this.checkEnd();
196
+ }
197
+
198
+ /**
199
+ * The reason this collector has ended with, or null if it hasn't ended yet
200
+ * @type {?string}
201
+ * @readonly
202
+ */
203
+ get endReason() {
204
+ if (this.options.max && this.total >= this.options.max) return 'limit';
205
+ if (this.options.maxComponents && this.collected.size >= this.options.maxComponents) return 'componentLimit';
206
+ if (this.options.maxUsers && this.users.size >= this.options.maxUsers) return 'userLimit';
207
+ return super.endReason;
208
+ }
209
+
210
+ /**
211
+ * Handles checking if the message has been deleted, and if so, stops the collector with the reason 'messageDelete'.
212
+ * @private
213
+ * @param {Message} message The message that was deleted
214
+ * @returns {void}
215
+ */
216
+ _handleMessageDeletion(message) {
217
+ if (message.id === this.messageId) {
218
+ this.stop('messageDelete');
219
+ }
220
+
221
+ if (message.interaction?.id === this.messageInteractionId) {
222
+ this.stop('messageDelete');
223
+ }
224
+ }
225
+
226
+ /**
227
+ * Handles checking if the channel has been deleted, and if so, stops the collector with the reason 'channelDelete'.
228
+ * @private
229
+ * @param {GuildChannel} channel The channel that was deleted
230
+ * @returns {void}
231
+ */
232
+ _handleChannelDeletion(channel) {
233
+ if (channel.id === this.channelId || channel.threads?.cache.has(this.channelId)) {
234
+ this.stop('channelDelete');
235
+ }
236
+ }
237
+
238
+ /**
239
+ * Handles checking if the thread has been deleted, and if so, stops the collector with the reason 'threadDelete'.
240
+ * @private
241
+ * @param {ThreadChannel} thread The thread that was deleted
242
+ * @returns {void}
243
+ */
244
+ _handleThreadDeletion(thread) {
245
+ if (thread.id === this.channelId) {
246
+ this.stop('threadDelete');
247
+ }
248
+ }
249
+
250
+ /**
251
+ * Handles checking if the guild has been deleted, and if so, stops the collector with the reason 'guildDelete'.
252
+ * @private
253
+ * @param {Guild} guild The guild that was deleted
254
+ * @returns {void}
255
+ */
256
+ _handleGuildDeletion(guild) {
257
+ if (guild.id === this.guildId) {
258
+ this.stop('guildDelete');
259
+ }
260
+ }
261
+ }
262
+
263
+ module.exports = InteractionCollector;
@@ -0,0 +1,102 @@
1
+ 'use strict';
2
+
3
+ const { DiscordSnowflake } = require('@sapphire/snowflake');
4
+ const { InteractionType } = require('discord-api-types/v10');
5
+ const { DiscordjsError, ErrorCodes } = require('../errors');
6
+
7
+ /**
8
+ * Represents an interaction's response
9
+ */
10
+ class InteractionResponse {
11
+ constructor(interaction, id) {
12
+ /**
13
+ * The interaction associated with the interaction response
14
+ * @type {BaseInteraction}
15
+ */
16
+ this.interaction = interaction;
17
+ /**
18
+ * The id of the original interaction response
19
+ * @type {Snowflake}
20
+ */
21
+ this.id = id ?? interaction.id;
22
+ this.client = interaction.client;
23
+ }
24
+
25
+ /**
26
+ * The timestamp the interaction response was created at
27
+ * @type {number}
28
+ * @readonly
29
+ */
30
+ get createdTimestamp() {
31
+ return DiscordSnowflake.timestampFrom(this.id);
32
+ }
33
+
34
+ /**
35
+ * The time the interaction response was created at
36
+ * @type {Date}
37
+ * @readonly
38
+ */
39
+ get createdAt() {
40
+ return new Date(this.createdTimestamp);
41
+ }
42
+
43
+ /**
44
+ * Collects a single component interaction that passes the filter.
45
+ * The Promise will reject if the time expires.
46
+ * @param {AwaitMessageComponentOptions} [options={}] Options to pass to the internal collector
47
+ * @returns {Promise<MessageComponentInteraction>}
48
+ */
49
+ awaitMessageComponent(options = {}) {
50
+ const _options = { ...options, max: 1 };
51
+ return new Promise((resolve, reject) => {
52
+ const collector = this.createMessageComponentCollector(_options);
53
+ collector.once('end', (interactions, reason) => {
54
+ const interaction = interactions.first();
55
+ if (interaction) resolve(interaction);
56
+ else reject(new DiscordjsError(ErrorCodes.InteractionCollectorError, reason));
57
+ });
58
+ });
59
+ }
60
+
61
+ /**
62
+ * Creates a message component interaction collector
63
+ * @param {MessageComponentCollectorOptions} [options={}] Options to send to the collector
64
+ * @returns {InteractionCollector}
65
+ */
66
+ createMessageComponentCollector(options = {}) {
67
+ return new InteractionCollector(this.client, {
68
+ ...options,
69
+ interactionResponse: this,
70
+ interactionType: InteractionType.MessageComponent,
71
+ });
72
+ }
73
+
74
+ /**
75
+ * Fetches the response as a {@link Message} object.
76
+ * @returns {Promise<Message>}
77
+ */
78
+ fetch() {
79
+ return this.interaction.fetchReply();
80
+ }
81
+
82
+ /**
83
+ * Deletes the response.
84
+ * @returns {Promise<void>}
85
+ */
86
+ delete() {
87
+ return this.interaction.deleteReply();
88
+ }
89
+
90
+ /**
91
+ * Edits the response.
92
+ * @param {string|MessagePayload|WebhookMessageEditOptions} options The new options for the response.
93
+ * @returns {Promise<Message>}
94
+ */
95
+ edit(options) {
96
+ return this.interaction.editReply(options);
97
+ }
98
+ }
99
+
100
+ // eslint-disable-next-line import/order
101
+ const InteractionCollector = require('./InteractionCollector');
102
+ module.exports = InteractionResponse;