djs-selfbot-v13 3.2.2 → 3.7.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +37 -36
- package/package.json +89 -85
- package/src/WebSocket.js +39 -39
- package/src/client/BaseClient.js +86 -86
- package/src/client/Client.js +934 -836
- package/src/client/WebhookClient.js +61 -61
- package/src/client/actions/Action.js +116 -120
- package/src/client/actions/ActionsManager.js +80 -78
- package/src/client/actions/ApplicationCommandPermissionsUpdate.js +34 -34
- package/src/client/actions/AutoModerationActionExecution.js +27 -27
- package/src/client/actions/AutoModerationRuleCreate.js +28 -28
- package/src/client/actions/AutoModerationRuleDelete.js +32 -32
- package/src/client/actions/AutoModerationRuleUpdate.js +30 -30
- package/src/client/actions/ChannelCreate.js +23 -23
- package/src/client/actions/ChannelDelete.js +39 -39
- package/src/client/actions/ChannelUpdate.js +43 -43
- package/src/client/actions/GuildAuditLogEntryCreate.js +29 -29
- package/src/client/actions/GuildBanAdd.js +20 -20
- package/src/client/actions/GuildBanRemove.js +25 -25
- package/src/client/actions/GuildChannelsPositionUpdate.js +21 -21
- package/src/client/actions/GuildDelete.js +65 -65
- package/src/client/actions/GuildEmojiCreate.js +20 -20
- package/src/client/actions/GuildEmojiDelete.js +21 -21
- package/src/client/actions/GuildEmojiUpdate.js +20 -20
- package/src/client/actions/GuildEmojisUpdate.js +34 -34
- package/src/client/actions/GuildIntegrationsUpdate.js +19 -19
- package/src/client/actions/GuildMemberRemove.js +33 -32
- package/src/client/actions/GuildMemberUpdate.js +44 -43
- package/src/client/actions/GuildRoleCreate.js +25 -25
- package/src/client/actions/GuildRoleDelete.js +31 -31
- package/src/client/actions/GuildRoleUpdate.js +39 -39
- package/src/client/actions/GuildRolesPositionUpdate.js +21 -21
- package/src/client/actions/GuildScheduledEventCreate.js +27 -27
- package/src/client/actions/GuildScheduledEventDelete.js +31 -31
- package/src/client/actions/GuildScheduledEventUpdate.js +30 -30
- package/src/client/actions/GuildScheduledEventUserAdd.js +32 -32
- package/src/client/actions/GuildScheduledEventUserRemove.js +32 -32
- package/src/client/actions/GuildStickerCreate.js +20 -20
- package/src/client/actions/GuildStickerDelete.js +21 -21
- package/src/client/actions/GuildStickerUpdate.js +20 -20
- package/src/client/actions/GuildStickersUpdate.js +34 -34
- package/src/client/actions/GuildUpdate.js +33 -33
- package/src/client/actions/InviteCreate.js +28 -28
- package/src/client/actions/InviteDelete.js +30 -30
- package/src/client/actions/MessageCreate.js +50 -46
- package/src/client/actions/MessageDelete.js +32 -32
- package/src/client/actions/MessageDeleteBulk.js +46 -46
- package/src/client/actions/MessagePollVoteAdd.js +33 -0
- package/src/client/actions/MessagePollVoteRemove.js +33 -0
- package/src/client/actions/MessageReactionAdd.js +68 -56
- package/src/client/actions/MessageReactionRemove.js +50 -45
- package/src/client/actions/MessageReactionRemoveAll.js +33 -33
- package/src/client/actions/MessageReactionRemoveEmoji.js +28 -28
- package/src/client/actions/MessageUpdate.js +26 -26
- package/src/client/actions/PresenceUpdate.js +50 -46
- package/src/client/actions/StageInstanceCreate.js +28 -28
- package/src/client/actions/StageInstanceDelete.js +33 -33
- package/src/client/actions/StageInstanceUpdate.js +30 -30
- package/src/client/actions/ThreadCreate.js +24 -24
- package/src/client/actions/ThreadDelete.js +32 -32
- package/src/client/actions/ThreadListSync.js +59 -59
- package/src/client/actions/ThreadMemberUpdate.js +30 -30
- package/src/client/actions/ThreadMembersUpdate.js +34 -34
- package/src/client/actions/TypingStart.js +29 -29
- package/src/client/actions/UserUpdate.js +35 -35
- package/src/client/actions/VoiceStateUpdate.js +50 -57
- package/src/client/actions/WebhooksUpdate.js +20 -20
- package/src/client/voice/ClientVoiceManager.js +151 -51
- 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 -392
- package/src/client/websocket/WebSocketShard.js +907 -906
- package/src/client/websocket/handlers/APPLICATION_COMMAND_CREATE.js +18 -18
- package/src/client/websocket/handlers/APPLICATION_COMMAND_DELETE.js +20 -20
- package/src/client/websocket/handlers/APPLICATION_COMMAND_PERMISSIONS_UPDATE.js +5 -5
- package/src/client/websocket/handlers/APPLICATION_COMMAND_UPDATE.js +20 -20
- package/src/client/websocket/handlers/AUTO_MODERATION_ACTION_EXECUTION.js +5 -5
- package/src/client/websocket/handlers/AUTO_MODERATION_RULE_CREATE.js +5 -5
- package/src/client/websocket/handlers/AUTO_MODERATION_RULE_DELETE.js +5 -5
- package/src/client/websocket/handlers/AUTO_MODERATION_RULE_UPDATE.js +5 -5
- package/src/client/websocket/handlers/CALL_CREATE.js +14 -14
- package/src/client/websocket/handlers/CALL_DELETE.js +11 -11
- package/src/client/websocket/handlers/CALL_UPDATE.js +11 -11
- package/src/client/websocket/handlers/CHANNEL_CREATE.js +5 -5
- package/src/client/websocket/handlers/CHANNEL_DELETE.js +5 -5
- package/src/client/websocket/handlers/CHANNEL_PINS_UPDATE.js +22 -22
- package/src/client/websocket/handlers/CHANNEL_RECIPIENT_ADD.js +19 -19
- package/src/client/websocket/handlers/CHANNEL_RECIPIENT_REMOVE.js +16 -16
- package/src/client/websocket/handlers/CHANNEL_UPDATE.js +16 -16
- package/src/client/websocket/handlers/GUILD_AUDIT_LOG_ENTRY_CREATE.js +5 -5
- package/src/client/websocket/handlers/GUILD_BAN_ADD.js +5 -5
- package/src/client/websocket/handlers/GUILD_BAN_REMOVE.js +5 -5
- package/src/client/websocket/handlers/GUILD_CREATE.js +52 -52
- package/src/client/websocket/handlers/GUILD_DELETE.js +5 -5
- package/src/client/websocket/handlers/GUILD_EMOJIS_UPDATE.js +5 -5
- package/src/client/websocket/handlers/GUILD_INTEGRATIONS_UPDATE.js +5 -5
- package/src/client/websocket/handlers/GUILD_MEMBERS_CHUNK.js +39 -39
- package/src/client/websocket/handlers/GUILD_MEMBER_ADD.js +20 -19
- package/src/client/websocket/handlers/GUILD_MEMBER_REMOVE.js +5 -5
- package/src/client/websocket/handlers/GUILD_MEMBER_UPDATE.js +5 -5
- package/src/client/websocket/handlers/GUILD_ROLE_CREATE.js +5 -5
- package/src/client/websocket/handlers/GUILD_ROLE_DELETE.js +5 -5
- package/src/client/websocket/handlers/GUILD_ROLE_UPDATE.js +5 -5
- package/src/client/websocket/handlers/GUILD_SCHEDULED_EVENT_CREATE.js +5 -5
- package/src/client/websocket/handlers/GUILD_SCHEDULED_EVENT_DELETE.js +5 -5
- package/src/client/websocket/handlers/GUILD_SCHEDULED_EVENT_UPDATE.js +5 -5
- package/src/client/websocket/handlers/GUILD_SCHEDULED_EVENT_USER_ADD.js +5 -5
- package/src/client/websocket/handlers/GUILD_SCHEDULED_EVENT_USER_REMOVE.js +5 -5
- package/src/client/websocket/handlers/GUILD_STICKERS_UPDATE.js +5 -5
- package/src/client/websocket/handlers/GUILD_UPDATE.js +5 -5
- package/src/client/websocket/handlers/INTERACTION_MODAL_CREATE.js +12 -12
- package/src/client/websocket/handlers/INVITE_CREATE.js +5 -5
- package/src/client/websocket/handlers/INVITE_DELETE.js +5 -5
- package/src/client/websocket/handlers/MESSAGE_CREATE.js +5 -5
- package/src/client/websocket/handlers/MESSAGE_DELETE.js +5 -5
- package/src/client/websocket/handlers/MESSAGE_DELETE_BULK.js +5 -5
- package/src/client/websocket/handlers/MESSAGE_POLL_VOTE_ADD.js +5 -22
- package/src/client/websocket/handlers/MESSAGE_POLL_VOTE_REMOVE.js +5 -12
- package/src/client/websocket/handlers/MESSAGE_REACTION_ADD.js +5 -5
- package/src/client/websocket/handlers/MESSAGE_REACTION_REMOVE.js +5 -5
- package/src/client/websocket/handlers/MESSAGE_REACTION_REMOVE_ALL.js +5 -5
- package/src/client/websocket/handlers/MESSAGE_REACTION_REMOVE_EMOJI.js +5 -5
- package/src/client/websocket/handlers/MESSAGE_UPDATE.js +16 -16
- package/src/client/websocket/handlers/PRESENCE_UPDATE.js +5 -5
- package/src/client/websocket/handlers/READY.js +121 -120
- package/src/client/websocket/handlers/RELATIONSHIP_ADD.js +19 -19
- package/src/client/websocket/handlers/RELATIONSHIP_REMOVE.js +17 -17
- package/src/client/websocket/handlers/RELATIONSHIP_UPDATE.js +41 -41
- package/src/client/websocket/handlers/RESUMED.js +14 -14
- package/src/client/websocket/handlers/STAGE_INSTANCE_CREATE.js +5 -5
- package/src/client/websocket/handlers/STAGE_INSTANCE_DELETE.js +5 -5
- package/src/client/websocket/handlers/STAGE_INSTANCE_UPDATE.js +5 -5
- package/src/client/websocket/handlers/THREAD_CREATE.js +5 -5
- package/src/client/websocket/handlers/THREAD_DELETE.js +5 -5
- package/src/client/websocket/handlers/THREAD_LIST_SYNC.js +5 -5
- package/src/client/websocket/handlers/THREAD_MEMBERS_UPDATE.js +5 -5
- package/src/client/websocket/handlers/THREAD_MEMBER_UPDATE.js +5 -5
- package/src/client/websocket/handlers/THREAD_UPDATE.js +16 -16
- package/src/client/websocket/handlers/TYPING_START.js +5 -5
- package/src/client/websocket/handlers/USER_GUILD_SETTINGS_UPDATE.js +6 -6
- package/src/client/websocket/handlers/USER_NOTE_UPDATE.js +5 -5
- package/src/client/websocket/handlers/USER_REQUIRED_ACTION_UPDATE.js +78 -78
- package/src/client/websocket/handlers/USER_SETTINGS_UPDATE.js +5 -5
- package/src/client/websocket/handlers/USER_UPDATE.js +5 -5
- package/src/client/websocket/handlers/VOICE_CHANNEL_EFFECT_SEND.js +16 -0
- package/src/client/websocket/handlers/VOICE_CHANNEL_STATUS_UPDATE.js +12 -12
- package/src/client/websocket/handlers/VOICE_SERVER_UPDATE.js +6 -6
- package/src/client/websocket/handlers/VOICE_STATE_UPDATE.js +5 -5
- package/src/client/websocket/handlers/WEBHOOKS_UPDATE.js +5 -5
- package/src/client/websocket/handlers/index.js +84 -83
- package/src/errors/DJSError.js +61 -61
- package/src/errors/Messages.js +217 -183
- package/src/errors/index.js +4 -4
- package/src/index.js +172 -159
- package/src/managers/ApplicationCommandManager.js +264 -264
- package/src/managers/ApplicationCommandPermissionsManager.js +417 -417
- package/src/managers/AutoModerationRuleManager.js +296 -296
- package/src/managers/BaseGuildEmojiManager.js +80 -80
- package/src/managers/BaseManager.js +19 -19
- package/src/managers/BillingManager.js +66 -66
- package/src/managers/CachedManager.js +71 -71
- package/src/managers/ChannelManager.js +148 -138
- package/src/managers/ClientUserSettingManager.js +372 -372
- package/src/managers/DataManager.js +61 -61
- package/src/managers/GuildBanManager.js +250 -250
- package/src/managers/GuildChannelManager.js +488 -488
- package/src/managers/GuildEmojiManager.js +171 -171
- package/src/managers/GuildEmojiRoleManager.js +118 -118
- package/src/managers/GuildForumThreadManager.js +108 -108
- package/src/managers/GuildInviteManager.js +213 -213
- package/src/managers/GuildManager.js +338 -304
- package/src/managers/GuildMemberManager.js +599 -597
- package/src/managers/GuildMemberRoleManager.js +195 -191
- package/src/managers/GuildScheduledEventManager.js +314 -296
- package/src/managers/GuildSettingManager.js +155 -155
- package/src/managers/GuildStickerManager.js +179 -179
- package/src/managers/GuildTextThreadManager.js +98 -98
- package/src/managers/InteractionManager.js +39 -39
- package/src/managers/MessageManager.js +423 -391
- package/src/managers/PermissionOverwriteManager.js +164 -166
- package/src/managers/PresenceManager.js +71 -58
- package/src/managers/ReactionManager.js +67 -67
- package/src/managers/ReactionUserManager.js +73 -71
- package/src/managers/RelationshipManager.js +278 -265
- package/src/managers/RoleManager.js +448 -352
- package/src/managers/SessionManager.js +66 -0
- package/src/managers/StageInstanceManager.js +162 -162
- package/src/managers/ThreadManager.js +175 -174
- package/src/managers/ThreadMemberManager.js +186 -186
- package/src/managers/UserManager.js +136 -146
- package/src/managers/UserNoteManager.js +53 -53
- package/src/managers/VoiceStateManager.js +59 -37
- package/src/rest/APIRequest.js +154 -160
- package/src/rest/APIRouter.js +53 -53
- package/src/rest/DiscordAPIError.js +119 -104
- package/src/rest/HTTPError.js +62 -62
- package/src/rest/RESTManager.js +67 -62
- package/src/rest/RateLimitError.js +55 -55
- package/src/rest/RequestHandler.js +466 -444
- package/src/sharding/Shard.js +444 -443
- package/src/sharding/ShardClientUtil.js +279 -275
- package/src/sharding/ShardingManager.js +319 -318
- package/src/structures/AnonymousGuild.js +98 -98
- package/src/structures/ApplicationCommand.js +593 -593
- package/src/structures/ApplicationRoleConnectionMetadata.js +48 -48
- package/src/structures/AutoModerationActionExecution.js +89 -89
- package/src/structures/AutoModerationRule.js +294 -294
- package/src/structures/AutocompleteInteraction.js +107 -107
- package/src/structures/Base.js +43 -43
- package/src/structures/BaseCommandInteraction.js +211 -211
- package/src/structures/BaseGuild.js +116 -116
- package/src/structures/BaseGuildEmoji.js +56 -56
- package/src/structures/BaseGuildTextChannel.js +191 -191
- package/src/structures/BaseGuildVoiceChannel.js +241 -241
- package/src/structures/BaseMessageComponent.js +181 -114
- package/src/structures/ButtonInteraction.js +11 -11
- package/src/structures/CallState.js +63 -63
- package/src/structures/CategoryChannel.js +85 -85
- package/src/structures/Channel.js +284 -270
- package/src/structures/ClientPresence.js +77 -85
- package/src/structures/ClientUser.js +479 -448
- package/src/structures/CommandInteraction.js +41 -41
- package/src/structures/CommandInteractionOptionResolver.js +276 -276
- package/src/structures/ContainerComponent.js +68 -0
- package/src/structures/ContextMenuInteraction.js +65 -65
- package/src/structures/DMChannel.js +219 -217
- package/src/structures/DirectoryChannel.js +20 -20
- package/src/structures/Emoji.js +148 -148
- package/src/structures/FileComponent.js +49 -0
- package/src/structures/ForumChannel.js +31 -261
- package/src/structures/GroupDMChannel.js +394 -387
- package/src/structures/Guild.js +1643 -1608
- package/src/structures/GuildAuditLogs.js +746 -729
- package/src/structures/GuildBan.js +59 -59
- package/src/structures/GuildBoost.js +108 -108
- package/src/structures/GuildChannel.js +470 -468
- package/src/structures/GuildEmoji.js +161 -161
- package/src/structures/GuildMember.js +636 -568
- package/src/structures/GuildPreview.js +191 -191
- package/src/structures/GuildPreviewEmoji.js +27 -27
- package/src/structures/GuildScheduledEvent.js +536 -441
- package/src/structures/GuildTemplate.js +236 -236
- package/src/structures/Integration.js +188 -188
- package/src/structures/IntegrationApplication.js +96 -96
- package/src/structures/Interaction.js +290 -290
- package/src/structures/InteractionCollector.js +248 -248
- package/src/structures/InteractionWebhook.js +43 -43
- package/src/structures/Invite.js +358 -358
- package/src/structures/InviteGuild.js +23 -23
- package/src/structures/InviteStageInstance.js +86 -86
- 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 -1227
- package/src/structures/MessageActionRow.js +105 -103
- package/src/structures/MessageAttachment.js +216 -204
- package/src/structures/MessageButton.js +166 -165
- package/src/structures/MessageCollector.js +146 -146
- package/src/structures/MessageComponentInteraction.js +120 -120
- package/src/structures/MessageContextMenuInteraction.js +20 -20
- package/src/structures/MessageEmbed.js +596 -586
- package/src/structures/MessageMentions.js +273 -273
- package/src/structures/MessagePayload.js +354 -318
- package/src/structures/MessageReaction.js +181 -171
- package/src/structures/MessageSelectMenu.js +141 -140
- package/src/structures/Modal.js +161 -161
- package/src/structures/ModalSubmitFieldsResolver.js +53 -53
- package/src/structures/ModalSubmitInteraction.js +119 -119
- package/src/structures/NewsChannel.js +32 -32
- package/src/structures/OAuth2Guild.js +28 -28
- package/src/structures/PermissionOverwrites.js +198 -196
- package/src/structures/Poll.js +108 -0
- package/src/structures/PollAnswer.js +88 -0
- package/src/structures/Presence.js +1105 -1101
- package/src/structures/ReactionCollector.js +229 -229
- package/src/structures/ReactionEmoji.js +31 -31
- package/src/structures/Role.js +590 -531
- package/src/structures/SectionComponent.js +48 -0
- package/src/structures/SelectMenuInteraction.js +21 -21
- package/src/structures/SeparatorComponent.js +48 -0
- package/src/structures/Session.js +81 -0
- package/src/structures/StageChannel.js +104 -104
- package/src/structures/StageInstance.js +208 -208
- package/src/structures/Sticker.js +310 -310
- package/src/structures/StickerPack.js +95 -95
- package/src/structures/StoreChannel.js +56 -56
- package/src/structures/Team.js +118 -118
- package/src/structures/TeamMember.js +80 -71
- package/src/structures/TextChannel.js +33 -33
- package/src/structures/TextDisplayComponent.js +40 -0
- package/src/structures/TextInputComponent.js +132 -131
- package/src/structures/ThreadChannel.js +605 -607
- package/src/structures/ThreadMember.js +105 -105
- package/src/structures/ThreadOnlyChannel.js +249 -0
- package/src/structures/ThumbnailComponent.js +57 -0
- package/src/structures/Typing.js +74 -74
- package/src/structures/UnfurledMediaItem.js +29 -0
- package/src/structures/User.js +640 -543
- package/src/structures/UserContextMenuInteraction.js +29 -29
- package/src/structures/VoiceChannel.js +110 -110
- package/src/structures/VoiceChannelEffect.js +69 -0
- package/src/structures/VoiceRegion.js +53 -53
- package/src/structures/VoiceState.js +354 -341
- package/src/structures/WebEmbed.js +373 -373
- package/src/structures/Webhook.js +478 -467
- package/src/structures/WelcomeChannel.js +60 -60
- package/src/structures/WelcomeScreen.js +48 -48
- package/src/structures/Widget.js +87 -87
- package/src/structures/WidgetMember.js +99 -99
- package/src/structures/interfaces/Application.js +825 -313
- package/src/structures/interfaces/Collector.js +300 -300
- package/src/structures/interfaces/InteractionResponses.js +313 -313
- package/src/structures/interfaces/TextBasedChannel.js +759 -719
- package/src/util/APITypes.js +59 -0
- package/src/util/ActivityFlags.js +44 -44
- package/src/util/ApplicationFlags.js +76 -76
- package/src/util/AttachmentFlags.js +38 -38
- package/src/util/BitField.js +170 -170
- package/src/util/ChannelFlags.js +45 -45
- package/src/util/Constants.js +1914 -1773
- package/src/util/DataResolver.js +146 -145
- package/src/util/Formatters.js +228 -228
- package/src/util/GuildMemberFlags.js +43 -43
- package/src/util/Intents.js +74 -74
- package/src/util/InviteFlags.js +34 -29
- package/src/util/LimitedCollection.js +131 -131
- package/src/util/MessageFlags.js +63 -54
- package/src/util/Options.js +358 -336
- package/src/util/Permissions.js +202 -202
- package/src/util/PremiumUsageFlags.js +31 -31
- package/src/util/PurchasedFlags.js +33 -33
- package/src/util/RemoteAuth.js +382 -379
- package/src/util/RoleFlags.js +37 -37
- package/src/util/SnowflakeUtil.js +92 -92
- package/src/util/Speaking.js +33 -0
- package/src/util/Sweepers.js +466 -466
- package/src/util/SystemChannelFlags.js +55 -55
- package/src/util/ThreadMemberFlags.js +30 -30
- package/src/util/UserFlags.js +104 -104
- package/src/util/Util.js +1048 -889
- package/typings/enums.d.ts +439 -297
- package/typings/index.d.ts +8247 -7432
- package/typings/rawDataTypes.d.ts +403 -342
- package/src/structures/MessagePoll.js +0 -238
|
@@ -1,391 +1,423 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
const { Collection } = require('@discordjs/collection');
|
|
4
|
-
const CachedManager = require('./CachedManager');
|
|
5
|
-
const { TypeError } = require('../errors');
|
|
6
|
-
const { Message } = require('../structures/Message');
|
|
7
|
-
const MessagePayload = require('../structures/MessagePayload');
|
|
8
|
-
const Util = require('../util/Util');
|
|
9
|
-
|
|
10
|
-
/**
|
|
11
|
-
* Manages API methods for Messages and holds their cache.
|
|
12
|
-
* @extends {CachedManager}
|
|
13
|
-
*/
|
|
14
|
-
class MessageManager extends CachedManager {
|
|
15
|
-
constructor(channel, iterable) {
|
|
16
|
-
super(channel.client, Message, iterable);
|
|
17
|
-
|
|
18
|
-
/**
|
|
19
|
-
* The channel that the messages belong to
|
|
20
|
-
* @type {TextBasedChannels}
|
|
21
|
-
*/
|
|
22
|
-
this.channel = channel;
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
/**
|
|
26
|
-
* The cache of Messages
|
|
27
|
-
* @type {Collection<Snowflake, Message>}
|
|
28
|
-
* @name MessageManager#cache
|
|
29
|
-
*/
|
|
30
|
-
|
|
31
|
-
_add(data, cache) {
|
|
32
|
-
return super._add(data, cache);
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
/**
|
|
36
|
-
* The parameters to pass in when requesting previous messages from a channel. `around`, `before` and
|
|
37
|
-
* `after` are mutually exclusive. All the parameters are optional.
|
|
38
|
-
* @typedef {Object} ChannelLogsQueryOptions
|
|
39
|
-
* @property {number} [limit=50] Number of messages to acquire
|
|
40
|
-
* @property {Snowflake} [before] The message's id to get the messages that were posted before it
|
|
41
|
-
* @property {Snowflake} [after] The message's id to get the messages that were posted after it
|
|
42
|
-
* @property {Snowflake} [around] The message's id to get the messages that were posted around it
|
|
43
|
-
*/
|
|
44
|
-
|
|
45
|
-
/**
|
|
46
|
-
* Gets a message, or messages, from this channel.
|
|
47
|
-
* <info>The returned Collection does not contain reaction users of the messages if they were not cached.
|
|
48
|
-
* Those need to be fetched separately in such a case.</info>
|
|
49
|
-
* @param {Snowflake|ChannelLogsQueryOptions} [message] The id of the message to fetch, or query parameters.
|
|
50
|
-
* @param {BaseFetchOptions} [options] Additional options for this fetch
|
|
51
|
-
* @returns {Promise<Message|Collection<Snowflake, Message>>}
|
|
52
|
-
* @example
|
|
53
|
-
* // Get message
|
|
54
|
-
* channel.messages.fetch('99539446449315840')
|
|
55
|
-
* .then(message => console.log(message.content))
|
|
56
|
-
* .catch(console.error);
|
|
57
|
-
* @example
|
|
58
|
-
* // Get messages
|
|
59
|
-
* channel.messages.fetch({ limit: 10 })
|
|
60
|
-
* .then(messages => console.log(`Received ${messages.size} messages`))
|
|
61
|
-
* .catch(console.error);
|
|
62
|
-
* @example
|
|
63
|
-
* // Get messages and filter by user id
|
|
64
|
-
* channel.messages.fetch()
|
|
65
|
-
* .then(messages => console.log(`${messages.filter(m => m.author.id === '84484653687267328').size} messages`))
|
|
66
|
-
* .catch(console.error);
|
|
67
|
-
*/
|
|
68
|
-
fetch(message, { cache = true, force = false } = {}) {
|
|
69
|
-
return typeof message === 'string' ? this._fetchId(message, cache, force) : this._fetchMany(message, cache);
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
/**
|
|
73
|
-
* Fetches the pinned messages of this channel and returns a collection of them.
|
|
74
|
-
* <info>The returned Collection does not contain any reaction data of the messages.
|
|
75
|
-
* Those need to be fetched separately.</info>
|
|
76
|
-
* @param {boolean} [cache=true] Whether to cache the message(s)
|
|
77
|
-
* @returns {Promise<Collection<Snowflake, Message>>}
|
|
78
|
-
* @example
|
|
79
|
-
* // Get pinned messages
|
|
80
|
-
* channel.messages.fetchPinned()
|
|
81
|
-
* .then(messages => console.log(`Received ${messages.size} messages`))
|
|
82
|
-
* .catch(console.error);
|
|
83
|
-
*/
|
|
84
|
-
async fetchPinned(cache = true) {
|
|
85
|
-
const data = await this.client.api.channels[this.channel.id].pins.get(
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
*
|
|
95
|
-
*
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
* @
|
|
102
|
-
* @
|
|
103
|
-
* @
|
|
104
|
-
* @
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
* @
|
|
111
|
-
* @
|
|
112
|
-
* @
|
|
113
|
-
* @
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
*
|
|
120
|
-
* @
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
.
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
const
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
*
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
*
|
|
179
|
-
* @
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
*
|
|
192
|
-
* @
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
*
|
|
205
|
-
* @param {
|
|
206
|
-
* @
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
.
|
|
224
|
-
.
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
*
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
* @
|
|
269
|
-
* @property {
|
|
270
|
-
* @property {
|
|
271
|
-
* @property {
|
|
272
|
-
* @property {
|
|
273
|
-
* @property {
|
|
274
|
-
* @property {Array<
|
|
275
|
-
* @property {boolean} [
|
|
276
|
-
* @property {
|
|
277
|
-
* @property {
|
|
278
|
-
*
|
|
279
|
-
* @property {
|
|
280
|
-
*
|
|
281
|
-
*
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
* @
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
*
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
if (
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
const
|
|
327
|
-
if (!
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
return true;
|
|
331
|
-
}
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
let
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
if (
|
|
341
|
-
|
|
342
|
-
if (
|
|
343
|
-
|
|
344
|
-
if (
|
|
345
|
-
if (
|
|
346
|
-
if (
|
|
347
|
-
if (
|
|
348
|
-
if (
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
stringQuery.push(
|
|
352
|
-
}
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
stringQuery.push(
|
|
357
|
-
}
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
if (
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const { Collection } = require('@discordjs/collection');
|
|
4
|
+
const CachedManager = require('./CachedManager');
|
|
5
|
+
const { TypeError } = require('../errors');
|
|
6
|
+
const { Message } = require('../structures/Message');
|
|
7
|
+
const MessagePayload = require('../structures/MessagePayload');
|
|
8
|
+
const Util = require('../util/Util');
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Manages API methods for Messages and holds their cache.
|
|
12
|
+
* @extends {CachedManager}
|
|
13
|
+
*/
|
|
14
|
+
class MessageManager extends CachedManager {
|
|
15
|
+
constructor(channel, iterable) {
|
|
16
|
+
super(channel.client, Message, iterable);
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* The channel that the messages belong to
|
|
20
|
+
* @type {TextBasedChannels}
|
|
21
|
+
*/
|
|
22
|
+
this.channel = channel;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* The cache of Messages
|
|
27
|
+
* @type {Collection<Snowflake, Message>}
|
|
28
|
+
* @name MessageManager#cache
|
|
29
|
+
*/
|
|
30
|
+
|
|
31
|
+
_add(data, cache) {
|
|
32
|
+
return super._add(data, cache);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* The parameters to pass in when requesting previous messages from a channel. `around`, `before` and
|
|
37
|
+
* `after` are mutually exclusive. All the parameters are optional.
|
|
38
|
+
* @typedef {Object} ChannelLogsQueryOptions
|
|
39
|
+
* @property {number} [limit=50] Number of messages to acquire
|
|
40
|
+
* @property {Snowflake} [before] The message's id to get the messages that were posted before it
|
|
41
|
+
* @property {Snowflake} [after] The message's id to get the messages that were posted after it
|
|
42
|
+
* @property {Snowflake} [around] The message's id to get the messages that were posted around it
|
|
43
|
+
*/
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Gets a message, or messages, from this channel.
|
|
47
|
+
* <info>The returned Collection does not contain reaction users of the messages if they were not cached.
|
|
48
|
+
* Those need to be fetched separately in such a case.</info>
|
|
49
|
+
* @param {Snowflake|ChannelLogsQueryOptions} [message] The id of the message to fetch, or query parameters.
|
|
50
|
+
* @param {BaseFetchOptions} [options] Additional options for this fetch
|
|
51
|
+
* @returns {Promise<Message|Collection<Snowflake, Message>>}
|
|
52
|
+
* @example
|
|
53
|
+
* // Get message
|
|
54
|
+
* channel.messages.fetch('99539446449315840')
|
|
55
|
+
* .then(message => console.log(message.content))
|
|
56
|
+
* .catch(console.error);
|
|
57
|
+
* @example
|
|
58
|
+
* // Get messages
|
|
59
|
+
* channel.messages.fetch({ limit: 10 })
|
|
60
|
+
* .then(messages => console.log(`Received ${messages.size} messages`))
|
|
61
|
+
* .catch(console.error);
|
|
62
|
+
* @example
|
|
63
|
+
* // Get messages and filter by user id
|
|
64
|
+
* channel.messages.fetch()
|
|
65
|
+
* .then(messages => console.log(`${messages.filter(m => m.author.id === '84484653687267328').size} messages`))
|
|
66
|
+
* .catch(console.error);
|
|
67
|
+
*/
|
|
68
|
+
fetch(message, { cache = true, force = false } = {}) {
|
|
69
|
+
return typeof message === 'string' ? this._fetchId(message, cache, force) : this._fetchMany(message, cache);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* Fetches the pinned messages of this channel and returns a collection of them.
|
|
74
|
+
* <info>The returned Collection does not contain any reaction data of the messages.
|
|
75
|
+
* Those need to be fetched separately.</info>
|
|
76
|
+
* @param {boolean} [cache=true] Whether to cache the message(s)
|
|
77
|
+
* @returns {Promise<Collection<Snowflake, Message>>}
|
|
78
|
+
* @example
|
|
79
|
+
* // Get pinned messages
|
|
80
|
+
* channel.messages.fetchPinned()
|
|
81
|
+
* .then(messages => console.log(`Received ${messages.size} messages`))
|
|
82
|
+
* .catch(console.error);
|
|
83
|
+
*/
|
|
84
|
+
async fetchPinned(cache = true) {
|
|
85
|
+
const data = await this.client.api.channels[this.channel.id].messages.pins.get({
|
|
86
|
+
query: { limit: 50 },
|
|
87
|
+
});
|
|
88
|
+
const messages = new Collection();
|
|
89
|
+
for (const message of data?.items || []) messages.set(message.id, this._add(message, cache));
|
|
90
|
+
return messages;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* Data that can be resolved to a Message object. This can be:
|
|
95
|
+
* * A Message
|
|
96
|
+
* * A Snowflake
|
|
97
|
+
* @typedef {Message|Snowflake} MessageResolvable
|
|
98
|
+
*/
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
* Resolves a {@link MessageResolvable} to a {@link Message} object.
|
|
102
|
+
* @method resolve
|
|
103
|
+
* @memberof MessageManager
|
|
104
|
+
* @instance
|
|
105
|
+
* @param {MessageResolvable} message The message resolvable to resolve
|
|
106
|
+
* @returns {?Message}
|
|
107
|
+
*/
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* Resolves a {@link MessageResolvable} to a {@link Message} id.
|
|
111
|
+
* @method resolveId
|
|
112
|
+
* @memberof MessageManager
|
|
113
|
+
* @instance
|
|
114
|
+
* @param {MessageResolvable} message The message resolvable to resolve
|
|
115
|
+
* @returns {?Snowflake}
|
|
116
|
+
*/
|
|
117
|
+
|
|
118
|
+
/**
|
|
119
|
+
* Edits a message, even if it's not cached.
|
|
120
|
+
* @param {MessageResolvable} message The message to edit
|
|
121
|
+
* @param {string|MessageEditOptions|MessagePayload} options The options to edit the message
|
|
122
|
+
* @returns {Promise<Message>}
|
|
123
|
+
*/
|
|
124
|
+
async edit(message, options) {
|
|
125
|
+
const messageId = this.resolveId(message);
|
|
126
|
+
if (!messageId) throw new TypeError('INVALID_TYPE', 'message', 'MessageResolvable');
|
|
127
|
+
|
|
128
|
+
const { data, files } = await (options instanceof MessagePayload
|
|
129
|
+
? options
|
|
130
|
+
: MessagePayload.create(message instanceof Message ? message : this, options)
|
|
131
|
+
)
|
|
132
|
+
.resolveData()
|
|
133
|
+
.resolveFiles();
|
|
134
|
+
|
|
135
|
+
// New API
|
|
136
|
+
const attachments = await Util.getUploadURL(this.client, this.channel.id, files);
|
|
137
|
+
const requestPromises = attachments.map(async attachment => {
|
|
138
|
+
await Util.uploadFile(files[attachment.id].file, attachment.upload_url);
|
|
139
|
+
return {
|
|
140
|
+
id: attachment.id,
|
|
141
|
+
filename: files[attachment.id].name,
|
|
142
|
+
uploaded_filename: attachment.upload_filename,
|
|
143
|
+
description: files[attachment.id].description,
|
|
144
|
+
duration_secs: files[attachment.id].duration_secs,
|
|
145
|
+
waveform: files[attachment.id].waveform,
|
|
146
|
+
};
|
|
147
|
+
});
|
|
148
|
+
const attachmentsData = await Promise.all(requestPromises);
|
|
149
|
+
attachmentsData.sort((a, b) => parseInt(a.id) - parseInt(b.id));
|
|
150
|
+
data.attachments = attachmentsData;
|
|
151
|
+
// Empty Files
|
|
152
|
+
|
|
153
|
+
const d = await this.client.api.channels[this.channel.id].messages[messageId].patch({ data });
|
|
154
|
+
|
|
155
|
+
const existing = this.cache.get(messageId);
|
|
156
|
+
if (existing) {
|
|
157
|
+
const clone = existing._clone();
|
|
158
|
+
clone._patch(d);
|
|
159
|
+
return clone;
|
|
160
|
+
}
|
|
161
|
+
return this._add(d);
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
/**
|
|
165
|
+
* Publishes a message in an announcement channel to all channels following it, even if it's not cached.
|
|
166
|
+
* @param {MessageResolvable} message The message to publish
|
|
167
|
+
* @returns {Promise<Message>}
|
|
168
|
+
*/
|
|
169
|
+
async crosspost(message) {
|
|
170
|
+
message = this.resolveId(message);
|
|
171
|
+
if (!message) throw new TypeError('INVALID_TYPE', 'message', 'MessageResolvable');
|
|
172
|
+
|
|
173
|
+
const data = await this.client.api.channels(this.channel.id).messages(message).crosspost.post();
|
|
174
|
+
return this.cache.get(data.id) ?? this._add(data);
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
/**
|
|
178
|
+
* Pins a message to the channel's pinned messages, even if it's not cached.
|
|
179
|
+
* @param {MessageResolvable} message The message to pin
|
|
180
|
+
* @param {string} [reason] Reason for pinning
|
|
181
|
+
* @returns {Promise<void>}
|
|
182
|
+
*/
|
|
183
|
+
async pin(message, reason) {
|
|
184
|
+
message = this.resolveId(message);
|
|
185
|
+
if (!message) throw new TypeError('INVALID_TYPE', 'message', 'MessageResolvable');
|
|
186
|
+
|
|
187
|
+
await this.client.api.channels(this.channel.id).messages.pins(message).put({ reason });
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
/**
|
|
191
|
+
* Unpins a message from the channel's pinned messages, even if it's not cached.
|
|
192
|
+
* @param {MessageResolvable} message The message to unpin
|
|
193
|
+
* @param {string} [reason] Reason for unpinning
|
|
194
|
+
* @returns {Promise<void>}
|
|
195
|
+
*/
|
|
196
|
+
async unpin(message, reason) {
|
|
197
|
+
message = this.resolveId(message);
|
|
198
|
+
if (!message) throw new TypeError('INVALID_TYPE', 'message', 'MessageResolvable');
|
|
199
|
+
|
|
200
|
+
await this.client.api.channels(this.channel.id).messages.pins(message).delete({ reason });
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
/**
|
|
204
|
+
* Adds a reaction to a message, even if it's not cached.
|
|
205
|
+
* @param {MessageResolvable} message The message to react to
|
|
206
|
+
* @param {EmojiIdentifierResolvable} emoji The emoji to react with
|
|
207
|
+
* @param {boolean} [burst=false] Super Reactions (Discord Nitro only)
|
|
208
|
+
* @returns {Promise<void>}
|
|
209
|
+
*/
|
|
210
|
+
async react(message, emoji, burst = false) {
|
|
211
|
+
message = this.resolveId(message);
|
|
212
|
+
if (!message) throw new TypeError('INVALID_TYPE', 'message', 'MessageResolvable');
|
|
213
|
+
|
|
214
|
+
emoji = Util.resolvePartialEmoji(emoji);
|
|
215
|
+
if (!emoji) throw new TypeError('EMOJI_TYPE', 'emoji', 'EmojiIdentifierResolvable');
|
|
216
|
+
|
|
217
|
+
const emojiId = emoji.id
|
|
218
|
+
? `${emoji.animated ? 'a:' : ''}${emoji.name}:${emoji.id}`
|
|
219
|
+
: encodeURIComponent(emoji.name);
|
|
220
|
+
|
|
221
|
+
// eslint-disable-next-line newline-per-chained-call
|
|
222
|
+
await this.client.api
|
|
223
|
+
.channels(this.channel.id)
|
|
224
|
+
.messages(message)
|
|
225
|
+
.reactions(emojiId, '@me')
|
|
226
|
+
.put({
|
|
227
|
+
query: {
|
|
228
|
+
type: burst ? 1 : 0,
|
|
229
|
+
},
|
|
230
|
+
});
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
/**
|
|
234
|
+
* Deletes a message, even if it's not cached.
|
|
235
|
+
* @param {MessageResolvable} message The message to delete
|
|
236
|
+
* @returns {Promise<void>}
|
|
237
|
+
*/
|
|
238
|
+
async delete(message) {
|
|
239
|
+
message = this.resolveId(message);
|
|
240
|
+
if (!message) throw new TypeError('INVALID_TYPE', 'message', 'MessageResolvable');
|
|
241
|
+
|
|
242
|
+
await this.client.api.channels(this.channel.id).messages(message).delete();
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
_fetchId(messageId, cache, force) {
|
|
246
|
+
if (!force) {
|
|
247
|
+
const existing = this.cache.get(messageId);
|
|
248
|
+
if (existing && !existing.partial) return existing;
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
// https://discord.com/api/v9/channels/:id/messages?limit=50&around=:msgid
|
|
252
|
+
return new Promise((resolve, reject) => {
|
|
253
|
+
this._fetchMany(
|
|
254
|
+
{
|
|
255
|
+
around: messageId,
|
|
256
|
+
limit: 50,
|
|
257
|
+
},
|
|
258
|
+
cache,
|
|
259
|
+
)
|
|
260
|
+
.then(data_ =>
|
|
261
|
+
data_.has(messageId) ? resolve(data_.get(messageId)) : reject(new Error('MESSAGE_ID_NOT_FOUND')),
|
|
262
|
+
)
|
|
263
|
+
.catch(reject);
|
|
264
|
+
});
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
/**
|
|
268
|
+
* @typedef {object} MessageSearchOptions
|
|
269
|
+
* @property {Array<UserResolvable>} [authors] An array of author to filter by
|
|
270
|
+
* @property {Array<UserResolvable>} [mentions] An array of user (mentioned) to filter by
|
|
271
|
+
* @property {string} [content] A messageContent to filter by
|
|
272
|
+
* @property {Snowflake} [maxId] The maximum Message ID to filter by
|
|
273
|
+
* @property {Snowflake} [minId] The minimum Message ID to filter by
|
|
274
|
+
* @property {Array<TextChannelResolvable>} [channels] An array of channel to filter by
|
|
275
|
+
* @property {boolean} [pinned] Whether to filter by pinned messages
|
|
276
|
+
* @property {Array<string>} [has] Message has: `link`, `embed`, `file`, `video`, `image`, or `sound`
|
|
277
|
+
* @property {boolean} [nsfw=false] Whether to filter by NSFW channels
|
|
278
|
+
* @property {number} [offset=0] The number of messages to skip (for pagination, 25 results per page)
|
|
279
|
+
* @property {number} [limit=25] The number of messages to fetch
|
|
280
|
+
* <info>The maximum limit allowed is 25.</info>
|
|
281
|
+
* @property {string} [sortBy] The order to sort by (`timestamp` or `relevance`)
|
|
282
|
+
* @property {string} [sortOrder] The order to return results in (`asc` or `desc`)
|
|
283
|
+
* <info>The default sort is <code>timestamp</code> in descending order <code>desc</code> (newest first).</info>
|
|
284
|
+
*/
|
|
285
|
+
|
|
286
|
+
/**
|
|
287
|
+
* @typedef {object} MessageSearchResult
|
|
288
|
+
* @property {Collection<Snowflake, Message>} messages A collection of found messages
|
|
289
|
+
* @property {number} total The total number of messages that match the search criteria
|
|
290
|
+
*/
|
|
291
|
+
|
|
292
|
+
/**
|
|
293
|
+
* Search Messages in the channel.
|
|
294
|
+
* @param {MessageSearchOptions} options Performs a search within the channel.
|
|
295
|
+
* @returns {MessageSearchResult}
|
|
296
|
+
*/
|
|
297
|
+
async search(options = {}) {
|
|
298
|
+
// eslint-disable-next-line no-unused-vars
|
|
299
|
+
let { authors, content, mentions, has, maxId, minId, channels, pinned, nsfw, offset, limit, sortBy, sortOrder } =
|
|
300
|
+
Object.assign(
|
|
301
|
+
{
|
|
302
|
+
authors: [],
|
|
303
|
+
content: '',
|
|
304
|
+
mentions: [],
|
|
305
|
+
has: [],
|
|
306
|
+
maxId: null,
|
|
307
|
+
minId: null,
|
|
308
|
+
channels: [],
|
|
309
|
+
pinned: false,
|
|
310
|
+
nsfw: false,
|
|
311
|
+
offset: 0,
|
|
312
|
+
limit: 25,
|
|
313
|
+
sortBy: 'timestamp',
|
|
314
|
+
sortOrder: 'desc',
|
|
315
|
+
},
|
|
316
|
+
options,
|
|
317
|
+
);
|
|
318
|
+
// Validate
|
|
319
|
+
if (authors.length > 0) authors = authors.map(u => this.client.users.resolveId(u));
|
|
320
|
+
if (mentions.length > 0) mentions = mentions.map(u => this.client.users.resolveId(u));
|
|
321
|
+
if (channels.length > 0) {
|
|
322
|
+
channels = channels
|
|
323
|
+
.map(c => this.client.channels.resolveId(c))
|
|
324
|
+
.filter(id => {
|
|
325
|
+
if (this.channel.guildId) {
|
|
326
|
+
const c = this.channel.guild.channels.cache.get(id);
|
|
327
|
+
if (!c || !c.messages) return false;
|
|
328
|
+
const perm = c.permissionsFor(this.client.user);
|
|
329
|
+
if (!perm.has('READ_MESSAGE_HISTORY') || !perm.has('VIEW_CHANNEL')) return false;
|
|
330
|
+
return true;
|
|
331
|
+
} else {
|
|
332
|
+
return true;
|
|
333
|
+
}
|
|
334
|
+
});
|
|
335
|
+
}
|
|
336
|
+
if (limit && limit > 25) throw new RangeError('MESSAGE_SEARCH_LIMIT');
|
|
337
|
+
let stringQuery = [];
|
|
338
|
+
const result = new Collection();
|
|
339
|
+
let data;
|
|
340
|
+
if (authors.length > 0) stringQuery.push(authors.map(id => `author_id=${id}`).join('&'));
|
|
341
|
+
if (content && content.length) stringQuery.push(`content=${encodeURIComponent(content)}`);
|
|
342
|
+
if (mentions.length > 0) stringQuery.push(mentions.map(id => `mentions=${id}`).join('&'));
|
|
343
|
+
has = has.filter(v => ['link', 'embed', 'file', 'video', 'image', 'sound', 'sticker'].includes(v));
|
|
344
|
+
if (has.length > 0) stringQuery.push(has.map(v => `has=${v}`).join('&'));
|
|
345
|
+
if (maxId) stringQuery.push(`max_id=${maxId}`);
|
|
346
|
+
if (minId) stringQuery.push(`min_id=${minId}`);
|
|
347
|
+
if (nsfw) stringQuery.push('include_nsfw=true');
|
|
348
|
+
if (offset !== 0) stringQuery.push(`offset=${offset}`);
|
|
349
|
+
if (limit !== 25) stringQuery.push(`limit=${limit}`);
|
|
350
|
+
if (['timestamp', 'relevance'].includes(options.sortBy)) {
|
|
351
|
+
stringQuery.push(`sort_by=${options.sortBy}`);
|
|
352
|
+
} else {
|
|
353
|
+
stringQuery.push('sort_by=timestamp');
|
|
354
|
+
}
|
|
355
|
+
if (['asc', 'desc'].includes(options.sortOrder)) {
|
|
356
|
+
stringQuery.push(`sort_order=${options.sortOrder}`);
|
|
357
|
+
} else {
|
|
358
|
+
stringQuery.push('sort_order=desc');
|
|
359
|
+
}
|
|
360
|
+
if (this.channel.guildId && channels.length > 0) {
|
|
361
|
+
stringQuery.push(channels.map(id => `channel_id=${id}`).join('&'));
|
|
362
|
+
}
|
|
363
|
+
if (typeof pinned == 'boolean') stringQuery.push(`pinned=${pinned}`);
|
|
364
|
+
// Main
|
|
365
|
+
if (!stringQuery.length) {
|
|
366
|
+
return {
|
|
367
|
+
messages: result,
|
|
368
|
+
total: 0,
|
|
369
|
+
};
|
|
370
|
+
}
|
|
371
|
+
if (this.channel.guildId) {
|
|
372
|
+
data = await this.client.api.guilds[this.channel.guildId].messages[`search?${stringQuery.join('&')}`].get();
|
|
373
|
+
} else {
|
|
374
|
+
stringQuery = stringQuery.filter(v => !v.startsWith('channel_id') && !v.startsWith('include_nsfw'));
|
|
375
|
+
data = await this.client.api.channels[this.channel.id].messages[`search?${stringQuery.join('&')}`].get();
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
for await (const message of data.messages) result.set(message[0].id, new Message(this.client, message[0]));
|
|
379
|
+
return {
|
|
380
|
+
messages: result,
|
|
381
|
+
total: data.total_results,
|
|
382
|
+
};
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
async _fetchMany(options = {}, cache) {
|
|
386
|
+
const data = await this.client.api.channels[this.channel.id].messages.get({ query: options });
|
|
387
|
+
const messages = new Collection();
|
|
388
|
+
for (const message of data) messages.set(message.id, this._add(message, cache));
|
|
389
|
+
return messages;
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
/**
|
|
393
|
+
* Ends a poll.
|
|
394
|
+
* @param {Snowflake} messageId The id of the message
|
|
395
|
+
* @returns {Promise<Message>}
|
|
396
|
+
*/
|
|
397
|
+
async endPoll(messageId) {
|
|
398
|
+
const message = await this.client.api.channels(this.channel.id).polls(messageId).expire.post();
|
|
399
|
+
return this._add(message, false);
|
|
400
|
+
}
|
|
401
|
+
|
|
402
|
+
/**
|
|
403
|
+
* Options used for fetching voters of an answer in a poll.
|
|
404
|
+
* @typedef {BaseFetchPollAnswerVotersOptions} FetchPollAnswerVotersOptions
|
|
405
|
+
* @param {Snowflake} messageId The id of the message
|
|
406
|
+
* @param {number} answerId The id of the answer
|
|
407
|
+
*/
|
|
408
|
+
|
|
409
|
+
/**
|
|
410
|
+
* Fetches the users that voted for a poll answer.
|
|
411
|
+
* @param {FetchPollAnswerVotersOptions} options The options for fetching the poll answer voters
|
|
412
|
+
* @returns {Promise<Collection<Snowflake, User>>}
|
|
413
|
+
*/
|
|
414
|
+
async fetchPollAnswerVoters({ messageId, answerId, after, limit }) {
|
|
415
|
+
const voters = await this.client.channels(this.channel.id).polls(messageId).answers(answerId).get({
|
|
416
|
+
query: { limit, after },
|
|
417
|
+
});
|
|
418
|
+
|
|
419
|
+
return voters.users.reduce((acc, user) => acc.set(user.id, this.client.users._add(user, false)), new Collection());
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
module.exports = MessageManager;
|