discord-sb.js 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 (366) hide show
  1. package/LICENSE +674 -0
  2. package/README.md +2 -0
  3. package/package.json +91 -0
  4. package/src/WebSocket.js +39 -0
  5. package/src/client/BaseClient.js +86 -0
  6. package/src/client/Client.js +978 -0
  7. package/src/client/WebhookClient.js +61 -0
  8. package/src/client/actions/Action.js +116 -0
  9. package/src/client/actions/ActionsManager.js +80 -0
  10. package/src/client/actions/ApplicationCommandPermissionsUpdate.js +34 -0
  11. package/src/client/actions/AutoModerationActionExecution.js +27 -0
  12. package/src/client/actions/AutoModerationRuleCreate.js +28 -0
  13. package/src/client/actions/AutoModerationRuleDelete.js +32 -0
  14. package/src/client/actions/AutoModerationRuleUpdate.js +30 -0
  15. package/src/client/actions/ChannelCreate.js +23 -0
  16. package/src/client/actions/ChannelDelete.js +39 -0
  17. package/src/client/actions/ChannelUpdate.js +43 -0
  18. package/src/client/actions/GuildAuditLogEntryCreate.js +29 -0
  19. package/src/client/actions/GuildBanAdd.js +20 -0
  20. package/src/client/actions/GuildBanRemove.js +25 -0
  21. package/src/client/actions/GuildChannelsPositionUpdate.js +21 -0
  22. package/src/client/actions/GuildDelete.js +65 -0
  23. package/src/client/actions/GuildEmojiCreate.js +20 -0
  24. package/src/client/actions/GuildEmojiDelete.js +21 -0
  25. package/src/client/actions/GuildEmojiUpdate.js +20 -0
  26. package/src/client/actions/GuildEmojisUpdate.js +34 -0
  27. package/src/client/actions/GuildIntegrationsUpdate.js +19 -0
  28. package/src/client/actions/GuildMemberRemove.js +33 -0
  29. package/src/client/actions/GuildMemberUpdate.js +44 -0
  30. package/src/client/actions/GuildRoleCreate.js +25 -0
  31. package/src/client/actions/GuildRoleDelete.js +31 -0
  32. package/src/client/actions/GuildRoleUpdate.js +39 -0
  33. package/src/client/actions/GuildRolesPositionUpdate.js +21 -0
  34. package/src/client/actions/GuildScheduledEventCreate.js +27 -0
  35. package/src/client/actions/GuildScheduledEventDelete.js +31 -0
  36. package/src/client/actions/GuildScheduledEventUpdate.js +30 -0
  37. package/src/client/actions/GuildScheduledEventUserAdd.js +32 -0
  38. package/src/client/actions/GuildScheduledEventUserRemove.js +32 -0
  39. package/src/client/actions/GuildStickerCreate.js +20 -0
  40. package/src/client/actions/GuildStickerDelete.js +21 -0
  41. package/src/client/actions/GuildStickerUpdate.js +20 -0
  42. package/src/client/actions/GuildStickersUpdate.js +34 -0
  43. package/src/client/actions/GuildUpdate.js +33 -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 +50 -0
  47. package/src/client/actions/MessageDelete.js +32 -0
  48. package/src/client/actions/MessageDeleteBulk.js +46 -0
  49. package/src/client/actions/MessagePollVoteAdd.js +33 -0
  50. package/src/client/actions/MessagePollVoteRemove.js +33 -0
  51. package/src/client/actions/MessageReactionAdd.js +68 -0
  52. package/src/client/actions/MessageReactionRemove.js +50 -0
  53. package/src/client/actions/MessageReactionRemoveAll.js +33 -0
  54. package/src/client/actions/MessageReactionRemoveEmoji.js +28 -0
  55. package/src/client/actions/MessageUpdate.js +26 -0
  56. package/src/client/actions/PresenceUpdate.js +50 -0
  57. package/src/client/actions/StageInstanceCreate.js +28 -0
  58. package/src/client/actions/StageInstanceDelete.js +33 -0
  59. package/src/client/actions/StageInstanceUpdate.js +30 -0
  60. package/src/client/actions/ThreadCreate.js +24 -0
  61. package/src/client/actions/ThreadDelete.js +32 -0
  62. package/src/client/actions/ThreadListSync.js +59 -0
  63. package/src/client/actions/ThreadMemberUpdate.js +30 -0
  64. package/src/client/actions/ThreadMembersUpdate.js +34 -0
  65. package/src/client/actions/TypingStart.js +29 -0
  66. package/src/client/actions/UserUpdate.js +35 -0
  67. package/src/client/actions/VoiceStateUpdate.js +50 -0
  68. package/src/client/actions/WebhooksUpdate.js +20 -0
  69. package/src/client/voice/ClientVoiceManager.js +151 -0
  70. package/src/client/voice/VoiceConnection.js +1249 -0
  71. package/src/client/voice/dispatcher/AnnexBDispatcher.js +120 -0
  72. package/src/client/voice/dispatcher/AudioDispatcher.js +145 -0
  73. package/src/client/voice/dispatcher/BaseDispatcher.js +459 -0
  74. package/src/client/voice/dispatcher/VPxDispatcher.js +54 -0
  75. package/src/client/voice/dispatcher/VideoDispatcher.js +68 -0
  76. package/src/client/voice/networking/VoiceUDPClient.js +173 -0
  77. package/src/client/voice/networking/VoiceWebSocket.js +286 -0
  78. package/src/client/voice/player/MediaPlayer.js +321 -0
  79. package/src/client/voice/player/processing/AnnexBNalSplitter.js +244 -0
  80. package/src/client/voice/player/processing/IvfSplitter.js +106 -0
  81. package/src/client/voice/player/processing/PCMInsertSilence.js +37 -0
  82. package/src/client/voice/receiver/PacketHandler.js +260 -0
  83. package/src/client/voice/receiver/Receiver.js +96 -0
  84. package/src/client/voice/receiver/Recorder.js +173 -0
  85. package/src/client/voice/util/Function.js +116 -0
  86. package/src/client/voice/util/PlayInterface.js +122 -0
  87. package/src/client/voice/util/Secretbox.js +64 -0
  88. package/src/client/voice/util/Silence.js +16 -0
  89. package/src/client/voice/util/Socket.js +62 -0
  90. package/src/client/voice/util/VolumeInterface.js +104 -0
  91. package/src/client/websocket/WebSocketManager.js +392 -0
  92. package/src/client/websocket/WebSocketShard.js +907 -0
  93. package/src/client/websocket/handlers/APPLICATION_COMMAND_CREATE.js +18 -0
  94. package/src/client/websocket/handlers/APPLICATION_COMMAND_DELETE.js +20 -0
  95. package/src/client/websocket/handlers/APPLICATION_COMMAND_PERMISSIONS_UPDATE.js +5 -0
  96. package/src/client/websocket/handlers/APPLICATION_COMMAND_UPDATE.js +20 -0
  97. package/src/client/websocket/handlers/AUTO_MODERATION_ACTION_EXECUTION.js +5 -0
  98. package/src/client/websocket/handlers/AUTO_MODERATION_RULE_CREATE.js +5 -0
  99. package/src/client/websocket/handlers/AUTO_MODERATION_RULE_DELETE.js +5 -0
  100. package/src/client/websocket/handlers/AUTO_MODERATION_RULE_UPDATE.js +5 -0
  101. package/src/client/websocket/handlers/CALL_CREATE.js +14 -0
  102. package/src/client/websocket/handlers/CALL_DELETE.js +11 -0
  103. package/src/client/websocket/handlers/CALL_UPDATE.js +11 -0
  104. package/src/client/websocket/handlers/CHANNEL_CREATE.js +5 -0
  105. package/src/client/websocket/handlers/CHANNEL_DELETE.js +5 -0
  106. package/src/client/websocket/handlers/CHANNEL_PINS_UPDATE.js +22 -0
  107. package/src/client/websocket/handlers/CHANNEL_RECIPIENT_ADD.js +19 -0
  108. package/src/client/websocket/handlers/CHANNEL_RECIPIENT_REMOVE.js +16 -0
  109. package/src/client/websocket/handlers/CHANNEL_UPDATE.js +16 -0
  110. package/src/client/websocket/handlers/GUILD_AUDIT_LOG_ENTRY_CREATE.js +5 -0
  111. package/src/client/websocket/handlers/GUILD_BAN_ADD.js +5 -0
  112. package/src/client/websocket/handlers/GUILD_BAN_REMOVE.js +5 -0
  113. package/src/client/websocket/handlers/GUILD_CREATE.js +52 -0
  114. package/src/client/websocket/handlers/GUILD_DELETE.js +5 -0
  115. package/src/client/websocket/handlers/GUILD_EMOJIS_UPDATE.js +5 -0
  116. package/src/client/websocket/handlers/GUILD_INTEGRATIONS_UPDATE.js +5 -0
  117. package/src/client/websocket/handlers/GUILD_MEMBERS_CHUNK.js +39 -0
  118. package/src/client/websocket/handlers/GUILD_MEMBER_ADD.js +20 -0
  119. package/src/client/websocket/handlers/GUILD_MEMBER_REMOVE.js +5 -0
  120. package/src/client/websocket/handlers/GUILD_MEMBER_UPDATE.js +5 -0
  121. package/src/client/websocket/handlers/GUILD_ROLE_CREATE.js +5 -0
  122. package/src/client/websocket/handlers/GUILD_ROLE_DELETE.js +5 -0
  123. package/src/client/websocket/handlers/GUILD_ROLE_UPDATE.js +5 -0
  124. package/src/client/websocket/handlers/GUILD_SCHEDULED_EVENT_CREATE.js +5 -0
  125. package/src/client/websocket/handlers/GUILD_SCHEDULED_EVENT_DELETE.js +5 -0
  126. package/src/client/websocket/handlers/GUILD_SCHEDULED_EVENT_UPDATE.js +5 -0
  127. package/src/client/websocket/handlers/GUILD_SCHEDULED_EVENT_USER_ADD.js +5 -0
  128. package/src/client/websocket/handlers/GUILD_SCHEDULED_EVENT_USER_REMOVE.js +5 -0
  129. package/src/client/websocket/handlers/GUILD_STICKERS_UPDATE.js +5 -0
  130. package/src/client/websocket/handlers/GUILD_UPDATE.js +5 -0
  131. package/src/client/websocket/handlers/INTERACTION_MODAL_CREATE.js +12 -0
  132. package/src/client/websocket/handlers/INVITE_CREATE.js +5 -0
  133. package/src/client/websocket/handlers/INVITE_DELETE.js +5 -0
  134. package/src/client/websocket/handlers/MESSAGE_CREATE.js +5 -0
  135. package/src/client/websocket/handlers/MESSAGE_DELETE.js +5 -0
  136. package/src/client/websocket/handlers/MESSAGE_DELETE_BULK.js +5 -0
  137. package/src/client/websocket/handlers/MESSAGE_POLL_VOTE_ADD.js +5 -0
  138. package/src/client/websocket/handlers/MESSAGE_POLL_VOTE_REMOVE.js +5 -0
  139. package/src/client/websocket/handlers/MESSAGE_REACTION_ADD.js +5 -0
  140. package/src/client/websocket/handlers/MESSAGE_REACTION_REMOVE.js +5 -0
  141. package/src/client/websocket/handlers/MESSAGE_REACTION_REMOVE_ALL.js +5 -0
  142. package/src/client/websocket/handlers/MESSAGE_REACTION_REMOVE_EMOJI.js +5 -0
  143. package/src/client/websocket/handlers/MESSAGE_UPDATE.js +16 -0
  144. package/src/client/websocket/handlers/PRESENCE_UPDATE.js +5 -0
  145. package/src/client/websocket/handlers/READY.js +121 -0
  146. package/src/client/websocket/handlers/RELATIONSHIP_ADD.js +19 -0
  147. package/src/client/websocket/handlers/RELATIONSHIP_REMOVE.js +17 -0
  148. package/src/client/websocket/handlers/RELATIONSHIP_UPDATE.js +41 -0
  149. package/src/client/websocket/handlers/RESUMED.js +14 -0
  150. package/src/client/websocket/handlers/STAGE_INSTANCE_CREATE.js +5 -0
  151. package/src/client/websocket/handlers/STAGE_INSTANCE_DELETE.js +5 -0
  152. package/src/client/websocket/handlers/STAGE_INSTANCE_UPDATE.js +5 -0
  153. package/src/client/websocket/handlers/THREAD_CREATE.js +5 -0
  154. package/src/client/websocket/handlers/THREAD_DELETE.js +5 -0
  155. package/src/client/websocket/handlers/THREAD_LIST_SYNC.js +5 -0
  156. package/src/client/websocket/handlers/THREAD_MEMBERS_UPDATE.js +5 -0
  157. package/src/client/websocket/handlers/THREAD_MEMBER_UPDATE.js +5 -0
  158. package/src/client/websocket/handlers/THREAD_UPDATE.js +16 -0
  159. package/src/client/websocket/handlers/TYPING_START.js +5 -0
  160. package/src/client/websocket/handlers/USER_GUILD_SETTINGS_UPDATE.js +6 -0
  161. package/src/client/websocket/handlers/USER_NOTE_UPDATE.js +5 -0
  162. package/src/client/websocket/handlers/USER_REQUIRED_ACTION_UPDATE.js +78 -0
  163. package/src/client/websocket/handlers/USER_SETTINGS_UPDATE.js +5 -0
  164. package/src/client/websocket/handlers/USER_UPDATE.js +5 -0
  165. package/src/client/websocket/handlers/VOICE_CHANNEL_EFFECT_SEND.js +16 -0
  166. package/src/client/websocket/handlers/VOICE_CHANNEL_STATUS_UPDATE.js +12 -0
  167. package/src/client/websocket/handlers/VOICE_SERVER_UPDATE.js +6 -0
  168. package/src/client/websocket/handlers/VOICE_STATE_UPDATE.js +5 -0
  169. package/src/client/websocket/handlers/WEBHOOKS_UPDATE.js +5 -0
  170. package/src/client/websocket/handlers/index.js +84 -0
  171. package/src/errors/DJSError.js +61 -0
  172. package/src/errors/Messages.js +217 -0
  173. package/src/errors/index.js +4 -0
  174. package/src/index.js +172 -0
  175. package/src/managers/ApplicationCommandManager.js +264 -0
  176. package/src/managers/ApplicationCommandPermissionsManager.js +417 -0
  177. package/src/managers/AutoModerationRuleManager.js +296 -0
  178. package/src/managers/BaseGuildEmojiManager.js +80 -0
  179. package/src/managers/BaseManager.js +19 -0
  180. package/src/managers/BillingManager.js +66 -0
  181. package/src/managers/CachedManager.js +71 -0
  182. package/src/managers/ChannelManager.js +148 -0
  183. package/src/managers/ClientUserSettingManager.js +372 -0
  184. package/src/managers/DataManager.js +61 -0
  185. package/src/managers/DeveloperManager.js +254 -0
  186. package/src/managers/GuildBanManager.js +250 -0
  187. package/src/managers/GuildChannelManager.js +488 -0
  188. package/src/managers/GuildEmojiManager.js +171 -0
  189. package/src/managers/GuildEmojiRoleManager.js +118 -0
  190. package/src/managers/GuildForumThreadManager.js +108 -0
  191. package/src/managers/GuildInviteManager.js +213 -0
  192. package/src/managers/GuildManager.js +338 -0
  193. package/src/managers/GuildMemberManager.js +599 -0
  194. package/src/managers/GuildMemberRoleManager.js +195 -0
  195. package/src/managers/GuildScheduledEventManager.js +314 -0
  196. package/src/managers/GuildSettingManager.js +155 -0
  197. package/src/managers/GuildStickerManager.js +179 -0
  198. package/src/managers/GuildTextThreadManager.js +98 -0
  199. package/src/managers/InteractionManager.js +39 -0
  200. package/src/managers/MessageManager.js +423 -0
  201. package/src/managers/PermissionOverwriteManager.js +164 -0
  202. package/src/managers/PresenceManager.js +71 -0
  203. package/src/managers/QuestManager.js +353 -0
  204. package/src/managers/ReactionManager.js +67 -0
  205. package/src/managers/ReactionUserManager.js +73 -0
  206. package/src/managers/RelationshipManager.js +278 -0
  207. package/src/managers/RoleManager.js +448 -0
  208. package/src/managers/SessionManager.js +66 -0
  209. package/src/managers/StageInstanceManager.js +162 -0
  210. package/src/managers/ThreadManager.js +175 -0
  211. package/src/managers/ThreadMemberManager.js +186 -0
  212. package/src/managers/UserManager.js +136 -0
  213. package/src/managers/UserNoteManager.js +53 -0
  214. package/src/managers/VoiceStateManager.js +59 -0
  215. package/src/rest/APIRequest.js +154 -0
  216. package/src/rest/APIRouter.js +53 -0
  217. package/src/rest/DiscordAPIError.js +119 -0
  218. package/src/rest/HTTPError.js +62 -0
  219. package/src/rest/RESTManager.js +67 -0
  220. package/src/rest/RateLimitError.js +55 -0
  221. package/src/rest/RequestHandler.js +466 -0
  222. package/src/sharding/Shard.js +444 -0
  223. package/src/sharding/ShardClientUtil.js +279 -0
  224. package/src/sharding/ShardingManager.js +319 -0
  225. package/src/structures/AnonymousGuild.js +98 -0
  226. package/src/structures/ApplicationCommand.js +593 -0
  227. package/src/structures/ApplicationRoleConnectionMetadata.js +48 -0
  228. package/src/structures/AutoModerationActionExecution.js +89 -0
  229. package/src/structures/AutoModerationRule.js +294 -0
  230. package/src/structures/AutocompleteInteraction.js +107 -0
  231. package/src/structures/Base.js +43 -0
  232. package/src/structures/BaseCommandInteraction.js +211 -0
  233. package/src/structures/BaseGuild.js +116 -0
  234. package/src/structures/BaseGuildEmoji.js +56 -0
  235. package/src/structures/BaseGuildTextChannel.js +191 -0
  236. package/src/structures/BaseGuildVoiceChannel.js +241 -0
  237. package/src/structures/BaseMessageComponent.js +181 -0
  238. package/src/structures/ButtonInteraction.js +11 -0
  239. package/src/structures/CallState.js +63 -0
  240. package/src/structures/CategoryChannel.js +85 -0
  241. package/src/structures/Channel.js +284 -0
  242. package/src/structures/ClientPresence.js +77 -0
  243. package/src/structures/ClientUser.js +655 -0
  244. package/src/structures/CommandInteraction.js +41 -0
  245. package/src/structures/CommandInteractionOptionResolver.js +276 -0
  246. package/src/structures/ContainerComponent.js +68 -0
  247. package/src/structures/ContextMenuInteraction.js +65 -0
  248. package/src/structures/DMChannel.js +219 -0
  249. package/src/structures/DirectoryChannel.js +20 -0
  250. package/src/structures/Emoji.js +148 -0
  251. package/src/structures/FileComponent.js +49 -0
  252. package/src/structures/ForumChannel.js +31 -0
  253. package/src/structures/GroupDMChannel.js +394 -0
  254. package/src/structures/Guild.js +1791 -0
  255. package/src/structures/GuildAuditLogs.js +746 -0
  256. package/src/structures/GuildBan.js +59 -0
  257. package/src/structures/GuildBoost.js +108 -0
  258. package/src/structures/GuildChannel.js +470 -0
  259. package/src/structures/GuildEmoji.js +161 -0
  260. package/src/structures/GuildMember.js +636 -0
  261. package/src/structures/GuildPreview.js +191 -0
  262. package/src/structures/GuildPreviewEmoji.js +27 -0
  263. package/src/structures/GuildScheduledEvent.js +536 -0
  264. package/src/structures/GuildTemplate.js +236 -0
  265. package/src/structures/Integration.js +188 -0
  266. package/src/structures/IntegrationApplication.js +96 -0
  267. package/src/structures/Interaction.js +290 -0
  268. package/src/structures/InteractionCollector.js +248 -0
  269. package/src/structures/InteractionWebhook.js +43 -0
  270. package/src/structures/Invite.js +358 -0
  271. package/src/structures/InviteGuild.js +23 -0
  272. package/src/structures/InviteStageInstance.js +86 -0
  273. package/src/structures/MediaChannel.js +11 -0
  274. package/src/structures/MediaGalleryComponent.js +41 -0
  275. package/src/structures/MediaGalleryItem.js +47 -0
  276. package/src/structures/Message.js +1252 -0
  277. package/src/structures/MessageActionRow.js +105 -0
  278. package/src/structures/MessageAttachment.js +216 -0
  279. package/src/structures/MessageButton.js +166 -0
  280. package/src/structures/MessageCollector.js +146 -0
  281. package/src/structures/MessageComponentInteraction.js +120 -0
  282. package/src/structures/MessageContextMenuInteraction.js +20 -0
  283. package/src/structures/MessageEmbed.js +596 -0
  284. package/src/structures/MessageMentions.js +273 -0
  285. package/src/structures/MessagePayload.js +354 -0
  286. package/src/structures/MessageReaction.js +181 -0
  287. package/src/structures/MessageSelectMenu.js +141 -0
  288. package/src/structures/Modal.js +161 -0
  289. package/src/structures/ModalSubmitFieldsResolver.js +53 -0
  290. package/src/structures/ModalSubmitInteraction.js +119 -0
  291. package/src/structures/NewsChannel.js +32 -0
  292. package/src/structures/OAuth2Guild.js +28 -0
  293. package/src/structures/PermissionOverwrites.js +198 -0
  294. package/src/structures/Poll.js +108 -0
  295. package/src/structures/PollAnswer.js +88 -0
  296. package/src/structures/Presence.js +1157 -0
  297. package/src/structures/ReactionCollector.js +229 -0
  298. package/src/structures/ReactionEmoji.js +31 -0
  299. package/src/structures/Role.js +590 -0
  300. package/src/structures/SectionComponent.js +48 -0
  301. package/src/structures/SelectMenuInteraction.js +21 -0
  302. package/src/structures/SeparatorComponent.js +48 -0
  303. package/src/structures/Session.js +81 -0
  304. package/src/structures/StageChannel.js +104 -0
  305. package/src/structures/StageInstance.js +208 -0
  306. package/src/structures/Sticker.js +310 -0
  307. package/src/structures/StickerPack.js +95 -0
  308. package/src/structures/StoreChannel.js +56 -0
  309. package/src/structures/Team.js +118 -0
  310. package/src/structures/TeamMember.js +80 -0
  311. package/src/structures/TextChannel.js +33 -0
  312. package/src/structures/TextDisplayComponent.js +40 -0
  313. package/src/structures/TextInputComponent.js +132 -0
  314. package/src/structures/ThreadChannel.js +605 -0
  315. package/src/structures/ThreadMember.js +105 -0
  316. package/src/structures/ThreadOnlyChannel.js +249 -0
  317. package/src/structures/ThumbnailComponent.js +57 -0
  318. package/src/structures/Typing.js +74 -0
  319. package/src/structures/UnfurledMediaItem.js +29 -0
  320. package/src/structures/User.js +640 -0
  321. package/src/structures/UserContextMenuInteraction.js +29 -0
  322. package/src/structures/VoiceChannel.js +110 -0
  323. package/src/structures/VoiceChannelEffect.js +69 -0
  324. package/src/structures/VoiceRegion.js +53 -0
  325. package/src/structures/VoiceState.js +354 -0
  326. package/src/structures/WebEmbed.js +373 -0
  327. package/src/structures/Webhook.js +478 -0
  328. package/src/structures/WelcomeChannel.js +60 -0
  329. package/src/structures/WelcomeScreen.js +48 -0
  330. package/src/structures/Widget.js +87 -0
  331. package/src/structures/WidgetMember.js +99 -0
  332. package/src/structures/interfaces/Application.js +953 -0
  333. package/src/structures/interfaces/Collector.js +300 -0
  334. package/src/structures/interfaces/InteractionResponses.js +313 -0
  335. package/src/structures/interfaces/TextBasedChannel.js +821 -0
  336. package/src/util/APITypes.js +59 -0
  337. package/src/util/ActivityFlags.js +44 -0
  338. package/src/util/ApplicationFlags.js +76 -0
  339. package/src/util/AttachmentFlags.js +38 -0
  340. package/src/util/BitField.js +170 -0
  341. package/src/util/ChannelFlags.js +45 -0
  342. package/src/util/Constants.js +1914 -0
  343. package/src/util/DataResolver.js +146 -0
  344. package/src/util/Formatters.js +228 -0
  345. package/src/util/GuildMemberFlags.js +43 -0
  346. package/src/util/Intents.js +74 -0
  347. package/src/util/InviteFlags.js +34 -0
  348. package/src/util/LimitedCollection.js +131 -0
  349. package/src/util/MessageFlags.js +63 -0
  350. package/src/util/Options.js +358 -0
  351. package/src/util/Permissions.js +202 -0
  352. package/src/util/PremiumUsageFlags.js +31 -0
  353. package/src/util/PurchasedFlags.js +33 -0
  354. package/src/util/RemoteAuth.js +415 -0
  355. package/src/util/RoleFlags.js +37 -0
  356. package/src/util/SnowflakeUtil.js +92 -0
  357. package/src/util/Speaking.js +33 -0
  358. package/src/util/Sweepers.js +466 -0
  359. package/src/util/SystemChannelFlags.js +55 -0
  360. package/src/util/ThreadMemberFlags.js +30 -0
  361. package/src/util/UserFlags.js +104 -0
  362. package/src/util/Util.js +1048 -0
  363. package/typings/enums.d.ts +439 -0
  364. package/typings/index.d.ts +8505 -0
  365. package/typings/index.test-d.ts +0 -0
  366. package/typings/rawDataTypes.d.ts +403 -0
@@ -0,0 +1,276 @@
1
+ 'use strict';
2
+
3
+ const { TypeError } = require('../errors');
4
+
5
+ /**
6
+ * A resolver for command interaction options.
7
+ */
8
+ class CommandInteractionOptionResolver {
9
+ constructor(client, options, resolved) {
10
+ /**
11
+ * The client that instantiated this.
12
+ * @name CommandInteractionOptionResolver#client
13
+ * @type {Client}
14
+ * @readonly
15
+ */
16
+ Object.defineProperty(this, 'client', { value: client });
17
+
18
+ /**
19
+ * The name of the subcommand group.
20
+ * @type {?string}
21
+ * @private
22
+ */
23
+ this._group = null;
24
+
25
+ /**
26
+ * The name of the subcommand.
27
+ * @type {?string}
28
+ * @private
29
+ */
30
+ this._subcommand = null;
31
+
32
+ /**
33
+ * The bottom-level options for the interaction.
34
+ * If there is a subcommand (or subcommand and group), this is the options for the subcommand.
35
+ * @type {CommandInteractionOption[]}
36
+ * @private
37
+ */
38
+ this._hoistedOptions = options;
39
+
40
+ // Hoist subcommand group if present
41
+ if (this._hoistedOptions[0]?.type === 'SUB_COMMAND_GROUP') {
42
+ this._group = this._hoistedOptions[0].name;
43
+ this._hoistedOptions = this._hoistedOptions[0].options ?? [];
44
+ }
45
+ // Hoist subcommand if present
46
+ if (this._hoistedOptions[0]?.type === 'SUB_COMMAND') {
47
+ this._subcommand = this._hoistedOptions[0].name;
48
+ this._hoistedOptions = this._hoistedOptions[0].options ?? [];
49
+ }
50
+
51
+ /**
52
+ * The interaction options array.
53
+ * @name CommandInteractionOptionResolver#data
54
+ * @type {ReadonlyArray<CommandInteractionOption>}
55
+ * @readonly
56
+ */
57
+ Object.defineProperty(this, 'data', { value: Object.freeze([...options]) });
58
+
59
+ /**
60
+ * The interaction resolved data
61
+ * @name CommandInteractionOptionResolver#resolved
62
+ * @type {Readonly<CommandInteractionResolvedData>}
63
+ */
64
+ Object.defineProperty(this, 'resolved', { value: Object.freeze(resolved) });
65
+ }
66
+
67
+ /**
68
+ * Gets an option by its name.
69
+ * @param {string} name The name of the option.
70
+ * @param {boolean} [required=false] Whether to throw an error if the option is not found.
71
+ * @returns {?CommandInteractionOption} The option, if found.
72
+ */
73
+ get(name, required = false) {
74
+ const option = this._hoistedOptions.find(opt => opt.name === name);
75
+ if (!option) {
76
+ if (required) {
77
+ throw new TypeError('COMMAND_INTERACTION_OPTION_NOT_FOUND', name);
78
+ }
79
+ return null;
80
+ }
81
+ return option;
82
+ }
83
+
84
+ /**
85
+ * Gets an option by name and property and checks its type.
86
+ * @param {string} name The name of the option.
87
+ * @param {ApplicationCommandOptionType} type The type of the option.
88
+ * @param {string[]} properties The properties to check for for `required`.
89
+ * @param {boolean} required Whether to throw an error if the option is not found.
90
+ * @returns {?CommandInteractionOption} The option, if found.
91
+ * @private
92
+ */
93
+ _getTypedOption(name, type, properties, required) {
94
+ const option = this.get(name, required);
95
+ if (!option) {
96
+ return null;
97
+ } else if (option.type !== type) {
98
+ throw new TypeError('COMMAND_INTERACTION_OPTION_TYPE', name, option.type, type);
99
+ } else if (required && properties.every(prop => option[prop] === null || typeof option[prop] === 'undefined')) {
100
+ throw new TypeError('COMMAND_INTERACTION_OPTION_EMPTY', name, option.type);
101
+ }
102
+ return option;
103
+ }
104
+
105
+ /**
106
+ * Gets the selected subcommand.
107
+ * @param {boolean} [required=true] Whether to throw an error if there is no subcommand.
108
+ * @returns {?string} The name of the selected subcommand, or null if not set and not required.
109
+ */
110
+ getSubcommand(required = true) {
111
+ if (required && !this._subcommand) {
112
+ throw new TypeError('COMMAND_INTERACTION_OPTION_NO_SUB_COMMAND');
113
+ }
114
+ return this._subcommand;
115
+ }
116
+
117
+ /**
118
+ * Gets the selected subcommand group.
119
+ * @param {boolean} [required=true] Whether to throw an error if there is no subcommand group.
120
+ * @returns {?string} The name of the selected subcommand group, or null if not set and not required.
121
+ */
122
+ getSubcommandGroup(required = true) {
123
+ if (required && !this._group) {
124
+ throw new TypeError('COMMAND_INTERACTION_OPTION_NO_SUB_COMMAND_GROUP');
125
+ }
126
+ return this._group;
127
+ }
128
+
129
+ /**
130
+ * Gets a boolean option.
131
+ * @param {string} name The name of the option.
132
+ * @param {boolean} [required=false] Whether to throw an error if the option is not found.
133
+ * @returns {?boolean} The value of the option, or null if not set and not required.
134
+ */
135
+ getBoolean(name, required = false) {
136
+ const option = this._getTypedOption(name, 'BOOLEAN', ['value'], required);
137
+ return option?.value ?? null;
138
+ }
139
+
140
+ /**
141
+ * Gets a channel option.
142
+ * @param {string} name The name of the option.
143
+ * @param {boolean} [required=false] Whether to throw an error if the option is not found.
144
+ * @returns {?(GuildChannel|ThreadChannel|APIChannel)}
145
+ * The value of the option, or null if not set and not required.
146
+ */
147
+ getChannel(name, required = false) {
148
+ const option = this._getTypedOption(name, 'CHANNEL', ['channel'], required);
149
+ return option?.channel ?? null;
150
+ }
151
+
152
+ /**
153
+ * Gets a string option.
154
+ * @param {string} name The name of the option.
155
+ * @param {boolean} [required=false] Whether to throw an error if the option is not found.
156
+ * @returns {?string} The value of the option, or null if not set and not required.
157
+ */
158
+ getString(name, required = false) {
159
+ const option = this._getTypedOption(name, 'STRING', ['value'], required);
160
+ return option?.value ?? null;
161
+ }
162
+
163
+ /**
164
+ * Gets an integer option.
165
+ * @param {string} name The name of the option.
166
+ * @param {boolean} [required=false] Whether to throw an error if the option is not found.
167
+ * @returns {?number} The value of the option, or null if not set and not required.
168
+ */
169
+ getInteger(name, required = false) {
170
+ const option = this._getTypedOption(name, 'INTEGER', ['value'], required);
171
+ return option?.value ?? null;
172
+ }
173
+
174
+ /**
175
+ * Gets a number option.
176
+ * @param {string} name The name of the option.
177
+ * @param {boolean} [required=false] Whether to throw an error if the option is not found.
178
+ * @returns {?number} The value of the option, or null if not set and not required.
179
+ */
180
+ getNumber(name, required = false) {
181
+ const option = this._getTypedOption(name, 'NUMBER', ['value'], required);
182
+ return option?.value ?? null;
183
+ }
184
+
185
+ /**
186
+ * Gets a user option.
187
+ * @param {string} name The name of the option.
188
+ * @param {boolean} [required=false] Whether to throw an error if the option is not found.
189
+ * @returns {?User} The value of the option, or null if not set and not required.
190
+ */
191
+ getUser(name, required = false) {
192
+ const option = this._getTypedOption(name, 'USER', ['user'], required);
193
+ return option?.user ?? null;
194
+ }
195
+
196
+ /**
197
+ * Gets a member option.
198
+ * @param {string} name The name of the option.
199
+ * @param {boolean} [required=false] Whether to throw an error if the option is not found.
200
+ * @returns {?(GuildMember|APIGuildMember)}
201
+ * The value of the option, or null if not set and not required.
202
+ */
203
+ getMember(name, required = false) {
204
+ const option = this._getTypedOption(name, 'USER', ['member'], required);
205
+ return option?.member ?? null;
206
+ }
207
+
208
+ /**
209
+ * Gets a role option.
210
+ * @param {string} name The name of the option.
211
+ * @param {boolean} [required=false] Whether to throw an error if the option is not found.
212
+ * @returns {?(Role|APIRole)} The value of the option, or null if not set and not required.
213
+ */
214
+ getRole(name, required = false) {
215
+ const option = this._getTypedOption(name, 'ROLE', ['role'], required);
216
+ return option?.role ?? null;
217
+ }
218
+
219
+ /**
220
+ * Gets a mentionable option.
221
+ * @param {string} name The name of the option.
222
+ * @param {boolean} [required=false] Whether to throw an error if the option is not found.
223
+ * @returns {?(User|GuildMember|APIGuildMember|Role|APIRole)}
224
+ * The value of the option, or null if not set and not required.
225
+ */
226
+ getMentionable(name, required = false) {
227
+ const option = this._getTypedOption(name, 'MENTIONABLE', ['user', 'member', 'role'], required);
228
+ return option?.member ?? option?.user ?? option?.role ?? null;
229
+ }
230
+
231
+ /**
232
+ * Gets a message option.
233
+ * @param {string} name The name of the option.
234
+ * @param {boolean} [required=false] Whether to throw an error if the option is not found.
235
+ * @returns {?(Message|APIMessage)}
236
+ * The value of the option, or null if not set and not required.
237
+ */
238
+ getMessage(name, required = false) {
239
+ const option = this._getTypedOption(name, '_MESSAGE', ['message'], required);
240
+ return option?.message ?? null;
241
+ }
242
+
243
+ /**
244
+ * The full autocomplete option object.
245
+ * @typedef {Object} AutocompleteFocusedOption
246
+ * @property {string} name The name of the option
247
+ * @property {ApplicationCommandOptionType} type The type of the application command option
248
+ * @property {string} value The value of the option
249
+ * @property {boolean} focused Whether this option is currently in focus for autocomplete
250
+ */
251
+
252
+ /**
253
+ * Gets the focused option.
254
+ * @param {boolean} [getFull=false] Whether to get the full option object
255
+ * @returns {string|AutocompleteFocusedOption}
256
+ * The value of the option, or the whole option if getFull is true
257
+ */
258
+ getFocused(getFull = false) {
259
+ const focusedOption = this._hoistedOptions.find(option => option.focused);
260
+ if (!focusedOption) throw new TypeError('AUTOCOMPLETE_INTERACTION_OPTION_NO_FOCUSED_OPTION');
261
+ return getFull ? focusedOption : focusedOption.value;
262
+ }
263
+
264
+ /**
265
+ * Gets an attachment option.
266
+ * @param {string} name The name of the option.
267
+ * @param {boolean} [required=false] Whether to throw an error if the option is not found.
268
+ * @returns {?MessageAttachment} The value of the option, or null if not set and not required.
269
+ */
270
+ getAttachment(name, required = false) {
271
+ const option = this._getTypedOption(name, 'ATTACHMENT', ['attachment'], required);
272
+ return option?.attachment ?? null;
273
+ }
274
+ }
275
+
276
+ module.exports = CommandInteractionOptionResolver;
@@ -0,0 +1,68 @@
1
+ 'use strict';
2
+
3
+ const BaseMessageComponent = require('./BaseMessageComponent');
4
+ const { MessageComponentTypes } = require('../util/Constants');
5
+
6
+ class ContainerComponent extends BaseMessageComponent {
7
+ /**
8
+ * @typedef {MessageActionRow|TextDisplayComponent|SectionComponent|MediaGalleryComponent|SeparatorComponent|FileComponent} ContainerComponents
9
+ * @property {ContainerComponents[]} [components] Components of the type action row, text display, section, media gallery, separator, or file
10
+ * @property {Number} [accent_color] Color for the accent on the container as RGB from 0x000000 to 0xFFFFFF
11
+ * @property {Boolean} [spoiler] Whether the container should be a spoiler (or blurred out). Defaults to false.
12
+ */
13
+
14
+ /**
15
+ * @param {ContainerComponent | APIContainerComponent} [data={}] The data
16
+ */
17
+ constructor(data = {}) {
18
+ super({ type: 'CONTAINER' });
19
+
20
+ this.setup(data);
21
+ }
22
+
23
+ setup(data) {
24
+ super.setup(data);
25
+ /**
26
+ * Components of the type action row, text display, section, media gallery, separator, or file
27
+ * @type {ContainerComponents[]}
28
+ */
29
+ this.components = data.components?.map(c => BaseMessageComponent.create(c)) ?? [];
30
+
31
+ /**
32
+ * Color for the accent on the container as RGB from 0x000000 to 0xFFFFFF
33
+ * @type {Number}
34
+ */
35
+ this.accentColor = data.accent_color ?? null;
36
+
37
+ /**
38
+ * Whether the container should be a spoiler (or blurred out). Defaults to false.
39
+ * @type {Boolean}
40
+ */
41
+ this.spoiler = data.spoiler ?? false;
42
+ }
43
+
44
+ /**
45
+ * The hex accent color of this container
46
+ * @type {?string}
47
+ * @readonly
48
+ */
49
+ get hexAccentColor() {
50
+ return typeof this.accentColor === 'number'
51
+ ? `#${this.accentColor.toString(16).padStart(6, '0')}`
52
+ : this.accentColor ?? null;
53
+ }
54
+
55
+ /**
56
+ * @returns {APIContainerComponent}
57
+ */
58
+ toJSON() {
59
+ return {
60
+ type: MessageComponentTypes[this.type],
61
+ components: this.components.map(c => c.toJSON()),
62
+ accent_color: this.accent_color,
63
+ spoiler: this.spoiler,
64
+ };
65
+ }
66
+ }
67
+
68
+ module.exports = ContainerComponent;
@@ -0,0 +1,65 @@
1
+ 'use strict';
2
+
3
+ const BaseCommandInteraction = require('./BaseCommandInteraction');
4
+ const CommandInteractionOptionResolver = require('./CommandInteractionOptionResolver');
5
+ const { ApplicationCommandOptionTypes, ApplicationCommandTypes } = require('../util/Constants');
6
+
7
+ /**
8
+ * Represents a context menu interaction.
9
+ * @extends {BaseCommandInteraction}
10
+ */
11
+ class ContextMenuInteraction extends BaseCommandInteraction {
12
+ constructor(client, data) {
13
+ super(client, data);
14
+ /**
15
+ * The target of the interaction, parsed into options
16
+ * @type {CommandInteractionOptionResolver}
17
+ */
18
+ this.options = new CommandInteractionOptionResolver(
19
+ this.client,
20
+ this.resolveContextMenuOptions(data.data),
21
+ this.transformResolved(data.data.resolved),
22
+ );
23
+
24
+ /**
25
+ * The id of the target of this interaction
26
+ * @type {Snowflake}
27
+ */
28
+ this.targetId = data.data.target_id;
29
+
30
+ /**
31
+ * The type of the target of the interaction; either USER or MESSAGE
32
+ * @type {ApplicationCommandType}
33
+ */
34
+ this.targetType = ApplicationCommandTypes[data.data.type];
35
+ }
36
+
37
+ /**
38
+ * Resolves and transforms options received from the API for a context menu interaction.
39
+ * @param {APIApplicationCommandInteractionData} data The interaction data
40
+ * @returns {CommandInteractionOption[]}
41
+ * @private
42
+ */
43
+ resolveContextMenuOptions({ target_id, resolved }) {
44
+ const result = [];
45
+
46
+ if (resolved.users?.[target_id]) {
47
+ result.push(
48
+ this.transformOption({ name: 'user', type: ApplicationCommandOptionTypes.USER, value: target_id }, resolved),
49
+ );
50
+ }
51
+
52
+ if (resolved.messages?.[target_id]) {
53
+ result.push({
54
+ name: 'message',
55
+ type: '_MESSAGE',
56
+ value: target_id,
57
+ message: this.channel?.messages._add(resolved.messages[target_id]) ?? resolved.messages[target_id],
58
+ });
59
+ }
60
+
61
+ return result;
62
+ }
63
+ }
64
+
65
+ module.exports = ContextMenuInteraction;
@@ -0,0 +1,219 @@
1
+ 'use strict';
2
+
3
+ const { Collection } = require('@discordjs/collection');
4
+ const { Channel } = require('./Channel');
5
+ const TextBasedChannel = require('./interfaces/TextBasedChannel');
6
+ const MessageManager = require('../managers/MessageManager');
7
+ const { Opcodes, Status } = require('../util/Constants');
8
+
9
+ /**
10
+ * Represents a direct message channel between two users.
11
+ * @extends {Channel}
12
+ * @implements {TextBasedChannel}
13
+ */
14
+ class DMChannel extends Channel {
15
+ constructor(client, data) {
16
+ super(client, data);
17
+
18
+ // Override the channel type so partials have a known type
19
+ this.type = 'DM';
20
+
21
+ /**
22
+ * A manager of the messages belonging to this channel
23
+ * @type {MessageManager}
24
+ */
25
+ this.messages = new MessageManager(this);
26
+ }
27
+
28
+ _patch(data) {
29
+ super._patch(data);
30
+
31
+ if (data.recipients) {
32
+ /**
33
+ * The recipient on the other end of the DM
34
+ * @type {User}
35
+ */
36
+ this.recipient = this.client.users._add(data.recipients[0]);
37
+ }
38
+
39
+ if ('last_message_id' in data) {
40
+ /**
41
+ * The channel's last message id, if one was sent
42
+ * @type {?Snowflake}
43
+ */
44
+ this.lastMessageId = data.last_message_id;
45
+ }
46
+
47
+ if ('last_pin_timestamp' in data) {
48
+ /**
49
+ * The timestamp when the last pinned message was pinned, if there was one
50
+ * @type {?number}
51
+ */
52
+ this.lastPinTimestamp = data.last_pin_timestamp ? Date.parse(data.last_pin_timestamp) : null;
53
+ } else {
54
+ this.lastPinTimestamp ??= null;
55
+ }
56
+
57
+ if ('is_message_request' in data) {
58
+ /**
59
+ * Whether the channel is a message request
60
+ * @type {?boolean}
61
+ */
62
+ this.messageRequest = data.is_message_request;
63
+ }
64
+
65
+ if ('is_message_request_timestamp' in data) {
66
+ /**
67
+ * The timestamp when the message request was created
68
+ * @type {?number}
69
+ */
70
+ this.messageRequestTimestamp = data.is_message_request_timestamp
71
+ ? Date.parse(data.is_message_request_timestamp)
72
+ : null;
73
+ }
74
+ }
75
+
76
+ /**
77
+ * Accept this DMChannel.
78
+ * @returns {Promise<DMChannel>}
79
+ */
80
+ async acceptMessageRequest() {
81
+ if (!this.messageRequest) {
82
+ throw new Error('NOT_MESSAGE_REQUEST', 'This channel is not a message request');
83
+ }
84
+ const c = await this.client.api.channels[this.id].recipients['@me'].put({
85
+ data: {
86
+ consent_status: 2,
87
+ },
88
+ });
89
+ this.messageRequest = false;
90
+ return this.client.channels._add(c);
91
+ }
92
+
93
+ /**
94
+ * Cancel this DMChannel.
95
+ * @returns {Promise<DMChannel>}
96
+ */
97
+ async cancelMessageRequest() {
98
+ if (!this.messageRequest) {
99
+ throw new Error('NOT_MESSAGE_REQUEST', 'This channel is not a message request');
100
+ }
101
+ await this.client.api.channels[this.id].recipients['@me'].delete();
102
+ return this;
103
+ }
104
+
105
+ /**
106
+ * Whether this DMChannel is a partial
107
+ * @type {boolean}
108
+ * @readonly
109
+ */
110
+ get partial() {
111
+ return typeof this.lastMessageId === 'undefined';
112
+ }
113
+
114
+ /**
115
+ * Fetch this DMChannel.
116
+ * @param {boolean} [force=true] Whether to skip the cache check and request the API
117
+ * @returns {Promise<DMChannel>}
118
+ */
119
+ fetch(force = true) {
120
+ return this.recipient.createDM(force);
121
+ }
122
+
123
+ /**
124
+ * When concatenated with a string, this automatically returns the recipient's mention instead of the
125
+ * DMChannel object.
126
+ * @returns {string}
127
+ * @example
128
+ * // Logs: Hello from <@123456789012345678>!
129
+ * console.log(`Hello from ${channel}!`);
130
+ */
131
+ toString() {
132
+ return this.recipient.toString();
133
+ }
134
+
135
+ /**
136
+ * Sync VoiceState of this DMChannel.
137
+ * @returns {undefined}
138
+ */
139
+ sync() {
140
+ this.client.ws.broadcast({
141
+ op: Opcodes.DM_UPDATE,
142
+ d: {
143
+ channel_id: this.id,
144
+ },
145
+ });
146
+ }
147
+
148
+ /**
149
+ * Ring the user's phone / PC (call)
150
+ * @returns {Promise<void>}
151
+ */
152
+ ring() {
153
+ return this.client.api.channels(this.id).call.ring.post({
154
+ data: {
155
+ recipients: null,
156
+ },
157
+ });
158
+ }
159
+
160
+ /**
161
+ * The user in this voice-based channel
162
+ * @type {Collection<Snowflake, User>}
163
+ * @readonly
164
+ */
165
+ get voiceUsers() {
166
+ const coll = new Collection();
167
+ for (const state of this.client.voiceStates.cache.values()) {
168
+ if (state.channelId === this.id && state.user) {
169
+ coll.set(state.id, state.user);
170
+ }
171
+ }
172
+ return coll;
173
+ }
174
+
175
+ /**
176
+ * Get current shard
177
+ * @type {WebSocketShard}
178
+ * @readonly
179
+ */
180
+ get shard() {
181
+ return this.client.ws.shards.first();
182
+ }
183
+
184
+ /**
185
+ * The voice state adapter for this client that can be used with @discordjs/voice to play audio in DM / Group DM channels.
186
+ * @type {?Function}
187
+ * @readonly
188
+ */
189
+ get voiceAdapterCreator() {
190
+ return methods => {
191
+ this.client.voice.adapters.set(this.id, methods);
192
+ return {
193
+ sendPayload: data => {
194
+ if (this.shard.status !== Status.READY) return false;
195
+ this.shard.send(data);
196
+ return true;
197
+ },
198
+ destroy: () => {
199
+ this.client.voice.adapters.delete(this.id);
200
+ },
201
+ };
202
+ };
203
+ }
204
+
205
+ // These are here only for documentation purposes - they are implemented by TextBasedChannel
206
+ /* eslint-disable no-empty-function */
207
+ get lastMessage() {}
208
+ get lastPinAt() {}
209
+ send() {}
210
+ sendTyping() {}
211
+ createMessageCollector() {}
212
+ awaitMessages() {}
213
+ // Doesn't work on DM channels; setRateLimitPerUser() {}
214
+ // Doesn't work on DM channels; setNSFW() {}
215
+ }
216
+
217
+ TextBasedChannel.applyToClass(DMChannel, true, ['fetchWebhooks', 'createWebhook', 'setRateLimitPerUser', 'setNSFW']);
218
+
219
+ module.exports = DMChannel;
@@ -0,0 +1,20 @@
1
+ 'use strict';
2
+
3
+ const { Channel } = require('./Channel');
4
+
5
+ /**
6
+ * Represents a channel that displays a directory of guilds.
7
+ * @extends {Channel}
8
+ */
9
+ class DirectoryChannel extends Channel {
10
+ _patch(data) {
11
+ super._patch(data);
12
+ /**
13
+ * The channel's name
14
+ * @type {string}
15
+ */
16
+ this.name = data.name;
17
+ }
18
+ }
19
+
20
+ module.exports = DirectoryChannel;