@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,518 @@
1
+ 'use strict';
2
+
3
+ const { PermissionFlagsBits } = require('discord-api-types/v10');
4
+ const Base = require('./Base');
5
+ const VoiceState = require('./VoiceState');
6
+ const TextBasedChannel = require('./interfaces/TextBasedChannel');
7
+ const { DiscordjsError, ErrorCodes } = require('../errors');
8
+ const GuildMemberRoleManager = require('../managers/GuildMemberRoleManager');
9
+ const { GuildMemberFlagsBitField } = require('../util/GuildMemberFlagsBitField');
10
+ const PermissionsBitField = require('../util/PermissionsBitField');
11
+
12
+ /**
13
+ * Represents a member of a guild on Discord.
14
+ * @implements {TextBasedChannel}
15
+ * @extends {Base}
16
+ */
17
+ class GuildMember extends Base {
18
+ constructor(client, data, guild) {
19
+ super(client);
20
+
21
+ /**
22
+ * The guild that this member is part of
23
+ * @type {Guild}
24
+ */
25
+ this.guild = guild;
26
+
27
+ /**
28
+ * The timestamp the member joined the guild at
29
+ * @type {?number}
30
+ */
31
+ this.joinedTimestamp = null;
32
+
33
+ /**
34
+ * The last timestamp this member started boosting the guild
35
+ * @type {?number}
36
+ */
37
+ this.premiumSinceTimestamp = null;
38
+
39
+ /**
40
+ * The nickname of this member, if they have one
41
+ * @type {?string}
42
+ */
43
+ this.nickname = null;
44
+
45
+ /**
46
+ * Whether this member has yet to pass the guild's membership gate
47
+ * @type {?boolean}
48
+ */
49
+ this.pending = null;
50
+
51
+ /**
52
+ * The timestamp this member's timeout will be removed
53
+ * @type {?number}
54
+ */
55
+ this.communicationDisabledUntilTimestamp = null;
56
+
57
+ /**
58
+ * The role ids of the member
59
+ * @type {Snowflake[]}
60
+ * @private
61
+ */
62
+ this._roles = [];
63
+ if (data) this._patch(data);
64
+ }
65
+
66
+ _patch(data) {
67
+ if ('user' in data) {
68
+ /**
69
+ * The user that this guild member instance represents
70
+ * @type {?User}
71
+ */
72
+ this.user = this.client.users._add(data.user, true);
73
+ }
74
+
75
+ if ('nick' in data) this.nickname = data.nick;
76
+ if ('avatar' in data) {
77
+ /**
78
+ * The guild member's avatar hash
79
+ * @type {?string}
80
+ */
81
+ this.avatar = data.avatar;
82
+ } else if (typeof this.avatar !== 'string') {
83
+ this.avatar = null;
84
+ }
85
+ if ('joined_at' in data) this.joinedTimestamp = Date.parse(data.joined_at);
86
+ if ('premium_since' in data) {
87
+ this.premiumSinceTimestamp = data.premium_since ? Date.parse(data.premium_since) : null;
88
+ }
89
+ if ('roles' in data) this._roles = data.roles;
90
+
91
+ if ('pending' in data) {
92
+ this.pending = data.pending;
93
+ } else if (!this.partial) {
94
+ // See https://github.com/discordjs/discord.js/issues/6546 for more info.
95
+ this.pending ??= false;
96
+ }
97
+
98
+ if ('communication_disabled_until' in data) {
99
+ this.communicationDisabledUntilTimestamp =
100
+ data.communication_disabled_until && Date.parse(data.communication_disabled_until);
101
+ }
102
+
103
+ if ('flags' in data) {
104
+ /**
105
+ * The flags of this member
106
+ * @type {Readonly<GuildMemberFlagsBitField>}
107
+ */
108
+ this.flags = new GuildMemberFlagsBitField(data.flags).freeze();
109
+ } else {
110
+ this.flags ??= new GuildMemberFlagsBitField().freeze();
111
+ }
112
+ }
113
+
114
+ _clone() {
115
+ const clone = super._clone();
116
+ clone._roles = this._roles.slice();
117
+ return clone;
118
+ }
119
+
120
+ /**
121
+ * Whether this GuildMember is a partial
122
+ * @type {boolean}
123
+ * @readonly
124
+ */
125
+ get partial() {
126
+ return this.joinedTimestamp === null;
127
+ }
128
+
129
+ /**
130
+ * A manager for the roles belonging to this member
131
+ * @type {GuildMemberRoleManager}
132
+ * @readonly
133
+ */
134
+ get roles() {
135
+ return new GuildMemberRoleManager(this);
136
+ }
137
+
138
+ /**
139
+ * The voice state of this member
140
+ * @type {VoiceState}
141
+ * @readonly
142
+ */
143
+ get voice() {
144
+ return this.guild.voiceStates.cache.get(this.id) ?? new VoiceState(this.guild, { user_id: this.id });
145
+ }
146
+
147
+ /**
148
+ * A link to the member's guild avatar.
149
+ * @param {ImageURLOptions} [options={}] Options for the image URL
150
+ * @returns {?string}
151
+ */
152
+ avatarURL(options = {}) {
153
+ return this.avatar && this.client.rest.cdn.guildMemberAvatar(this.guild.id, this.id, this.avatar, options);
154
+ }
155
+
156
+ /**
157
+ * A link to the member's guild avatar if they have one.
158
+ * Otherwise, a link to their {@link User#displayAvatarURL} will be returned.
159
+ * @param {ImageURLOptions} [options={}] Options for the Image URL
160
+ * @returns {string}
161
+ */
162
+ displayAvatarURL(options) {
163
+ return this.avatarURL(options) ?? this.user.displayAvatarURL(options);
164
+ }
165
+
166
+ /**
167
+ * The time this member joined the guild
168
+ * @type {?Date}
169
+ * @readonly
170
+ */
171
+ get joinedAt() {
172
+ return this.joinedTimestamp && new Date(this.joinedTimestamp);
173
+ }
174
+
175
+ /**
176
+ * The time this member's timeout will be removed
177
+ * @type {?Date}
178
+ * @readonly
179
+ */
180
+ get communicationDisabledUntil() {
181
+ return this.communicationDisabledUntilTimestamp && new Date(this.communicationDisabledUntilTimestamp);
182
+ }
183
+
184
+ /**
185
+ * The last time this member started boosting the guild
186
+ * @type {?Date}
187
+ * @readonly
188
+ */
189
+ get premiumSince() {
190
+ return this.premiumSinceTimestamp && new Date(this.premiumSinceTimestamp);
191
+ }
192
+
193
+ /**
194
+ * The presence of this guild member
195
+ * @type {?Presence}
196
+ * @readonly
197
+ */
198
+ get presence() {
199
+ return this.guild.presences.resolve(this.id);
200
+ }
201
+
202
+ /**
203
+ * The displayed color of this member in base 10
204
+ * @type {number}
205
+ * @readonly
206
+ */
207
+ get displayColor() {
208
+ return this.roles.color?.color ?? 0;
209
+ }
210
+
211
+ /**
212
+ * The displayed color of this member in hexadecimal
213
+ * @type {string}
214
+ * @readonly
215
+ */
216
+ get displayHexColor() {
217
+ return this.roles.color?.hexColor ?? '#000000';
218
+ }
219
+
220
+ /**
221
+ * The member's id
222
+ * @type {Snowflake}
223
+ * @readonly
224
+ */
225
+ get id() {
226
+ return this.user.id;
227
+ }
228
+
229
+ /**
230
+ * The DM between the client's user and this member
231
+ * @type {?DMChannel}
232
+ * @readonly
233
+ */
234
+ get dmChannel() {
235
+ return this.client.users.dmChannel(this.id);
236
+ }
237
+
238
+ /**
239
+ * The nickname of this member, or their username if they don't have one
240
+ * @type {?string}
241
+ * @readonly
242
+ */
243
+ get displayName() {
244
+ return this.nickname ?? this.user.username;
245
+ }
246
+
247
+ /**
248
+ * The overall set of permissions for this member, taking only roles and owner status into account
249
+ * @type {Readonly<PermissionsBitField>}
250
+ * @readonly
251
+ */
252
+ get permissions() {
253
+ if (this.user.id === this.guild.ownerId) return new PermissionsBitField(PermissionsBitField.All).freeze();
254
+ return new PermissionsBitField(this.roles.cache.map(role => role.permissions)).freeze();
255
+ }
256
+
257
+ /**
258
+ * Whether the client user is above this user in the hierarchy, according to role position and guild ownership.
259
+ * This is a prerequisite for many moderative actions.
260
+ * @type {boolean}
261
+ * @readonly
262
+ */
263
+ get manageable() {
264
+ if (this.user.id === this.guild.ownerId) return false;
265
+ if (this.user.id === this.client.user.id) return false;
266
+ if (this.client.user.id === this.guild.ownerId) return true;
267
+ if (!this.guild.members.me) throw new DiscordjsError(ErrorCodes.GuildUncachedMe);
268
+ return this.guild.members.me.roles.highest.comparePositionTo(this.roles.highest) > 0;
269
+ }
270
+
271
+ /**
272
+ * Whether this member is kickable by the client user
273
+ * @type {boolean}
274
+ * @readonly
275
+ */
276
+ get kickable() {
277
+ if (!this.guild.members.me) throw new DiscordjsError(ErrorCodes.GuildUncachedMe);
278
+ return this.manageable && this.guild.members.me.permissions.has(PermissionFlagsBits.KickMembers);
279
+ }
280
+
281
+ /**
282
+ * Whether this member is bannable by the client user
283
+ * @type {boolean}
284
+ * @readonly
285
+ */
286
+ get bannable() {
287
+ if (!this.guild.members.me) throw new DiscordjsError(ErrorCodes.GuildUncachedMe);
288
+ return this.manageable && this.guild.members.me.permissions.has(PermissionFlagsBits.BanMembers);
289
+ }
290
+
291
+ /**
292
+ * Whether this member is moderatable by the client user
293
+ * @type {boolean}
294
+ * @readonly
295
+ */
296
+ get moderatable() {
297
+ return (
298
+ !this.permissions.has(PermissionFlagsBits.Administrator) &&
299
+ this.manageable &&
300
+ (this.guild.members.me?.permissions.has(PermissionFlagsBits.ModerateMembers) ?? false)
301
+ );
302
+ }
303
+
304
+ /**
305
+ * Whether this member is currently timed out
306
+ * @returns {boolean}
307
+ */
308
+ isCommunicationDisabled() {
309
+ return this.communicationDisabledUntilTimestamp > Date.now();
310
+ }
311
+
312
+ /**
313
+ * Returns `channel.permissionsFor(guildMember)`. Returns permissions for a member in a guild channel,
314
+ * taking into account roles and permission overwrites.
315
+ * @param {GuildChannelResolvable} channel The guild channel to use as context
316
+ * @returns {Readonly<PermissionsBitField>}
317
+ */
318
+ permissionsIn(channel) {
319
+ channel = this.guild.channels.resolve(channel);
320
+ if (!channel) throw new DiscordjsError(ErrorCodes.GuildChannelResolve);
321
+ return channel.permissionsFor(this);
322
+ }
323
+
324
+ /**
325
+ * Edits this member.
326
+ * @param {GuildMemberEditOptions} options The options to provide
327
+ * @returns {Promise<GuildMember>}
328
+ */
329
+ edit(options) {
330
+ return this.guild.members.edit(this, options);
331
+ }
332
+
333
+ /**
334
+ * Sets the flags for this member.
335
+ * @param {GuildMemberFlagsResolvable} flags The flags to set
336
+ * @param {string} [reason] Reason for setting the flags
337
+ * @returns {Promise<GuildMember>}
338
+ */
339
+ setFlags(flags, reason) {
340
+ return this.edit({ flags, reason });
341
+ }
342
+
343
+ /**
344
+ * Sets the nickname for this member.
345
+ * @param {?string} nick The nickname for the guild member, or `null` if you want to reset their nickname
346
+ * @param {string} [reason] Reason for setting the nickname
347
+ * @returns {Promise<GuildMember>}
348
+ * @example
349
+ * // Set a nickname for a guild member
350
+ * guildMember.setNickname('cool nickname', 'Needed a new nickname')
351
+ * .then(member => console.log(`Set nickname of ${member.user.username}`))
352
+ * .catch(console.error);
353
+ * @example
354
+ * // Remove a nickname for a guild member
355
+ * guildMember.setNickname(null, 'No nicknames allowed!')
356
+ * .then(member => console.log(`Removed nickname for ${member.user.username}`))
357
+ * .catch(console.error);
358
+ */
359
+ setNickname(nick, reason) {
360
+ return this.edit({ nick, reason });
361
+ }
362
+
363
+ /**
364
+ * Creates a DM channel between the client and this member.
365
+ * @param {boolean} [force=false] Whether to skip the cache check and request the API
366
+ * @returns {Promise<DMChannel>}
367
+ */
368
+ createDM(force = false) {
369
+ return this.user.createDM(force);
370
+ }
371
+
372
+ /**
373
+ * Deletes any DMs with this member.
374
+ * @returns {Promise<DMChannel>}
375
+ */
376
+ deleteDM() {
377
+ return this.user.deleteDM();
378
+ }
379
+
380
+ /**
381
+ * Kicks this member from the guild.
382
+ * @param {string} [reason] Reason for kicking user
383
+ * @returns {Promise<GuildMember>}
384
+ */
385
+ kick(reason) {
386
+ return this.guild.members.kick(this, reason);
387
+ }
388
+
389
+ /**
390
+ * Bans this guild member.
391
+ * @param {BanOptions} [options] Options for the ban
392
+ * @returns {Promise<GuildMember>}
393
+ * @example
394
+ * // Ban a guild member, deleting a week's worth of messages
395
+ * guildMember.ban({ deleteMessageSeconds: 60 * 60 * 24 * 7, reason: 'They deserved it' })
396
+ * .then(console.log)
397
+ * .catch(console.error);
398
+ */
399
+ ban(options) {
400
+ return this.guild.bans.create(this, options);
401
+ }
402
+
403
+ /**
404
+ * Times this guild member out.
405
+ * @param {DateResolvable|null} communicationDisabledUntil The date or timestamp
406
+ * for the member's communication to be disabled until. Provide `null` to remove the timeout.
407
+ * @param {string} [reason] The reason for this timeout.
408
+ * @returns {Promise<GuildMember>}
409
+ * @example
410
+ * // Time a guild member out for 5 minutes
411
+ * guildMember.disableCommunicationUntil(Date.now() + (5 * 60 * 1000), 'They deserved it')
412
+ * .then(console.log)
413
+ * .catch(console.error);
414
+ * @example
415
+ * // Remove the timeout of a guild member
416
+ * guildMember.disableCommunicationUntil(null)
417
+ * .then(member => console.log(`Removed timeout for ${member.displayName}`))
418
+ * .catch(console.error);
419
+ */
420
+ disableCommunicationUntil(communicationDisabledUntil, reason) {
421
+ return this.edit({ communicationDisabledUntil, reason });
422
+ }
423
+
424
+ /**
425
+ * Times this guild member out.
426
+ * @param {number|null} timeout The time in milliseconds
427
+ * for the member's communication to be disabled until. Provide `null` to remove the timeout.
428
+ * @param {string} [reason] The reason for this timeout.
429
+ * @returns {Promise<GuildMember>}
430
+ * @example
431
+ * // Time a guild member out for 5 minutes
432
+ * guildMember.timeout(5 * 60 * 1000, 'They deserved it')
433
+ * .then(console.log)
434
+ * .catch(console.error);
435
+ */
436
+ timeout(timeout, reason) {
437
+ return this.disableCommunicationUntil(timeout && Date.now() + timeout, reason);
438
+ }
439
+
440
+ /**
441
+ * Fetches this GuildMember.
442
+ * @param {boolean} [force=true] Whether to skip the cache check and request the API
443
+ * @returns {Promise<GuildMember>}
444
+ */
445
+ fetch(force = true) {
446
+ return this.guild.members.fetch({ user: this.id, cache: true, force });
447
+ }
448
+
449
+ /**
450
+ * Whether this guild member equals another guild member. It compares all properties, so for most
451
+ * comparison it is advisable to just compare `member.id === member2.id` as it is significantly faster
452
+ * and is often what most users need.
453
+ * @param {GuildMember} member The member to compare with
454
+ * @returns {boolean}
455
+ */
456
+ equals(member) {
457
+ return (
458
+ member instanceof this.constructor &&
459
+ this.id === member.id &&
460
+ this.partial === member.partial &&
461
+ this.guild.id === member.guild.id &&
462
+ this.joinedTimestamp === member.joinedTimestamp &&
463
+ this.nickname === member.nickname &&
464
+ this.avatar === member.avatar &&
465
+ this.pending === member.pending &&
466
+ this.communicationDisabledUntilTimestamp === member.communicationDisabledUntilTimestamp &&
467
+ this.flags.bitfield === member.flags.bitfield &&
468
+ (this._roles === member._roles ||
469
+ (this._roles.length === member._roles.length && this._roles.every((role, i) => role === member._roles[i])))
470
+ );
471
+ }
472
+
473
+ /**
474
+ * When concatenated with a string, this automatically returns the user's mention instead of the GuildMember object.
475
+ * @returns {string}
476
+ * @example
477
+ * // Logs: Hello from <@123456789012345678>!
478
+ * console.log(`Hello from ${member}!`);
479
+ */
480
+ toString() {
481
+ return this.user.toString();
482
+ }
483
+
484
+ toJSON() {
485
+ const json = super.toJSON({
486
+ guild: 'guildId',
487
+ user: 'userId',
488
+ displayName: true,
489
+ roles: true,
490
+ });
491
+ json.avatarURL = this.avatarURL();
492
+ json.displayAvatarURL = this.displayAvatarURL();
493
+ return json;
494
+ }
495
+ }
496
+
497
+ /**
498
+ * Sends a message to this user.
499
+ * @method send
500
+ * @memberof GuildMember
501
+ * @instance
502
+ * @param {string|MessagePayload|MessageCreateOptions} options The options to provide
503
+ * @returns {Promise<Message>}
504
+ * @example
505
+ * // Send a direct message
506
+ * guildMember.send('Hello!')
507
+ * .then(message => console.log(`Sent message: ${message.content} to ${guildMember.displayName}`))
508
+ * .catch(console.error);
509
+ */
510
+
511
+ TextBasedChannel.applyToClass(GuildMember);
512
+
513
+ exports.GuildMember = GuildMember;
514
+
515
+ /**
516
+ * @external APIGuildMember
517
+ * @see {@link https://discord.com/developers/docs/resources/guild#guild-member-object}
518
+ */
@@ -0,0 +1,193 @@
1
+ 'use strict';
2
+
3
+ const { Collection } = require('@discordjs/collection');
4
+ const { DiscordSnowflake } = require('@sapphire/snowflake');
5
+ const { Routes } = require('discord-api-types/v10');
6
+ const Base = require('./Base');
7
+ const GuildPreviewEmoji = require('./GuildPreviewEmoji');
8
+ const { Sticker } = require('./Sticker');
9
+
10
+ /**
11
+ * Represents the data about the guild any bot can preview, connected to the specified guild.
12
+ * @extends {Base}
13
+ */
14
+ class GuildPreview extends Base {
15
+ constructor(client, data) {
16
+ super(client);
17
+
18
+ if (!data) return;
19
+
20
+ this._patch(data);
21
+ }
22
+
23
+ _patch(data) {
24
+ /**
25
+ * The id of this guild
26
+ * @type {string}
27
+ */
28
+ this.id = data.id;
29
+
30
+ if ('name' in data) {
31
+ /**
32
+ * The name of this guild
33
+ * @type {string}
34
+ */
35
+ this.name = data.name;
36
+ }
37
+
38
+ if ('icon' in data) {
39
+ /**
40
+ * The icon of this guild
41
+ * @type {?string}
42
+ */
43
+ this.icon = data.icon;
44
+ }
45
+
46
+ if ('splash' in data) {
47
+ /**
48
+ * The splash icon of this guild
49
+ * @type {?string}
50
+ */
51
+ this.splash = data.splash;
52
+ }
53
+
54
+ if ('discovery_splash' in data) {
55
+ /**
56
+ * The discovery splash icon of this guild
57
+ * @type {?string}
58
+ */
59
+ this.discoverySplash = data.discovery_splash;
60
+ }
61
+
62
+ if ('features' in data) {
63
+ /**
64
+ * An array of enabled guild features
65
+ * @type {GuildFeature[]}
66
+ */
67
+ this.features = data.features;
68
+ }
69
+
70
+ if ('approximate_member_count' in data) {
71
+ /**
72
+ * The approximate count of members in this guild
73
+ * @type {number}
74
+ */
75
+ this.approximateMemberCount = data.approximate_member_count;
76
+ }
77
+
78
+ if ('approximate_presence_count' in data) {
79
+ /**
80
+ * The approximate count of online members in this guild
81
+ * @type {number}
82
+ */
83
+ this.approximatePresenceCount = data.approximate_presence_count;
84
+ }
85
+
86
+ if ('description' in data) {
87
+ /**
88
+ * The description for this guild
89
+ * @type {?string}
90
+ */
91
+ this.description = data.description;
92
+ } else {
93
+ this.description ??= null;
94
+ }
95
+
96
+ if (!this.emojis) {
97
+ /**
98
+ * Collection of emojis belonging to this guild
99
+ * @type {Collection<Snowflake, GuildPreviewEmoji>}
100
+ */
101
+ this.emojis = new Collection();
102
+ } else {
103
+ this.emojis.clear();
104
+ }
105
+ for (const emoji of data.emojis) {
106
+ this.emojis.set(emoji.id, new GuildPreviewEmoji(this.client, emoji, this));
107
+ }
108
+
109
+ /**
110
+ * Collection of stickers belonging to this guild
111
+ * @type {Collection<Snowflake, Sticker>}
112
+ */
113
+ this.stickers = data.stickers.reduce(
114
+ (stickers, sticker) => stickers.set(sticker.id, new Sticker(this.client, sticker)),
115
+ new Collection(),
116
+ );
117
+ }
118
+
119
+ /**
120
+ * The timestamp this guild was created at
121
+ * @type {number}
122
+ * @readonly
123
+ */
124
+ get createdTimestamp() {
125
+ return DiscordSnowflake.timestampFrom(this.id);
126
+ }
127
+
128
+ /**
129
+ * The time this guild was created at
130
+ * @type {Date}
131
+ * @readonly
132
+ */
133
+ get createdAt() {
134
+ return new Date(this.createdTimestamp);
135
+ }
136
+
137
+ /**
138
+ * The URL to this guild's splash.
139
+ * @param {ImageURLOptions} [options={}] Options for the image URL
140
+ * @returns {?string}
141
+ */
142
+ splashURL(options = {}) {
143
+ return this.splash && this.client.rest.cdn.splash(this.id, this.splash, options);
144
+ }
145
+
146
+ /**
147
+ * The URL to this guild's discovery splash.
148
+ * @param {ImageURLOptions} [options={}] Options for the image URL
149
+ * @returns {?string}
150
+ */
151
+ discoverySplashURL(options = {}) {
152
+ return this.discoverySplash && this.client.rest.cdn.discoverySplash(this.id, this.discoverySplash, options);
153
+ }
154
+
155
+ /**
156
+ * The URL to this guild's icon.
157
+ * @param {ImageURLOptions} [options={}] Options for the image URL
158
+ * @returns {?string}
159
+ */
160
+ iconURL(options = {}) {
161
+ return this.icon && this.client.rest.cdn.icon(this.id, this.icon, options);
162
+ }
163
+
164
+ /**
165
+ * Fetches this guild.
166
+ * @returns {Promise<GuildPreview>}
167
+ */
168
+ async fetch() {
169
+ const data = await this.client.rest.get(Routes.guildPreview(this.id));
170
+ this._patch(data);
171
+ return this;
172
+ }
173
+
174
+ /**
175
+ * When concatenated with a string, this automatically returns the guild's name instead of the Guild object.
176
+ * @returns {string}
177
+ * @example
178
+ * // Logs: Hello from My Guild!
179
+ * console.log(`Hello from ${previewGuild}!`);
180
+ */
181
+ toString() {
182
+ return this.name;
183
+ }
184
+
185
+ toJSON() {
186
+ const json = super.toJSON();
187
+ json.iconURL = this.iconURL();
188
+ json.splashURL = this.splashURL();
189
+ return json;
190
+ }
191
+ }
192
+
193
+ module.exports = GuildPreview;