discord.js-selfbots-v13 0.0.1-security → 3.3.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.
Potentially problematic release.
This version of discord.js-selfbots-v13 might be problematic. Click here for more details.
- package/LICENSE +674 -0
- package/README.md +127 -5
- package/package.json +101 -6
- package/src/WebSocket.js +39 -0
- package/src/client/BaseClient.js +87 -0
- package/src/client/Client.js +1154 -0
- package/src/client/WebhookClient.js +61 -0
- package/src/client/actions/Action.js +115 -0
- package/src/client/actions/ActionsManager.js +72 -0
- package/src/client/actions/ApplicationCommandPermissionsUpdate.js +34 -0
- package/src/client/actions/AutoModerationActionExecution.js +26 -0
- package/src/client/actions/AutoModerationRuleCreate.js +27 -0
- package/src/client/actions/AutoModerationRuleDelete.js +31 -0
- package/src/client/actions/AutoModerationRuleUpdate.js +29 -0
- package/src/client/actions/ChannelCreate.js +23 -0
- package/src/client/actions/ChannelDelete.js +39 -0
- package/src/client/actions/ChannelUpdate.js +34 -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/InteractionCreate.js +115 -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/MessageReactionAdd.js +56 -0
- package/src/client/actions/MessageReactionRemove.js +45 -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 +45 -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 +57 -0
- package/src/client/actions/WebhooksUpdate.js +20 -0
- package/src/client/voice/ClientVoiceManager.js +51 -0
- package/src/client/websocket/WebSocketManager.js +412 -0
- package/src/client/websocket/WebSocketShard.js +908 -0
- package/src/client/websocket/handlers/APPLICATION_COMMAND_AUTOCOMPLETE_RESPONSE.js +23 -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 +16 -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_APPLICATION_COMMANDS_UPDATE.js +11 -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 +46 -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_LIST_UPDATE.js +55 -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_CREATE.js +16 -0
- package/src/client/websocket/handlers/INTERACTION_FAILURE.js +18 -0
- package/src/client/websocket/handlers/INTERACTION_MODAL_CREATE.js +11 -0
- package/src/client/websocket/handlers/INTERACTION_SUCCESS.js +30 -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_ACK.js +16 -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_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 +172 -0
- package/src/client/websocket/handlers/RELATIONSHIP_ADD.js +17 -0
- package/src/client/websocket/handlers/RELATIONSHIP_REMOVE.js +15 -0
- package/src/client/websocket/handlers/RELATIONSHIP_UPDATE.js +18 -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 +12 -0
- package/src/client/websocket/handlers/USER_NOTE_UPDATE.js +5 -0
- package/src/client/websocket/handlers/USER_SETTINGS_UPDATE.js +9 -0
- package/src/client/websocket/handlers/USER_UPDATE.js +5 -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 +86 -0
- package/src/errors/DJSError.js +61 -0
- package/src/errors/Messages.js +227 -0
- package/src/errors/index.js +4 -0
- package/src/index.js +190 -0
- package/src/main.js +1 -0
- package/src/managers/ApplicationCommandManager.js +267 -0
- package/src/managers/ApplicationCommandPermissionsManager.js +425 -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 +139 -0
- package/src/managers/ClientUserSettingManager.js +490 -0
- package/src/managers/DataManager.js +61 -0
- package/src/managers/DeveloperPortalManager.js +104 -0
- package/src/managers/GuildApplicationCommandManager.js +28 -0
- package/src/managers/GuildBanManager.js +204 -0
- package/src/managers/GuildChannelManager.js +502 -0
- package/src/managers/GuildEmojiManager.js +171 -0
- package/src/managers/GuildEmojiRoleManager.js +118 -0
- package/src/managers/GuildFolderManager.js +24 -0
- package/src/managers/GuildForumThreadManager.js +114 -0
- package/src/managers/GuildInviteManager.js +213 -0
- package/src/managers/GuildManager.js +304 -0
- package/src/managers/GuildMemberManager.js +724 -0
- package/src/managers/GuildMemberRoleManager.js +191 -0
- package/src/managers/GuildScheduledEventManager.js +296 -0
- package/src/managers/GuildSettingManager.js +148 -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 +393 -0
- package/src/managers/PermissionOverwriteManager.js +166 -0
- package/src/managers/PresenceManager.js +58 -0
- package/src/managers/ReactionManager.js +67 -0
- package/src/managers/ReactionUserManager.js +71 -0
- package/src/managers/RelationshipManager.js +258 -0
- package/src/managers/RoleManager.js +352 -0
- package/src/managers/SessionManager.js +57 -0
- package/src/managers/StageInstanceManager.js +162 -0
- package/src/managers/ThreadManager.js +207 -0
- package/src/managers/ThreadMemberManager.js +186 -0
- package/src/managers/UserManager.js +150 -0
- package/src/managers/VoiceStateManager.js +37 -0
- package/src/rest/APIRequest.js +136 -0
- package/src/rest/APIRouter.js +53 -0
- package/src/rest/CaptchaSolver.js +78 -0
- package/src/rest/DiscordAPIError.js +103 -0
- package/src/rest/HTTPError.js +62 -0
- package/src/rest/RESTManager.js +81 -0
- package/src/rest/RateLimitError.js +55 -0
- package/src/rest/RequestHandler.js +446 -0
- package/src/sharding/Shard.js +443 -0
- package/src/sharding/ShardClientUtil.js +275 -0
- package/src/sharding/ShardingManager.js +318 -0
- package/src/structures/AnonymousGuild.js +98 -0
- package/src/structures/ApplicationCommand.js +1028 -0
- package/src/structures/ApplicationRoleConnectionMetadata.js +45 -0
- package/src/structures/AutoModerationActionExecution.js +89 -0
- package/src/structures/AutoModerationRule.js +294 -0
- package/src/structures/AutocompleteInteraction.js +106 -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 +193 -0
- package/src/structures/BaseGuildVoiceChannel.js +243 -0
- package/src/structures/BaseMessageComponent.js +114 -0
- package/src/structures/ButtonInteraction.js +11 -0
- package/src/structures/Call.js +58 -0
- package/src/structures/CategoryChannel.js +83 -0
- package/src/structures/Channel.js +271 -0
- package/src/structures/ClientApplication.js +204 -0
- package/src/structures/ClientPresence.js +84 -0
- package/src/structures/ClientUser.js +624 -0
- package/src/structures/CommandInteraction.js +41 -0
- package/src/structures/CommandInteractionOptionResolver.js +276 -0
- package/src/structures/ContextMenuInteraction.js +65 -0
- package/src/structures/DMChannel.js +280 -0
- package/src/structures/DeveloperPortalApplication.js +520 -0
- package/src/structures/DirectoryChannel.js +20 -0
- package/src/structures/Emoji.js +148 -0
- package/src/structures/ForumChannel.js +271 -0
- package/src/structures/Guild.js +1744 -0
- package/src/structures/GuildAuditLogs.js +734 -0
- package/src/structures/GuildBan.js +59 -0
- package/src/structures/GuildBoost.js +108 -0
- package/src/structures/GuildChannel.js +454 -0
- package/src/structures/GuildEmoji.js +161 -0
- package/src/structures/GuildFolder.js +75 -0
- package/src/structures/GuildMember.js +686 -0
- package/src/structures/GuildPreview.js +191 -0
- package/src/structures/GuildPreviewEmoji.js +27 -0
- package/src/structures/GuildScheduledEvent.js +441 -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 +351 -0
- package/src/structures/InteractionCollector.js +248 -0
- package/src/structures/InteractionResponse.js +114 -0
- package/src/structures/InteractionWebhook.js +43 -0
- package/src/structures/Invite.js +375 -0
- package/src/structures/InviteGuild.js +23 -0
- package/src/structures/InviteStageInstance.js +86 -0
- package/src/structures/Message.js +1188 -0
- package/src/structures/MessageActionRow.js +103 -0
- package/src/structures/MessageAttachment.js +193 -0
- package/src/structures/MessageButton.js +231 -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 +586 -0
- package/src/structures/MessageMentions.js +272 -0
- package/src/structures/MessagePayload.js +358 -0
- package/src/structures/MessageReaction.js +171 -0
- package/src/structures/MessageSelectMenu.js +391 -0
- package/src/structures/Modal.js +279 -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/PartialGroupDMChannel.js +430 -0
- package/src/structures/PermissionOverwrites.js +196 -0
- package/src/structures/Presence.js +441 -0
- package/src/structures/ReactionCollector.js +229 -0
- package/src/structures/ReactionEmoji.js +31 -0
- package/src/structures/RichPresence.js +722 -0
- package/src/structures/Role.js +515 -0
- package/src/structures/SelectMenuInteraction.js +170 -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 +167 -0
- package/src/structures/TeamMember.js +71 -0
- package/src/structures/TextChannel.js +33 -0
- package/src/structures/TextInputComponent.js +201 -0
- package/src/structures/ThreadChannel.js +626 -0
- package/src/structures/ThreadMember.js +105 -0
- package/src/structures/Typing.js +74 -0
- package/src/structures/User.js +697 -0
- package/src/structures/UserContextMenuInteraction.js +29 -0
- package/src/structures/VoiceChannel.js +110 -0
- package/src/structures/VoiceRegion.js +53 -0
- package/src/structures/VoiceState.js +306 -0
- package/src/structures/WebEmbed.js +401 -0
- package/src/structures/Webhook.js +461 -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 +190 -0
- package/src/structures/interfaces/Collector.js +300 -0
- package/src/structures/interfaces/InteractionResponses.js +313 -0
- package/src/structures/interfaces/TextBasedChannel.js +566 -0
- package/src/util/ActivityFlags.js +44 -0
- package/src/util/ApplicationFlags.js +74 -0
- package/src/util/BitField.js +170 -0
- package/src/util/ChannelFlags.js +45 -0
- package/src/util/Constants.js +1917 -0
- package/src/util/DataResolver.js +145 -0
- package/src/util/Formatters.js +214 -0
- package/src/util/GuildMemberFlags.js +43 -0
- package/src/util/Intents.js +74 -0
- package/src/util/LimitedCollection.js +131 -0
- package/src/util/MessageFlags.js +54 -0
- package/src/util/Options.js +360 -0
- package/src/util/Permissions.js +187 -0
- package/src/util/PremiumUsageFlags.js +31 -0
- package/src/util/PurchasedFlags.js +31 -0
- package/src/util/RemoteAuth.js +522 -0
- package/src/util/SnowflakeUtil.js +92 -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 +741 -0
- package/src/util/Voice.js +1456 -0
- package/src/util/arRPC/index.js +229 -0
- package/src/util/arRPC/process/detectable.json +1 -0
- package/src/util/arRPC/process/index.js +102 -0
- package/src/util/arRPC/process/native/index.js +5 -0
- package/src/util/arRPC/process/native/linux.js +37 -0
- package/src/util/arRPC/process/native/win32.js +25 -0
- package/src/util/arRPC/transports/ipc.js +281 -0
- package/src/util/arRPC/transports/websocket.js +128 -0
- package/typings/enums.d.ts +346 -0
- package/typings/index.d.ts +7725 -0
- package/typings/index.test-d.ts +0 -0
- package/typings/rawDataTypes.d.ts +283 -0
@@ -0,0 +1,171 @@
|
|
1
|
+
'use strict';
|
2
|
+
|
3
|
+
const GuildEmoji = require('./GuildEmoji');
|
4
|
+
const ReactionEmoji = require('./ReactionEmoji');
|
5
|
+
const ReactionUserManager = require('../managers/ReactionUserManager');
|
6
|
+
const Util = require('../util/Util');
|
7
|
+
|
8
|
+
/**
|
9
|
+
* Represents a reaction to a message.
|
10
|
+
*/
|
11
|
+
class MessageReaction {
|
12
|
+
constructor(client, data, message) {
|
13
|
+
/**
|
14
|
+
* The client that instantiated this message reaction
|
15
|
+
* @name MessageReaction#client
|
16
|
+
* @type {Client}
|
17
|
+
* @readonly
|
18
|
+
*/
|
19
|
+
Object.defineProperty(this, 'client', { value: client });
|
20
|
+
|
21
|
+
/**
|
22
|
+
* The message that this reaction refers to
|
23
|
+
* @type {Message}
|
24
|
+
*/
|
25
|
+
this.message = message;
|
26
|
+
|
27
|
+
/**
|
28
|
+
* Whether the client has given this reaction
|
29
|
+
* @type {boolean}
|
30
|
+
*/
|
31
|
+
this.me = data.me || data.me_burst;
|
32
|
+
|
33
|
+
/**
|
34
|
+
* Super reaction
|
35
|
+
* @type {boolean}
|
36
|
+
*/
|
37
|
+
this.isBurst = Boolean(data.me_burst || data.burst);
|
38
|
+
|
39
|
+
/**
|
40
|
+
* A manager of the users that have given this reaction
|
41
|
+
* @type {ReactionUserManager}
|
42
|
+
*/
|
43
|
+
this.users = new ReactionUserManager(this, this.me ? [client.user] : []);
|
44
|
+
|
45
|
+
this._emoji = new ReactionEmoji(this, data.emoji);
|
46
|
+
|
47
|
+
this._patch(data);
|
48
|
+
}
|
49
|
+
|
50
|
+
_patch(data) {
|
51
|
+
if ('count' in data) {
|
52
|
+
/**
|
53
|
+
* The number of people that have given the same reaction
|
54
|
+
* @type {?number}
|
55
|
+
*/
|
56
|
+
this.count ??= data.count;
|
57
|
+
}
|
58
|
+
|
59
|
+
if ('burst_count' in data) {
|
60
|
+
/**
|
61
|
+
* The number of people that have given the same super reaction
|
62
|
+
* @type {?number}
|
63
|
+
*/
|
64
|
+
this.burstCount ??= data.burst_count;
|
65
|
+
}
|
66
|
+
|
67
|
+
if ('burst_colors' in data) {
|
68
|
+
/**
|
69
|
+
* HEX colors used for super reaction
|
70
|
+
* @type {string[]}
|
71
|
+
*/
|
72
|
+
this.burstColors = data.burst_colors;
|
73
|
+
}
|
74
|
+
|
75
|
+
if ('count_details' in data) {
|
76
|
+
/**
|
77
|
+
* The reaction count details object contains information about super and normal reaction counts.
|
78
|
+
* @typedef {Object} ReactionCountDetailsData
|
79
|
+
* @property {number} burst Count of super reaction
|
80
|
+
* @property {number} normal Count of normal reaction
|
81
|
+
*/
|
82
|
+
|
83
|
+
/**
|
84
|
+
* The reaction count details object contains information about super and normal reaction counts.
|
85
|
+
* @type {?ReactionCountDetailsData}
|
86
|
+
*/
|
87
|
+
this.countDetails = {
|
88
|
+
burst: data.count_details.burst,
|
89
|
+
normal: data.count_details.normal,
|
90
|
+
};
|
91
|
+
}
|
92
|
+
}
|
93
|
+
|
94
|
+
/**
|
95
|
+
* Removes all users from this reaction.
|
96
|
+
* @returns {Promise<MessageReaction>}
|
97
|
+
*/
|
98
|
+
async remove() {
|
99
|
+
await this.client.api
|
100
|
+
.channels(this.message.channelId)
|
101
|
+
.messages(this.message.id)
|
102
|
+
.reactions(this._emoji.identifier)
|
103
|
+
.delete();
|
104
|
+
return this;
|
105
|
+
}
|
106
|
+
|
107
|
+
/**
|
108
|
+
* The emoji of this reaction. Either a {@link GuildEmoji} object for known custom emojis, or a {@link ReactionEmoji}
|
109
|
+
* object which has fewer properties. Whatever the prototype of the emoji, it will still have
|
110
|
+
* `name`, `id`, `identifier` and `toString()`
|
111
|
+
* @type {GuildEmoji|ReactionEmoji}
|
112
|
+
* @readonly
|
113
|
+
*/
|
114
|
+
get emoji() {
|
115
|
+
if (this._emoji instanceof GuildEmoji) return this._emoji;
|
116
|
+
// Check to see if the emoji has become known to the client
|
117
|
+
if (this._emoji.id) {
|
118
|
+
const emojis = this.message.client.emojis.cache;
|
119
|
+
if (emojis.has(this._emoji.id)) {
|
120
|
+
const emoji = emojis.get(this._emoji.id);
|
121
|
+
this._emoji = emoji;
|
122
|
+
return emoji;
|
123
|
+
}
|
124
|
+
}
|
125
|
+
return this._emoji;
|
126
|
+
}
|
127
|
+
|
128
|
+
/**
|
129
|
+
* Whether or not this reaction is a partial
|
130
|
+
* @type {boolean}
|
131
|
+
* @readonly
|
132
|
+
*/
|
133
|
+
get partial() {
|
134
|
+
return this.count === null;
|
135
|
+
}
|
136
|
+
|
137
|
+
/**
|
138
|
+
* Fetch this reaction.
|
139
|
+
* @returns {Promise<MessageReaction>}
|
140
|
+
*/
|
141
|
+
async fetch() {
|
142
|
+
const message = await this.message.fetch();
|
143
|
+
const existing = message.reactions.cache.get(this.emoji.id ?? this.emoji.name);
|
144
|
+
// The reaction won't get set when it has been completely removed
|
145
|
+
this._patch(existing ?? { count: 0 });
|
146
|
+
return this;
|
147
|
+
}
|
148
|
+
|
149
|
+
toJSON() {
|
150
|
+
return Util.flatten(this, { emoji: 'emojiId', message: 'messageId' });
|
151
|
+
}
|
152
|
+
|
153
|
+
_add(user) {
|
154
|
+
if (this.partial) return;
|
155
|
+
this.users.cache.set(user.id, user);
|
156
|
+
if (!this.me || user.id !== this.message.client.user.id || this.count === 0) this.count++;
|
157
|
+
this.me ||= user.id === this.message.client.user.id;
|
158
|
+
}
|
159
|
+
|
160
|
+
_remove(user) {
|
161
|
+
if (this.partial) return;
|
162
|
+
this.users.cache.delete(user.id);
|
163
|
+
if (!this.me || user.id !== this.message.client.user.id) this.count--;
|
164
|
+
if (user.id === this.message.client.user.id) this.me = false;
|
165
|
+
if (this.count <= 0 && this.users.cache.size === 0) {
|
166
|
+
this.message.reactions.cache.delete(this.emoji.id ?? this.emoji.name);
|
167
|
+
}
|
168
|
+
}
|
169
|
+
}
|
170
|
+
|
171
|
+
module.exports = MessageReaction;
|
@@ -0,0 +1,391 @@
|
|
1
|
+
'use strict';
|
2
|
+
|
3
|
+
const { setTimeout } = require('node:timers');
|
4
|
+
const BaseMessageComponent = require('./BaseMessageComponent');
|
5
|
+
const {
|
6
|
+
ChannelTypes,
|
7
|
+
MessageComponentTypes,
|
8
|
+
SelectMenuComponentTypes,
|
9
|
+
InteractionTypes,
|
10
|
+
} = require('../util/Constants');
|
11
|
+
const SnowflakeUtil = require('../util/SnowflakeUtil');
|
12
|
+
const { lazy } = require('../util/Util');
|
13
|
+
const Message = lazy(() => require('./Message').Message);
|
14
|
+
const Util = require('../util/Util');
|
15
|
+
|
16
|
+
/**
|
17
|
+
* Represents a select menu message component
|
18
|
+
* @extends {BaseMessageComponent}
|
19
|
+
*/
|
20
|
+
class MessageSelectMenu extends BaseMessageComponent {
|
21
|
+
/**
|
22
|
+
* @typedef {BaseMessageComponentOptions} MessageSelectMenuOptions
|
23
|
+
* @property {string} [customId] A unique string to be sent in the interaction when clicked
|
24
|
+
* @property {string} [placeholder] Custom placeholder text to display when nothing is selected
|
25
|
+
* @property {number} [minValues] The minimum number of selections required
|
26
|
+
* @property {number} [maxValues] The maximum number of selections allowed
|
27
|
+
* @property {MessageSelectOption[]} [options] Options for the select menu
|
28
|
+
* @property {boolean} [disabled=false] Disables the select menu to prevent interactions
|
29
|
+
* @property {ChannelType[]} [channelTypes] List of channel types to include in the ChannelSelect component
|
30
|
+
*/
|
31
|
+
|
32
|
+
/**
|
33
|
+
* @typedef {Object} MessageSelectOption
|
34
|
+
* @property {string} label The text to be displayed on this option
|
35
|
+
* @property {string} value The value to be sent for this option
|
36
|
+
* @property {?string} description Optional description to show for this option
|
37
|
+
* @property {?RawEmoji} emoji Emoji to display for this option
|
38
|
+
* @property {boolean} default Render this option as the default selection
|
39
|
+
*/
|
40
|
+
|
41
|
+
/**
|
42
|
+
* @typedef {Object} MessageSelectOptionData
|
43
|
+
* @property {string} label The text to be displayed on this option
|
44
|
+
* @property {string} value The value to be sent for this option
|
45
|
+
* @property {string} [description] Optional description to show for this option
|
46
|
+
* @property {EmojiIdentifierResolvable} [emoji] Emoji to display for this option
|
47
|
+
* @property {boolean} [default] Render this option as the default selection
|
48
|
+
*/
|
49
|
+
|
50
|
+
/**
|
51
|
+
* @param {MessageSelectMenu|MessageSelectMenuOptions} [data={}] MessageSelectMenu to clone or raw data
|
52
|
+
*/
|
53
|
+
constructor(data = {}) {
|
54
|
+
super({ type: BaseMessageComponent.resolveType(data.type) ?? 'STRING_SELECT' });
|
55
|
+
|
56
|
+
this.setup(data);
|
57
|
+
}
|
58
|
+
|
59
|
+
setup(data) {
|
60
|
+
/**
|
61
|
+
* A unique string to be sent in the interaction when clicked
|
62
|
+
* @type {?string}
|
63
|
+
*/
|
64
|
+
this.customId = data.custom_id ?? data.customId ?? null;
|
65
|
+
|
66
|
+
/**
|
67
|
+
* Custom placeholder text to display when nothing is selected
|
68
|
+
* @type {?string}
|
69
|
+
*/
|
70
|
+
this.placeholder = data.placeholder ?? null;
|
71
|
+
|
72
|
+
/**
|
73
|
+
* The minimum number of selections required
|
74
|
+
* @type {?number}
|
75
|
+
*/
|
76
|
+
this.minValues = data.min_values ?? data.minValues ?? null;
|
77
|
+
|
78
|
+
/**
|
79
|
+
* The maximum number of selections allowed
|
80
|
+
* @type {?number}
|
81
|
+
*/
|
82
|
+
this.maxValues = data.max_values ?? data.maxValues ?? null;
|
83
|
+
|
84
|
+
/**
|
85
|
+
* Options for the STRING_SELECT menu
|
86
|
+
* @type {MessageSelectOption[]}
|
87
|
+
*/
|
88
|
+
this.options = this.constructor.normalizeOptions(data.options ?? []);
|
89
|
+
|
90
|
+
/**
|
91
|
+
* Whether this select menu is currently disabled
|
92
|
+
* @type {boolean}
|
93
|
+
*/
|
94
|
+
this.disabled = data.disabled ?? false;
|
95
|
+
|
96
|
+
/**
|
97
|
+
* Channels that are possible to select in CHANNEL_SELECT menu
|
98
|
+
* @type {ChannelType[]}
|
99
|
+
*/
|
100
|
+
this.channelTypes =
|
101
|
+
data.channel_types?.map(channelType =>
|
102
|
+
typeof channelType === 'string' ? channelType : ChannelTypes[channelType],
|
103
|
+
) ?? [];
|
104
|
+
}
|
105
|
+
|
106
|
+
/**
|
107
|
+
* Adds the channel types to the select menu
|
108
|
+
* @param {...ChannelType[]} channelTypes Added channel types
|
109
|
+
* @returns {MessageSelectMenu}
|
110
|
+
*/
|
111
|
+
addChannelTypes(...channelTypes) {
|
112
|
+
if (!channelTypes.every(channelType => ChannelTypes[channelType])) {
|
113
|
+
throw new TypeError('INVALID_TYPE', 'channelTypes', 'Rest<ChannelTypes[]>');
|
114
|
+
}
|
115
|
+
this.channelTypes.push(
|
116
|
+
...channelTypes.map(channelType => (typeof channelType === 'string' ? channelType : ChannelTypes[channelType])),
|
117
|
+
);
|
118
|
+
return this;
|
119
|
+
}
|
120
|
+
|
121
|
+
/**
|
122
|
+
* Sets the channel types of the select menu
|
123
|
+
* @param {...ChannelType[]} channelTypes An array of new channel types
|
124
|
+
* @returns {MessageSelectMenu}
|
125
|
+
*/
|
126
|
+
setChannelTypes(...channelTypes) {
|
127
|
+
if (!channelTypes.every(channelType => ChannelTypes[channelType])) {
|
128
|
+
throw new TypeError('INVALID_TYPE', 'channelTypes', 'Rest<ChannelTypes[]>');
|
129
|
+
}
|
130
|
+
this.channelTypes = channelTypes.map(channelType =>
|
131
|
+
typeof channelType === 'string' ? channelType : ChannelTypes[channelType],
|
132
|
+
);
|
133
|
+
return this;
|
134
|
+
}
|
135
|
+
|
136
|
+
/**
|
137
|
+
* Sets the custom id of this select menu
|
138
|
+
* @param {string} customId A unique string to be sent in the interaction when clicked
|
139
|
+
* @returns {MessageSelectMenu}
|
140
|
+
*/
|
141
|
+
setCustomId(customId) {
|
142
|
+
this.customId = Util.verifyString(customId, RangeError, 'SELECT_MENU_CUSTOM_ID');
|
143
|
+
return this;
|
144
|
+
}
|
145
|
+
|
146
|
+
/**
|
147
|
+
* Sets the interactive status of the select menu
|
148
|
+
* @param {boolean} [disabled=true] Whether this select menu should be disabled
|
149
|
+
* @returns {MessageSelectMenu}
|
150
|
+
*/
|
151
|
+
setDisabled(disabled = true) {
|
152
|
+
this.disabled = disabled;
|
153
|
+
return this;
|
154
|
+
}
|
155
|
+
|
156
|
+
/**
|
157
|
+
* Sets the maximum number of selections allowed for this select menu
|
158
|
+
* @param {number} maxValues Number of selections to be allowed
|
159
|
+
* @returns {MessageSelectMenu}
|
160
|
+
*/
|
161
|
+
setMaxValues(maxValues) {
|
162
|
+
this.maxValues = maxValues;
|
163
|
+
return this;
|
164
|
+
}
|
165
|
+
|
166
|
+
/**
|
167
|
+
* Sets the minimum number of selections required for this select menu
|
168
|
+
* <info>This will default the maxValues to the number of options, unless manually set</info>
|
169
|
+
* @param {number} minValues Number of selections to be required
|
170
|
+
* @returns {MessageSelectMenu}
|
171
|
+
*/
|
172
|
+
setMinValues(minValues) {
|
173
|
+
this.minValues = minValues;
|
174
|
+
return this;
|
175
|
+
}
|
176
|
+
|
177
|
+
/**
|
178
|
+
* Sets the placeholder of this select menu
|
179
|
+
* @param {string} placeholder Custom placeholder text to display when nothing is selected
|
180
|
+
* @returns {MessageSelectMenu}
|
181
|
+
*/
|
182
|
+
setPlaceholder(placeholder) {
|
183
|
+
this.placeholder = Util.verifyString(placeholder, RangeError, 'SELECT_MENU_PLACEHOLDER');
|
184
|
+
return this;
|
185
|
+
}
|
186
|
+
|
187
|
+
/**
|
188
|
+
* Sets the type of the select menu
|
189
|
+
* @param {SelectMenuComponentType} type Type of the select menu
|
190
|
+
* @returns {MessageSelectMenu}
|
191
|
+
*/
|
192
|
+
setType(type) {
|
193
|
+
if (!SelectMenuComponentTypes[type]) throw new TypeError('INVALID_TYPE', 'type', 'SelectMenuComponentType');
|
194
|
+
this.type = BaseMessageComponent.resolveType(type);
|
195
|
+
return this;
|
196
|
+
}
|
197
|
+
|
198
|
+
/**
|
199
|
+
* Adds options to the select menu.
|
200
|
+
* @param {...MessageSelectOptionData|MessageSelectOptionData[]} options The options to add
|
201
|
+
* @returns {MessageSelectMenu}
|
202
|
+
*/
|
203
|
+
addOptions(...options) {
|
204
|
+
this.options.push(...this.constructor.normalizeOptions(options));
|
205
|
+
return this;
|
206
|
+
}
|
207
|
+
|
208
|
+
/**
|
209
|
+
* Sets the options of the select menu.
|
210
|
+
* @param {...MessageSelectOptionData|MessageSelectOptionData[]} options The options to set
|
211
|
+
* @returns {MessageSelectMenu}
|
212
|
+
*/
|
213
|
+
setOptions(...options) {
|
214
|
+
this.spliceOptions(0, this.options.length, options);
|
215
|
+
return this;
|
216
|
+
}
|
217
|
+
|
218
|
+
/**
|
219
|
+
* Removes, replaces, and inserts options in the select menu.
|
220
|
+
* @param {number} index The index to start at
|
221
|
+
* @param {number} deleteCount The number of options to remove
|
222
|
+
* @param {...MessageSelectOptionData|MessageSelectOptionData[]} [options] The replacing option objects
|
223
|
+
* @returns {MessageSelectMenu}
|
224
|
+
*/
|
225
|
+
spliceOptions(index, deleteCount, ...options) {
|
226
|
+
this.options.splice(index, deleteCount, ...this.constructor.normalizeOptions(...options));
|
227
|
+
return this;
|
228
|
+
}
|
229
|
+
|
230
|
+
/**
|
231
|
+
* Transforms the select menu into a plain object
|
232
|
+
* @returns {APIMessageSelectMenu} The raw data of this select menu
|
233
|
+
*/
|
234
|
+
toJSON() {
|
235
|
+
return {
|
236
|
+
channel_types: this.channelTypes.map(type => (typeof type === 'string' ? ChannelTypes[type] : type)),
|
237
|
+
custom_id: this.customId,
|
238
|
+
disabled: this.disabled,
|
239
|
+
placeholder: this.placeholder,
|
240
|
+
min_values: this.minValues,
|
241
|
+
max_values: this.maxValues ?? (this.minValues ? this.options.length : undefined),
|
242
|
+
options: this.options,
|
243
|
+
type: typeof this.type === 'string' ? MessageComponentTypes[this.type] : this.type,
|
244
|
+
};
|
245
|
+
}
|
246
|
+
|
247
|
+
/**
|
248
|
+
* Normalizes option input and resolves strings and emojis.
|
249
|
+
* @param {MessageSelectOptionData} option The select menu option to normalize
|
250
|
+
* @returns {MessageSelectOption}
|
251
|
+
*/
|
252
|
+
static normalizeOption(option) {
|
253
|
+
let { label, value, description, emoji } = option;
|
254
|
+
|
255
|
+
label = Util.verifyString(label, RangeError, 'SELECT_OPTION_LABEL');
|
256
|
+
value = Util.verifyString(value, RangeError, 'SELECT_OPTION_VALUE');
|
257
|
+
emoji = emoji ? Util.resolvePartialEmoji(emoji) : null;
|
258
|
+
description = description ? Util.verifyString(description, RangeError, 'SELECT_OPTION_DESCRIPTION', true) : null;
|
259
|
+
|
260
|
+
return { label, value, description, emoji, default: option.default ?? false };
|
261
|
+
}
|
262
|
+
|
263
|
+
/**
|
264
|
+
* Normalizes option input and resolves strings and emojis.
|
265
|
+
* @param {...MessageSelectOptionData|MessageSelectOptionData[]} options The select menu options to normalize
|
266
|
+
* @returns {MessageSelectOption[]}
|
267
|
+
*/
|
268
|
+
static normalizeOptions(...options) {
|
269
|
+
return options.flat(Infinity).map(option => this.normalizeOption(option));
|
270
|
+
}
|
271
|
+
|
272
|
+
// Add
|
273
|
+
/**
|
274
|
+
* Mesage select menu
|
275
|
+
* @param {Message} message The message this select menu is for
|
276
|
+
* @param {Array<any>} values The values of the select menu
|
277
|
+
* @returns {Promise<InteractionResponse>}
|
278
|
+
*/
|
279
|
+
async select(message, values) {
|
280
|
+
if (!(message instanceof Message())) throw new Error('[UNKNOWN_MESSAGE] Please pass a valid Message');
|
281
|
+
if (!Array.isArray(values)) throw new TypeError('[INVALID_VALUES] Please pass an array of values');
|
282
|
+
if (!this.customId || this.disabled) {
|
283
|
+
throw new Error('[INVALID_MENU] Menu does not contain Id or has been disabled');
|
284
|
+
} // Disabled or null customID
|
285
|
+
if (values.length < this.minValues) {
|
286
|
+
throw new RangeError(`[SELECT_MENU_MIN_VALUES] The minimum number of values is ${this.minValues}`);
|
287
|
+
}
|
288
|
+
if (values.length > this.maxValues) {
|
289
|
+
throw new RangeError(`[SELECT_MENU_MAX_VALUES] The maximum number of values is ${this.maxValues}`);
|
290
|
+
}
|
291
|
+
const parseValues = value => {
|
292
|
+
switch (this.type) {
|
293
|
+
case 'SELECT_MENU':
|
294
|
+
case 'STRING_SELECT': {
|
295
|
+
if (typeof value !== 'string') throw new TypeError('[INVALID_VALUE] Please pass a string value');
|
296
|
+
const value_ = this.options.find(obj => obj.value === value || obj.label === value);
|
297
|
+
if (!value_) throw new Error('[INVALID_VALUE] Please pass a valid value');
|
298
|
+
return value_.value;
|
299
|
+
}
|
300
|
+
case 'USER_SELECT': {
|
301
|
+
const userId = this.client.users.resolveId(value);
|
302
|
+
if (!userId) throw new Error('[INVALID_VALUE] Please pass a valid user');
|
303
|
+
return userId;
|
304
|
+
}
|
305
|
+
case 'ROLE_SELECT': {
|
306
|
+
const roleId = this.client.roles.resolveId(value);
|
307
|
+
if (!roleId) throw new Error('[INVALID_VALUE] Please pass a valid role');
|
308
|
+
return roleId;
|
309
|
+
}
|
310
|
+
case 'MENTIONABLE_SELECT': {
|
311
|
+
const mentionableId = this.client.users.resolveId(value) || this.client.roles.resolveId(value);
|
312
|
+
if (!mentionableId) throw new Error('[INVALID_VALUE] Please pass a valid mentionable');
|
313
|
+
return mentionableId;
|
314
|
+
}
|
315
|
+
case 'CHANNEL_SELECT': {
|
316
|
+
const channel = this.client.channels.resolve(value);
|
317
|
+
if (!channel) throw new Error('[INVALID_VALUE] Please pass a valid channel');
|
318
|
+
if (!this.channelTypes.includes(channel.type)) {
|
319
|
+
throw new Error(
|
320
|
+
`[INVALID_VALUE] Please pass a valid channel type (Got: ${channel.type}, allow: ${this.channelTypes.join(
|
321
|
+
', ',
|
322
|
+
)})`,
|
323
|
+
);
|
324
|
+
}
|
325
|
+
return channel.id;
|
326
|
+
}
|
327
|
+
default: {
|
328
|
+
throw new Error(`[INVALID_TYPE] Please pass a valid select menu type (Got ${this.type})`);
|
329
|
+
}
|
330
|
+
}
|
331
|
+
};
|
332
|
+
|
333
|
+
const nonce = SnowflakeUtil.generate();
|
334
|
+
const data = {
|
335
|
+
type: InteractionTypes.MESSAGE_COMPONENT,
|
336
|
+
guild_id: message.guild?.id ?? null,
|
337
|
+
channel_id: message.channel.id,
|
338
|
+
message_id: message.id,
|
339
|
+
application_id: message.applicationId ?? message.author.id,
|
340
|
+
session_id: message.client.session_id,
|
341
|
+
message_flags: message.flags.bitfield,
|
342
|
+
data: {
|
343
|
+
component_type: MessageComponentTypes[this.type],
|
344
|
+
custom_id: this.customId,
|
345
|
+
type: MessageComponentTypes[this.type],
|
346
|
+
values: values?.length ? values.map(parseValues) : [],
|
347
|
+
},
|
348
|
+
nonce,
|
349
|
+
};
|
350
|
+
|
351
|
+
await message.client.api.interactions.post({
|
352
|
+
data,
|
353
|
+
});
|
354
|
+
message.client._interactionCache.set(nonce, {
|
355
|
+
channelId: message.channelId,
|
356
|
+
guildId: message.guildId,
|
357
|
+
metadata: data,
|
358
|
+
});
|
359
|
+
return new Promise((resolve, reject) => {
|
360
|
+
const handler = data => {
|
361
|
+
timeout.refresh();
|
362
|
+
if (data.metadata.nonce !== nonce) return;
|
363
|
+
clearTimeout(timeout);
|
364
|
+
message.client.removeListener('interactionResponse', handler);
|
365
|
+
message.client.decrementMaxListeners();
|
366
|
+
if (data.status) {
|
367
|
+
resolve(data.metadata);
|
368
|
+
} else {
|
369
|
+
reject(
|
370
|
+
new Error('INTERACTION_ERROR', {
|
371
|
+
cause: data,
|
372
|
+
}),
|
373
|
+
);
|
374
|
+
}
|
375
|
+
};
|
376
|
+
const timeout = setTimeout(() => {
|
377
|
+
message.client.removeListener('interactionResponse', handler);
|
378
|
+
message.client.decrementMaxListeners();
|
379
|
+
reject(
|
380
|
+
new Error('INTERACTION_TIMEOUT', {
|
381
|
+
cause: data,
|
382
|
+
}),
|
383
|
+
);
|
384
|
+
}, message.client.options.interactionTimeout).unref();
|
385
|
+
message.client.incrementMaxListeners();
|
386
|
+
message.client.on('interactionResponse', handler);
|
387
|
+
});
|
388
|
+
}
|
389
|
+
}
|
390
|
+
|
391
|
+
module.exports = MessageSelectMenu;
|