@velliajs/discord 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (317) hide show
  1. package/LICENSE +191 -0
  2. package/README.md +133 -0
  3. package/package.json +82 -0
  4. package/src/client/BaseClient.js +83 -0
  5. package/src/client/Client.js +591 -0
  6. package/src/client/WebhookClient.js +103 -0
  7. package/src/client/actions/Action.js +119 -0
  8. package/src/client/actions/ActionsManager.js +79 -0
  9. package/src/client/actions/ApplicationCommandPermissionsUpdate.js +34 -0
  10. package/src/client/actions/AutoModerationActionExecution.js +26 -0
  11. package/src/client/actions/AutoModerationRuleCreate.js +27 -0
  12. package/src/client/actions/AutoModerationRuleDelete.js +31 -0
  13. package/src/client/actions/AutoModerationRuleUpdate.js +29 -0
  14. package/src/client/actions/ChannelCreate.js +23 -0
  15. package/src/client/actions/ChannelDelete.js +23 -0
  16. package/src/client/actions/ChannelUpdate.js +33 -0
  17. package/src/client/actions/GuildAuditLogEntryCreate.js +29 -0
  18. package/src/client/actions/GuildBanAdd.js +20 -0
  19. package/src/client/actions/GuildBanRemove.js +25 -0
  20. package/src/client/actions/GuildChannelsPositionUpdate.js +21 -0
  21. package/src/client/actions/GuildDelete.js +44 -0
  22. package/src/client/actions/GuildEmojiCreate.js +20 -0
  23. package/src/client/actions/GuildEmojiDelete.js +19 -0
  24. package/src/client/actions/GuildEmojiUpdate.js +20 -0
  25. package/src/client/actions/GuildEmojisUpdate.js +34 -0
  26. package/src/client/actions/GuildIntegrationsUpdate.js +19 -0
  27. package/src/client/actions/GuildMemberRemove.js +31 -0
  28. package/src/client/actions/GuildMemberUpdate.js +44 -0
  29. package/src/client/actions/GuildRoleCreate.js +25 -0
  30. package/src/client/actions/GuildRoleDelete.js +29 -0
  31. package/src/client/actions/GuildRoleUpdate.js +39 -0
  32. package/src/client/actions/GuildRolesPositionUpdate.js +21 -0
  33. package/src/client/actions/GuildScheduledEventCreate.js +27 -0
  34. package/src/client/actions/GuildScheduledEventDelete.js +31 -0
  35. package/src/client/actions/GuildScheduledEventUpdate.js +30 -0
  36. package/src/client/actions/GuildScheduledEventUserAdd.js +32 -0
  37. package/src/client/actions/GuildScheduledEventUserRemove.js +32 -0
  38. package/src/client/actions/GuildStickerCreate.js +20 -0
  39. package/src/client/actions/GuildStickerDelete.js +19 -0
  40. package/src/client/actions/GuildStickerUpdate.js +20 -0
  41. package/src/client/actions/GuildStickersUpdate.js +34 -0
  42. package/src/client/actions/GuildUpdate.js +33 -0
  43. package/src/client/actions/InteractionCreate.js +101 -0
  44. package/src/client/actions/InviteCreate.js +28 -0
  45. package/src/client/actions/InviteDelete.js +30 -0
  46. package/src/client/actions/MessageCreate.js +37 -0
  47. package/src/client/actions/MessageDelete.js +32 -0
  48. package/src/client/actions/MessageDeleteBulk.js +47 -0
  49. package/src/client/actions/MessageReactionAdd.js +55 -0
  50. package/src/client/actions/MessageReactionRemove.js +45 -0
  51. package/src/client/actions/MessageReactionRemoveAll.js +33 -0
  52. package/src/client/actions/MessageReactionRemoveEmoji.js +28 -0
  53. package/src/client/actions/MessageUpdate.js +26 -0
  54. package/src/client/actions/PresenceUpdate.js +42 -0
  55. package/src/client/actions/StageInstanceCreate.js +28 -0
  56. package/src/client/actions/StageInstanceDelete.js +31 -0
  57. package/src/client/actions/StageInstanceUpdate.js +30 -0
  58. package/src/client/actions/ThreadCreate.js +24 -0
  59. package/src/client/actions/ThreadDelete.js +26 -0
  60. package/src/client/actions/ThreadListSync.js +60 -0
  61. package/src/client/actions/ThreadMemberUpdate.js +30 -0
  62. package/src/client/actions/ThreadMembersUpdate.js +47 -0
  63. package/src/client/actions/TypingStart.js +29 -0
  64. package/src/client/actions/UserUpdate.js +36 -0
  65. package/src/client/actions/VoiceStateUpdate.js +43 -0
  66. package/src/client/actions/WebhooksUpdate.js +20 -0
  67. package/src/client/voice/ClientVoiceManager.js +44 -0
  68. package/src/client/websocket/WebSocketManager.js +393 -0
  69. package/src/client/websocket/WebSocketShard.js +231 -0
  70. package/src/client/websocket/handlers/APPLICATION_COMMAND_PERMISSIONS_UPDATE.js +5 -0
  71. package/src/client/websocket/handlers/AUTO_MODERATION_ACTION_EXECUTION.js +5 -0
  72. package/src/client/websocket/handlers/AUTO_MODERATION_RULE_CREATE.js +5 -0
  73. package/src/client/websocket/handlers/AUTO_MODERATION_RULE_DELETE.js +5 -0
  74. package/src/client/websocket/handlers/AUTO_MODERATION_RULE_UPDATE.js +5 -0
  75. package/src/client/websocket/handlers/CHANNEL_CREATE.js +5 -0
  76. package/src/client/websocket/handlers/CHANNEL_DELETE.js +5 -0
  77. package/src/client/websocket/handlers/CHANNEL_PINS_UPDATE.js +22 -0
  78. package/src/client/websocket/handlers/CHANNEL_UPDATE.js +16 -0
  79. package/src/client/websocket/handlers/GUILD_AUDIT_LOG_ENTRY_CREATE.js +5 -0
  80. package/src/client/websocket/handlers/GUILD_BAN_ADD.js +5 -0
  81. package/src/client/websocket/handlers/GUILD_BAN_REMOVE.js +5 -0
  82. package/src/client/websocket/handlers/GUILD_CREATE.js +26 -0
  83. package/src/client/websocket/handlers/GUILD_DELETE.js +5 -0
  84. package/src/client/websocket/handlers/GUILD_EMOJIS_UPDATE.js +5 -0
  85. package/src/client/websocket/handlers/GUILD_INTEGRATIONS_UPDATE.js +5 -0
  86. package/src/client/websocket/handlers/GUILD_MEMBERS_CHUNK.js +39 -0
  87. package/src/client/websocket/handlers/GUILD_MEMBER_ADD.js +20 -0
  88. package/src/client/websocket/handlers/GUILD_MEMBER_REMOVE.js +5 -0
  89. package/src/client/websocket/handlers/GUILD_MEMBER_UPDATE.js +5 -0
  90. package/src/client/websocket/handlers/GUILD_ROLE_CREATE.js +5 -0
  91. package/src/client/websocket/handlers/GUILD_ROLE_DELETE.js +5 -0
  92. package/src/client/websocket/handlers/GUILD_ROLE_UPDATE.js +5 -0
  93. package/src/client/websocket/handlers/GUILD_SCHEDULED_EVENT_CREATE.js +5 -0
  94. package/src/client/websocket/handlers/GUILD_SCHEDULED_EVENT_DELETE.js +5 -0
  95. package/src/client/websocket/handlers/GUILD_SCHEDULED_EVENT_UPDATE.js +5 -0
  96. package/src/client/websocket/handlers/GUILD_SCHEDULED_EVENT_USER_ADD.js +5 -0
  97. package/src/client/websocket/handlers/GUILD_SCHEDULED_EVENT_USER_REMOVE.js +5 -0
  98. package/src/client/websocket/handlers/GUILD_STICKERS_UPDATE.js +5 -0
  99. package/src/client/websocket/handlers/GUILD_UPDATE.js +5 -0
  100. package/src/client/websocket/handlers/INTERACTION_CREATE.js +5 -0
  101. package/src/client/websocket/handlers/INVITE_CREATE.js +5 -0
  102. package/src/client/websocket/handlers/INVITE_DELETE.js +5 -0
  103. package/src/client/websocket/handlers/MESSAGE_CREATE.js +5 -0
  104. package/src/client/websocket/handlers/MESSAGE_DELETE.js +5 -0
  105. package/src/client/websocket/handlers/MESSAGE_DELETE_BULK.js +5 -0
  106. package/src/client/websocket/handlers/MESSAGE_REACTION_ADD.js +5 -0
  107. package/src/client/websocket/handlers/MESSAGE_REACTION_REMOVE.js +5 -0
  108. package/src/client/websocket/handlers/MESSAGE_REACTION_REMOVE_ALL.js +5 -0
  109. package/src/client/websocket/handlers/MESSAGE_REACTION_REMOVE_EMOJI.js +5 -0
  110. package/src/client/websocket/handlers/MESSAGE_UPDATE.js +16 -0
  111. package/src/client/websocket/handlers/PRESENCE_UPDATE.js +5 -0
  112. package/src/client/websocket/handlers/READY.js +27 -0
  113. package/src/client/websocket/handlers/RESUMED.js +14 -0
  114. package/src/client/websocket/handlers/STAGE_INSTANCE_CREATE.js +5 -0
  115. package/src/client/websocket/handlers/STAGE_INSTANCE_DELETE.js +5 -0
  116. package/src/client/websocket/handlers/STAGE_INSTANCE_UPDATE.js +5 -0
  117. package/src/client/websocket/handlers/THREAD_CREATE.js +5 -0
  118. package/src/client/websocket/handlers/THREAD_DELETE.js +5 -0
  119. package/src/client/websocket/handlers/THREAD_LIST_SYNC.js +5 -0
  120. package/src/client/websocket/handlers/THREAD_MEMBERS_UPDATE.js +5 -0
  121. package/src/client/websocket/handlers/THREAD_MEMBER_UPDATE.js +5 -0
  122. package/src/client/websocket/handlers/THREAD_UPDATE.js +16 -0
  123. package/src/client/websocket/handlers/TYPING_START.js +5 -0
  124. package/src/client/websocket/handlers/USER_UPDATE.js +5 -0
  125. package/src/client/websocket/handlers/VOICE_SERVER_UPDATE.js +6 -0
  126. package/src/client/websocket/handlers/VOICE_STATE_UPDATE.js +5 -0
  127. package/src/client/websocket/handlers/WEBHOOKS_UPDATE.js +5 -0
  128. package/src/client/websocket/handlers/index.js +64 -0
  129. package/src/errors/DJSError.js +48 -0
  130. package/src/errors/ErrorCodes.js +319 -0
  131. package/src/errors/Messages.js +170 -0
  132. package/src/errors/index.js +5 -0
  133. package/src/index.js +213 -0
  134. package/src/managers/ApplicationCommandManager.js +263 -0
  135. package/src/managers/ApplicationCommandPermissionsManager.js +434 -0
  136. package/src/managers/AutoModerationRuleManager.js +288 -0
  137. package/src/managers/BaseGuildEmojiManager.js +80 -0
  138. package/src/managers/BaseManager.js +19 -0
  139. package/src/managers/CachedManager.js +57 -0
  140. package/src/managers/CategoryChannelChildManager.js +77 -0
  141. package/src/managers/ChannelManager.js +128 -0
  142. package/src/managers/DataManager.js +61 -0
  143. package/src/managers/GuildApplicationCommandManager.js +28 -0
  144. package/src/managers/GuildBanManager.js +204 -0
  145. package/src/managers/GuildChannelManager.js +494 -0
  146. package/src/managers/GuildEmojiManager.js +174 -0
  147. package/src/managers/GuildEmojiRoleManager.js +118 -0
  148. package/src/managers/GuildForumThreadManager.js +83 -0
  149. package/src/managers/GuildInviteManager.js +213 -0
  150. package/src/managers/GuildManager.js +283 -0
  151. package/src/managers/GuildMemberManager.js +540 -0
  152. package/src/managers/GuildMemberRoleManager.js +204 -0
  153. package/src/managers/GuildScheduledEventManager.js +297 -0
  154. package/src/managers/GuildStickerManager.js +182 -0
  155. package/src/managers/GuildTextThreadManager.js +91 -0
  156. package/src/managers/MessageManager.js +259 -0
  157. package/src/managers/PermissionOverwriteManager.js +168 -0
  158. package/src/managers/PresenceManager.js +58 -0
  159. package/src/managers/ReactionManager.js +68 -0
  160. package/src/managers/ReactionUserManager.js +77 -0
  161. package/src/managers/RoleManager.js +360 -0
  162. package/src/managers/StageInstanceManager.js +154 -0
  163. package/src/managers/ThreadManager.js +204 -0
  164. package/src/managers/ThreadMemberManager.js +182 -0
  165. package/src/managers/UserManager.js +139 -0
  166. package/src/managers/VoiceStateManager.js +37 -0
  167. package/src/sharding/Shard.js +457 -0
  168. package/src/sharding/ShardClientUtil.js +285 -0
  169. package/src/sharding/ShardingManager.js +326 -0
  170. package/src/structures/ActionRow.js +46 -0
  171. package/src/structures/ActionRowBuilder.js +35 -0
  172. package/src/structures/AnonymousGuild.js +97 -0
  173. package/src/structures/ApplicationCommand.js +606 -0
  174. package/src/structures/ApplicationRoleConnectionMetadata.js +46 -0
  175. package/src/structures/Attachment.js +140 -0
  176. package/src/structures/AttachmentBuilder.js +116 -0
  177. package/src/structures/AutoModerationActionExecution.js +116 -0
  178. package/src/structures/AutoModerationRule.js +284 -0
  179. package/src/structures/AutocompleteInteraction.js +97 -0
  180. package/src/structures/Base.js +43 -0
  181. package/src/structures/BaseChannel.js +160 -0
  182. package/src/structures/BaseGuild.js +119 -0
  183. package/src/structures/BaseGuildEmoji.js +56 -0
  184. package/src/structures/BaseGuildTextChannel.js +186 -0
  185. package/src/structures/BaseGuildVoiceChannel.js +234 -0
  186. package/src/structures/BaseInteraction.js +344 -0
  187. package/src/structures/BaseSelectMenuComponent.js +56 -0
  188. package/src/structures/ButtonBuilder.js +44 -0
  189. package/src/structures/ButtonComponent.js +65 -0
  190. package/src/structures/ButtonInteraction.js +11 -0
  191. package/src/structures/CategoryChannel.js +45 -0
  192. package/src/structures/ChannelSelectMenuBuilder.js +31 -0
  193. package/src/structures/ChannelSelectMenuComponent.js +20 -0
  194. package/src/structures/ChannelSelectMenuInteraction.js +33 -0
  195. package/src/structures/ChatInputCommandInteraction.js +41 -0
  196. package/src/structures/ClientApplication.js +193 -0
  197. package/src/structures/ClientPresence.js +82 -0
  198. package/src/structures/ClientUser.js +185 -0
  199. package/src/structures/CommandInteraction.js +224 -0
  200. package/src/structures/CommandInteractionOptionResolver.js +308 -0
  201. package/src/structures/Component.js +47 -0
  202. package/src/structures/ContextMenuCommandInteraction.js +64 -0
  203. package/src/structures/DMChannel.js +129 -0
  204. package/src/structures/DirectoryChannel.js +36 -0
  205. package/src/structures/Embed.js +220 -0
  206. package/src/structures/EmbedBuilder.js +41 -0
  207. package/src/structures/Emoji.js +108 -0
  208. package/src/structures/ForumChannel.js +264 -0
  209. package/src/structures/Guild.js +1361 -0
  210. package/src/structures/GuildAuditLogs.js +91 -0
  211. package/src/structures/GuildAuditLogsEntry.js +527 -0
  212. package/src/structures/GuildBan.js +59 -0
  213. package/src/structures/GuildChannel.js +457 -0
  214. package/src/structures/GuildEmoji.js +148 -0
  215. package/src/structures/GuildMember.js +518 -0
  216. package/src/structures/GuildPreview.js +193 -0
  217. package/src/structures/GuildPreviewEmoji.js +27 -0
  218. package/src/structures/GuildScheduledEvent.js +439 -0
  219. package/src/structures/GuildTemplate.js +241 -0
  220. package/src/structures/Integration.js +220 -0
  221. package/src/structures/IntegrationApplication.js +85 -0
  222. package/src/structures/InteractionCollector.js +263 -0
  223. package/src/structures/InteractionResponse.js +102 -0
  224. package/src/structures/InteractionWebhook.js +59 -0
  225. package/src/structures/Invite.js +322 -0
  226. package/src/structures/InviteGuild.js +22 -0
  227. package/src/structures/InviteStageInstance.js +87 -0
  228. package/src/structures/MentionableSelectMenuBuilder.js +32 -0
  229. package/src/structures/MentionableSelectMenuComponent.js +11 -0
  230. package/src/structures/MentionableSelectMenuInteraction.js +71 -0
  231. package/src/structures/Message.js +997 -0
  232. package/src/structures/MessageCollector.js +146 -0
  233. package/src/structures/MessageComponentInteraction.js +107 -0
  234. package/src/structures/MessageContextMenuCommandInteraction.js +20 -0
  235. package/src/structures/MessageMentions.js +297 -0
  236. package/src/structures/MessagePayload.js +299 -0
  237. package/src/structures/MessageReaction.js +142 -0
  238. package/src/structures/ModalBuilder.js +34 -0
  239. package/src/structures/ModalSubmitFields.js +55 -0
  240. package/src/structures/ModalSubmitInteraction.js +121 -0
  241. package/src/structures/NewsChannel.js +32 -0
  242. package/src/structures/OAuth2Guild.js +28 -0
  243. package/src/structures/PartialGroupDMChannel.js +60 -0
  244. package/src/structures/PermissionOverwrites.js +196 -0
  245. package/src/structures/Presence.js +372 -0
  246. package/src/structures/ReactionCollector.js +229 -0
  247. package/src/structures/ReactionEmoji.js +31 -0
  248. package/src/structures/Role.js +458 -0
  249. package/src/structures/RoleSelectMenuBuilder.js +31 -0
  250. package/src/structures/RoleSelectMenuComponent.js +11 -0
  251. package/src/structures/RoleSelectMenuInteraction.js +33 -0
  252. package/src/structures/SelectMenuBuilder.js +26 -0
  253. package/src/structures/SelectMenuComponent.js +26 -0
  254. package/src/structures/SelectMenuInteraction.js +26 -0
  255. package/src/structures/SelectMenuOptionBuilder.js +26 -0
  256. package/src/structures/StageChannel.js +112 -0
  257. package/src/structures/StageInstance.js +167 -0
  258. package/src/structures/Sticker.js +272 -0
  259. package/src/structures/StickerPack.js +95 -0
  260. package/src/structures/StringSelectMenuBuilder.js +79 -0
  261. package/src/structures/StringSelectMenuComponent.js +20 -0
  262. package/src/structures/StringSelectMenuInteraction.js +21 -0
  263. package/src/structures/StringSelectMenuOptionBuilder.js +49 -0
  264. package/src/structures/Team.js +117 -0
  265. package/src/structures/TeamMember.js +70 -0
  266. package/src/structures/TextChannel.js +33 -0
  267. package/src/structures/TextInputBuilder.js +31 -0
  268. package/src/structures/TextInputComponent.js +29 -0
  269. package/src/structures/ThreadChannel.js +606 -0
  270. package/src/structures/ThreadMember.js +113 -0
  271. package/src/structures/Typing.js +74 -0
  272. package/src/structures/User.js +331 -0
  273. package/src/structures/UserContextMenuCommandInteraction.js +29 -0
  274. package/src/structures/UserSelectMenuBuilder.js +31 -0
  275. package/src/structures/UserSelectMenuComponent.js +11 -0
  276. package/src/structures/UserSelectMenuInteraction.js +51 -0
  277. package/src/structures/VoiceChannel.js +96 -0
  278. package/src/structures/VoiceRegion.js +46 -0
  279. package/src/structures/VoiceState.js +303 -0
  280. package/src/structures/Webhook.js +481 -0
  281. package/src/structures/WelcomeChannel.js +60 -0
  282. package/src/structures/WelcomeScreen.js +49 -0
  283. package/src/structures/Widget.js +88 -0
  284. package/src/structures/WidgetMember.js +99 -0
  285. package/src/structures/interfaces/Application.js +108 -0
  286. package/src/structures/interfaces/Collector.js +335 -0
  287. package/src/structures/interfaces/InteractionResponses.js +320 -0
  288. package/src/structures/interfaces/TextBasedChannel.js +413 -0
  289. package/src/util/APITypes.js +456 -0
  290. package/src/util/ActivityFlagsBitField.js +26 -0
  291. package/src/util/ApplicationFlagsBitField.js +26 -0
  292. package/src/util/BitField.js +176 -0
  293. package/src/util/ChannelFlagsBitField.js +41 -0
  294. package/src/util/Channels.js +150 -0
  295. package/src/util/Colors.js +73 -0
  296. package/src/util/Components.js +152 -0
  297. package/src/util/Constants.js +230 -0
  298. package/src/util/DataResolver.js +140 -0
  299. package/src/util/Enums.js +13 -0
  300. package/src/util/Events.js +160 -0
  301. package/src/util/Formatters.js +413 -0
  302. package/src/util/GuildMemberFlagsBitField.js +41 -0
  303. package/src/util/IntentsBitField.js +34 -0
  304. package/src/util/LimitedCollection.js +68 -0
  305. package/src/util/MessageFlagsBitField.js +32 -0
  306. package/src/util/Options.js +216 -0
  307. package/src/util/Partials.js +44 -0
  308. package/src/util/PermissionsBitField.js +104 -0
  309. package/src/util/ShardEvents.js +27 -0
  310. package/src/util/Status.js +33 -0
  311. package/src/util/Sweepers.js +467 -0
  312. package/src/util/SystemChannelFlagsBitField.js +43 -0
  313. package/src/util/ThreadMemberFlagsBitField.js +31 -0
  314. package/src/util/Transformers.js +36 -0
  315. package/src/util/UserFlagsBitField.js +32 -0
  316. package/src/util/Util.js +394 -0
  317. package/src/util/WebSocketShardEvents.js +25 -0
@@ -0,0 +1,434 @@
1
+ 'use strict';
2
+
3
+ const { Collection } = require('@discordjs/collection');
4
+ const { ApplicationCommandPermissionType, RESTJSONErrorCodes, Routes } = require('discord-api-types/v10');
5
+ const BaseManager = require('./BaseManager');
6
+ const { DiscordjsError, DiscordjsTypeError, ErrorCodes } = require('../errors');
7
+
8
+ /**
9
+ * Manages API methods for permissions of Application Commands.
10
+ * @extends {BaseManager}
11
+ */
12
+ class ApplicationCommandPermissionsManager extends BaseManager {
13
+ constructor(manager) {
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
+
42
+ /**
43
+ * The APIRouter path to the commands
44
+ * @param {Snowflake} guildId The guild's id to use in the path,
45
+ * @param {Snowflake} [commandId] The application command's id
46
+ * @returns {string}
47
+ * @private
48
+ */
49
+ permissionsPath(guildId, commandId) {
50
+ if (commandId) {
51
+ return Routes.applicationCommandPermissions(this.client.application.id, guildId, commandId);
52
+ }
53
+
54
+ return Routes.guildApplicationCommandsPermissions(this.client.application.id, guildId);
55
+ }
56
+
57
+ /* eslint-disable max-len */
58
+ /**
59
+ * The object returned when fetching permissions for an application command.
60
+ * @typedef {Object} ApplicationCommandPermissions
61
+ * @property {Snowflake} id The role, user, or channel's id. Can also be a
62
+ * {@link https://discord.com/developers/docs/interactions/application-commands#application-command-permissions-object-application-command-permissions-constants permission constant}.
63
+ * @property {ApplicationCommandPermissionType} type Whether this permission is for a role or a user
64
+ * @property {boolean} permission Whether the role or user has the permission to use this command
65
+ */
66
+ /* eslint-enable max-len */
67
+
68
+ /**
69
+ * Options for managing permissions for one or more Application Commands
70
+ * <warn>When passing these options to a manager where `guildId` is `null`,
71
+ * `guild` is a required parameter</warn>
72
+ * @typedef {Object} BaseApplicationCommandPermissionsOptions
73
+ * @property {GuildResolvable} [guild] The guild to modify / check permissions for
74
+ * <warn>Ignored when the manager has a non-null `guildId` property</warn>
75
+ * @property {ApplicationCommandResolvable} [command] The command to modify / check permissions for
76
+ * <warn>Ignored when the manager has a non-null `commandId` property</warn>
77
+ */
78
+
79
+ /**
80
+ * Fetches the permissions for one or multiple commands. Providing the client's id as the "command id" will fetch
81
+ * *only* the guild level permissions
82
+ * @param {BaseApplicationCommandPermissionsOptions} [options] Options used to fetch permissions
83
+ * @returns {Promise<ApplicationCommandPermissions[]|Collection<Snowflake, ApplicationCommandPermissions[]>>}
84
+ * @example
85
+ * // Fetch permissions for one command
86
+ * guild.commands.permissions.fetch({ command: '123456789012345678' })
87
+ * .then(perms => console.log(`Fetched ${perms.length} overwrites`))
88
+ * .catch(console.error);
89
+ * @example
90
+ * // Fetch permissions for all commands in a guild
91
+ * client.application.commands.permissions.fetch({ guild: '123456789012345678' })
92
+ * .then(perms => console.log(`Fetched permissions for ${perms.size} commands`))
93
+ * .catch(console.error);
94
+ * @example
95
+ * // Fetch guild level permissions
96
+ * guild.commands.permissions.fetch({ command: client.user.id })
97
+ * .then(perms => console.log(`Fetched ${perms.length} guild level permissions`))
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.client.rest.get(this.permissionsPath(guildId, commandId));
104
+ return data.permissions;
105
+ }
106
+
107
+ const data = await this.client.rest.get(this.permissionsPath(guildId));
108
+ return data.reduce((coll, perm) => coll.set(perm.id, perm.permissions), new Collection());
109
+ }
110
+
111
+ /**
112
+ * Options used to set permissions for one or more Application Commands in a guild
113
+ * <warn>Omitting the `command` parameter edits the guild wide permissions
114
+ * when the manager's `commandId` is `null`</warn>
115
+ * @typedef {BaseApplicationCommandPermissionsOptions} ApplicationCommandPermissionsEditOptions
116
+ * @property {ApplicationCommandPermissions[]} permissions The new permissions for the guild or overwrite
117
+ * @property {string} token The bearer token to use that authorizes the permission edit
118
+ */
119
+
120
+ /**
121
+ * Sets the permissions for the guild or a command overwrite.
122
+ * @param {ApplicationCommandPermissionsEditOptions} options Options used to set permissions
123
+ * @returns {Promise<ApplicationCommandPermissions[]|Collection<Snowflake, ApplicationCommandPermissions[]>>}
124
+ * @example
125
+ * // Set a permission overwrite for a command
126
+ * client.application.commands.permissions.set({
127
+ * guild: '892455839386304532',
128
+ * command: '123456789012345678',
129
+ * token: 'TotallyRealToken',
130
+ * permissions: [
131
+ * {
132
+ * id: '876543210987654321',
133
+ * type: ApplicationCommandPermissionType.User,
134
+ * permission: false,
135
+ * },
136
+ * ]})
137
+ * .then(console.log)
138
+ * .catch(console.error);
139
+ * @example
140
+ * // Set the permissions used for the guild (commands without overwrites)
141
+ * guild.commands.permissions.set({ token: 'TotallyRealToken', permissions: [
142
+ * {
143
+ * id: '123456789012345678',
144
+ * permissions: [{
145
+ * id: '876543210987654321',
146
+ * type: ApplicationCommandPermissionType.User,
147
+ * permission: false,
148
+ * }],
149
+ * },
150
+ * ]})
151
+ * .then(console.log)
152
+ * .catch(console.error);
153
+ */
154
+ async set({ guild, command, permissions, token } = {}) {
155
+ if (!token) {
156
+ throw new DiscordjsError(ErrorCodes.ApplicationCommandPermissionsTokenMissing);
157
+ }
158
+ let { guildId, commandId } = this._validateOptions(guild, command);
159
+
160
+ if (!Array.isArray(permissions)) {
161
+ throw new DiscordjsTypeError(
162
+ ErrorCodes.InvalidType,
163
+ 'permissions',
164
+ 'Array of ApplicationCommandPermissions',
165
+ true,
166
+ );
167
+ }
168
+
169
+ if (!commandId) {
170
+ commandId = this.client.user.id;
171
+ }
172
+ const data = await this.client.rest.put(this.permissionsPath(guildId, commandId), {
173
+ body: { permissions },
174
+ auth: false,
175
+ headers: { Authorization: `Bearer ${token}` },
176
+ });
177
+ return data.permissions;
178
+ }
179
+
180
+ /**
181
+ * Add permissions to a command.
182
+ * @param {ApplicationCommandPermissionsEditOptions} options Options used to add permissions
183
+ * @returns {Promise<ApplicationCommandPermissions[]>}
184
+ * @example
185
+ * // Add a rule to block a role from using a command
186
+ * guild.commands.permissions.add({ command: '123456789012345678', token: 'TotallyRealToken', permissions: [
187
+ * {
188
+ * id: '876543211234567890',
189
+ * type: ApplicationCommandPermissionType.Role,
190
+ * permission: false
191
+ * },
192
+ * ]})
193
+ * .then(console.log)
194
+ * .catch(console.error);
195
+ */
196
+ async add({ guild, command, permissions, token } = {}) {
197
+ if (!token) {
198
+ throw new DiscordjsError(ErrorCodes.ApplicationCommandPermissionsTokenMissing);
199
+ }
200
+ let { guildId, commandId } = this._validateOptions(guild, command);
201
+ if (!commandId) {
202
+ commandId = this.client.user.id;
203
+ }
204
+ if (!Array.isArray(permissions)) {
205
+ throw new DiscordjsTypeError(
206
+ ErrorCodes.InvalidType,
207
+ 'permissions',
208
+ 'Array of ApplicationCommandPermissions',
209
+ true,
210
+ );
211
+ }
212
+
213
+ let existing = [];
214
+ try {
215
+ existing = await this.fetch({ guild: guildId, command: commandId });
216
+ } catch (error) {
217
+ if (error.code !== RESTJSONErrorCodes.UnknownApplicationCommandPermissions) throw error;
218
+ }
219
+
220
+ const newPermissions = permissions.slice();
221
+ for (const perm of existing) {
222
+ if (!newPermissions.some(x => x.id === perm.id)) {
223
+ newPermissions.push(perm);
224
+ }
225
+ }
226
+
227
+ return this.set({ guild: guildId, command: commandId, permissions: newPermissions, token });
228
+ }
229
+
230
+ /**
231
+ * A static snowflake that identifies the everyone role for application command permissions.
232
+ * It is the same as the guild id
233
+ * @typedef {Snowflake} RolePermissionConstant
234
+ */
235
+
236
+ /**
237
+ * A static snowflake that identifies the "all channels" entity for application command permissions.
238
+ * It will be the result of the calculation `guildId - 1`
239
+ * @typedef {Snowflake} ChannelPermissionConstant
240
+ */
241
+
242
+ /**
243
+ * Options used to remove permissions from a command
244
+ * <warn>Omitting the `command` parameter removes from the guild wide permissions
245
+ * when the managers `commandId` is `null`</warn>
246
+ * <warn>At least one of `users`, `roles`, and `channels` is required</warn>
247
+ * @typedef {BaseApplicationCommandPermissionsOptions} RemoveApplicationCommandPermissionsOptions
248
+ * @property {string} token The bearer token to use that authorizes the permission removal
249
+ * @property {UserResolvable[]} [users] The user(s) to remove
250
+ * @property {Array<RoleResolvable|RolePermissionConstant>} [roles] The role(s) to remove
251
+ * @property {Array<GuildChannelResolvable|ChannelPermissionConstant>} [channels] The channel(s) to remove
252
+ */
253
+
254
+ /**
255
+ * Remove permissions from a command.
256
+ * @param {RemoveApplicationCommandPermissionsOptions} options Options used to remove permissions
257
+ * @returns {Promise<ApplicationCommandPermissions[]>}
258
+ * @example
259
+ * // Remove a user permission from this command
260
+ * guild.commands.permissions.remove({
261
+ * command: '123456789012345678', users: '876543210123456789', token: 'TotallyRealToken',
262
+ * })
263
+ * .then(console.log)
264
+ * .catch(console.error);
265
+ * @example
266
+ * // Remove multiple roles from this command
267
+ * guild.commands.permissions.remove({
268
+ * command: '123456789012345678', roles: ['876543210123456789', '765432101234567890'], token: 'TotallyRealToken',
269
+ * })
270
+ * .then(console.log)
271
+ * .catch(console.error);
272
+ */
273
+ async remove({ guild, command, users, roles, channels, token } = {}) {
274
+ if (!token) {
275
+ throw new DiscordjsError(ErrorCodes.ApplicationCommandPermissionsTokenMissing);
276
+ }
277
+ let { guildId, commandId } = this._validateOptions(guild, command);
278
+ if (!commandId) {
279
+ commandId = this.client.user.id;
280
+ }
281
+
282
+ if (!users && !roles && !channels) {
283
+ throw new DiscordjsTypeError(ErrorCodes.InvalidType, 'users OR roles OR channels', 'Array or Resolvable', true);
284
+ }
285
+
286
+ let resolvedUserIds = [];
287
+ if (Array.isArray(users)) {
288
+ for (const user of users) {
289
+ const userId = this.client.users.resolveId(user);
290
+ if (!userId) throw new DiscordjsTypeError(ErrorCodes.InvalidElement, 'Array', 'users', user);
291
+ resolvedUserIds.push(userId);
292
+ }
293
+ }
294
+
295
+ let resolvedRoleIds = [];
296
+ if (Array.isArray(roles)) {
297
+ for (const role of roles) {
298
+ if (typeof role === 'string') {
299
+ resolvedRoleIds.push(role);
300
+ continue;
301
+ }
302
+ if (!this.guild) throw new DiscordjsError(ErrorCodes.GuildUncachedEntityResolve, 'roles');
303
+ const roleId = this.guild.roles.resolveId(role);
304
+ if (!roleId) throw new DiscordjsTypeError(ErrorCodes.InvalidElement, 'Array', 'users', role);
305
+ resolvedRoleIds.push(roleId);
306
+ }
307
+ }
308
+
309
+ let resolvedChannelIds = [];
310
+ if (Array.isArray(channels)) {
311
+ for (const channel of channels) {
312
+ if (typeof channel === 'string') {
313
+ resolvedChannelIds.push(channel);
314
+ continue;
315
+ }
316
+ if (!this.guild) throw new DiscordjsError(ErrorCodes.GuildUncachedEntityResolve, 'channels');
317
+ const channelId = this.guild.channels.resolveId(channel);
318
+ if (!channelId) throw new DiscordjsTypeError(ErrorCodes.InvalidElement, 'Array', 'channels', channel);
319
+ resolvedChannelIds.push(channelId);
320
+ }
321
+ }
322
+
323
+ let existing = [];
324
+ try {
325
+ existing = await this.fetch({ guild: guildId, command: commandId });
326
+ } catch (error) {
327
+ if (error.code !== RESTJSONErrorCodes.UnknownApplicationCommandPermissions) throw error;
328
+ }
329
+
330
+ const permissions = existing.filter(perm => {
331
+ switch (perm.type) {
332
+ case ApplicationCommandPermissionType.Role:
333
+ return !resolvedRoleIds.includes(perm.id);
334
+ case ApplicationCommandPermissionType.User:
335
+ return !resolvedUserIds.includes(perm.id);
336
+ case ApplicationCommandPermissionType.Channel:
337
+ return !resolvedChannelIds.includes(perm.id);
338
+ }
339
+ return true;
340
+ });
341
+
342
+ return this.set({ guild: guildId, command: commandId, permissions, token });
343
+ }
344
+
345
+ /**
346
+ * Options used to check the existence of permissions on a command
347
+ * <warn>The `command` parameter is not optional when the managers `commandId` is `null`</warn>
348
+ * @typedef {BaseApplicationCommandPermissionsOptions} HasApplicationCommandPermissionsOptions
349
+ * @property {ApplicationCommandPermissionIdResolvable} permissionId The entity to check if a permission exists for
350
+ * on this command.
351
+ * @property {ApplicationCommandPermissionType} [permissionType] Check for a specific type of permission
352
+ */
353
+
354
+ /**
355
+ * Check whether a permission exists for a user, role, or channel
356
+ * @param {HasApplicationCommandPermissionsOptions} options Options used to check permissions
357
+ * @returns {Promise<boolean>}
358
+ * @example
359
+ * // Check whether a user has permission to use a command
360
+ * guild.commands.permissions.has({ command: '123456789012345678', permissionId: '876543210123456789' })
361
+ * .then(console.log)
362
+ * .catch(console.error);
363
+ */
364
+ async has({ guild, command, permissionId, permissionType }) {
365
+ const { guildId, commandId } = this._validateOptions(guild, command);
366
+ if (!commandId) throw new DiscordjsTypeError(ErrorCodes.InvalidType, 'command', 'ApplicationCommandResolvable');
367
+
368
+ if (!permissionId) {
369
+ throw new DiscordjsTypeError(
370
+ ErrorCodes.InvalidType,
371
+ 'permissionId',
372
+ 'UserResolvable, RoleResolvable, ChannelResolvable, or Permission Constant',
373
+ );
374
+ }
375
+ let resolvedId = permissionId;
376
+ if (typeof permissionId !== 'string') {
377
+ resolvedId = this.client.users.resolveId(permissionId);
378
+ if (!resolvedId) {
379
+ if (!this.guild) throw new DiscordjsError(ErrorCodes.GuildUncachedEntityResolve, 'roles');
380
+ resolvedId = this.guild.roles.resolveId(permissionId);
381
+ }
382
+ if (!resolvedId) {
383
+ resolvedId = this.guild.channels.resolveId(permissionId);
384
+ }
385
+ if (!resolvedId) {
386
+ throw new DiscordjsTypeError(
387
+ ErrorCodes.InvalidType,
388
+ 'permissionId',
389
+ 'UserResolvable, RoleResolvable, ChannelResolvable, or Permission Constant',
390
+ );
391
+ }
392
+ }
393
+
394
+ let existing = [];
395
+ try {
396
+ existing = await this.fetch({ guild: guildId, command: commandId });
397
+ } catch (error) {
398
+ if (error.code !== RESTJSONErrorCodes.UnknownApplicationCommandPermissions) throw error;
399
+ }
400
+
401
+ // Check permission type if provided for the single edge case where a channel id is the same as the everyone role id
402
+ return existing.some(perm => perm.id === resolvedId && (permissionType ?? perm.type) === perm.type);
403
+ }
404
+
405
+ _validateOptions(guild, command) {
406
+ const guildId = this.guildId ?? this.client.guilds.resolveId(guild);
407
+ if (!guildId) throw new DiscordjsError(ErrorCodes.GlobalCommandPermissions);
408
+ let commandId = this.commandId;
409
+ if (command && !commandId) {
410
+ commandId = this.manager.resolveId?.(command);
411
+ if (!commandId && this.guild) {
412
+ commandId = this.guild.commands.resolveId(command);
413
+ }
414
+ commandId ??= this.client.application?.commands.resolveId(command);
415
+ if (!commandId) {
416
+ throw new DiscordjsTypeError(ErrorCodes.InvalidType, 'command', 'ApplicationCommandResolvable', true);
417
+ }
418
+ }
419
+ return { guildId, commandId };
420
+ }
421
+ }
422
+
423
+ module.exports = ApplicationCommandPermissionsManager;
424
+
425
+ /* eslint-disable max-len */
426
+ /**
427
+ * @external APIApplicationCommandPermissions
428
+ * @see {@link https://discord.com/developers/docs/interactions/application-commands#application-command-permissions-object-application-command-permissions-structure}
429
+ */
430
+
431
+ /**
432
+ * Data that resolves to an id used for an application command permission
433
+ * @typedef {UserResolvable|RoleResolvable|GuildChannelResolvable|RolePermissionConstant|ChannelPermissionConstant} ApplicationCommandPermissionIdResolvable
434
+ */