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,181 @@
|
|
|
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;
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Whether the client has super-reacted using this emoji
|
|
35
|
+
* @type {boolean}
|
|
36
|
+
*/
|
|
37
|
+
this.meBurst = Boolean(data.me_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.burstColors = null;
|
|
48
|
+
|
|
49
|
+
this._patch(data);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
_patch(data) {
|
|
53
|
+
if (data.burst_colors) {
|
|
54
|
+
/**
|
|
55
|
+
* Hexadecimal colors used for this super reaction
|
|
56
|
+
* @type {?string[]}
|
|
57
|
+
*/
|
|
58
|
+
this.burstColors = data.burst_colors;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
if ('count' in data) {
|
|
62
|
+
/**
|
|
63
|
+
* The number of people that have given the same reaction
|
|
64
|
+
* @type {?number}
|
|
65
|
+
*/
|
|
66
|
+
this.count ??= data.count;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
if ('count_details' in data) {
|
|
70
|
+
/**
|
|
71
|
+
* The reaction count details object contains information about super and normal reaction counts.
|
|
72
|
+
* @typedef {Object} ReactionCountDetailsData
|
|
73
|
+
* @property {number} burst Count of super reactions
|
|
74
|
+
* @property {number} normal Count of normal reactions
|
|
75
|
+
*/
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* The reaction count details object contains information about super and normal reaction counts.
|
|
79
|
+
* @type {ReactionCountDetailsData}
|
|
80
|
+
*/
|
|
81
|
+
this.countDetails = {
|
|
82
|
+
burst: data.count_details.burst,
|
|
83
|
+
normal: data.count_details.normal,
|
|
84
|
+
};
|
|
85
|
+
} else {
|
|
86
|
+
this.countDetails ??= { burst: 0, normal: 0 };
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* Removes all users from this reaction.
|
|
92
|
+
* @returns {Promise<MessageReaction>}
|
|
93
|
+
*/
|
|
94
|
+
async remove() {
|
|
95
|
+
await this.client.api
|
|
96
|
+
.channels(this.message.channelId)
|
|
97
|
+
.messages(this.message.id)
|
|
98
|
+
.reactions(this._emoji.identifier)
|
|
99
|
+
.delete();
|
|
100
|
+
return this;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* The emoji of this reaction. Either a {@link GuildEmoji} object for known custom emojis, or a {@link ReactionEmoji}
|
|
105
|
+
* object which has fewer properties. Whatever the prototype of the emoji, it will still have
|
|
106
|
+
* `name`, `id`, `identifier` and `toString()`
|
|
107
|
+
* @type {GuildEmoji|ReactionEmoji}
|
|
108
|
+
* @readonly
|
|
109
|
+
*/
|
|
110
|
+
get emoji() {
|
|
111
|
+
if (this._emoji instanceof GuildEmoji) return this._emoji;
|
|
112
|
+
// Check to see if the emoji has become known to the client
|
|
113
|
+
if (this._emoji.id) {
|
|
114
|
+
const emojis = this.message.client.emojis.cache;
|
|
115
|
+
if (emojis.has(this._emoji.id)) {
|
|
116
|
+
const emoji = emojis.get(this._emoji.id);
|
|
117
|
+
this._emoji = emoji;
|
|
118
|
+
return emoji;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
return this._emoji;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
/**
|
|
125
|
+
* Whether or not this reaction is a partial
|
|
126
|
+
* @type {boolean}
|
|
127
|
+
* @readonly
|
|
128
|
+
*/
|
|
129
|
+
get partial() {
|
|
130
|
+
return this.count === null;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
/**
|
|
134
|
+
* Fetch this reaction.
|
|
135
|
+
* @returns {Promise<MessageReaction>}
|
|
136
|
+
*/
|
|
137
|
+
async fetch() {
|
|
138
|
+
const message = await this.message.fetch();
|
|
139
|
+
const existing = message.reactions.cache.get(this.emoji.id ?? this.emoji.name);
|
|
140
|
+
// The reaction won't get set when it has been completely removed
|
|
141
|
+
this._patch(existing ?? { count: 0 });
|
|
142
|
+
return this;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
toJSON() {
|
|
146
|
+
return Util.flatten(this, { emoji: 'emojiId', message: 'messageId' });
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
_add(user, burst) {
|
|
150
|
+
if (this.partial) return;
|
|
151
|
+
this.users.cache.set(user.id, user);
|
|
152
|
+
if (!this.me || user.id !== this.message.client.user.id || this.count === 0) {
|
|
153
|
+
this.count++;
|
|
154
|
+
if (burst) this.countDetails.burst++;
|
|
155
|
+
else this.countDetails.normal++;
|
|
156
|
+
}
|
|
157
|
+
if (user.id === this.message.client.user.id) {
|
|
158
|
+
if (burst) this.meBurst = true;
|
|
159
|
+
else this.me = true;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
_remove(user, burst) {
|
|
164
|
+
if (this.partial) return;
|
|
165
|
+
this.users.cache.delete(user.id);
|
|
166
|
+
if (!this.me || user.id !== this.message.client.user.id) {
|
|
167
|
+
this.count--;
|
|
168
|
+
if (burst) this.countDetails.burst--;
|
|
169
|
+
else this.countDetails.normal--;
|
|
170
|
+
}
|
|
171
|
+
if (user.id === this.message.client.user.id) {
|
|
172
|
+
if (burst) this.meBurst = false;
|
|
173
|
+
else this.me = false;
|
|
174
|
+
}
|
|
175
|
+
if (this.count <= 0 && this.users.cache.size === 0) {
|
|
176
|
+
this.message.reactions.cache.delete(this.emoji.id ?? this.emoji.name);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
module.exports = MessageReaction;
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const BaseMessageComponent = require('./BaseMessageComponent');
|
|
4
|
+
const { ChannelTypes, MessageComponentTypes } = require('../util/Constants');
|
|
5
|
+
const Util = require('../util/Util');
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Represents a select menu message component
|
|
9
|
+
* @extends {BaseMessageComponent}
|
|
10
|
+
*/
|
|
11
|
+
class MessageSelectMenu extends BaseMessageComponent {
|
|
12
|
+
/**
|
|
13
|
+
* @typedef {BaseMessageComponentOptions} MessageSelectMenuOptions
|
|
14
|
+
* @property {string} [customId] A unique string to be sent in the interaction when clicked
|
|
15
|
+
* @property {string} [placeholder] Custom placeholder text to display when nothing is selected
|
|
16
|
+
* @property {number} [minValues] The minimum number of selections required
|
|
17
|
+
* @property {number} [maxValues] The maximum number of selections allowed
|
|
18
|
+
* @property {MessageSelectOption[]} [options] Options for the select menu
|
|
19
|
+
* @property {boolean} [disabled=false] Disables the select menu to prevent interactions
|
|
20
|
+
* @property {ChannelType[]} [channelTypes] List of channel types to include in the ChannelSelect component
|
|
21
|
+
*/
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* @typedef {Object} MessageSelectOption
|
|
25
|
+
* @property {string} label The text to be displayed on this option
|
|
26
|
+
* @property {string} value The value to be sent for this option
|
|
27
|
+
* @property {?string} description Optional description to show for this option
|
|
28
|
+
* @property {?RawEmoji} emoji Emoji to display for this option
|
|
29
|
+
* @property {boolean} default Render this option as the default selection
|
|
30
|
+
*/
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* @typedef {Object} MessageSelectOptionData
|
|
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 {EmojiIdentifierResolvable} [emoji] Emoji to display for this option
|
|
38
|
+
* @property {boolean} [default] Render this option as the default selection
|
|
39
|
+
*/
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* @param {MessageSelectMenu|MessageSelectMenuOptions} [data={}] MessageSelectMenu to clone or raw data
|
|
43
|
+
*/
|
|
44
|
+
constructor(data = {}) {
|
|
45
|
+
super({ type: BaseMessageComponent.resolveType(data.type) ?? 'STRING_SELECT' });
|
|
46
|
+
|
|
47
|
+
this.setup(data);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
setup(data) {
|
|
51
|
+
super.setup(data);
|
|
52
|
+
/**
|
|
53
|
+
* A unique string to be sent in the interaction when clicked
|
|
54
|
+
* @type {?string}
|
|
55
|
+
*/
|
|
56
|
+
this.customId = data.custom_id ?? data.customId ?? null;
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Custom placeholder text to display when nothing is selected
|
|
60
|
+
* @type {?string}
|
|
61
|
+
*/
|
|
62
|
+
this.placeholder = data.placeholder ?? null;
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* The minimum number of selections required
|
|
66
|
+
* @type {?number}
|
|
67
|
+
*/
|
|
68
|
+
this.minValues = data.min_values ?? data.minValues ?? null;
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* The maximum number of selections allowed
|
|
72
|
+
* @type {?number}
|
|
73
|
+
*/
|
|
74
|
+
this.maxValues = data.max_values ?? data.maxValues ?? null;
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Options for the STRING_SELECT menu
|
|
78
|
+
* @type {MessageSelectOption[]}
|
|
79
|
+
*/
|
|
80
|
+
this.options = this.constructor.normalizeOptions(data.options ?? []);
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* Whether this select menu is currently disabled
|
|
84
|
+
* @type {boolean}
|
|
85
|
+
*/
|
|
86
|
+
this.disabled = data.disabled ?? false;
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* Channels that are possible to select in CHANNEL_SELECT menu
|
|
90
|
+
* @type {ChannelType[]}
|
|
91
|
+
*/
|
|
92
|
+
this.channelTypes =
|
|
93
|
+
data.channel_types?.map(channelType =>
|
|
94
|
+
typeof channelType === 'string' ? channelType : ChannelTypes[channelType],
|
|
95
|
+
) ?? [];
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* Transforms the select menu into a plain object
|
|
100
|
+
* @returns {APIMessageSelectMenu} The raw data of this select menu
|
|
101
|
+
*/
|
|
102
|
+
toJSON() {
|
|
103
|
+
return {
|
|
104
|
+
channel_types: this.channelTypes.map(type => (typeof type === 'string' ? ChannelTypes[type] : type)),
|
|
105
|
+
custom_id: this.customId,
|
|
106
|
+
disabled: this.disabled,
|
|
107
|
+
placeholder: this.placeholder,
|
|
108
|
+
min_values: this.minValues,
|
|
109
|
+
max_values: this.maxValues ?? (this.minValues ? this.options.length : undefined),
|
|
110
|
+
options: this.options,
|
|
111
|
+
type: typeof this.type === 'string' ? MessageComponentTypes[this.type] : this.type,
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
/**
|
|
116
|
+
* Normalizes option input and resolves strings and emojis.
|
|
117
|
+
* @param {MessageSelectOptionData} option The select menu option to normalize
|
|
118
|
+
* @returns {MessageSelectOption}
|
|
119
|
+
*/
|
|
120
|
+
static normalizeOption(option) {
|
|
121
|
+
let { label, value, description, emoji } = option;
|
|
122
|
+
|
|
123
|
+
label = Util.verifyString(label, RangeError, 'SELECT_OPTION_LABEL');
|
|
124
|
+
value = Util.verifyString(value, RangeError, 'SELECT_OPTION_VALUE');
|
|
125
|
+
emoji = emoji ? Util.resolvePartialEmoji(emoji) : null;
|
|
126
|
+
description = description ? Util.verifyString(description, RangeError, 'SELECT_OPTION_DESCRIPTION', true) : null;
|
|
127
|
+
|
|
128
|
+
return { label, value, description, emoji, default: option.default ?? false };
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/**
|
|
132
|
+
* Normalizes option input and resolves strings and emojis.
|
|
133
|
+
* @param {...MessageSelectOptionData|MessageSelectOptionData[]} options The select menu options to normalize
|
|
134
|
+
* @returns {MessageSelectOption[]}
|
|
135
|
+
*/
|
|
136
|
+
static normalizeOptions(...options) {
|
|
137
|
+
return options.flat(Infinity).map(option => this.normalizeOption(option));
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
module.exports = MessageSelectMenu;
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const BaseMessageComponent = require('./BaseMessageComponent');
|
|
4
|
+
const { InteractionTypes } = require('../util/Constants');
|
|
5
|
+
const SnowflakeUtil = require('../util/SnowflakeUtil');
|
|
6
|
+
const Util = require('../util/Util');
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Represents a modal (form) to be shown in response to an interaction
|
|
10
|
+
*/
|
|
11
|
+
class Modal {
|
|
12
|
+
/**
|
|
13
|
+
* @param {Object} data Modal to clone or raw data
|
|
14
|
+
* @param {Client} client The client constructing this Modal, if provided
|
|
15
|
+
*/
|
|
16
|
+
constructor(data = {}, client = null) {
|
|
17
|
+
/**
|
|
18
|
+
* A list of MessageActionRows in the modal
|
|
19
|
+
* @type {MessageActionRow[]}
|
|
20
|
+
*/
|
|
21
|
+
this.components = data.components?.map(c => BaseMessageComponent.create(c, client)) ?? [];
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* A unique string to be sent in the interaction when submitted
|
|
25
|
+
* @type {?string}
|
|
26
|
+
*/
|
|
27
|
+
this.customId = data.custom_id;
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* The title to be displayed on this modal
|
|
31
|
+
* @type {?string}
|
|
32
|
+
*/
|
|
33
|
+
this.title = data.title;
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Timestamp (Discord epoch) of when this modal was created
|
|
37
|
+
* @type {Snowflake}
|
|
38
|
+
*/
|
|
39
|
+
this.nonce = data.nonce;
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* ID slash / button / menu when modal is displayed
|
|
43
|
+
* @type {Snowflake}
|
|
44
|
+
*/
|
|
45
|
+
this.id = data.id;
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Application sending the modal
|
|
49
|
+
* @type {Snowflake}
|
|
50
|
+
*/
|
|
51
|
+
this.applicationId = data.application.id;
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* The id of the channel the message was sent in
|
|
55
|
+
* @type {Snowflake}
|
|
56
|
+
*/
|
|
57
|
+
this.channelId = data.channel_id;
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Whether this interaction has already been replied to
|
|
61
|
+
* @type {boolean}
|
|
62
|
+
*/
|
|
63
|
+
this.replied = false;
|
|
64
|
+
|
|
65
|
+
Object.defineProperty(this, 'client', {
|
|
66
|
+
value: client,
|
|
67
|
+
writable: false,
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* The id of the guild the message was sent in, if any
|
|
73
|
+
* @type {?Snowflake}
|
|
74
|
+
* @readonly
|
|
75
|
+
*/
|
|
76
|
+
get guildId() {
|
|
77
|
+
return this.client.channels.cache.get(this.channelId)?.guildId || null;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* The channel that the message was sent in
|
|
82
|
+
* @type {TextBasedChannels}
|
|
83
|
+
* @readonly
|
|
84
|
+
*/
|
|
85
|
+
get channel() {
|
|
86
|
+
return this.client.channels.resolve(this.channelId);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* The guild the message was sent in (if in a guild channel)
|
|
91
|
+
* @type {?Guild}
|
|
92
|
+
* @readonly
|
|
93
|
+
*/
|
|
94
|
+
get guild() {
|
|
95
|
+
return this.client.guilds.resolve(this.guildId) ?? this.channel?.guild ?? null;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
toJSON() {
|
|
99
|
+
return {
|
|
100
|
+
components: this.components.map(c => c.toJSON()),
|
|
101
|
+
custom_id: this.customId,
|
|
102
|
+
title: this.title,
|
|
103
|
+
id: this.id,
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* Reply to this modal with data. (Event only)
|
|
109
|
+
* @returns {Promise<Message|Modal>}
|
|
110
|
+
* @example
|
|
111
|
+
* client.on('interactionModalCreate', modal => {
|
|
112
|
+
* // Modal > ActionRow > TextInput
|
|
113
|
+
* modal.components[0].components[0].setValue('1+1');
|
|
114
|
+
* modal.components[1].components[0].setValue('hello');
|
|
115
|
+
* modal.reply();
|
|
116
|
+
* })
|
|
117
|
+
*/
|
|
118
|
+
reply() {
|
|
119
|
+
if (!this.applicationId || !this.client || !this.channelId || this.replied) throw new Error('Modal cannot reply');
|
|
120
|
+
// Get Object
|
|
121
|
+
const dataFinal = this.toJSON();
|
|
122
|
+
dataFinal.components = dataFinal.components
|
|
123
|
+
.map(c => {
|
|
124
|
+
c.components[0] = {
|
|
125
|
+
type: c.components[0].type,
|
|
126
|
+
value: c.components[0].value,
|
|
127
|
+
custom_id: c.components[0].custom_id,
|
|
128
|
+
};
|
|
129
|
+
return c;
|
|
130
|
+
})
|
|
131
|
+
.filter(c => typeof c.components[0].value == 'string');
|
|
132
|
+
delete dataFinal.title;
|
|
133
|
+
const nonce = SnowflakeUtil.generate();
|
|
134
|
+
const postData = {
|
|
135
|
+
type: InteractionTypes.MODAL_SUBMIT, // Modal
|
|
136
|
+
application_id: this.applicationId,
|
|
137
|
+
guild_id: this.guildId,
|
|
138
|
+
channel_id: this.channelId,
|
|
139
|
+
data: dataFinal,
|
|
140
|
+
nonce,
|
|
141
|
+
session_id: this.client.sessionId,
|
|
142
|
+
};
|
|
143
|
+
this.client.api.interactions.post({
|
|
144
|
+
data: postData,
|
|
145
|
+
});
|
|
146
|
+
this.replied = true;
|
|
147
|
+
return Util.createPromiseInteraction(this.client, nonce, 5_000, true, this);
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
// TypeScript
|
|
151
|
+
/**
|
|
152
|
+
* Check data
|
|
153
|
+
* @type {boolean}
|
|
154
|
+
* @readonly
|
|
155
|
+
*/
|
|
156
|
+
get isMessage() {
|
|
157
|
+
return false;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
module.exports = Modal;
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const { TypeError } = require('../errors');
|
|
4
|
+
const { MessageComponentTypes } = require('../util/Constants');
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* A resolver for modal submit interaction text inputs.
|
|
8
|
+
*/
|
|
9
|
+
class ModalSubmitFieldsResolver {
|
|
10
|
+
constructor(components) {
|
|
11
|
+
/**
|
|
12
|
+
* The components within the modal
|
|
13
|
+
* @type {PartialModalActionRow[]} The components in the modal
|
|
14
|
+
*/
|
|
15
|
+
this.components = components;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* The extracted fields from the modal
|
|
20
|
+
* @type {PartialInputTextData[]} The fields in the modal
|
|
21
|
+
* @private
|
|
22
|
+
*/
|
|
23
|
+
get _fields() {
|
|
24
|
+
return this.components.reduce((previous, next) => previous.concat(next.components), []);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Gets a field given a custom id from a component
|
|
29
|
+
* @param {string} customId The custom id of the component
|
|
30
|
+
* @returns {?PartialInputTextData}
|
|
31
|
+
*/
|
|
32
|
+
getField(customId) {
|
|
33
|
+
const field = this._fields.find(f => f.customId === customId);
|
|
34
|
+
if (!field) throw new TypeError('MODAL_SUBMIT_INTERACTION_FIELD_NOT_FOUND', customId);
|
|
35
|
+
return field;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Gets the value of a text input component given a custom id
|
|
40
|
+
* @param {string} customId The custom id of the text input component
|
|
41
|
+
* @returns {?string}
|
|
42
|
+
*/
|
|
43
|
+
getTextInputValue(customId) {
|
|
44
|
+
const field = this.getField(customId);
|
|
45
|
+
const expectedType = MessageComponentTypes[MessageComponentTypes.TEXT_INPUT];
|
|
46
|
+
if (field.type !== expectedType) {
|
|
47
|
+
throw new TypeError('MODAL_SUBMIT_INTERACTION_FIELD_TYPE', customId, field.type, expectedType);
|
|
48
|
+
}
|
|
49
|
+
return field.value;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
module.exports = ModalSubmitFieldsResolver;
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const Interaction = require('./Interaction');
|
|
4
|
+
const InteractionWebhook = require('./InteractionWebhook');
|
|
5
|
+
const ModalSubmitFieldsResolver = require('./ModalSubmitFieldsResolver');
|
|
6
|
+
const InteractionResponses = require('./interfaces/InteractionResponses');
|
|
7
|
+
const { MessageComponentTypes } = require('../util/Constants');
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Represents a modal submit interaction.
|
|
11
|
+
* @extends {Interaction}
|
|
12
|
+
* @implements {InteractionResponses}
|
|
13
|
+
*/
|
|
14
|
+
class ModalSubmitInteraction extends Interaction {
|
|
15
|
+
constructor(client, data) {
|
|
16
|
+
super(client, data);
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* The custom id of the modal.
|
|
20
|
+
* @type {string}
|
|
21
|
+
*/
|
|
22
|
+
this.customId = data.data.custom_id;
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* @typedef {Object} PartialTextInputData
|
|
26
|
+
* @property {string} [customId] A unique string to be sent in the interaction when submitted
|
|
27
|
+
* @property {MessageComponentType} [type] The type of this component
|
|
28
|
+
* @property {string} [value] Value of this text input component
|
|
29
|
+
*/
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* @typedef {Object} PartialModalActionRow
|
|
33
|
+
* @property {MessageComponentType} [type] The type of this component
|
|
34
|
+
* @property {PartialTextInputData[]} [components] Partial text input components
|
|
35
|
+
*/
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* The inputs within the modal
|
|
39
|
+
* @type {PartialModalActionRow[]}
|
|
40
|
+
*/
|
|
41
|
+
this.components =
|
|
42
|
+
data.data.components?.map(c => ({
|
|
43
|
+
type: MessageComponentTypes[c.type],
|
|
44
|
+
components: ModalSubmitInteraction.transformComponent(c),
|
|
45
|
+
})) ?? [];
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* The message associated with this interaction
|
|
49
|
+
* @type {Message|APIMessage|null}
|
|
50
|
+
*/
|
|
51
|
+
this.message = data.message ? this.channel?.messages._add(data.message) ?? data.message : null;
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* The fields within the modal
|
|
55
|
+
* @type {ModalSubmitFieldsResolver}
|
|
56
|
+
*/
|
|
57
|
+
this.fields = new ModalSubmitFieldsResolver(this.components);
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Whether the reply to this interaction has been deferred
|
|
61
|
+
* @type {boolean}
|
|
62
|
+
*/
|
|
63
|
+
this.deferred = false;
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Whether the reply to this interaction is ephemeral
|
|
67
|
+
* @type {?boolean}
|
|
68
|
+
*/
|
|
69
|
+
this.ephemeral = null;
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* Whether this interaction has already been replied to
|
|
73
|
+
* @type {boolean}
|
|
74
|
+
*/
|
|
75
|
+
this.replied = false;
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* An associated interaction webhook, can be used to further interact with this interaction
|
|
79
|
+
* @type {InteractionWebhook}
|
|
80
|
+
*/
|
|
81
|
+
this.webhook = new InteractionWebhook(this.client, this.applicationId, this.token);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* Transforms component data to discord.js-compatible data
|
|
86
|
+
* @param {*} rawComponent The data to transform
|
|
87
|
+
* @returns {PartialTextInputData[]}
|
|
88
|
+
*/
|
|
89
|
+
static transformComponent(rawComponent) {
|
|
90
|
+
return rawComponent.components.map(c => ({
|
|
91
|
+
value: c.value,
|
|
92
|
+
type: MessageComponentTypes[c.type],
|
|
93
|
+
customId: c.custom_id,
|
|
94
|
+
}));
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* Whether this is from a {@link MessageComponentInteraction}.
|
|
99
|
+
* @returns {boolean}
|
|
100
|
+
*/
|
|
101
|
+
isFromMessage() {
|
|
102
|
+
return Boolean(this.message);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
// These are here only for documentation purposes - they are implemented by InteractionResponses
|
|
106
|
+
/* eslint-disable no-empty-function */
|
|
107
|
+
deferReply() {}
|
|
108
|
+
reply() {}
|
|
109
|
+
fetchReply() {}
|
|
110
|
+
editReply() {}
|
|
111
|
+
deleteReply() {}
|
|
112
|
+
followUp() {}
|
|
113
|
+
update() {}
|
|
114
|
+
deferUpdate() {}
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
InteractionResponses.applyToClass(ModalSubmitInteraction, ['showModal', 'awaitModalSubmit']);
|
|
118
|
+
|
|
119
|
+
module.exports = ModalSubmitInteraction;
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const BaseGuildTextChannel = require('./BaseGuildTextChannel');
|
|
4
|
+
const { Error } = require('../errors');
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Represents a guild news channel on Discord.
|
|
8
|
+
* @extends {BaseGuildTextChannel}
|
|
9
|
+
*/
|
|
10
|
+
class NewsChannel extends BaseGuildTextChannel {
|
|
11
|
+
/**
|
|
12
|
+
* Adds the target to this channel's followers.
|
|
13
|
+
* <info>If you need the created webhook id, use {@link GuildChannelManager#addFollower}.</info>
|
|
14
|
+
* @param {TextChannelResolvable} channel The channel where the webhook should be created
|
|
15
|
+
* @param {string} [reason] Reason for creating the webhook
|
|
16
|
+
* @returns {Promise<NewsChannel>}
|
|
17
|
+
* @example
|
|
18
|
+
* if (channel.type === 'GUILD_NEWS') {
|
|
19
|
+
* channel.addFollower('222197033908436994', 'Important announcements')
|
|
20
|
+
* .then(() => console.log('Added follower'))
|
|
21
|
+
* .catch(console.error);
|
|
22
|
+
* }
|
|
23
|
+
*/
|
|
24
|
+
async addFollower(channel, reason) {
|
|
25
|
+
const channelId = this.guild.channels.resolveId(channel);
|
|
26
|
+
if (!channelId) throw new Error('GUILD_CHANNEL_RESOLVE');
|
|
27
|
+
await this.client.api.channels(this.id).followers.post({ data: { webhook_channel_id: channelId }, reason });
|
|
28
|
+
return this;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
module.exports = NewsChannel;
|