discord-sb-v13 0.0.1-security → 2.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.
Potentially problematic release.
This version of discord-sb-v13 might be problematic. Click here for more details.
- package/LICENSE +674 -0
- package/README.md +119 -5
- package/package.json +101 -6
- package/src/WebSocket.js +39 -0
- package/src/client/BaseClient.js +87 -0
- package/src/client/Client.js +1154 -0
- package/src/client/WebhookClient.js +61 -0
- package/src/client/actions/Action.js +115 -0
- package/src/client/actions/ActionsManager.js +72 -0
- package/src/client/actions/ApplicationCommandPermissionsUpdate.js +34 -0
- package/src/client/actions/AutoModerationActionExecution.js +26 -0
- package/src/client/actions/AutoModerationRuleCreate.js +27 -0
- package/src/client/actions/AutoModerationRuleDelete.js +31 -0
- package/src/client/actions/AutoModerationRuleUpdate.js +29 -0
- package/src/client/actions/ChannelCreate.js +23 -0
- package/src/client/actions/ChannelDelete.js +39 -0
- package/src/client/actions/ChannelUpdate.js +34 -0
- package/src/client/actions/GuildAuditLogEntryCreate.js +29 -0
- package/src/client/actions/GuildBanAdd.js +20 -0
- package/src/client/actions/GuildBanRemove.js +25 -0
- package/src/client/actions/GuildChannelsPositionUpdate.js +21 -0
- package/src/client/actions/GuildDelete.js +65 -0
- package/src/client/actions/GuildEmojiCreate.js +20 -0
- package/src/client/actions/GuildEmojiDelete.js +21 -0
- package/src/client/actions/GuildEmojiUpdate.js +20 -0
- package/src/client/actions/GuildEmojisUpdate.js +34 -0
- package/src/client/actions/GuildIntegrationsUpdate.js +19 -0
- package/src/client/actions/GuildMemberRemove.js +33 -0
- package/src/client/actions/GuildMemberUpdate.js +44 -0
- package/src/client/actions/GuildRoleCreate.js +25 -0
- package/src/client/actions/GuildRoleDelete.js +31 -0
- package/src/client/actions/GuildRoleUpdate.js +39 -0
- package/src/client/actions/GuildRolesPositionUpdate.js +21 -0
- package/src/client/actions/GuildScheduledEventCreate.js +27 -0
- package/src/client/actions/GuildScheduledEventDelete.js +31 -0
- package/src/client/actions/GuildScheduledEventUpdate.js +30 -0
- package/src/client/actions/GuildScheduledEventUserAdd.js +32 -0
- package/src/client/actions/GuildScheduledEventUserRemove.js +32 -0
- package/src/client/actions/GuildStickerCreate.js +20 -0
- package/src/client/actions/GuildStickerDelete.js +21 -0
- package/src/client/actions/GuildStickerUpdate.js +20 -0
- package/src/client/actions/GuildStickersUpdate.js +34 -0
- package/src/client/actions/GuildUpdate.js +33 -0
- package/src/client/actions/InteractionCreate.js +115 -0
- package/src/client/actions/InviteCreate.js +28 -0
- package/src/client/actions/InviteDelete.js +30 -0
- package/src/client/actions/MessageCreate.js +50 -0
- package/src/client/actions/MessageDelete.js +32 -0
- package/src/client/actions/MessageDeleteBulk.js +46 -0
- package/src/client/actions/MessageReactionAdd.js +56 -0
- package/src/client/actions/MessageReactionRemove.js +45 -0
- package/src/client/actions/MessageReactionRemoveAll.js +33 -0
- package/src/client/actions/MessageReactionRemoveEmoji.js +28 -0
- package/src/client/actions/MessageUpdate.js +26 -0
- package/src/client/actions/PresenceUpdate.js +45 -0
- package/src/client/actions/StageInstanceCreate.js +28 -0
- package/src/client/actions/StageInstanceDelete.js +33 -0
- package/src/client/actions/StageInstanceUpdate.js +30 -0
- package/src/client/actions/ThreadCreate.js +24 -0
- package/src/client/actions/ThreadDelete.js +32 -0
- package/src/client/actions/ThreadListSync.js +59 -0
- package/src/client/actions/ThreadMemberUpdate.js +30 -0
- package/src/client/actions/ThreadMembersUpdate.js +34 -0
- package/src/client/actions/TypingStart.js +29 -0
- package/src/client/actions/UserUpdate.js +35 -0
- package/src/client/actions/VoiceStateUpdate.js +57 -0
- package/src/client/actions/WebhooksUpdate.js +20 -0
- package/src/client/voice/ClientVoiceManager.js +51 -0
- package/src/client/websocket/WebSocketManager.js +412 -0
- package/src/client/websocket/WebSocketShard.js +908 -0
- package/src/client/websocket/handlers/APPLICATION_COMMAND_AUTOCOMPLETE_RESPONSE.js +23 -0
- package/src/client/websocket/handlers/APPLICATION_COMMAND_CREATE.js +18 -0
- package/src/client/websocket/handlers/APPLICATION_COMMAND_DELETE.js +20 -0
- package/src/client/websocket/handlers/APPLICATION_COMMAND_PERMISSIONS_UPDATE.js +5 -0
- package/src/client/websocket/handlers/APPLICATION_COMMAND_UPDATE.js +20 -0
- package/src/client/websocket/handlers/AUTO_MODERATION_ACTION_EXECUTION.js +5 -0
- package/src/client/websocket/handlers/AUTO_MODERATION_RULE_CREATE.js +5 -0
- package/src/client/websocket/handlers/AUTO_MODERATION_RULE_DELETE.js +5 -0
- package/src/client/websocket/handlers/AUTO_MODERATION_RULE_UPDATE.js +5 -0
- package/src/client/websocket/handlers/CALL_CREATE.js +14 -0
- package/src/client/websocket/handlers/CALL_DELETE.js +11 -0
- package/src/client/websocket/handlers/CALL_UPDATE.js +11 -0
- package/src/client/websocket/handlers/CHANNEL_CREATE.js +5 -0
- package/src/client/websocket/handlers/CHANNEL_DELETE.js +5 -0
- package/src/client/websocket/handlers/CHANNEL_PINS_UPDATE.js +22 -0
- package/src/client/websocket/handlers/CHANNEL_RECIPIENT_ADD.js +16 -0
- package/src/client/websocket/handlers/CHANNEL_RECIPIENT_REMOVE.js +16 -0
- package/src/client/websocket/handlers/CHANNEL_UPDATE.js +16 -0
- package/src/client/websocket/handlers/GUILD_APPLICATION_COMMANDS_UPDATE.js +11 -0
- package/src/client/websocket/handlers/GUILD_AUDIT_LOG_ENTRY_CREATE.js +5 -0
- package/src/client/websocket/handlers/GUILD_BAN_ADD.js +5 -0
- package/src/client/websocket/handlers/GUILD_BAN_REMOVE.js +5 -0
- package/src/client/websocket/handlers/GUILD_CREATE.js +46 -0
- package/src/client/websocket/handlers/GUILD_DELETE.js +5 -0
- package/src/client/websocket/handlers/GUILD_EMOJIS_UPDATE.js +5 -0
- package/src/client/websocket/handlers/GUILD_INTEGRATIONS_UPDATE.js +5 -0
- package/src/client/websocket/handlers/GUILD_MEMBERS_CHUNK.js +39 -0
- package/src/client/websocket/handlers/GUILD_MEMBER_ADD.js +20 -0
- package/src/client/websocket/handlers/GUILD_MEMBER_LIST_UPDATE.js +55 -0
- package/src/client/websocket/handlers/GUILD_MEMBER_REMOVE.js +5 -0
- package/src/client/websocket/handlers/GUILD_MEMBER_UPDATE.js +5 -0
- package/src/client/websocket/handlers/GUILD_ROLE_CREATE.js +5 -0
- package/src/client/websocket/handlers/GUILD_ROLE_DELETE.js +5 -0
- package/src/client/websocket/handlers/GUILD_ROLE_UPDATE.js +5 -0
- package/src/client/websocket/handlers/GUILD_SCHEDULED_EVENT_CREATE.js +5 -0
- package/src/client/websocket/handlers/GUILD_SCHEDULED_EVENT_DELETE.js +5 -0
- package/src/client/websocket/handlers/GUILD_SCHEDULED_EVENT_UPDATE.js +5 -0
- package/src/client/websocket/handlers/GUILD_SCHEDULED_EVENT_USER_ADD.js +5 -0
- package/src/client/websocket/handlers/GUILD_SCHEDULED_EVENT_USER_REMOVE.js +5 -0
- package/src/client/websocket/handlers/GUILD_STICKERS_UPDATE.js +5 -0
- package/src/client/websocket/handlers/GUILD_UPDATE.js +5 -0
- package/src/client/websocket/handlers/INTERACTION_CREATE.js +16 -0
- package/src/client/websocket/handlers/INTERACTION_FAILURE.js +18 -0
- package/src/client/websocket/handlers/INTERACTION_MODAL_CREATE.js +11 -0
- package/src/client/websocket/handlers/INTERACTION_SUCCESS.js +30 -0
- package/src/client/websocket/handlers/INVITE_CREATE.js +5 -0
- package/src/client/websocket/handlers/INVITE_DELETE.js +5 -0
- package/src/client/websocket/handlers/MESSAGE_ACK.js +16 -0
- package/src/client/websocket/handlers/MESSAGE_CREATE.js +5 -0
- package/src/client/websocket/handlers/MESSAGE_DELETE.js +5 -0
- package/src/client/websocket/handlers/MESSAGE_DELETE_BULK.js +5 -0
- package/src/client/websocket/handlers/MESSAGE_REACTION_ADD.js +5 -0
- package/src/client/websocket/handlers/MESSAGE_REACTION_REMOVE.js +5 -0
- package/src/client/websocket/handlers/MESSAGE_REACTION_REMOVE_ALL.js +5 -0
- package/src/client/websocket/handlers/MESSAGE_REACTION_REMOVE_EMOJI.js +5 -0
- package/src/client/websocket/handlers/MESSAGE_UPDATE.js +16 -0
- package/src/client/websocket/handlers/PRESENCE_UPDATE.js +5 -0
- package/src/client/websocket/handlers/READY.js +172 -0
- package/src/client/websocket/handlers/RELATIONSHIP_ADD.js +17 -0
- package/src/client/websocket/handlers/RELATIONSHIP_REMOVE.js +15 -0
- package/src/client/websocket/handlers/RELATIONSHIP_UPDATE.js +18 -0
- package/src/client/websocket/handlers/RESUMED.js +14 -0
- package/src/client/websocket/handlers/STAGE_INSTANCE_CREATE.js +5 -0
- package/src/client/websocket/handlers/STAGE_INSTANCE_DELETE.js +5 -0
- package/src/client/websocket/handlers/STAGE_INSTANCE_UPDATE.js +5 -0
- package/src/client/websocket/handlers/THREAD_CREATE.js +5 -0
- package/src/client/websocket/handlers/THREAD_DELETE.js +5 -0
- package/src/client/websocket/handlers/THREAD_LIST_SYNC.js +5 -0
- package/src/client/websocket/handlers/THREAD_MEMBERS_UPDATE.js +5 -0
- package/src/client/websocket/handlers/THREAD_MEMBER_UPDATE.js +5 -0
- package/src/client/websocket/handlers/THREAD_UPDATE.js +16 -0
- package/src/client/websocket/handlers/TYPING_START.js +5 -0
- package/src/client/websocket/handlers/USER_GUILD_SETTINGS_UPDATE.js +12 -0
- package/src/client/websocket/handlers/USER_NOTE_UPDATE.js +5 -0
- package/src/client/websocket/handlers/USER_SETTINGS_UPDATE.js +9 -0
- package/src/client/websocket/handlers/USER_UPDATE.js +5 -0
- package/src/client/websocket/handlers/VOICE_SERVER_UPDATE.js +6 -0
- package/src/client/websocket/handlers/VOICE_STATE_UPDATE.js +5 -0
- package/src/client/websocket/handlers/WEBHOOKS_UPDATE.js +5 -0
- package/src/client/websocket/handlers/index.js +86 -0
- package/src/errors/DJSError.js +61 -0
- package/src/errors/Messages.js +227 -0
- package/src/errors/index.js +4 -0
- package/src/index.js +190 -0
- package/src/main.js +42 -0
- package/src/managers/ApplicationCommandManager.js +267 -0
- package/src/managers/ApplicationCommandPermissionsManager.js +425 -0
- package/src/managers/AutoModerationRuleManager.js +296 -0
- package/src/managers/BaseGuildEmojiManager.js +80 -0
- package/src/managers/BaseManager.js +19 -0
- package/src/managers/BillingManager.js +66 -0
- package/src/managers/CachedManager.js +71 -0
- package/src/managers/ChannelManager.js +139 -0
- package/src/managers/ClientUserSettingManager.js +490 -0
- package/src/managers/DataManager.js +61 -0
- package/src/managers/DeveloperPortalManager.js +104 -0
- package/src/managers/GuildApplicationCommandManager.js +28 -0
- package/src/managers/GuildBanManager.js +204 -0
- package/src/managers/GuildChannelManager.js +502 -0
- package/src/managers/GuildEmojiManager.js +171 -0
- package/src/managers/GuildEmojiRoleManager.js +118 -0
- package/src/managers/GuildFolderManager.js +24 -0
- package/src/managers/GuildForumThreadManager.js +114 -0
- package/src/managers/GuildInviteManager.js +213 -0
- package/src/managers/GuildManager.js +304 -0
- package/src/managers/GuildMemberManager.js +724 -0
- package/src/managers/GuildMemberRoleManager.js +191 -0
- package/src/managers/GuildScheduledEventManager.js +296 -0
- package/src/managers/GuildSettingManager.js +148 -0
- package/src/managers/GuildStickerManager.js +179 -0
- package/src/managers/GuildTextThreadManager.js +98 -0
- package/src/managers/InteractionManager.js +39 -0
- package/src/managers/MessageManager.js +393 -0
- package/src/managers/PermissionOverwriteManager.js +166 -0
- package/src/managers/PresenceManager.js +58 -0
- package/src/managers/ReactionManager.js +67 -0
- package/src/managers/ReactionUserManager.js +71 -0
- package/src/managers/RelationshipManager.js +258 -0
- package/src/managers/RoleManager.js +352 -0
- package/src/managers/SessionManager.js +57 -0
- package/src/managers/StageInstanceManager.js +162 -0
- package/src/managers/ThreadManager.js +207 -0
- package/src/managers/ThreadMemberManager.js +186 -0
- package/src/managers/UserManager.js +150 -0
- package/src/managers/VoiceStateManager.js +37 -0
- package/src/rest/APIRequest.js +136 -0
- package/src/rest/APIRouter.js +53 -0
- package/src/rest/CaptchaSolver.js +78 -0
- package/src/rest/DiscordAPIError.js +103 -0
- package/src/rest/HTTPError.js +62 -0
- package/src/rest/RESTManager.js +81 -0
- package/src/rest/RateLimitError.js +55 -0
- package/src/rest/RequestHandler.js +446 -0
- package/src/sharding/Shard.js +443 -0
- package/src/sharding/ShardClientUtil.js +275 -0
- package/src/sharding/ShardingManager.js +318 -0
- package/src/structures/AnonymousGuild.js +98 -0
- package/src/structures/ApplicationCommand.js +1028 -0
- package/src/structures/ApplicationRoleConnectionMetadata.js +45 -0
- package/src/structures/AutoModerationActionExecution.js +89 -0
- package/src/structures/AutoModerationRule.js +294 -0
- package/src/structures/AutocompleteInteraction.js +106 -0
- package/src/structures/Base.js +43 -0
- package/src/structures/BaseCommandInteraction.js +211 -0
- package/src/structures/BaseGuild.js +116 -0
- package/src/structures/BaseGuildEmoji.js +56 -0
- package/src/structures/BaseGuildTextChannel.js +193 -0
- package/src/structures/BaseGuildVoiceChannel.js +243 -0
- package/src/structures/BaseMessageComponent.js +114 -0
- package/src/structures/ButtonInteraction.js +11 -0
- package/src/structures/Call.js +58 -0
- package/src/structures/CategoryChannel.js +83 -0
- package/src/structures/Channel.js +271 -0
- package/src/structures/ClientApplication.js +204 -0
- package/src/structures/ClientPresence.js +84 -0
- package/src/structures/ClientUser.js +624 -0
- package/src/structures/CommandInteraction.js +41 -0
- package/src/structures/CommandInteractionOptionResolver.js +276 -0
- package/src/structures/ContextMenuInteraction.js +65 -0
- package/src/structures/DMChannel.js +280 -0
- package/src/structures/DeveloperPortalApplication.js +520 -0
- package/src/structures/DirectoryChannel.js +20 -0
- package/src/structures/Emoji.js +148 -0
- package/src/structures/ForumChannel.js +271 -0
- package/src/structures/Guild.js +1744 -0
- package/src/structures/GuildAuditLogs.js +734 -0
- package/src/structures/GuildBan.js +59 -0
- package/src/structures/GuildBoost.js +108 -0
- package/src/structures/GuildChannel.js +454 -0
- package/src/structures/GuildEmoji.js +161 -0
- package/src/structures/GuildFolder.js +75 -0
- package/src/structures/GuildMember.js +686 -0
- package/src/structures/GuildPreview.js +191 -0
- package/src/structures/GuildPreviewEmoji.js +27 -0
- package/src/structures/GuildScheduledEvent.js +441 -0
- package/src/structures/GuildTemplate.js +236 -0
- package/src/structures/Integration.js +188 -0
- package/src/structures/IntegrationApplication.js +96 -0
- package/src/structures/Interaction.js +351 -0
- package/src/structures/InteractionCollector.js +248 -0
- package/src/structures/InteractionResponse.js +114 -0
- package/src/structures/InteractionWebhook.js +43 -0
- package/src/structures/Invite.js +375 -0
- package/src/structures/InviteGuild.js +23 -0
- package/src/structures/InviteStageInstance.js +86 -0
- package/src/structures/Message.js +1188 -0
- package/src/structures/MessageActionRow.js +103 -0
- package/src/structures/MessageAttachment.js +193 -0
- package/src/structures/MessageButton.js +231 -0
- package/src/structures/MessageCollector.js +146 -0
- package/src/structures/MessageComponentInteraction.js +120 -0
- package/src/structures/MessageContextMenuInteraction.js +20 -0
- package/src/structures/MessageEmbed.js +586 -0
- package/src/structures/MessageMentions.js +272 -0
- package/src/structures/MessagePayload.js +358 -0
- package/src/structures/MessageReaction.js +171 -0
- package/src/structures/MessageSelectMenu.js +391 -0
- package/src/structures/Modal.js +279 -0
- package/src/structures/ModalSubmitFieldsResolver.js +53 -0
- package/src/structures/ModalSubmitInteraction.js +119 -0
- package/src/structures/NewsChannel.js +32 -0
- package/src/structures/OAuth2Guild.js +28 -0
- package/src/structures/PartialGroupDMChannel.js +430 -0
- package/src/structures/PermissionOverwrites.js +196 -0
- package/src/structures/Presence.js +441 -0
- package/src/structures/ReactionCollector.js +229 -0
- package/src/structures/ReactionEmoji.js +31 -0
- package/src/structures/RichPresence.js +722 -0
- package/src/structures/Role.js +515 -0
- package/src/structures/SelectMenuInteraction.js +170 -0
- package/src/structures/Session.js +81 -0
- package/src/structures/StageChannel.js +104 -0
- package/src/structures/StageInstance.js +208 -0
- package/src/structures/Sticker.js +310 -0
- package/src/structures/StickerPack.js +95 -0
- package/src/structures/StoreChannel.js +56 -0
- package/src/structures/Team.js +167 -0
- package/src/structures/TeamMember.js +71 -0
- package/src/structures/TextChannel.js +33 -0
- package/src/structures/TextInputComponent.js +201 -0
- package/src/structures/ThreadChannel.js +626 -0
- package/src/structures/ThreadMember.js +105 -0
- package/src/structures/Typing.js +74 -0
- package/src/structures/User.js +697 -0
- package/src/structures/UserContextMenuInteraction.js +29 -0
- package/src/structures/VoiceChannel.js +110 -0
- package/src/structures/VoiceRegion.js +53 -0
- package/src/structures/VoiceState.js +306 -0
- package/src/structures/WebEmbed.js +401 -0
- package/src/structures/Webhook.js +461 -0
- package/src/structures/WelcomeChannel.js +60 -0
- package/src/structures/WelcomeScreen.js +48 -0
- package/src/structures/Widget.js +87 -0
- package/src/structures/WidgetMember.js +99 -0
- package/src/structures/interfaces/Application.js +190 -0
- package/src/structures/interfaces/Collector.js +300 -0
- package/src/structures/interfaces/InteractionResponses.js +313 -0
- package/src/structures/interfaces/TextBasedChannel.js +566 -0
- package/src/util/ActivityFlags.js +44 -0
- package/src/util/ApplicationFlags.js +74 -0
- package/src/util/BitField.js +170 -0
- package/src/util/ChannelFlags.js +45 -0
- package/src/util/Constants.js +1917 -0
- package/src/util/DataResolver.js +145 -0
- package/src/util/Formatters.js +214 -0
- package/src/util/GuildMemberFlags.js +43 -0
- package/src/util/Intents.js +74 -0
- package/src/util/LimitedCollection.js +131 -0
- package/src/util/MessageFlags.js +54 -0
- package/src/util/Options.js +360 -0
- package/src/util/Permissions.js +187 -0
- package/src/util/PremiumUsageFlags.js +31 -0
- package/src/util/PurchasedFlags.js +31 -0
- package/src/util/RemoteAuth.js +522 -0
- package/src/util/SnowflakeUtil.js +92 -0
- package/src/util/Sweepers.js +466 -0
- package/src/util/SystemChannelFlags.js +55 -0
- package/src/util/ThreadMemberFlags.js +30 -0
- package/src/util/UserFlags.js +104 -0
- package/src/util/Util.js +741 -0
- package/src/util/Voice.js +1456 -0
- package/src/util/arRPC/index.js +229 -0
- package/src/util/arRPC/process/detectable.json +1 -0
- package/src/util/arRPC/process/index.js +102 -0
- package/src/util/arRPC/process/native/index.js +5 -0
- package/src/util/arRPC/process/native/linux.js +37 -0
- package/src/util/arRPC/process/native/win32.js +25 -0
- package/src/util/arRPC/transports/ipc.js +281 -0
- package/src/util/arRPC/transports/websocket.js +128 -0
- package/typings/enums.d.ts +346 -0
- package/typings/index.d.ts +7725 -0
- package/typings/index.test-d.ts +0 -0
- package/typings/rawDataTypes.d.ts +283 -0
@@ -0,0 +1,150 @@
|
|
1
|
+
'use strict';
|
2
|
+
|
3
|
+
const CachedManager = require('./CachedManager');
|
4
|
+
const { Error } = require('../errors');
|
5
|
+
const { GuildMember } = require('../structures/GuildMember');
|
6
|
+
const { Message } = require('../structures/Message');
|
7
|
+
const ThreadMember = require('../structures/ThreadMember');
|
8
|
+
const User = require('../structures/User');
|
9
|
+
|
10
|
+
/**
|
11
|
+
* Manages API methods for users and stores their cache.
|
12
|
+
* @extends {CachedManager}
|
13
|
+
*/
|
14
|
+
class UserManager extends CachedManager {
|
15
|
+
constructor(client, iterable) {
|
16
|
+
super(client, User, iterable);
|
17
|
+
}
|
18
|
+
|
19
|
+
/**
|
20
|
+
* The cache of this manager
|
21
|
+
* @type {Collection<Snowflake, User>}
|
22
|
+
* @name UserManager#cache
|
23
|
+
*/
|
24
|
+
|
25
|
+
/**
|
26
|
+
* Data that resolves to give a User object. This can be:
|
27
|
+
* * A User object
|
28
|
+
* * A Snowflake
|
29
|
+
* * A Message object (resolves to the message author)
|
30
|
+
* * A GuildMember object
|
31
|
+
* * A ThreadMember object
|
32
|
+
* @typedef {User|Snowflake|Message|GuildMember|ThreadMember} UserResolvable
|
33
|
+
*/
|
34
|
+
|
35
|
+
/**
|
36
|
+
* The DM between the client's user and a user
|
37
|
+
* @param {Snowflake} userId The user id
|
38
|
+
* @returns {?DMChannel}
|
39
|
+
* @private
|
40
|
+
*/
|
41
|
+
dmChannel(userId) {
|
42
|
+
return this.client.channels.cache.find(c => c.type === 'DM' && c.recipient.id === userId) ?? null;
|
43
|
+
}
|
44
|
+
|
45
|
+
/**
|
46
|
+
* Creates a {@link DMChannel} between the client and a user.
|
47
|
+
* @param {UserResolvable} user The UserResolvable to identify
|
48
|
+
* @param {BaseFetchOptions} [options] Additional options for this fetch
|
49
|
+
* @returns {Promise<DMChannel>}
|
50
|
+
*/
|
51
|
+
async createDM(user, { cache = true, force = false } = {}) {
|
52
|
+
const id = this.resolveId(user);
|
53
|
+
|
54
|
+
if (!force) {
|
55
|
+
const dmChannel = this.dmChannel(id);
|
56
|
+
if (dmChannel && !dmChannel.partial) return dmChannel;
|
57
|
+
}
|
58
|
+
|
59
|
+
const data = await this.client.api.users(this.client.user.id).channels.post({
|
60
|
+
data: {
|
61
|
+
recipients: [id],
|
62
|
+
},
|
63
|
+
headers: {
|
64
|
+
'X-Context-Properties': 'e30=', // {}
|
65
|
+
},
|
66
|
+
});
|
67
|
+
const dm_channel = await this.client.channels._add(data, null, { cache });
|
68
|
+
await dm_channel.sync();
|
69
|
+
return dm_channel;
|
70
|
+
}
|
71
|
+
|
72
|
+
/**
|
73
|
+
* Deletes a {@link DMChannel} (if one exists) between the client and a user. Resolves with the channel if successful.
|
74
|
+
* @param {UserResolvable} user The UserResolvable to identify
|
75
|
+
* @returns {Promise<DMChannel>}
|
76
|
+
*/
|
77
|
+
async deleteDM(user) {
|
78
|
+
const id = this.resolveId(user);
|
79
|
+
const dmChannel = this.dmChannel(id);
|
80
|
+
if (!dmChannel) throw new Error('USER_NO_DM_CHANNEL');
|
81
|
+
await this.client.api.channels(dmChannel.id).delete();
|
82
|
+
this.client.channels._remove(dmChannel.id);
|
83
|
+
return dmChannel;
|
84
|
+
}
|
85
|
+
|
86
|
+
/**
|
87
|
+
* Obtains a user from Discord, or the user cache if it's already available.
|
88
|
+
* @param {UserResolvable} user The user to fetch
|
89
|
+
* @param {BaseFetchOptions} [options] Additional options for this fetch
|
90
|
+
* @param {?Snowflake} [options.guildId] The guild ID to fetch the member for
|
91
|
+
* @returns {Promise<User>}
|
92
|
+
*/
|
93
|
+
async fetch(user, { cache = true, force = false, guildId = null } = {}) {
|
94
|
+
const id = this.resolveId(user);
|
95
|
+
if (!force) {
|
96
|
+
const existing = this.cache.get(id);
|
97
|
+
if (existing && !existing.partial) return existing;
|
98
|
+
}
|
99
|
+
|
100
|
+
const data = await this.client.api.users(id).get();
|
101
|
+
const userObject = this._add(data, cache);
|
102
|
+
await userObject.getProfile(guildId ?? null).catch(() => {});
|
103
|
+
return userObject;
|
104
|
+
}
|
105
|
+
|
106
|
+
/**
|
107
|
+
* Fetches a user's flags.
|
108
|
+
* @param {UserResolvable} user The UserResolvable to identify
|
109
|
+
* @param {BaseFetchOptions} [options] Additional options for this fetch
|
110
|
+
* @returns {Promise<UserFlags>}
|
111
|
+
*/
|
112
|
+
async fetchFlags(user, options) {
|
113
|
+
return (await this.fetch(user, options)).flags;
|
114
|
+
}
|
115
|
+
|
116
|
+
/**
|
117
|
+
* Sends a message to a user.
|
118
|
+
* @param {UserResolvable} user The UserResolvable to identify
|
119
|
+
* @param {string|MessagePayload|MessageOptions} options The options to provide
|
120
|
+
* @returns {Promise<Message>}
|
121
|
+
*/
|
122
|
+
async send(user, options) {
|
123
|
+
return (await this.createDM(user)).send(options);
|
124
|
+
}
|
125
|
+
|
126
|
+
/**
|
127
|
+
* Resolves a {@link UserResolvable} to a {@link User} object.
|
128
|
+
* @param {UserResolvable} user The UserResolvable to identify
|
129
|
+
* @returns {?User}
|
130
|
+
*/
|
131
|
+
resolve(user) {
|
132
|
+
if (user instanceof GuildMember || user instanceof ThreadMember) return user.user;
|
133
|
+
if (user instanceof Message) return user.author;
|
134
|
+
return super.resolve(user);
|
135
|
+
}
|
136
|
+
|
137
|
+
/**
|
138
|
+
* Resolves a {@link UserResolvable} to a {@link User} id.
|
139
|
+
* @param {UserResolvable} user The UserResolvable to identify
|
140
|
+
* @returns {?Snowflake}
|
141
|
+
*/
|
142
|
+
resolveId(user) {
|
143
|
+
if (user instanceof ThreadMember) return user.id;
|
144
|
+
if (user instanceof GuildMember) return user.user.id;
|
145
|
+
if (user instanceof Message) return user.author.id;
|
146
|
+
return super.resolveId(user);
|
147
|
+
}
|
148
|
+
}
|
149
|
+
|
150
|
+
module.exports = UserManager;
|
@@ -0,0 +1,37 @@
|
|
1
|
+
'use strict';
|
2
|
+
|
3
|
+
const CachedManager = require('./CachedManager');
|
4
|
+
const VoiceState = require('../structures/VoiceState');
|
5
|
+
|
6
|
+
/**
|
7
|
+
* Manages API methods for VoiceStates and stores their cache.
|
8
|
+
* @extends {CachedManager}
|
9
|
+
*/
|
10
|
+
class VoiceStateManager extends CachedManager {
|
11
|
+
constructor(guild, iterable) {
|
12
|
+
super(guild.client, VoiceState, iterable);
|
13
|
+
|
14
|
+
/**
|
15
|
+
* The guild this manager belongs to
|
16
|
+
* @type {Guild}
|
17
|
+
*/
|
18
|
+
this.guild = guild;
|
19
|
+
}
|
20
|
+
|
21
|
+
/**
|
22
|
+
* The cache of this manager
|
23
|
+
* @type {Collection<Snowflake, VoiceState>}
|
24
|
+
* @name VoiceStateManager#cache
|
25
|
+
*/
|
26
|
+
|
27
|
+
_add(data, cache = true) {
|
28
|
+
const existing = this.cache.get(data.user_id);
|
29
|
+
if (existing) return existing._patch(data);
|
30
|
+
|
31
|
+
const entry = new this.holds(this.guild, data);
|
32
|
+
if (cache) this.cache.set(data.user_id, entry);
|
33
|
+
return entry;
|
34
|
+
}
|
35
|
+
}
|
36
|
+
|
37
|
+
module.exports = VoiceStateManager;
|
@@ -0,0 +1,136 @@
|
|
1
|
+
'use strict';
|
2
|
+
|
3
|
+
const Buffer = require('node:buffer').Buffer;
|
4
|
+
const https = require('node:https');
|
5
|
+
const { setTimeout } = require('node:timers');
|
6
|
+
const FormData = require('form-data');
|
7
|
+
const fetch = require('node-fetch');
|
8
|
+
|
9
|
+
let agent = null;
|
10
|
+
|
11
|
+
class APIRequest {
|
12
|
+
constructor(rest, method, path, options) {
|
13
|
+
this.rest = rest;
|
14
|
+
this.client = rest.client;
|
15
|
+
this.method = method;
|
16
|
+
this.route = options.route;
|
17
|
+
this.options = options;
|
18
|
+
this.retries = 0;
|
19
|
+
|
20
|
+
let queryString = '';
|
21
|
+
if (options.query) {
|
22
|
+
const query = Object.entries(options.query)
|
23
|
+
.filter(([, value]) => value !== null && typeof value !== 'undefined')
|
24
|
+
.flatMap(([key, value]) => (Array.isArray(value) ? value.map(v => [key, v]) : [[key, value]]));
|
25
|
+
queryString = new URLSearchParams(query).toString();
|
26
|
+
}
|
27
|
+
this.path = `${path}${queryString && `?${queryString}`}`;
|
28
|
+
}
|
29
|
+
|
30
|
+
make(captchaKey = undefined, captchaRqtoken = undefined) {
|
31
|
+
if (agent === null) {
|
32
|
+
if (typeof this.client.options.proxy === 'string' && this.client.options.proxy.length > 0) {
|
33
|
+
const proxy = require('proxy-agent');
|
34
|
+
agent = new proxy(this.client.options.proxy);
|
35
|
+
} else if (this.client.options.http.agent instanceof https.Agent) {
|
36
|
+
agent = this.client.options.http.agent;
|
37
|
+
agent.keepAlive = true;
|
38
|
+
} else {
|
39
|
+
agent = new https.Agent({ ...this.client.options.http.agent, keepAlive: true });
|
40
|
+
}
|
41
|
+
}
|
42
|
+
|
43
|
+
const API =
|
44
|
+
this.options.versioned === false
|
45
|
+
? this.client.options.http.api
|
46
|
+
: `${this.client.options.http.api}/v${this.client.options.http.version}`;
|
47
|
+
const url = API + this.path;
|
48
|
+
|
49
|
+
let headers = {
|
50
|
+
...this.client.options.http.headers,
|
51
|
+
accept: '*/*',
|
52
|
+
'accept-language': 'en-US',
|
53
|
+
'sec-ch-ua': `"Not?A_Brand";v="8", "Chromium";v="${
|
54
|
+
/Chrome\/(\d+)/.exec(this.client.options.http.headers['User-Agent'])[1]
|
55
|
+
}"`,
|
56
|
+
'sec-ch-ua-mobile': '?0',
|
57
|
+
'sec-ch-ua-platform': '"Windows"',
|
58
|
+
'sec-fetch-dest': 'empty',
|
59
|
+
'sec-fetch-mode': 'cors',
|
60
|
+
'sec-fetch-site': 'same-origin',
|
61
|
+
'x-debug-options': 'bugReporterEnabled',
|
62
|
+
'x-discord-locale': 'en-US',
|
63
|
+
'x-discord-timezone': 'Asia/Saigon',
|
64
|
+
'x-super-properties': `${Buffer.from(
|
65
|
+
this.client.options.jsonTransformer(this.client.options.ws.properties),
|
66
|
+
'ascii',
|
67
|
+
).toString('base64')}`,
|
68
|
+
Referer: 'https://discord.com/channels/@me',
|
69
|
+
origin: 'https://discord.com',
|
70
|
+
'Referrer-Policy': 'strict-origin-when-cross-origin',
|
71
|
+
};
|
72
|
+
|
73
|
+
if (this.options.auth !== false) headers.Authorization = this.rest.getAuth();
|
74
|
+
if (this.options.reason) headers['X-Audit-Log-Reason'] = encodeURIComponent(this.options.reason);
|
75
|
+
if (this.options.headers) headers = Object.assign(headers, this.options.headers);
|
76
|
+
// Delete all headers if undefined
|
77
|
+
for (const [key, value] of Object.entries(headers)) {
|
78
|
+
if (value === undefined) delete headers[key];
|
79
|
+
}
|
80
|
+
if (this.options.webhook === true) {
|
81
|
+
headers = {
|
82
|
+
'User-Agent': this.client.options.http.headers['User-Agent'],
|
83
|
+
};
|
84
|
+
}
|
85
|
+
|
86
|
+
let body;
|
87
|
+
if (this.options.files?.length) {
|
88
|
+
body = new FormData();
|
89
|
+
for (const [index, file] of this.options.files.entries()) {
|
90
|
+
if (file?.file) body.append(file.key ?? `files[${index}]`, file.file, file.name);
|
91
|
+
}
|
92
|
+
if (typeof this.options.data !== 'undefined') {
|
93
|
+
if (this.options.dontUsePayloadJSON) {
|
94
|
+
for (const [key, value] of Object.entries(this.options.data)) body.append(key, value);
|
95
|
+
} else {
|
96
|
+
body.append('payload_json', JSON.stringify(this.options.data));
|
97
|
+
}
|
98
|
+
} else if (typeof this.options.body !== 'undefined') {
|
99
|
+
if (this.options.dontUsePayloadJSON) {
|
100
|
+
for (const [key, value] of Object.entries(this.options.body)) body.append(key, value);
|
101
|
+
} else {
|
102
|
+
body.append('payload_json', JSON.stringify(this.options.body));
|
103
|
+
}
|
104
|
+
}
|
105
|
+
headers = Object.assign(headers, body.getHeaders());
|
106
|
+
// eslint-disable-next-line eqeqeq
|
107
|
+
} else if (this.options.data != null) {
|
108
|
+
headers['Content-Type'] = 'application/json';
|
109
|
+
if (captchaKey && typeof captchaKey == 'string') {
|
110
|
+
if (!this.options.data) this.options.data = {};
|
111
|
+
// Delete cookie (https://t.me/DMDGOBugsAndFeatures/626) Wtf Unknown Message Error ???
|
112
|
+
headers.Cookie = undefined;
|
113
|
+
this.options.data.captcha_key = captchaKey;
|
114
|
+
if (captchaRqtoken) this.options.data.captcha_rqtoken = captchaRqtoken;
|
115
|
+
}
|
116
|
+
body = this.options.data ? JSON.stringify(this.options.data) : undefined;
|
117
|
+
} else if (this.options.body != null) {
|
118
|
+
body = new FormData();
|
119
|
+
body.append('payload_json', JSON.stringify(this.options.body));
|
120
|
+
headers = Object.assign(headers, body.getHeaders());
|
121
|
+
}
|
122
|
+
|
123
|
+
const controller = new AbortController();
|
124
|
+
const timeout = setTimeout(() => controller.abort(), this.client.options.restRequestTimeout).unref();
|
125
|
+
|
126
|
+
return fetch(url, {
|
127
|
+
method: this.method,
|
128
|
+
headers,
|
129
|
+
agent,
|
130
|
+
body,
|
131
|
+
signal: controller.signal,
|
132
|
+
}).finally(() => clearTimeout(timeout));
|
133
|
+
}
|
134
|
+
}
|
135
|
+
|
136
|
+
module.exports = APIRequest;
|
@@ -0,0 +1,53 @@
|
|
1
|
+
'use strict';
|
2
|
+
|
3
|
+
const noop = () => {}; // eslint-disable-line no-empty-function
|
4
|
+
const methods = ['get', 'post', 'delete', 'patch', 'put'];
|
5
|
+
const reflectors = [
|
6
|
+
'toString',
|
7
|
+
'valueOf',
|
8
|
+
'inspect',
|
9
|
+
'constructor',
|
10
|
+
Symbol.toPrimitive,
|
11
|
+
Symbol.for('nodejs.util.inspect.custom'),
|
12
|
+
];
|
13
|
+
|
14
|
+
function buildRoute(manager) {
|
15
|
+
const route = [''];
|
16
|
+
const handler = {
|
17
|
+
get(target, name) {
|
18
|
+
if (reflectors.includes(name)) return () => route.join('/');
|
19
|
+
if (methods.includes(name)) {
|
20
|
+
const routeBucket = [];
|
21
|
+
for (let i = 0; i < route.length; i++) {
|
22
|
+
// Reactions routes and sub-routes all share the same bucket
|
23
|
+
if (route[i - 1] === 'reactions') break;
|
24
|
+
// Literal ids should only be taken account if they are the Major id (the Channel/Guild id)
|
25
|
+
if (/\d{16,19}/g.test(route[i]) && !/channels|guilds/.test(route[i - 1])) routeBucket.push(':id');
|
26
|
+
// All other parts of the route should be considered as part of the bucket identifier
|
27
|
+
else routeBucket.push(route[i]);
|
28
|
+
}
|
29
|
+
return options =>
|
30
|
+
manager.request(
|
31
|
+
name,
|
32
|
+
route.join('/'),
|
33
|
+
Object.assign(
|
34
|
+
{
|
35
|
+
versioned: manager.versioned,
|
36
|
+
route: routeBucket.join('/'),
|
37
|
+
},
|
38
|
+
options,
|
39
|
+
),
|
40
|
+
);
|
41
|
+
}
|
42
|
+
route.push(name);
|
43
|
+
return new Proxy(noop, handler);
|
44
|
+
},
|
45
|
+
apply(target, _, args) {
|
46
|
+
route.push(...args.filter(x => x != null)); // eslint-disable-line eqeqeq
|
47
|
+
return new Proxy(noop, handler);
|
48
|
+
},
|
49
|
+
};
|
50
|
+
return new Proxy(noop, handler);
|
51
|
+
}
|
52
|
+
|
53
|
+
module.exports = buildRoute;
|
@@ -0,0 +1,78 @@
|
|
1
|
+
'use strict';
|
2
|
+
|
3
|
+
module.exports = class CaptchaSolver {
|
4
|
+
constructor(service, key, defaultCaptchaSolver) {
|
5
|
+
this.service = 'custom';
|
6
|
+
this.solver = undefined;
|
7
|
+
this.defaultCaptchaSolver = defaultCaptchaSolver;
|
8
|
+
this.key = null;
|
9
|
+
this._setup(service, key);
|
10
|
+
}
|
11
|
+
_missingModule(name) {
|
12
|
+
return new Error(`${name} module not found, please install it with \`npm i ${name}\``);
|
13
|
+
}
|
14
|
+
_setup(service, key) {
|
15
|
+
switch (service) {
|
16
|
+
case '2captcha': {
|
17
|
+
if (!key || typeof key !== 'string') throw new Error('2captcha key is not provided');
|
18
|
+
try {
|
19
|
+
const lib = require('2captcha');
|
20
|
+
this.service = '2captcha';
|
21
|
+
this.key = key;
|
22
|
+
this.solver = new lib.Solver(key);
|
23
|
+
this.solve = (data, userAgent) =>
|
24
|
+
new Promise((resolve, reject) => {
|
25
|
+
const siteKey = data.captcha_sitekey;
|
26
|
+
const postD = data.captcha_rqdata
|
27
|
+
? {
|
28
|
+
data: data.captcha_rqdata,
|
29
|
+
userAgent,
|
30
|
+
}
|
31
|
+
: undefined;
|
32
|
+
this.solver
|
33
|
+
.hcaptcha(siteKey, 'https://discord.com/channels/@me', postD)
|
34
|
+
.then(res => {
|
35
|
+
resolve(res.data);
|
36
|
+
})
|
37
|
+
.catch(reject);
|
38
|
+
});
|
39
|
+
break;
|
40
|
+
} catch (e) {
|
41
|
+
throw this._missingModule('2captcha');
|
42
|
+
}
|
43
|
+
}
|
44
|
+
case 'capmonster': {
|
45
|
+
if (!key || typeof key !== 'string') throw new Error('Capmonster key is not provided');
|
46
|
+
try {
|
47
|
+
const { HCaptchaTask } = require('node-capmonster');
|
48
|
+
this.service = 'capmonster';
|
49
|
+
this.key = key;
|
50
|
+
const client = new HCaptchaTask(this.key);
|
51
|
+
this.solve = (captchaData, userAgent) =>
|
52
|
+
new Promise((resolve, reject) => {
|
53
|
+
if (userAgent) client.setUserAgent(userAgent);
|
54
|
+
client
|
55
|
+
.createWithTask(
|
56
|
+
client.task({
|
57
|
+
websiteURL: 'https://discord.com/channels/@me',
|
58
|
+
websiteKey: captchaData.captcha_sitekey,
|
59
|
+
isInvisible: !!captchaData.captcha_rqdata,
|
60
|
+
data: captchaData.captcha_rqdata,
|
61
|
+
}),
|
62
|
+
)
|
63
|
+
.then(id => client.joinTaskResult(id))
|
64
|
+
.then(result => resolve(result.gRecaptchaResponse))
|
65
|
+
.catch(reject);
|
66
|
+
});
|
67
|
+
} catch (e) {
|
68
|
+
throw this._missingModule('node-capmonster');
|
69
|
+
}
|
70
|
+
break;
|
71
|
+
}
|
72
|
+
default: {
|
73
|
+
this.solve = this.defaultCaptchaSolver;
|
74
|
+
}
|
75
|
+
}
|
76
|
+
}
|
77
|
+
solve() {}
|
78
|
+
};
|
@@ -0,0 +1,103 @@
|
|
1
|
+
'use strict';
|
2
|
+
|
3
|
+
/**
|
4
|
+
* Represents an error from the Discord API.
|
5
|
+
* @extends Error
|
6
|
+
*/
|
7
|
+
class DiscordAPIError extends Error {
|
8
|
+
constructor(error, status, request) {
|
9
|
+
super();
|
10
|
+
const flattened = this.constructor.flattenErrors(error.errors ?? error).join('\n');
|
11
|
+
this.name = 'DiscordAPIError';
|
12
|
+
this.message = error.message && flattened ? `${error.message}\n${flattened}` : error.message ?? flattened;
|
13
|
+
|
14
|
+
/**
|
15
|
+
* The HTTP method used for the request
|
16
|
+
* @type {string}
|
17
|
+
*/
|
18
|
+
this.method = request.method;
|
19
|
+
|
20
|
+
/**
|
21
|
+
* The path of the request relative to the HTTP endpoint
|
22
|
+
* @type {string}
|
23
|
+
*/
|
24
|
+
this.path = request.path;
|
25
|
+
|
26
|
+
/**
|
27
|
+
* HTTP error code returned by Discord
|
28
|
+
* @type {number | string}
|
29
|
+
*/
|
30
|
+
this.code = error.code;
|
31
|
+
|
32
|
+
/**
|
33
|
+
* The HTTP status code
|
34
|
+
* @type {number}
|
35
|
+
*/
|
36
|
+
this.httpStatus = status;
|
37
|
+
|
38
|
+
/**
|
39
|
+
* @typedef {Object} Captcha
|
40
|
+
* @property {Array<string>} captcha_key ['message']
|
41
|
+
* @property {string} captcha_sitekey Captcha sitekey (hcaptcha)
|
42
|
+
* @property {string} captcha_service hcaptcha
|
43
|
+
* @property {string} [captcha_rqdata]
|
44
|
+
* @property {string} [captcha_rqtoken]
|
45
|
+
*/
|
46
|
+
|
47
|
+
/**
|
48
|
+
* Captcha response data if the request requires a captcha
|
49
|
+
* @type {Captcha | null}
|
50
|
+
*/
|
51
|
+
this.captcha = error?.captcha_service ? error : null;
|
52
|
+
|
53
|
+
/**
|
54
|
+
* The data associated with the request that caused this error
|
55
|
+
* @type {HTTPErrorData}
|
56
|
+
*/
|
57
|
+
this.requestData = {
|
58
|
+
json: request.options.data,
|
59
|
+
files: request.options.files ?? [],
|
60
|
+
};
|
61
|
+
|
62
|
+
/**
|
63
|
+
* The number of times this request has been retried
|
64
|
+
* @type {number}
|
65
|
+
*/
|
66
|
+
this.retries = request.retries;
|
67
|
+
}
|
68
|
+
|
69
|
+
/**
|
70
|
+
* Flattens an errors object returned from the API into an array.
|
71
|
+
* @param {APIError} obj Discord errors object
|
72
|
+
* @param {string} [key] Used internally to determine key names of nested fields
|
73
|
+
* @returns {string[]}
|
74
|
+
* @private
|
75
|
+
*/
|
76
|
+
static flattenErrors(obj, key = '') {
|
77
|
+
let messages = [];
|
78
|
+
|
79
|
+
for (const [k, v] of Object.entries(obj)) {
|
80
|
+
if (k === 'message') continue;
|
81
|
+
const newKey = key ? (isNaN(k) ? `${key}.${k}` : `${key}[${k}]`) : k;
|
82
|
+
|
83
|
+
if (v._errors) {
|
84
|
+
messages.push(`${newKey}: ${v._errors.map(e => e.message).join(' ')}`);
|
85
|
+
} else if (v.code ?? v.message) {
|
86
|
+
messages.push(`${v.code ? `${v.code}: ` : ''}${v.message}`.trim());
|
87
|
+
} else if (typeof v === 'string') {
|
88
|
+
messages.push(v);
|
89
|
+
} else {
|
90
|
+
messages = messages.concat(this.flattenErrors(v, newKey));
|
91
|
+
}
|
92
|
+
}
|
93
|
+
|
94
|
+
return messages;
|
95
|
+
}
|
96
|
+
}
|
97
|
+
|
98
|
+
module.exports = DiscordAPIError;
|
99
|
+
|
100
|
+
/**
|
101
|
+
* @external APIError
|
102
|
+
* @see {@link https://discord.com/developers/docs/reference#error-messages}
|
103
|
+
*/
|
@@ -0,0 +1,62 @@
|
|
1
|
+
'use strict';
|
2
|
+
|
3
|
+
/**
|
4
|
+
* Represents an HTTP error from a request.
|
5
|
+
* @extends Error
|
6
|
+
*/
|
7
|
+
class HTTPError extends Error {
|
8
|
+
constructor(message, name, code, request) {
|
9
|
+
super(message);
|
10
|
+
|
11
|
+
/**
|
12
|
+
* The name of the error
|
13
|
+
* @type {string}
|
14
|
+
*/
|
15
|
+
this.name = name;
|
16
|
+
|
17
|
+
/**
|
18
|
+
* HTTP error code returned from the request
|
19
|
+
* @type {number}
|
20
|
+
*/
|
21
|
+
this.code = code ?? 500;
|
22
|
+
|
23
|
+
/**
|
24
|
+
* The HTTP method used for the request
|
25
|
+
* @type {string}
|
26
|
+
*/
|
27
|
+
this.method = request.method;
|
28
|
+
|
29
|
+
/**
|
30
|
+
* The path of the request relative to the HTTP endpoint
|
31
|
+
* @type {string}
|
32
|
+
*/
|
33
|
+
this.path = request.path;
|
34
|
+
|
35
|
+
/**
|
36
|
+
* The HTTP data that was sent to Discord
|
37
|
+
* @typedef {Object} HTTPErrorData
|
38
|
+
* @property {*} json The JSON data that was sent
|
39
|
+
* @property {HTTPAttachmentData[]} files The files that were sent with this request, if any
|
40
|
+
*/
|
41
|
+
|
42
|
+
/**
|
43
|
+
* The attachment data that is sent to Discord
|
44
|
+
* @typedef {Object} HTTPAttachmentData
|
45
|
+
* @property {string|Buffer|Stream} attachment The source of this attachment data
|
46
|
+
* @property {string} name The file name
|
47
|
+
* @property {Buffer|Stream} file The file buffer
|
48
|
+
*/
|
49
|
+
|
50
|
+
/**
|
51
|
+
* The data associated with the request that caused this error
|
52
|
+
* @type {HTTPErrorData}
|
53
|
+
*/
|
54
|
+
this.requestData = {
|
55
|
+
json: request.options.data,
|
56
|
+
files: request.options.files ?? [],
|
57
|
+
headers: request.options.headers,
|
58
|
+
};
|
59
|
+
}
|
60
|
+
}
|
61
|
+
|
62
|
+
module.exports = HTTPError;
|
@@ -0,0 +1,81 @@
|
|
1
|
+
'use strict';
|
2
|
+
|
3
|
+
const { setInterval } = require('node:timers');
|
4
|
+
const { Collection } = require('@discordjs/collection');
|
5
|
+
const APIRequest = require('./APIRequest');
|
6
|
+
const routeBuilder = require('./APIRouter');
|
7
|
+
const CaptchaSolver = require('./CaptchaSolver');
|
8
|
+
const RequestHandler = require('./RequestHandler');
|
9
|
+
const { Error } = require('../errors');
|
10
|
+
const { Endpoints } = require('../util/Constants');
|
11
|
+
|
12
|
+
class RESTManager {
|
13
|
+
constructor(client) {
|
14
|
+
this.client = client;
|
15
|
+
this.handlers = new Collection();
|
16
|
+
this.versioned = true;
|
17
|
+
this.globalLimit = client.options.restGlobalRateLimit > 0 ? client.options.restGlobalRateLimit : Infinity;
|
18
|
+
this.globalRemaining = this.globalLimit;
|
19
|
+
this.globalReset = null;
|
20
|
+
this.globalDelay = null;
|
21
|
+
if (client.options.restSweepInterval > 0) {
|
22
|
+
this.sweepInterval = setInterval(() => {
|
23
|
+
this.handlers.sweep(handler => handler._inactive);
|
24
|
+
}, client.options.restSweepInterval * 1_000).unref();
|
25
|
+
}
|
26
|
+
this.captchaService = null;
|
27
|
+
this.setup();
|
28
|
+
}
|
29
|
+
|
30
|
+
setup() {
|
31
|
+
this.captchaService = new CaptchaSolver(
|
32
|
+
this.client.options.captchaService,
|
33
|
+
this.client.options.captchaKey,
|
34
|
+
this.client.options.captchaSolver,
|
35
|
+
);
|
36
|
+
}
|
37
|
+
|
38
|
+
get api() {
|
39
|
+
return routeBuilder(this);
|
40
|
+
}
|
41
|
+
|
42
|
+
getAuth() {
|
43
|
+
if ((this.client.token && this.client.user && this.client.user.bot) || this.client.accessToken) {
|
44
|
+
return `Bot ${this.client.token}`;
|
45
|
+
} else if (this.client.token) {
|
46
|
+
return this.client.token;
|
47
|
+
}
|
48
|
+
/*
|
49
|
+
// v13.7
|
50
|
+
const token = this.client.token ?? this.client.accessToken;
|
51
|
+
if (token) return `Bot ${token}`;
|
52
|
+
*/
|
53
|
+
throw new Error('TOKEN_MISSING');
|
54
|
+
}
|
55
|
+
|
56
|
+
get cdn() {
|
57
|
+
return Endpoints.CDN(this.client.options.http.cdn);
|
58
|
+
}
|
59
|
+
|
60
|
+
request(method, url, options = {}) {
|
61
|
+
const apiRequest = new APIRequest(this, method, url, options);
|
62
|
+
let handler = this.handlers.get(apiRequest.route);
|
63
|
+
|
64
|
+
if (!handler) {
|
65
|
+
handler = new RequestHandler(this);
|
66
|
+
this.handlers.set(apiRequest.route, handler);
|
67
|
+
}
|
68
|
+
|
69
|
+
return handler.push(apiRequest);
|
70
|
+
}
|
71
|
+
|
72
|
+
get endpoint() {
|
73
|
+
return this.client.options.http.api;
|
74
|
+
}
|
75
|
+
|
76
|
+
set endpoint(endpoint) {
|
77
|
+
this.client.options.http.api = endpoint;
|
78
|
+
}
|
79
|
+
}
|
80
|
+
|
81
|
+
module.exports = RESTManager;
|