@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,457 @@
1
+ 'use strict';
2
+
3
+ const { PermissionFlagsBits } = require('discord-api-types/v10');
4
+ const { BaseChannel } = require('./BaseChannel');
5
+ const { DiscordjsError, ErrorCodes } = require('../errors');
6
+ const PermissionOverwriteManager = require('../managers/PermissionOverwriteManager');
7
+ const { VoiceBasedChannelTypes } = require('../util/Constants');
8
+ const PermissionsBitField = require('../util/PermissionsBitField');
9
+
10
+ /**
11
+ * Represents a guild channel from any of the following:
12
+ * - {@link TextChannel}
13
+ * - {@link VoiceChannel}
14
+ * - {@link CategoryChannel}
15
+ * - {@link NewsChannel}
16
+ * - {@link StageChannel}
17
+ * - {@link ForumChannel}
18
+ * @extends {BaseChannel}
19
+ * @abstract
20
+ */
21
+ class GuildChannel extends BaseChannel {
22
+ constructor(guild, data, client, immediatePatch = true) {
23
+ super(client, data, false);
24
+
25
+ /**
26
+ * The guild the channel is in
27
+ * @type {Guild}
28
+ */
29
+ this.guild = guild;
30
+
31
+ /**
32
+ * The id of the guild the channel is in
33
+ * @type {Snowflake}
34
+ */
35
+ this.guildId = guild?.id ?? data.guild_id;
36
+ /**
37
+ * A manager of permission overwrites that belong to this channel
38
+ * @type {PermissionOverwriteManager}
39
+ */
40
+ this.permissionOverwrites = new PermissionOverwriteManager(this);
41
+
42
+ if (data && immediatePatch) this._patch(data);
43
+ }
44
+
45
+ _patch(data) {
46
+ super._patch(data);
47
+
48
+ if ('name' in data) {
49
+ /**
50
+ * The name of the guild channel
51
+ * @type {string}
52
+ */
53
+ this.name = data.name;
54
+ }
55
+
56
+ if ('position' in data) {
57
+ /**
58
+ * The raw position of the channel from Discord
59
+ * @type {number}
60
+ */
61
+ this.rawPosition = data.position;
62
+ }
63
+
64
+ if ('guild_id' in data) {
65
+ this.guildId = data.guild_id;
66
+ }
67
+
68
+ if ('parent_id' in data) {
69
+ /**
70
+ * The id of the category parent of this channel
71
+ * @type {?Snowflake}
72
+ */
73
+ this.parentId = data.parent_id;
74
+ } else {
75
+ this.parentId ??= null;
76
+ }
77
+
78
+ if ('permission_overwrites' in data) {
79
+ this.permissionOverwrites.cache.clear();
80
+ for (const overwrite of data.permission_overwrites) {
81
+ this.permissionOverwrites._add(overwrite);
82
+ }
83
+ }
84
+ }
85
+
86
+ _clone() {
87
+ const clone = super._clone();
88
+ clone.permissionOverwrites = new PermissionOverwriteManager(clone, this.permissionOverwrites.cache.values());
89
+ return clone;
90
+ }
91
+
92
+ /**
93
+ * The category parent of this channel
94
+ * @type {?CategoryChannel}
95
+ * @readonly
96
+ */
97
+ get parent() {
98
+ return this.guild.channels.resolve(this.parentId);
99
+ }
100
+
101
+ /**
102
+ * If the permissionOverwrites match the parent channel, null if no parent
103
+ * @type {?boolean}
104
+ * @readonly
105
+ */
106
+ get permissionsLocked() {
107
+ if (!this.parent) return null;
108
+
109
+ // Get all overwrites
110
+ const overwriteIds = new Set([
111
+ ...this.permissionOverwrites.cache.keys(),
112
+ ...this.parent.permissionOverwrites.cache.keys(),
113
+ ]);
114
+
115
+ // Compare all overwrites
116
+ return [...overwriteIds].every(key => {
117
+ const channelVal = this.permissionOverwrites.cache.get(key);
118
+ const parentVal = this.parent.permissionOverwrites.cache.get(key);
119
+
120
+ // Handle empty overwrite
121
+ if (
122
+ (!channelVal &&
123
+ parentVal.deny.bitfield === PermissionsBitField.DefaultBit &&
124
+ parentVal.allow.bitfield === PermissionsBitField.DefaultBit) ||
125
+ (!parentVal &&
126
+ channelVal.deny.bitfield === PermissionsBitField.DefaultBit &&
127
+ channelVal.allow.bitfield === PermissionsBitField.DefaultBit)
128
+ ) {
129
+ return true;
130
+ }
131
+
132
+ // Compare overwrites
133
+ return (
134
+ channelVal !== undefined &&
135
+ parentVal !== undefined &&
136
+ channelVal.deny.bitfield === parentVal.deny.bitfield &&
137
+ channelVal.allow.bitfield === parentVal.allow.bitfield
138
+ );
139
+ });
140
+ }
141
+
142
+ /**
143
+ * The position of the channel
144
+ * @type {number}
145
+ * @readonly
146
+ */
147
+ get position() {
148
+ const sorted = this.guild._sortedChannels(this);
149
+ return [...sorted.values()].indexOf(sorted.get(this.id));
150
+ }
151
+
152
+ /**
153
+ * Gets the overall set of permissions for a member or role in this channel, taking into account channel overwrites.
154
+ * @param {GuildMemberResolvable|RoleResolvable} memberOrRole The member or role to obtain the overall permissions for
155
+ * @param {boolean} [checkAdmin=true] Whether having the {@link PermissionFlagsBits.Administrator} permission
156
+ * will return all permissions
157
+ * @returns {?Readonly<PermissionsBitField>}
158
+ */
159
+ permissionsFor(memberOrRole, checkAdmin = true) {
160
+ const member = this.guild.members.resolve(memberOrRole);
161
+ if (member) return this.memberPermissions(member, checkAdmin);
162
+ const role = this.guild.roles.resolve(memberOrRole);
163
+ return role && this.rolePermissions(role, checkAdmin);
164
+ }
165
+
166
+ overwritesFor(member, verified = false, roles = null) {
167
+ if (!verified) member = this.guild.members.resolve(member);
168
+ if (!member) return [];
169
+
170
+ roles ??= member.roles.cache;
171
+ const roleOverwrites = [];
172
+ let memberOverwrites;
173
+ let everyoneOverwrites;
174
+
175
+ for (const overwrite of this.permissionOverwrites.cache.values()) {
176
+ if (overwrite.id === this.guild.id) {
177
+ everyoneOverwrites = overwrite;
178
+ } else if (roles.has(overwrite.id)) {
179
+ roleOverwrites.push(overwrite);
180
+ } else if (overwrite.id === member.id) {
181
+ memberOverwrites = overwrite;
182
+ }
183
+ }
184
+
185
+ return {
186
+ everyone: everyoneOverwrites,
187
+ roles: roleOverwrites,
188
+ member: memberOverwrites,
189
+ };
190
+ }
191
+
192
+ /**
193
+ * Gets the overall set of permissions for a member in this channel, taking into account channel overwrites.
194
+ * @param {GuildMember} member The member to obtain the overall permissions for
195
+ * @param {boolean} checkAdmin Whether having the {@link PermissionFlagsBits.Administrator} permission
196
+ * will return all permissions
197
+ * @returns {Readonly<PermissionsBitField>}
198
+ * @private
199
+ */
200
+ memberPermissions(member, checkAdmin) {
201
+ if (checkAdmin && member.id === this.guild.ownerId) {
202
+ return new PermissionsBitField(PermissionsBitField.All).freeze();
203
+ }
204
+
205
+ const roles = member.roles.cache;
206
+ const permissions = new PermissionsBitField(roles.map(role => role.permissions));
207
+
208
+ if (checkAdmin && permissions.has(PermissionFlagsBits.Administrator)) {
209
+ return new PermissionsBitField(PermissionsBitField.All).freeze();
210
+ }
211
+
212
+ const overwrites = this.overwritesFor(member, true, roles);
213
+
214
+ return permissions
215
+ .remove(overwrites.everyone?.deny ?? PermissionsBitField.DefaultBit)
216
+ .add(overwrites.everyone?.allow ?? PermissionsBitField.DefaultBit)
217
+ .remove(overwrites.roles.length > 0 ? overwrites.roles.map(role => role.deny) : PermissionsBitField.DefaultBit)
218
+ .add(overwrites.roles.length > 0 ? overwrites.roles.map(role => role.allow) : PermissionsBitField.DefaultBit)
219
+ .remove(overwrites.member?.deny ?? PermissionsBitField.DefaultBit)
220
+ .add(overwrites.member?.allow ?? PermissionsBitField.DefaultBit)
221
+ .freeze();
222
+ }
223
+
224
+ /**
225
+ * Gets the overall set of permissions for a role in this channel, taking into account channel overwrites.
226
+ * @param {Role} role The role to obtain the overall permissions for
227
+ * @param {boolean} checkAdmin Whether having the {@link PermissionFlagsBits.Administrator} permission
228
+ * will return all permissions
229
+ * @returns {Readonly<PermissionsBitField>}
230
+ * @private
231
+ */
232
+ rolePermissions(role, checkAdmin) {
233
+ if (checkAdmin && role.permissions.has(PermissionFlagsBits.Administrator)) {
234
+ return new PermissionsBitField(PermissionsBitField.All).freeze();
235
+ }
236
+
237
+ const everyoneOverwrites = this.permissionOverwrites.cache.get(this.guild.id);
238
+ const roleOverwrites = this.permissionOverwrites.cache.get(role.id);
239
+
240
+ return role.permissions
241
+ .remove(everyoneOverwrites?.deny ?? PermissionsBitField.DefaultBit)
242
+ .add(everyoneOverwrites?.allow ?? PermissionsBitField.DefaultBit)
243
+ .remove(roleOverwrites?.deny ?? PermissionsBitField.DefaultBit)
244
+ .add(roleOverwrites?.allow ?? PermissionsBitField.DefaultBit)
245
+ .freeze();
246
+ }
247
+
248
+ /**
249
+ * Locks in the permission overwrites from the parent channel.
250
+ * @returns {Promise<GuildChannel>}
251
+ */
252
+ lockPermissions() {
253
+ if (!this.parent) return Promise.reject(new DiscordjsError(ErrorCodes.GuildChannelOrphan));
254
+ const permissionOverwrites = this.parent.permissionOverwrites.cache.map(overwrite => overwrite.toJSON());
255
+ return this.edit({ permissionOverwrites });
256
+ }
257
+
258
+ /**
259
+ * A collection of cached members of this channel, mapped by their ids.
260
+ * Members that can view this channel, if the channel is text-based.
261
+ * Members in the channel, if the channel is voice-based.
262
+ * @type {Collection<Snowflake, GuildMember>}
263
+ * @readonly
264
+ */
265
+ get members() {
266
+ return this.guild.members.cache.filter(m => this.permissionsFor(m).has(PermissionFlagsBits.ViewChannel, false));
267
+ }
268
+
269
+ /**
270
+ * Edits the channel.
271
+ * @param {GuildChannelEditOptions} options The options to provide
272
+ * @returns {Promise<GuildChannel>}
273
+ * @example
274
+ * // Edit a channel
275
+ * channel.edit({ name: 'new-channel' })
276
+ * .then(console.log)
277
+ * .catch(console.error);
278
+ */
279
+ edit(options) {
280
+ return this.guild.channels.edit(this, options);
281
+ }
282
+
283
+ /**
284
+ * Sets a new name for the guild channel.
285
+ * @param {string} name The new name for the guild channel
286
+ * @param {string} [reason] Reason for changing the guild channel's name
287
+ * @returns {Promise<GuildChannel>}
288
+ * @example
289
+ * // Set a new channel name
290
+ * channel.setName('not_general')
291
+ * .then(newChannel => console.log(`Channel's new name is ${newChannel.name}`))
292
+ * .catch(console.error);
293
+ */
294
+ setName(name, reason) {
295
+ return this.edit({ name, reason });
296
+ }
297
+
298
+ /**
299
+ * Options used to set the parent of a channel.
300
+ * @typedef {Object} SetParentOptions
301
+ * @property {boolean} [lockPermissions=true] Whether to lock the permissions to what the parent's permissions are
302
+ * @property {string} [reason] The reason for modifying the parent of the channel
303
+ */
304
+
305
+ /**
306
+ * Sets the parent of this channel.
307
+ * @param {?CategoryChannelResolvable} channel The category channel to set as the parent
308
+ * @param {SetParentOptions} [options={}] The options for setting the parent
309
+ * @returns {Promise<GuildChannel>}
310
+ * @example
311
+ * // Add a parent to a channel
312
+ * message.channel.setParent('355908108431917066', { lockPermissions: false })
313
+ * .then(channel => console.log(`New parent of ${message.channel.name}: ${channel.name}`))
314
+ * .catch(console.error);
315
+ */
316
+ setParent(channel, { lockPermissions = true, reason } = {}) {
317
+ return this.edit({
318
+ parent: channel ?? null,
319
+ lockPermissions,
320
+ reason,
321
+ });
322
+ }
323
+
324
+ /**
325
+ * Options used to set the position of a channel.
326
+ * @typedef {Object} SetChannelPositionOptions
327
+ * @property {boolean} [relative=false] Whether or not to change the position relative to its current value
328
+ * @property {string} [reason] The reason for changing the position
329
+ */
330
+
331
+ /**
332
+ * Sets a new position for the guild channel.
333
+ * @param {number} position The new position for the guild channel
334
+ * @param {SetChannelPositionOptions} [options] Options for setting position
335
+ * @returns {Promise<GuildChannel>}
336
+ * @example
337
+ * // Set a new channel position
338
+ * channel.setPosition(2)
339
+ * .then(newChannel => console.log(`Channel's new position is ${newChannel.position}`))
340
+ * .catch(console.error);
341
+ */
342
+ setPosition(position, options = {}) {
343
+ return this.guild.channels.setPosition(this, position, options);
344
+ }
345
+
346
+ /**
347
+ * Options used to clone a guild channel.
348
+ * @typedef {GuildChannelCreateOptions} GuildChannelCloneOptions
349
+ * @property {string} [name=this.name] Name of the new channel
350
+ */
351
+
352
+ /**
353
+ * Clones this channel.
354
+ * @param {GuildChannelCloneOptions} [options] The options for cloning this channel
355
+ * @returns {Promise<GuildChannel>}
356
+ */
357
+ clone(options = {}) {
358
+ return this.guild.channels.create({
359
+ name: options.name ?? this.name,
360
+ permissionOverwrites: this.permissionOverwrites.cache,
361
+ topic: this.topic,
362
+ type: this.type,
363
+ nsfw: this.nsfw,
364
+ parent: this.parent,
365
+ bitrate: this.bitrate,
366
+ userLimit: this.userLimit,
367
+ rateLimitPerUser: this.rateLimitPerUser,
368
+ position: this.rawPosition,
369
+ reason: null,
370
+ ...options,
371
+ });
372
+ }
373
+
374
+ /**
375
+ * Checks if this channel has the same type, topic, position, name, overwrites, and id as another channel.
376
+ * In most cases, a simple `channel.id === channel2.id` will do, and is much faster too.
377
+ * @param {GuildChannel} channel Channel to compare with
378
+ * @returns {boolean}
379
+ */
380
+ equals(channel) {
381
+ let equal =
382
+ channel &&
383
+ this.id === channel.id &&
384
+ this.type === channel.type &&
385
+ this.topic === channel.topic &&
386
+ this.position === channel.position &&
387
+ this.name === channel.name;
388
+
389
+ if (equal) {
390
+ if (this.permissionOverwrites && channel.permissionOverwrites) {
391
+ equal = this.permissionOverwrites.cache.equals(channel.permissionOverwrites.cache);
392
+ } else {
393
+ equal = !this.permissionOverwrites && !channel.permissionOverwrites;
394
+ }
395
+ }
396
+
397
+ return equal;
398
+ }
399
+
400
+ /**
401
+ * Whether the channel is deletable by the client user
402
+ * @type {boolean}
403
+ * @readonly
404
+ */
405
+ get deletable() {
406
+ return this.manageable && this.guild.rulesChannelId !== this.id && this.guild.publicUpdatesChannelId !== this.id;
407
+ }
408
+
409
+ /**
410
+ * Whether the channel is manageable by the client user
411
+ * @type {boolean}
412
+ * @readonly
413
+ */
414
+ get manageable() {
415
+ if (this.client.user.id === this.guild.ownerId) return true;
416
+ const permissions = this.permissionsFor(this.client.user);
417
+ if (!permissions) return false;
418
+
419
+ // This flag allows managing even if timed out
420
+ if (permissions.has(PermissionFlagsBits.Administrator, false)) return true;
421
+ if (this.guild.members.me.communicationDisabledUntilTimestamp > Date.now()) return false;
422
+
423
+ const bitfield = VoiceBasedChannelTypes.includes(this.type)
424
+ ? PermissionFlagsBits.ManageChannels | PermissionFlagsBits.Connect
425
+ : PermissionFlagsBits.ViewChannel | PermissionFlagsBits.ManageChannels;
426
+ return permissions.has(bitfield, false);
427
+ }
428
+
429
+ /**
430
+ * Whether the channel is viewable by the client user
431
+ * @type {boolean}
432
+ * @readonly
433
+ */
434
+ get viewable() {
435
+ if (this.client.user.id === this.guild.ownerId) return true;
436
+ const permissions = this.permissionsFor(this.client.user);
437
+ if (!permissions) return false;
438
+ return permissions.has(PermissionFlagsBits.ViewChannel, false);
439
+ }
440
+
441
+ /**
442
+ * Deletes this channel.
443
+ * @param {string} [reason] Reason for deleting this channel
444
+ * @returns {Promise<GuildChannel>}
445
+ * @example
446
+ * // Delete the channel
447
+ * channel.delete('making room for new channels')
448
+ * .then(console.log)
449
+ * .catch(console.error);
450
+ */
451
+ async delete(reason) {
452
+ await this.guild.channels.delete(this.id, reason);
453
+ return this;
454
+ }
455
+ }
456
+
457
+ module.exports = GuildChannel;
@@ -0,0 +1,148 @@
1
+ 'use strict';
2
+
3
+ const { PermissionFlagsBits } = require('discord-api-types/v10');
4
+ const BaseGuildEmoji = require('./BaseGuildEmoji');
5
+ const { DiscordjsError, ErrorCodes } = require('../errors');
6
+ const GuildEmojiRoleManager = require('../managers/GuildEmojiRoleManager');
7
+
8
+ /**
9
+ * Represents a custom emoji.
10
+ * @extends {BaseGuildEmoji}
11
+ */
12
+ class GuildEmoji extends BaseGuildEmoji {
13
+ constructor(client, data, guild) {
14
+ super(client, data, guild);
15
+
16
+ /**
17
+ * The user who created this emoji
18
+ * @type {?User}
19
+ */
20
+ this.author = null;
21
+
22
+ /**
23
+ * Array of role ids this emoji is active for
24
+ * @name GuildEmoji#_roles
25
+ * @type {Snowflake[]}
26
+ * @private
27
+ */
28
+ Object.defineProperty(this, '_roles', { value: [], writable: true });
29
+
30
+ this._patch(data);
31
+ }
32
+
33
+ /**
34
+ * The guild this emoji is part of
35
+ * @type {Guild}
36
+ * @name GuildEmoji#guild
37
+ */
38
+
39
+ _clone() {
40
+ const clone = super._clone();
41
+ clone._roles = this._roles.slice();
42
+ return clone;
43
+ }
44
+
45
+ _patch(data) {
46
+ super._patch(data);
47
+
48
+ if (data.user) this.author = this.client.users._add(data.user);
49
+ if (data.roles) this._roles = data.roles;
50
+ }
51
+
52
+ /**
53
+ * Whether the emoji is deletable by the client user
54
+ * @type {boolean}
55
+ * @readonly
56
+ */
57
+ get deletable() {
58
+ if (!this.guild.members.me) throw new DiscordjsError(ErrorCodes.GuildUncachedMe);
59
+ return !this.managed && this.guild.members.me.permissions.has(PermissionFlagsBits.ManageGuildExpressions);
60
+ }
61
+
62
+ /**
63
+ * A manager for roles this emoji is active for.
64
+ * @type {GuildEmojiRoleManager}
65
+ * @readonly
66
+ */
67
+ get roles() {
68
+ return new GuildEmojiRoleManager(this);
69
+ }
70
+
71
+ /**
72
+ * Fetches the author for this emoji
73
+ * @returns {Promise<User>}
74
+ */
75
+ fetchAuthor() {
76
+ return this.guild.emojis.fetchAuthor(this);
77
+ }
78
+
79
+ /**
80
+ * Data for editing an emoji.
81
+ * @typedef {Object} GuildEmojiEditOptions
82
+ * @property {string} [name] The name of the emoji
83
+ * @property {Collection<Snowflake, Role>|RoleResolvable[]} [roles] Roles to restrict emoji to
84
+ * @property {string} [reason] Reason for editing this emoji
85
+ */
86
+
87
+ /**
88
+ * Edits the emoji.
89
+ * @param {GuildEmojiEditOptions} options The options to provide
90
+ * @returns {Promise<GuildEmoji>}
91
+ * @example
92
+ * // Edit an emoji
93
+ * emoji.edit({ name: 'newemoji' })
94
+ * .then(e => console.log(`Edited emoji ${e}`))
95
+ * .catch(console.error);
96
+ */
97
+ edit(options) {
98
+ return this.guild.emojis.edit(this.id, options);
99
+ }
100
+
101
+ /**
102
+ * Sets the name of the emoji.
103
+ * @param {string} name The new name for the emoji
104
+ * @param {string} [reason] Reason for changing the emoji's name
105
+ * @returns {Promise<GuildEmoji>}
106
+ */
107
+ setName(name, reason) {
108
+ return this.edit({ name, reason });
109
+ }
110
+
111
+ /**
112
+ * Deletes the emoji.
113
+ * @param {string} [reason] Reason for deleting the emoji
114
+ * @returns {Promise<GuildEmoji>}
115
+ */
116
+ async delete(reason) {
117
+ await this.guild.emojis.delete(this.id, reason);
118
+ return this;
119
+ }
120
+
121
+ /**
122
+ * Whether this emoji is the same as another one.
123
+ * @param {GuildEmoji|APIEmoji} other The emoji to compare it to
124
+ * @returns {boolean}
125
+ */
126
+ equals(other) {
127
+ if (other instanceof GuildEmoji) {
128
+ return (
129
+ other.id === this.id &&
130
+ other.name === this.name &&
131
+ other.managed === this.managed &&
132
+ other.available === this.available &&
133
+ other.requiresColons === this.requiresColons &&
134
+ other.roles.cache.size === this.roles.cache.size &&
135
+ other.roles.cache.every(role => this.roles.cache.has(role.id))
136
+ );
137
+ } else {
138
+ return (
139
+ other.id === this.id &&
140
+ other.name === this.name &&
141
+ other.roles.length === this.roles.cache.size &&
142
+ other.roles.every(role => this.roles.cache.has(role))
143
+ );
144
+ }
145
+ }
146
+ }
147
+
148
+ module.exports = GuildEmoji;