djs-selfbot-v13 3.1.8 → 3.7.1

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 (364) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +48 -37
  3. package/package.json +44 -26
  4. package/src/WebSocket.js +39 -39
  5. package/src/client/BaseClient.js +86 -86
  6. package/src/client/Client.js +934 -765
  7. package/src/client/WebhookClient.js +61 -61
  8. package/src/client/actions/Action.js +116 -120
  9. package/src/client/actions/ActionsManager.js +80 -78
  10. package/src/client/actions/ApplicationCommandPermissionsUpdate.js +34 -34
  11. package/src/client/actions/AutoModerationActionExecution.js +27 -27
  12. package/src/client/actions/AutoModerationRuleCreate.js +28 -28
  13. package/src/client/actions/AutoModerationRuleDelete.js +32 -32
  14. package/src/client/actions/AutoModerationRuleUpdate.js +30 -30
  15. package/src/client/actions/ChannelCreate.js +23 -23
  16. package/src/client/actions/ChannelDelete.js +39 -39
  17. package/src/client/actions/ChannelUpdate.js +43 -43
  18. package/src/client/actions/GuildAuditLogEntryCreate.js +29 -29
  19. package/src/client/actions/GuildBanAdd.js +20 -20
  20. package/src/client/actions/GuildBanRemove.js +25 -25
  21. package/src/client/actions/GuildChannelsPositionUpdate.js +21 -21
  22. package/src/client/actions/GuildDelete.js +65 -65
  23. package/src/client/actions/GuildEmojiCreate.js +20 -20
  24. package/src/client/actions/GuildEmojiDelete.js +21 -21
  25. package/src/client/actions/GuildEmojiUpdate.js +20 -20
  26. package/src/client/actions/GuildEmojisUpdate.js +34 -34
  27. package/src/client/actions/GuildIntegrationsUpdate.js +19 -19
  28. package/src/client/actions/GuildMemberRemove.js +33 -33
  29. package/src/client/actions/GuildMemberUpdate.js +44 -44
  30. package/src/client/actions/GuildRoleCreate.js +25 -25
  31. package/src/client/actions/GuildRoleDelete.js +31 -31
  32. package/src/client/actions/GuildRoleUpdate.js +39 -39
  33. package/src/client/actions/GuildRolesPositionUpdate.js +21 -21
  34. package/src/client/actions/GuildScheduledEventCreate.js +27 -27
  35. package/src/client/actions/GuildScheduledEventDelete.js +31 -31
  36. package/src/client/actions/GuildScheduledEventUpdate.js +30 -30
  37. package/src/client/actions/GuildScheduledEventUserAdd.js +32 -32
  38. package/src/client/actions/GuildScheduledEventUserRemove.js +32 -32
  39. package/src/client/actions/GuildStickerCreate.js +20 -20
  40. package/src/client/actions/GuildStickerDelete.js +21 -21
  41. package/src/client/actions/GuildStickerUpdate.js +20 -20
  42. package/src/client/actions/GuildStickersUpdate.js +34 -34
  43. package/src/client/actions/GuildUpdate.js +33 -33
  44. package/src/client/actions/InviteCreate.js +28 -28
  45. package/src/client/actions/InviteDelete.js +30 -30
  46. package/src/client/actions/MessageCreate.js +50 -46
  47. package/src/client/actions/MessageDelete.js +32 -32
  48. package/src/client/actions/MessageDeleteBulk.js +46 -46
  49. package/src/client/actions/MessagePollVoteAdd.js +33 -0
  50. package/src/client/actions/MessagePollVoteRemove.js +33 -0
  51. package/src/client/actions/MessageReactionAdd.js +68 -56
  52. package/src/client/actions/MessageReactionRemove.js +50 -45
  53. package/src/client/actions/MessageReactionRemoveAll.js +33 -33
  54. package/src/client/actions/MessageReactionRemoveEmoji.js +28 -28
  55. package/src/client/actions/MessageUpdate.js +26 -26
  56. package/src/client/actions/PresenceUpdate.js +50 -46
  57. package/src/client/actions/StageInstanceCreate.js +28 -28
  58. package/src/client/actions/StageInstanceDelete.js +33 -33
  59. package/src/client/actions/StageInstanceUpdate.js +30 -30
  60. package/src/client/actions/ThreadCreate.js +24 -24
  61. package/src/client/actions/ThreadDelete.js +32 -32
  62. package/src/client/actions/ThreadListSync.js +59 -59
  63. package/src/client/actions/ThreadMemberUpdate.js +30 -30
  64. package/src/client/actions/ThreadMembersUpdate.js +34 -34
  65. package/src/client/actions/TypingStart.js +29 -29
  66. package/src/client/actions/UserUpdate.js +35 -35
  67. package/src/client/actions/VoiceStateUpdate.js +50 -57
  68. package/src/client/actions/WebhooksUpdate.js +20 -20
  69. package/src/client/voice/ClientVoiceManager.js +151 -51
  70. package/src/client/voice/VoiceConnection.js +1249 -0
  71. package/src/client/voice/dispatcher/AnnexBDispatcher.js +120 -0
  72. package/src/client/voice/dispatcher/AudioDispatcher.js +145 -0
  73. package/src/client/voice/dispatcher/BaseDispatcher.js +459 -0
  74. package/src/client/voice/dispatcher/VPxDispatcher.js +54 -0
  75. package/src/client/voice/dispatcher/VideoDispatcher.js +68 -0
  76. package/src/client/voice/networking/VoiceUDPClient.js +173 -0
  77. package/src/client/voice/networking/VoiceWebSocket.js +286 -0
  78. package/src/client/voice/player/MediaPlayer.js +321 -0
  79. package/src/client/voice/player/processing/AnnexBNalSplitter.js +244 -0
  80. package/src/client/voice/player/processing/IvfSplitter.js +106 -0
  81. package/src/client/voice/player/processing/PCMInsertSilence.js +37 -0
  82. package/src/client/voice/receiver/PacketHandler.js +260 -0
  83. package/src/client/voice/receiver/Receiver.js +96 -0
  84. package/src/client/voice/receiver/Recorder.js +173 -0
  85. package/src/client/voice/util/Function.js +116 -0
  86. package/src/client/voice/util/PlayInterface.js +122 -0
  87. package/src/client/voice/util/Secretbox.js +64 -0
  88. package/src/client/voice/util/Silence.js +16 -0
  89. package/src/client/voice/util/Socket.js +62 -0
  90. package/src/client/voice/util/VolumeInterface.js +104 -0
  91. package/src/client/websocket/WebSocketManager.js +392 -392
  92. package/src/client/websocket/WebSocketShard.js +907 -906
  93. package/src/client/websocket/handlers/APPLICATION_COMMAND_CREATE.js +18 -18
  94. package/src/client/websocket/handlers/APPLICATION_COMMAND_DELETE.js +20 -20
  95. package/src/client/websocket/handlers/APPLICATION_COMMAND_PERMISSIONS_UPDATE.js +5 -5
  96. package/src/client/websocket/handlers/APPLICATION_COMMAND_UPDATE.js +20 -20
  97. package/src/client/websocket/handlers/AUTO_MODERATION_ACTION_EXECUTION.js +5 -5
  98. package/src/client/websocket/handlers/AUTO_MODERATION_RULE_CREATE.js +5 -5
  99. package/src/client/websocket/handlers/AUTO_MODERATION_RULE_DELETE.js +5 -5
  100. package/src/client/websocket/handlers/AUTO_MODERATION_RULE_UPDATE.js +5 -5
  101. package/src/client/websocket/handlers/CALL_CREATE.js +14 -14
  102. package/src/client/websocket/handlers/CALL_DELETE.js +11 -11
  103. package/src/client/websocket/handlers/CALL_UPDATE.js +11 -11
  104. package/src/client/websocket/handlers/CHANNEL_CREATE.js +5 -5
  105. package/src/client/websocket/handlers/CHANNEL_DELETE.js +5 -5
  106. package/src/client/websocket/handlers/CHANNEL_PINS_UPDATE.js +22 -22
  107. package/src/client/websocket/handlers/CHANNEL_RECIPIENT_ADD.js +19 -19
  108. package/src/client/websocket/handlers/CHANNEL_RECIPIENT_REMOVE.js +16 -16
  109. package/src/client/websocket/handlers/CHANNEL_UPDATE.js +16 -16
  110. package/src/client/websocket/handlers/GUILD_AUDIT_LOG_ENTRY_CREATE.js +5 -5
  111. package/src/client/websocket/handlers/GUILD_BAN_ADD.js +5 -5
  112. package/src/client/websocket/handlers/GUILD_BAN_REMOVE.js +5 -5
  113. package/src/client/websocket/handlers/GUILD_CREATE.js +52 -53
  114. package/src/client/websocket/handlers/GUILD_DELETE.js +5 -5
  115. package/src/client/websocket/handlers/GUILD_EMOJIS_UPDATE.js +5 -5
  116. package/src/client/websocket/handlers/GUILD_INTEGRATIONS_UPDATE.js +5 -5
  117. package/src/client/websocket/handlers/GUILD_MEMBERS_CHUNK.js +39 -39
  118. package/src/client/websocket/handlers/GUILD_MEMBER_ADD.js +20 -20
  119. package/src/client/websocket/handlers/GUILD_MEMBER_REMOVE.js +5 -5
  120. package/src/client/websocket/handlers/GUILD_MEMBER_UPDATE.js +5 -5
  121. package/src/client/websocket/handlers/GUILD_ROLE_CREATE.js +5 -5
  122. package/src/client/websocket/handlers/GUILD_ROLE_DELETE.js +5 -5
  123. package/src/client/websocket/handlers/GUILD_ROLE_UPDATE.js +5 -5
  124. package/src/client/websocket/handlers/GUILD_SCHEDULED_EVENT_CREATE.js +5 -5
  125. package/src/client/websocket/handlers/GUILD_SCHEDULED_EVENT_DELETE.js +5 -5
  126. package/src/client/websocket/handlers/GUILD_SCHEDULED_EVENT_UPDATE.js +5 -5
  127. package/src/client/websocket/handlers/GUILD_SCHEDULED_EVENT_USER_ADD.js +5 -5
  128. package/src/client/websocket/handlers/GUILD_SCHEDULED_EVENT_USER_REMOVE.js +5 -5
  129. package/src/client/websocket/handlers/GUILD_STICKERS_UPDATE.js +5 -5
  130. package/src/client/websocket/handlers/GUILD_UPDATE.js +5 -5
  131. package/src/client/websocket/handlers/INTERACTION_MODAL_CREATE.js +12 -12
  132. package/src/client/websocket/handlers/INVITE_CREATE.js +5 -5
  133. package/src/client/websocket/handlers/INVITE_DELETE.js +5 -5
  134. package/src/client/websocket/handlers/MESSAGE_CREATE.js +5 -5
  135. package/src/client/websocket/handlers/MESSAGE_DELETE.js +5 -5
  136. package/src/client/websocket/handlers/MESSAGE_DELETE_BULK.js +5 -5
  137. package/src/client/websocket/handlers/MESSAGE_POLL_VOTE_ADD.js +5 -0
  138. package/src/client/websocket/handlers/MESSAGE_POLL_VOTE_REMOVE.js +5 -0
  139. package/src/client/websocket/handlers/MESSAGE_REACTION_ADD.js +5 -5
  140. package/src/client/websocket/handlers/MESSAGE_REACTION_REMOVE.js +5 -5
  141. package/src/client/websocket/handlers/MESSAGE_REACTION_REMOVE_ALL.js +5 -5
  142. package/src/client/websocket/handlers/MESSAGE_REACTION_REMOVE_EMOJI.js +5 -5
  143. package/src/client/websocket/handlers/MESSAGE_UPDATE.js +16 -16
  144. package/src/client/websocket/handlers/PRESENCE_UPDATE.js +5 -5
  145. package/src/client/websocket/handlers/READY.js +121 -80
  146. package/src/client/websocket/handlers/RELATIONSHIP_ADD.js +19 -19
  147. package/src/client/websocket/handlers/RELATIONSHIP_REMOVE.js +17 -17
  148. package/src/client/websocket/handlers/RELATIONSHIP_UPDATE.js +41 -41
  149. package/src/client/websocket/handlers/RESUMED.js +14 -14
  150. package/src/client/websocket/handlers/STAGE_INSTANCE_CREATE.js +5 -5
  151. package/src/client/websocket/handlers/STAGE_INSTANCE_DELETE.js +5 -5
  152. package/src/client/websocket/handlers/STAGE_INSTANCE_UPDATE.js +5 -5
  153. package/src/client/websocket/handlers/THREAD_CREATE.js +5 -5
  154. package/src/client/websocket/handlers/THREAD_DELETE.js +5 -5
  155. package/src/client/websocket/handlers/THREAD_LIST_SYNC.js +5 -5
  156. package/src/client/websocket/handlers/THREAD_MEMBERS_UPDATE.js +5 -5
  157. package/src/client/websocket/handlers/THREAD_MEMBER_UPDATE.js +5 -5
  158. package/src/client/websocket/handlers/THREAD_UPDATE.js +16 -16
  159. package/src/client/websocket/handlers/TYPING_START.js +5 -5
  160. package/src/client/websocket/handlers/USER_GUILD_SETTINGS_UPDATE.js +6 -6
  161. package/src/client/websocket/handlers/USER_NOTE_UPDATE.js +5 -5
  162. package/src/client/websocket/handlers/USER_REQUIRED_ACTION_UPDATE.js +78 -78
  163. package/src/client/websocket/handlers/USER_SETTINGS_UPDATE.js +5 -5
  164. package/src/client/websocket/handlers/USER_UPDATE.js +5 -5
  165. package/src/client/websocket/handlers/VOICE_CHANNEL_EFFECT_SEND.js +16 -0
  166. package/src/client/websocket/handlers/VOICE_CHANNEL_STATUS_UPDATE.js +12 -12
  167. package/src/client/websocket/handlers/VOICE_SERVER_UPDATE.js +6 -6
  168. package/src/client/websocket/handlers/VOICE_STATE_UPDATE.js +5 -5
  169. package/src/client/websocket/handlers/WEBHOOKS_UPDATE.js +5 -5
  170. package/src/client/websocket/handlers/index.js +84 -81
  171. package/src/errors/DJSError.js +61 -61
  172. package/src/errors/Messages.js +217 -182
  173. package/src/errors/index.js +4 -4
  174. package/src/index.js +172 -158
  175. package/src/managers/ApplicationCommandManager.js +264 -264
  176. package/src/managers/ApplicationCommandPermissionsManager.js +417 -417
  177. package/src/managers/AutoModerationRuleManager.js +296 -296
  178. package/src/managers/BaseGuildEmojiManager.js +80 -80
  179. package/src/managers/BaseManager.js +19 -19
  180. package/src/managers/BillingManager.js +66 -66
  181. package/src/managers/CachedManager.js +71 -71
  182. package/src/managers/ChannelManager.js +148 -138
  183. package/src/managers/ClientUserSettingManager.js +372 -372
  184. package/src/managers/DataManager.js +61 -61
  185. package/src/managers/GuildBanManager.js +250 -204
  186. package/src/managers/GuildChannelManager.js +488 -504
  187. package/src/managers/GuildEmojiManager.js +171 -171
  188. package/src/managers/GuildEmojiRoleManager.js +118 -118
  189. package/src/managers/GuildForumThreadManager.js +108 -108
  190. package/src/managers/GuildInviteManager.js +213 -213
  191. package/src/managers/GuildManager.js +338 -304
  192. package/src/managers/GuildMemberManager.js +599 -593
  193. package/src/managers/GuildMemberRoleManager.js +195 -191
  194. package/src/managers/GuildScheduledEventManager.js +314 -296
  195. package/src/managers/GuildSettingManager.js +155 -155
  196. package/src/managers/GuildStickerManager.js +179 -179
  197. package/src/managers/GuildTextThreadManager.js +98 -98
  198. package/src/managers/InteractionManager.js +39 -39
  199. package/src/managers/MessageManager.js +423 -391
  200. package/src/managers/PermissionOverwriteManager.js +164 -166
  201. package/src/managers/PresenceManager.js +71 -58
  202. package/src/managers/ReactionManager.js +67 -67
  203. package/src/managers/ReactionUserManager.js +73 -71
  204. package/src/managers/RelationshipManager.js +278 -265
  205. package/src/managers/RoleManager.js +448 -352
  206. package/src/managers/SessionManager.js +66 -0
  207. package/src/managers/StageInstanceManager.js +162 -162
  208. package/src/managers/ThreadManager.js +175 -174
  209. package/src/managers/ThreadMemberManager.js +186 -186
  210. package/src/managers/UserManager.js +136 -146
  211. package/src/managers/UserNoteManager.js +53 -53
  212. package/src/managers/VoiceStateManager.js +59 -37
  213. package/src/rest/APIRequest.js +154 -154
  214. package/src/rest/APIRouter.js +53 -53
  215. package/src/rest/DiscordAPIError.js +119 -104
  216. package/src/rest/HTTPError.js +62 -62
  217. package/src/rest/RESTManager.js +67 -62
  218. package/src/rest/RateLimitError.js +55 -55
  219. package/src/rest/RequestHandler.js +466 -444
  220. package/src/sharding/Shard.js +444 -443
  221. package/src/sharding/ShardClientUtil.js +279 -275
  222. package/src/sharding/ShardingManager.js +319 -318
  223. package/src/structures/AnonymousGuild.js +98 -98
  224. package/src/structures/ApplicationCommand.js +593 -593
  225. package/src/structures/ApplicationRoleConnectionMetadata.js +48 -48
  226. package/src/structures/AutoModerationActionExecution.js +89 -89
  227. package/src/structures/AutoModerationRule.js +294 -294
  228. package/src/structures/AutocompleteInteraction.js +107 -107
  229. package/src/structures/Base.js +43 -43
  230. package/src/structures/BaseCommandInteraction.js +211 -211
  231. package/src/structures/BaseGuild.js +116 -116
  232. package/src/structures/BaseGuildEmoji.js +56 -56
  233. package/src/structures/BaseGuildTextChannel.js +191 -191
  234. package/src/structures/BaseGuildVoiceChannel.js +241 -241
  235. package/src/structures/BaseMessageComponent.js +181 -114
  236. package/src/structures/ButtonInteraction.js +11 -11
  237. package/src/structures/CallState.js +63 -63
  238. package/src/structures/CategoryChannel.js +85 -85
  239. package/src/structures/Channel.js +284 -270
  240. package/src/structures/ClientPresence.js +77 -88
  241. package/src/structures/ClientUser.js +479 -450
  242. package/src/structures/CommandInteraction.js +41 -41
  243. package/src/structures/CommandInteractionOptionResolver.js +276 -276
  244. package/src/structures/ContainerComponent.js +68 -0
  245. package/src/structures/ContextMenuInteraction.js +65 -65
  246. package/src/structures/DMChannel.js +219 -217
  247. package/src/structures/DirectoryChannel.js +20 -20
  248. package/src/structures/Emoji.js +148 -148
  249. package/src/structures/FileComponent.js +49 -0
  250. package/src/structures/ForumChannel.js +31 -261
  251. package/src/structures/GroupDMChannel.js +394 -387
  252. package/src/structures/Guild.js +1643 -1608
  253. package/src/structures/GuildAuditLogs.js +746 -729
  254. package/src/structures/GuildBan.js +59 -59
  255. package/src/structures/GuildBoost.js +108 -108
  256. package/src/structures/GuildChannel.js +470 -468
  257. package/src/structures/GuildEmoji.js +161 -161
  258. package/src/structures/GuildMember.js +636 -568
  259. package/src/structures/GuildPreview.js +191 -191
  260. package/src/structures/GuildPreviewEmoji.js +27 -27
  261. package/src/structures/GuildScheduledEvent.js +536 -441
  262. package/src/structures/GuildTemplate.js +236 -236
  263. package/src/structures/Integration.js +188 -188
  264. package/src/structures/IntegrationApplication.js +96 -96
  265. package/src/structures/Interaction.js +290 -290
  266. package/src/structures/InteractionCollector.js +248 -248
  267. package/src/structures/InteractionWebhook.js +43 -43
  268. package/src/structures/Invite.js +358 -358
  269. package/src/structures/InviteGuild.js +23 -23
  270. package/src/structures/InviteStageInstance.js +86 -86
  271. package/src/structures/MediaChannel.js +11 -0
  272. package/src/structures/MediaGalleryComponent.js +41 -0
  273. package/src/structures/MediaGalleryItem.js +47 -0
  274. package/src/structures/Message.js +1252 -1236
  275. package/src/structures/MessageActionRow.js +105 -103
  276. package/src/structures/MessageAttachment.js +216 -204
  277. package/src/structures/MessageButton.js +166 -165
  278. package/src/structures/MessageCollector.js +146 -146
  279. package/src/structures/MessageComponentInteraction.js +120 -120
  280. package/src/structures/MessageContextMenuInteraction.js +20 -20
  281. package/src/structures/MessageEmbed.js +596 -586
  282. package/src/structures/MessageMentions.js +273 -273
  283. package/src/structures/MessagePayload.js +354 -316
  284. package/src/structures/MessageReaction.js +181 -171
  285. package/src/structures/MessageSelectMenu.js +141 -140
  286. package/src/structures/Modal.js +161 -174
  287. package/src/structures/ModalSubmitFieldsResolver.js +53 -53
  288. package/src/structures/ModalSubmitInteraction.js +119 -119
  289. package/src/structures/NewsChannel.js +32 -32
  290. package/src/structures/OAuth2Guild.js +28 -28
  291. package/src/structures/PermissionOverwrites.js +198 -196
  292. package/src/structures/Poll.js +108 -0
  293. package/src/structures/PollAnswer.js +88 -0
  294. package/src/structures/Presence.js +1105 -443
  295. package/src/structures/ReactionCollector.js +229 -229
  296. package/src/structures/ReactionEmoji.js +31 -31
  297. package/src/structures/Role.js +590 -531
  298. package/src/structures/SectionComponent.js +48 -0
  299. package/src/structures/SelectMenuInteraction.js +21 -21
  300. package/src/structures/SeparatorComponent.js +48 -0
  301. package/src/structures/Session.js +81 -0
  302. package/src/structures/StageChannel.js +104 -104
  303. package/src/structures/StageInstance.js +208 -208
  304. package/src/structures/Sticker.js +310 -310
  305. package/src/structures/StickerPack.js +95 -95
  306. package/src/structures/StoreChannel.js +56 -56
  307. package/src/structures/Team.js +118 -118
  308. package/src/structures/TeamMember.js +80 -71
  309. package/src/structures/TextChannel.js +33 -33
  310. package/src/structures/TextDisplayComponent.js +40 -0
  311. package/src/structures/TextInputComponent.js +132 -131
  312. package/src/structures/ThreadChannel.js +605 -607
  313. package/src/structures/ThreadMember.js +105 -105
  314. package/src/structures/ThreadOnlyChannel.js +249 -0
  315. package/src/structures/ThumbnailComponent.js +57 -0
  316. package/src/structures/Typing.js +74 -74
  317. package/src/structures/UnfurledMediaItem.js +29 -0
  318. package/src/structures/User.js +640 -509
  319. package/src/structures/UserContextMenuInteraction.js +29 -29
  320. package/src/structures/VoiceChannel.js +110 -110
  321. package/src/structures/VoiceChannelEffect.js +69 -0
  322. package/src/structures/VoiceRegion.js +53 -53
  323. package/src/structures/VoiceState.js +354 -341
  324. package/src/structures/WebEmbed.js +373 -373
  325. package/src/structures/Webhook.js +478 -467
  326. package/src/structures/WelcomeChannel.js +60 -60
  327. package/src/structures/WelcomeScreen.js +48 -48
  328. package/src/structures/Widget.js +87 -87
  329. package/src/structures/WidgetMember.js +99 -99
  330. package/src/structures/interfaces/Application.js +825 -313
  331. package/src/structures/interfaces/Collector.js +300 -300
  332. package/src/structures/interfaces/InteractionResponses.js +313 -313
  333. package/src/structures/interfaces/TextBasedChannel.js +759 -721
  334. package/src/util/APITypes.js +59 -0
  335. package/src/util/ActivityFlags.js +44 -44
  336. package/src/util/ApplicationFlags.js +76 -76
  337. package/src/util/AttachmentFlags.js +38 -38
  338. package/src/util/BitField.js +170 -170
  339. package/src/util/ChannelFlags.js +45 -45
  340. package/src/util/Constants.js +1914 -1760
  341. package/src/util/DataResolver.js +146 -145
  342. package/src/util/Formatters.js +228 -228
  343. package/src/util/GuildMemberFlags.js +43 -43
  344. package/src/util/Intents.js +74 -74
  345. package/src/util/InviteFlags.js +34 -29
  346. package/src/util/LimitedCollection.js +131 -131
  347. package/src/util/MessageFlags.js +63 -54
  348. package/src/util/Options.js +358 -342
  349. package/src/util/Permissions.js +202 -192
  350. package/src/util/PremiumUsageFlags.js +31 -31
  351. package/src/util/PurchasedFlags.js +33 -33
  352. package/src/util/RemoteAuth.js +382 -379
  353. package/src/util/RoleFlags.js +37 -37
  354. package/src/util/SnowflakeUtil.js +92 -92
  355. package/src/util/Speaking.js +33 -0
  356. package/src/util/Sweepers.js +466 -466
  357. package/src/util/SystemChannelFlags.js +55 -55
  358. package/src/util/ThreadMemberFlags.js +30 -30
  359. package/src/util/UserFlags.js +104 -104
  360. package/src/util/Util.js +1048 -803
  361. package/typings/enums.d.ts +439 -291
  362. package/typings/index.d.ts +8247 -7390
  363. package/typings/rawDataTypes.d.ts +403 -342
  364. package/src/structures/RichPresence.js +0 -702
@@ -1,531 +1,590 @@
1
- 'use strict';
2
-
3
- const process = require('node:process');
4
- const Base = require('./Base');
5
- const { Error } = require('../errors');
6
- const Permissions = require('../util/Permissions');
7
- const RoleFlags = require('../util/RoleFlags');
8
- const SnowflakeUtil = require('../util/SnowflakeUtil');
9
-
10
- let deprecationEmittedForComparePositions = false;
11
-
12
- /**
13
- * @type {WeakSet<Role>}
14
- * @private
15
- * @internal
16
- */
17
- const deletedRoles = new WeakSet();
18
- let deprecationEmittedForDeleted = false;
19
-
20
- /**
21
- * Represents a role on Discord.
22
- * @extends {Base}
23
- */
24
- class Role extends Base {
25
- constructor(client, data, guild) {
26
- super(client);
27
-
28
- /**
29
- * The guild that the role belongs to
30
- * @type {Guild}
31
- */
32
- this.guild = guild;
33
-
34
- /**
35
- * The icon hash of the role
36
- * @type {?string}
37
- */
38
- this.icon = null;
39
-
40
- /**
41
- * The unicode emoji for the role
42
- * @type {?string}
43
- */
44
- this.unicodeEmoji = null;
45
-
46
- if (data) this._patch(data);
47
- }
48
-
49
- _patch(data) {
50
- /**
51
- * The role's id (unique to the guild it is part of)
52
- * @type {Snowflake}
53
- */
54
- this.id = data.id;
55
- if ('name' in data) {
56
- /**
57
- * The name of the role
58
- * @type {string}
59
- */
60
- this.name = data.name;
61
- }
62
-
63
- if ('color' in data) {
64
- /**
65
- * The base 10 color of the role
66
- * @type {number}
67
- */
68
- this.color = data.color;
69
- }
70
-
71
- if ('hoist' in data) {
72
- /**
73
- * If true, users that are part of this role will appear in a separate category in the users list
74
- * @type {boolean}
75
- */
76
- this.hoist = data.hoist;
77
- }
78
-
79
- if ('position' in data) {
80
- /**
81
- * The raw position of the role from the API
82
- * @type {number}
83
- */
84
- this.rawPosition = data.position;
85
- }
86
-
87
- if ('permissions' in data) {
88
- /**
89
- * The permissions of the role
90
- * @type {Readonly<Permissions>}
91
- */
92
- this.permissions = new Permissions(BigInt(data.permissions)).freeze();
93
- }
94
-
95
- if ('managed' in data) {
96
- /**
97
- * Whether or not the role is managed by an external service
98
- * @type {boolean}
99
- */
100
- this.managed = data.managed;
101
- }
102
-
103
- if ('mentionable' in data) {
104
- /**
105
- * Whether or not the role can be mentioned by anyone
106
- * @type {boolean}
107
- */
108
- this.mentionable = data.mentionable;
109
- }
110
-
111
- if ('icon' in data) this.icon = data.icon;
112
-
113
- if ('unicode_emoji' in data) this.unicodeEmoji = data.unicode_emoji;
114
-
115
- /**
116
- * The tags this role has
117
- * @type {?Object}
118
- * @property {Snowflake} [botId] The id of the bot this role belongs to
119
- * @property {Snowflake|string} [integrationId] The id of the integration this role belongs to
120
- * @property {true} [premiumSubscriberRole] Whether this is the guild's premium subscription role
121
- * @property {Snowflake} [subscriptionListingId] The id of this role's subscription SKU and listing
122
- * @property {true} [availableForPurchase] Whether this role is available for purchase
123
- * @property {true} [guildConnections] Whether this role is a guild's linked role
124
- */
125
- this.tags = data.tags ? {} : null;
126
- if (data.tags) {
127
- if ('bot_id' in data.tags) {
128
- this.tags.botId = data.tags.bot_id;
129
- }
130
- if ('integration_id' in data.tags) {
131
- this.tags.integrationId = data.tags.integration_id;
132
- }
133
- if ('premium_subscriber' in data.tags) {
134
- this.tags.premiumSubscriberRole = true;
135
- }
136
- if ('subscription_listing_id' in data.tags) {
137
- this.tags.subscriptionListingId = data.tags.subscription_listing_id;
138
- }
139
- if ('available_for_purchase' in data.tags) {
140
- this.tags.availableForPurchase = true;
141
- }
142
- if ('guild_connections' in data.tags) {
143
- this.tags.guildConnections = true;
144
- }
145
- }
146
-
147
- if ('flags' in data) {
148
- /**
149
- * The flags of this role
150
- * @type {Readonly<RoleFlags>}
151
- */
152
- this.flags = new RoleFlags(data.flags).freeze();
153
- } else {
154
- this.flags ??= new RoleFlags().freeze();
155
- }
156
- }
157
-
158
- /**
159
- * The timestamp the role was created at
160
- * @type {number}
161
- * @readonly
162
- */
163
- get createdTimestamp() {
164
- return SnowflakeUtil.timestampFrom(this.id);
165
- }
166
-
167
- /**
168
- * The time the role was created at
169
- * @type {Date}
170
- * @readonly
171
- */
172
- get createdAt() {
173
- return new Date(this.createdTimestamp);
174
- }
175
-
176
- /**
177
- * Whether or not the role has been deleted
178
- * @type {boolean}
179
- * @deprecated This will be removed in the next major version, see https://github.com/discordjs/discord.js/issues/7091
180
- */
181
- get deleted() {
182
- if (!deprecationEmittedForDeleted) {
183
- deprecationEmittedForDeleted = true;
184
- process.emitWarning(
185
- 'Role#deleted is deprecated, see https://github.com/discordjs/discord.js/issues/7091.',
186
- 'DeprecationWarning',
187
- );
188
- }
189
-
190
- return deletedRoles.has(this);
191
- }
192
-
193
- set deleted(value) {
194
- if (!deprecationEmittedForDeleted) {
195
- deprecationEmittedForDeleted = true;
196
- process.emitWarning(
197
- 'Role#deleted is deprecated, see https://github.com/discordjs/discord.js/issues/7091.',
198
- 'DeprecationWarning',
199
- );
200
- }
201
-
202
- if (value) deletedRoles.add(this);
203
- else deletedRoles.delete(this);
204
- }
205
-
206
- /**
207
- * The hexadecimal version of the role color, with a leading hashtag
208
- * @type {string}
209
- * @readonly
210
- */
211
- get hexColor() {
212
- return `#${this.color.toString(16).padStart(6, '0')}`;
213
- }
214
-
215
- /**
216
- * The cached guild members that have this role
217
- * @type {Collection<Snowflake, GuildMember>}
218
- * @readonly
219
- */
220
- get members() {
221
- return this.guild.members.cache.filter(m => m.roles.cache.has(this.id));
222
- }
223
-
224
- /**
225
- * Whether the role is editable by the client user
226
- * @type {boolean}
227
- * @readonly
228
- */
229
- get editable() {
230
- if (this.managed) return false;
231
- const clientMember = this.guild.members.resolve(this.client.user);
232
- if (!clientMember.permissions.has(Permissions.FLAGS.MANAGE_ROLES)) return false;
233
- return clientMember.roles.highest.comparePositionTo(this) > 0;
234
- }
235
-
236
- /**
237
- * The position of the role in the role manager
238
- * @type {number}
239
- * @readonly
240
- */
241
- get position() {
242
- let count = 0;
243
- for (const role of this.guild.roles.cache.values()) {
244
- if (this.rawPosition > role.rawPosition) count++;
245
- else if (this.rawPosition === role.rawPosition && BigInt(this.id) < BigInt(role.id)) count++;
246
- }
247
-
248
- return count;
249
- }
250
-
251
- /**
252
- * Compares this role's position to another role's.
253
- * @param {RoleResolvable} role Role to compare to this one
254
- * @returns {number} Negative number if this role's position is lower (other role's is higher),
255
- * positive number if this one is higher (other's is lower), 0 if equal
256
- * @example
257
- * // Compare the position of a role to another
258
- * const roleCompare = role.comparePositionTo(otherRole);
259
- * if (roleCompare >= 1) console.log(`${role.name} is higher than ${otherRole.name}`);
260
- */
261
- comparePositionTo(role) {
262
- return this.guild.roles.comparePositions(this, role);
263
- }
264
-
265
- /**
266
- * The data for a role.
267
- * @typedef {Object} RoleData
268
- * @property {string} [name] The name of the role
269
- * @property {ColorResolvable} [color] The color of the role, either a hex string or a base 10 number
270
- * @property {boolean} [hoist] Whether or not the role should be hoisted
271
- * @property {number} [position] The position of the role
272
- * @property {PermissionResolvable} [permissions] The permissions of the role
273
- * @property {boolean} [mentionable] Whether or not the role should be mentionable
274
- * @property {?(BufferResolvable|Base64Resolvable|EmojiResolvable)} [icon] The icon for the role
275
- * <warn>The `EmojiResolvable` should belong to the same guild as the role.
276
- * If not, pass the emoji's URL directly</warn>
277
- * @property {?string} [unicodeEmoji] The unicode emoji for the role
278
- */
279
-
280
- /**
281
- * Edits the role.
282
- * @param {RoleData} data The new data for the role
283
- * @param {string} [reason] Reason for editing this role
284
- * @returns {Promise<Role>}
285
- * @example
286
- * // Edit a role
287
- * role.edit({ name: 'new role' })
288
- * .then(updated => console.log(`Edited role name to ${updated.name}`))
289
- * .catch(console.error);
290
- */
291
- edit(data, reason) {
292
- return this.guild.roles.edit(this, data, reason);
293
- }
294
-
295
- /**
296
- * Returns `channel.permissionsFor(role)`. Returns permissions for a role in a guild channel,
297
- * taking into account permission overwrites.
298
- * @param {GuildChannel|Snowflake} channel The guild channel to use as context
299
- * @param {boolean} [checkAdmin=true] Whether having `ADMINISTRATOR` will return all permissions
300
- * @returns {Readonly<Permissions>}
301
- */
302
- permissionsIn(channel, checkAdmin = true) {
303
- channel = this.guild.channels.resolve(channel);
304
- if (!channel) throw new Error('GUILD_CHANNEL_RESOLVE');
305
- return channel.rolePermissions(this, checkAdmin);
306
- }
307
-
308
- /**
309
- * Sets a new name for the role.
310
- * @param {string} name The new name of the role
311
- * @param {string} [reason] Reason for changing the role's name
312
- * @returns {Promise<Role>}
313
- * @example
314
- * // Set the name of the role
315
- * role.setName('new role')
316
- * .then(updated => console.log(`Updated role name to ${updated.name}`))
317
- * .catch(console.error);
318
- */
319
- setName(name, reason) {
320
- return this.edit({ name }, reason);
321
- }
322
-
323
- /**
324
- * Sets a new color for the role.
325
- * @param {ColorResolvable} color The color of the role
326
- * @param {string} [reason] Reason for changing the role's color
327
- * @returns {Promise<Role>}
328
- * @example
329
- * // Set the color of a role
330
- * role.setColor('#FF0000')
331
- * .then(updated => console.log(`Set color of role to ${updated.color}`))
332
- * .catch(console.error);
333
- */
334
- setColor(color, reason) {
335
- return this.edit({ color }, reason);
336
- }
337
-
338
- /**
339
- * Sets whether or not the role should be hoisted.
340
- * @param {boolean} [hoist=true] Whether or not to hoist the role
341
- * @param {string} [reason] Reason for setting whether or not the role should be hoisted
342
- * @returns {Promise<Role>}
343
- * @example
344
- * // Set the hoist of the role
345
- * role.setHoist(true)
346
- * .then(updated => console.log(`Role hoisted: ${updated.hoist}`))
347
- * .catch(console.error);
348
- */
349
- setHoist(hoist = true, reason) {
350
- return this.edit({ hoist }, reason);
351
- }
352
-
353
- /**
354
- * Sets the permissions of the role.
355
- * @param {PermissionResolvable} permissions The permissions of the role
356
- * @param {string} [reason] Reason for changing the role's permissions
357
- * @returns {Promise<Role>}
358
- * @example
359
- * // Set the permissions of the role
360
- * role.setPermissions([Permissions.FLAGS.KICK_MEMBERS, Permissions.FLAGS.BAN_MEMBERS])
361
- * .then(updated => console.log(`Updated permissions to ${updated.permissions.bitfield}`))
362
- * .catch(console.error);
363
- * @example
364
- * // Remove all permissions from a role
365
- * role.setPermissions(0n)
366
- * .then(updated => console.log(`Updated permissions to ${updated.permissions.bitfield}`))
367
- * .catch(console.error);
368
- */
369
- setPermissions(permissions, reason) {
370
- return this.edit({ permissions }, reason);
371
- }
372
-
373
- /**
374
- * Sets whether this role is mentionable.
375
- * @param {boolean} [mentionable=true] Whether this role should be mentionable
376
- * @param {string} [reason] Reason for setting whether or not this role should be mentionable
377
- * @returns {Promise<Role>}
378
- * @example
379
- * // Make the role mentionable
380
- * role.setMentionable(true)
381
- * .then(updated => console.log(`Role updated ${updated.name}`))
382
- * .catch(console.error);
383
- */
384
- setMentionable(mentionable = true, reason) {
385
- return this.edit({ mentionable }, reason);
386
- }
387
-
388
- /**
389
- * Sets a new icon for the role.
390
- * @param {?(BufferResolvable|Base64Resolvable|EmojiResolvable)} icon The icon for the role
391
- * <warn>The `EmojiResolvable` should belong to the same guild as the role.
392
- * If not, pass the emoji's URL directly</warn>
393
- * @param {string} [reason] Reason for changing the role's icon
394
- * @returns {Promise<Role>}
395
- */
396
- setIcon(icon, reason) {
397
- return this.edit({ icon }, reason);
398
- }
399
-
400
- /**
401
- * Sets a new unicode emoji for the role.
402
- * @param {?string} unicodeEmoji The new unicode emoji for the role
403
- * @param {string} [reason] Reason for changing the role's unicode emoji
404
- * @returns {Promise<Role>}
405
- * @example
406
- * // Set a new unicode emoji for the role
407
- * role.setUnicodeEmoji('🤖')
408
- * .then(updated => console.log(`Set unicode emoji for the role to ${updated.unicodeEmoji}`))
409
- * .catch(console.error);
410
- */
411
- setUnicodeEmoji(unicodeEmoji, reason) {
412
- return this.edit({ unicodeEmoji }, reason);
413
- }
414
-
415
- /**
416
- * Options used to set the position of a role.
417
- * @typedef {Object} SetRolePositionOptions
418
- * @property {boolean} [relative=false] Whether to change the position relative to its current value or not
419
- * @property {string} [reason] The reason for changing the position
420
- */
421
-
422
- /**
423
- * Sets the new position of the role.
424
- * @param {number} position The new position for the role
425
- * @param {SetRolePositionOptions} [options] Options for setting the position
426
- * @returns {Promise<Role>}
427
- * @example
428
- * // Set the position of the role
429
- * role.setPosition(1)
430
- * .then(updated => console.log(`Role position: ${updated.position}`))
431
- * .catch(console.error);
432
- */
433
- setPosition(position, options = {}) {
434
- return this.guild.roles.setPosition(this, position, options);
435
- }
436
-
437
- /**
438
- * Deletes the role.
439
- * @param {string} [reason] Reason for deleting this role
440
- * @returns {Promise<Role>}
441
- * @example
442
- * // Delete a role
443
- * role.delete('The role needed to go')
444
- * .then(deleted => console.log(`Deleted role ${deleted.name}`))
445
- * .catch(console.error);
446
- */
447
- async delete(reason) {
448
- await this.guild.roles.delete(this.id, reason);
449
- return this;
450
- }
451
-
452
- /**
453
- * A link to the role's icon
454
- * @param {StaticImageURLOptions} [options={}] Options for the image URL
455
- * @returns {?string}
456
- */
457
- iconURL({ format, size } = {}) {
458
- if (!this.icon) return null;
459
- return this.client.rest.cdn.RoleIcon(this.id, this.icon, format, size);
460
- }
461
-
462
- /**
463
- * Whether this role equals another role. It compares all properties, so for most operations
464
- * it is advisable to just compare `role.id === role2.id` as it is much faster and is often
465
- * what most users need.
466
- * @param {Role} role Role to compare with
467
- * @returns {boolean}
468
- */
469
- equals(role) {
470
- return (
471
- role &&
472
- this.id === role.id &&
473
- this.name === role.name &&
474
- this.color === role.color &&
475
- this.hoist === role.hoist &&
476
- this.position === role.position &&
477
- this.permissions.bitfield === role.permissions.bitfield &&
478
- this.managed === role.managed &&
479
- this.icon === role.icon &&
480
- this.unicodeEmoji === role.unicodeEmoji
481
- );
482
- }
483
-
484
- /**
485
- * When concatenated with a string, this automatically returns the role's mention instead of the Role object.
486
- * @returns {string}
487
- * @example
488
- * // Logs: Role: <@&123456789012345678>
489
- * console.log(`Role: ${role}`);
490
- */
491
- toString() {
492
- if (this.id === this.guild.id) return '@everyone';
493
- return `<@&${this.id}>`;
494
- }
495
-
496
- toJSON() {
497
- return {
498
- ...super.toJSON({ createdTimestamp: true }),
499
- permissions: this.permissions.toJSON(),
500
- };
501
- }
502
-
503
- /**
504
- * Compares the positions of two roles.
505
- * @param {Role} role1 First role to compare
506
- * @param {Role} role2 Second role to compare
507
- * @returns {number} Negative number if the first role's position is lower (second role's is higher),
508
- * positive number if the first's is higher (second's is lower), 0 if equal
509
- * @deprecated Use {@link RoleManager#comparePositions} instead.
510
- */
511
- static comparePositions(role1, role2) {
512
- if (!deprecationEmittedForComparePositions) {
513
- process.emitWarning(
514
- 'The Role.comparePositions method is deprecated. Use RoleManager#comparePositions instead.',
515
- 'DeprecationWarning',
516
- );
517
-
518
- deprecationEmittedForComparePositions = true;
519
- }
520
-
521
- return role1.guild.roles.comparePositions(role1, role2);
522
- }
523
- }
524
-
525
- exports.Role = Role;
526
- exports.deletedRoles = deletedRoles;
527
-
528
- /**
529
- * @external APIRole
530
- * @see {@link https://discord.com/developers/docs/topics/permissions#role-object}
531
- */
1
+ 'use strict';
2
+
3
+ const process = require('node:process');
4
+ const Base = require('./Base');
5
+ const { Error } = require('../errors');
6
+ const Permissions = require('../util/Permissions');
7
+ const RoleFlags = require('../util/RoleFlags');
8
+ const SnowflakeUtil = require('../util/SnowflakeUtil');
9
+
10
+ let deprecationEmittedForComparePositions = false;
11
+
12
+ /**
13
+ * @type {WeakSet<Role>}
14
+ * @private
15
+ * @internal
16
+ */
17
+ const deletedRoles = new WeakSet();
18
+ let deprecationEmittedForDeleted = false;
19
+
20
+ /**
21
+ * Represents a role on Discord.
22
+ * @extends {Base}
23
+ */
24
+ class Role extends Base {
25
+ constructor(client, data, guild) {
26
+ super(client);
27
+
28
+ /**
29
+ * The guild that the role belongs to
30
+ * @type {Guild}
31
+ */
32
+ this.guild = guild;
33
+
34
+ /**
35
+ * The icon hash of the role
36
+ * @type {?string}
37
+ */
38
+ this.icon = null;
39
+
40
+ /**
41
+ * The unicode emoji for the role
42
+ * @type {?string}
43
+ */
44
+ this.unicodeEmoji = null;
45
+
46
+ if (data) this._patch(data);
47
+ }
48
+
49
+ _patch(data) {
50
+ /**
51
+ * The role's id (unique to the guild it is part of)
52
+ * @type {Snowflake}
53
+ */
54
+ this.id = data.id;
55
+ if ('name' in data) {
56
+ /**
57
+ * The name of the role
58
+ * @type {string}
59
+ */
60
+ this.name = data.name;
61
+ }
62
+
63
+ if ('color' in data) {
64
+ /**
65
+ * The base 10 color of the role
66
+ * @type {number}
67
+ * @deprecated Use {@link Role#colors} instead.
68
+ */
69
+ this.color = data.color;
70
+ }
71
+
72
+ /**
73
+ * @typedef {Object} RoleColors
74
+ * @property {number} primaryColor The primary color of the role
75
+ * @property {?number} secondaryColor The secondary color of the role.
76
+ * This will make the role a gradient between the other provided colors
77
+ * @property {?number} tertiaryColor The tertiary color of the role.
78
+ * When sending `tertiaryColor` the API enforces the role color to be a holographic style
79
+ * with values of `primaryColor = 11127295`, `secondaryColor = 16759788`, and `tertiaryColor = 16761760`.
80
+ * These values are available as a constant: `Constants.HolographicStyle`
81
+ */
82
+
83
+ if ('colors' in data) {
84
+ /**
85
+ * The colors of the role
86
+ *
87
+ * @type {RoleColors}
88
+ */
89
+ this.colors = {
90
+ primaryColor: data.colors.primary_color,
91
+ secondaryColor: data.colors.secondary_color,
92
+ tertiaryColor: data.colors.tertiary_color,
93
+ };
94
+ }
95
+
96
+ if ('hoist' in data) {
97
+ /**
98
+ * If true, users that are part of this role will appear in a separate category in the users list
99
+ * @type {boolean}
100
+ */
101
+ this.hoist = data.hoist;
102
+ }
103
+
104
+ if ('position' in data) {
105
+ /**
106
+ * The raw position of the role from the API
107
+ * @type {number}
108
+ */
109
+ this.rawPosition = data.position;
110
+ }
111
+
112
+ if ('permissions' in data) {
113
+ /**
114
+ * The permissions of the role
115
+ * @type {Readonly<Permissions>}
116
+ */
117
+ this.permissions = new Permissions(BigInt(data.permissions)).freeze();
118
+ }
119
+
120
+ if ('managed' in data) {
121
+ /**
122
+ * Whether or not the role is managed by an external service
123
+ * @type {boolean}
124
+ */
125
+ this.managed = data.managed;
126
+ }
127
+
128
+ if ('mentionable' in data) {
129
+ /**
130
+ * Whether or not the role can be mentioned by anyone
131
+ * @type {boolean}
132
+ */
133
+ this.mentionable = data.mentionable;
134
+ }
135
+
136
+ if ('icon' in data) this.icon = data.icon;
137
+
138
+ if ('unicode_emoji' in data) this.unicodeEmoji = data.unicode_emoji;
139
+
140
+ /**
141
+ * The tags this role has
142
+ * @type {?Object}
143
+ * @property {Snowflake} [botId] The id of the bot this role belongs to
144
+ * @property {Snowflake|string} [integrationId] The id of the integration this role belongs to
145
+ * @property {true} [premiumSubscriberRole] Whether this is the guild's premium subscription role
146
+ * @property {Snowflake} [subscriptionListingId] The id of this role's subscription SKU and listing
147
+ * @property {true} [availableForPurchase] Whether this role is available for purchase
148
+ * @property {true} [guildConnections] Whether this role is a guild's linked role
149
+ */
150
+ this.tags = data.tags ? {} : null;
151
+ if (data.tags) {
152
+ if ('bot_id' in data.tags) {
153
+ this.tags.botId = data.tags.bot_id;
154
+ }
155
+ if ('integration_id' in data.tags) {
156
+ this.tags.integrationId = data.tags.integration_id;
157
+ }
158
+ if ('premium_subscriber' in data.tags) {
159
+ this.tags.premiumSubscriberRole = true;
160
+ }
161
+ if ('subscription_listing_id' in data.tags) {
162
+ this.tags.subscriptionListingId = data.tags.subscription_listing_id;
163
+ }
164
+ if ('available_for_purchase' in data.tags) {
165
+ this.tags.availableForPurchase = true;
166
+ }
167
+ if ('guild_connections' in data.tags) {
168
+ this.tags.guildConnections = true;
169
+ }
170
+ }
171
+
172
+ if ('flags' in data) {
173
+ /**
174
+ * The flags of this role
175
+ * @type {Readonly<RoleFlags>}
176
+ */
177
+ this.flags = new RoleFlags(data.flags).freeze();
178
+ } else {
179
+ this.flags ??= new RoleFlags().freeze();
180
+ }
181
+ }
182
+
183
+ /**
184
+ * The timestamp the role was created at
185
+ * @type {number}
186
+ * @readonly
187
+ */
188
+ get createdTimestamp() {
189
+ return SnowflakeUtil.timestampFrom(this.id);
190
+ }
191
+
192
+ /**
193
+ * The time the role was created at
194
+ * @type {Date}
195
+ * @readonly
196
+ */
197
+ get createdAt() {
198
+ return new Date(this.createdTimestamp);
199
+ }
200
+
201
+ /**
202
+ * Whether or not the role has been deleted
203
+ * @type {boolean}
204
+ * @deprecated This will be removed in the next major version, see https://github.com/discordjs/discord.js/issues/7091
205
+ */
206
+ get deleted() {
207
+ if (!deprecationEmittedForDeleted) {
208
+ deprecationEmittedForDeleted = true;
209
+ process.emitWarning(
210
+ 'Role#deleted is deprecated, see https://github.com/discordjs/discord.js/issues/7091.',
211
+ 'DeprecationWarning',
212
+ );
213
+ }
214
+
215
+ return deletedRoles.has(this);
216
+ }
217
+
218
+ set deleted(value) {
219
+ if (!deprecationEmittedForDeleted) {
220
+ deprecationEmittedForDeleted = true;
221
+ process.emitWarning(
222
+ 'Role#deleted is deprecated, see https://github.com/discordjs/discord.js/issues/7091.',
223
+ 'DeprecationWarning',
224
+ );
225
+ }
226
+
227
+ if (value) deletedRoles.add(this);
228
+ else deletedRoles.delete(this);
229
+ }
230
+
231
+ /**
232
+ * The hexadecimal version of the role color, with a leading hashtag
233
+ * @type {string}
234
+ * @readonly
235
+ */
236
+ get hexColor() {
237
+ return `#${this.colors.primaryColor.toString(16).padStart(6, '0')}`;
238
+ }
239
+
240
+ /**
241
+ * The cached guild members that have this role
242
+ * @type {Collection<Snowflake, GuildMember>}
243
+ * @readonly
244
+ */
245
+ get members() {
246
+ return this.guild.members.cache.filter(m => m.roles.cache.has(this.id));
247
+ }
248
+
249
+ /**
250
+ * Whether the role is editable by the client user
251
+ * @type {boolean}
252
+ * @readonly
253
+ */
254
+ get editable() {
255
+ if (this.managed) return false;
256
+ const clientMember = this.guild.members.resolve(this.client.user);
257
+ if (!clientMember.permissions.has(Permissions.FLAGS.MANAGE_ROLES)) return false;
258
+ return clientMember.roles.highest.comparePositionTo(this) > 0;
259
+ }
260
+
261
+ /**
262
+ * The position of the role in the role manager
263
+ * @type {number}
264
+ * @readonly
265
+ */
266
+ get position() {
267
+ let count = 0;
268
+ for (const role of this.guild.roles.cache.values()) {
269
+ if (this.rawPosition > role.rawPosition) count++;
270
+ else if (this.rawPosition === role.rawPosition && BigInt(this.id) < BigInt(role.id)) count++;
271
+ }
272
+
273
+ return count;
274
+ }
275
+
276
+ /**
277
+ * Compares this role's position to another role's.
278
+ * @param {RoleResolvable} role Role to compare to this one
279
+ * @returns {number} Negative number if this role's position is lower (other role's is higher),
280
+ * positive number if this one is higher (other's is lower), 0 if equal
281
+ * @example
282
+ * // Compare the position of a role to another
283
+ * const roleCompare = role.comparePositionTo(otherRole);
284
+ * if (roleCompare >= 1) console.log(`${role.name} is higher than ${otherRole.name}`);
285
+ */
286
+ comparePositionTo(role) {
287
+ return this.guild.roles.comparePositions(this, role);
288
+ }
289
+
290
+ /**
291
+ * The data for a role.
292
+ * @typedef {Object} RoleData
293
+ * @property {string} [name] The name of the role
294
+ * @property {ColorResolvable} [color] The color of the role, either a hex string or a base 10 number
295
+ * <warn>This property is deprecated. Use `colors` instead.</warn>
296
+ * @property {RoleColorsResolvable} [colors] The colors of the role
297
+ * @property {boolean} [hoist] Whether or not the role should be hoisted
298
+ * @property {number} [position] The position of the role
299
+ * @property {PermissionResolvable} [permissions] The permissions of the role
300
+ * @property {boolean} [mentionable] Whether or not the role should be mentionable
301
+ * @property {?(BufferResolvable|Base64Resolvable|EmojiResolvable)} [icon] The icon for the role
302
+ * <warn>The `EmojiResolvable` should belong to the same guild as the role.
303
+ * If not, pass the emoji's URL directly</warn>
304
+ * @property {?string} [unicodeEmoji] The unicode emoji for the role
305
+ */
306
+
307
+ /**
308
+ * Edits the role.
309
+ * @param {RoleData} data The new data for the role
310
+ * @param {string} [reason] Reason for editing this role
311
+ * @returns {Promise<Role>}
312
+ * @example
313
+ * // Edit a role
314
+ * role.edit({ name: 'new role' })
315
+ * .then(updated => console.log(`Edited role name to ${updated.name}`))
316
+ * .catch(console.error);
317
+ */
318
+ edit(data, reason) {
319
+ return this.guild.roles.edit(this, data, reason);
320
+ }
321
+
322
+ /**
323
+ * Returns `channel.permissionsFor(role)`. Returns permissions for a role in a guild channel,
324
+ * taking into account permission overwrites.
325
+ * @param {GuildChannel|Snowflake} channel The guild channel to use as context
326
+ * @param {boolean} [checkAdmin=true] Whether having `ADMINISTRATOR` will return all permissions
327
+ * @returns {Readonly<Permissions>}
328
+ */
329
+ permissionsIn(channel, checkAdmin = true) {
330
+ channel = this.guild.channels.resolve(channel);
331
+ if (!channel) throw new Error('GUILD_CHANNEL_RESOLVE');
332
+ return channel.rolePermissions(this, checkAdmin);
333
+ }
334
+
335
+ /**
336
+ * Sets a new name for the role.
337
+ * @param {string} name The new name of the role
338
+ * @param {string} [reason] Reason for changing the role's name
339
+ * @returns {Promise<Role>}
340
+ * @example
341
+ * // Set the name of the role
342
+ * role.setName('new role')
343
+ * .then(updated => console.log(`Updated role name to ${updated.name}`))
344
+ * .catch(console.error);
345
+ */
346
+ setName(name, reason) {
347
+ return this.edit({ name }, reason);
348
+ }
349
+
350
+ /**
351
+ * Sets a new color for the role.
352
+ * @param {ColorResolvable} color The color of the role
353
+ * @param {string} [reason] Reason for changing the role's color
354
+ * @returns {Promise<Role>}
355
+ * @deprecated Use {@link Role#setColors} instead.
356
+ */
357
+ setColor(color, reason) {
358
+ return this.edit({ color }, reason);
359
+ }
360
+
361
+ /**
362
+ * Sets new colors for the role.
363
+ *
364
+ * @param {RoleColorsResolvable} colors The colors of the role
365
+ * @param {string} [reason] Reason for changing the role's colors
366
+ * @returns {Promise<Role>}
367
+ * @example
368
+ * // Set the colors of a role
369
+ * role.setColors({ primaryColor: '#FF0000', secondaryColor: '#00FF00', tertiaryColor: '#0000FF' })
370
+ * .then(updated => console.log(`Set colors of role to ${updated.colors}`))
371
+ * .catch(console.error);
372
+ * @example
373
+ * // Set holographic colors using constants
374
+ * role.setColors({
375
+ * primaryColor: Constants.HolographicStyle.Primary,
376
+ * secondaryColor: Constants.HolographicStyle.Secondary,
377
+ * tertiaryColor: Constants.HolographicStyle.Tertiary,
378
+ * })
379
+ * .then(updated => console.log(`Set holographic colors for role ${updated.name}`))
380
+ * .catch(console.error);
381
+ */
382
+ setColors(colors, reason) {
383
+ return this.edit({ colors, reason });
384
+ }
385
+
386
+ /**
387
+ * Sets whether or not the role should be hoisted.
388
+ * @param {boolean} [hoist=true] Whether or not to hoist the role
389
+ * @param {string} [reason] Reason for setting whether or not the role should be hoisted
390
+ * @returns {Promise<Role>}
391
+ * @example
392
+ * // Set the hoist of the role
393
+ * role.setHoist(true)
394
+ * .then(updated => console.log(`Role hoisted: ${updated.hoist}`))
395
+ * .catch(console.error);
396
+ */
397
+ setHoist(hoist = true, reason) {
398
+ return this.edit({ hoist }, reason);
399
+ }
400
+
401
+ /**
402
+ * Sets the permissions of the role.
403
+ * @param {PermissionResolvable} permissions The permissions of the role
404
+ * @param {string} [reason] Reason for changing the role's permissions
405
+ * @returns {Promise<Role>}
406
+ * @example
407
+ * // Set the permissions of the role
408
+ * role.setPermissions([Permissions.FLAGS.KICK_MEMBERS, Permissions.FLAGS.BAN_MEMBERS])
409
+ * .then(updated => console.log(`Updated permissions to ${updated.permissions.bitfield}`))
410
+ * .catch(console.error);
411
+ * @example
412
+ * // Remove all permissions from a role
413
+ * role.setPermissions(0n)
414
+ * .then(updated => console.log(`Updated permissions to ${updated.permissions.bitfield}`))
415
+ * .catch(console.error);
416
+ */
417
+ setPermissions(permissions, reason) {
418
+ return this.edit({ permissions }, reason);
419
+ }
420
+
421
+ /**
422
+ * Sets whether this role is mentionable.
423
+ * @param {boolean} [mentionable=true] Whether this role should be mentionable
424
+ * @param {string} [reason] Reason for setting whether or not this role should be mentionable
425
+ * @returns {Promise<Role>}
426
+ * @example
427
+ * // Make the role mentionable
428
+ * role.setMentionable(true)
429
+ * .then(updated => console.log(`Role updated ${updated.name}`))
430
+ * .catch(console.error);
431
+ */
432
+ setMentionable(mentionable = true, reason) {
433
+ return this.edit({ mentionable }, reason);
434
+ }
435
+
436
+ /**
437
+ * Sets a new icon for the role.
438
+ * @param {?(BufferResolvable|Base64Resolvable|EmojiResolvable)} icon The icon for the role
439
+ * <warn>The `EmojiResolvable` should belong to the same guild as the role.
440
+ * If not, pass the emoji's URL directly</warn>
441
+ * @param {string} [reason] Reason for changing the role's icon
442
+ * @returns {Promise<Role>}
443
+ */
444
+ setIcon(icon, reason) {
445
+ return this.edit({ icon }, reason);
446
+ }
447
+
448
+ /**
449
+ * Sets a new unicode emoji for the role.
450
+ * @param {?string} unicodeEmoji The new unicode emoji for the role
451
+ * @param {string} [reason] Reason for changing the role's unicode emoji
452
+ * @returns {Promise<Role>}
453
+ * @example
454
+ * // Set a new unicode emoji for the role
455
+ * role.setUnicodeEmoji('🤖')
456
+ * .then(updated => console.log(`Set unicode emoji for the role to ${updated.unicodeEmoji}`))
457
+ * .catch(console.error);
458
+ */
459
+ setUnicodeEmoji(unicodeEmoji, reason) {
460
+ return this.edit({ unicodeEmoji }, reason);
461
+ }
462
+
463
+ /**
464
+ * Options used to set the position of a role.
465
+ * @typedef {Object} SetRolePositionOptions
466
+ * @property {boolean} [relative=false] Whether to change the position relative to its current value or not
467
+ * @property {string} [reason] The reason for changing the position
468
+ */
469
+
470
+ /**
471
+ * Sets the new position of the role.
472
+ * @param {number} position The new position for the role
473
+ * @param {SetRolePositionOptions} [options] Options for setting the position
474
+ * @returns {Promise<Role>}
475
+ * @example
476
+ * // Set the position of the role
477
+ * role.setPosition(1)
478
+ * .then(updated => console.log(`Role position: ${updated.position}`))
479
+ * .catch(console.error);
480
+ */
481
+ setPosition(position, options = {}) {
482
+ return this.guild.roles.setPosition(this, position, options);
483
+ }
484
+
485
+ /**
486
+ * Deletes the role.
487
+ * @param {string} [reason] Reason for deleting this role
488
+ * @returns {Promise<Role>}
489
+ * @example
490
+ * // Delete a role
491
+ * role.delete('The role needed to go')
492
+ * .then(deleted => console.log(`Deleted role ${deleted.name}`))
493
+ * .catch(console.error);
494
+ */
495
+ async delete(reason) {
496
+ await this.guild.roles.delete(this.id, reason);
497
+ return this;
498
+ }
499
+
500
+ /**
501
+ * Fetches the member ids for this role in the guild.
502
+ * <info>This only returns 100 member ids</info>
503
+ * @returns {Promise<Snowflake[]>}
504
+ */
505
+ fetchMemberIds() {
506
+ return this.guild.roles.fetchMemberIds(this.id);
507
+ }
508
+
509
+ /**
510
+ * A link to the role's icon
511
+ * @param {StaticImageURLOptions} [options={}] Options for the image URL
512
+ * @returns {?string}
513
+ */
514
+ iconURL({ format, size } = {}) {
515
+ if (!this.icon) return null;
516
+ return this.client.rest.cdn.RoleIcon(this.id, this.icon, format, size);
517
+ }
518
+
519
+ /**
520
+ * Whether this role equals another role. It compares all properties, so for most operations
521
+ * it is advisable to just compare `role.id === role2.id` as it is much faster and is often
522
+ * what most users need.
523
+ * @param {Role} role Role to compare with
524
+ * @returns {boolean}
525
+ */
526
+ equals(role) {
527
+ return (
528
+ role &&
529
+ this.id === role.id &&
530
+ this.name === role.name &&
531
+ this.colors.primaryColor === role.colors.primaryColor &&
532
+ this.colors.secondaryColor === role.colors.secondaryColor &&
533
+ this.colors.tertiaryColor === role.colors.tertiaryColor &&
534
+ this.hoist === role.hoist &&
535
+ this.position === role.position &&
536
+ this.permissions.bitfield === role.permissions.bitfield &&
537
+ this.managed === role.managed &&
538
+ this.icon === role.icon &&
539
+ this.unicodeEmoji === role.unicodeEmoji
540
+ );
541
+ }
542
+
543
+ /**
544
+ * When concatenated with a string, this automatically returns the role's mention instead of the Role object.
545
+ * @returns {string}
546
+ * @example
547
+ * // Logs: Role: <@&123456789012345678>
548
+ * console.log(`Role: ${role}`);
549
+ */
550
+ toString() {
551
+ if (this.id === this.guild.id) return '@everyone';
552
+ return `<@&${this.id}>`;
553
+ }
554
+
555
+ toJSON() {
556
+ return {
557
+ ...super.toJSON({ createdTimestamp: true }),
558
+ permissions: this.permissions.toJSON(),
559
+ };
560
+ }
561
+
562
+ /**
563
+ * Compares the positions of two roles.
564
+ * @param {Role} role1 First role to compare
565
+ * @param {Role} role2 Second role to compare
566
+ * @returns {number} Negative number if the first role's position is lower (second role's is higher),
567
+ * positive number if the first's is higher (second's is lower), 0 if equal
568
+ * @deprecated Use {@link RoleManager#comparePositions} instead.
569
+ */
570
+ static comparePositions(role1, role2) {
571
+ if (!deprecationEmittedForComparePositions) {
572
+ process.emitWarning(
573
+ 'The Role.comparePositions method is deprecated. Use RoleManager#comparePositions instead.',
574
+ 'DeprecationWarning',
575
+ );
576
+
577
+ deprecationEmittedForComparePositions = true;
578
+ }
579
+
580
+ return role1.guild.roles.comparePositions(role1, role2);
581
+ }
582
+ }
583
+
584
+ exports.Role = Role;
585
+ exports.deletedRoles = deletedRoles;
586
+
587
+ /**
588
+ * @external APIRole
589
+ * @see {@link https://discord.com/developers/docs/topics/permissions#role-object}
590
+ */