@ovencord/discord.js 14.16.3

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 (332) hide show
  1. package/LICENSE +191 -0
  2. package/README.md +148 -0
  3. package/package.json +73 -0
  4. package/src/client/Client.ts +967 -0
  5. package/src/client/actions/Action.ts +141 -0
  6. package/src/client/actions/ActionsManager.ts +138 -0
  7. package/src/client/actions/ChannelCreate.ts +21 -0
  8. package/src/client/actions/ChannelDelete.ts +20 -0
  9. package/src/client/actions/ChannelUpdate.ts +38 -0
  10. package/src/client/actions/GuildChannelsPositionUpdate.ts +17 -0
  11. package/src/client/actions/GuildEmojiCreate.ts +17 -0
  12. package/src/client/actions/GuildEmojiDelete.ts +16 -0
  13. package/src/client/actions/GuildEmojiUpdate.ts +17 -0
  14. package/src/client/actions/GuildEmojisUpdate.ts +30 -0
  15. package/src/client/actions/GuildMemberRemove.ts +29 -0
  16. package/src/client/actions/GuildMemberUpdate.ts +41 -0
  17. package/src/client/actions/GuildRoleCreate.ts +23 -0
  18. package/src/client/actions/GuildRoleDelete.ts +26 -0
  19. package/src/client/actions/GuildRolesPositionUpdate.ts +17 -0
  20. package/src/client/actions/GuildScheduledEventDelete.ts +28 -0
  21. package/src/client/actions/GuildScheduledEventUserAdd.ts +29 -0
  22. package/src/client/actions/GuildScheduledEventUserRemove.ts +29 -0
  23. package/src/client/actions/GuildSoundboardSoundDelete.ts +26 -0
  24. package/src/client/actions/GuildStickerCreate.ts +17 -0
  25. package/src/client/actions/GuildStickerDelete.ts +16 -0
  26. package/src/client/actions/GuildStickerUpdate.ts +17 -0
  27. package/src/client/actions/GuildStickersUpdate.ts +30 -0
  28. package/src/client/actions/GuildUpdate.ts +30 -0
  29. package/src/client/actions/InteractionCreate.ts +104 -0
  30. package/src/client/actions/MessageCreate.ts +38 -0
  31. package/src/client/actions/MessageDelete.ts +29 -0
  32. package/src/client/actions/MessageDeleteBulk.ts +45 -0
  33. package/src/client/actions/MessagePollVoteAdd.ts +37 -0
  34. package/src/client/actions/MessagePollVoteRemove.ts +35 -0
  35. package/src/client/actions/MessageReactionAdd.ts +68 -0
  36. package/src/client/actions/MessageReactionRemove.ts +47 -0
  37. package/src/client/actions/MessageReactionRemoveAll.ts +30 -0
  38. package/src/client/actions/MessageReactionRemoveEmoji.ts +25 -0
  39. package/src/client/actions/MessageUpdate.ts +22 -0
  40. package/src/client/actions/StageInstanceCreate.ts +25 -0
  41. package/src/client/actions/StageInstanceDelete.ts +28 -0
  42. package/src/client/actions/StageInstanceUpdate.ts +27 -0
  43. package/src/client/actions/ThreadCreate.ts +22 -0
  44. package/src/client/actions/ThreadMembersUpdate.ts +45 -0
  45. package/src/client/actions/TypingStart.ts +26 -0
  46. package/src/client/actions/UserUpdate.ts +33 -0
  47. package/src/client/voice/ClientVoiceManager.ts +46 -0
  48. package/src/client/websocket/handlers/APPLICATION_COMMAND_PERMISSIONS_UPDATE.ts +19 -0
  49. package/src/client/websocket/handlers/AUTO_MODERATION_ACTION_EXECUTION.ts +17 -0
  50. package/src/client/websocket/handlers/AUTO_MODERATION_RULE_CREATE.ts +18 -0
  51. package/src/client/websocket/handlers/AUTO_MODERATION_RULE_DELETE.ts +21 -0
  52. package/src/client/websocket/handlers/AUTO_MODERATION_RULE_UPDATE.ts +20 -0
  53. package/src/client/websocket/handlers/CHANNEL_CREATE.ts +4 -0
  54. package/src/client/websocket/handlers/CHANNEL_DELETE.ts +4 -0
  55. package/src/client/websocket/handlers/CHANNEL_PINS_UPDATE.ts +22 -0
  56. package/src/client/websocket/handlers/CHANNEL_UPDATE.ts +16 -0
  57. package/src/client/websocket/handlers/ENTITLEMENT_CREATE.ts +14 -0
  58. package/src/client/websocket/handlers/ENTITLEMENT_DELETE.ts +18 -0
  59. package/src/client/websocket/handlers/ENTITLEMENT_UPDATE.ts +16 -0
  60. package/src/client/websocket/handlers/GUILD_AUDIT_LOG_ENTRY_CREATE.ts +19 -0
  61. package/src/client/websocket/handlers/GUILD_BAN_ADD.ts +15 -0
  62. package/src/client/websocket/handlers/GUILD_BAN_REMOVE.ts +20 -0
  63. package/src/client/websocket/handlers/GUILD_CREATE.ts +34 -0
  64. package/src/client/websocket/handlers/GUILD_DELETE.ts +36 -0
  65. package/src/client/websocket/handlers/GUILD_EMOJIS_UPDATE.ts +4 -0
  66. package/src/client/websocket/handlers/GUILD_INTEGRATIONS_UPDATE.ts +15 -0
  67. package/src/client/websocket/handlers/GUILD_MEMBERS_CHUNK.ts +40 -0
  68. package/src/client/websocket/handlers/GUILD_MEMBER_ADD.ts +17 -0
  69. package/src/client/websocket/handlers/GUILD_MEMBER_REMOVE.ts +4 -0
  70. package/src/client/websocket/handlers/GUILD_MEMBER_UPDATE.ts +4 -0
  71. package/src/client/websocket/handlers/GUILD_ROLE_CREATE.ts +4 -0
  72. package/src/client/websocket/handlers/GUILD_ROLE_DELETE.ts +4 -0
  73. package/src/client/websocket/handlers/GUILD_ROLE_UPDATE.ts +21 -0
  74. package/src/client/websocket/handlers/GUILD_SCHEDULED_EVENT_CREATE.ts +17 -0
  75. package/src/client/websocket/handlers/GUILD_SCHEDULED_EVENT_DELETE.ts +4 -0
  76. package/src/client/websocket/handlers/GUILD_SCHEDULED_EVENT_UPDATE.ts +19 -0
  77. package/src/client/websocket/handlers/GUILD_SCHEDULED_EVENT_USER_ADD.ts +4 -0
  78. package/src/client/websocket/handlers/GUILD_SCHEDULED_EVENT_USER_REMOVE.ts +4 -0
  79. package/src/client/websocket/handlers/GUILD_SOUNDBOARD_SOUNDS_UPDATE.ts +24 -0
  80. package/src/client/websocket/handlers/GUILD_SOUNDBOARD_SOUND_CREATE.ts +18 -0
  81. package/src/client/websocket/handlers/GUILD_SOUNDBOARD_SOUND_DELETE.ts +4 -0
  82. package/src/client/websocket/handlers/GUILD_SOUNDBOARD_SOUND_UPDATE.ts +20 -0
  83. package/src/client/websocket/handlers/GUILD_STICKERS_UPDATE.ts +4 -0
  84. package/src/client/websocket/handlers/GUILD_UPDATE.ts +4 -0
  85. package/src/client/websocket/handlers/INTERACTION_CREATE.ts +4 -0
  86. package/src/client/websocket/handlers/INVITE_CREATE.ts +20 -0
  87. package/src/client/websocket/handlers/INVITE_DELETE.ts +23 -0
  88. package/src/client/websocket/handlers/MESSAGE_CREATE.ts +4 -0
  89. package/src/client/websocket/handlers/MESSAGE_DELETE.ts +4 -0
  90. package/src/client/websocket/handlers/MESSAGE_DELETE_BULK.ts +4 -0
  91. package/src/client/websocket/handlers/MESSAGE_POLL_VOTE_ADD.ts +4 -0
  92. package/src/client/websocket/handlers/MESSAGE_POLL_VOTE_REMOVE.ts +4 -0
  93. package/src/client/websocket/handlers/MESSAGE_REACTION_ADD.ts +4 -0
  94. package/src/client/websocket/handlers/MESSAGE_REACTION_REMOVE.ts +4 -0
  95. package/src/client/websocket/handlers/MESSAGE_REACTION_REMOVE_ALL.ts +4 -0
  96. package/src/client/websocket/handlers/MESSAGE_REACTION_REMOVE_EMOJI.ts +4 -0
  97. package/src/client/websocket/handlers/MESSAGE_UPDATE.ts +16 -0
  98. package/src/client/websocket/handlers/PRESENCE_UPDATE.ts +42 -0
  99. package/src/client/websocket/handlers/RATE_LIMITED.ts +23 -0
  100. package/src/client/websocket/handlers/READY.ts +29 -0
  101. package/src/client/websocket/handlers/SOUNDBOARD_SOUNDS.ts +24 -0
  102. package/src/client/websocket/handlers/STAGE_INSTANCE_CREATE.ts +4 -0
  103. package/src/client/websocket/handlers/STAGE_INSTANCE_DELETE.ts +4 -0
  104. package/src/client/websocket/handlers/STAGE_INSTANCE_UPDATE.ts +4 -0
  105. package/src/client/websocket/handlers/SUBSCRIPTION_CREATE.ts +14 -0
  106. package/src/client/websocket/handlers/SUBSCRIPTION_DELETE.ts +16 -0
  107. package/src/client/websocket/handlers/SUBSCRIPTION_UPDATE.ts +16 -0
  108. package/src/client/websocket/handlers/THREAD_CREATE.ts +4 -0
  109. package/src/client/websocket/handlers/THREAD_DELETE.ts +17 -0
  110. package/src/client/websocket/handlers/THREAD_LIST_SYNC.ts +50 -0
  111. package/src/client/websocket/handlers/THREAD_MEMBERS_UPDATE.ts +4 -0
  112. package/src/client/websocket/handlers/THREAD_MEMBER_UPDATE.ts +25 -0
  113. package/src/client/websocket/handlers/THREAD_UPDATE.ts +16 -0
  114. package/src/client/websocket/handlers/TYPING_START.ts +4 -0
  115. package/src/client/websocket/handlers/USER_UPDATE.ts +4 -0
  116. package/src/client/websocket/handlers/VOICE_CHANNEL_EFFECT_SEND.ts +16 -0
  117. package/src/client/websocket/handlers/VOICE_SERVER_UPDATE.ts +5 -0
  118. package/src/client/websocket/handlers/VOICE_STATE_UPDATE.ts +37 -0
  119. package/src/client/websocket/handlers/WEBHOOKS_UPDATE.ts +16 -0
  120. package/src/client/websocket/handlers/index.ts +74 -0
  121. package/src/errors/DJSError.ts +50 -0
  122. package/src/errors/ErrorCodes.ts +277 -0
  123. package/src/errors/Messages.ts +155 -0
  124. package/src/errors/index.ts +6 -0
  125. package/src/index.ts +241 -0
  126. package/src/managers/ApplicationCommandManager.ts +303 -0
  127. package/src/managers/ApplicationCommandPermissionsManager.ts +453 -0
  128. package/src/managers/ApplicationEmojiManager.ts +149 -0
  129. package/src/managers/AutoModerationRuleManager.ts +307 -0
  130. package/src/managers/BaseManager.ts +13 -0
  131. package/src/managers/CachedManager.ts +56 -0
  132. package/src/managers/CategoryChannelChildManager.ts +81 -0
  133. package/src/managers/ChannelManager.ts +194 -0
  134. package/src/managers/DMMessageManager.ts +15 -0
  135. package/src/managers/DataManager.ts +38 -0
  136. package/src/managers/EntitlementManager.ts +182 -0
  137. package/src/managers/GuildApplicationCommandManager.ts +29 -0
  138. package/src/managers/GuildBanManager.ts +221 -0
  139. package/src/managers/GuildChannelManager.ts +552 -0
  140. package/src/managers/GuildEmojiManager.ts +262 -0
  141. package/src/managers/GuildEmojiRoleManager.ts +134 -0
  142. package/src/managers/GuildForumThreadManager.ts +84 -0
  143. package/src/managers/GuildInviteManager.ts +236 -0
  144. package/src/managers/GuildManager.ts +265 -0
  145. package/src/managers/GuildMemberManager.ts +619 -0
  146. package/src/managers/GuildMemberRoleManager.ts +230 -0
  147. package/src/managers/GuildMessageManager.ts +31 -0
  148. package/src/managers/GuildScheduledEventManager.ts +330 -0
  149. package/src/managers/GuildSoundboardSoundManager.ts +157 -0
  150. package/src/managers/GuildStickerManager.ts +192 -0
  151. package/src/managers/GuildTextThreadManager.ts +91 -0
  152. package/src/managers/MessageManager.ts +352 -0
  153. package/src/managers/PartialGroupDMMessageManager.ts +15 -0
  154. package/src/managers/PermissionOverwriteManager.ts +174 -0
  155. package/src/managers/PollAnswerVoterManager.ts +59 -0
  156. package/src/managers/PresenceManager.ts +60 -0
  157. package/src/managers/ReactionManager.ts +72 -0
  158. package/src/managers/ReactionUserManager.ts +82 -0
  159. package/src/managers/RoleManager.ts +432 -0
  160. package/src/managers/StageInstanceManager.ts +166 -0
  161. package/src/managers/SubscriptionManager.ts +83 -0
  162. package/src/managers/ThreadManager.ts +210 -0
  163. package/src/managers/ThreadMemberManager.ts +194 -0
  164. package/src/managers/UserManager.ts +139 -0
  165. package/src/managers/VoiceStateManager.ts +61 -0
  166. package/src/sharding/Shard.ts +513 -0
  167. package/src/sharding/ShardClientUtil.ts +293 -0
  168. package/src/sharding/ShardingManager.ts +374 -0
  169. package/src/structures/ActionRow.ts +31 -0
  170. package/src/structures/AnnouncementChannel.ts +25 -0
  171. package/src/structures/AnonymousGuild.ts +110 -0
  172. package/src/structures/ApplicationCommand.ts +675 -0
  173. package/src/structures/ApplicationEmoji.ts +189 -0
  174. package/src/structures/ApplicationRoleConnectionMetadata.ts +54 -0
  175. package/src/structures/Attachment.ts +189 -0
  176. package/src/structures/AuthorizingIntegrationOwners.ts +63 -0
  177. package/src/structures/AutoModerationActionExecution.ts +138 -0
  178. package/src/structures/AutoModerationRule.ts +325 -0
  179. package/src/structures/AutocompleteInteraction.ts +115 -0
  180. package/src/structures/Base.ts +37 -0
  181. package/src/structures/BaseChannel.ts +188 -0
  182. package/src/structures/BaseGuild.ts +134 -0
  183. package/src/structures/BaseGuildEmoji.ts +113 -0
  184. package/src/structures/BaseGuildTextChannel.ts +230 -0
  185. package/src/structures/BaseGuildVoiceChannel.ts +270 -0
  186. package/src/structures/BaseInteraction.ts +393 -0
  187. package/src/structures/BaseInvite.ts +192 -0
  188. package/src/structures/BaseSelectMenuComponent.ts +58 -0
  189. package/src/structures/ButtonComponent.ts +68 -0
  190. package/src/structures/ButtonInteraction.ts +8 -0
  191. package/src/structures/CategoryChannel.ts +46 -0
  192. package/src/structures/ChannelSelectMenuComponent.ts +18 -0
  193. package/src/structures/ChannelSelectMenuInteraction.ts +34 -0
  194. package/src/structures/ChatInputCommandInteraction.ts +43 -0
  195. package/src/structures/ClientApplication.ts +470 -0
  196. package/src/structures/ClientPresence.ts +87 -0
  197. package/src/structures/ClientUser.ts +219 -0
  198. package/src/structures/CommandInteraction.ts +193 -0
  199. package/src/structures/CommandInteractionOptionResolver.ts +336 -0
  200. package/src/structures/Component.ts +59 -0
  201. package/src/structures/ContainerComponent.ts +63 -0
  202. package/src/structures/ContextMenuCommandInteraction.ts +68 -0
  203. package/src/structures/DMChannel.ts +148 -0
  204. package/src/structures/DirectoryChannel.ts +40 -0
  205. package/src/structures/Embed.ts +251 -0
  206. package/src/structures/Emoji.ts +61 -0
  207. package/src/structures/Entitlement.ts +206 -0
  208. package/src/structures/FileComponent.ts +41 -0
  209. package/src/structures/ForumChannel.ts +31 -0
  210. package/src/structures/GroupDMInvite.ts +34 -0
  211. package/src/structures/Guild.ts +1605 -0
  212. package/src/structures/GuildAuditLogs.ts +99 -0
  213. package/src/structures/GuildAuditLogsEntry.ts +557 -0
  214. package/src/structures/GuildBan.ts +65 -0
  215. package/src/structures/GuildChannel.ts +515 -0
  216. package/src/structures/GuildEmoji.ts +159 -0
  217. package/src/structures/GuildInvite.ts +233 -0
  218. package/src/structures/GuildMember.ts +643 -0
  219. package/src/structures/GuildOnboarding.ts +73 -0
  220. package/src/structures/GuildOnboardingPrompt.ts +93 -0
  221. package/src/structures/GuildOnboardingPromptOption.ts +100 -0
  222. package/src/structures/GuildPreview.ts +218 -0
  223. package/src/structures/GuildPreviewEmoji.ts +28 -0
  224. package/src/structures/GuildScheduledEvent.ts +593 -0
  225. package/src/structures/GuildTemplate.ts +229 -0
  226. package/src/structures/Integration.ts +257 -0
  227. package/src/structures/IntegrationApplication.ts +84 -0
  228. package/src/structures/InteractionCallback.ts +86 -0
  229. package/src/structures/InteractionCallbackResource.ts +57 -0
  230. package/src/structures/InteractionCallbackResponse.ts +35 -0
  231. package/src/structures/InteractionCollector.ts +260 -0
  232. package/src/structures/InteractionWebhook.ts +65 -0
  233. package/src/structures/InviteGuild.ts +22 -0
  234. package/src/structures/LabelComponent.ts +51 -0
  235. package/src/structures/MediaChannel.ts +8 -0
  236. package/src/structures/MediaGalleryComponent.ts +31 -0
  237. package/src/structures/MediaGalleryItem.ts +54 -0
  238. package/src/structures/MentionableSelectMenuComponent.ts +8 -0
  239. package/src/structures/MentionableSelectMenuInteraction.ts +76 -0
  240. package/src/structures/Message.ts +1202 -0
  241. package/src/structures/MessageCollector.ts +155 -0
  242. package/src/structures/MessageComponentInteraction.ts +132 -0
  243. package/src/structures/MessageContextMenuCommandInteraction.ts +18 -0
  244. package/src/structures/MessageMentions.ts +327 -0
  245. package/src/structures/MessagePayload.ts +325 -0
  246. package/src/structures/MessageReaction.ts +219 -0
  247. package/src/structures/ModalComponentResolver.ts +237 -0
  248. package/src/structures/ModalSubmitInteraction.ts +260 -0
  249. package/src/structures/OAuth2Guild.ts +30 -0
  250. package/src/structures/PartialGroupDMChannel.ts +151 -0
  251. package/src/structures/PermissionOverwrites.ts +222 -0
  252. package/src/structures/Poll.ts +195 -0
  253. package/src/structures/PollAnswer.ts +100 -0
  254. package/src/structures/Presence.ts +448 -0
  255. package/src/structures/PrimaryEntryPointCommandInteraction.ts +8 -0
  256. package/src/structures/ReactionCollector.ts +245 -0
  257. package/src/structures/ReactionEmoji.ts +30 -0
  258. package/src/structures/Role.ts +543 -0
  259. package/src/structures/RoleSelectMenuComponent.ts +8 -0
  260. package/src/structures/RoleSelectMenuInteraction.ts +34 -0
  261. package/src/structures/SKU.ts +62 -0
  262. package/src/structures/SectionComponent.ts +44 -0
  263. package/src/structures/SeparatorComponent.ts +29 -0
  264. package/src/structures/SoundboardSound.ts +176 -0
  265. package/src/structures/StageChannel.ts +118 -0
  266. package/src/structures/StageInstance.ts +173 -0
  267. package/src/structures/Sticker.ts +300 -0
  268. package/src/structures/StickerPack.ts +111 -0
  269. package/src/structures/StringSelectMenuComponent.ts +18 -0
  270. package/src/structures/StringSelectMenuInteraction.ts +21 -0
  271. package/src/structures/Subscription.ts +138 -0
  272. package/src/structures/Team.ts +131 -0
  273. package/src/structures/TeamMember.ts +77 -0
  274. package/src/structures/TextChannel.ts +33 -0
  275. package/src/structures/TextDisplayComponent.ts +18 -0
  276. package/src/structures/TextInputComponent.ts +28 -0
  277. package/src/structures/ThreadChannel.ts +680 -0
  278. package/src/structures/ThreadMember.ts +125 -0
  279. package/src/structures/ThreadOnlyChannel.ts +276 -0
  280. package/src/structures/ThumbnailComponent.ts +51 -0
  281. package/src/structures/Typing.ts +81 -0
  282. package/src/structures/UnfurledMediaItem.ts +33 -0
  283. package/src/structures/User.ts +511 -0
  284. package/src/structures/UserContextMenuCommandInteraction.ts +28 -0
  285. package/src/structures/UserSelectMenuComponent.ts +8 -0
  286. package/src/structures/UserSelectMenuInteraction.ts +54 -0
  287. package/src/structures/VoiceChannel.ts +119 -0
  288. package/src/structures/VoiceChannelEffect.ts +92 -0
  289. package/src/structures/VoiceRegion.ts +52 -0
  290. package/src/structures/VoiceState.ts +346 -0
  291. package/src/structures/Webhook.ts +526 -0
  292. package/src/structures/WelcomeChannel.ts +67 -0
  293. package/src/structures/WelcomeScreen.ts +53 -0
  294. package/src/structures/Widget.ts +110 -0
  295. package/src/structures/WidgetMember.ts +124 -0
  296. package/src/structures/interfaces/Application.ts +179 -0
  297. package/src/structures/interfaces/Collector.ts +372 -0
  298. package/src/structures/interfaces/InteractionResponses.ts +384 -0
  299. package/src/structures/interfaces/TextBasedChannel.ts +430 -0
  300. package/src/util/APITypes.ts +690 -0
  301. package/src/util/ActivityFlagsBitField.ts +26 -0
  302. package/src/util/ApplicationFlagsBitField.ts +43 -0
  303. package/src/util/AttachmentFlagsBitField.ts +26 -0
  304. package/src/util/BitField.ts +178 -0
  305. package/src/util/ChannelFlagsBitField.ts +43 -0
  306. package/src/util/Channels.ts +165 -0
  307. package/src/util/Colors.ts +72 -0
  308. package/src/util/Components.ts +285 -0
  309. package/src/util/Constants.ts +251 -0
  310. package/src/util/DataResolver.ts +146 -0
  311. package/src/util/Enums.ts +10 -0
  312. package/src/util/Events.ts +178 -0
  313. package/src/util/GuildMemberFlagsBitField.ts +43 -0
  314. package/src/util/IntentsBitField.ts +35 -0
  315. package/src/util/InviteFlagsBitField.ts +26 -0
  316. package/src/util/Invites.ts +27 -0
  317. package/src/util/LimitedCollection.ts +73 -0
  318. package/src/util/MessageFlagsBitField.ts +43 -0
  319. package/src/util/Options.ts +215 -0
  320. package/src/util/Partials.ts +50 -0
  321. package/src/util/PermissionsBitField.ts +113 -0
  322. package/src/util/RoleFlagsBitField.ts +26 -0
  323. package/src/util/SKUFlagsBitField.ts +26 -0
  324. package/src/util/ShardEvents.ts +26 -0
  325. package/src/util/Status.ts +16 -0
  326. package/src/util/Sweepers.ts +532 -0
  327. package/src/util/Symbols.ts +1 -0
  328. package/src/util/SystemChannelFlagsBitField.ts +45 -0
  329. package/src/util/ThreadMemberFlagsBitField.ts +33 -0
  330. package/src/util/Transformers.ts +123 -0
  331. package/src/util/UserFlagsBitField.ts +33 -0
  332. package/src/util/Util.ts +519 -0
@@ -0,0 +1,619 @@
1
+ import { setTimeout, clearTimeout } from 'node:timers';
2
+ import { Collection } from '@ovencord/collection';
3
+ import { makeURLSearchParams } from '@ovencord/rest';
4
+ import { GatewayRateLimitError } from '@ovencord/util';
5
+ import { WebSocketShardEvents } from '@ovencord/ws';
6
+ import { DiscordSnowflake } from '@sapphire/snowflake';
7
+ import { Routes, GatewayOpcodes, GatewayDispatchEvents } from 'discord-api-types/v10';
8
+ import { DiscordjsError, DiscordjsTypeError, DiscordjsRangeError, ErrorCodes } from '../errors/index.js';
9
+ import { BaseGuildVoiceChannel } from '../structures/BaseGuildVoiceChannel.js';
10
+ import { GuildMember } from '../structures/GuildMember.js';
11
+ import { Role } from '../structures/Role.js';
12
+ import { resolveImage } from '../util/DataResolver.js';
13
+ import { Events } from '../util/Events.js';
14
+ import { GuildMemberFlagsBitField } from '../util/GuildMemberFlagsBitField.js';
15
+ import { Partials } from '../util/Partials.js';
16
+ import { CachedManager } from './CachedManager.js';
17
+
18
+ /**
19
+ * Manages API methods for GuildMembers and stores their cache.
20
+ *
21
+ * @extends {CachedManager}
22
+ */
23
+ export class GuildMemberManager extends CachedManager {
24
+ public guild: any;
25
+ constructor(guild, iterable) {
26
+ super(guild.client, GuildMember, iterable);
27
+
28
+ /**
29
+ * The guild this manager belongs to
30
+ *
31
+ * @type {Guild}
32
+ */
33
+ this.guild = guild;
34
+ }
35
+
36
+ /**
37
+ * The cache of this Manager
38
+ *
39
+ * @type {Collection<Snowflake, GuildMember>}
40
+ * @name GuildMemberManager#cache
41
+ */
42
+
43
+ _add(data, cache = true) {
44
+ return super._add(data, cache, { id: data.user.id, extras: [this.guild] });
45
+ }
46
+
47
+ /**
48
+ * Resolves a {@link UserResolvable} to a {@link GuildMember} object.
49
+ *
50
+ * @param {UserResolvable} member The user that is part of the guild
51
+ * @returns {?GuildMember}
52
+ */
53
+ resolve(member) {
54
+ const memberResolvable = super.resolve(member);
55
+ if (memberResolvable) return memberResolvable;
56
+ const userResolvable = this.client.users.resolveId(member);
57
+ if (userResolvable) return super.cache.get(userResolvable) ?? null;
58
+ return null;
59
+ }
60
+
61
+ /**
62
+ * Resolves a {@link UserResolvable} to a member id.
63
+ *
64
+ * @param {UserResolvable} 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
+ *
77
+ * @typedef {Object} AddGuildMemberOptions
78
+ * @property {string} accessToken An OAuth2 access token for the user with the {@link OAuth2Scopes.GuildsJoin}
79
+ * scope granted to the bot's application
80
+ * @property {string} [nick] The nickname to give to the member
81
+ * <info>This property requires the {@link PermissionFlagsBits.ManageNicknames} permission.</info>
82
+ * @property {Collection<Snowflake, Role>|RoleResolvable[]} [roles] The roles to add to the member
83
+ * <info>This property requires the {@link PermissionFlagsBits.ManageRoles} permission.</info>
84
+ * @property {boolean} [mute] Whether the member should be muted
85
+ * <info>This property requires the {@link PermissionFlagsBits.MuteMembers} permission.</info>
86
+ * @property {boolean} [deaf] Whether the member should be deafened
87
+ * <info>This property requires the {@link PermissionFlagsBits.MuteMembers} permission.</info>
88
+ * @property {boolean} [force] Whether to skip the cache check and request the API directly
89
+ * @property {boolean} [fetchWhenExisting=true] Whether to fetch the user if not cached and already a member
90
+ */
91
+
92
+ /**
93
+ * Adds a user to the guild using OAuth2.
94
+ * <info>This method requires the {@link PermissionFlagsBits.CreateInstantInvite} permission.
95
+ *
96
+ * @param {UserResolvable} user The user to add to the guild
97
+ * @param {AddGuildMemberOptions} options Options for adding the user to the guild
98
+ * @returns {Promise<?GuildMember>}
99
+ */
100
+ async add(user, options) {
101
+ const userId = this.client.users.resolveId(user);
102
+ if (!userId) throw new DiscordjsTypeError(ErrorCodes.InvalidType, 'user', 'UserResolvable');
103
+ if (!options.force) {
104
+ const cachedUser = this.cache.get(userId);
105
+ if (cachedUser) return cachedUser;
106
+ }
107
+
108
+ const resolvedOptions = {
109
+ access_token: options.accessToken,
110
+ nick: options.nick,
111
+ mute: options.mute,
112
+ deaf: options.deaf,
113
+ };
114
+ if (options.roles) {
115
+ if (!Array.isArray(options.roles) && !(options.roles instanceof Collection)) {
116
+ throw new DiscordjsTypeError(
117
+ ErrorCodes.InvalidType,
118
+ 'options.roles',
119
+ 'Array or Collection of Roles or Snowflakes',
120
+ true,
121
+ );
122
+ }
123
+
124
+ const resolvedRoles = [];
125
+ for (const role of options.roles.values()) {
126
+ const resolvedRole = this.guild.roles.resolveId(role);
127
+ if (!resolvedRole) {
128
+ throw new DiscordjsTypeError(ErrorCodes.InvalidElement, 'Array or Collection', 'options.roles', role);
129
+ }
130
+
131
+ resolvedRoles.push(resolvedRole);
132
+ }
133
+
134
+ resolvedOptions.roles = resolvedRoles;
135
+ }
136
+
137
+ const data = await this.client.rest.put(Routes.guildMember(this.guild.id, userId), { body: resolvedOptions });
138
+
139
+ // Data is an empty array buffer if the member is already part of the guild.
140
+ return data instanceof ArrayBuffer
141
+ ? options.fetchWhenExisting === false
142
+ ? null
143
+ : this.fetch(userId)
144
+ : this._add(data);
145
+ }
146
+
147
+ /**
148
+ * The client user as a GuildMember of this guild
149
+ *
150
+ * @type {?GuildMember}
151
+ * @readonly
152
+ */
153
+ get me() {
154
+ return (
155
+ this.cache.get(this.client.user.id) ??
156
+ (this.client.options.partials.includes(Partials.GuildMember)
157
+ ? this._add({ user: { id: this.client.user.id } }, true)
158
+ : null)
159
+ );
160
+ }
161
+
162
+ /**
163
+ * Options used to fetch a single member from a guild.
164
+ *
165
+ * @typedef {BaseFetchOptions} FetchMemberOptions
166
+ * @property {UserResolvable} user The user to fetch
167
+ */
168
+
169
+ /**
170
+ * Options used to fetch multiple members from a guild.
171
+ *
172
+ * @typedef {Object} FetchMembersOptions
173
+ * @property {UserResolvable|UserResolvable[]} [user] The user(s) to fetch
174
+ * @property {?string} [query] Limit fetch to members with similar usernames
175
+ * @property {number} [limit=0] Maximum number of members to request
176
+ * @property {boolean} [withPresences=false] Whether to include the presences
177
+ * @property {number} [time=120e3] Timeout for receipt of members
178
+ * @property {?string} [nonce] Nonce for this request (32 characters max - default to base 16 now timestamp)
179
+ */
180
+
181
+ /**
182
+ * Fetches member(s) from a guild.
183
+ *
184
+ * @param {UserResolvable|FetchMemberOptions|FetchMembersOptions} [options] Options for fetching member(s).
185
+ * Omitting the parameter or providing `undefined` will fetch all members.
186
+ * @returns {Promise<GuildMember|Collection<Snowflake, GuildMember>>}
187
+ * @example
188
+ * // Fetch all members from a guild
189
+ * guild.members.fetch()
190
+ * .then(console.log)
191
+ * .catch(console.error);
192
+ * @example
193
+ * // Fetch a single member
194
+ * guild.members.fetch('66564597481480192')
195
+ * .then(console.log)
196
+ * .catch(console.error);
197
+ * @example
198
+ * // Fetch a single member without checking cache
199
+ * guild.members.fetch({ user, force: true })
200
+ * .then(console.log)
201
+ * .catch(console.error)
202
+ * @example
203
+ * // Fetch a single member without caching
204
+ * guild.members.fetch({ user, cache: false })
205
+ * .then(console.log)
206
+ * .catch(console.error);
207
+ * @example
208
+ * // Fetch by an array of users including their presences
209
+ * guild.members.fetch({ user: ['66564597481480192', '191615925336670208'], withPresences: true })
210
+ * .then(console.log)
211
+ * .catch(console.error);
212
+ * @example
213
+ * // Fetch by query
214
+ * guild.members.fetch({ query: 'hydra', limit: 1 })
215
+ * .then(console.log)
216
+ * .catch(console.error);
217
+ */
218
+ async fetch(options) {
219
+ if (!options) return this._fetchMany();
220
+ const { user: users, limit, withPresences, cache, force } = options;
221
+ const resolvedUser = this.client.users.resolveId(users ?? options);
222
+ if (resolvedUser && !limit && !withPresences) return this._fetchSingle({ user: resolvedUser, cache, force });
223
+ const resolvedUsers = users?.map?.(user => this.client.users.resolveId(user)) ?? resolvedUser ?? undefined;
224
+ return this._fetchMany({ ...options, users: resolvedUsers });
225
+ }
226
+
227
+ async _fetchSingle({ user, cache, force = false }) {
228
+ if (!force) {
229
+ const existing = this.cache.get(user);
230
+ if (existing && !existing.partial) return existing;
231
+ }
232
+
233
+ const data = await this.client.rest.get(Routes.guildMember(this.guild.id, user));
234
+ return this._add(data, cache);
235
+ }
236
+
237
+ async _fetchMany({
238
+ limit = 0,
239
+ withPresences: presences,
240
+ users,
241
+ query: initialQuery,
242
+ time = 120e3,
243
+ nonce = DiscordSnowflake.generate().toString(),
244
+ } = {}) {
245
+ if (nonce.length > 32) throw new DiscordjsRangeError(ErrorCodes.MemberFetchNonceLength);
246
+
247
+ const query = initialQuery ?? (users ? undefined : '');
248
+
249
+ return new Promise((resolve, reject) => {
250
+ const fetchedMembers = new Collection();
251
+ let index = 0;
252
+
253
+ const cleanup = () => {
254
+ /* eslint-disable no-use-before-define */
255
+ clearTimeout(timeout);
256
+
257
+ this.client.ws.removeListener(WebSocketShardEvents.Dispatch, rateLimitHandler);
258
+ this.client.removeListener(Events.GuildMembersChunk, handler);
259
+ this.client.decrementMaxListeners();
260
+ /* eslint-enable no-use-before-define */
261
+ };
262
+
263
+ const timeout = setTimeout(() => {
264
+ cleanup();
265
+ reject(new DiscordjsError(ErrorCodes.GuildMembersTimeout));
266
+ }, time).unref();
267
+
268
+ const handler = (members, _, chunk) => {
269
+ if (chunk.nonce !== nonce) return;
270
+
271
+ timeout.refresh();
272
+ index++;
273
+ for (const member of members.values()) {
274
+ fetchedMembers.set(member.id, member);
275
+ }
276
+
277
+ if (members.size < 1_000 || (limit && fetchedMembers.size >= limit) || index === chunk.count) {
278
+ cleanup();
279
+ resolve(users && !Array.isArray(users) && fetchedMembers.size ? fetchedMembers.first() : fetchedMembers);
280
+ }
281
+ };
282
+
283
+ const requestData = {
284
+ guild_id: this.guild.id,
285
+ presences,
286
+ user_ids: users,
287
+ query,
288
+ nonce,
289
+ limit,
290
+ };
291
+
292
+ const rateLimitHandler = payload => {
293
+ if (payload.t === GatewayDispatchEvents.RateLimited && payload.d.meta.nonce === nonce) {
294
+ cleanup();
295
+ reject(new GatewayRateLimitError(payload.d, requestData));
296
+ }
297
+ };
298
+
299
+ this.client.ws.on(WebSocketShardEvents.Dispatch, rateLimitHandler);
300
+
301
+ this.client.incrementMaxListeners();
302
+ this.client.on(Events.GuildMembersChunk, handler);
303
+
304
+ this.guild.client.ws.send(this.guild.shardId, {
305
+ op: GatewayOpcodes.RequestGuildMembers,
306
+ // eslint-disable-next-line id-length
307
+ d: requestData,
308
+ });
309
+ });
310
+ }
311
+
312
+ /**
313
+ * Fetches the client user as a GuildMember of the guild.
314
+ *
315
+ * @param {BaseFetchOptions} [options] The options for fetching the member
316
+ * @returns {Promise<GuildMember>}
317
+ */
318
+ async fetchMe(options) {
319
+ return this.fetch({ ...options, user: this.client.user.id });
320
+ }
321
+
322
+ /**
323
+ * Options used for searching guild members.
324
+ *
325
+ * @typedef {Object} GuildSearchMembersOptions
326
+ * @property {string} query Filter members whose username or nickname start with this query
327
+ * @property {number} [limit] Maximum number of members to search
328
+ * @property {boolean} [cache=true] Whether or not to cache the fetched member(s)
329
+ */
330
+
331
+ /**
332
+ * Searches for members in the guild based on a query.
333
+ *
334
+ * @param {GuildSearchMembersOptions} options Options for searching members
335
+ * @returns {Promise<Collection<Snowflake, GuildMember>>}
336
+ */
337
+ async search({ query, limit, cache = true } = {}) {
338
+ const data = await this.client.rest.get(Routes.guildMembersSearch(this.guild.id), {
339
+ query: makeURLSearchParams({ query, limit }),
340
+ });
341
+ return data.reduce((col, member) => col.set(member.user.id, this._add(member, cache)), new Collection());
342
+ }
343
+
344
+ /**
345
+ * Options used for listing guild members.
346
+ *
347
+ * @typedef {Object} GuildListMembersOptions
348
+ * @property {Snowflake} [after] Limit fetching members to those with an id greater than the supplied id
349
+ * @property {number} [limit] Maximum number of members to list
350
+ * @property {boolean} [cache=true] Whether or not to cache the fetched member(s)
351
+ */
352
+
353
+ /**
354
+ * Lists up to 1000 members of the guild.
355
+ *
356
+ * @param {GuildListMembersOptions} [options] Options for listing members
357
+ * @returns {Promise<Collection<Snowflake, GuildMember>>}
358
+ */
359
+ async list({ after, limit, cache = true } = {}) {
360
+ const query = makeURLSearchParams({ limit, after });
361
+ const data = await this.client.rest.get(Routes.guildMembers(this.guild.id), { query });
362
+ return data.reduce((col, member) => col.set(member.user.id, this._add(member, cache)), new Collection());
363
+ }
364
+
365
+ /**
366
+ * The data for editing a guild member.
367
+ *
368
+ * @typedef {Object} GuildMemberEditOptions
369
+ * @property {?string} [nick] The nickname to set for the member
370
+ * @property {Collection<Snowflake, Role>|RoleResolvable[]} [roles] The roles or role ids to apply
371
+ * @property {boolean} [mute] Whether or not the member should be muted
372
+ * @property {boolean} [deaf] Whether or not the member should be deafened
373
+ * @property {?GuildVoiceChannelResolvable} [channel] Channel to move the member to
374
+ * (if they are connected to voice), or `null` if you want to disconnect them from voice
375
+ * @property {?DateResolvable} [communicationDisabledUntil] The date or timestamp
376
+ * for the member's communication to be disabled until. Provide `null` to enable communication again.
377
+ * @property {GuildMemberFlagsResolvable} [flags] The flags to set for the member
378
+ * @property {string} [reason] Reason for editing this user
379
+ */
380
+
381
+ /**
382
+ * Edits a member of a guild.
383
+ *
384
+ * @param {UserResolvable} user The member to edit
385
+ * @param {GuildMemberEditOptions} options The options to provide
386
+ * @returns {Promise<GuildMember>}
387
+ */
388
+ async edit(user, { reason, ...options }) {
389
+ const id = this.client.users.resolveId(user);
390
+ if (!id) throw new DiscordjsTypeError(ErrorCodes.InvalidType, 'user', 'UserResolvable');
391
+
392
+ if (options.channel) {
393
+ options.channel = this.guild.channels.resolve(options.channel);
394
+ if (!(options.channel instanceof BaseGuildVoiceChannel)) {
395
+ throw new DiscordjsError(ErrorCodes.GuildVoiceChannelResolve);
396
+ }
397
+
398
+ options.channel_id = options.channel.id;
399
+ options.channel = undefined;
400
+ } else if (options.channel === null) {
401
+ options.channel_id = null;
402
+ options.channel = undefined;
403
+ }
404
+
405
+ options.roles &&= options.roles.map(role => (role instanceof Role ? role.id : role));
406
+
407
+ if (options.communicationDisabledUntil !== undefined) {
408
+ options.communication_disabled_until =
409
+ // eslint-disable-next-line eqeqeq
410
+ options.communicationDisabledUntil == null
411
+ ? options.communicationDisabledUntil
412
+ : new Date(options.communicationDisabledUntil).toISOString();
413
+ }
414
+
415
+ if (options.flags !== undefined) {
416
+ options.flags = GuildMemberFlagsBitField.resolve(options.flags);
417
+ }
418
+
419
+ const data = await this.client.rest.patch(Routes.guildMember(this.guild.id, id), { body: options, reason });
420
+ const clone = this.cache.get(id)?._clone();
421
+ clone?._patch(data);
422
+ return clone ?? this._add(data, false);
423
+ }
424
+
425
+ /**
426
+ * The data for editing the current application's guild member.
427
+ *
428
+ * @typedef {Object} GuildMemberEditMeOptions
429
+ * @property {?string} [nick] The nickname to set
430
+ * @property {?(BufferResolvable|Base64Resolvable)} [banner] The banner to set
431
+ * @property {?(BufferResolvable|Base64Resolvable)} [avatar] The avatar to set
432
+ * @property {?string} [bio] The bio to set
433
+ * @property {string} [reason] The reason to use
434
+ */
435
+
436
+ /**
437
+ * Edits the current application's guild member in a guild.
438
+ *
439
+ * @param {GuildMemberEditMeOptions} options The options to provide
440
+ * @returns {Promise<GuildMember>}
441
+ */
442
+ async editMe({ reason, ...options }) {
443
+ const data = await this.client.rest.patch(Routes.guildMember(this.guild.id, '@me'), {
444
+ body: {
445
+ ...options,
446
+ banner: options.banner && (await resolveImage(options.banner)),
447
+ avatar: options.avatar && (await resolveImage(options.avatar)),
448
+ },
449
+ reason,
450
+ });
451
+
452
+ const clone = this.me?._clone();
453
+ clone?._patch(data);
454
+ return clone ?? this._add(data, false);
455
+ }
456
+
457
+ /**
458
+ * Options used for pruning guild members.
459
+ * <info>It's recommended to set {@link GuildPruneMembersOptions#count options.count}
460
+ * to `false` for large guilds.</info>
461
+ *
462
+ * @typedef {Object} GuildPruneMembersOptions
463
+ * @property {number} [days] Number of days of inactivity required to kick
464
+ * @property {boolean} [dry=false] Get the number of users that will be kicked, without actually kicking them
465
+ * @property {boolean} [count] Whether or not to return the number of users that have been kicked.
466
+ * @property {RoleResolvable[]} [roles] Array of roles to bypass the "...and no roles" constraint when pruning
467
+ * @property {string} [reason] Reason for this prune
468
+ */
469
+
470
+ /**
471
+ * Prunes members from the guild based on how long they have been inactive.
472
+ *
473
+ * @param {GuildPruneMembersOptions} [options] Options for pruning
474
+ * @returns {Promise<?number>} The number of members that were/will be kicked
475
+ * @example
476
+ * // See how many members will be pruned
477
+ * guild.members.prune({ dry: true })
478
+ * .then(pruned => console.log(`This will prune ${pruned} people!`))
479
+ * .catch(console.error);
480
+ * @example
481
+ * // Actually prune the members
482
+ * guild.members.prune({ days: 1, reason: 'too many people!' })
483
+ * .then(pruned => console.log(`I just pruned ${pruned} people!`))
484
+ * .catch(console.error);
485
+ * @example
486
+ * // Include members with a specified role
487
+ * guild.members.prune({ days: 7, roles: ['657259391652855808'] })
488
+ * .then(pruned => console.log(`I just pruned ${pruned} people!`))
489
+ * .catch(console.error);
490
+ */
491
+ async prune({ days, dry = false, count: compute_prune_count, roles = [], reason } = {}) {
492
+ if (typeof days !== 'number') throw new DiscordjsTypeError(ErrorCodes.PruneDaysType);
493
+
494
+ const query = { days };
495
+ const resolvedRoles = [];
496
+
497
+ for (const role of roles) {
498
+ const resolvedRole = this.guild.roles.resolveId(role);
499
+ if (!resolvedRole) {
500
+ throw new DiscordjsTypeError(ErrorCodes.InvalidElement, 'Array', 'options.roles', role);
501
+ }
502
+
503
+ resolvedRoles.push(resolvedRole);
504
+ }
505
+
506
+ if (resolvedRoles.length) {
507
+ query.include_roles = dry ? resolvedRoles.join(',') : resolvedRoles;
508
+ }
509
+
510
+ const endpoint = Routes.guildPrune(this.guild.id);
511
+
512
+ const { pruned } = await (dry
513
+ ? this.client.rest.get(endpoint, { query: makeURLSearchParams(query), reason })
514
+ : this.client.rest.post(endpoint, { body: { ...query, compute_prune_count }, reason }));
515
+
516
+ return pruned;
517
+ }
518
+
519
+ /**
520
+ * Kicks a user from the guild.
521
+ * <info>The user must be a member of the guild</info>
522
+ *
523
+ * @param {UserResolvable} user The member to kick
524
+ * @param {string} [reason] Reason for kicking
525
+ * @returns {Promise<void>}
526
+ * @example
527
+ * // Kick a user by id (or with a user/guild member object)
528
+ * await guild.members.kick('84484653687267328');
529
+ */
530
+ async kick(user, reason) {
531
+ const id = this.client.users.resolveId(user);
532
+ if (!id) throw new DiscordjsTypeError(ErrorCodes.InvalidType, 'user', 'UserResolvable');
533
+
534
+ await this.client.rest.delete(Routes.guildMember(this.guild.id, id), { reason });
535
+ }
536
+
537
+ /**
538
+ * Bans a user from the guild. Internally calls the {@link GuildBanManager#create} method.
539
+ *
540
+ * @param {UserResolvable} user The user to ban
541
+ * @param {BanOptions} [options] Options for the ban
542
+ * @returns {Promise<void>}
543
+ * @example
544
+ * // Ban a user by id (or with a user/guild member object)
545
+ * await guild.members.ban('84484653687267328');
546
+ */
547
+ async ban(user, options) {
548
+ await this.guild.bans.create(user, options);
549
+ }
550
+
551
+ /**
552
+ * Unbans a user from the guild. Internally calls the {@link GuildBanManager#remove} method.
553
+ *
554
+ * @param {UserResolvable} user The user to unban
555
+ * @param {string} [reason] Reason for unbanning user
556
+ * @returns {Promise<void>}
557
+ * @example
558
+ * // Unban a user by id (or with a user/guild member object)
559
+ * await guild.members.unban('84484653687267328');
560
+ */
561
+ async unban(user, reason) {
562
+ await this.guild.bans.remove(user, reason);
563
+ }
564
+
565
+ /**
566
+ * Bulk ban users from a guild, and optionally delete previous messages sent by them.
567
+ *
568
+ * @param {Collection<Snowflake, UserResolvable>|UserResolvable[]} users The users to ban
569
+ * @param {BanOptions} [options] The options for bulk banning users
570
+ * @returns {Promise<BulkBanResult>} Returns an object with `bannedUsers` key containing the IDs of the banned users
571
+ * and the key `failedUsers` with the IDs that could not be banned or were already banned.
572
+ * Internally calls the GuildBanManager#bulkCreate method.
573
+ * @example
574
+ * // Bulk ban users by ids (or with user/guild member objects) and delete all their messages from the past 7 days
575
+ * guild.members.bulkBan(['84484653687267328'], { deleteMessageSeconds: 7 * 24 * 60 * 60 })
576
+ * .then(result => {
577
+ * console.log(`Banned ${result.bannedUsers.length} users, failed to ban ${result.failedUsers.length} users.`)
578
+ * })
579
+ * .catch(console.error);
580
+ */
581
+ async bulkBan(users, options = {}) {
582
+ return this.guild.bans.bulkCreate(users, options);
583
+ }
584
+
585
+ /**
586
+ * Options used for adding or removing a role from a member.
587
+ *
588
+ * @typedef {Object} AddOrRemoveGuildMemberRoleOptions
589
+ * @property {UserResolvable} user The user to add/remove the role from
590
+ * @property {RoleResolvable} role The role to add/remove
591
+ * @property {string} [reason] Reason for adding/removing the role
592
+ */
593
+
594
+ /**
595
+ * Adds a role to a member.
596
+ *
597
+ * @param {AddOrRemoveGuildMemberRoleOptions} options Options for adding the role
598
+ * @returns {Promise<void>}
599
+ */
600
+ async addRole(options) {
601
+ const { user, role, reason } = options;
602
+ const userId = this.resolveId(user);
603
+ const roleId = this.guild.roles.resolveId(role);
604
+ await this.client.rest.put(Routes.guildMemberRole(this.guild.id, userId, roleId), { reason });
605
+ }
606
+
607
+ /**
608
+ * Removes a role from a member.
609
+ *
610
+ * @param {AddOrRemoveGuildMemberRoleOptions} options Options for removing the role
611
+ * @returns {Promise<void>}
612
+ */
613
+ async removeRole(options) {
614
+ const { user, role, reason } = options;
615
+ const userId = this.resolveId(user);
616
+ const roleId = this.guild.roles.resolveId(role);
617
+ await this.client.rest.delete(Routes.guildMemberRole(this.guild.id, userId, roleId), { reason });
618
+ }
619
+ }