safeness-sb-new 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (343) hide show
  1. package/README.md +115 -0
  2. package/package.json +96 -0
  3. package/src/WebSocket.js +39 -0
  4. package/src/client/BaseClient.js +86 -0
  5. package/src/client/Client.js +836 -0
  6. package/src/client/WebhookClient.js +61 -0
  7. package/src/client/actions/Action.js +120 -0
  8. package/src/client/actions/ActionsManager.js +78 -0
  9. package/src/client/actions/ApplicationCommandPermissionsUpdate.js +34 -0
  10. package/src/client/actions/AutoModerationActionExecution.js +27 -0
  11. package/src/client/actions/AutoModerationRuleCreate.js +28 -0
  12. package/src/client/actions/AutoModerationRuleDelete.js +32 -0
  13. package/src/client/actions/AutoModerationRuleUpdate.js +30 -0
  14. package/src/client/actions/ChannelCreate.js +23 -0
  15. package/src/client/actions/ChannelDelete.js +39 -0
  16. package/src/client/actions/ChannelUpdate.js +43 -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 +65 -0
  22. package/src/client/actions/GuildEmojiCreate.js +20 -0
  23. package/src/client/actions/GuildEmojiDelete.js +21 -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 +33 -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 +31 -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 +21 -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/InviteCreate.js +28 -0
  44. package/src/client/actions/InviteDelete.js +30 -0
  45. package/src/client/actions/MessageCreate.js +46 -0
  46. package/src/client/actions/MessageDelete.js +32 -0
  47. package/src/client/actions/MessageDeleteBulk.js +46 -0
  48. package/src/client/actions/MessageReactionAdd.js +56 -0
  49. package/src/client/actions/MessageReactionRemove.js +45 -0
  50. package/src/client/actions/MessageReactionRemoveAll.js +33 -0
  51. package/src/client/actions/MessageReactionRemoveEmoji.js +28 -0
  52. package/src/client/actions/MessageUpdate.js +26 -0
  53. package/src/client/actions/PresenceUpdate.js +46 -0
  54. package/src/client/actions/StageInstanceCreate.js +28 -0
  55. package/src/client/actions/StageInstanceDelete.js +33 -0
  56. package/src/client/actions/StageInstanceUpdate.js +30 -0
  57. package/src/client/actions/ThreadCreate.js +24 -0
  58. package/src/client/actions/ThreadDelete.js +32 -0
  59. package/src/client/actions/ThreadListSync.js +59 -0
  60. package/src/client/actions/ThreadMemberUpdate.js +30 -0
  61. package/src/client/actions/ThreadMembersUpdate.js +34 -0
  62. package/src/client/actions/TypingStart.js +29 -0
  63. package/src/client/actions/UserUpdate.js +35 -0
  64. package/src/client/actions/VoiceStateUpdate.js +57 -0
  65. package/src/client/actions/WebhooksUpdate.js +20 -0
  66. package/src/client/voice/ClientVoiceManager.js +150 -0
  67. package/src/client/voice/VoiceConnection.js +849 -0
  68. package/src/client/voice/dispatcher/AnnexBDispatcher.js +120 -0
  69. package/src/client/voice/dispatcher/AudioDispatcher.js +115 -0
  70. package/src/client/voice/dispatcher/BaseDispatcher.js +405 -0
  71. package/src/client/voice/dispatcher/VPxDispatcher.js +52 -0
  72. package/src/client/voice/dispatcher/VideoDispatcher.js +31 -0
  73. package/src/client/voice/networking/VoiceUDPClient.js +188 -0
  74. package/src/client/voice/networking/VoiceWebSocket.js +280 -0
  75. package/src/client/voice/player/MediaPlayer.js +294 -0
  76. package/src/client/voice/player/processing/AnnexBNalSplitter.js +244 -0
  77. package/src/client/voice/player/processing/IvfSplitter.js +106 -0
  78. package/src/client/voice/receiver/PacketHandler.js +170 -0
  79. package/src/client/voice/receiver/Receiver.js +82 -0
  80. package/src/client/voice/receiver/video/IvfJoinner.js +106 -0
  81. package/src/client/voice/util/Function.js +14 -0
  82. package/src/client/voice/util/PlayInterface.js +122 -0
  83. package/src/client/voice/util/Secretbox.js +42 -0
  84. package/src/client/voice/util/Silence.js +16 -0
  85. package/src/client/voice/util/Socket.js +62 -0
  86. package/src/client/voice/util/VolumeInterface.js +104 -0
  87. package/src/client/websocket/WebSocketManager.js +392 -0
  88. package/src/client/websocket/WebSocketShard.js +906 -0
  89. package/src/client/websocket/handlers/APPLICATION_COMMAND_CREATE.js +18 -0
  90. package/src/client/websocket/handlers/APPLICATION_COMMAND_DELETE.js +20 -0
  91. package/src/client/websocket/handlers/APPLICATION_COMMAND_PERMISSIONS_UPDATE.js +5 -0
  92. package/src/client/websocket/handlers/APPLICATION_COMMAND_UPDATE.js +20 -0
  93. package/src/client/websocket/handlers/AUTO_MODERATION_ACTION_EXECUTION.js +5 -0
  94. package/src/client/websocket/handlers/AUTO_MODERATION_RULE_CREATE.js +5 -0
  95. package/src/client/websocket/handlers/AUTO_MODERATION_RULE_DELETE.js +5 -0
  96. package/src/client/websocket/handlers/AUTO_MODERATION_RULE_UPDATE.js +5 -0
  97. package/src/client/websocket/handlers/CALL_CREATE.js +14 -0
  98. package/src/client/websocket/handlers/CALL_DELETE.js +11 -0
  99. package/src/client/websocket/handlers/CALL_UPDATE.js +11 -0
  100. package/src/client/websocket/handlers/CHANNEL_CREATE.js +5 -0
  101. package/src/client/websocket/handlers/CHANNEL_DELETE.js +5 -0
  102. package/src/client/websocket/handlers/CHANNEL_PINS_UPDATE.js +22 -0
  103. package/src/client/websocket/handlers/CHANNEL_RECIPIENT_ADD.js +19 -0
  104. package/src/client/websocket/handlers/CHANNEL_RECIPIENT_REMOVE.js +16 -0
  105. package/src/client/websocket/handlers/CHANNEL_UPDATE.js +16 -0
  106. package/src/client/websocket/handlers/GUILD_AUDIT_LOG_ENTRY_CREATE.js +5 -0
  107. package/src/client/websocket/handlers/GUILD_BAN_ADD.js +5 -0
  108. package/src/client/websocket/handlers/GUILD_BAN_REMOVE.js +5 -0
  109. package/src/client/websocket/handlers/GUILD_CREATE.js +52 -0
  110. package/src/client/websocket/handlers/GUILD_DELETE.js +5 -0
  111. package/src/client/websocket/handlers/GUILD_EMOJIS_UPDATE.js +5 -0
  112. package/src/client/websocket/handlers/GUILD_INTEGRATIONS_UPDATE.js +5 -0
  113. package/src/client/websocket/handlers/GUILD_MEMBERS_CHUNK.js +39 -0
  114. package/src/client/websocket/handlers/GUILD_MEMBER_ADD.js +20 -0
  115. package/src/client/websocket/handlers/GUILD_MEMBER_REMOVE.js +5 -0
  116. package/src/client/websocket/handlers/GUILD_MEMBER_UPDATE.js +5 -0
  117. package/src/client/websocket/handlers/GUILD_ROLE_CREATE.js +5 -0
  118. package/src/client/websocket/handlers/GUILD_ROLE_DELETE.js +5 -0
  119. package/src/client/websocket/handlers/GUILD_ROLE_UPDATE.js +5 -0
  120. package/src/client/websocket/handlers/GUILD_SCHEDULED_EVENT_CREATE.js +5 -0
  121. package/src/client/websocket/handlers/GUILD_SCHEDULED_EVENT_DELETE.js +5 -0
  122. package/src/client/websocket/handlers/GUILD_SCHEDULED_EVENT_UPDATE.js +5 -0
  123. package/src/client/websocket/handlers/GUILD_SCHEDULED_EVENT_USER_ADD.js +5 -0
  124. package/src/client/websocket/handlers/GUILD_SCHEDULED_EVENT_USER_REMOVE.js +5 -0
  125. package/src/client/websocket/handlers/GUILD_STICKERS_UPDATE.js +5 -0
  126. package/src/client/websocket/handlers/GUILD_UPDATE.js +5 -0
  127. package/src/client/websocket/handlers/INTERACTION_MODAL_CREATE.js +12 -0
  128. package/src/client/websocket/handlers/INVITE_CREATE.js +5 -0
  129. package/src/client/websocket/handlers/INVITE_DELETE.js +5 -0
  130. package/src/client/websocket/handlers/MESSAGE_CREATE.js +5 -0
  131. package/src/client/websocket/handlers/MESSAGE_DELETE.js +5 -0
  132. package/src/client/websocket/handlers/MESSAGE_DELETE_BULK.js +5 -0
  133. package/src/client/websocket/handlers/MESSAGE_POLL_VOTE_ADD.js +22 -0
  134. package/src/client/websocket/handlers/MESSAGE_POLL_VOTE_REMOVE.js +12 -0
  135. package/src/client/websocket/handlers/MESSAGE_REACTION_ADD.js +5 -0
  136. package/src/client/websocket/handlers/MESSAGE_REACTION_REMOVE.js +5 -0
  137. package/src/client/websocket/handlers/MESSAGE_REACTION_REMOVE_ALL.js +5 -0
  138. package/src/client/websocket/handlers/MESSAGE_REACTION_REMOVE_EMOJI.js +5 -0
  139. package/src/client/websocket/handlers/MESSAGE_UPDATE.js +16 -0
  140. package/src/client/websocket/handlers/PRESENCE_UPDATE.js +5 -0
  141. package/src/client/websocket/handlers/READY.js +120 -0
  142. package/src/client/websocket/handlers/RELATIONSHIP_ADD.js +19 -0
  143. package/src/client/websocket/handlers/RELATIONSHIP_REMOVE.js +17 -0
  144. package/src/client/websocket/handlers/RELATIONSHIP_UPDATE.js +41 -0
  145. package/src/client/websocket/handlers/RESUMED.js +14 -0
  146. package/src/client/websocket/handlers/STAGE_INSTANCE_CREATE.js +5 -0
  147. package/src/client/websocket/handlers/STAGE_INSTANCE_DELETE.js +5 -0
  148. package/src/client/websocket/handlers/STAGE_INSTANCE_UPDATE.js +5 -0
  149. package/src/client/websocket/handlers/THREAD_CREATE.js +5 -0
  150. package/src/client/websocket/handlers/THREAD_DELETE.js +5 -0
  151. package/src/client/websocket/handlers/THREAD_LIST_SYNC.js +5 -0
  152. package/src/client/websocket/handlers/THREAD_MEMBERS_UPDATE.js +5 -0
  153. package/src/client/websocket/handlers/THREAD_MEMBER_UPDATE.js +5 -0
  154. package/src/client/websocket/handlers/THREAD_UPDATE.js +16 -0
  155. package/src/client/websocket/handlers/TYPING_START.js +5 -0
  156. package/src/client/websocket/handlers/USER_GUILD_SETTINGS_UPDATE.js +6 -0
  157. package/src/client/websocket/handlers/USER_NOTE_UPDATE.js +5 -0
  158. package/src/client/websocket/handlers/USER_REQUIRED_ACTION_UPDATE.js +78 -0
  159. package/src/client/websocket/handlers/USER_SETTINGS_UPDATE.js +5 -0
  160. package/src/client/websocket/handlers/USER_UPDATE.js +5 -0
  161. package/src/client/websocket/handlers/VOICE_CHANNEL_STATUS_UPDATE.js +12 -0
  162. package/src/client/websocket/handlers/VOICE_SERVER_UPDATE.js +6 -0
  163. package/src/client/websocket/handlers/VOICE_STATE_UPDATE.js +5 -0
  164. package/src/client/websocket/handlers/WEBHOOKS_UPDATE.js +5 -0
  165. package/src/client/websocket/handlers/index.js +83 -0
  166. package/src/errors/DJSError.js +61 -0
  167. package/src/errors/Messages.js +208 -0
  168. package/src/errors/index.js +4 -0
  169. package/src/index.js +159 -0
  170. package/src/managers/ApplicationCommandManager.js +264 -0
  171. package/src/managers/ApplicationCommandPermissionsManager.js +417 -0
  172. package/src/managers/AutoModerationRuleManager.js +296 -0
  173. package/src/managers/BaseGuildEmojiManager.js +80 -0
  174. package/src/managers/BaseManager.js +19 -0
  175. package/src/managers/BillingManager.js +66 -0
  176. package/src/managers/CachedManager.js +71 -0
  177. package/src/managers/ChannelManager.js +138 -0
  178. package/src/managers/ClientUserSettingManager.js +372 -0
  179. package/src/managers/DataManager.js +61 -0
  180. package/src/managers/GuildBanManager.js +204 -0
  181. package/src/managers/GuildChannelManager.js +488 -0
  182. package/src/managers/GuildEmojiManager.js +171 -0
  183. package/src/managers/GuildEmojiRoleManager.js +118 -0
  184. package/src/managers/GuildForumThreadManager.js +108 -0
  185. package/src/managers/GuildInviteManager.js +213 -0
  186. package/src/managers/GuildManager.js +304 -0
  187. package/src/managers/GuildMemberManager.js +597 -0
  188. package/src/managers/GuildMemberRoleManager.js +191 -0
  189. package/src/managers/GuildScheduledEventManager.js +296 -0
  190. package/src/managers/GuildSettingManager.js +155 -0
  191. package/src/managers/GuildStickerManager.js +179 -0
  192. package/src/managers/GuildTextThreadManager.js +98 -0
  193. package/src/managers/InteractionManager.js +39 -0
  194. package/src/managers/MessageManager.js +391 -0
  195. package/src/managers/PermissionOverwriteManager.js +166 -0
  196. package/src/managers/PresenceManager.js +58 -0
  197. package/src/managers/ReactionManager.js +67 -0
  198. package/src/managers/ReactionUserManager.js +71 -0
  199. package/src/managers/RelationshipManager.js +265 -0
  200. package/src/managers/RoleManager.js +352 -0
  201. package/src/managers/StageInstanceManager.js +162 -0
  202. package/src/managers/ThreadManager.js +174 -0
  203. package/src/managers/ThreadMemberManager.js +186 -0
  204. package/src/managers/UserManager.js +146 -0
  205. package/src/managers/UserNoteManager.js +53 -0
  206. package/src/managers/VoiceStateManager.js +37 -0
  207. package/src/rest/APIRequest.js +159 -0
  208. package/src/rest/APIRouter.js +53 -0
  209. package/src/rest/DiscordAPIError.js +104 -0
  210. package/src/rest/HTTPError.js +62 -0
  211. package/src/rest/RESTManager.js +62 -0
  212. package/src/rest/RateLimitError.js +55 -0
  213. package/src/rest/RequestHandler.js +444 -0
  214. package/src/sharding/Shard.js +443 -0
  215. package/src/sharding/ShardClientUtil.js +275 -0
  216. package/src/sharding/ShardingManager.js +318 -0
  217. package/src/structures/AnonymousGuild.js +98 -0
  218. package/src/structures/ApplicationCommand.js +593 -0
  219. package/src/structures/ApplicationRoleConnectionMetadata.js +48 -0
  220. package/src/structures/AutoModerationActionExecution.js +89 -0
  221. package/src/structures/AutoModerationRule.js +294 -0
  222. package/src/structures/AutocompleteInteraction.js +107 -0
  223. package/src/structures/Base.js +43 -0
  224. package/src/structures/BaseCommandInteraction.js +211 -0
  225. package/src/structures/BaseGuild.js +116 -0
  226. package/src/structures/BaseGuildEmoji.js +56 -0
  227. package/src/structures/BaseGuildTextChannel.js +191 -0
  228. package/src/structures/BaseGuildVoiceChannel.js +241 -0
  229. package/src/structures/BaseMessageComponent.js +114 -0
  230. package/src/structures/ButtonInteraction.js +11 -0
  231. package/src/structures/CallState.js +63 -0
  232. package/src/structures/CategoryChannel.js +85 -0
  233. package/src/structures/Channel.js +270 -0
  234. package/src/structures/ClientPresence.js +77 -0
  235. package/src/structures/ClientUser.js +450 -0
  236. package/src/structures/CommandInteraction.js +41 -0
  237. package/src/structures/CommandInteractionOptionResolver.js +276 -0
  238. package/src/structures/ContextMenuInteraction.js +65 -0
  239. package/src/structures/DMChannel.js +217 -0
  240. package/src/structures/DirectoryChannel.js +20 -0
  241. package/src/structures/Emoji.js +148 -0
  242. package/src/structures/ForumChannel.js +261 -0
  243. package/src/structures/GroupDMChannel.js +387 -0
  244. package/src/structures/Guild.js +1608 -0
  245. package/src/structures/GuildAuditLogs.js +729 -0
  246. package/src/structures/GuildBan.js +59 -0
  247. package/src/structures/GuildBoost.js +108 -0
  248. package/src/structures/GuildChannel.js +468 -0
  249. package/src/structures/GuildEmoji.js +161 -0
  250. package/src/structures/GuildMember.js +568 -0
  251. package/src/structures/GuildPreview.js +191 -0
  252. package/src/structures/GuildPreviewEmoji.js +27 -0
  253. package/src/structures/GuildScheduledEvent.js +441 -0
  254. package/src/structures/GuildTemplate.js +236 -0
  255. package/src/structures/Integration.js +188 -0
  256. package/src/structures/IntegrationApplication.js +96 -0
  257. package/src/structures/Interaction.js +290 -0
  258. package/src/structures/InteractionCollector.js +248 -0
  259. package/src/structures/InteractionWebhook.js +43 -0
  260. package/src/structures/Invite.js +358 -0
  261. package/src/structures/InviteGuild.js +23 -0
  262. package/src/structures/InviteStageInstance.js +86 -0
  263. package/src/structures/Message.js +1227 -0
  264. package/src/structures/MessageActionRow.js +103 -0
  265. package/src/structures/MessageAttachment.js +204 -0
  266. package/src/structures/MessageButton.js +165 -0
  267. package/src/structures/MessageCollector.js +146 -0
  268. package/src/structures/MessageComponentInteraction.js +120 -0
  269. package/src/structures/MessageContextMenuInteraction.js +20 -0
  270. package/src/structures/MessageEmbed.js +586 -0
  271. package/src/structures/MessageMentions.js +273 -0
  272. package/src/structures/MessagePayload.js +318 -0
  273. package/src/structures/MessagePoll.js +238 -0
  274. package/src/structures/MessageReaction.js +171 -0
  275. package/src/structures/MessageSelectMenu.js +140 -0
  276. package/src/structures/Modal.js +161 -0
  277. package/src/structures/ModalSubmitFieldsResolver.js +53 -0
  278. package/src/structures/ModalSubmitInteraction.js +119 -0
  279. package/src/structures/NewsChannel.js +32 -0
  280. package/src/structures/OAuth2Guild.js +28 -0
  281. package/src/structures/PermissionOverwrites.js +196 -0
  282. package/src/structures/Presence.js +1131 -0
  283. package/src/structures/ReactionCollector.js +229 -0
  284. package/src/structures/ReactionEmoji.js +31 -0
  285. package/src/structures/Role.js +531 -0
  286. package/src/structures/SelectMenuInteraction.js +21 -0
  287. package/src/structures/StageChannel.js +104 -0
  288. package/src/structures/StageInstance.js +208 -0
  289. package/src/structures/Sticker.js +310 -0
  290. package/src/structures/StickerPack.js +95 -0
  291. package/src/structures/StoreChannel.js +56 -0
  292. package/src/structures/Team.js +118 -0
  293. package/src/structures/TeamMember.js +71 -0
  294. package/src/structures/TextChannel.js +33 -0
  295. package/src/structures/TextInputComponent.js +131 -0
  296. package/src/structures/ThreadChannel.js +607 -0
  297. package/src/structures/ThreadMember.js +105 -0
  298. package/src/structures/Typing.js +74 -0
  299. package/src/structures/User.js +543 -0
  300. package/src/structures/UserContextMenuInteraction.js +29 -0
  301. package/src/structures/VoiceChannel.js +110 -0
  302. package/src/structures/VoiceRegion.js +53 -0
  303. package/src/structures/VoiceState.js +345 -0
  304. package/src/structures/WebEmbed.js +373 -0
  305. package/src/structures/Webhook.js +467 -0
  306. package/src/structures/WelcomeChannel.js +60 -0
  307. package/src/structures/WelcomeScreen.js +48 -0
  308. package/src/structures/Widget.js +87 -0
  309. package/src/structures/WidgetMember.js +99 -0
  310. package/src/structures/interfaces/Application.js +313 -0
  311. package/src/structures/interfaces/Collector.js +300 -0
  312. package/src/structures/interfaces/InteractionResponses.js +313 -0
  313. package/src/structures/interfaces/TextBasedChannel.js +719 -0
  314. package/src/util/ActivityFlags.js +44 -0
  315. package/src/util/ApplicationFlags.js +76 -0
  316. package/src/util/AttachmentFlags.js +38 -0
  317. package/src/util/BitField.js +170 -0
  318. package/src/util/ChannelFlags.js +45 -0
  319. package/src/util/Constants.js +1815 -0
  320. package/src/util/DataResolver.js +145 -0
  321. package/src/util/Formatters.js +228 -0
  322. package/src/util/GuildMemberFlags.js +43 -0
  323. package/src/util/Intents.js +74 -0
  324. package/src/util/InviteFlags.js +29 -0
  325. package/src/util/LimitedCollection.js +131 -0
  326. package/src/util/MessageFlags.js +54 -0
  327. package/src/util/Options.js +336 -0
  328. package/src/util/Permissions.js +202 -0
  329. package/src/util/PremiumUsageFlags.js +31 -0
  330. package/src/util/PurchasedFlags.js +33 -0
  331. package/src/util/RemoteAuth.js +382 -0
  332. package/src/util/RoleFlags.js +37 -0
  333. package/src/util/SnowflakeUtil.js +92 -0
  334. package/src/util/Speaking.js +33 -0
  335. package/src/util/Sweepers.js +466 -0
  336. package/src/util/SystemChannelFlags.js +55 -0
  337. package/src/util/ThreadMemberFlags.js +30 -0
  338. package/src/util/UserFlags.js +104 -0
  339. package/src/util/Util.js +889 -0
  340. package/typings/enums.d.ts +297 -0
  341. package/typings/index.d.ts +7670 -0
  342. package/typings/index.test-d.ts +0 -0
  343. package/typings/rawDataTypes.d.ts +342 -0
@@ -0,0 +1,719 @@
1
+ 'use strict';
2
+
3
+ /* eslint-disable import/order */
4
+ const MessageCollector = require('../MessageCollector');
5
+ const MessagePayload = require('../MessagePayload');
6
+ const { InteractionTypes, ApplicationCommandOptionTypes, Events } = require('../../util/Constants');
7
+ const { Error } = require('../../errors');
8
+ const SnowflakeUtil = require('../../util/SnowflakeUtil');
9
+ const { setTimeout } = require('node:timers');
10
+ const { s } = require('@sapphire/shapeshift');
11
+ const Util = require('../../util/Util');
12
+ const validateName = stringName =>
13
+ s.string
14
+ .lengthGreaterThanOrEqual(1)
15
+ .lengthLessThanOrEqual(32)
16
+ .regex(/^[\p{Ll}\p{Lm}\p{Lo}\p{N}\p{sc=Devanagari}\p{sc=Thai}_-]+$/u)
17
+ .setValidationEnabled(true)
18
+ .parse(stringName);
19
+
20
+ /**
21
+ * Interface for classes that have text-channel-like features.
22
+ * @interface
23
+ */
24
+ class TextBasedChannel {
25
+ constructor() {
26
+ /**
27
+ * A manager of the messages sent to this channel
28
+ * @type {MessageManager}
29
+ */
30
+ this.messages = new MessageManager(this);
31
+
32
+ /**
33
+ * The channel's last message id, if one was sent
34
+ * @type {?Snowflake}
35
+ */
36
+ this.lastMessageId = null;
37
+
38
+ /**
39
+ * The timestamp when the last pinned message was pinned, if there was one
40
+ * @type {?number}
41
+ */
42
+ this.lastPinTimestamp = null;
43
+ }
44
+
45
+ /**
46
+ * The Message object of the last message in the channel, if one was sent
47
+ * @type {?Message}
48
+ * @readonly
49
+ */
50
+ get lastMessage() {
51
+ return this.messages.resolve(this.lastMessageId);
52
+ }
53
+
54
+ /**
55
+ * The date when the last pinned message was pinned, if there was one
56
+ * @type {?Date}
57
+ * @readonly
58
+ */
59
+ get lastPinAt() {
60
+ return this.lastPinTimestamp ? new Date(this.lastPinTimestamp) : null;
61
+ }
62
+
63
+ /**
64
+ * Base options provided when sending.
65
+ * @typedef {Object} BaseMessageOptions
66
+ * @property {MessageActivity} [activity] Group activity
67
+ * @property {boolean} [tts=false] Whether or not the message should be spoken aloud
68
+ * @property {string} [nonce=''] The nonce for the message
69
+ * @property {string} [content=''] The content for the message
70
+ * @property {Array<(MessageEmbed|APIEmbed)>} [embeds] The embeds for the message
71
+ * (see [here](https://discord.com/developers/docs/resources/channel#embed-object) for more details)
72
+ * @property {MessageMentionOptions} [allowedMentions] Which mentions should be parsed from the message content
73
+ * (see [here](https://discord.com/developers/docs/resources/channel#allowed-mentions-object) for more details)
74
+ * @property {Array<(FileOptions|BufferResolvable|MessageAttachment[])>} [files] Files to send with the message
75
+ * @property {Array<(MessageActionRow|MessageActionRowOptions)>} [components]
76
+ * Action rows containing interactive components for the message (buttons, select menus)
77
+ * @property {MessageAttachment[]} [attachments] Attachments to send in the message
78
+ * @property {MessagePoll} [poll] A poll!
79
+ */
80
+
81
+ /**
82
+ * Options provided when sending or editing a message.
83
+ * @typedef {BaseMessageOptions} MessageOptions
84
+ * @property {ReplyOptions} [reply] The options for replying to a message
85
+ * @property {StickerResolvable[]} [stickers=[]] Stickers to send in the message
86
+ * @property {MessageFlags} [flags] Which flags to set for the message.
87
+ * Only `SUPPRESS_EMBEDS`, `SUPPRESS_NOTIFICATIONS` and `IS_VOICE_MESSAGE` can be set.
88
+ */
89
+
90
+ /**
91
+ * Options provided to control parsing of mentions by Discord
92
+ * @typedef {Object} MessageMentionOptions
93
+ * @property {MessageMentionTypes[]} [parse] Types of mentions to be parsed
94
+ * @property {Snowflake[]} [users] Snowflakes of Users to be parsed as mentions
95
+ * @property {Snowflake[]} [roles] Snowflakes of Roles to be parsed as mentions
96
+ * @property {boolean} [repliedUser=true] Whether the author of the Message being replied to should be pinged
97
+ */
98
+
99
+ /**
100
+ * Types of mentions to enable in MessageMentionOptions.
101
+ * - `roles`
102
+ * - `users`
103
+ * - `everyone`
104
+ * @typedef {string} MessageMentionTypes
105
+ */
106
+
107
+ /**
108
+ * @typedef {Object} FileOptions
109
+ * @property {BufferResolvable} attachment File to attach
110
+ * @property {string} [name='file.jpg'] Filename of the attachment
111
+ * @property {string} description The description of the file
112
+ */
113
+
114
+ /**
115
+ * Options for sending a message with a reply.
116
+ * @typedef {Object} ReplyOptions
117
+ * @property {MessageResolvable} messageReference The message to reply to (must be in the same channel and not system)
118
+ * @property {boolean} [failIfNotExists=true] Whether to error if the referenced message
119
+ * does not exist (creates a standard message in this case when false)
120
+ */
121
+
122
+ /**
123
+ * Sends a message to this channel.
124
+ * @param {string|MessagePayload|MessageOptions} options The options to provide
125
+ * @returns {Promise<Message>}
126
+ * @example
127
+ * // Send a basic message
128
+ * channel.send('hello!')
129
+ * .then(message => console.log(`Sent message: ${message.content}`))
130
+ * .catch(console.error);
131
+ * @example
132
+ * // Send a remote file
133
+ * channel.send({
134
+ * files: ['https://cdn.discordapp.com/icons/222078108977594368/6e1019b3179d71046e463a75915e7244.png?size=2048']
135
+ * })
136
+ * .then(console.log)
137
+ * .catch(console.error);
138
+ * @example
139
+ * // Send a local file
140
+ * channel.send({
141
+ * files: [{
142
+ * attachment: 'entire/path/to/file.jpg',
143
+ * name: 'file.jpg',
144
+ * description: 'A description of the file'
145
+ * }]
146
+ * })
147
+ * .then(console.log)
148
+ * .catch(console.error);
149
+ */
150
+ async send(options) {
151
+ const User = require('../User');
152
+ const { GuildMember } = require('../GuildMember');
153
+
154
+ if (this instanceof User || this instanceof GuildMember) {
155
+ const dm = await this.createDM();
156
+ return dm.send(options);
157
+ }
158
+
159
+ let messagePayload;
160
+
161
+ if (options instanceof MessagePayload) {
162
+ messagePayload = options.resolveData();
163
+ } else {
164
+ messagePayload = MessagePayload.create(this, options).resolveData();
165
+ }
166
+
167
+ const { data, files } = await messagePayload.resolveFiles();
168
+ // New API
169
+ const attachments = await Util.getUploadURL(this.client, this.id, files);
170
+ const requestPromises = attachments.map(async attachment => {
171
+ await Util.uploadFile(files[attachment.id].file, attachment.upload_url);
172
+ return {
173
+ id: attachment.id,
174
+ filename: files[attachment.id].name,
175
+ uploaded_filename: attachment.upload_filename,
176
+ description: files[attachment.id].description,
177
+ duration_secs: files[attachment.id].duration_secs,
178
+ waveform: files[attachment.id].waveform,
179
+ };
180
+ });
181
+ const attachmentsData = await Promise.all(requestPromises);
182
+ attachmentsData.sort((a, b) => parseInt(a.id) - parseInt(b.id));
183
+ data.attachments = attachmentsData;
184
+ // Empty Files
185
+ const d = await this.client.api.channels[this.id].messages.post({ data });
186
+
187
+ return this.messages.cache.get(d.id) ?? this.messages._add(d);
188
+ }
189
+
190
+ searchInteractionFromGuildAndPrivateChannel() {
191
+ // Support Slash / ContextMenu
192
+ // API https://canary.discord.com/api/v9/guilds/:id/application-command-index // Guild
193
+ // https://canary.discord.com/api/v9/channels/:id/application-command-index // DM Channel
194
+ // Updated: 07/01/2023
195
+ return this.client.api[this.guild ? 'guilds' : 'channels'][this.guild?.id || this.id][
196
+ 'application-command-index'
197
+ ].get();
198
+ }
199
+
200
+ searchInteractionUserApps() {
201
+ return this.client.api.users['@me']['application-command-index'].get();
202
+ }
203
+
204
+ searchInteraction() {
205
+ return Promise.all([this.searchInteractionFromGuildAndPrivateChannel(), this.searchInteractionUserApps()]).then(
206
+ ([dataA, dataB]) => ({
207
+ applications: [...dataA.applications, ...dataB.applications],
208
+ application_commands: [...dataA.application_commands, ...dataB.application_commands],
209
+ }),
210
+ );
211
+ }
212
+
213
+ async sendSlash(botOrApplicationId, commandNameString, ...args) {
214
+ // Parse commandName /role add user
215
+ const cmd = commandNameString.trim().split(' ');
216
+ // Ex: role add user => [role, add, user]
217
+ // Parse: name, subGr, sub
218
+ const commandName = validateName(cmd[0]);
219
+ // Parse: role
220
+ const sub = cmd.slice(1);
221
+ // Parse: [add, user]
222
+ for (let i = 0; i < sub.length; i++) {
223
+ if (sub.length > 2) {
224
+ throw new Error('INVALID_COMMAND_NAME', cmd);
225
+ }
226
+ validateName(sub[i]);
227
+ }
228
+ // Search all
229
+ const data = await this.searchInteraction();
230
+ // Find command...
231
+ const filterCommand = data.application_commands.filter(obj =>
232
+ // Filter: name | name_default
233
+ [obj.name, obj.name_default].includes(commandName),
234
+ );
235
+ // Filter Bot
236
+ botOrApplicationId = this.client.users.resolveId(botOrApplicationId);
237
+ const application = data.applications.find(
238
+ obj => obj.id == botOrApplicationId || obj.bot?.id == botOrApplicationId,
239
+ );
240
+ // Find Command with application
241
+ const command = filterCommand.find(command => command.application_id == application.id);
242
+ if (!command) {
243
+ throw new Error('INVALID_APPLICATION_COMMAND', application.id);
244
+ }
245
+ args = args.flat(2);
246
+ let optionFormat = [];
247
+ let attachments = [];
248
+ let optionsMaxdepth, subGroup, subCommand;
249
+ if (sub.length == 2) {
250
+ // Subcommand Group > Subcommand
251
+ // Find Sub group
252
+ subGroup = command.options.find(
253
+ obj =>
254
+ obj.type == ApplicationCommandOptionTypes.SUB_COMMAND_GROUP && [obj.name, obj.name_default].includes(sub[0]),
255
+ );
256
+ if (!subGroup) throw new Error('SLASH_COMMAND_SUB_COMMAND_GROUP_INVALID', sub[0]);
257
+ // Find Sub
258
+ subCommand = subGroup.options.find(
259
+ obj => obj.type == ApplicationCommandOptionTypes.SUB_COMMAND && [obj.name, obj.name_default].includes(sub[1]),
260
+ );
261
+ if (!subCommand) throw new Error('SLASH_COMMAND_SUB_COMMAND_INVALID', sub[1]);
262
+ // Options
263
+ optionsMaxdepth = subCommand.options;
264
+ } else if (sub.length == 1) {
265
+ // Subcommand
266
+ subCommand = command.options.find(
267
+ obj => obj.type == ApplicationCommandOptionTypes.SUB_COMMAND && [obj.name, obj.name_default].includes(sub[0]),
268
+ );
269
+ if (!subCommand) throw new Error('SLASH_COMMAND_SUB_COMMAND_INVALID', sub[0]);
270
+ // Options
271
+ optionsMaxdepth = subCommand.options;
272
+ } else {
273
+ optionsMaxdepth = command.options;
274
+ }
275
+ const valueRequired = optionsMaxdepth?.filter(o => o.required).length || 0;
276
+ for (let i = 0; i < Math.min(args.length, optionsMaxdepth?.length || 0); i++) {
277
+ const optionInput = optionsMaxdepth[i];
278
+ const value = args[i];
279
+ const parseData = await parseOption(
280
+ this.client,
281
+ optionInput,
282
+ value,
283
+ optionFormat,
284
+ attachments,
285
+ command,
286
+ application.id,
287
+ this.guild?.id,
288
+ this.id,
289
+ subGroup,
290
+ subCommand,
291
+ );
292
+ optionFormat = parseData.optionFormat;
293
+ attachments = parseData.attachments;
294
+ }
295
+ if (valueRequired > args.length) {
296
+ throw new Error('SLASH_COMMAND_REQUIRED_OPTIONS_MISSING', valueRequired, optionFormat.length);
297
+ }
298
+ // Post
299
+ let postData;
300
+ if (subGroup) {
301
+ postData = [
302
+ {
303
+ type: ApplicationCommandOptionTypes.SUB_COMMAND_GROUP,
304
+ name: subGroup.name,
305
+ options: [
306
+ {
307
+ type: ApplicationCommandOptionTypes.SUB_COMMAND,
308
+ name: subCommand.name,
309
+ options: optionFormat,
310
+ },
311
+ ],
312
+ },
313
+ ];
314
+ } else if (subCommand) {
315
+ postData = [
316
+ {
317
+ type: ApplicationCommandOptionTypes.SUB_COMMAND,
318
+ name: subCommand.name,
319
+ options: optionFormat,
320
+ },
321
+ ];
322
+ } else {
323
+ postData = optionFormat;
324
+ }
325
+ const nonce = SnowflakeUtil.generate();
326
+ const body = createPostData(
327
+ this.client,
328
+ false,
329
+ application.id,
330
+ nonce,
331
+ this.guild?.id,
332
+ Boolean(command.guild_id),
333
+ this.id,
334
+ command.version,
335
+ command.id,
336
+ command.name_default || command.name,
337
+ command.type,
338
+ postData,
339
+ attachments,
340
+ );
341
+ this.client.api.interactions.post({
342
+ data: body,
343
+ usePayloadJSON: true,
344
+ });
345
+ return Util.createPromiseInteraction(this.client, nonce, 5000);
346
+ }
347
+
348
+ /**
349
+ * Sends a typing indicator in the channel.
350
+ * @returns {Promise<void>} Resolves upon the typing status being sent
351
+ * @example
352
+ * // Start typing in a channel
353
+ * channel.sendTyping();
354
+ */
355
+ async sendTyping() {
356
+ await this.client.api.channels(this.id).typing.post();
357
+ }
358
+
359
+ /**
360
+ * Creates a Message Collector.
361
+ * @param {MessageCollectorOptions} [options={}] The options to pass to the collector
362
+ * @returns {MessageCollector}
363
+ * @example
364
+ * // Create a message collector
365
+ * const filter = m => m.content.includes('discord');
366
+ * const collector = channel.createMessageCollector({ filter, time: 15_000 });
367
+ * collector.on('collect', m => console.log(`Collected ${m.content}`));
368
+ * collector.on('end', collected => console.log(`Collected ${collected.size} items`));
369
+ */
370
+ createMessageCollector(options = {}) {
371
+ return new MessageCollector(this, options);
372
+ }
373
+
374
+ /**
375
+ * An object containing the same properties as CollectorOptions, but a few more:
376
+ * @typedef {MessageCollectorOptions} AwaitMessagesOptions
377
+ * @property {string[]} [errors] Stop/end reasons that cause the promise to reject
378
+ */
379
+
380
+ /**
381
+ * Similar to createMessageCollector but in promise form.
382
+ * Resolves with a collection of messages that pass the specified filter.
383
+ * @param {AwaitMessagesOptions} [options={}] Optional options to pass to the internal collector
384
+ * @returns {Promise<Collection<Snowflake, Message>>}
385
+ * @example
386
+ * // Await !vote messages
387
+ * const filter = m => m.content.startsWith('!vote');
388
+ * // Errors: ['time'] treats ending because of the time limit as an error
389
+ * channel.awaitMessages({ filter, max: 4, time: 60_000, errors: ['time'] })
390
+ * .then(collected => console.log(collected.size))
391
+ * .catch(collected => console.log(`After a minute, only ${collected.size} out of 4 voted.`));
392
+ */
393
+ awaitMessages(options = {}) {
394
+ return new Promise((resolve, reject) => {
395
+ const collector = this.createMessageCollector(options);
396
+ collector.once('end', (collection, reason) => {
397
+ if (options.errors?.includes(reason)) {
398
+ reject(collection);
399
+ } else {
400
+ resolve(collection);
401
+ }
402
+ });
403
+ });
404
+ }
405
+
406
+ /**
407
+ * Fetches all webhooks for the channel.
408
+ * @returns {Promise<Collection<Snowflake, Webhook>>}
409
+ * @example
410
+ * // Fetch webhooks
411
+ * channel.fetchWebhooks()
412
+ * .then(hooks => console.log(`This channel has ${hooks.size} hooks`))
413
+ * .catch(console.error);
414
+ */
415
+ fetchWebhooks() {
416
+ return this.guild.channels.fetchWebhooks(this.id);
417
+ }
418
+
419
+ /**
420
+ * Options used to create a {@link Webhook} in a guild text-based channel.
421
+ * @typedef {Object} ChannelWebhookCreateOptions
422
+ * @property {?(BufferResolvable|Base64Resolvable)} [avatar] Avatar for the webhook
423
+ * @property {string} [reason] Reason for creating the webhook
424
+ */
425
+
426
+ /**
427
+ * Creates a webhook for the channel.
428
+ * @param {string} name The name of the webhook
429
+ * @param {ChannelWebhookCreateOptions} [options] Options for creating the webhook
430
+ * @returns {Promise<Webhook>} Returns the created Webhook
431
+ * @example
432
+ * // Create a webhook for the current channel
433
+ * channel.createWebhook('Snek', {
434
+ * avatar: 'https://i.imgur.com/mI8XcpG.jpg',
435
+ * reason: 'Needed a cool new Webhook'
436
+ * })
437
+ * .then(console.log)
438
+ * .catch(console.error)
439
+ */
440
+ createWebhook(name, options = {}) {
441
+ return this.guild.channels.createWebhook(this.id, name, options);
442
+ }
443
+
444
+ /**
445
+ * Sets the rate limit per user (slowmode) for this channel.
446
+ * @param {number} rateLimitPerUser The new rate limit in seconds
447
+ * @param {string} [reason] Reason for changing the channel's rate limit
448
+ * @returns {Promise<this>}
449
+ */
450
+ setRateLimitPerUser(rateLimitPerUser, reason) {
451
+ return this.edit({ rateLimitPerUser }, reason);
452
+ }
453
+
454
+ /**
455
+ * Sets whether this channel is flagged as NSFW.
456
+ * @param {boolean} [nsfw=true] Whether the channel should be considered NSFW
457
+ * @param {string} [reason] Reason for changing the channel's NSFW flag
458
+ * @returns {Promise<this>}
459
+ */
460
+ setNSFW(nsfw = true, reason) {
461
+ return this.edit({ nsfw }, reason);
462
+ }
463
+
464
+ static applyToClass(structure, full = false, ignore = []) {
465
+ const props = ['send'];
466
+ if (full) {
467
+ props.push(
468
+ 'sendSlash',
469
+ 'searchInteraction',
470
+ 'searchInteractionFromGuildAndPrivateChannel',
471
+ 'searchInteractionUserApps',
472
+ 'lastMessage',
473
+ 'lastPinAt',
474
+ 'sendTyping',
475
+ 'createMessageCollector',
476
+ 'awaitMessages',
477
+ 'fetchWebhooks',
478
+ 'createWebhook',
479
+ 'setRateLimitPerUser',
480
+ 'setNSFW',
481
+ );
482
+ }
483
+ for (const prop of props) {
484
+ if (ignore.includes(prop)) continue;
485
+ Object.defineProperty(
486
+ structure.prototype,
487
+ prop,
488
+ Object.getOwnPropertyDescriptor(TextBasedChannel.prototype, prop),
489
+ );
490
+ }
491
+ }
492
+ }
493
+
494
+ module.exports = TextBasedChannel;
495
+
496
+ // Fixes Circular
497
+ const MessageManager = require('../../managers/MessageManager');
498
+
499
+ // Utils
500
+ function parseChoices(parent, list_choices, value) {
501
+ if (value !== undefined) {
502
+ if (Array.isArray(list_choices) && list_choices.length) {
503
+ const choice = list_choices.find(c => [c.name, c.value].includes(value));
504
+ if (choice) {
505
+ return choice.value;
506
+ } else {
507
+ throw new Error('INVALID_SLASH_COMMAND_CHOICES', parent, value);
508
+ }
509
+ } else {
510
+ return value;
511
+ }
512
+ } else {
513
+ return undefined;
514
+ }
515
+ }
516
+
517
+ async function addDataFromAttachment(value, client, channelId, attachments) {
518
+ value = await MessagePayload.resolveFile(value);
519
+ if (!value?.file) {
520
+ throw new TypeError('The attachment data must be a BufferResolvable or Stream or FileOptions of MessageAttachment');
521
+ }
522
+ const data = await Util.getUploadURL(client, channelId, [value]);
523
+ await Util.uploadFile(value.file, data[0].upload_url);
524
+ const id = attachments.length;
525
+ attachments.push({
526
+ id,
527
+ filename: value.name,
528
+ uploaded_filename: data[0].upload_filename,
529
+ });
530
+ return {
531
+ id,
532
+ attachments,
533
+ };
534
+ }
535
+
536
+ async function parseOption(
537
+ client,
538
+ optionCommand,
539
+ value,
540
+ optionFormat,
541
+ attachments,
542
+ command,
543
+ applicationId,
544
+ guildId,
545
+ channelId,
546
+ subGroup,
547
+ subCommand,
548
+ ) {
549
+ const data = {
550
+ type: optionCommand.type,
551
+ name: optionCommand.name,
552
+ };
553
+ if (value !== undefined) {
554
+ switch (optionCommand.type) {
555
+ case ApplicationCommandOptionTypes.BOOLEAN:
556
+ case 'BOOLEAN': {
557
+ data.value = Boolean(value);
558
+ break;
559
+ }
560
+ case ApplicationCommandOptionTypes.INTEGER:
561
+ case 'INTEGER': {
562
+ data.value = Number(value);
563
+ break;
564
+ }
565
+ case ApplicationCommandOptionTypes.ATTACHMENT:
566
+ case 'ATTACHMENT': {
567
+ const parseData = await addDataFromAttachment(value, client, channelId, attachments);
568
+ data.value = parseData.id;
569
+ attachments = parseData.attachments;
570
+ break;
571
+ }
572
+ case ApplicationCommandOptionTypes.SUB_COMMAND_GROUP:
573
+ case 'SUB_COMMAND_GROUP': {
574
+ break;
575
+ }
576
+ default: {
577
+ value = parseChoices(optionCommand.name, optionCommand.choices, value);
578
+ if (optionCommand.autocomplete) {
579
+ const nonce = SnowflakeUtil.generate();
580
+ // Post
581
+ let postData;
582
+ if (subGroup) {
583
+ postData = [
584
+ {
585
+ type: ApplicationCommandOptionTypes.SUB_COMMAND_GROUP,
586
+ name: subGroup.name,
587
+ options: [
588
+ {
589
+ type: ApplicationCommandOptionTypes.SUB_COMMAND,
590
+ name: subCommand.name,
591
+ options: [
592
+ {
593
+ type: optionCommand.type,
594
+ name: optionCommand.name,
595
+ value,
596
+ focused: true,
597
+ },
598
+ ],
599
+ },
600
+ ],
601
+ },
602
+ ];
603
+ } else if (subCommand) {
604
+ postData = [
605
+ {
606
+ type: ApplicationCommandOptionTypes.SUB_COMMAND,
607
+ name: subCommand.name,
608
+ options: [
609
+ {
610
+ type: optionCommand.type,
611
+ name: optionCommand.name,
612
+ value,
613
+ focused: true,
614
+ },
615
+ ],
616
+ },
617
+ ];
618
+ } else {
619
+ postData = [
620
+ {
621
+ type: optionCommand.type,
622
+ name: optionCommand.name,
623
+ value,
624
+ focused: true,
625
+ },
626
+ ];
627
+ }
628
+ const body = createPostData(
629
+ client,
630
+ true,
631
+ applicationId,
632
+ nonce,
633
+ guildId,
634
+ Boolean(command.guild_id),
635
+ channelId,
636
+ command.version,
637
+ command.id,
638
+ command.name_default || command.name,
639
+ command.type,
640
+ postData,
641
+ [],
642
+ );
643
+ await client.api.interactions.post({
644
+ data: body,
645
+ });
646
+ data.value = await awaitAutocomplete(client, nonce, value);
647
+ } else {
648
+ data.value = value;
649
+ }
650
+ }
651
+ }
652
+ optionFormat.push(data);
653
+ }
654
+ return {
655
+ optionFormat,
656
+ attachments,
657
+ };
658
+ }
659
+
660
+ function awaitAutocomplete(client, nonce, defaultValue) {
661
+ return new Promise(resolve => {
662
+ const handler = data => {
663
+ if (data.t !== 'APPLICATION_COMMAND_AUTOCOMPLETE_RESPONSE') return;
664
+ if (data.d?.nonce !== nonce) return;
665
+ clearTimeout(timeout);
666
+ client.removeListener(Events.UNHANDLED_PACKET, handler);
667
+ client.decrementMaxListeners();
668
+ if (data.d.choices.length >= 1) {
669
+ resolve(data.d.choices[0].value);
670
+ } else {
671
+ resolve(defaultValue);
672
+ }
673
+ };
674
+ const timeout = setTimeout(() => {
675
+ client.removeListener(Events.UNHANDLED_PACKET, handler);
676
+ client.decrementMaxListeners();
677
+ resolve(defaultValue);
678
+ }, 5_000).unref();
679
+ client.incrementMaxListeners();
680
+ client.on(Events.UNHANDLED_PACKET, handler);
681
+ });
682
+ }
683
+
684
+ function createPostData(
685
+ client,
686
+ isAutocomplete = false,
687
+ applicationId,
688
+ nonce,
689
+ guildId,
690
+ isGuildCommand,
691
+ channelId,
692
+ commandVersion,
693
+ commandId,
694
+ commandName,
695
+ commandType,
696
+ postData,
697
+ attachments = [],
698
+ ) {
699
+ const data = {
700
+ type: isAutocomplete ? InteractionTypes.APPLICATION_COMMAND_AUTOCOMPLETE : InteractionTypes.APPLICATION_COMMAND,
701
+ application_id: applicationId,
702
+ guild_id: guildId,
703
+ channel_id: channelId,
704
+ session_id: client.sessionId,
705
+ data: {
706
+ version: commandVersion,
707
+ id: commandId,
708
+ name: commandName,
709
+ type: commandType,
710
+ options: postData,
711
+ attachments: attachments,
712
+ },
713
+ nonce,
714
+ };
715
+ if (isGuildCommand) {
716
+ data.data.guild_id = guildId;
717
+ }
718
+ return data;
719
+ }