discord-sb.js 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.
- package/LICENSE +674 -0
- package/README.md +2 -0
- package/package.json +91 -0
- package/src/WebSocket.js +39 -0
- package/src/client/BaseClient.js +86 -0
- package/src/client/Client.js +978 -0
- package/src/client/WebhookClient.js +61 -0
- package/src/client/actions/Action.js +116 -0
- package/src/client/actions/ActionsManager.js +80 -0
- package/src/client/actions/ApplicationCommandPermissionsUpdate.js +34 -0
- package/src/client/actions/AutoModerationActionExecution.js +27 -0
- package/src/client/actions/AutoModerationRuleCreate.js +28 -0
- package/src/client/actions/AutoModerationRuleDelete.js +32 -0
- package/src/client/actions/AutoModerationRuleUpdate.js +30 -0
- package/src/client/actions/ChannelCreate.js +23 -0
- package/src/client/actions/ChannelDelete.js +39 -0
- package/src/client/actions/ChannelUpdate.js +43 -0
- package/src/client/actions/GuildAuditLogEntryCreate.js +29 -0
- package/src/client/actions/GuildBanAdd.js +20 -0
- package/src/client/actions/GuildBanRemove.js +25 -0
- package/src/client/actions/GuildChannelsPositionUpdate.js +21 -0
- package/src/client/actions/GuildDelete.js +65 -0
- package/src/client/actions/GuildEmojiCreate.js +20 -0
- package/src/client/actions/GuildEmojiDelete.js +21 -0
- package/src/client/actions/GuildEmojiUpdate.js +20 -0
- package/src/client/actions/GuildEmojisUpdate.js +34 -0
- package/src/client/actions/GuildIntegrationsUpdate.js +19 -0
- package/src/client/actions/GuildMemberRemove.js +33 -0
- package/src/client/actions/GuildMemberUpdate.js +44 -0
- package/src/client/actions/GuildRoleCreate.js +25 -0
- package/src/client/actions/GuildRoleDelete.js +31 -0
- package/src/client/actions/GuildRoleUpdate.js +39 -0
- package/src/client/actions/GuildRolesPositionUpdate.js +21 -0
- package/src/client/actions/GuildScheduledEventCreate.js +27 -0
- package/src/client/actions/GuildScheduledEventDelete.js +31 -0
- package/src/client/actions/GuildScheduledEventUpdate.js +30 -0
- package/src/client/actions/GuildScheduledEventUserAdd.js +32 -0
- package/src/client/actions/GuildScheduledEventUserRemove.js +32 -0
- package/src/client/actions/GuildStickerCreate.js +20 -0
- package/src/client/actions/GuildStickerDelete.js +21 -0
- package/src/client/actions/GuildStickerUpdate.js +20 -0
- package/src/client/actions/GuildStickersUpdate.js +34 -0
- package/src/client/actions/GuildUpdate.js +33 -0
- package/src/client/actions/InviteCreate.js +28 -0
- package/src/client/actions/InviteDelete.js +30 -0
- package/src/client/actions/MessageCreate.js +50 -0
- package/src/client/actions/MessageDelete.js +32 -0
- package/src/client/actions/MessageDeleteBulk.js +46 -0
- package/src/client/actions/MessagePollVoteAdd.js +33 -0
- package/src/client/actions/MessagePollVoteRemove.js +33 -0
- package/src/client/actions/MessageReactionAdd.js +68 -0
- package/src/client/actions/MessageReactionRemove.js +50 -0
- package/src/client/actions/MessageReactionRemoveAll.js +33 -0
- package/src/client/actions/MessageReactionRemoveEmoji.js +28 -0
- package/src/client/actions/MessageUpdate.js +26 -0
- package/src/client/actions/PresenceUpdate.js +50 -0
- package/src/client/actions/StageInstanceCreate.js +28 -0
- package/src/client/actions/StageInstanceDelete.js +33 -0
- package/src/client/actions/StageInstanceUpdate.js +30 -0
- package/src/client/actions/ThreadCreate.js +24 -0
- package/src/client/actions/ThreadDelete.js +32 -0
- package/src/client/actions/ThreadListSync.js +59 -0
- package/src/client/actions/ThreadMemberUpdate.js +30 -0
- package/src/client/actions/ThreadMembersUpdate.js +34 -0
- package/src/client/actions/TypingStart.js +29 -0
- package/src/client/actions/UserUpdate.js +35 -0
- package/src/client/actions/VoiceStateUpdate.js +50 -0
- package/src/client/actions/WebhooksUpdate.js +20 -0
- package/src/client/voice/ClientVoiceManager.js +151 -0
- package/src/client/voice/VoiceConnection.js +1249 -0
- package/src/client/voice/dispatcher/AnnexBDispatcher.js +120 -0
- package/src/client/voice/dispatcher/AudioDispatcher.js +145 -0
- package/src/client/voice/dispatcher/BaseDispatcher.js +459 -0
- package/src/client/voice/dispatcher/VPxDispatcher.js +54 -0
- package/src/client/voice/dispatcher/VideoDispatcher.js +68 -0
- package/src/client/voice/networking/VoiceUDPClient.js +173 -0
- package/src/client/voice/networking/VoiceWebSocket.js +286 -0
- package/src/client/voice/player/MediaPlayer.js +321 -0
- package/src/client/voice/player/processing/AnnexBNalSplitter.js +244 -0
- package/src/client/voice/player/processing/IvfSplitter.js +106 -0
- package/src/client/voice/player/processing/PCMInsertSilence.js +37 -0
- package/src/client/voice/receiver/PacketHandler.js +260 -0
- package/src/client/voice/receiver/Receiver.js +96 -0
- package/src/client/voice/receiver/Recorder.js +173 -0
- package/src/client/voice/util/Function.js +116 -0
- package/src/client/voice/util/PlayInterface.js +122 -0
- package/src/client/voice/util/Secretbox.js +64 -0
- package/src/client/voice/util/Silence.js +16 -0
- package/src/client/voice/util/Socket.js +62 -0
- package/src/client/voice/util/VolumeInterface.js +104 -0
- package/src/client/websocket/WebSocketManager.js +392 -0
- package/src/client/websocket/WebSocketShard.js +907 -0
- package/src/client/websocket/handlers/APPLICATION_COMMAND_CREATE.js +18 -0
- package/src/client/websocket/handlers/APPLICATION_COMMAND_DELETE.js +20 -0
- package/src/client/websocket/handlers/APPLICATION_COMMAND_PERMISSIONS_UPDATE.js +5 -0
- package/src/client/websocket/handlers/APPLICATION_COMMAND_UPDATE.js +20 -0
- package/src/client/websocket/handlers/AUTO_MODERATION_ACTION_EXECUTION.js +5 -0
- package/src/client/websocket/handlers/AUTO_MODERATION_RULE_CREATE.js +5 -0
- package/src/client/websocket/handlers/AUTO_MODERATION_RULE_DELETE.js +5 -0
- package/src/client/websocket/handlers/AUTO_MODERATION_RULE_UPDATE.js +5 -0
- package/src/client/websocket/handlers/CALL_CREATE.js +14 -0
- package/src/client/websocket/handlers/CALL_DELETE.js +11 -0
- package/src/client/websocket/handlers/CALL_UPDATE.js +11 -0
- package/src/client/websocket/handlers/CHANNEL_CREATE.js +5 -0
- package/src/client/websocket/handlers/CHANNEL_DELETE.js +5 -0
- package/src/client/websocket/handlers/CHANNEL_PINS_UPDATE.js +22 -0
- package/src/client/websocket/handlers/CHANNEL_RECIPIENT_ADD.js +19 -0
- package/src/client/websocket/handlers/CHANNEL_RECIPIENT_REMOVE.js +16 -0
- package/src/client/websocket/handlers/CHANNEL_UPDATE.js +16 -0
- package/src/client/websocket/handlers/GUILD_AUDIT_LOG_ENTRY_CREATE.js +5 -0
- package/src/client/websocket/handlers/GUILD_BAN_ADD.js +5 -0
- package/src/client/websocket/handlers/GUILD_BAN_REMOVE.js +5 -0
- package/src/client/websocket/handlers/GUILD_CREATE.js +52 -0
- package/src/client/websocket/handlers/GUILD_DELETE.js +5 -0
- package/src/client/websocket/handlers/GUILD_EMOJIS_UPDATE.js +5 -0
- package/src/client/websocket/handlers/GUILD_INTEGRATIONS_UPDATE.js +5 -0
- package/src/client/websocket/handlers/GUILD_MEMBERS_CHUNK.js +39 -0
- package/src/client/websocket/handlers/GUILD_MEMBER_ADD.js +20 -0
- package/src/client/websocket/handlers/GUILD_MEMBER_REMOVE.js +5 -0
- package/src/client/websocket/handlers/GUILD_MEMBER_UPDATE.js +5 -0
- package/src/client/websocket/handlers/GUILD_ROLE_CREATE.js +5 -0
- package/src/client/websocket/handlers/GUILD_ROLE_DELETE.js +5 -0
- package/src/client/websocket/handlers/GUILD_ROLE_UPDATE.js +5 -0
- package/src/client/websocket/handlers/GUILD_SCHEDULED_EVENT_CREATE.js +5 -0
- package/src/client/websocket/handlers/GUILD_SCHEDULED_EVENT_DELETE.js +5 -0
- package/src/client/websocket/handlers/GUILD_SCHEDULED_EVENT_UPDATE.js +5 -0
- package/src/client/websocket/handlers/GUILD_SCHEDULED_EVENT_USER_ADD.js +5 -0
- package/src/client/websocket/handlers/GUILD_SCHEDULED_EVENT_USER_REMOVE.js +5 -0
- package/src/client/websocket/handlers/GUILD_STICKERS_UPDATE.js +5 -0
- package/src/client/websocket/handlers/GUILD_UPDATE.js +5 -0
- package/src/client/websocket/handlers/INTERACTION_MODAL_CREATE.js +12 -0
- package/src/client/websocket/handlers/INVITE_CREATE.js +5 -0
- package/src/client/websocket/handlers/INVITE_DELETE.js +5 -0
- package/src/client/websocket/handlers/MESSAGE_CREATE.js +5 -0
- package/src/client/websocket/handlers/MESSAGE_DELETE.js +5 -0
- package/src/client/websocket/handlers/MESSAGE_DELETE_BULK.js +5 -0
- package/src/client/websocket/handlers/MESSAGE_POLL_VOTE_ADD.js +5 -0
- package/src/client/websocket/handlers/MESSAGE_POLL_VOTE_REMOVE.js +5 -0
- package/src/client/websocket/handlers/MESSAGE_REACTION_ADD.js +5 -0
- package/src/client/websocket/handlers/MESSAGE_REACTION_REMOVE.js +5 -0
- package/src/client/websocket/handlers/MESSAGE_REACTION_REMOVE_ALL.js +5 -0
- package/src/client/websocket/handlers/MESSAGE_REACTION_REMOVE_EMOJI.js +5 -0
- package/src/client/websocket/handlers/MESSAGE_UPDATE.js +16 -0
- package/src/client/websocket/handlers/PRESENCE_UPDATE.js +5 -0
- package/src/client/websocket/handlers/READY.js +121 -0
- package/src/client/websocket/handlers/RELATIONSHIP_ADD.js +19 -0
- package/src/client/websocket/handlers/RELATIONSHIP_REMOVE.js +17 -0
- package/src/client/websocket/handlers/RELATIONSHIP_UPDATE.js +41 -0
- package/src/client/websocket/handlers/RESUMED.js +14 -0
- package/src/client/websocket/handlers/STAGE_INSTANCE_CREATE.js +5 -0
- package/src/client/websocket/handlers/STAGE_INSTANCE_DELETE.js +5 -0
- package/src/client/websocket/handlers/STAGE_INSTANCE_UPDATE.js +5 -0
- package/src/client/websocket/handlers/THREAD_CREATE.js +5 -0
- package/src/client/websocket/handlers/THREAD_DELETE.js +5 -0
- package/src/client/websocket/handlers/THREAD_LIST_SYNC.js +5 -0
- package/src/client/websocket/handlers/THREAD_MEMBERS_UPDATE.js +5 -0
- package/src/client/websocket/handlers/THREAD_MEMBER_UPDATE.js +5 -0
- package/src/client/websocket/handlers/THREAD_UPDATE.js +16 -0
- package/src/client/websocket/handlers/TYPING_START.js +5 -0
- package/src/client/websocket/handlers/USER_GUILD_SETTINGS_UPDATE.js +6 -0
- package/src/client/websocket/handlers/USER_NOTE_UPDATE.js +5 -0
- package/src/client/websocket/handlers/USER_REQUIRED_ACTION_UPDATE.js +78 -0
- package/src/client/websocket/handlers/USER_SETTINGS_UPDATE.js +5 -0
- package/src/client/websocket/handlers/USER_UPDATE.js +5 -0
- package/src/client/websocket/handlers/VOICE_CHANNEL_EFFECT_SEND.js +16 -0
- package/src/client/websocket/handlers/VOICE_CHANNEL_STATUS_UPDATE.js +12 -0
- package/src/client/websocket/handlers/VOICE_SERVER_UPDATE.js +6 -0
- package/src/client/websocket/handlers/VOICE_STATE_UPDATE.js +5 -0
- package/src/client/websocket/handlers/WEBHOOKS_UPDATE.js +5 -0
- package/src/client/websocket/handlers/index.js +84 -0
- package/src/errors/DJSError.js +61 -0
- package/src/errors/Messages.js +217 -0
- package/src/errors/index.js +4 -0
- package/src/index.js +172 -0
- package/src/managers/ApplicationCommandManager.js +264 -0
- package/src/managers/ApplicationCommandPermissionsManager.js +417 -0
- package/src/managers/AutoModerationRuleManager.js +296 -0
- package/src/managers/BaseGuildEmojiManager.js +80 -0
- package/src/managers/BaseManager.js +19 -0
- package/src/managers/BillingManager.js +66 -0
- package/src/managers/CachedManager.js +71 -0
- package/src/managers/ChannelManager.js +148 -0
- package/src/managers/ClientUserSettingManager.js +372 -0
- package/src/managers/DataManager.js +61 -0
- package/src/managers/DeveloperManager.js +254 -0
- package/src/managers/GuildBanManager.js +250 -0
- package/src/managers/GuildChannelManager.js +488 -0
- package/src/managers/GuildEmojiManager.js +171 -0
- package/src/managers/GuildEmojiRoleManager.js +118 -0
- package/src/managers/GuildForumThreadManager.js +108 -0
- package/src/managers/GuildInviteManager.js +213 -0
- package/src/managers/GuildManager.js +338 -0
- package/src/managers/GuildMemberManager.js +599 -0
- package/src/managers/GuildMemberRoleManager.js +195 -0
- package/src/managers/GuildScheduledEventManager.js +314 -0
- package/src/managers/GuildSettingManager.js +155 -0
- package/src/managers/GuildStickerManager.js +179 -0
- package/src/managers/GuildTextThreadManager.js +98 -0
- package/src/managers/InteractionManager.js +39 -0
- package/src/managers/MessageManager.js +423 -0
- package/src/managers/PermissionOverwriteManager.js +164 -0
- package/src/managers/PresenceManager.js +71 -0
- package/src/managers/QuestManager.js +353 -0
- package/src/managers/ReactionManager.js +67 -0
- package/src/managers/ReactionUserManager.js +73 -0
- package/src/managers/RelationshipManager.js +278 -0
- package/src/managers/RoleManager.js +448 -0
- package/src/managers/SessionManager.js +66 -0
- package/src/managers/StageInstanceManager.js +162 -0
- package/src/managers/ThreadManager.js +175 -0
- package/src/managers/ThreadMemberManager.js +186 -0
- package/src/managers/UserManager.js +136 -0
- package/src/managers/UserNoteManager.js +53 -0
- package/src/managers/VoiceStateManager.js +59 -0
- package/src/rest/APIRequest.js +154 -0
- package/src/rest/APIRouter.js +53 -0
- package/src/rest/DiscordAPIError.js +119 -0
- package/src/rest/HTTPError.js +62 -0
- package/src/rest/RESTManager.js +67 -0
- package/src/rest/RateLimitError.js +55 -0
- package/src/rest/RequestHandler.js +466 -0
- package/src/sharding/Shard.js +444 -0
- package/src/sharding/ShardClientUtil.js +279 -0
- package/src/sharding/ShardingManager.js +319 -0
- package/src/structures/AnonymousGuild.js +98 -0
- package/src/structures/ApplicationCommand.js +593 -0
- package/src/structures/ApplicationRoleConnectionMetadata.js +48 -0
- package/src/structures/AutoModerationActionExecution.js +89 -0
- package/src/structures/AutoModerationRule.js +294 -0
- package/src/structures/AutocompleteInteraction.js +107 -0
- package/src/structures/Base.js +43 -0
- package/src/structures/BaseCommandInteraction.js +211 -0
- package/src/structures/BaseGuild.js +116 -0
- package/src/structures/BaseGuildEmoji.js +56 -0
- package/src/structures/BaseGuildTextChannel.js +191 -0
- package/src/structures/BaseGuildVoiceChannel.js +241 -0
- package/src/structures/BaseMessageComponent.js +181 -0
- package/src/structures/ButtonInteraction.js +11 -0
- package/src/structures/CallState.js +63 -0
- package/src/structures/CategoryChannel.js +85 -0
- package/src/structures/Channel.js +284 -0
- package/src/structures/ClientPresence.js +77 -0
- package/src/structures/ClientUser.js +655 -0
- package/src/structures/CommandInteraction.js +41 -0
- package/src/structures/CommandInteractionOptionResolver.js +276 -0
- package/src/structures/ContainerComponent.js +68 -0
- package/src/structures/ContextMenuInteraction.js +65 -0
- package/src/structures/DMChannel.js +219 -0
- package/src/structures/DirectoryChannel.js +20 -0
- package/src/structures/Emoji.js +148 -0
- package/src/structures/FileComponent.js +49 -0
- package/src/structures/ForumChannel.js +31 -0
- package/src/structures/GroupDMChannel.js +394 -0
- package/src/structures/Guild.js +1791 -0
- package/src/structures/GuildAuditLogs.js +746 -0
- package/src/structures/GuildBan.js +59 -0
- package/src/structures/GuildBoost.js +108 -0
- package/src/structures/GuildChannel.js +470 -0
- package/src/structures/GuildEmoji.js +161 -0
- package/src/structures/GuildMember.js +636 -0
- package/src/structures/GuildPreview.js +191 -0
- package/src/structures/GuildPreviewEmoji.js +27 -0
- package/src/structures/GuildScheduledEvent.js +536 -0
- package/src/structures/GuildTemplate.js +236 -0
- package/src/structures/Integration.js +188 -0
- package/src/structures/IntegrationApplication.js +96 -0
- package/src/structures/Interaction.js +290 -0
- package/src/structures/InteractionCollector.js +248 -0
- package/src/structures/InteractionWebhook.js +43 -0
- package/src/structures/Invite.js +358 -0
- package/src/structures/InviteGuild.js +23 -0
- package/src/structures/InviteStageInstance.js +86 -0
- package/src/structures/MediaChannel.js +11 -0
- package/src/structures/MediaGalleryComponent.js +41 -0
- package/src/structures/MediaGalleryItem.js +47 -0
- package/src/structures/Message.js +1252 -0
- package/src/structures/MessageActionRow.js +105 -0
- package/src/structures/MessageAttachment.js +216 -0
- package/src/structures/MessageButton.js +166 -0
- package/src/structures/MessageCollector.js +146 -0
- package/src/structures/MessageComponentInteraction.js +120 -0
- package/src/structures/MessageContextMenuInteraction.js +20 -0
- package/src/structures/MessageEmbed.js +596 -0
- package/src/structures/MessageMentions.js +273 -0
- package/src/structures/MessagePayload.js +354 -0
- package/src/structures/MessageReaction.js +181 -0
- package/src/structures/MessageSelectMenu.js +141 -0
- package/src/structures/Modal.js +161 -0
- package/src/structures/ModalSubmitFieldsResolver.js +53 -0
- package/src/structures/ModalSubmitInteraction.js +119 -0
- package/src/structures/NewsChannel.js +32 -0
- package/src/structures/OAuth2Guild.js +28 -0
- package/src/structures/PermissionOverwrites.js +198 -0
- package/src/structures/Poll.js +108 -0
- package/src/structures/PollAnswer.js +88 -0
- package/src/structures/Presence.js +1157 -0
- package/src/structures/ReactionCollector.js +229 -0
- package/src/structures/ReactionEmoji.js +31 -0
- package/src/structures/Role.js +590 -0
- package/src/structures/SectionComponent.js +48 -0
- package/src/structures/SelectMenuInteraction.js +21 -0
- package/src/structures/SeparatorComponent.js +48 -0
- package/src/structures/Session.js +81 -0
- package/src/structures/StageChannel.js +104 -0
- package/src/structures/StageInstance.js +208 -0
- package/src/structures/Sticker.js +310 -0
- package/src/structures/StickerPack.js +95 -0
- package/src/structures/StoreChannel.js +56 -0
- package/src/structures/Team.js +118 -0
- package/src/structures/TeamMember.js +80 -0
- package/src/structures/TextChannel.js +33 -0
- package/src/structures/TextDisplayComponent.js +40 -0
- package/src/structures/TextInputComponent.js +132 -0
- package/src/structures/ThreadChannel.js +605 -0
- package/src/structures/ThreadMember.js +105 -0
- package/src/structures/ThreadOnlyChannel.js +249 -0
- package/src/structures/ThumbnailComponent.js +57 -0
- package/src/structures/Typing.js +74 -0
- package/src/structures/UnfurledMediaItem.js +29 -0
- package/src/structures/User.js +640 -0
- package/src/structures/UserContextMenuInteraction.js +29 -0
- package/src/structures/VoiceChannel.js +110 -0
- package/src/structures/VoiceChannelEffect.js +69 -0
- package/src/structures/VoiceRegion.js +53 -0
- package/src/structures/VoiceState.js +354 -0
- package/src/structures/WebEmbed.js +373 -0
- package/src/structures/Webhook.js +478 -0
- package/src/structures/WelcomeChannel.js +60 -0
- package/src/structures/WelcomeScreen.js +48 -0
- package/src/structures/Widget.js +87 -0
- package/src/structures/WidgetMember.js +99 -0
- package/src/structures/interfaces/Application.js +953 -0
- package/src/structures/interfaces/Collector.js +300 -0
- package/src/structures/interfaces/InteractionResponses.js +313 -0
- package/src/structures/interfaces/TextBasedChannel.js +821 -0
- package/src/util/APITypes.js +59 -0
- package/src/util/ActivityFlags.js +44 -0
- package/src/util/ApplicationFlags.js +76 -0
- package/src/util/AttachmentFlags.js +38 -0
- package/src/util/BitField.js +170 -0
- package/src/util/ChannelFlags.js +45 -0
- package/src/util/Constants.js +1914 -0
- package/src/util/DataResolver.js +146 -0
- package/src/util/Formatters.js +228 -0
- package/src/util/GuildMemberFlags.js +43 -0
- package/src/util/Intents.js +74 -0
- package/src/util/InviteFlags.js +34 -0
- package/src/util/LimitedCollection.js +131 -0
- package/src/util/MessageFlags.js +63 -0
- package/src/util/Options.js +358 -0
- package/src/util/Permissions.js +202 -0
- package/src/util/PremiumUsageFlags.js +31 -0
- package/src/util/PurchasedFlags.js +33 -0
- package/src/util/RemoteAuth.js +415 -0
- package/src/util/RoleFlags.js +37 -0
- package/src/util/SnowflakeUtil.js +92 -0
- package/src/util/Speaking.js +33 -0
- package/src/util/Sweepers.js +466 -0
- package/src/util/SystemChannelFlags.js +55 -0
- package/src/util/ThreadMemberFlags.js +30 -0
- package/src/util/UserFlags.js +104 -0
- package/src/util/Util.js +1048 -0
- package/typings/enums.d.ts +439 -0
- package/typings/index.d.ts +8505 -0
- package/typings/index.test-d.ts +0 -0
- package/typings/rawDataTypes.d.ts +403 -0
|
@@ -0,0 +1,448 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const process = require('node:process');
|
|
4
|
+
const { Collection } = require('@discordjs/collection');
|
|
5
|
+
const CachedManager = require('./CachedManager');
|
|
6
|
+
const { TypeError } = require('../errors');
|
|
7
|
+
const { Role } = require('../structures/Role');
|
|
8
|
+
const DataResolver = require('../util/DataResolver');
|
|
9
|
+
const Permissions = require('../util/Permissions');
|
|
10
|
+
const { resolveColor } = require('../util/Util');
|
|
11
|
+
const Util = require('../util/Util');
|
|
12
|
+
|
|
13
|
+
let cacheWarningEmitted = false;
|
|
14
|
+
let deprecationEmittedForCreate = false;
|
|
15
|
+
let deprecationEmittedForEdit = false;
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Manages API methods for roles and stores their cache.
|
|
19
|
+
* @extends {CachedManager}
|
|
20
|
+
*/
|
|
21
|
+
class RoleManager extends CachedManager {
|
|
22
|
+
constructor(guild, iterable) {
|
|
23
|
+
super(guild.client, Role, iterable);
|
|
24
|
+
if (!cacheWarningEmitted && this._cache.constructor.name !== 'Collection') {
|
|
25
|
+
cacheWarningEmitted = true;
|
|
26
|
+
process.emitWarning(
|
|
27
|
+
`Overriding the cache handling for ${this.constructor.name} is unsupported and breaks functionality.`,
|
|
28
|
+
'UnsupportedCacheOverwriteWarning',
|
|
29
|
+
);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* The guild belonging to this manager
|
|
34
|
+
* @type {Guild}
|
|
35
|
+
*/
|
|
36
|
+
this.guild = guild;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* The role cache of this manager
|
|
41
|
+
* @type {Collection<Snowflake, Role>}
|
|
42
|
+
* @name RoleManager#cache
|
|
43
|
+
*/
|
|
44
|
+
|
|
45
|
+
_add(data, cache) {
|
|
46
|
+
return super._add(data, cache, { extras: [this.guild] });
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Obtains a role from Discord, or the role cache if they're already available.
|
|
51
|
+
* @param {Snowflake} [id] The role's id
|
|
52
|
+
* @param {BaseFetchOptions} [options] Additional options for this fetch
|
|
53
|
+
* @returns {Promise<?Role|Collection<Snowflake, Role>>}
|
|
54
|
+
* @example
|
|
55
|
+
* // Fetch all roles from the guild
|
|
56
|
+
* message.guild.roles.fetch()
|
|
57
|
+
* .then(roles => console.log(`There are ${roles.size} roles.`))
|
|
58
|
+
* .catch(console.error);
|
|
59
|
+
* @example
|
|
60
|
+
* // Fetch a single role
|
|
61
|
+
* message.guild.roles.fetch('222078108977594368')
|
|
62
|
+
* .then(role => console.log(`The role color is: ${role.colors.primaryColor}`))
|
|
63
|
+
* .catch(console.error);
|
|
64
|
+
*/
|
|
65
|
+
async fetch(id, { cache = true, force = false } = {}) {
|
|
66
|
+
if (id && !force) {
|
|
67
|
+
const existing = this.cache.get(id);
|
|
68
|
+
if (existing) return existing;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
// We cannot fetch a single role, as of this commit's date, Discord API throws with 405
|
|
72
|
+
const data = await this.client.api.guilds(this.guild.id).roles.get();
|
|
73
|
+
const roles = new Collection();
|
|
74
|
+
for (const role of data) roles.set(role.id, this._add(role, cache));
|
|
75
|
+
return id ? roles.get(id) ?? null : roles;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* Fetches the member counts for each role in the guild.
|
|
80
|
+
* @returns {Promise<Record<Snowflake, number>>}
|
|
81
|
+
*/
|
|
82
|
+
async fetchMemberCounts() {
|
|
83
|
+
const data = await this.client.api.guilds(this.guild.id).roles('member-counts').get();
|
|
84
|
+
|
|
85
|
+
return data;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* Fetches the member ids for a role in the guild.
|
|
90
|
+
* <info>This only returns 100 member ids</info>
|
|
91
|
+
* @param {RoleResolvable} role The role to fetch member ids for
|
|
92
|
+
* @returns {Promise<Snowflake[]>}
|
|
93
|
+
*/
|
|
94
|
+
async fetchMemberIds(role) {
|
|
95
|
+
const id = this.resolveId(role);
|
|
96
|
+
if (!id) throw new TypeError('INVALID_TYPE', 'role', 'RoleResolvable');
|
|
97
|
+
|
|
98
|
+
const data = await this.client.api.guilds(this.guild.id).roles(id, 'member-ids').get();
|
|
99
|
+
|
|
100
|
+
return data;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* Data that can be resolved to a Role object. This can be:
|
|
105
|
+
* * A Role
|
|
106
|
+
* * A Snowflake
|
|
107
|
+
* @typedef {Role|Snowflake} RoleResolvable
|
|
108
|
+
*/
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* Resolves a {@link RoleResolvable} to a {@link Role} object.
|
|
112
|
+
* @method resolve
|
|
113
|
+
* @memberof RoleManager
|
|
114
|
+
* @instance
|
|
115
|
+
* @param {RoleResolvable} role The role resolvable to resolve
|
|
116
|
+
* @returns {?Role}
|
|
117
|
+
*/
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* Resolves a {@link RoleResolvable} to a {@link Role} id.
|
|
121
|
+
* @method resolveId
|
|
122
|
+
* @memberof RoleManager
|
|
123
|
+
* @instance
|
|
124
|
+
* @param {RoleResolvable} role The role resolvable to resolve
|
|
125
|
+
* @returns {?Snowflake}
|
|
126
|
+
*/
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* @typedef {Object} RoleColorsResolvable
|
|
130
|
+
* @property {ColorResolvable} primaryColor The primary color of the role
|
|
131
|
+
* @property {ColorResolvable} [secondaryColor] The secondary color of the role.
|
|
132
|
+
* This will make the role a gradient between the other provided colors
|
|
133
|
+
* @property {ColorResolvable} [tertiaryColor] The tertiary color of the role.
|
|
134
|
+
* When sending `tertiaryColor` the API enforces the role color to be a holographic style
|
|
135
|
+
* with values of `primaryColor = 11127295`, `secondaryColor = 16759788`, and `tertiaryColor = 16761760`.
|
|
136
|
+
* These values are available as a constant: `Constants.HolographicStyle`
|
|
137
|
+
*/
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
* Options used to create a new role.
|
|
141
|
+
* @typedef {Object} CreateRoleOptions
|
|
142
|
+
* @property {string} [name] The name of the new role
|
|
143
|
+
* @property {ColorResolvable} [color] The data to create the role with
|
|
144
|
+
* <warn>This property is deprecated. Use `colors` instead.</warn>
|
|
145
|
+
* @property {RoleColorsResolvable} [colors] The colors to create the role with
|
|
146
|
+
* @property {boolean} [hoist] Whether or not the new role should be hoisted
|
|
147
|
+
* @property {PermissionResolvable} [permissions] The permissions for the new role
|
|
148
|
+
* @property {number} [position] The position of the new role
|
|
149
|
+
* @property {boolean} [mentionable] Whether or not the new role should be mentionable
|
|
150
|
+
* @property {?(BufferResolvable|Base64Resolvable|EmojiResolvable)} [icon] The icon for the role
|
|
151
|
+
* <warn>The `EmojiResolvable` should belong to the same guild as the role.
|
|
152
|
+
* If not, pass the emoji's URL directly</warn>
|
|
153
|
+
* @property {?string} [unicodeEmoji] The unicode emoji for the role
|
|
154
|
+
* @property {string} [reason] The reason for creating this role
|
|
155
|
+
*/
|
|
156
|
+
|
|
157
|
+
/**
|
|
158
|
+
* Creates a new role in the guild with given information.
|
|
159
|
+
* <warn>The position will silently reset to 1 if an invalid one is provided, or none.</warn>
|
|
160
|
+
* @param {CreateRoleOptions} [options] Options for creating the new role
|
|
161
|
+
* @returns {Promise<Role>}
|
|
162
|
+
* @example
|
|
163
|
+
* // Create a new role
|
|
164
|
+
* guild.roles.create()
|
|
165
|
+
* .then(console.log)
|
|
166
|
+
* .catch(console.error);
|
|
167
|
+
* @example
|
|
168
|
+
* // Create a new role with data and a reason
|
|
169
|
+
* guild.roles.create({
|
|
170
|
+
* name: 'Super Cool Blue People',
|
|
171
|
+
* colors: {
|
|
172
|
+
* primaryColor: 'BLUE',
|
|
173
|
+
* },
|
|
174
|
+
* reason: 'we needed a role for Super Cool People',
|
|
175
|
+
* })
|
|
176
|
+
* .then(console.log)
|
|
177
|
+
* .catch(console.error);
|
|
178
|
+
* @example
|
|
179
|
+
* // Create a role with holographic colors
|
|
180
|
+
* guild.roles.create({
|
|
181
|
+
* name: 'Holographic Role',
|
|
182
|
+
* reason: 'Creating a role with holographic effect',
|
|
183
|
+
* colors: {
|
|
184
|
+
* primaryColor: Constants.HolographicStyles.PRIMARY,
|
|
185
|
+
* secondaryColor: Constants.HolographicStyles.SECONDARY,
|
|
186
|
+
* tertiaryColor: Constants.HolographicStyles.TERTIARY,
|
|
187
|
+
* },
|
|
188
|
+
* })
|
|
189
|
+
* .then(console.log)
|
|
190
|
+
* .catch(console.error);
|
|
191
|
+
*/
|
|
192
|
+
async create(options = {}) {
|
|
193
|
+
let { permissions, icon } = options;
|
|
194
|
+
const { name, color, hoist, position, mentionable, reason, unicodeEmoji } = options;
|
|
195
|
+
|
|
196
|
+
if (typeof permissions !== 'undefined') permissions = new Permissions(permissions);
|
|
197
|
+
if (icon) {
|
|
198
|
+
const guildEmojiURL = this.guild.emojis.resolve(icon)?.url;
|
|
199
|
+
icon = guildEmojiURL ? await DataResolver.resolveImage(guildEmojiURL) : await DataResolver.resolveImage(icon);
|
|
200
|
+
if (typeof icon !== 'string') icon = undefined;
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
let colors = options.colors && {
|
|
204
|
+
primary_color: resolveColor(options.colors.primaryColor),
|
|
205
|
+
secondary_color: options.colors.secondaryColor && resolveColor(options.colors.secondaryColor),
|
|
206
|
+
tertiary_color: options.colors.tertiaryColor && resolveColor(options.colors.tertiaryColor),
|
|
207
|
+
};
|
|
208
|
+
|
|
209
|
+
if (color !== undefined) {
|
|
210
|
+
if (!deprecationEmittedForCreate) {
|
|
211
|
+
process.emitWarning(`Passing "color" to RoleManager#create() is deprecated. Use "colors" instead.`);
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
deprecationEmittedForCreate = true;
|
|
215
|
+
|
|
216
|
+
colors = {
|
|
217
|
+
primary_color: resolveColor(color),
|
|
218
|
+
secondary_color: null,
|
|
219
|
+
tertiary_color: null,
|
|
220
|
+
};
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
const data = await this.client.api.guilds(this.guild.id).roles.post({
|
|
224
|
+
data: {
|
|
225
|
+
name,
|
|
226
|
+
colors,
|
|
227
|
+
hoist,
|
|
228
|
+
permissions,
|
|
229
|
+
mentionable,
|
|
230
|
+
icon,
|
|
231
|
+
unicode_emoji: unicodeEmoji,
|
|
232
|
+
},
|
|
233
|
+
reason,
|
|
234
|
+
});
|
|
235
|
+
const { role } = this.client.actions.GuildRoleCreate.handle({
|
|
236
|
+
guild_id: this.guild.id,
|
|
237
|
+
role: data,
|
|
238
|
+
});
|
|
239
|
+
if (position) return this.setPosition(role, position, { reason });
|
|
240
|
+
return role;
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
/**
|
|
244
|
+
* Edits a role of the guild.
|
|
245
|
+
* @param {RoleResolvable} role The role to edit
|
|
246
|
+
* @param {RoleData} data The new data for the role
|
|
247
|
+
* @param {string} [reason] Reason for editing this role
|
|
248
|
+
* @returns {Promise<Role>}
|
|
249
|
+
* @example
|
|
250
|
+
* // Edit a role
|
|
251
|
+
* guild.roles.edit('222079219327434752', { name: 'buddies' })
|
|
252
|
+
* .then(updated => console.log(`Edited role name to ${updated.name}`))
|
|
253
|
+
* .catch(console.error);
|
|
254
|
+
*/
|
|
255
|
+
async edit(role, data, reason) {
|
|
256
|
+
role = this.resolve(role);
|
|
257
|
+
if (!role) throw new TypeError('INVALID_TYPE', 'role', 'RoleResolvable');
|
|
258
|
+
|
|
259
|
+
if (typeof data.position === 'number') await this.setPosition(role, data.position, { reason });
|
|
260
|
+
|
|
261
|
+
let icon = data.icon;
|
|
262
|
+
if (icon) {
|
|
263
|
+
const guildEmojiURL = this.guild.emojis.resolve(icon)?.url;
|
|
264
|
+
icon = guildEmojiURL ? await DataResolver.resolveImage(guildEmojiURL) : await DataResolver.resolveImage(icon);
|
|
265
|
+
if (typeof icon !== 'string') icon = undefined;
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
let colors = data.colors && {
|
|
269
|
+
primary_color: resolveColor(data.colors.primaryColor),
|
|
270
|
+
secondary_color: data.colors.secondaryColor && resolveColor(data.colors.secondaryColor),
|
|
271
|
+
tertiary_color: data.colors.tertiaryColor && resolveColor(data.colors.tertiaryColor),
|
|
272
|
+
};
|
|
273
|
+
|
|
274
|
+
if (data.color !== undefined) {
|
|
275
|
+
if (!deprecationEmittedForEdit) {
|
|
276
|
+
process.emitWarning(`Passing "color" to RoleManager#edit() is deprecated. Use "colors" instead.`);
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
deprecationEmittedForEdit = true;
|
|
280
|
+
|
|
281
|
+
colors = {
|
|
282
|
+
primary_color: resolveColor(data.color),
|
|
283
|
+
secondary_color: null,
|
|
284
|
+
tertiary_color: null,
|
|
285
|
+
};
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
const _data = {
|
|
289
|
+
name: data.name,
|
|
290
|
+
colors,
|
|
291
|
+
hoist: data.hoist,
|
|
292
|
+
permissions: typeof data.permissions === 'undefined' ? undefined : new Permissions(data.permissions),
|
|
293
|
+
mentionable: data.mentionable,
|
|
294
|
+
icon,
|
|
295
|
+
unicode_emoji: data.unicodeEmoji,
|
|
296
|
+
};
|
|
297
|
+
|
|
298
|
+
const d = await this.client.api.guilds(this.guild.id).roles(role.id).patch({ data: _data, reason });
|
|
299
|
+
|
|
300
|
+
const clone = role._clone();
|
|
301
|
+
clone._patch(d);
|
|
302
|
+
return clone;
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
/**
|
|
306
|
+
* Deletes a role.
|
|
307
|
+
* @param {RoleResolvable} role The role to delete
|
|
308
|
+
* @param {string} [reason] Reason for deleting the role
|
|
309
|
+
* @returns {Promise<void>}
|
|
310
|
+
* @example
|
|
311
|
+
* // Delete a role
|
|
312
|
+
* guild.roles.delete('222079219327434752', 'The role needed to go')
|
|
313
|
+
* .then(() => console.log('Deleted the role.'))
|
|
314
|
+
* .catch(console.error);
|
|
315
|
+
*/
|
|
316
|
+
async delete(role, reason) {
|
|
317
|
+
const id = this.resolveId(role);
|
|
318
|
+
await this.client.api.guilds[this.guild.id].roles[id].delete({ reason });
|
|
319
|
+
this.client.actions.GuildRoleDelete.handle({ guild_id: this.guild.id, role_id: id });
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
/**
|
|
323
|
+
* Sets the new position of the role.
|
|
324
|
+
* @param {RoleResolvable} role The role to change the position of
|
|
325
|
+
* @param {number} position The new position for the role
|
|
326
|
+
* @param {SetRolePositionOptions} [options] Options for setting the position
|
|
327
|
+
* @returns {Promise<Role>}
|
|
328
|
+
* @example
|
|
329
|
+
* // Set the position of the role
|
|
330
|
+
* guild.roles.setPosition('222197033908436994', 1)
|
|
331
|
+
* .then(updated => console.log(`Role position: ${updated.position}`))
|
|
332
|
+
* .catch(console.error);
|
|
333
|
+
*/
|
|
334
|
+
async setPosition(role, position, { relative, reason } = {}) {
|
|
335
|
+
role = this.resolve(role);
|
|
336
|
+
if (!role) throw new TypeError('INVALID_TYPE', 'role', 'RoleResolvable');
|
|
337
|
+
const updatedRoles = await Util.setPosition(
|
|
338
|
+
role,
|
|
339
|
+
position,
|
|
340
|
+
relative,
|
|
341
|
+
this.guild._sortedRoles(),
|
|
342
|
+
this.client.api.guilds(this.guild.id).roles,
|
|
343
|
+
reason,
|
|
344
|
+
);
|
|
345
|
+
|
|
346
|
+
this.client.actions.GuildRolesPositionUpdate.handle({
|
|
347
|
+
guild_id: this.guild.id,
|
|
348
|
+
roles: updatedRoles,
|
|
349
|
+
});
|
|
350
|
+
return role;
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
/**
|
|
354
|
+
* The data needed for updating a guild role's position
|
|
355
|
+
* @typedef {Object} GuildRolePosition
|
|
356
|
+
* @property {RoleResolvable} role The role's id
|
|
357
|
+
* @property {number} position The position to update
|
|
358
|
+
*/
|
|
359
|
+
|
|
360
|
+
/**
|
|
361
|
+
* Batch-updates the guild's role positions
|
|
362
|
+
* @param {GuildRolePosition[]} rolePositions Role positions to update
|
|
363
|
+
* @returns {Promise<Guild>}
|
|
364
|
+
* @example
|
|
365
|
+
* guild.roles.setPositions([{ role: roleId, position: updatedRoleIndex }])
|
|
366
|
+
* .then(guild => console.log(`Role positions updated for ${guild}`))
|
|
367
|
+
* .catch(console.error);
|
|
368
|
+
*/
|
|
369
|
+
async setPositions(rolePositions) {
|
|
370
|
+
// Make sure rolePositions are prepared for API
|
|
371
|
+
rolePositions = rolePositions.map(o => ({
|
|
372
|
+
id: this.resolveId(o.role),
|
|
373
|
+
position: o.position,
|
|
374
|
+
}));
|
|
375
|
+
|
|
376
|
+
// Call the API to update role positions
|
|
377
|
+
await this.client.api.guilds(this.guild.id).roles.patch({
|
|
378
|
+
data: rolePositions,
|
|
379
|
+
});
|
|
380
|
+
return this.client.actions.GuildRolesPositionUpdate.handle({
|
|
381
|
+
guild_id: this.guild.id,
|
|
382
|
+
roles: rolePositions,
|
|
383
|
+
}).guild;
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
/**
|
|
387
|
+
* Compares the positions of two roles.
|
|
388
|
+
* @param {RoleResolvable} role1 First role to compare
|
|
389
|
+
* @param {RoleResolvable} role2 Second role to compare
|
|
390
|
+
* @returns {number} Negative number if the first role's position is lower (second role's is higher),
|
|
391
|
+
* positive number if the first's is higher (second's is lower), 0 if equal
|
|
392
|
+
*/
|
|
393
|
+
comparePositions(role1, role2) {
|
|
394
|
+
const resolvedRole1 = this.resolve(role1);
|
|
395
|
+
const resolvedRole2 = this.resolve(role2);
|
|
396
|
+
if (!resolvedRole1 || !resolvedRole2) throw new TypeError('INVALID_TYPE', 'role', 'Role nor a Snowflake');
|
|
397
|
+
|
|
398
|
+
const role1Position = resolvedRole1.position;
|
|
399
|
+
const role2Position = resolvedRole2.position;
|
|
400
|
+
|
|
401
|
+
if (role1Position === role2Position) {
|
|
402
|
+
return Number(BigInt(resolvedRole2.id) - BigInt(resolvedRole1.id));
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
return role1Position - role2Position;
|
|
406
|
+
}
|
|
407
|
+
|
|
408
|
+
/**
|
|
409
|
+
* Gets the managed role a user created when joining the guild, if any
|
|
410
|
+
* <info>Only ever available for bots</info>
|
|
411
|
+
* @param {UserResolvable} user The user to access the bot role for
|
|
412
|
+
* @returns {?Role}
|
|
413
|
+
*/
|
|
414
|
+
botRoleFor(user) {
|
|
415
|
+
const userId = this.client.users.resolveId(user);
|
|
416
|
+
if (!userId) return null;
|
|
417
|
+
return this.cache.find(role => role.tags?.botId === userId) ?? null;
|
|
418
|
+
}
|
|
419
|
+
|
|
420
|
+
/**
|
|
421
|
+
* The `@everyone` role of the guild
|
|
422
|
+
* @type {Role}
|
|
423
|
+
* @readonly
|
|
424
|
+
*/
|
|
425
|
+
get everyone() {
|
|
426
|
+
return this.cache.get(this.guild.id);
|
|
427
|
+
}
|
|
428
|
+
|
|
429
|
+
/**
|
|
430
|
+
* The premium subscriber role of the guild, if any
|
|
431
|
+
* @type {?Role}
|
|
432
|
+
* @readonly
|
|
433
|
+
*/
|
|
434
|
+
get premiumSubscriberRole() {
|
|
435
|
+
return this.cache.find(role => role.tags?.premiumSubscriberRole) ?? null;
|
|
436
|
+
}
|
|
437
|
+
|
|
438
|
+
/**
|
|
439
|
+
* The role with the highest position in the cache
|
|
440
|
+
* @type {Role}
|
|
441
|
+
* @readonly
|
|
442
|
+
*/
|
|
443
|
+
get highest() {
|
|
444
|
+
return this.cache.reduce((prev, role) => (role.comparePositionTo(prev) > 0 ? role : prev), this.cache.first());
|
|
445
|
+
}
|
|
446
|
+
}
|
|
447
|
+
|
|
448
|
+
module.exports = RoleManager;
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const CachedManager = require('./CachedManager');
|
|
4
|
+
const Session = require('../structures/Session');
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Manages API methods for users and stores their cache.
|
|
8
|
+
* @extends {CachedManager}
|
|
9
|
+
*/
|
|
10
|
+
class SessionManager extends CachedManager {
|
|
11
|
+
constructor(client, iterable) {
|
|
12
|
+
super(client, Session, iterable);
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* The current session ID hash of the client.
|
|
16
|
+
* @type {string}
|
|
17
|
+
*/
|
|
18
|
+
this.currentSessionIdHash = null;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* The cache of Sessions
|
|
22
|
+
* @type {Collection<string, Session>}
|
|
23
|
+
* @name SessionManager#cache
|
|
24
|
+
*/
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Fetch all sessions of the client.
|
|
28
|
+
* @returns {Promise<Collection<string, Session>>}
|
|
29
|
+
*/
|
|
30
|
+
fetch() {
|
|
31
|
+
return this.client.api.auth.sessions.get().then(data => {
|
|
32
|
+
const allData = data.user_sessions;
|
|
33
|
+
this.cache.clear();
|
|
34
|
+
for (const session of allData) {
|
|
35
|
+
this._add(session, true, { id: session.id_hash });
|
|
36
|
+
}
|
|
37
|
+
return this.cache;
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Logout all client (remote).
|
|
43
|
+
* @returns {Promise<void>}
|
|
44
|
+
*/
|
|
45
|
+
logoutAllDevices() {
|
|
46
|
+
return this.client.api.auth.sessions.logout({
|
|
47
|
+
data: {
|
|
48
|
+
session_id_hashes: this.cache.map(session => session.id),
|
|
49
|
+
},
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Get the current session of the client.
|
|
55
|
+
* You must call `fetch()` first to populate the cache.
|
|
56
|
+
* @type {?Session}
|
|
57
|
+
*/
|
|
58
|
+
get currentSession() {
|
|
59
|
+
if (!this.currentSessionIdHash) {
|
|
60
|
+
return null;
|
|
61
|
+
}
|
|
62
|
+
return this.cache.get(this.currentSessionIdHash) || null;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
module.exports = SessionManager;
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const CachedManager = require('./CachedManager');
|
|
4
|
+
const { TypeError, Error } = require('../errors');
|
|
5
|
+
const { StageInstance } = require('../structures/StageInstance');
|
|
6
|
+
const { PrivacyLevels } = require('../util/Constants');
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Manages API methods for {@link StageInstance} objects and holds their cache.
|
|
10
|
+
* @extends {CachedManager}
|
|
11
|
+
*/
|
|
12
|
+
class StageInstanceManager extends CachedManager {
|
|
13
|
+
constructor(guild, iterable) {
|
|
14
|
+
super(guild.client, StageInstance, iterable);
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* The guild this manager belongs to
|
|
18
|
+
* @type {Guild}
|
|
19
|
+
*/
|
|
20
|
+
this.guild = guild;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* The cache of this Manager
|
|
25
|
+
* @type {Collection<Snowflake, StageInstance>}
|
|
26
|
+
* @name StageInstanceManager#cache
|
|
27
|
+
*/
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Options used to create a stage instance.
|
|
31
|
+
* @typedef {Object} StageInstanceCreateOptions
|
|
32
|
+
* @property {string} topic The topic of the stage instance
|
|
33
|
+
* @property {PrivacyLevel|number} [privacyLevel] The privacy level of the stage instance
|
|
34
|
+
* @property {boolean} [sendStartNotification] Whether to notify `@everyone` that the stage instance has started
|
|
35
|
+
* @property {GuildScheduledEventResolvable} [guildScheduledEvent]
|
|
36
|
+
* The guild scheduled event associated with the stage instance
|
|
37
|
+
*/
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Data that can be resolved to a Stage Channel object. This can be:
|
|
41
|
+
* * A StageChannel
|
|
42
|
+
* * A Snowflake
|
|
43
|
+
* @typedef {StageChannel|Snowflake} StageChannelResolvable
|
|
44
|
+
*/
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Creates a new stage instance.
|
|
48
|
+
* @param {StageChannelResolvable} channel The stage channel to associate the created stage instance to
|
|
49
|
+
* @param {StageInstanceCreateOptions} options The options to create the stage instance
|
|
50
|
+
* @returns {Promise<StageInstance>}
|
|
51
|
+
* @example
|
|
52
|
+
* // Create a stage instance
|
|
53
|
+
* guild.stageInstances.create('1234567890123456789', {
|
|
54
|
+
* topic: 'A very creative topic',
|
|
55
|
+
* privacyLevel: 'GUILD_ONLY'
|
|
56
|
+
* })
|
|
57
|
+
* .then(stageInstance => console.log(stageInstance))
|
|
58
|
+
* .catch(console.error);
|
|
59
|
+
*/
|
|
60
|
+
async create(channel, options) {
|
|
61
|
+
const channelId = this.guild.channels.resolveId(channel);
|
|
62
|
+
if (!channelId) throw new Error('STAGE_CHANNEL_RESOLVE');
|
|
63
|
+
if (typeof options !== 'object') throw new TypeError('INVALID_TYPE', 'options', 'object', true);
|
|
64
|
+
let { guildScheduledEvent, topic, privacyLevel, sendStartNotification } = options;
|
|
65
|
+
|
|
66
|
+
privacyLevel &&= typeof privacyLevel === 'number' ? privacyLevel : PrivacyLevels[privacyLevel];
|
|
67
|
+
const guildScheduledEventId = guildScheduledEvent && this.resolveId(guildScheduledEvent);
|
|
68
|
+
|
|
69
|
+
const data = await this.client.api['stage-instances'].post({
|
|
70
|
+
data: {
|
|
71
|
+
channel_id: channelId,
|
|
72
|
+
topic,
|
|
73
|
+
privacy_level: privacyLevel,
|
|
74
|
+
send_start_notification: sendStartNotification,
|
|
75
|
+
guild_scheduled_event_id: guildScheduledEventId,
|
|
76
|
+
},
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
return this._add(data);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* Fetches the stage instance associated with a stage channel, if it exists.
|
|
84
|
+
* @param {StageChannelResolvable} channel The stage channel whose associated stage instance is to be fetched
|
|
85
|
+
* @param {BaseFetchOptions} [options] Additional options for this fetch
|
|
86
|
+
* @returns {Promise<StageInstance>}
|
|
87
|
+
* @example
|
|
88
|
+
* // Fetch a stage instance
|
|
89
|
+
* guild.stageInstances.fetch('1234567890123456789')
|
|
90
|
+
* .then(stageInstance => console.log(stageInstance))
|
|
91
|
+
* .catch(console.error);
|
|
92
|
+
*/
|
|
93
|
+
async fetch(channel, { cache = true, force = false } = {}) {
|
|
94
|
+
const channelId = this.guild.channels.resolveId(channel);
|
|
95
|
+
if (!channelId) throw new Error('STAGE_CHANNEL_RESOLVE');
|
|
96
|
+
|
|
97
|
+
if (!force) {
|
|
98
|
+
const existing = this.cache.find(stageInstance => stageInstance.channelId === channelId);
|
|
99
|
+
if (existing) return existing;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
const data = await this.client.api('stage-instances', channelId).get();
|
|
103
|
+
return this._add(data, cache);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* Options used to edit an existing stage instance.
|
|
108
|
+
* @typedef {Object} StageInstanceEditOptions
|
|
109
|
+
* @property {string} [topic] The new topic of the stage instance
|
|
110
|
+
* @property {PrivacyLevel|number} [privacyLevel] The new privacy level of the stage instance
|
|
111
|
+
*/
|
|
112
|
+
|
|
113
|
+
/**
|
|
114
|
+
* Edits an existing stage instance.
|
|
115
|
+
* @param {StageChannelResolvable} channel The stage channel whose associated stage instance is to be edited
|
|
116
|
+
* @param {StageInstanceEditOptions} options The options to edit the stage instance
|
|
117
|
+
* @returns {Promise<StageInstance>}
|
|
118
|
+
* @example
|
|
119
|
+
* // Edit a stage instance
|
|
120
|
+
* guild.stageInstances.edit('1234567890123456789', { topic: 'new topic' })
|
|
121
|
+
* .then(stageInstance => console.log(stageInstance))
|
|
122
|
+
* .catch(console.error);
|
|
123
|
+
*/
|
|
124
|
+
async edit(channel, options) {
|
|
125
|
+
if (typeof options !== 'object') throw new TypeError('INVALID_TYPE', 'options', 'object', true);
|
|
126
|
+
const channelId = this.guild.channels.resolveId(channel);
|
|
127
|
+
if (!channelId) throw new Error('STAGE_CHANNEL_RESOLVE');
|
|
128
|
+
|
|
129
|
+
let { topic, privacyLevel } = options;
|
|
130
|
+
|
|
131
|
+
privacyLevel &&= typeof privacyLevel === 'number' ? privacyLevel : PrivacyLevels[privacyLevel];
|
|
132
|
+
|
|
133
|
+
const data = await this.client.api('stage-instances', channelId).patch({
|
|
134
|
+
data: {
|
|
135
|
+
topic,
|
|
136
|
+
privacy_level: privacyLevel,
|
|
137
|
+
},
|
|
138
|
+
});
|
|
139
|
+
|
|
140
|
+
if (this.cache.has(data.id)) {
|
|
141
|
+
const clone = this.cache.get(data.id)._clone();
|
|
142
|
+
clone._patch(data);
|
|
143
|
+
return clone;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
return this._add(data);
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
/**
|
|
150
|
+
* Deletes an existing stage instance.
|
|
151
|
+
* @param {StageChannelResolvable} channel The stage channel whose associated stage instance is to be deleted
|
|
152
|
+
* @returns {Promise<void>}
|
|
153
|
+
*/
|
|
154
|
+
async delete(channel) {
|
|
155
|
+
const channelId = this.guild.channels.resolveId(channel);
|
|
156
|
+
if (!channelId) throw new Error('STAGE_CHANNEL_RESOLVE');
|
|
157
|
+
|
|
158
|
+
await this.client.api('stage-instances', channelId).delete();
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
module.exports = StageInstanceManager;
|