@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,204 @@
1
+ 'use strict';
2
+
3
+ const { Collection } = require('@discordjs/collection');
4
+ const { Routes } = require('discord-api-types/v10');
5
+ const DataManager = require('./DataManager');
6
+ const { DiscordjsTypeError, ErrorCodes } = require('../errors');
7
+ const { Role } = require('../structures/Role');
8
+
9
+ /**
10
+ * Manages API methods for roles of a GuildMember and stores their cache.
11
+ * @extends {DataManager}
12
+ */
13
+ class GuildMemberRoleManager extends DataManager {
14
+ constructor(member) {
15
+ super(member.client, Role);
16
+
17
+ /**
18
+ * The GuildMember this manager belongs to
19
+ * @type {GuildMember}
20
+ */
21
+ this.member = member;
22
+
23
+ /**
24
+ * The Guild this manager belongs to
25
+ * @type {Guild}
26
+ */
27
+ this.guild = member.guild;
28
+ }
29
+
30
+ /**
31
+ * The roles of this member
32
+ * @type {Collection<Snowflake, Role>}
33
+ * @readonly
34
+ */
35
+ get cache() {
36
+ const everyone = this.guild.roles.everyone;
37
+ return this.guild.roles.cache.filter(role => this.member._roles.includes(role.id)).set(everyone.id, everyone);
38
+ }
39
+
40
+ /**
41
+ * The role of the member used to hoist them in a separate category in the users list
42
+ * @type {?Role}
43
+ * @readonly
44
+ */
45
+ get hoist() {
46
+ const hoistedRoles = this.cache.filter(role => role.hoist);
47
+ if (!hoistedRoles.size) return null;
48
+ return hoistedRoles.reduce((prev, role) => (role.comparePositionTo(prev) > 0 ? role : prev));
49
+ }
50
+
51
+ /**
52
+ * The role of the member used to set their role icon
53
+ * @type {?Role}
54
+ * @readonly
55
+ */
56
+ get icon() {
57
+ const iconRoles = this.cache.filter(role => role.icon || role.unicodeEmoji);
58
+ if (!iconRoles.size) return null;
59
+ return iconRoles.reduce((prev, role) => (role.comparePositionTo(prev) > 0 ? role : prev));
60
+ }
61
+
62
+ /**
63
+ * The role of the member used to set their color
64
+ * @type {?Role}
65
+ * @readonly
66
+ */
67
+ get color() {
68
+ const coloredRoles = this.cache.filter(role => role.color);
69
+ if (!coloredRoles.size) return null;
70
+ return coloredRoles.reduce((prev, role) => (role.comparePositionTo(prev) > 0 ? role : prev));
71
+ }
72
+
73
+ /**
74
+ * The role of the member with the highest position
75
+ * @type {Role}
76
+ * @readonly
77
+ */
78
+ get highest() {
79
+ return this.cache.reduce((prev, role) => (role.comparePositionTo(prev) > 0 ? role : prev), this.cache.first());
80
+ }
81
+
82
+ /**
83
+ * The premium subscriber role of the guild, if present on the member
84
+ * @type {?Role}
85
+ * @readonly
86
+ */
87
+ get premiumSubscriberRole() {
88
+ return this.cache.find(role => role.tags?.premiumSubscriberRole) ?? null;
89
+ }
90
+
91
+ /**
92
+ * The managed role this member created when joining the guild, if any
93
+ * <info>Only ever available on bots</info>
94
+ * @type {?Role}
95
+ * @readonly
96
+ */
97
+ get botRole() {
98
+ if (!this.member.user.bot) return null;
99
+ return this.cache.find(role => role.tags?.botId === this.member.user.id) ?? null;
100
+ }
101
+
102
+ /**
103
+ * Adds a role (or multiple roles) to the member.
104
+ * @param {RoleResolvable|RoleResolvable[]|Collection<Snowflake, Role>} roleOrRoles The role or roles to add
105
+ * @param {string} [reason] Reason for adding the role(s)
106
+ * @returns {Promise<GuildMember>}
107
+ */
108
+ async add(roleOrRoles, reason) {
109
+ if (roleOrRoles instanceof Collection || Array.isArray(roleOrRoles)) {
110
+ const resolvedRoles = [];
111
+ for (const role of roleOrRoles.values()) {
112
+ const resolvedRole = this.guild.roles.resolveId(role);
113
+ if (!resolvedRole) {
114
+ throw new DiscordjsTypeError(ErrorCodes.InvalidElement, 'Array or Collection', 'roles', role);
115
+ }
116
+ resolvedRoles.push(resolvedRole);
117
+ }
118
+
119
+ const newRoles = [...new Set(resolvedRoles.concat(...this.cache.keys()))];
120
+ return this.set(newRoles, reason);
121
+ } else {
122
+ roleOrRoles = this.guild.roles.resolveId(roleOrRoles);
123
+ if (roleOrRoles === null) {
124
+ throw new DiscordjsTypeError(
125
+ ErrorCodes.InvalidType,
126
+ 'roles',
127
+ 'Role, Snowflake or Array or Collection of Roles or Snowflakes',
128
+ );
129
+ }
130
+
131
+ await this.client.rest.put(Routes.guildMemberRole(this.guild.id, this.member.id, roleOrRoles), { reason });
132
+
133
+ const clone = this.member._clone();
134
+ clone._roles = [...this.cache.keys(), roleOrRoles];
135
+ return clone;
136
+ }
137
+ }
138
+
139
+ /**
140
+ * Removes a role (or multiple roles) from the member.
141
+ * @param {RoleResolvable|RoleResolvable[]|Collection<Snowflake, Role>} roleOrRoles The role or roles to remove
142
+ * @param {string} [reason] Reason for removing the role(s)
143
+ * @returns {Promise<GuildMember>}
144
+ */
145
+ async remove(roleOrRoles, reason) {
146
+ if (roleOrRoles instanceof Collection || Array.isArray(roleOrRoles)) {
147
+ const resolvedRoles = [];
148
+ for (const role of roleOrRoles.values()) {
149
+ const resolvedRole = this.guild.roles.resolveId(role);
150
+ if (!resolvedRole) {
151
+ throw new DiscordjsTypeError(ErrorCodes.InvalidElement, 'Array or Collection', 'roles', role);
152
+ }
153
+ resolvedRoles.push(resolvedRole);
154
+ }
155
+
156
+ const newRoles = this.cache.filter(role => !resolvedRoles.includes(role.id));
157
+ return this.set(newRoles, reason);
158
+ } else {
159
+ roleOrRoles = this.guild.roles.resolveId(roleOrRoles);
160
+ if (roleOrRoles === null) {
161
+ throw new DiscordjsTypeError(
162
+ ErrorCodes.InvalidType,
163
+ 'roles',
164
+ 'Role, Snowflake or Array or Collection of Roles or Snowflakes',
165
+ );
166
+ }
167
+
168
+ await this.client.rest.delete(Routes.guildMemberRole(this.guild.id, this.member.id, roleOrRoles), { reason });
169
+
170
+ const clone = this.member._clone();
171
+ const newRoles = this.cache.filter(role => role.id !== roleOrRoles);
172
+ clone._roles = [...newRoles.keys()];
173
+ return clone;
174
+ }
175
+ }
176
+
177
+ /**
178
+ * Sets the roles applied to the member.
179
+ * @param {Collection<Snowflake, Role>|RoleResolvable[]} roles The roles or role ids to apply
180
+ * @param {string} [reason] Reason for applying the roles
181
+ * @returns {Promise<GuildMember>}
182
+ * @example
183
+ * // Set the member's roles to a single role
184
+ * guildMember.roles.set(['391156570408615936'])
185
+ * .then(console.log)
186
+ * .catch(console.error);
187
+ * @example
188
+ * // Remove all the roles from a member
189
+ * guildMember.roles.set([])
190
+ * .then(member => console.log(`Member roles is now of ${member.roles.cache.size} size`))
191
+ * .catch(console.error);
192
+ */
193
+ set(roles, reason) {
194
+ return this.member.edit({ roles, reason });
195
+ }
196
+
197
+ clone() {
198
+ const clone = new this.constructor(this.member);
199
+ clone.member._roles = [...this.cache.keys()];
200
+ return clone;
201
+ }
202
+ }
203
+
204
+ module.exports = GuildMemberRoleManager;
@@ -0,0 +1,297 @@
1
+ 'use strict';
2
+
3
+ const { Collection } = require('@discordjs/collection');
4
+ const { makeURLSearchParams } = require('@discordjs/rest');
5
+ const { GuildScheduledEventEntityType, Routes } = require('discord-api-types/v10');
6
+ const CachedManager = require('./CachedManager');
7
+ const { DiscordjsTypeError, DiscordjsError, ErrorCodes } = require('../errors');
8
+ const { GuildScheduledEvent } = require('../structures/GuildScheduledEvent');
9
+ const DataResolver = require('../util/DataResolver');
10
+
11
+ /**
12
+ * Manages API methods for GuildScheduledEvents and stores their cache.
13
+ * @extends {CachedManager}
14
+ */
15
+ class GuildScheduledEventManager extends CachedManager {
16
+ constructor(guild, iterable) {
17
+ super(guild.client, GuildScheduledEvent, iterable);
18
+
19
+ /**
20
+ * The guild this manager belongs to
21
+ * @type {Guild}
22
+ */
23
+ this.guild = guild;
24
+ }
25
+
26
+ /**
27
+ * The cache of this manager
28
+ * @type {Collection<Snowflake, GuildScheduledEvent>}
29
+ * @name GuildScheduledEventManager#cache
30
+ */
31
+
32
+ /**
33
+ * Data that resolves to give a GuildScheduledEvent object. This can be:
34
+ * * A Snowflake
35
+ * * A GuildScheduledEvent object
36
+ * @typedef {Snowflake|GuildScheduledEvent} GuildScheduledEventResolvable
37
+ */
38
+
39
+ /**
40
+ * Options used to create a guild scheduled event.
41
+ * @typedef {Object} GuildScheduledEventCreateOptions
42
+ * @property {string} name The name of the guild scheduled event
43
+ * @property {DateResolvable} scheduledStartTime The time to schedule the event at
44
+ * @property {DateResolvable} [scheduledEndTime] The time to end the event at
45
+ * <warn>This is required if `entityType` is {@link GuildScheduledEventEntityType.External}</warn>
46
+ * @property {GuildScheduledEventPrivacyLevel} privacyLevel The privacy level of the guild scheduled event
47
+ * @property {GuildScheduledEventEntityType} entityType The scheduled entity type of the event
48
+ * @property {string} [description] The description of the guild scheduled event
49
+ * @property {GuildVoiceChannelResolvable} [channel] The channel of the guild scheduled event
50
+ * <warn>This is required if `entityType` is {@link GuildScheduledEventEntityType.StageInstance} or
51
+ * {@link GuildScheduledEventEntityType.Voice}</warn>
52
+ * @property {GuildScheduledEventEntityMetadataOptions} [entityMetadata] The entity metadata of the
53
+ * guild scheduled event
54
+ * <warn>This is required if `entityType` is {@link GuildScheduledEventEntityType.External}</warn>
55
+ * @property {?(BufferResolvable|Base64Resolvable)} [image] The cover image of the guild scheduled event
56
+ * @property {string} [reason] The reason for creating the guild scheduled event
57
+ */
58
+
59
+ /**
60
+ * Options used to set entity metadata of a guild scheduled event.
61
+ * @typedef {Object} GuildScheduledEventEntityMetadataOptions
62
+ * @property {string} [location] The location of the guild scheduled event
63
+ * <warn>This is required if `entityType` is {@link GuildScheduledEventEntityType.External}</warn>
64
+ */
65
+
66
+ /**
67
+ * Creates a new guild scheduled event.
68
+ * @param {GuildScheduledEventCreateOptions} options Options for creating the guild scheduled event
69
+ * @returns {Promise<GuildScheduledEvent>}
70
+ */
71
+ async create(options) {
72
+ if (typeof options !== 'object') throw new DiscordjsTypeError(ErrorCodes.InvalidType, 'options', 'object', true);
73
+ let {
74
+ privacyLevel,
75
+ entityType,
76
+ channel,
77
+ name,
78
+ scheduledStartTime,
79
+ description,
80
+ scheduledEndTime,
81
+ entityMetadata,
82
+ reason,
83
+ image,
84
+ } = options;
85
+
86
+ let entity_metadata, channel_id;
87
+ if (entityType === GuildScheduledEventEntityType.External) {
88
+ channel_id = channel === undefined ? channel : null;
89
+ entity_metadata = { location: entityMetadata?.location };
90
+ } else {
91
+ channel_id = this.guild.channels.resolveId(channel);
92
+ if (!channel_id) throw new DiscordjsError(ErrorCodes.GuildVoiceChannelResolve);
93
+ entity_metadata = entityMetadata === undefined ? entityMetadata : null;
94
+ }
95
+
96
+ const data = await this.client.rest.post(Routes.guildScheduledEvents(this.guild.id), {
97
+ body: {
98
+ channel_id,
99
+ name,
100
+ privacy_level: privacyLevel,
101
+ scheduled_start_time: new Date(scheduledStartTime).toISOString(),
102
+ scheduled_end_time: scheduledEndTime ? new Date(scheduledEndTime).toISOString() : scheduledEndTime,
103
+ description,
104
+ entity_type: entityType,
105
+ entity_metadata,
106
+ image: image && (await DataResolver.resolveImage(image)),
107
+ },
108
+ reason,
109
+ });
110
+
111
+ return this._add(data);
112
+ }
113
+
114
+ /**
115
+ * Options used to fetch a single guild scheduled event from a guild.
116
+ * @typedef {BaseFetchOptions} FetchGuildScheduledEventOptions
117
+ * @property {GuildScheduledEventResolvable} guildScheduledEvent The guild scheduled event to fetch
118
+ * @property {boolean} [withUserCount=true] Whether to fetch the number of users subscribed to the scheduled event
119
+ */
120
+
121
+ /**
122
+ * Options used to fetch multiple guild scheduled events from a guild.
123
+ * @typedef {Object} FetchGuildScheduledEventsOptions
124
+ * @property {boolean} [cache] Whether or not to cache the fetched guild scheduled events
125
+ * @property {boolean} [withUserCount=true] Whether to fetch the number of users subscribed to each scheduled event
126
+ * should be returned
127
+ */
128
+
129
+ /**
130
+ * Obtains one or more guild scheduled events from Discord, or the guild cache if it's already available.
131
+ * @param {GuildScheduledEventResolvable|FetchGuildScheduledEventOptions|FetchGuildScheduledEventsOptions} [options]
132
+ * The id of the guild scheduled event or options
133
+ * @returns {Promise<GuildScheduledEvent|Collection<Snowflake, GuildScheduledEvent>>}
134
+ */
135
+ async fetch(options = {}) {
136
+ const id = this.resolveId(options.guildScheduledEvent ?? options);
137
+
138
+ if (id) {
139
+ if (!options.force) {
140
+ const existing = this.cache.get(id);
141
+ if (existing) return existing;
142
+ }
143
+
144
+ const data = await this.client.rest.get(Routes.guildScheduledEvent(this.guild.id, id), {
145
+ query: makeURLSearchParams({ with_user_count: options.withUserCount ?? true }),
146
+ });
147
+ return this._add(data, options.cache);
148
+ }
149
+
150
+ const data = await this.client.rest.get(Routes.guildScheduledEvents(this.guild.id), {
151
+ query: makeURLSearchParams({ with_user_count: options.withUserCount ?? true }),
152
+ });
153
+
154
+ return data.reduce(
155
+ (coll, rawGuildScheduledEventData) =>
156
+ coll.set(
157
+ rawGuildScheduledEventData.id,
158
+ this.guild.scheduledEvents._add(rawGuildScheduledEventData, options.cache),
159
+ ),
160
+ new Collection(),
161
+ );
162
+ }
163
+
164
+ /**
165
+ * Options used to edit a guild scheduled event.
166
+ * @typedef {Object} GuildScheduledEventEditOptions
167
+ * @property {string} [name] The name of the guild scheduled event
168
+ * @property {DateResolvable} [scheduledStartTime] The time to schedule the event at
169
+ * @property {DateResolvable} [scheduledEndTime] The time to end the event at
170
+ * @property {GuildScheduledEventPrivacyLevel} [privacyLevel] The privacy level of the guild scheduled event
171
+ * @property {GuildScheduledEventEntityType} [entityType] The scheduled entity type of the event
172
+ * @property {string} [description] The description of the guild scheduled event
173
+ * @property {?GuildVoiceChannelResolvable} [channel] The channel of the guild scheduled event
174
+ * @property {GuildScheduledEventStatus} [status] The status of the guild scheduled event
175
+ * @property {GuildScheduledEventEntityMetadataOptions} [entityMetadata] The entity metadata of the
176
+ * guild scheduled event
177
+ * <warn>This can be modified only if `entityType` of the `GuildScheduledEvent` to be edited is
178
+ * {@link GuildScheduledEventEntityType.External}</warn>
179
+ * @property {?(BufferResolvable|Base64Resolvable)} [image] The cover image of the guild scheduled event
180
+ * @property {string} [reason] The reason for editing the guild scheduled event
181
+ */
182
+
183
+ /**
184
+ * Edits a guild scheduled event.
185
+ * @param {GuildScheduledEventResolvable} guildScheduledEvent The guild scheduled event to edit
186
+ * @param {GuildScheduledEventEditOptions} options Options to edit the guild scheduled event
187
+ * @returns {Promise<GuildScheduledEvent>}
188
+ */
189
+ async edit(guildScheduledEvent, options) {
190
+ const guildScheduledEventId = this.resolveId(guildScheduledEvent);
191
+ if (!guildScheduledEventId) throw new DiscordjsError(ErrorCodes.GuildScheduledEventResolve);
192
+
193
+ if (typeof options !== 'object') throw new DiscordjsTypeError(ErrorCodes.InvalidType, 'options', 'object', true);
194
+ let {
195
+ privacyLevel,
196
+ entityType,
197
+ channel,
198
+ status,
199
+ name,
200
+ scheduledStartTime,
201
+ description,
202
+ scheduledEndTime,
203
+ entityMetadata,
204
+ reason,
205
+ image,
206
+ } = options;
207
+
208
+ let entity_metadata;
209
+ if (entityMetadata) {
210
+ entity_metadata = {
211
+ location: entityMetadata.location,
212
+ };
213
+ }
214
+
215
+ const data = await this.client.rest.patch(Routes.guildScheduledEvent(this.guild.id, guildScheduledEventId), {
216
+ body: {
217
+ channel_id: channel === undefined ? channel : this.guild.channels.resolveId(channel),
218
+ name,
219
+ privacy_level: privacyLevel,
220
+ scheduled_start_time: scheduledStartTime ? new Date(scheduledStartTime).toISOString() : undefined,
221
+ scheduled_end_time: scheduledEndTime ? new Date(scheduledEndTime).toISOString() : scheduledEndTime,
222
+ description,
223
+ entity_type: entityType,
224
+ status,
225
+ image: image && (await DataResolver.resolveImage(image)),
226
+ entity_metadata,
227
+ },
228
+ reason,
229
+ });
230
+
231
+ return this._add(data);
232
+ }
233
+
234
+ /**
235
+ * Deletes a guild scheduled event.
236
+ * @param {GuildScheduledEventResolvable} guildScheduledEvent The guild scheduled event to delete
237
+ * @returns {Promise<void>}
238
+ */
239
+ async delete(guildScheduledEvent) {
240
+ const guildScheduledEventId = this.resolveId(guildScheduledEvent);
241
+ if (!guildScheduledEventId) throw new DiscordjsError(ErrorCodes.GuildScheduledEventResolve);
242
+
243
+ await this.client.rest.delete(Routes.guildScheduledEvent(this.guild.id, guildScheduledEventId));
244
+ }
245
+
246
+ /**
247
+ * Options used to fetch subscribers of a guild scheduled event
248
+ * @typedef {Object} FetchGuildScheduledEventSubscribersOptions
249
+ * @property {number} [limit] The maximum numbers of users to fetch
250
+ * @property {boolean} [withMember] Whether to fetch guild member data of the users
251
+ * @property {Snowflake} [before] Consider only users before this user id
252
+ * @property {Snowflake} [after] Consider only users after this user id
253
+ * <warn>If both `before` and `after` are provided, only `before` is respected</warn>
254
+ */
255
+
256
+ /**
257
+ * Represents a subscriber of a {@link GuildScheduledEvent}
258
+ * @typedef {Object} GuildScheduledEventUser
259
+ * @property {Snowflake} guildScheduledEventId The id of the guild scheduled event which the user subscribed to
260
+ * @property {User} user The user that subscribed to the guild scheduled event
261
+ * @property {?GuildMember} member The guild member associated with the user, if any
262
+ */
263
+
264
+ /**
265
+ * Fetches subscribers of a guild scheduled event.
266
+ * @param {GuildScheduledEventResolvable} guildScheduledEvent The guild scheduled event to fetch subscribers of
267
+ * @param {FetchGuildScheduledEventSubscribersOptions} [options={}] Options for fetching the subscribers
268
+ * @returns {Promise<Collection<Snowflake, GuildScheduledEventUser>>}
269
+ */
270
+ async fetchSubscribers(guildScheduledEvent, options = {}) {
271
+ const guildScheduledEventId = this.resolveId(guildScheduledEvent);
272
+ if (!guildScheduledEventId) throw new DiscordjsError(ErrorCodes.GuildScheduledEventResolve);
273
+
274
+ const query = makeURLSearchParams({
275
+ limit: options.limit,
276
+ with_member: options.withMember,
277
+ before: options.before,
278
+ after: options.after,
279
+ });
280
+
281
+ const data = await this.client.rest.get(Routes.guildScheduledEventUsers(this.guild.id, guildScheduledEventId), {
282
+ query,
283
+ });
284
+
285
+ return data.reduce(
286
+ (coll, rawData) =>
287
+ coll.set(rawData.user.id, {
288
+ guildScheduledEventId: rawData.guild_scheduled_event_id,
289
+ user: this.client.users._add(rawData.user),
290
+ member: rawData.member ? this.guild.members._add({ ...rawData.member, user: rawData.user }) : null,
291
+ }),
292
+ new Collection(),
293
+ );
294
+ }
295
+ }
296
+
297
+ module.exports = GuildScheduledEventManager;
@@ -0,0 +1,182 @@
1
+ 'use strict';
2
+
3
+ const { Collection } = require('@discordjs/collection');
4
+ const { Routes } = require('discord-api-types/v10');
5
+ const CachedManager = require('./CachedManager');
6
+ const { DiscordjsTypeError, ErrorCodes } = require('../errors');
7
+ const MessagePayload = require('../structures/MessagePayload');
8
+ const { Sticker } = require('../structures/Sticker');
9
+
10
+ /**
11
+ * Manages API methods for Guild Stickers and stores their cache.
12
+ * @extends {CachedManager}
13
+ */
14
+ class GuildStickerManager extends CachedManager {
15
+ constructor(guild, iterable) {
16
+ super(guild.client, Sticker, iterable);
17
+
18
+ /**
19
+ * The guild this manager belongs to
20
+ * @type {Guild}
21
+ */
22
+ this.guild = guild;
23
+ }
24
+
25
+ /**
26
+ * The cache of Guild Stickers
27
+ * @type {Collection<Snowflake, Sticker>}
28
+ * @name GuildStickerManager#cache
29
+ */
30
+
31
+ _add(data, cache) {
32
+ return super._add(data, cache, { extras: [this.guild] });
33
+ }
34
+
35
+ /**
36
+ * Options used to create a guild sticker.
37
+ * @typedef {Object} GuildStickerCreateOptions
38
+ * @property {AttachmentPayload|BufferResolvable|Stream} file The file for the sticker
39
+ * @property {string} name The name for the sticker
40
+ * @property {string} tags The Discord name of a unicode emoji representing the sticker's expression
41
+ * @property {?string} [description] The description for the sticker
42
+ * @property {string} [reason] Reason for creating the sticker
43
+ */
44
+
45
+ /**
46
+ * Creates a new custom sticker in the guild.
47
+ * @param {GuildStickerCreateOptions} options Options for creating a guild sticker
48
+ * @returns {Promise<Sticker>} The created sticker
49
+ * @example
50
+ * // Create a new sticker from a URL
51
+ * guild.stickers.create({ file: 'https://i.imgur.com/w3duR07.png', name: 'rip', tags: 'headstone' })
52
+ * .then(sticker => console.log(`Created new sticker with name ${sticker.name}!`))
53
+ * .catch(console.error);
54
+ * @example
55
+ * // Create a new sticker from a file on your computer
56
+ * guild.stickers.create({ file: './memes/banana.png', name: 'banana', tags: 'banana' })
57
+ * .then(sticker => console.log(`Created new sticker with name ${sticker.name}!`))
58
+ * .catch(console.error);
59
+ */
60
+ async create({ file, name, tags, description, reason } = {}) {
61
+ const resolvedFile = await MessagePayload.resolveFile(file);
62
+ if (!resolvedFile) throw new DiscordjsTypeError(ErrorCodes.ReqResourceType);
63
+ file = { ...resolvedFile, key: 'file' };
64
+
65
+ const body = { name, tags, description: description ?? '' };
66
+
67
+ const sticker = await this.client.rest.post(Routes.guildStickers(this.guild.id), {
68
+ appendToFormData: true,
69
+ body,
70
+ files: [file],
71
+ reason,
72
+ });
73
+ return this.client.actions.GuildStickerCreate.handle(this.guild, sticker).sticker;
74
+ }
75
+
76
+ /**
77
+ * Data that resolves to give a Sticker object. This can be:
78
+ * * A Sticker object
79
+ * * A Snowflake
80
+ * @typedef {Sticker|Snowflake} StickerResolvable
81
+ */
82
+
83
+ /**
84
+ * Resolves a StickerResolvable to a Sticker object.
85
+ * @method resolve
86
+ * @memberof GuildStickerManager
87
+ * @instance
88
+ * @param {StickerResolvable} sticker The Sticker resolvable to identify
89
+ * @returns {?Sticker}
90
+ */
91
+
92
+ /**
93
+ * Resolves a StickerResolvable to a Sticker id string.
94
+ * @method resolveId
95
+ * @memberof GuildStickerManager
96
+ * @instance
97
+ * @param {StickerResolvable} sticker The Sticker resolvable to identify
98
+ * @returns {?Snowflake}
99
+ */
100
+
101
+ /**
102
+ * Edits a sticker.
103
+ * @param {StickerResolvable} sticker The sticker to edit
104
+ * @param {GuildStickerEditOptions} [options={}] The new data for the sticker
105
+ * @returns {Promise<Sticker>}
106
+ */
107
+ async edit(sticker, options = {}) {
108
+ const stickerId = this.resolveId(sticker);
109
+ if (!stickerId) throw new DiscordjsTypeError(ErrorCodes.InvalidType, 'sticker', 'StickerResolvable');
110
+
111
+ const d = await this.client.rest.patch(Routes.guildSticker(this.guild.id, stickerId), {
112
+ body: options,
113
+ reason: options.reason,
114
+ });
115
+
116
+ const existing = this.cache.get(stickerId);
117
+ if (existing) {
118
+ const clone = existing._clone();
119
+ clone._patch(d);
120
+ return clone;
121
+ }
122
+ return this._add(d);
123
+ }
124
+
125
+ /**
126
+ * Deletes a sticker.
127
+ * @param {StickerResolvable} sticker The sticker to delete
128
+ * @param {string} [reason] Reason for deleting this sticker
129
+ * @returns {Promise<void>}
130
+ */
131
+ async delete(sticker, reason) {
132
+ sticker = this.resolveId(sticker);
133
+ if (!sticker) throw new DiscordjsTypeError(ErrorCodes.InvalidType, 'sticker', 'StickerResolvable');
134
+
135
+ await this.client.rest.delete(Routes.guildSticker(this.guild.id, sticker), { reason });
136
+ }
137
+
138
+ /**
139
+ * Obtains one or more stickers from Discord, or the sticker cache if they're already available.
140
+ * @param {Snowflake} [id] The Sticker's id
141
+ * @param {BaseFetchOptions} [options] Additional options for this fetch
142
+ * @returns {Promise<Sticker|Collection<Snowflake, Sticker>>}
143
+ * @example
144
+ * // Fetch all stickers from the guild
145
+ * message.guild.stickers.fetch()
146
+ * .then(stickers => console.log(`There are ${stickers.size} stickers.`))
147
+ * .catch(console.error);
148
+ * @example
149
+ * // Fetch a single sticker
150
+ * message.guild.stickers.fetch('222078108977594368')
151
+ * .then(sticker => console.log(`The sticker name is: ${sticker.name}`))
152
+ * .catch(console.error);
153
+ */
154
+ async fetch(id, { cache = true, force = false } = {}) {
155
+ if (id) {
156
+ if (!force) {
157
+ const existing = this.cache.get(id);
158
+ if (existing) return existing;
159
+ }
160
+ const sticker = await this.client.rest.get(Routes.guildSticker(this.guild.id, id));
161
+ return this._add(sticker, cache);
162
+ }
163
+
164
+ const data = await this.client.rest.get(Routes.guildStickers(this.guild.id));
165
+ return new Collection(data.map(sticker => [sticker.id, this._add(sticker, cache)]));
166
+ }
167
+
168
+ /**
169
+ * Fetches the user who uploaded this sticker, if this is a guild sticker.
170
+ * @param {StickerResolvable} sticker The sticker to fetch the user for
171
+ * @returns {Promise<?User>}
172
+ */
173
+ async fetchUser(sticker) {
174
+ sticker = this.resolve(sticker);
175
+ if (!sticker) throw new DiscordjsTypeError(ErrorCodes.InvalidType, 'sticker', 'StickerResolvable');
176
+ const data = await this.client.rest.get(Routes.guildSticker(this.guild.id, sticker.id));
177
+ sticker._patch(data);
178
+ return sticker.user;
179
+ }
180
+ }
181
+
182
+ module.exports = GuildStickerManager;