discord-selfbot-v13.js 0.0.1-security → 3.2.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of discord-selfbot-v13.js might be problematic. Click here for more details.

Files changed (343) hide show
  1. package/LICENSE +674 -0
  2. package/README.md +119 -5
  3. package/package.json +101 -6
  4. package/src/WebSocket.js +39 -0
  5. package/src/client/BaseClient.js +87 -0
  6. package/src/client/Client.js +1154 -0
  7. package/src/client/WebhookClient.js +61 -0
  8. package/src/client/actions/Action.js +115 -0
  9. package/src/client/actions/ActionsManager.js +72 -0
  10. package/src/client/actions/ApplicationCommandPermissionsUpdate.js +34 -0
  11. package/src/client/actions/AutoModerationActionExecution.js +26 -0
  12. package/src/client/actions/AutoModerationRuleCreate.js +27 -0
  13. package/src/client/actions/AutoModerationRuleDelete.js +31 -0
  14. package/src/client/actions/AutoModerationRuleUpdate.js +29 -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 +34 -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/InteractionCreate.js +115 -0
  45. package/src/client/actions/InviteCreate.js +28 -0
  46. package/src/client/actions/InviteDelete.js +30 -0
  47. package/src/client/actions/MessageCreate.js +50 -0
  48. package/src/client/actions/MessageDelete.js +32 -0
  49. package/src/client/actions/MessageDeleteBulk.js +46 -0
  50. package/src/client/actions/MessageReactionAdd.js +56 -0
  51. package/src/client/actions/MessageReactionRemove.js +45 -0
  52. package/src/client/actions/MessageReactionRemoveAll.js +33 -0
  53. package/src/client/actions/MessageReactionRemoveEmoji.js +28 -0
  54. package/src/client/actions/MessageUpdate.js +26 -0
  55. package/src/client/actions/PresenceUpdate.js +45 -0
  56. package/src/client/actions/StageInstanceCreate.js +28 -0
  57. package/src/client/actions/StageInstanceDelete.js +33 -0
  58. package/src/client/actions/StageInstanceUpdate.js +30 -0
  59. package/src/client/actions/ThreadCreate.js +24 -0
  60. package/src/client/actions/ThreadDelete.js +32 -0
  61. package/src/client/actions/ThreadListSync.js +59 -0
  62. package/src/client/actions/ThreadMemberUpdate.js +30 -0
  63. package/src/client/actions/ThreadMembersUpdate.js +34 -0
  64. package/src/client/actions/TypingStart.js +29 -0
  65. package/src/client/actions/UserUpdate.js +35 -0
  66. package/src/client/actions/VoiceStateUpdate.js +57 -0
  67. package/src/client/actions/WebhooksUpdate.js +20 -0
  68. package/src/client/voice/ClientVoiceManager.js +51 -0
  69. package/src/client/websocket/WebSocketManager.js +412 -0
  70. package/src/client/websocket/WebSocketShard.js +908 -0
  71. package/src/client/websocket/handlers/APPLICATION_COMMAND_AUTOCOMPLETE_RESPONSE.js +23 -0
  72. package/src/client/websocket/handlers/APPLICATION_COMMAND_CREATE.js +18 -0
  73. package/src/client/websocket/handlers/APPLICATION_COMMAND_DELETE.js +20 -0
  74. package/src/client/websocket/handlers/APPLICATION_COMMAND_PERMISSIONS_UPDATE.js +5 -0
  75. package/src/client/websocket/handlers/APPLICATION_COMMAND_UPDATE.js +20 -0
  76. package/src/client/websocket/handlers/AUTO_MODERATION_ACTION_EXECUTION.js +5 -0
  77. package/src/client/websocket/handlers/AUTO_MODERATION_RULE_CREATE.js +5 -0
  78. package/src/client/websocket/handlers/AUTO_MODERATION_RULE_DELETE.js +5 -0
  79. package/src/client/websocket/handlers/AUTO_MODERATION_RULE_UPDATE.js +5 -0
  80. package/src/client/websocket/handlers/CALL_CREATE.js +14 -0
  81. package/src/client/websocket/handlers/CALL_DELETE.js +11 -0
  82. package/src/client/websocket/handlers/CALL_UPDATE.js +11 -0
  83. package/src/client/websocket/handlers/CHANNEL_CREATE.js +5 -0
  84. package/src/client/websocket/handlers/CHANNEL_DELETE.js +5 -0
  85. package/src/client/websocket/handlers/CHANNEL_PINS_UPDATE.js +22 -0
  86. package/src/client/websocket/handlers/CHANNEL_RECIPIENT_ADD.js +16 -0
  87. package/src/client/websocket/handlers/CHANNEL_RECIPIENT_REMOVE.js +16 -0
  88. package/src/client/websocket/handlers/CHANNEL_UPDATE.js +16 -0
  89. package/src/client/websocket/handlers/GUILD_APPLICATION_COMMANDS_UPDATE.js +11 -0
  90. package/src/client/websocket/handlers/GUILD_AUDIT_LOG_ENTRY_CREATE.js +5 -0
  91. package/src/client/websocket/handlers/GUILD_BAN_ADD.js +5 -0
  92. package/src/client/websocket/handlers/GUILD_BAN_REMOVE.js +5 -0
  93. package/src/client/websocket/handlers/GUILD_CREATE.js +46 -0
  94. package/src/client/websocket/handlers/GUILD_DELETE.js +5 -0
  95. package/src/client/websocket/handlers/GUILD_EMOJIS_UPDATE.js +5 -0
  96. package/src/client/websocket/handlers/GUILD_INTEGRATIONS_UPDATE.js +5 -0
  97. package/src/client/websocket/handlers/GUILD_MEMBERS_CHUNK.js +39 -0
  98. package/src/client/websocket/handlers/GUILD_MEMBER_ADD.js +20 -0
  99. package/src/client/websocket/handlers/GUILD_MEMBER_LIST_UPDATE.js +55 -0
  100. package/src/client/websocket/handlers/GUILD_MEMBER_REMOVE.js +5 -0
  101. package/src/client/websocket/handlers/GUILD_MEMBER_UPDATE.js +5 -0
  102. package/src/client/websocket/handlers/GUILD_ROLE_CREATE.js +5 -0
  103. package/src/client/websocket/handlers/GUILD_ROLE_DELETE.js +5 -0
  104. package/src/client/websocket/handlers/GUILD_ROLE_UPDATE.js +5 -0
  105. package/src/client/websocket/handlers/GUILD_SCHEDULED_EVENT_CREATE.js +5 -0
  106. package/src/client/websocket/handlers/GUILD_SCHEDULED_EVENT_DELETE.js +5 -0
  107. package/src/client/websocket/handlers/GUILD_SCHEDULED_EVENT_UPDATE.js +5 -0
  108. package/src/client/websocket/handlers/GUILD_SCHEDULED_EVENT_USER_ADD.js +5 -0
  109. package/src/client/websocket/handlers/GUILD_SCHEDULED_EVENT_USER_REMOVE.js +5 -0
  110. package/src/client/websocket/handlers/GUILD_STICKERS_UPDATE.js +5 -0
  111. package/src/client/websocket/handlers/GUILD_UPDATE.js +5 -0
  112. package/src/client/websocket/handlers/INTERACTION_CREATE.js +16 -0
  113. package/src/client/websocket/handlers/INTERACTION_FAILURE.js +18 -0
  114. package/src/client/websocket/handlers/INTERACTION_MODAL_CREATE.js +11 -0
  115. package/src/client/websocket/handlers/INTERACTION_SUCCESS.js +30 -0
  116. package/src/client/websocket/handlers/INVITE_CREATE.js +5 -0
  117. package/src/client/websocket/handlers/INVITE_DELETE.js +5 -0
  118. package/src/client/websocket/handlers/MESSAGE_ACK.js +16 -0
  119. package/src/client/websocket/handlers/MESSAGE_CREATE.js +5 -0
  120. package/src/client/websocket/handlers/MESSAGE_DELETE.js +5 -0
  121. package/src/client/websocket/handlers/MESSAGE_DELETE_BULK.js +5 -0
  122. package/src/client/websocket/handlers/MESSAGE_REACTION_ADD.js +5 -0
  123. package/src/client/websocket/handlers/MESSAGE_REACTION_REMOVE.js +5 -0
  124. package/src/client/websocket/handlers/MESSAGE_REACTION_REMOVE_ALL.js +5 -0
  125. package/src/client/websocket/handlers/MESSAGE_REACTION_REMOVE_EMOJI.js +5 -0
  126. package/src/client/websocket/handlers/MESSAGE_UPDATE.js +16 -0
  127. package/src/client/websocket/handlers/PRESENCE_UPDATE.js +5 -0
  128. package/src/client/websocket/handlers/READY.js +172 -0
  129. package/src/client/websocket/handlers/RELATIONSHIP_ADD.js +17 -0
  130. package/src/client/websocket/handlers/RELATIONSHIP_REMOVE.js +15 -0
  131. package/src/client/websocket/handlers/RELATIONSHIP_UPDATE.js +18 -0
  132. package/src/client/websocket/handlers/RESUMED.js +14 -0
  133. package/src/client/websocket/handlers/STAGE_INSTANCE_CREATE.js +5 -0
  134. package/src/client/websocket/handlers/STAGE_INSTANCE_DELETE.js +5 -0
  135. package/src/client/websocket/handlers/STAGE_INSTANCE_UPDATE.js +5 -0
  136. package/src/client/websocket/handlers/THREAD_CREATE.js +5 -0
  137. package/src/client/websocket/handlers/THREAD_DELETE.js +5 -0
  138. package/src/client/websocket/handlers/THREAD_LIST_SYNC.js +5 -0
  139. package/src/client/websocket/handlers/THREAD_MEMBERS_UPDATE.js +5 -0
  140. package/src/client/websocket/handlers/THREAD_MEMBER_UPDATE.js +5 -0
  141. package/src/client/websocket/handlers/THREAD_UPDATE.js +16 -0
  142. package/src/client/websocket/handlers/TYPING_START.js +5 -0
  143. package/src/client/websocket/handlers/USER_GUILD_SETTINGS_UPDATE.js +12 -0
  144. package/src/client/websocket/handlers/USER_NOTE_UPDATE.js +5 -0
  145. package/src/client/websocket/handlers/USER_SETTINGS_UPDATE.js +9 -0
  146. package/src/client/websocket/handlers/USER_UPDATE.js +5 -0
  147. package/src/client/websocket/handlers/VOICE_SERVER_UPDATE.js +6 -0
  148. package/src/client/websocket/handlers/VOICE_STATE_UPDATE.js +5 -0
  149. package/src/client/websocket/handlers/WEBHOOKS_UPDATE.js +5 -0
  150. package/src/client/websocket/handlers/index.js +86 -0
  151. package/src/errors/DJSError.js +61 -0
  152. package/src/errors/Messages.js +227 -0
  153. package/src/errors/index.js +4 -0
  154. package/src/index.js +190 -0
  155. package/src/main.js +42 -0
  156. package/src/managers/ApplicationCommandManager.js +267 -0
  157. package/src/managers/ApplicationCommandPermissionsManager.js +425 -0
  158. package/src/managers/AutoModerationRuleManager.js +296 -0
  159. package/src/managers/BaseGuildEmojiManager.js +80 -0
  160. package/src/managers/BaseManager.js +19 -0
  161. package/src/managers/BillingManager.js +66 -0
  162. package/src/managers/CachedManager.js +71 -0
  163. package/src/managers/ChannelManager.js +139 -0
  164. package/src/managers/ClientUserSettingManager.js +490 -0
  165. package/src/managers/DataManager.js +61 -0
  166. package/src/managers/DeveloperPortalManager.js +104 -0
  167. package/src/managers/GuildApplicationCommandManager.js +28 -0
  168. package/src/managers/GuildBanManager.js +204 -0
  169. package/src/managers/GuildChannelManager.js +502 -0
  170. package/src/managers/GuildEmojiManager.js +171 -0
  171. package/src/managers/GuildEmojiRoleManager.js +118 -0
  172. package/src/managers/GuildFolderManager.js +24 -0
  173. package/src/managers/GuildForumThreadManager.js +114 -0
  174. package/src/managers/GuildInviteManager.js +213 -0
  175. package/src/managers/GuildManager.js +304 -0
  176. package/src/managers/GuildMemberManager.js +724 -0
  177. package/src/managers/GuildMemberRoleManager.js +191 -0
  178. package/src/managers/GuildScheduledEventManager.js +296 -0
  179. package/src/managers/GuildSettingManager.js +148 -0
  180. package/src/managers/GuildStickerManager.js +179 -0
  181. package/src/managers/GuildTextThreadManager.js +98 -0
  182. package/src/managers/InteractionManager.js +39 -0
  183. package/src/managers/MessageManager.js +393 -0
  184. package/src/managers/PermissionOverwriteManager.js +166 -0
  185. package/src/managers/PresenceManager.js +58 -0
  186. package/src/managers/ReactionManager.js +67 -0
  187. package/src/managers/ReactionUserManager.js +71 -0
  188. package/src/managers/RelationshipManager.js +258 -0
  189. package/src/managers/RoleManager.js +352 -0
  190. package/src/managers/SessionManager.js +57 -0
  191. package/src/managers/StageInstanceManager.js +162 -0
  192. package/src/managers/ThreadManager.js +207 -0
  193. package/src/managers/ThreadMemberManager.js +186 -0
  194. package/src/managers/UserManager.js +150 -0
  195. package/src/managers/VoiceStateManager.js +37 -0
  196. package/src/rest/APIRequest.js +136 -0
  197. package/src/rest/APIRouter.js +53 -0
  198. package/src/rest/CaptchaSolver.js +78 -0
  199. package/src/rest/DiscordAPIError.js +103 -0
  200. package/src/rest/HTTPError.js +62 -0
  201. package/src/rest/RESTManager.js +81 -0
  202. package/src/rest/RateLimitError.js +55 -0
  203. package/src/rest/RequestHandler.js +446 -0
  204. package/src/sharding/Shard.js +443 -0
  205. package/src/sharding/ShardClientUtil.js +275 -0
  206. package/src/sharding/ShardingManager.js +318 -0
  207. package/src/structures/AnonymousGuild.js +98 -0
  208. package/src/structures/ApplicationCommand.js +1028 -0
  209. package/src/structures/ApplicationRoleConnectionMetadata.js +45 -0
  210. package/src/structures/AutoModerationActionExecution.js +89 -0
  211. package/src/structures/AutoModerationRule.js +294 -0
  212. package/src/structures/AutocompleteInteraction.js +106 -0
  213. package/src/structures/Base.js +43 -0
  214. package/src/structures/BaseCommandInteraction.js +211 -0
  215. package/src/structures/BaseGuild.js +116 -0
  216. package/src/structures/BaseGuildEmoji.js +56 -0
  217. package/src/structures/BaseGuildTextChannel.js +193 -0
  218. package/src/structures/BaseGuildVoiceChannel.js +243 -0
  219. package/src/structures/BaseMessageComponent.js +114 -0
  220. package/src/structures/ButtonInteraction.js +11 -0
  221. package/src/structures/Call.js +58 -0
  222. package/src/structures/CategoryChannel.js +83 -0
  223. package/src/structures/Channel.js +271 -0
  224. package/src/structures/ClientApplication.js +204 -0
  225. package/src/structures/ClientPresence.js +84 -0
  226. package/src/structures/ClientUser.js +624 -0
  227. package/src/structures/CommandInteraction.js +41 -0
  228. package/src/structures/CommandInteractionOptionResolver.js +276 -0
  229. package/src/structures/ContextMenuInteraction.js +65 -0
  230. package/src/structures/DMChannel.js +280 -0
  231. package/src/structures/DeveloperPortalApplication.js +520 -0
  232. package/src/structures/DirectoryChannel.js +20 -0
  233. package/src/structures/Emoji.js +148 -0
  234. package/src/structures/ForumChannel.js +271 -0
  235. package/src/structures/Guild.js +1744 -0
  236. package/src/structures/GuildAuditLogs.js +734 -0
  237. package/src/structures/GuildBan.js +59 -0
  238. package/src/structures/GuildBoost.js +108 -0
  239. package/src/structures/GuildChannel.js +454 -0
  240. package/src/structures/GuildEmoji.js +161 -0
  241. package/src/structures/GuildFolder.js +75 -0
  242. package/src/structures/GuildMember.js +686 -0
  243. package/src/structures/GuildPreview.js +191 -0
  244. package/src/structures/GuildPreviewEmoji.js +27 -0
  245. package/src/structures/GuildScheduledEvent.js +441 -0
  246. package/src/structures/GuildTemplate.js +236 -0
  247. package/src/structures/Integration.js +188 -0
  248. package/src/structures/IntegrationApplication.js +96 -0
  249. package/src/structures/Interaction.js +351 -0
  250. package/src/structures/InteractionCollector.js +248 -0
  251. package/src/structures/InteractionResponse.js +114 -0
  252. package/src/structures/InteractionWebhook.js +43 -0
  253. package/src/structures/Invite.js +375 -0
  254. package/src/structures/InviteGuild.js +23 -0
  255. package/src/structures/InviteStageInstance.js +86 -0
  256. package/src/structures/Message.js +1188 -0
  257. package/src/structures/MessageActionRow.js +103 -0
  258. package/src/structures/MessageAttachment.js +193 -0
  259. package/src/structures/MessageButton.js +231 -0
  260. package/src/structures/MessageCollector.js +146 -0
  261. package/src/structures/MessageComponentInteraction.js +120 -0
  262. package/src/structures/MessageContextMenuInteraction.js +20 -0
  263. package/src/structures/MessageEmbed.js +586 -0
  264. package/src/structures/MessageMentions.js +272 -0
  265. package/src/structures/MessagePayload.js +358 -0
  266. package/src/structures/MessageReaction.js +171 -0
  267. package/src/structures/MessageSelectMenu.js +391 -0
  268. package/src/structures/Modal.js +279 -0
  269. package/src/structures/ModalSubmitFieldsResolver.js +53 -0
  270. package/src/structures/ModalSubmitInteraction.js +119 -0
  271. package/src/structures/NewsChannel.js +32 -0
  272. package/src/structures/OAuth2Guild.js +28 -0
  273. package/src/structures/PartialGroupDMChannel.js +430 -0
  274. package/src/structures/PermissionOverwrites.js +196 -0
  275. package/src/structures/Presence.js +441 -0
  276. package/src/structures/ReactionCollector.js +229 -0
  277. package/src/structures/ReactionEmoji.js +31 -0
  278. package/src/structures/RichPresence.js +722 -0
  279. package/src/structures/Role.js +515 -0
  280. package/src/structures/SelectMenuInteraction.js +170 -0
  281. package/src/structures/Session.js +81 -0
  282. package/src/structures/StageChannel.js +104 -0
  283. package/src/structures/StageInstance.js +208 -0
  284. package/src/structures/Sticker.js +310 -0
  285. package/src/structures/StickerPack.js +95 -0
  286. package/src/structures/StoreChannel.js +56 -0
  287. package/src/structures/Team.js +167 -0
  288. package/src/structures/TeamMember.js +71 -0
  289. package/src/structures/TextChannel.js +33 -0
  290. package/src/structures/TextInputComponent.js +201 -0
  291. package/src/structures/ThreadChannel.js +626 -0
  292. package/src/structures/ThreadMember.js +105 -0
  293. package/src/structures/Typing.js +74 -0
  294. package/src/structures/User.js +697 -0
  295. package/src/structures/UserContextMenuInteraction.js +29 -0
  296. package/src/structures/VoiceChannel.js +110 -0
  297. package/src/structures/VoiceRegion.js +53 -0
  298. package/src/structures/VoiceState.js +306 -0
  299. package/src/structures/WebEmbed.js +401 -0
  300. package/src/structures/Webhook.js +461 -0
  301. package/src/structures/WelcomeChannel.js +60 -0
  302. package/src/structures/WelcomeScreen.js +48 -0
  303. package/src/structures/Widget.js +87 -0
  304. package/src/structures/WidgetMember.js +99 -0
  305. package/src/structures/interfaces/Application.js +190 -0
  306. package/src/structures/interfaces/Collector.js +300 -0
  307. package/src/structures/interfaces/InteractionResponses.js +313 -0
  308. package/src/structures/interfaces/TextBasedChannel.js +566 -0
  309. package/src/util/ActivityFlags.js +44 -0
  310. package/src/util/ApplicationFlags.js +74 -0
  311. package/src/util/BitField.js +170 -0
  312. package/src/util/ChannelFlags.js +45 -0
  313. package/src/util/Constants.js +1917 -0
  314. package/src/util/DataResolver.js +145 -0
  315. package/src/util/Formatters.js +214 -0
  316. package/src/util/GuildMemberFlags.js +43 -0
  317. package/src/util/Intents.js +74 -0
  318. package/src/util/LimitedCollection.js +131 -0
  319. package/src/util/MessageFlags.js +54 -0
  320. package/src/util/Options.js +360 -0
  321. package/src/util/Permissions.js +187 -0
  322. package/src/util/PremiumUsageFlags.js +31 -0
  323. package/src/util/PurchasedFlags.js +31 -0
  324. package/src/util/RemoteAuth.js +522 -0
  325. package/src/util/SnowflakeUtil.js +92 -0
  326. package/src/util/Sweepers.js +466 -0
  327. package/src/util/SystemChannelFlags.js +55 -0
  328. package/src/util/ThreadMemberFlags.js +30 -0
  329. package/src/util/UserFlags.js +104 -0
  330. package/src/util/Util.js +741 -0
  331. package/src/util/Voice.js +1456 -0
  332. package/src/util/arRPC/index.js +229 -0
  333. package/src/util/arRPC/process/detectable.json +1 -0
  334. package/src/util/arRPC/process/index.js +102 -0
  335. package/src/util/arRPC/process/native/index.js +5 -0
  336. package/src/util/arRPC/process/native/linux.js +37 -0
  337. package/src/util/arRPC/process/native/win32.js +25 -0
  338. package/src/util/arRPC/transports/ipc.js +281 -0
  339. package/src/util/arRPC/transports/websocket.js +128 -0
  340. package/typings/enums.d.ts +346 -0
  341. package/typings/index.d.ts +7725 -0
  342. package/typings/index.test-d.ts +0 -0
  343. package/typings/rawDataTypes.d.ts +283 -0
@@ -0,0 +1,267 @@
1
+ 'use strict';
2
+
3
+ const { Collection } = require('@discordjs/collection');
4
+ const ApplicationCommandPermissionsManager = require('./ApplicationCommandPermissionsManager');
5
+ const CachedManager = require('./CachedManager');
6
+ const { TypeError } = require('../errors');
7
+ const ApplicationCommand = require('../structures/ApplicationCommand');
8
+ const { ApplicationCommandTypes } = require('../util/Constants');
9
+ const Permissions = require('../util/Permissions');
10
+
11
+ /**
12
+ * Manages API methods for application commands and stores their cache.
13
+ * @extends {CachedManager}
14
+ */
15
+ class ApplicationCommandManager extends CachedManager {
16
+ constructor(client, iterable, user) {
17
+ super(client, ApplicationCommand, iterable);
18
+
19
+ /**
20
+ * The manager for permissions of arbitrary commands on arbitrary guilds
21
+ * @type {ApplicationCommandPermissionsManager}
22
+ */
23
+ this.permissions = new ApplicationCommandPermissionsManager(this, user);
24
+ this.user = user;
25
+ }
26
+
27
+ /**
28
+ * The cache of this manager
29
+ * @type {Collection<Snowflake, ApplicationCommand>}
30
+ * @name ApplicationCommandManager#cache
31
+ */
32
+
33
+ _add(data, cache, guildId) {
34
+ return super._add(data, cache, { extras: [this.guild, guildId] });
35
+ }
36
+
37
+ /**
38
+ * The APIRouter path to the commands
39
+ * @param {Snowflake} [options.id] The application command's id
40
+ * @param {Snowflake} [options.guildId] The guild's id to use in the path,
41
+ * ignored when using a {@link GuildApplicationCommandManager}
42
+ * @returns {Object}
43
+ * @private
44
+ */
45
+ commandPath({ id, guildId } = {}) {
46
+ let path = this.client.api.applications(this.user.id);
47
+ if (this.guild ?? guildId) path = path.guilds(this.guild?.id ?? guildId);
48
+ return id ? path.commands(id) : path.commands;
49
+ }
50
+
51
+ /**
52
+ * Data that resolves to give an ApplicationCommand object. This can be:
53
+ * * An ApplicationCommand object
54
+ * * A Snowflake
55
+ * @typedef {ApplicationCommand|Snowflake} ApplicationCommandResolvable
56
+ */
57
+
58
+ /* eslint-disable max-len */
59
+ /**
60
+ * Data that resolves to the data of an ApplicationCommand
61
+ * @typedef {ApplicationCommandDataResolvable|SlashCommandBuilder|ContextMenuCommandBuilder} ApplicationCommandDataResolvable
62
+ */
63
+ /* eslint-enable max-len */
64
+
65
+ /**
66
+ * Options used to fetch data from Discord
67
+ * @typedef {Object} BaseFetchOptions
68
+ * @property {boolean} [cache=true] Whether to cache the fetched data if it wasn't already
69
+ * @property {boolean} [force=false] Whether to skip the cache check and request the API
70
+ */
71
+
72
+ /**
73
+ * Options used to fetch Application Commands from Discord
74
+ * @typedef {BaseFetchOptions} FetchApplicationCommandOptions
75
+ * @property {Snowflake} [guildId] The guild's id to fetch commands for, for when the guild is not cached
76
+ * @property {LocaleString} [locale] The locale to use when fetching this command
77
+ * @property {boolean} [withLocalizations] Whether to fetch all localization data
78
+ */
79
+
80
+ /**
81
+ * Obtains one or multiple application commands from Discord, or the cache if it's already available.
82
+ * @param {Snowflake} [id] The application command's id
83
+ * @param {FetchApplicationCommandOptions} [options] Additional options for this fetch
84
+ * @returns {Promise<ApplicationCommand|Collection<Snowflake, ApplicationCommand>>}
85
+ * @example
86
+ * // Fetch a single command
87
+ * client.application.commands.fetch('123456789012345678')
88
+ * .then(command => console.log(`Fetched command ${command.name}`))
89
+ * .catch(console.error);
90
+ * @example
91
+ * // Fetch all commands
92
+ * guild.commands.fetch()
93
+ * .then(commands => console.log(`Fetched ${commands.size} commands`))
94
+ * .catch(console.error);
95
+ */
96
+ async fetch(id, { guildId, cache = true, force = false, locale, withLocalizations } = {}) {
97
+ // Change from user.createDM to opcode (risky action)
98
+ if (typeof id === 'object') {
99
+ ({ guildId, cache = true, locale, withLocalizations } = id);
100
+ } else if (id) {
101
+ if (!force) {
102
+ const existing = this.cache.get(id);
103
+ if (existing) return existing;
104
+ }
105
+ await this.user.createDM().catch(() => {});
106
+ const command = await this.commandPath({ id, guildId }).get();
107
+ return this._add(command, cache);
108
+ }
109
+ await this.user.createDM().catch(() => {});
110
+ const data = await this.commandPath({ guildId }).get({
111
+ headers: {
112
+ 'X-Discord-Locale': locale,
113
+ },
114
+ query: typeof withLocalizations === 'boolean' ? { with_localizations: withLocalizations } : undefined,
115
+ });
116
+ return data.reduce((coll, command) => coll.set(command.id, this._add(command, cache, guildId)), new Collection());
117
+ }
118
+
119
+ /**
120
+ * Creates an application command.
121
+ * @param {ApplicationCommandDataResolvable} command The command
122
+ * @param {Snowflake} [guildId] The guild's id to create this command in,
123
+ * ignored when using a {@link GuildApplicationCommandManager}
124
+ * @returns {Promise<ApplicationCommand>}
125
+ * @example
126
+ * // Create a new command
127
+ * client.application.commands.create({
128
+ * name: 'test',
129
+ * description: 'A test command',
130
+ * })
131
+ * .then(console.log)
132
+ * .catch(console.error);
133
+ */
134
+ async create(command, guildId) {
135
+ if (!this.client.user.bot) throw new Error('INVALID_USER_METHOD');
136
+ const data = await this.commandPath({ guildId }).post({
137
+ data: this.constructor.transformCommand(command),
138
+ });
139
+ return this._add(data, true, guildId);
140
+ }
141
+
142
+ /**
143
+ * Sets all the commands for this application or guild.
144
+ * @param {ApplicationCommandDataResolvable[]} commands The commands
145
+ * @param {Snowflake} [guildId] The guild's id to create the commands in,
146
+ * ignored when using a {@link GuildApplicationCommandManager}
147
+ * @returns {Promise<Collection<Snowflake, ApplicationCommand>>}
148
+ * @example
149
+ * // Set all commands to just this one
150
+ * client.application.commands.set([
151
+ * {
152
+ * name: 'test',
153
+ * description: 'A test command',
154
+ * },
155
+ * ])
156
+ * .then(console.log)
157
+ * .catch(console.error);
158
+ * @example
159
+ * // Remove all commands
160
+ * guild.commands.set([])
161
+ * .then(console.log)
162
+ * .catch(console.error);
163
+ */
164
+ async set(commands, guildId) {
165
+ if (!this.client.user.bot) throw new Error('INVALID_USER_METHOD');
166
+ const data = await this.commandPath({ guildId }).put({
167
+ data: commands.map(c => this.constructor.transformCommand(c)),
168
+ });
169
+ return data.reduce((coll, command) => coll.set(command.id, this._add(command, true, guildId)), new Collection());
170
+ }
171
+
172
+ /**
173
+ * Edits an application command.
174
+ * @param {ApplicationCommandResolvable} command The command to edit
175
+ * @param {Partial<ApplicationCommandDataResolvable>} data The data to update the command with
176
+ * @param {Snowflake} [guildId] The guild's id where the command registered,
177
+ * ignored when using a {@link GuildApplicationCommandManager}
178
+ * @returns {Promise<ApplicationCommand>}
179
+ * @example
180
+ * // Edit an existing command
181
+ * client.application.commands.edit('123456789012345678', {
182
+ * description: 'New description',
183
+ * })
184
+ * .then(console.log)
185
+ * .catch(console.error);
186
+ */
187
+ async edit(command, data, guildId) {
188
+ if (!this.client.user.bot) throw new Error('INVALID_USER_METHOD');
189
+ const id = this.resolveId(command);
190
+ if (!id) throw new TypeError('INVALID_TYPE', 'command', 'ApplicationCommandResolvable');
191
+
192
+ const patched = await this.commandPath({ id, guildId }).patch({
193
+ data: this.constructor.transformCommand(data),
194
+ });
195
+ return this._add(patched, true, guildId);
196
+ }
197
+
198
+ /**
199
+ * Deletes an application command.
200
+ * @param {ApplicationCommandResolvable} command The command to delete
201
+ * @param {Snowflake} [guildId] The guild's id where the command is registered,
202
+ * ignored when using a {@link GuildApplicationCommandManager}
203
+ * @returns {Promise<?ApplicationCommand>}
204
+ * @example
205
+ * // Delete a command
206
+ * guild.commands.delete('123456789012345678')
207
+ * .then(console.log)
208
+ * .catch(console.error);
209
+ */
210
+ async delete(command, guildId) {
211
+ if (!this.client.user.bot) throw new Error('INVALID_USER_METHOD');
212
+ const id = this.resolveId(command);
213
+ if (!id) throw new TypeError('INVALID_TYPE', 'command', 'ApplicationCommandResolvable');
214
+
215
+ await this.commandPath({ id, guildId }).delete();
216
+
217
+ const cached = this.cache.get(id);
218
+ this.cache.delete(id);
219
+ return cached ?? null;
220
+ }
221
+
222
+ /**
223
+ * Transforms an {@link ApplicationCommandData} object into something that can be used with the API.
224
+ * @param {ApplicationCommandDataResolvable} command The command to transform
225
+ * @returns {APIApplicationCommand}
226
+ * @private
227
+ */
228
+ static transformCommand(command) {
229
+ let default_member_permissions;
230
+
231
+ if ('default_member_permissions' in command) {
232
+ default_member_permissions = command.default_member_permissions
233
+ ? new Permissions(BigInt(command.default_member_permissions)).bitfield.toString()
234
+ : command.default_member_permissions;
235
+ }
236
+
237
+ if ('defaultMemberPermissions' in command) {
238
+ default_member_permissions =
239
+ command.defaultMemberPermissions !== null
240
+ ? new Permissions(command.defaultMemberPermissions).bitfield.toString()
241
+ : command.defaultMemberPermissions;
242
+ }
243
+ return {
244
+ name: command.name,
245
+ name_localizations: command.nameLocalizations ?? command.name_localizations,
246
+ description: command.description,
247
+ description_localizations: command.descriptionLocalizations ?? command.description_localizations,
248
+ type: typeof command.type === 'number' ? command.type : ApplicationCommandTypes[command.type],
249
+ options: command.options?.map(o => ApplicationCommand.transformOption(o)),
250
+ default_permission: command.defaultPermission ?? command.default_permission,
251
+ default_member_permissions,
252
+ dm_permission: command.dmPermission ?? command.dm_permission,
253
+ };
254
+ }
255
+ }
256
+
257
+ module.exports = ApplicationCommandManager;
258
+
259
+ /**
260
+ * @external SlashCommandBuilder
261
+ * @see {@link https://discord.js.org/docs/packages/builders/stable/SlashCommandBuilder:Class}
262
+ */
263
+
264
+ /**
265
+ * @external ContextMenuCommandBuilder
266
+ * @see {@link https://discord.js.org/docs/packages/builders/stable/ContextMenuCommandBuilder:Class}
267
+ */
@@ -0,0 +1,425 @@
1
+ 'use strict';
2
+
3
+ const { Collection } = require('@discordjs/collection');
4
+ const BaseManager = require('./BaseManager');
5
+ const { Error, TypeError } = require('../errors');
6
+ const { ApplicationCommandPermissionTypes, APIErrors } = require('../util/Constants');
7
+
8
+ /**
9
+ * Manages API methods for permissions of Application Commands.
10
+ * @extends {BaseManager}
11
+ */
12
+ class ApplicationCommandPermissionsManager extends BaseManager {
13
+ constructor(manager, user) {
14
+ super(manager.client);
15
+
16
+ /**
17
+ * The manager or command that this manager belongs to
18
+ * @type {ApplicationCommandManager|ApplicationCommand}
19
+ * @private
20
+ */
21
+ this.manager = manager;
22
+
23
+ /**
24
+ * The guild that this manager acts on
25
+ * @type {?Guild}
26
+ */
27
+ this.guild = manager.guild ?? null;
28
+
29
+ /**
30
+ * The id of the guild that this manager acts on
31
+ * @type {?Snowflake}
32
+ */
33
+ this.guildId = manager.guildId ?? manager.guild?.id ?? null;
34
+
35
+ /**
36
+ * The id of the command this manager acts on
37
+ * @type {?Snowflake}
38
+ */
39
+ this.commandId = manager.id ?? null;
40
+
41
+ this.user = user;
42
+ }
43
+
44
+ /**
45
+ * The APIRouter path to the commands
46
+ * @param {Snowflake} guildId The guild's id to use in the path,
47
+ * @param {Snowflake} [commandId] The application command's id
48
+ * @returns {Object}
49
+ * @private
50
+ */
51
+ permissionsPath(guildId, commandId) {
52
+ return this.client.api
53
+ .applications(typeof this.user === 'string' ? this.user : this.user.id)
54
+ .guilds(guildId)
55
+ .commands(commandId).permissions;
56
+ }
57
+
58
+ /**
59
+ * Data for setting the permissions of an application command.
60
+ * @typedef {Object} ApplicationCommandPermissionData
61
+ * @property {Snowflake} id The role or user's id
62
+ * @property {ApplicationCommandPermissionType|number} type Whether this permission is for a role or a user
63
+ * @property {boolean} permission Whether the role or user has the permission to use this command
64
+ */
65
+
66
+ /**
67
+ * The object returned when fetching permissions for an application command.
68
+ * @typedef {Object} ApplicationCommandPermissions
69
+ * @property {Snowflake} id The role or user's id
70
+ * @property {ApplicationCommandPermissionType} type Whether this permission is for a role or a user
71
+ * @property {boolean} permission Whether the role or user has the permission to use this command
72
+ */
73
+
74
+ /**
75
+ * Options for managing permissions for one or more Application Commands
76
+ * <warn>When passing these options to a manager where `guildId` is `null`,
77
+ * `guild` is a required parameter</warn>
78
+ * @typedef {Object} BaseApplicationCommandPermissionsOptions
79
+ * @property {GuildResolvable} [guild] The guild to modify / check permissions for
80
+ * <warn>Ignored when the manager has a non-null `guildId` property</warn>
81
+ * @property {ApplicationCommandResolvable} [command] The command to modify / check permissions for
82
+ * <warn>Ignored when the manager has a non-null `commandId` property</warn>
83
+ */
84
+
85
+ /**
86
+ * Fetches the permissions for one or multiple commands.
87
+ * @param {BaseApplicationCommandPermissionsOptions} [options] Options used to fetch permissions
88
+ * @returns {Promise<ApplicationCommandPermissions[]|Collection<Snowflake, ApplicationCommandPermissions[]>>}
89
+ * @example
90
+ * // Fetch permissions for one command
91
+ * guild.commands.permissions.fetch({ command: '123456789012345678' })
92
+ * .then(perms => console.log(`Fetched permissions for ${perms.length} users`))
93
+ * .catch(console.error);
94
+ * @example
95
+ * // Fetch permissions for all commands in a guild
96
+ * client.application.commands.permissions.fetch({ guild: '123456789012345678' })
97
+ * .then(perms => console.log(`Fetched permissions for ${perms.size} commands`))
98
+ * .catch(console.error);
99
+ */
100
+ async fetch({ guild, command } = {}) {
101
+ const { guildId, commandId } = this._validateOptions(guild, command);
102
+ if (commandId) {
103
+ const data = await this.permissionsPath(guildId, commandId).get();
104
+ return data.permissions.map(perm => this.constructor.transformPermissions(perm, true));
105
+ }
106
+
107
+ const data = await this.permissionsPath(guildId).get();
108
+ return data.reduce(
109
+ (coll, perm) =>
110
+ coll.set(
111
+ perm.id,
112
+ perm.permissions.map(p => this.constructor.transformPermissions(p, true)),
113
+ ),
114
+ new Collection(),
115
+ );
116
+ }
117
+
118
+ /**
119
+ * Data used for overwriting the permissions for all application commands in a guild.
120
+ * @typedef {Object} GuildApplicationCommandPermissionData
121
+ * @property {Snowflake} id The command's id
122
+ * @property {ApplicationCommandPermissionData[]} permissions The permissions for this command
123
+ */
124
+
125
+ /**
126
+ * Options used to set permissions for one or more Application Commands in a guild
127
+ * <warn>One of `command` AND `permissions`, OR `fullPermissions` is required.
128
+ * `fullPermissions` is not a valid option when passing to a manager where `commandId` is non-null</warn>
129
+ * @typedef {BaseApplicationCommandPermissionsOptions} SetApplicationCommandPermissionsOptions
130
+ * @property {ApplicationCommandPermissionData[]} [permissions] The new permissions for the command
131
+ * @property {GuildApplicationCommandPermissionData[]} [fullPermissions] The new permissions for all commands
132
+ * in a guild <warn>When this parameter is set, `permissions` and `command` are ignored</warn>
133
+ */
134
+
135
+ /**
136
+ * Sets the permissions for one or more commands.
137
+ * @param {SetApplicationCommandPermissionsOptions} options Options used to set permissions
138
+ * @returns {Promise<ApplicationCommandPermissions[]|Collection<Snowflake, ApplicationCommandPermissions[]>>}
139
+ * @example
140
+ * // Set the permissions for one command
141
+ * client.application.commands.permissions.set({ guild: '892455839386304532', command: '123456789012345678',
142
+ * permissions: [
143
+ * {
144
+ * id: '876543210987654321',
145
+ * type: 'USER',
146
+ * permission: false,
147
+ * },
148
+ * ]})
149
+ * .then(console.log)
150
+ * .catch(console.error);
151
+ * @example
152
+ * // Set the permissions for all commands
153
+ * guild.commands.permissions.set({ fullPermissions: [
154
+ * {
155
+ * id: '123456789012345678',
156
+ * permissions: [{
157
+ * id: '876543210987654321',
158
+ * type: 'USER',
159
+ * permission: false,
160
+ * }],
161
+ * },
162
+ * ]})
163
+ * .then(console.log)
164
+ * .catch(console.error);
165
+ */
166
+ async set({ guild, command, permissions, fullPermissions } = {}) {
167
+ if (!this.manager.client.user.bot) throw new Error('INVALID_USER_METHOD');
168
+ const { guildId, commandId } = this._validateOptions(guild, command);
169
+
170
+ if (commandId) {
171
+ if (!Array.isArray(permissions)) {
172
+ throw new TypeError('INVALID_TYPE', 'permissions', 'Array of ApplicationCommandPermissionData', true);
173
+ }
174
+ const data = await this.permissionsPath(guildId, commandId).put({
175
+ data: { permissions: permissions.map(perm => this.constructor.transformPermissions(perm)) },
176
+ });
177
+ return data.permissions.map(perm => this.constructor.transformPermissions(perm, true));
178
+ }
179
+
180
+ if (!Array.isArray(fullPermissions)) {
181
+ throw new TypeError('INVALID_TYPE', 'fullPermissions', 'Array of GuildApplicationCommandPermissionData', true);
182
+ }
183
+
184
+ const APIPermissions = [];
185
+ for (const perm of fullPermissions) {
186
+ if (!Array.isArray(perm.permissions)) throw new TypeError('INVALID_ELEMENT', 'Array', 'fullPermissions', perm);
187
+ APIPermissions.push({
188
+ id: perm.id,
189
+ permissions: perm.permissions.map(p => this.constructor.transformPermissions(p)),
190
+ });
191
+ }
192
+ const data = await this.permissionsPath(guildId).put({
193
+ data: APIPermissions,
194
+ });
195
+ return data.reduce(
196
+ (coll, perm) =>
197
+ coll.set(
198
+ perm.id,
199
+ perm.permissions.map(p => this.constructor.transformPermissions(p, true)),
200
+ ),
201
+ new Collection(),
202
+ );
203
+ }
204
+
205
+ /**
206
+ * Options used to add permissions to a command
207
+ * <warn>The `command` parameter is not optional when the managers `commandId` is `null`</warn>
208
+ * @typedef {BaseApplicationCommandPermissionsOptions} AddApplicationCommandPermissionsOptions
209
+ * @property {ApplicationCommandPermissionData[]} permissions The permissions to add to the command
210
+ */
211
+
212
+ /**
213
+ * Add permissions to a command.
214
+ * @param {AddApplicationCommandPermissionsOptions} options Options used to add permissions
215
+ * @returns {Promise<ApplicationCommandPermissions[]>}
216
+ * @example
217
+ * // Block a role from the command permissions
218
+ * guild.commands.permissions.add({ command: '123456789012345678', permissions: [
219
+ * {
220
+ * id: '876543211234567890',
221
+ * type: 'ROLE',
222
+ * permission: false
223
+ * },
224
+ * ]})
225
+ * .then(console.log)
226
+ * .catch(console.error);
227
+ */
228
+ async add({ guild, command, permissions }) {
229
+ if (!this.manager.client.user.bot) throw new Error('INVALID_USER_METHOD');
230
+ const { guildId, commandId } = this._validateOptions(guild, command);
231
+ if (!commandId) throw new TypeError('INVALID_TYPE', 'command', 'ApplicationCommandResolvable');
232
+ if (!Array.isArray(permissions)) {
233
+ throw new TypeError('INVALID_TYPE', 'permissions', 'Array of ApplicationCommandPermissionData', true);
234
+ }
235
+
236
+ let existing = [];
237
+ try {
238
+ existing = await this.fetch({ guild: guildId, command: commandId });
239
+ } catch (error) {
240
+ if (error.code !== APIErrors.UNKNOWN_APPLICATION_COMMAND_PERMISSIONS) throw error;
241
+ }
242
+
243
+ const newPermissions = permissions.slice();
244
+ for (const perm of existing) {
245
+ if (!newPermissions.some(x => x.id === perm.id)) {
246
+ newPermissions.push(perm);
247
+ }
248
+ }
249
+
250
+ return this.set({ guild: guildId, command: commandId, permissions: newPermissions });
251
+ }
252
+
253
+ /**
254
+ * Options used to remove permissions from a command
255
+ * <warn>The `command` parameter is not optional when the managers `commandId` is `null`</warn>
256
+ * @typedef {BaseApplicationCommandPermissionsOptions} RemoveApplicationCommandPermissionsOptions
257
+ * @property {UserResolvable|UserResolvable[]} [users] The user(s) to remove from the command permissions
258
+ * <warn>One of `users` or `roles` is required</warn>
259
+ * @property {RoleResolvable|RoleResolvable[]} [roles] The role(s) to remove from the command permissions
260
+ * <warn>One of `users` or `roles` is required</warn>
261
+ */
262
+
263
+ /**
264
+ * Remove permissions from a command.
265
+ * @param {RemoveApplicationCommandPermissionsOptions} options Options used to remove permissions
266
+ * @returns {Promise<ApplicationCommandPermissions[]>}
267
+ * @example
268
+ * // Remove a user permission from this command
269
+ * guild.commands.permissions.remove({ command: '123456789012345678', users: '876543210123456789' })
270
+ * .then(console.log)
271
+ * .catch(console.error);
272
+ * @example
273
+ * // Remove multiple roles from this command
274
+ * guild.commands.permissions.remove({
275
+ * command: '123456789012345678', roles: ['876543210123456789', '765432101234567890']
276
+ * })
277
+ * .then(console.log)
278
+ * .catch(console.error);
279
+ */
280
+ async remove({ guild, command, users, roles }) {
281
+ if (!this.manager.client.user.bot) throw new Error('INVALID_USER_METHOD');
282
+ const { guildId, commandId } = this._validateOptions(guild, command);
283
+ if (!commandId) throw new TypeError('INVALID_TYPE', 'command', 'ApplicationCommandResolvable');
284
+
285
+ if (!users && !roles) throw new TypeError('INVALID_TYPE', 'users OR roles', 'Array or Resolvable', true);
286
+
287
+ const resolvedIds = [];
288
+ if (Array.isArray(users)) {
289
+ users.forEach(user => {
290
+ const userId = this.client.users.resolveId(user);
291
+ if (!userId) throw new TypeError('INVALID_ELEMENT', 'Array', 'users', user);
292
+ resolvedIds.push(userId);
293
+ });
294
+ } else if (users) {
295
+ const userId = this.client.users.resolveId(users);
296
+ if (!userId) {
297
+ throw new TypeError('INVALID_TYPE', 'users', 'Array or UserResolvable');
298
+ }
299
+ resolvedIds.push(userId);
300
+ }
301
+
302
+ if (Array.isArray(roles)) {
303
+ roles.forEach(role => {
304
+ if (typeof role === 'string') {
305
+ resolvedIds.push(role);
306
+ return;
307
+ }
308
+ if (!this.guild) throw new Error('GUILD_UNCACHED_ROLE_RESOLVE');
309
+ const roleId = this.guild.roles.resolveId(role);
310
+ if (!roleId) throw new TypeError('INVALID_ELEMENT', 'Array', 'users', role);
311
+ resolvedIds.push(roleId);
312
+ });
313
+ } else if (roles) {
314
+ if (typeof roles === 'string') {
315
+ resolvedIds.push(roles);
316
+ } else {
317
+ if (!this.guild) throw new Error('GUILD_UNCACHED_ROLE_RESOLVE');
318
+ const roleId = this.guild.roles.resolveId(roles);
319
+ if (!roleId) {
320
+ throw new TypeError('INVALID_TYPE', 'users', 'Array or RoleResolvable');
321
+ }
322
+ resolvedIds.push(roleId);
323
+ }
324
+ }
325
+
326
+ let existing = [];
327
+ try {
328
+ existing = await this.fetch({ guild: guildId, command: commandId });
329
+ } catch (error) {
330
+ if (error.code !== APIErrors.UNKNOWN_APPLICATION_COMMAND_PERMISSIONS) throw error;
331
+ }
332
+
333
+ const permissions = existing.filter(perm => !resolvedIds.includes(perm.id));
334
+
335
+ return this.set({ guild: guildId, command: commandId, permissions });
336
+ }
337
+
338
+ /**
339
+ * Options used to check the existence of permissions on a command
340
+ * <warn>The `command` parameter is not optional when the managers `commandId` is `null`</warn>
341
+ * @typedef {BaseApplicationCommandPermissionsOptions} HasApplicationCommandPermissionsOptions
342
+ * @property {UserResolvable|RoleResolvable} permissionId The user or role to check if a permission exists for
343
+ * on this command.
344
+ */
345
+
346
+ /**
347
+ * Check whether a permission exists for a user or role
348
+ * @param {AddApplicationCommandPermissionsOptions} options Options used to check permissions
349
+ * @returns {Promise<boolean>}
350
+ * @example
351
+ * // Check whether a user has permission to use a command
352
+ * guild.commands.permissions.has({ command: '123456789012345678', permissionId: '876543210123456789' })
353
+ * .then(console.log)
354
+ * .catch(console.error);
355
+ */
356
+ async has({ guild, command, permissionId }) {
357
+ const { guildId, commandId } = this._validateOptions(guild, command);
358
+ if (!commandId) throw new TypeError('INVALID_TYPE', 'command', 'ApplicationCommandResolvable');
359
+
360
+ if (!permissionId) throw new TypeError('INVALID_TYPE', 'permissionId', 'UserResolvable or RoleResolvable');
361
+ let resolvedId = permissionId;
362
+ if (typeof permissionId !== 'string') {
363
+ resolvedId = this.client.users.resolveId(permissionId);
364
+ if (!resolvedId) {
365
+ if (!this.guild) throw new Error('GUILD_UNCACHED_ROLE_RESOLVE');
366
+ resolvedId = this.guild.roles.resolveId(permissionId);
367
+ }
368
+ if (!resolvedId) {
369
+ throw new TypeError('INVALID_TYPE', 'permissionId', 'UserResolvable or RoleResolvable');
370
+ }
371
+ }
372
+
373
+ let existing = [];
374
+ try {
375
+ existing = await this.fetch({ guild: guildId, command: commandId });
376
+ } catch (error) {
377
+ if (error.code !== APIErrors.UNKNOWN_APPLICATION_COMMAND_PERMISSIONS) throw error;
378
+ }
379
+
380
+ return existing.some(perm => perm.id === resolvedId);
381
+ }
382
+
383
+ _validateOptions(guild, command) {
384
+ const guildId = this.guildId ?? this.client.guilds.resolveId(guild);
385
+ if (!guildId) throw new Error('GLOBAL_COMMAND_PERMISSIONS');
386
+ let commandId = this.commandId;
387
+ if (command && !commandId) {
388
+ commandId = this.manager.resolveId?.(command);
389
+ if (!commandId && this.guild) {
390
+ commandId = this.guild.commands.resolveId(command);
391
+ }
392
+ commandId ??= this.client.application?.commands.resolveId(command);
393
+ if (!commandId) {
394
+ throw new TypeError('INVALID_TYPE', 'command', 'ApplicationCommandResolvable', true);
395
+ }
396
+ }
397
+ return { guildId, commandId };
398
+ }
399
+
400
+ /**
401
+ * Transforms an {@link ApplicationCommandPermissionData} object into something that can be used with the API.
402
+ * @param {ApplicationCommandPermissionData} permissions The permissions to transform
403
+ * @param {boolean} [received] Whether these permissions have been received from Discord
404
+ * @returns {APIApplicationCommandPermissions}
405
+ * @private
406
+ */
407
+ static transformPermissions(permissions, received) {
408
+ return {
409
+ id: permissions.id,
410
+ permission: permissions.permission,
411
+ type:
412
+ typeof permissions.type === 'number' && !received
413
+ ? permissions.type
414
+ : ApplicationCommandPermissionTypes[permissions.type],
415
+ };
416
+ }
417
+ }
418
+
419
+ module.exports = ApplicationCommandPermissionsManager;
420
+
421
+ /* eslint-disable max-len */
422
+ /**
423
+ * @external APIApplicationCommandPermissions
424
+ * @see {@link https://discord.com/developers/docs/interactions/application-commands#application-command-permissions-object-application-command-permissions-structure}
425
+ */