@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,540 @@
1
+ 'use strict';
2
+
3
+ const { setTimeout, clearTimeout } = require('node:timers');
4
+ const { Collection } = require('@discordjs/collection');
5
+ const { makeURLSearchParams } = require('@discordjs/rest');
6
+ const { DiscordSnowflake } = require('@sapphire/snowflake');
7
+ const { Routes, GatewayOpcodes } = require('discord-api-types/v10');
8
+ const CachedManager = require('./CachedManager');
9
+ const { DiscordjsError, DiscordjsTypeError, DiscordjsRangeError, ErrorCodes } = require('../errors');
10
+ const BaseGuildVoiceChannel = require('../structures/BaseGuildVoiceChannel');
11
+ const { GuildMember } = require('../structures/GuildMember');
12
+ const { Role } = require('../structures/Role');
13
+ const Events = require('../util/Events');
14
+ const { GuildMemberFlagsBitField } = require('../util/GuildMemberFlagsBitField');
15
+ const Partials = require('../util/Partials');
16
+
17
+ /**
18
+ * Manages API methods for GuildMembers and stores their cache.
19
+ * @extends {CachedManager}
20
+ */
21
+ class GuildMemberManager extends CachedManager {
22
+ constructor(guild, iterable) {
23
+ super(guild.client, GuildMember, iterable);
24
+
25
+ /**
26
+ * The guild this manager belongs to
27
+ * @type {Guild}
28
+ */
29
+ this.guild = guild;
30
+ }
31
+
32
+ /**
33
+ * The cache of this Manager
34
+ * @type {Collection<Snowflake, GuildMember>}
35
+ * @name GuildMemberManager#cache
36
+ */
37
+
38
+ _add(data, cache = true) {
39
+ return super._add(data, cache, { id: data.user.id, extras: [this.guild] });
40
+ }
41
+
42
+ /**
43
+ * Data that resolves to give a GuildMember object. This can be:
44
+ * * A GuildMember object
45
+ * * A User resolvable
46
+ * @typedef {GuildMember|UserResolvable} GuildMemberResolvable
47
+ */
48
+
49
+ /**
50
+ * Resolves a {@link GuildMemberResolvable} to a {@link GuildMember} object.
51
+ * @param {GuildMemberResolvable} member The user that is part of the guild
52
+ * @returns {?GuildMember}
53
+ */
54
+ resolve(member) {
55
+ const memberResolvable = super.resolve(member);
56
+ if (memberResolvable) return memberResolvable;
57
+ const userResolvable = this.client.users.resolveId(member);
58
+ if (userResolvable) return super.resolve(userResolvable);
59
+ return null;
60
+ }
61
+
62
+ /**
63
+ * Resolves a {@link GuildMemberResolvable} to a member id.
64
+ * @param {GuildMemberResolvable} member The user that is part of the guild
65
+ * @returns {?Snowflake}
66
+ */
67
+ resolveId(member) {
68
+ const memberResolvable = super.resolveId(member);
69
+ if (memberResolvable) return memberResolvable;
70
+ const userResolvable = this.client.users.resolveId(member);
71
+ return this.cache.has(userResolvable) ? userResolvable : null;
72
+ }
73
+
74
+ /**
75
+ * Options used to add a user to a guild using OAuth2.
76
+ * @typedef {Object} AddGuildMemberOptions
77
+ * @property {string} accessToken An OAuth2 access token for the user with the {@link OAuth2Scopes.GuildsJoin}
78
+ * scope granted to the bot's application
79
+ * @property {string} [nick] The nickname to give to the member
80
+ * <info>This property requires the {@link PermissionFlagsBits.ManageNicknames} permission.</info>
81
+ * @property {Collection<Snowflake, Role>|RoleResolvable[]} [roles] The roles to add to the member
82
+ * <info>This property requires the {@link PermissionFlagsBits.ManageRoles} permission.</info>
83
+ * @property {boolean} [mute] Whether the member should be muted
84
+ * <info>This property requires the {@link PermissionFlagsBits.MuteMembers} permission.</info>
85
+ * @property {boolean} [deaf] Whether the member should be deafened
86
+ * <info>This property requires the {@link PermissionFlagsBits.MuteMembers} permission.</info>
87
+ * @property {boolean} [force] Whether to skip the cache check and request the API directly
88
+ * @property {boolean} [fetchWhenExisting=true] Whether to fetch the user if not cached and already a member
89
+ */
90
+
91
+ /**
92
+ * Adds a user to the guild using OAuth2.
93
+ * <info>This method requires the {@link PermissionFlagsBits.CreateInstantInvite} permission.
94
+ * @param {UserResolvable} user The user to add to the guild
95
+ * @param {AddGuildMemberOptions} options Options for adding the user to the guild
96
+ * @returns {Promise<GuildMember|null>}
97
+ */
98
+ async add(user, options) {
99
+ const userId = this.client.users.resolveId(user);
100
+ if (!userId) throw new DiscordjsTypeError(ErrorCodes.InvalidType, 'user', 'UserResolvable');
101
+ if (!options.force) {
102
+ const cachedUser = this.cache.get(userId);
103
+ if (cachedUser) return cachedUser;
104
+ }
105
+ const resolvedOptions = {
106
+ access_token: options.accessToken,
107
+ nick: options.nick,
108
+ mute: options.mute,
109
+ deaf: options.deaf,
110
+ };
111
+ if (options.roles) {
112
+ if (!Array.isArray(options.roles) && !(options.roles instanceof Collection)) {
113
+ throw new DiscordjsTypeError(
114
+ ErrorCodes.InvalidType,
115
+ 'options.roles',
116
+ 'Array or Collection of Roles or Snowflakes',
117
+ true,
118
+ );
119
+ }
120
+ const resolvedRoles = [];
121
+ for (const role of options.roles.values()) {
122
+ const resolvedRole = this.guild.roles.resolveId(role);
123
+ if (!resolvedRole) {
124
+ throw new DiscordjsTypeError(ErrorCodes.InvalidElement, 'Array or Collection', 'options.roles', role);
125
+ }
126
+ resolvedRoles.push(resolvedRole);
127
+ }
128
+ resolvedOptions.roles = resolvedRoles;
129
+ }
130
+ const data = await this.client.rest.put(Routes.guildMember(this.guild.id, userId), { body: resolvedOptions });
131
+ // Data is an empty Uint8Array if the member is already part of the guild.
132
+ return data instanceof Uint8Array
133
+ ? options.fetchWhenExisting === false
134
+ ? null
135
+ : this.fetch(userId)
136
+ : this._add(data);
137
+ }
138
+
139
+ /**
140
+ * The client user as a GuildMember of this guild
141
+ * @type {?GuildMember}
142
+ * @readonly
143
+ */
144
+ get me() {
145
+ return (
146
+ this.resolve(this.client.user.id) ??
147
+ (this.client.options.partials.includes(Partials.GuildMember)
148
+ ? this._add({ user: { id: this.client.user.id } }, true)
149
+ : null)
150
+ );
151
+ }
152
+
153
+ /**
154
+ * Options used to fetch a single member from a guild.
155
+ * @typedef {BaseFetchOptions} FetchMemberOptions
156
+ * @property {UserResolvable} user The user to fetch
157
+ */
158
+
159
+ /**
160
+ * Options used to fetch multiple members from a guild.
161
+ * @typedef {Object} FetchMembersOptions
162
+ * @property {UserResolvable|UserResolvable[]} [user] The user(s) to fetch
163
+ * @property {?string} [query] Limit fetch to members with similar usernames
164
+ * @property {number} [limit=0] Maximum number of members to request
165
+ * @property {boolean} [withPresences=false] Whether to include the presences
166
+ * @property {number} [time=120e3] Timeout for receipt of members
167
+ * @property {?string} [nonce] Nonce for this request (32 characters max - default to base 16 now timestamp)
168
+ */
169
+
170
+ /**
171
+ * Fetches member(s) from a guild.
172
+ * @param {UserResolvable|FetchMemberOptions|FetchMembersOptions} [options] Options for fetching member(s).
173
+ * Omitting the parameter or providing `undefined` will fetch all members.
174
+ * @returns {Promise<GuildMember|Collection<Snowflake, GuildMember>>}
175
+ * @example
176
+ * // Fetch all members from a guild
177
+ * guild.members.fetch()
178
+ * .then(console.log)
179
+ * .catch(console.error);
180
+ * @example
181
+ * // Fetch a single member
182
+ * guild.members.fetch('66564597481480192')
183
+ * .then(console.log)
184
+ * .catch(console.error);
185
+ * @example
186
+ * // Fetch a single member without checking cache
187
+ * guild.members.fetch({ user, force: true })
188
+ * .then(console.log)
189
+ * .catch(console.error)
190
+ * @example
191
+ * // Fetch a single member without caching
192
+ * guild.members.fetch({ user, cache: false })
193
+ * .then(console.log)
194
+ * .catch(console.error);
195
+ * @example
196
+ * // Fetch by an array of users including their presences
197
+ * guild.members.fetch({ user: ['66564597481480192', '191615925336670208'], withPresences: true })
198
+ * .then(console.log)
199
+ * .catch(console.error);
200
+ * @example
201
+ * // Fetch by query
202
+ * guild.members.fetch({ query: 'hydra', limit: 1 })
203
+ * .then(console.log)
204
+ * .catch(console.error);
205
+ */
206
+ fetch(options) {
207
+ if (!options) return this._fetchMany();
208
+ const { user: users, limit, withPresences, cache, force } = options;
209
+ const resolvedUser = this.client.users.resolveId(users ?? options);
210
+ if (resolvedUser && !limit && !withPresences) return this._fetchSingle({ user: resolvedUser, cache, force });
211
+ const resolvedUsers = users?.map?.(user => this.client.users.resolveId(user)) ?? resolvedUser ?? undefined;
212
+ return this._fetchMany({ ...options, users: resolvedUsers });
213
+ }
214
+
215
+ async _fetchSingle({ user, cache, force = false }) {
216
+ if (!force) {
217
+ const existing = this.cache.get(user);
218
+ if (existing && !existing.partial) return existing;
219
+ }
220
+
221
+ const data = await this.client.rest.get(Routes.guildMember(this.guild.id, user));
222
+ return this._add(data, cache);
223
+ }
224
+
225
+ _fetchMany({
226
+ limit = 0,
227
+ withPresences: presences,
228
+ users,
229
+ query,
230
+ time = 120e3,
231
+ nonce = DiscordSnowflake.generate().toString(),
232
+ } = {}) {
233
+ if (nonce.length > 32) return Promise.reject(new DiscordjsRangeError(ErrorCodes.MemberFetchNonceLength));
234
+
235
+ return new Promise((resolve, reject) => {
236
+ if (!query && !users) query = '';
237
+ this.guild.shard.send({
238
+ op: GatewayOpcodes.RequestGuildMembers,
239
+ d: {
240
+ guild_id: this.guild.id,
241
+ presences,
242
+ user_ids: users,
243
+ query,
244
+ nonce,
245
+ limit,
246
+ },
247
+ });
248
+ const fetchedMembers = new Collection();
249
+ let i = 0;
250
+ const handler = (members, _, chunk) => {
251
+ if (chunk.nonce !== nonce) return;
252
+ timeout.refresh();
253
+ i++;
254
+ for (const member of members.values()) {
255
+ fetchedMembers.set(member.id, member);
256
+ }
257
+ if (members.size < 1_000 || (limit && fetchedMembers.size >= limit) || i === chunk.count) {
258
+ clearTimeout(timeout);
259
+ this.client.removeListener(Events.GuildMembersChunk, handler);
260
+ this.client.decrementMaxListeners();
261
+ resolve(users && !Array.isArray(users) && fetchedMembers.size ? fetchedMembers.first() : fetchedMembers);
262
+ }
263
+ };
264
+ const timeout = setTimeout(() => {
265
+ this.client.removeListener(Events.GuildMembersChunk, handler);
266
+ this.client.decrementMaxListeners();
267
+ reject(new DiscordjsError(ErrorCodes.GuildMembersTimeout));
268
+ }, time).unref();
269
+ this.client.incrementMaxListeners();
270
+ this.client.on(Events.GuildMembersChunk, handler);
271
+ });
272
+ }
273
+
274
+ /**
275
+ * Fetches the client user as a GuildMember of the guild.
276
+ * @param {BaseFetchOptions} [options] The options for fetching the member
277
+ * @returns {Promise<GuildMember>}
278
+ */
279
+ fetchMe(options) {
280
+ return this.fetch({ ...options, user: this.client.user.id });
281
+ }
282
+
283
+ /**
284
+ * Options used for searching guild members.
285
+ * @typedef {Object} GuildSearchMembersOptions
286
+ * @property {string} query Filter members whose username or nickname start with this query
287
+ * @property {number} [limit] Maximum number of members to search
288
+ * @property {boolean} [cache=true] Whether or not to cache the fetched member(s)
289
+ */
290
+
291
+ /**
292
+ * Searches for members in the guild based on a query.
293
+ * @param {GuildSearchMembersOptions} options Options for searching members
294
+ * @returns {Promise<Collection<Snowflake, GuildMember>>}
295
+ */
296
+ async search({ query, limit, cache = true } = {}) {
297
+ const data = await this.client.rest.get(Routes.guildMembersSearch(this.guild.id), {
298
+ query: makeURLSearchParams({ query, limit }),
299
+ });
300
+ return data.reduce((col, member) => col.set(member.user.id, this._add(member, cache)), new Collection());
301
+ }
302
+
303
+ /**
304
+ * Options used for listing guild members.
305
+ * @typedef {Object} GuildListMembersOptions
306
+ * @property {Snowflake} [after] Limit fetching members to those with an id greater than the supplied id
307
+ * @property {number} [limit] Maximum number of members to list
308
+ * @property {boolean} [cache=true] Whether or not to cache the fetched member(s)
309
+ */
310
+
311
+ /**
312
+ * Lists up to 1000 members of the guild.
313
+ * @param {GuildListMembersOptions} [options] Options for listing members
314
+ * @returns {Promise<Collection<Snowflake, GuildMember>>}
315
+ */
316
+ async list({ after, limit, cache = true } = {}) {
317
+ const query = makeURLSearchParams({ limit, after });
318
+ const data = await this.client.rest.get(Routes.guildMembers(this.guild.id), { query });
319
+ return data.reduce((col, member) => col.set(member.user.id, this._add(member, cache)), new Collection());
320
+ }
321
+
322
+ /**
323
+ * The data for editing a guild member.
324
+ * @typedef {Object} GuildMemberEditOptions
325
+ * @property {?string} [nick] The nickname to set for the member
326
+ * @property {Collection<Snowflake, Role>|RoleResolvable[]} [roles] The roles or role ids to apply
327
+ * @property {boolean} [mute] Whether or not the member should be muted
328
+ * @property {boolean} [deaf] Whether or not the member should be deafened
329
+ * @property {GuildVoiceChannelResolvable|null} [channel] Channel to move the member to
330
+ * (if they are connected to voice), or `null` if you want to disconnect them from voice
331
+ * @property {DateResolvable|null} [communicationDisabledUntil] The date or timestamp
332
+ * for the member's communication to be disabled until. Provide `null` to enable communication again.
333
+ * @property {GuildMemberFlagsResolvable} [flags] The flags to set for the member
334
+ * @property {string} [reason] Reason for editing this user
335
+ */
336
+
337
+ /**
338
+ * Edits a member of the guild.
339
+ * <info>The user must be a member of the guild</info>
340
+ * @param {UserResolvable} user The member to edit
341
+ * @param {GuildMemberEditOptions} options The options to provide
342
+ * @returns {Promise<GuildMember>}
343
+ */
344
+ async edit(user, { reason, ...options }) {
345
+ const id = this.client.users.resolveId(user);
346
+ if (!id) throw new DiscordjsTypeError(ErrorCodes.InvalidType, 'user', 'UserResolvable');
347
+
348
+ if (options.channel) {
349
+ options.channel = this.guild.channels.resolve(options.channel);
350
+ if (!(options.channel instanceof BaseGuildVoiceChannel)) {
351
+ throw new DiscordjsError(ErrorCodes.GuildVoiceChannelResolve);
352
+ }
353
+ options.channel_id = options.channel.id;
354
+ options.channel = undefined;
355
+ } else if (options.channel === null) {
356
+ options.channel_id = null;
357
+ options.channel = undefined;
358
+ }
359
+ options.roles &&= options.roles.map(role => (role instanceof Role ? role.id : role));
360
+
361
+ if (options.communicationDisabledUntil !== undefined) {
362
+ options.communication_disabled_until =
363
+ // eslint-disable-next-line eqeqeq
364
+ options.communicationDisabledUntil != null
365
+ ? new Date(options.communicationDisabledUntil).toISOString()
366
+ : options.communicationDisabledUntil;
367
+ }
368
+
369
+ if (options.flags !== undefined) {
370
+ options.flags = GuildMemberFlagsBitField.resolve(options.flags);
371
+ }
372
+
373
+ let endpoint;
374
+ if (id === this.client.user.id) {
375
+ const keys = Object.keys(options);
376
+ if (keys.length === 1 && keys[0] === 'nick') endpoint = Routes.guildMember(this.guild.id);
377
+ else endpoint = Routes.guildMember(this.guild.id, id);
378
+ } else {
379
+ endpoint = Routes.guildMember(this.guild.id, id);
380
+ }
381
+ const d = await this.client.rest.patch(endpoint, { body: options, reason });
382
+
383
+ const clone = this.cache.get(id)?._clone();
384
+ clone?._patch(d);
385
+ return clone ?? this._add(d, false);
386
+ }
387
+
388
+ /**
389
+ * Options used for pruning guild members.
390
+ * <info>It's recommended to set {@link GuildPruneMembersOptions#count options.count}
391
+ * to `false` for large guilds.</info>
392
+ * @typedef {Object} GuildPruneMembersOptions
393
+ * @property {number} [days] Number of days of inactivity required to kick
394
+ * @property {boolean} [dry=false] Get the number of users that will be kicked, without actually kicking them
395
+ * @property {boolean} [count] Whether or not to return the number of users that have been kicked.
396
+ * @property {RoleResolvable[]} [roles] Array of roles to bypass the "...and no roles" constraint when pruning
397
+ * @property {string} [reason] Reason for this prune
398
+ */
399
+
400
+ /**
401
+ * Prunes members from the guild based on how long they have been inactive.
402
+ * @param {GuildPruneMembersOptions} [options] Options for pruning
403
+ * @returns {Promise<number|null>} The number of members that were/will be kicked
404
+ * @example
405
+ * // See how many members will be pruned
406
+ * guild.members.prune({ dry: true })
407
+ * .then(pruned => console.log(`This will prune ${pruned} people!`))
408
+ * .catch(console.error);
409
+ * @example
410
+ * // Actually prune the members
411
+ * guild.members.prune({ days: 1, reason: 'too many people!' })
412
+ * .then(pruned => console.log(`I just pruned ${pruned} people!`))
413
+ * .catch(console.error);
414
+ * @example
415
+ * // Include members with a specified role
416
+ * guild.members.prune({ days: 7, roles: ['657259391652855808'] })
417
+ * .then(pruned => console.log(`I just pruned ${pruned} people!`))
418
+ * .catch(console.error);
419
+ */
420
+ async prune({ days, dry = false, count: compute_prune_count, roles = [], reason } = {}) {
421
+ if (typeof days !== 'number') throw new DiscordjsTypeError(ErrorCodes.PruneDaysType);
422
+
423
+ const query = { days };
424
+ const resolvedRoles = [];
425
+
426
+ for (const role of roles) {
427
+ const resolvedRole = this.guild.roles.resolveId(role);
428
+ if (!resolvedRole) {
429
+ throw new DiscordjsTypeError(ErrorCodes.InvalidElement, 'Array', 'options.roles', role);
430
+ }
431
+ resolvedRoles.push(resolvedRole);
432
+ }
433
+
434
+ if (resolvedRoles.length) {
435
+ query.include_roles = dry ? resolvedRoles.join(',') : resolvedRoles;
436
+ }
437
+
438
+ const endpoint = Routes.guildPrune(this.guild.id);
439
+
440
+ const { pruned } = await (dry
441
+ ? this.client.rest.get(endpoint, { query: makeURLSearchParams(query), reason })
442
+ : this.client.rest.post(endpoint, { body: { ...query, compute_prune_count }, reason }));
443
+
444
+ return pruned;
445
+ }
446
+
447
+ /**
448
+ * Kicks a user from the guild.
449
+ * <info>The user must be a member of the guild</info>
450
+ * @param {UserResolvable} user The member to kick
451
+ * @param {string} [reason] Reason for kicking
452
+ * @returns {Promise<GuildMember|User|Snowflake>} Result object will be resolved as specifically as possible.
453
+ * If the GuildMember cannot be resolved, the User will instead be attempted to be resolved. If that also cannot
454
+ * be resolved, the user's id will be the result.
455
+ * @example
456
+ * // Kick a user by id (or with a user/guild member object)
457
+ * guild.members.kick('84484653687267328')
458
+ * .then(kickInfo => console.log(`Kicked ${kickInfo.user?.tag ?? kickInfo.tag ?? kickInfo}`))
459
+ * .catch(console.error);
460
+ */
461
+ async kick(user, reason) {
462
+ const id = this.client.users.resolveId(user);
463
+ if (!id) return Promise.reject(new DiscordjsTypeError(ErrorCodes.InvalidType, 'user', 'UserResolvable'));
464
+
465
+ await this.client.rest.delete(Routes.guildMember(this.guild.id, id), { reason });
466
+
467
+ return this.resolve(user) ?? this.client.users.resolve(user) ?? id;
468
+ }
469
+
470
+ /**
471
+ * Bans a user from the guild.
472
+ * @param {UserResolvable} user The user to ban
473
+ * @param {BanOptions} [options] Options for the ban
474
+ * @returns {Promise<GuildMember|User|Snowflake>} Result object will be resolved as specifically as possible.
475
+ * If the GuildMember cannot be resolved, the User will instead be attempted to be resolved. If that also cannot
476
+ * be resolved, the user id will be the result.
477
+ * Internally calls the GuildBanManager#create method.
478
+ * @example
479
+ * // Ban a user by id (or with a user/guild member object)
480
+ * guild.members.ban('84484653687267328')
481
+ * .then(banInfo => console.log(`Banned ${banInfo.user?.tag ?? banInfo.tag ?? banInfo}`))
482
+ * .catch(console.error);
483
+ */
484
+ ban(user, options) {
485
+ return this.guild.bans.create(user, options);
486
+ }
487
+
488
+ /**
489
+ * Unbans a user from the guild. Internally calls the {@link GuildBanManager#remove} method.
490
+ * @param {UserResolvable} user The user to unban
491
+ * @param {string} [reason] Reason for unbanning user
492
+ * @returns {Promise<?User>} The user that was unbanned
493
+ * @example
494
+ * // Unban a user by id (or with a user/guild member object)
495
+ * guild.members.unban('84484653687267328')
496
+ * .then(user => console.log(`Unbanned ${user.username} from ${guild.name}`))
497
+ * .catch(console.error);
498
+ */
499
+ unban(user, reason) {
500
+ return this.guild.bans.remove(user, reason);
501
+ }
502
+
503
+ /**
504
+ * Options used for adding or removing a role from a member.
505
+ * @typedef {Object} AddOrRemoveGuildMemberRoleOptions
506
+ * @property {GuildMemberResolvable} user The user to add/remove the role from
507
+ * @property {RoleResolvable} role The role to add/remove
508
+ * @property {string} [reason] Reason for adding/removing the role
509
+ */
510
+
511
+ /**
512
+ * Adds a role to a member.
513
+ * @param {AddOrRemoveGuildMemberRoleOptions} options Options for adding the role
514
+ * @returns {Promise<GuildMember|User|Snowflake>}
515
+ */
516
+ async addRole(options) {
517
+ const { user, role, reason } = options;
518
+ const userId = this.guild.members.resolveId(user);
519
+ const roleId = this.guild.roles.resolveId(role);
520
+ await this.client.rest.put(Routes.guildMemberRole(this.guild.id, userId, roleId), { reason });
521
+
522
+ return this.resolve(user) ?? this.client.users.resolve(user) ?? userId;
523
+ }
524
+
525
+ /**
526
+ * Removes a role from a member.
527
+ * @param {AddOrRemoveGuildMemberRoleOptions} options Options for removing the role
528
+ * @returns {Promise<GuildMember|User|Snowflake>}
529
+ */
530
+ async removeRole(options) {
531
+ const { user, role, reason } = options;
532
+ const userId = this.guild.members.resolveId(user);
533
+ const roleId = this.guild.roles.resolveId(role);
534
+ await this.client.rest.delete(Routes.guildMemberRole(this.guild.id, userId, roleId), { reason });
535
+
536
+ return this.resolve(user) ?? this.client.users.resolve(user) ?? userId;
537
+ }
538
+ }
539
+
540
+ module.exports = GuildMemberManager;