@velliajs/discord 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +191 -0
- package/README.md +133 -0
- package/package.json +82 -0
- package/src/client/BaseClient.js +83 -0
- package/src/client/Client.js +591 -0
- package/src/client/WebhookClient.js +103 -0
- package/src/client/actions/Action.js +119 -0
- package/src/client/actions/ActionsManager.js +79 -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 +23 -0
- package/src/client/actions/ChannelUpdate.js +33 -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 +44 -0
- package/src/client/actions/GuildEmojiCreate.js +20 -0
- package/src/client/actions/GuildEmojiDelete.js +19 -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 +31 -0
- package/src/client/actions/GuildMemberUpdate.js +44 -0
- package/src/client/actions/GuildRoleCreate.js +25 -0
- package/src/client/actions/GuildRoleDelete.js +29 -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 +19 -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 +101 -0
- package/src/client/actions/InviteCreate.js +28 -0
- package/src/client/actions/InviteDelete.js +30 -0
- package/src/client/actions/MessageCreate.js +37 -0
- package/src/client/actions/MessageDelete.js +32 -0
- package/src/client/actions/MessageDeleteBulk.js +47 -0
- package/src/client/actions/MessageReactionAdd.js +55 -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 +42 -0
- package/src/client/actions/StageInstanceCreate.js +28 -0
- package/src/client/actions/StageInstanceDelete.js +31 -0
- package/src/client/actions/StageInstanceUpdate.js +30 -0
- package/src/client/actions/ThreadCreate.js +24 -0
- package/src/client/actions/ThreadDelete.js +26 -0
- package/src/client/actions/ThreadListSync.js +60 -0
- package/src/client/actions/ThreadMemberUpdate.js +30 -0
- package/src/client/actions/ThreadMembersUpdate.js +47 -0
- package/src/client/actions/TypingStart.js +29 -0
- package/src/client/actions/UserUpdate.js +36 -0
- package/src/client/actions/VoiceStateUpdate.js +43 -0
- package/src/client/actions/WebhooksUpdate.js +20 -0
- package/src/client/voice/ClientVoiceManager.js +44 -0
- package/src/client/websocket/WebSocketManager.js +393 -0
- package/src/client/websocket/WebSocketShard.js +231 -0
- package/src/client/websocket/handlers/APPLICATION_COMMAND_PERMISSIONS_UPDATE.js +5 -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/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_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 +26 -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_CREATE.js +5 -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_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 +27 -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_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 +64 -0
- package/src/errors/DJSError.js +48 -0
- package/src/errors/ErrorCodes.js +319 -0
- package/src/errors/Messages.js +170 -0
- package/src/errors/index.js +5 -0
- package/src/index.js +213 -0
- package/src/managers/ApplicationCommandManager.js +263 -0
- package/src/managers/ApplicationCommandPermissionsManager.js +434 -0
- package/src/managers/AutoModerationRuleManager.js +288 -0
- package/src/managers/BaseGuildEmojiManager.js +80 -0
- package/src/managers/BaseManager.js +19 -0
- package/src/managers/CachedManager.js +57 -0
- package/src/managers/CategoryChannelChildManager.js +77 -0
- package/src/managers/ChannelManager.js +128 -0
- package/src/managers/DataManager.js +61 -0
- package/src/managers/GuildApplicationCommandManager.js +28 -0
- package/src/managers/GuildBanManager.js +204 -0
- package/src/managers/GuildChannelManager.js +494 -0
- package/src/managers/GuildEmojiManager.js +174 -0
- package/src/managers/GuildEmojiRoleManager.js +118 -0
- package/src/managers/GuildForumThreadManager.js +83 -0
- package/src/managers/GuildInviteManager.js +213 -0
- package/src/managers/GuildManager.js +283 -0
- package/src/managers/GuildMemberManager.js +540 -0
- package/src/managers/GuildMemberRoleManager.js +204 -0
- package/src/managers/GuildScheduledEventManager.js +297 -0
- package/src/managers/GuildStickerManager.js +182 -0
- package/src/managers/GuildTextThreadManager.js +91 -0
- package/src/managers/MessageManager.js +259 -0
- package/src/managers/PermissionOverwriteManager.js +168 -0
- package/src/managers/PresenceManager.js +58 -0
- package/src/managers/ReactionManager.js +68 -0
- package/src/managers/ReactionUserManager.js +77 -0
- package/src/managers/RoleManager.js +360 -0
- package/src/managers/StageInstanceManager.js +154 -0
- package/src/managers/ThreadManager.js +204 -0
- package/src/managers/ThreadMemberManager.js +182 -0
- package/src/managers/UserManager.js +139 -0
- package/src/managers/VoiceStateManager.js +37 -0
- package/src/sharding/Shard.js +457 -0
- package/src/sharding/ShardClientUtil.js +285 -0
- package/src/sharding/ShardingManager.js +326 -0
- package/src/structures/ActionRow.js +46 -0
- package/src/structures/ActionRowBuilder.js +35 -0
- package/src/structures/AnonymousGuild.js +97 -0
- package/src/structures/ApplicationCommand.js +606 -0
- package/src/structures/ApplicationRoleConnectionMetadata.js +46 -0
- package/src/structures/Attachment.js +140 -0
- package/src/structures/AttachmentBuilder.js +116 -0
- package/src/structures/AutoModerationActionExecution.js +116 -0
- package/src/structures/AutoModerationRule.js +284 -0
- package/src/structures/AutocompleteInteraction.js +97 -0
- package/src/structures/Base.js +43 -0
- package/src/structures/BaseChannel.js +160 -0
- package/src/structures/BaseGuild.js +119 -0
- package/src/structures/BaseGuildEmoji.js +56 -0
- package/src/structures/BaseGuildTextChannel.js +186 -0
- package/src/structures/BaseGuildVoiceChannel.js +234 -0
- package/src/structures/BaseInteraction.js +344 -0
- package/src/structures/BaseSelectMenuComponent.js +56 -0
- package/src/structures/ButtonBuilder.js +44 -0
- package/src/structures/ButtonComponent.js +65 -0
- package/src/structures/ButtonInteraction.js +11 -0
- package/src/structures/CategoryChannel.js +45 -0
- package/src/structures/ChannelSelectMenuBuilder.js +31 -0
- package/src/structures/ChannelSelectMenuComponent.js +20 -0
- package/src/structures/ChannelSelectMenuInteraction.js +33 -0
- package/src/structures/ChatInputCommandInteraction.js +41 -0
- package/src/structures/ClientApplication.js +193 -0
- package/src/structures/ClientPresence.js +82 -0
- package/src/structures/ClientUser.js +185 -0
- package/src/structures/CommandInteraction.js +224 -0
- package/src/structures/CommandInteractionOptionResolver.js +308 -0
- package/src/structures/Component.js +47 -0
- package/src/structures/ContextMenuCommandInteraction.js +64 -0
- package/src/structures/DMChannel.js +129 -0
- package/src/structures/DirectoryChannel.js +36 -0
- package/src/structures/Embed.js +220 -0
- package/src/structures/EmbedBuilder.js +41 -0
- package/src/structures/Emoji.js +108 -0
- package/src/structures/ForumChannel.js +264 -0
- package/src/structures/Guild.js +1361 -0
- package/src/structures/GuildAuditLogs.js +91 -0
- package/src/structures/GuildAuditLogsEntry.js +527 -0
- package/src/structures/GuildBan.js +59 -0
- package/src/structures/GuildChannel.js +457 -0
- package/src/structures/GuildEmoji.js +148 -0
- package/src/structures/GuildMember.js +518 -0
- package/src/structures/GuildPreview.js +193 -0
- package/src/structures/GuildPreviewEmoji.js +27 -0
- package/src/structures/GuildScheduledEvent.js +439 -0
- package/src/structures/GuildTemplate.js +241 -0
- package/src/structures/Integration.js +220 -0
- package/src/structures/IntegrationApplication.js +85 -0
- package/src/structures/InteractionCollector.js +263 -0
- package/src/structures/InteractionResponse.js +102 -0
- package/src/structures/InteractionWebhook.js +59 -0
- package/src/structures/Invite.js +322 -0
- package/src/structures/InviteGuild.js +22 -0
- package/src/structures/InviteStageInstance.js +87 -0
- package/src/structures/MentionableSelectMenuBuilder.js +32 -0
- package/src/structures/MentionableSelectMenuComponent.js +11 -0
- package/src/structures/MentionableSelectMenuInteraction.js +71 -0
- package/src/structures/Message.js +997 -0
- package/src/structures/MessageCollector.js +146 -0
- package/src/structures/MessageComponentInteraction.js +107 -0
- package/src/structures/MessageContextMenuCommandInteraction.js +20 -0
- package/src/structures/MessageMentions.js +297 -0
- package/src/structures/MessagePayload.js +299 -0
- package/src/structures/MessageReaction.js +142 -0
- package/src/structures/ModalBuilder.js +34 -0
- package/src/structures/ModalSubmitFields.js +55 -0
- package/src/structures/ModalSubmitInteraction.js +121 -0
- package/src/structures/NewsChannel.js +32 -0
- package/src/structures/OAuth2Guild.js +28 -0
- package/src/structures/PartialGroupDMChannel.js +60 -0
- package/src/structures/PermissionOverwrites.js +196 -0
- package/src/structures/Presence.js +372 -0
- package/src/structures/ReactionCollector.js +229 -0
- package/src/structures/ReactionEmoji.js +31 -0
- package/src/structures/Role.js +458 -0
- package/src/structures/RoleSelectMenuBuilder.js +31 -0
- package/src/structures/RoleSelectMenuComponent.js +11 -0
- package/src/structures/RoleSelectMenuInteraction.js +33 -0
- package/src/structures/SelectMenuBuilder.js +26 -0
- package/src/structures/SelectMenuComponent.js +26 -0
- package/src/structures/SelectMenuInteraction.js +26 -0
- package/src/structures/SelectMenuOptionBuilder.js +26 -0
- package/src/structures/StageChannel.js +112 -0
- package/src/structures/StageInstance.js +167 -0
- package/src/structures/Sticker.js +272 -0
- package/src/structures/StickerPack.js +95 -0
- package/src/structures/StringSelectMenuBuilder.js +79 -0
- package/src/structures/StringSelectMenuComponent.js +20 -0
- package/src/structures/StringSelectMenuInteraction.js +21 -0
- package/src/structures/StringSelectMenuOptionBuilder.js +49 -0
- package/src/structures/Team.js +117 -0
- package/src/structures/TeamMember.js +70 -0
- package/src/structures/TextChannel.js +33 -0
- package/src/structures/TextInputBuilder.js +31 -0
- package/src/structures/TextInputComponent.js +29 -0
- package/src/structures/ThreadChannel.js +606 -0
- package/src/structures/ThreadMember.js +113 -0
- package/src/structures/Typing.js +74 -0
- package/src/structures/User.js +331 -0
- package/src/structures/UserContextMenuCommandInteraction.js +29 -0
- package/src/structures/UserSelectMenuBuilder.js +31 -0
- package/src/structures/UserSelectMenuComponent.js +11 -0
- package/src/structures/UserSelectMenuInteraction.js +51 -0
- package/src/structures/VoiceChannel.js +96 -0
- package/src/structures/VoiceRegion.js +46 -0
- package/src/structures/VoiceState.js +303 -0
- package/src/structures/Webhook.js +481 -0
- package/src/structures/WelcomeChannel.js +60 -0
- package/src/structures/WelcomeScreen.js +49 -0
- package/src/structures/Widget.js +88 -0
- package/src/structures/WidgetMember.js +99 -0
- package/src/structures/interfaces/Application.js +108 -0
- package/src/structures/interfaces/Collector.js +335 -0
- package/src/structures/interfaces/InteractionResponses.js +320 -0
- package/src/structures/interfaces/TextBasedChannel.js +413 -0
- package/src/util/APITypes.js +456 -0
- package/src/util/ActivityFlagsBitField.js +26 -0
- package/src/util/ApplicationFlagsBitField.js +26 -0
- package/src/util/BitField.js +176 -0
- package/src/util/ChannelFlagsBitField.js +41 -0
- package/src/util/Channels.js +150 -0
- package/src/util/Colors.js +73 -0
- package/src/util/Components.js +152 -0
- package/src/util/Constants.js +230 -0
- package/src/util/DataResolver.js +140 -0
- package/src/util/Enums.js +13 -0
- package/src/util/Events.js +160 -0
- package/src/util/Formatters.js +413 -0
- package/src/util/GuildMemberFlagsBitField.js +41 -0
- package/src/util/IntentsBitField.js +34 -0
- package/src/util/LimitedCollection.js +68 -0
- package/src/util/MessageFlagsBitField.js +32 -0
- package/src/util/Options.js +216 -0
- package/src/util/Partials.js +44 -0
- package/src/util/PermissionsBitField.js +104 -0
- package/src/util/ShardEvents.js +27 -0
- package/src/util/Status.js +33 -0
- package/src/util/Sweepers.js +467 -0
- package/src/util/SystemChannelFlagsBitField.js +43 -0
- package/src/util/ThreadMemberFlagsBitField.js +31 -0
- package/src/util/Transformers.js +36 -0
- package/src/util/UserFlagsBitField.js +32 -0
- package/src/util/Util.js +394 -0
- package/src/util/WebSocketShardEvents.js +25 -0
|
@@ -0,0 +1,299 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const { Buffer } = require('node:buffer');
|
|
4
|
+
const { lazy, isJSONEncodable } = require('@discordjs/util');
|
|
5
|
+
const { MessageFlags } = require('discord-api-types/v10');
|
|
6
|
+
const ActionRowBuilder = require('./ActionRowBuilder');
|
|
7
|
+
const { DiscordjsRangeError, ErrorCodes } = require('../errors');
|
|
8
|
+
const DataResolver = require('../util/DataResolver');
|
|
9
|
+
const MessageFlagsBitField = require('../util/MessageFlagsBitField');
|
|
10
|
+
const { basename, verifyString } = require('../util/Util');
|
|
11
|
+
|
|
12
|
+
const getBaseInteraction = lazy(() => require('./BaseInteraction'));
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Represents a message to be sent to the API.
|
|
16
|
+
*/
|
|
17
|
+
class MessagePayload {
|
|
18
|
+
/**
|
|
19
|
+
* @param {MessageTarget} target The target for this message to be sent to
|
|
20
|
+
* @param {MessagePayloadOption} options The payload of this message
|
|
21
|
+
*/
|
|
22
|
+
constructor(target, options) {
|
|
23
|
+
/**
|
|
24
|
+
* The target for this message to be sent to
|
|
25
|
+
* @type {MessageTarget}
|
|
26
|
+
*/
|
|
27
|
+
this.target = target;
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* The payload of this message.
|
|
31
|
+
* @type {MessagePayloadOption}
|
|
32
|
+
*/
|
|
33
|
+
this.options = options;
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Body sendable to the API
|
|
37
|
+
* @type {?APIMessage}
|
|
38
|
+
*/
|
|
39
|
+
this.body = null;
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Files sendable to the API
|
|
43
|
+
* @type {?RawFile[]}
|
|
44
|
+
*/
|
|
45
|
+
this.files = null;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Whether or not the target is a {@link Webhook} or a {@link WebhookClient}
|
|
50
|
+
* @type {boolean}
|
|
51
|
+
* @readonly
|
|
52
|
+
*/
|
|
53
|
+
get isWebhook() {
|
|
54
|
+
const Webhook = require('./Webhook');
|
|
55
|
+
const WebhookClient = require('../client/WebhookClient');
|
|
56
|
+
return this.target instanceof Webhook || this.target instanceof WebhookClient;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Whether or not the target is a {@link User}
|
|
61
|
+
* @type {boolean}
|
|
62
|
+
* @readonly
|
|
63
|
+
*/
|
|
64
|
+
get isUser() {
|
|
65
|
+
const User = require('./User');
|
|
66
|
+
const { GuildMember } = require('./GuildMember');
|
|
67
|
+
return this.target instanceof User || this.target instanceof GuildMember;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Whether or not the target is a {@link Message}
|
|
72
|
+
* @type {boolean}
|
|
73
|
+
* @readonly
|
|
74
|
+
*/
|
|
75
|
+
get isMessage() {
|
|
76
|
+
const { Message } = require('./Message');
|
|
77
|
+
return this.target instanceof Message;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* Whether or not the target is a {@link MessageManager}
|
|
82
|
+
* @type {boolean}
|
|
83
|
+
* @readonly
|
|
84
|
+
*/
|
|
85
|
+
get isMessageManager() {
|
|
86
|
+
const MessageManager = require('../managers/MessageManager');
|
|
87
|
+
return this.target instanceof MessageManager;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* Whether or not the target is an {@link BaseInteraction} or an {@link InteractionWebhook}
|
|
92
|
+
* @type {boolean}
|
|
93
|
+
* @readonly
|
|
94
|
+
*/
|
|
95
|
+
get isInteraction() {
|
|
96
|
+
const BaseInteraction = getBaseInteraction();
|
|
97
|
+
const InteractionWebhook = require('./InteractionWebhook');
|
|
98
|
+
return this.target instanceof BaseInteraction || this.target instanceof InteractionWebhook;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* Makes the content of this message.
|
|
103
|
+
* @returns {?string}
|
|
104
|
+
*/
|
|
105
|
+
makeContent() {
|
|
106
|
+
let content;
|
|
107
|
+
if (this.options.content === null) {
|
|
108
|
+
content = '';
|
|
109
|
+
} else if (this.options.content !== undefined) {
|
|
110
|
+
content = verifyString(this.options.content, DiscordjsRangeError, ErrorCodes.MessageContentType, true);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
return content;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
/**
|
|
117
|
+
* Resolves the body.
|
|
118
|
+
* @returns {MessagePayload}
|
|
119
|
+
*/
|
|
120
|
+
resolveBody() {
|
|
121
|
+
if (this.body) return this;
|
|
122
|
+
const isInteraction = this.isInteraction;
|
|
123
|
+
const isWebhook = this.isWebhook;
|
|
124
|
+
|
|
125
|
+
const content = this.makeContent();
|
|
126
|
+
const tts = Boolean(this.options.tts);
|
|
127
|
+
|
|
128
|
+
let nonce;
|
|
129
|
+
if (this.options.nonce !== undefined) {
|
|
130
|
+
nonce = this.options.nonce;
|
|
131
|
+
if (typeof nonce === 'number' ? !Number.isInteger(nonce) : typeof nonce !== 'string') {
|
|
132
|
+
throw new DiscordjsRangeError(ErrorCodes.MessageNonceType);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
const components = this.options.components?.map(c => (isJSONEncodable(c) ? c : new ActionRowBuilder(c)).toJSON());
|
|
137
|
+
|
|
138
|
+
let username;
|
|
139
|
+
let avatarURL;
|
|
140
|
+
let threadName;
|
|
141
|
+
if (isWebhook) {
|
|
142
|
+
username = this.options.username ?? this.target.name;
|
|
143
|
+
if (this.options.avatarURL) avatarURL = this.options.avatarURL;
|
|
144
|
+
if (this.options.threadName) threadName = this.options.threadName;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
let flags;
|
|
148
|
+
if (
|
|
149
|
+
this.options.flags !== undefined ||
|
|
150
|
+
(this.isMessage && this.options.reply === undefined) ||
|
|
151
|
+
this.isMessageManager
|
|
152
|
+
) {
|
|
153
|
+
flags =
|
|
154
|
+
// eslint-disable-next-line eqeqeq
|
|
155
|
+
this.options.flags != null
|
|
156
|
+
? new MessageFlagsBitField(this.options.flags).bitfield
|
|
157
|
+
: this.target.flags?.bitfield;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
if (isInteraction && this.options.ephemeral) {
|
|
161
|
+
flags |= MessageFlags.Ephemeral;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
let allowedMentions =
|
|
165
|
+
this.options.allowedMentions === undefined
|
|
166
|
+
? this.target.client.options.allowedMentions
|
|
167
|
+
: this.options.allowedMentions;
|
|
168
|
+
|
|
169
|
+
if (allowedMentions?.repliedUser !== undefined) {
|
|
170
|
+
allowedMentions = { ...allowedMentions, replied_user: allowedMentions.repliedUser };
|
|
171
|
+
delete allowedMentions.repliedUser;
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
let message_reference;
|
|
175
|
+
if (typeof this.options.reply === 'object') {
|
|
176
|
+
const reference = this.options.reply.messageReference;
|
|
177
|
+
const message_id = this.isMessage ? reference.id ?? reference : this.target.messages.resolveId(reference);
|
|
178
|
+
if (message_id) {
|
|
179
|
+
message_reference = {
|
|
180
|
+
message_id,
|
|
181
|
+
fail_if_not_exists: this.options.reply.failIfNotExists ?? this.target.client.options.failIfNotExists,
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
const attachments = this.options.files?.map((file, index) => ({
|
|
187
|
+
id: index.toString(),
|
|
188
|
+
description: file.description,
|
|
189
|
+
}));
|
|
190
|
+
if (Array.isArray(this.options.attachments)) {
|
|
191
|
+
this.options.attachments.push(...(attachments ?? []));
|
|
192
|
+
} else {
|
|
193
|
+
this.options.attachments = attachments;
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
this.body = {
|
|
197
|
+
content,
|
|
198
|
+
tts,
|
|
199
|
+
nonce,
|
|
200
|
+
embeds: this.options.embeds?.map(embed =>
|
|
201
|
+
isJSONEncodable(embed) ? embed.toJSON() : this.target.client.options.jsonTransformer(embed),
|
|
202
|
+
),
|
|
203
|
+
components,
|
|
204
|
+
username,
|
|
205
|
+
avatar_url: avatarURL,
|
|
206
|
+
allowed_mentions: content === undefined && message_reference === undefined ? undefined : allowedMentions,
|
|
207
|
+
flags,
|
|
208
|
+
message_reference,
|
|
209
|
+
attachments: this.options.attachments,
|
|
210
|
+
sticker_ids: this.options.stickers?.map(sticker => sticker.id ?? sticker),
|
|
211
|
+
thread_name: threadName,
|
|
212
|
+
};
|
|
213
|
+
return this;
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
/**
|
|
217
|
+
* Resolves files.
|
|
218
|
+
* @returns {Promise<MessagePayload>}
|
|
219
|
+
*/
|
|
220
|
+
async resolveFiles() {
|
|
221
|
+
if (this.files) return this;
|
|
222
|
+
|
|
223
|
+
this.files = await Promise.all(this.options.files?.map(file => this.constructor.resolveFile(file)) ?? []);
|
|
224
|
+
return this;
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
/**
|
|
228
|
+
* Resolves a single file into an object sendable to the API.
|
|
229
|
+
* @param {AttachmentPayload|BufferResolvable|Stream} fileLike Something that could be resolved to a file
|
|
230
|
+
* @returns {Promise<RawFile>}
|
|
231
|
+
*/
|
|
232
|
+
static async resolveFile(fileLike) {
|
|
233
|
+
let attachment;
|
|
234
|
+
let name;
|
|
235
|
+
|
|
236
|
+
const findName = thing => {
|
|
237
|
+
if (typeof thing === 'string') {
|
|
238
|
+
return basename(thing);
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
if (thing.path) {
|
|
242
|
+
return basename(thing.path);
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
return 'file.jpg';
|
|
246
|
+
};
|
|
247
|
+
|
|
248
|
+
const ownAttachment =
|
|
249
|
+
typeof fileLike === 'string' || fileLike instanceof Buffer || typeof fileLike.pipe === 'function';
|
|
250
|
+
if (ownAttachment) {
|
|
251
|
+
attachment = fileLike;
|
|
252
|
+
name = findName(attachment);
|
|
253
|
+
} else {
|
|
254
|
+
attachment = fileLike.attachment;
|
|
255
|
+
name = fileLike.name ?? findName(attachment);
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
const { data, contentType } = await DataResolver.resolveFile(attachment);
|
|
259
|
+
return { data, name, contentType };
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
/**
|
|
263
|
+
* Creates a {@link MessagePayload} from user-level arguments.
|
|
264
|
+
* @param {MessageTarget} target Target to send to
|
|
265
|
+
* @param {string|MessagePayloadOption} options Options or content to use
|
|
266
|
+
* @param {MessagePayloadOption} [extra={}] Extra options to add onto specified options
|
|
267
|
+
* @returns {MessagePayload}
|
|
268
|
+
*/
|
|
269
|
+
static create(target, options, extra = {}) {
|
|
270
|
+
return new this(
|
|
271
|
+
target,
|
|
272
|
+
typeof options !== 'object' || options === null ? { content: options, ...extra } : { ...options, ...extra },
|
|
273
|
+
);
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
module.exports = MessagePayload;
|
|
278
|
+
|
|
279
|
+
/**
|
|
280
|
+
* A target for a message.
|
|
281
|
+
* @typedef {TextBasedChannels|User|GuildMember|Webhook|WebhookClient|BaseInteraction|InteractionWebhook|
|
|
282
|
+
* Message|MessageManager} MessageTarget
|
|
283
|
+
*/
|
|
284
|
+
|
|
285
|
+
/**
|
|
286
|
+
* A possible payload option.
|
|
287
|
+
* @typedef {MessageCreateOptions|MessageEditOptions|WebhookMessageCreateOptions|WebhookMessageEditOptions|
|
|
288
|
+
* InteractionReplyOptions|InteractionUpdateOptions} MessagePayloadOption
|
|
289
|
+
*/
|
|
290
|
+
|
|
291
|
+
/**
|
|
292
|
+
* @external APIMessage
|
|
293
|
+
* @see {@link https://discord.com/developers/docs/resources/channel#message-object}
|
|
294
|
+
*/
|
|
295
|
+
|
|
296
|
+
/**
|
|
297
|
+
* @external RawFile
|
|
298
|
+
* @see {@link https://discord.js.org/docs/packages/rest/stable/RawFile:Interface}
|
|
299
|
+
*/
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const { Routes } = require('discord-api-types/v10');
|
|
4
|
+
const GuildEmoji = require('./GuildEmoji');
|
|
5
|
+
const ReactionEmoji = require('./ReactionEmoji');
|
|
6
|
+
const ReactionUserManager = require('../managers/ReactionUserManager');
|
|
7
|
+
const { flatten } = require('../util/Util');
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Represents a reaction to a message.
|
|
11
|
+
*/
|
|
12
|
+
class MessageReaction {
|
|
13
|
+
constructor(client, data, message) {
|
|
14
|
+
/**
|
|
15
|
+
* The client that instantiated this message reaction
|
|
16
|
+
* @name MessageReaction#client
|
|
17
|
+
* @type {Client}
|
|
18
|
+
* @readonly
|
|
19
|
+
*/
|
|
20
|
+
Object.defineProperty(this, 'client', { value: client });
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* The message that this reaction refers to
|
|
24
|
+
* @type {Message}
|
|
25
|
+
*/
|
|
26
|
+
this.message = message;
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Whether the client has given this reaction
|
|
30
|
+
* @type {boolean}
|
|
31
|
+
*/
|
|
32
|
+
this.me = data.me;
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* A manager of the users that have given this reaction
|
|
36
|
+
* @type {ReactionUserManager}
|
|
37
|
+
*/
|
|
38
|
+
this.users = new ReactionUserManager(this, this.me ? [client.user] : []);
|
|
39
|
+
|
|
40
|
+
this._emoji = new ReactionEmoji(this, data.emoji);
|
|
41
|
+
|
|
42
|
+
this._patch(data);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
_patch(data) {
|
|
46
|
+
if ('count' in data) {
|
|
47
|
+
/**
|
|
48
|
+
* The number of people that have given the same reaction
|
|
49
|
+
* @type {?number}
|
|
50
|
+
*/
|
|
51
|
+
this.count ??= data.count;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Makes the client user react with this reaction
|
|
57
|
+
* @returns {Promise<MessageReaction>}
|
|
58
|
+
*/
|
|
59
|
+
react() {
|
|
60
|
+
return this.message.react(this.emoji);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Removes all users from this reaction.
|
|
65
|
+
* @returns {Promise<MessageReaction>}
|
|
66
|
+
*/
|
|
67
|
+
async remove() {
|
|
68
|
+
await this.client.rest.delete(
|
|
69
|
+
Routes.channelMessageReaction(this.message.channelId, this.message.id, this._emoji.identifier),
|
|
70
|
+
);
|
|
71
|
+
return this;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* The emoji of this reaction. Either a {@link GuildEmoji} object for known custom emojis, or a {@link ReactionEmoji}
|
|
76
|
+
* object which has fewer properties. Whatever the prototype of the emoji, it will still have
|
|
77
|
+
* `name`, `id`, `identifier` and `toString()`
|
|
78
|
+
* @type {GuildEmoji|ReactionEmoji}
|
|
79
|
+
* @readonly
|
|
80
|
+
*/
|
|
81
|
+
get emoji() {
|
|
82
|
+
if (this._emoji instanceof GuildEmoji) return this._emoji;
|
|
83
|
+
// Check to see if the emoji has become known to the client
|
|
84
|
+
if (this._emoji.id) {
|
|
85
|
+
const emojis = this.message.client.emojis.cache;
|
|
86
|
+
if (emojis.has(this._emoji.id)) {
|
|
87
|
+
const emoji = emojis.get(this._emoji.id);
|
|
88
|
+
this._emoji = emoji;
|
|
89
|
+
return emoji;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
return this._emoji;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* Whether or not this reaction is a partial
|
|
97
|
+
* @type {boolean}
|
|
98
|
+
* @readonly
|
|
99
|
+
*/
|
|
100
|
+
get partial() {
|
|
101
|
+
return this.count === null;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* Fetch this reaction.
|
|
106
|
+
* @returns {Promise<MessageReaction>}
|
|
107
|
+
*/
|
|
108
|
+
async fetch() {
|
|
109
|
+
const message = await this.message.fetch();
|
|
110
|
+
const existing = message.reactions.cache.get(this.emoji.id ?? this.emoji.name);
|
|
111
|
+
// The reaction won't get set when it has been completely removed
|
|
112
|
+
this._patch(existing ?? { count: 0 });
|
|
113
|
+
return this;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
toJSON() {
|
|
117
|
+
return flatten(this, { emoji: 'emojiId', message: 'messageId' });
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
valueOf() {
|
|
121
|
+
return this._emoji.id ?? this._emoji.name;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
_add(user) {
|
|
125
|
+
if (this.partial) return;
|
|
126
|
+
this.users.cache.set(user.id, user);
|
|
127
|
+
if (!this.me || user.id !== this.message.client.user.id || this.count === 0) this.count++;
|
|
128
|
+
this.me ||= user.id === this.message.client.user.id;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
_remove(user) {
|
|
132
|
+
if (this.partial) return;
|
|
133
|
+
this.users.cache.delete(user.id);
|
|
134
|
+
if (!this.me || user.id !== this.message.client.user.id) this.count--;
|
|
135
|
+
if (user.id === this.message.client.user.id) this.me = false;
|
|
136
|
+
if (this.count <= 0 && this.users.cache.size === 0) {
|
|
137
|
+
this.message.reactions.cache.delete(this.emoji.id ?? this.emoji.name);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
module.exports = MessageReaction;
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const { ModalBuilder: BuildersModal, ComponentBuilder } = require('@discordjs/builders');
|
|
4
|
+
const { isJSONEncodable } = require('@discordjs/util');
|
|
5
|
+
const { toSnakeCase } = require('../util/Transformers');
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Represents a modal builder.
|
|
9
|
+
* @extends {BuildersModal}
|
|
10
|
+
*/
|
|
11
|
+
class ModalBuilder extends BuildersModal {
|
|
12
|
+
constructor({ components, ...data } = {}) {
|
|
13
|
+
super({
|
|
14
|
+
...toSnakeCase(data),
|
|
15
|
+
components: components?.map(c => (c instanceof ComponentBuilder ? c : toSnakeCase(c))),
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Creates a new modal builder from JSON data
|
|
21
|
+
* @param {ModalBuilder|APIModalComponent} other The other data
|
|
22
|
+
* @returns {ModalBuilder}
|
|
23
|
+
*/
|
|
24
|
+
static from(other) {
|
|
25
|
+
return new this(isJSONEncodable(other) ? other.toJSON() : other);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
module.exports = ModalBuilder;
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* @external BuildersModal
|
|
33
|
+
* @see {@link https://discord.js.org/docs/packages/builders/stable/ModalBuilder:Class}
|
|
34
|
+
*/
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const { Collection } = require('@discordjs/collection');
|
|
4
|
+
const { ComponentType } = require('discord-api-types/v10');
|
|
5
|
+
const { DiscordjsTypeError, ErrorCodes } = require('../errors');
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Represents the serialized fields from a modal submit interaction
|
|
9
|
+
*/
|
|
10
|
+
class ModalSubmitFields {
|
|
11
|
+
constructor(components) {
|
|
12
|
+
/**
|
|
13
|
+
* The components within the modal
|
|
14
|
+
* @type {ActionRowModalData[]}
|
|
15
|
+
*/
|
|
16
|
+
this.components = components;
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* The extracted fields from the modal
|
|
20
|
+
* @type {Collection<string, ModalData>}
|
|
21
|
+
*/
|
|
22
|
+
this.fields = components.reduce((accumulator, next) => {
|
|
23
|
+
next.components.forEach(c => accumulator.set(c.customId, c));
|
|
24
|
+
return accumulator;
|
|
25
|
+
}, new Collection());
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Gets a field given a custom id from a component
|
|
30
|
+
* @param {string} customId The custom id of the component
|
|
31
|
+
* @param {ComponentType} [type] The type of the component
|
|
32
|
+
* @returns {ModalData}
|
|
33
|
+
*/
|
|
34
|
+
getField(customId, type) {
|
|
35
|
+
const field = this.fields.get(customId);
|
|
36
|
+
if (!field) throw new DiscordjsTypeError(ErrorCodes.ModalSubmitInteractionFieldNotFound, customId);
|
|
37
|
+
|
|
38
|
+
if (type !== undefined && type !== field.type) {
|
|
39
|
+
throw new DiscordjsTypeError(ErrorCodes.ModalSubmitInteractionFieldType, customId, field.type, type);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
return field;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Gets the value of a text input component given a custom id
|
|
47
|
+
* @param {string} customId The custom id of the text input component
|
|
48
|
+
* @returns {string}
|
|
49
|
+
*/
|
|
50
|
+
getTextInputValue(customId) {
|
|
51
|
+
return this.getField(customId, ComponentType.TextInput).value;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
module.exports = ModalSubmitFields;
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const { lazy } = require('@discordjs/util');
|
|
4
|
+
const BaseInteraction = require('./BaseInteraction');
|
|
5
|
+
const InteractionWebhook = require('./InteractionWebhook');
|
|
6
|
+
const ModalSubmitFields = require('./ModalSubmitFields');
|
|
7
|
+
const InteractionResponses = require('./interfaces/InteractionResponses');
|
|
8
|
+
|
|
9
|
+
const getMessage = lazy(() => require('./Message').Message);
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* @typedef {Object} ModalData
|
|
13
|
+
* @property {string} value The value of the field
|
|
14
|
+
* @property {ComponentType} type The component type of the field
|
|
15
|
+
* @property {string} customId The custom id of the field
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* @typedef {Object} ActionRowModalData
|
|
20
|
+
* @property {ModalData[]} components The components of this action row
|
|
21
|
+
* @property {ComponentType} type The component type of the action row
|
|
22
|
+
*/
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Represents a modal interaction
|
|
26
|
+
* @extends {BaseInteraction}
|
|
27
|
+
* @implements {InteractionResponses}
|
|
28
|
+
*/
|
|
29
|
+
class ModalSubmitInteraction extends BaseInteraction {
|
|
30
|
+
constructor(client, data) {
|
|
31
|
+
super(client, data);
|
|
32
|
+
/**
|
|
33
|
+
* The custom id of the modal.
|
|
34
|
+
* @type {string}
|
|
35
|
+
*/
|
|
36
|
+
this.customId = data.data.custom_id;
|
|
37
|
+
|
|
38
|
+
if ('message' in data) {
|
|
39
|
+
/**
|
|
40
|
+
* The message associated with this interaction
|
|
41
|
+
* @type {?Message}
|
|
42
|
+
*/
|
|
43
|
+
this.message = this.channel?.messages._add(data.message) ?? new (getMessage())(this.client, data.message);
|
|
44
|
+
} else {
|
|
45
|
+
this.message = null;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* The components within the modal
|
|
50
|
+
* @type {ActionRowModalData[]}
|
|
51
|
+
*/
|
|
52
|
+
this.components = data.data.components?.map(c => ModalSubmitInteraction.transformComponent(c));
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* The fields within the modal
|
|
56
|
+
* @type {ModalSubmitFields}
|
|
57
|
+
*/
|
|
58
|
+
this.fields = new ModalSubmitFields(this.components);
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Whether the reply to this interaction has been deferred
|
|
62
|
+
* @type {boolean}
|
|
63
|
+
*/
|
|
64
|
+
this.deferred = false;
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Whether this interaction has already been replied to
|
|
68
|
+
* @type {boolean}
|
|
69
|
+
*/
|
|
70
|
+
this.replied = false;
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* Whether the reply to this interaction is ephemeral
|
|
74
|
+
* @type {?boolean}
|
|
75
|
+
*/
|
|
76
|
+
this.ephemeral = null;
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* An associated interaction webhook, can be used to further interact with this interaction
|
|
80
|
+
* @type {InteractionWebhook}
|
|
81
|
+
*/
|
|
82
|
+
this.webhook = new InteractionWebhook(this.client, this.applicationId, this.token);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* Transforms component data to discord.js-compatible data
|
|
87
|
+
* @param {*} rawComponent The data to transform
|
|
88
|
+
* @returns {ModalData[]}
|
|
89
|
+
*/
|
|
90
|
+
static transformComponent(rawComponent) {
|
|
91
|
+
return {
|
|
92
|
+
value: rawComponent.value,
|
|
93
|
+
type: rawComponent.type,
|
|
94
|
+
customId: rawComponent.custom_id,
|
|
95
|
+
components: rawComponent.components?.map(c => this.transformComponent(c)),
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* Whether this is from a {@link MessageComponentInteraction}.
|
|
101
|
+
* @returns {boolean}
|
|
102
|
+
*/
|
|
103
|
+
isFromMessage() {
|
|
104
|
+
return Boolean(this.message);
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
// These are here only for documentation purposes - they are implemented by InteractionResponses
|
|
108
|
+
/* eslint-disable no-empty-function */
|
|
109
|
+
deferReply() {}
|
|
110
|
+
reply() {}
|
|
111
|
+
fetchReply() {}
|
|
112
|
+
editReply() {}
|
|
113
|
+
deleteReply() {}
|
|
114
|
+
followUp() {}
|
|
115
|
+
deferUpdate() {}
|
|
116
|
+
update() {}
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
InteractionResponses.applyToClass(ModalSubmitInteraction, 'showModal');
|
|
120
|
+
|
|
121
|
+
module.exports = ModalSubmitInteraction;
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const { Routes } = require('discord-api-types/v10');
|
|
4
|
+
const BaseGuildTextChannel = require('./BaseGuildTextChannel');
|
|
5
|
+
const { DiscordjsError, ErrorCodes } = require('../errors');
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Represents a guild news channel on Discord.
|
|
9
|
+
* @extends {BaseGuildTextChannel}
|
|
10
|
+
*/
|
|
11
|
+
class NewsChannel extends BaseGuildTextChannel {
|
|
12
|
+
/**
|
|
13
|
+
* Adds the target to this channel's followers.
|
|
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 === ChannelType.GuildAnnouncement) {
|
|
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 DiscordjsError(ErrorCodes.GuildChannelResolve);
|
|
27
|
+
await this.client.rest.post(Routes.channelFollowers(this.id), { body: { webhook_channel_id: channelId }, reason });
|
|
28
|
+
return this;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
module.exports = NewsChannel;
|