discord-sb.js 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +674 -0
- package/README.md +2 -0
- package/package.json +91 -0
- package/src/WebSocket.js +39 -0
- package/src/client/BaseClient.js +86 -0
- package/src/client/Client.js +978 -0
- package/src/client/WebhookClient.js +61 -0
- package/src/client/actions/Action.js +116 -0
- package/src/client/actions/ActionsManager.js +80 -0
- package/src/client/actions/ApplicationCommandPermissionsUpdate.js +34 -0
- package/src/client/actions/AutoModerationActionExecution.js +27 -0
- package/src/client/actions/AutoModerationRuleCreate.js +28 -0
- package/src/client/actions/AutoModerationRuleDelete.js +32 -0
- package/src/client/actions/AutoModerationRuleUpdate.js +30 -0
- package/src/client/actions/ChannelCreate.js +23 -0
- package/src/client/actions/ChannelDelete.js +39 -0
- package/src/client/actions/ChannelUpdate.js +43 -0
- package/src/client/actions/GuildAuditLogEntryCreate.js +29 -0
- package/src/client/actions/GuildBanAdd.js +20 -0
- package/src/client/actions/GuildBanRemove.js +25 -0
- package/src/client/actions/GuildChannelsPositionUpdate.js +21 -0
- package/src/client/actions/GuildDelete.js +65 -0
- package/src/client/actions/GuildEmojiCreate.js +20 -0
- package/src/client/actions/GuildEmojiDelete.js +21 -0
- package/src/client/actions/GuildEmojiUpdate.js +20 -0
- package/src/client/actions/GuildEmojisUpdate.js +34 -0
- package/src/client/actions/GuildIntegrationsUpdate.js +19 -0
- package/src/client/actions/GuildMemberRemove.js +33 -0
- package/src/client/actions/GuildMemberUpdate.js +44 -0
- package/src/client/actions/GuildRoleCreate.js +25 -0
- package/src/client/actions/GuildRoleDelete.js +31 -0
- package/src/client/actions/GuildRoleUpdate.js +39 -0
- package/src/client/actions/GuildRolesPositionUpdate.js +21 -0
- package/src/client/actions/GuildScheduledEventCreate.js +27 -0
- package/src/client/actions/GuildScheduledEventDelete.js +31 -0
- package/src/client/actions/GuildScheduledEventUpdate.js +30 -0
- package/src/client/actions/GuildScheduledEventUserAdd.js +32 -0
- package/src/client/actions/GuildScheduledEventUserRemove.js +32 -0
- package/src/client/actions/GuildStickerCreate.js +20 -0
- package/src/client/actions/GuildStickerDelete.js +21 -0
- package/src/client/actions/GuildStickerUpdate.js +20 -0
- package/src/client/actions/GuildStickersUpdate.js +34 -0
- package/src/client/actions/GuildUpdate.js +33 -0
- package/src/client/actions/InviteCreate.js +28 -0
- package/src/client/actions/InviteDelete.js +30 -0
- package/src/client/actions/MessageCreate.js +50 -0
- package/src/client/actions/MessageDelete.js +32 -0
- package/src/client/actions/MessageDeleteBulk.js +46 -0
- package/src/client/actions/MessagePollVoteAdd.js +33 -0
- package/src/client/actions/MessagePollVoteRemove.js +33 -0
- package/src/client/actions/MessageReactionAdd.js +68 -0
- package/src/client/actions/MessageReactionRemove.js +50 -0
- package/src/client/actions/MessageReactionRemoveAll.js +33 -0
- package/src/client/actions/MessageReactionRemoveEmoji.js +28 -0
- package/src/client/actions/MessageUpdate.js +26 -0
- package/src/client/actions/PresenceUpdate.js +50 -0
- package/src/client/actions/StageInstanceCreate.js +28 -0
- package/src/client/actions/StageInstanceDelete.js +33 -0
- package/src/client/actions/StageInstanceUpdate.js +30 -0
- package/src/client/actions/ThreadCreate.js +24 -0
- package/src/client/actions/ThreadDelete.js +32 -0
- package/src/client/actions/ThreadListSync.js +59 -0
- package/src/client/actions/ThreadMemberUpdate.js +30 -0
- package/src/client/actions/ThreadMembersUpdate.js +34 -0
- package/src/client/actions/TypingStart.js +29 -0
- package/src/client/actions/UserUpdate.js +35 -0
- package/src/client/actions/VoiceStateUpdate.js +50 -0
- package/src/client/actions/WebhooksUpdate.js +20 -0
- package/src/client/voice/ClientVoiceManager.js +151 -0
- package/src/client/voice/VoiceConnection.js +1249 -0
- package/src/client/voice/dispatcher/AnnexBDispatcher.js +120 -0
- package/src/client/voice/dispatcher/AudioDispatcher.js +145 -0
- package/src/client/voice/dispatcher/BaseDispatcher.js +459 -0
- package/src/client/voice/dispatcher/VPxDispatcher.js +54 -0
- package/src/client/voice/dispatcher/VideoDispatcher.js +68 -0
- package/src/client/voice/networking/VoiceUDPClient.js +173 -0
- package/src/client/voice/networking/VoiceWebSocket.js +286 -0
- package/src/client/voice/player/MediaPlayer.js +321 -0
- package/src/client/voice/player/processing/AnnexBNalSplitter.js +244 -0
- package/src/client/voice/player/processing/IvfSplitter.js +106 -0
- package/src/client/voice/player/processing/PCMInsertSilence.js +37 -0
- package/src/client/voice/receiver/PacketHandler.js +260 -0
- package/src/client/voice/receiver/Receiver.js +96 -0
- package/src/client/voice/receiver/Recorder.js +173 -0
- package/src/client/voice/util/Function.js +116 -0
- package/src/client/voice/util/PlayInterface.js +122 -0
- package/src/client/voice/util/Secretbox.js +64 -0
- package/src/client/voice/util/Silence.js +16 -0
- package/src/client/voice/util/Socket.js +62 -0
- package/src/client/voice/util/VolumeInterface.js +104 -0
- package/src/client/websocket/WebSocketManager.js +392 -0
- package/src/client/websocket/WebSocketShard.js +907 -0
- package/src/client/websocket/handlers/APPLICATION_COMMAND_CREATE.js +18 -0
- package/src/client/websocket/handlers/APPLICATION_COMMAND_DELETE.js +20 -0
- package/src/client/websocket/handlers/APPLICATION_COMMAND_PERMISSIONS_UPDATE.js +5 -0
- package/src/client/websocket/handlers/APPLICATION_COMMAND_UPDATE.js +20 -0
- package/src/client/websocket/handlers/AUTO_MODERATION_ACTION_EXECUTION.js +5 -0
- package/src/client/websocket/handlers/AUTO_MODERATION_RULE_CREATE.js +5 -0
- package/src/client/websocket/handlers/AUTO_MODERATION_RULE_DELETE.js +5 -0
- package/src/client/websocket/handlers/AUTO_MODERATION_RULE_UPDATE.js +5 -0
- package/src/client/websocket/handlers/CALL_CREATE.js +14 -0
- package/src/client/websocket/handlers/CALL_DELETE.js +11 -0
- package/src/client/websocket/handlers/CALL_UPDATE.js +11 -0
- package/src/client/websocket/handlers/CHANNEL_CREATE.js +5 -0
- package/src/client/websocket/handlers/CHANNEL_DELETE.js +5 -0
- package/src/client/websocket/handlers/CHANNEL_PINS_UPDATE.js +22 -0
- package/src/client/websocket/handlers/CHANNEL_RECIPIENT_ADD.js +19 -0
- package/src/client/websocket/handlers/CHANNEL_RECIPIENT_REMOVE.js +16 -0
- package/src/client/websocket/handlers/CHANNEL_UPDATE.js +16 -0
- package/src/client/websocket/handlers/GUILD_AUDIT_LOG_ENTRY_CREATE.js +5 -0
- package/src/client/websocket/handlers/GUILD_BAN_ADD.js +5 -0
- package/src/client/websocket/handlers/GUILD_BAN_REMOVE.js +5 -0
- package/src/client/websocket/handlers/GUILD_CREATE.js +52 -0
- package/src/client/websocket/handlers/GUILD_DELETE.js +5 -0
- package/src/client/websocket/handlers/GUILD_EMOJIS_UPDATE.js +5 -0
- package/src/client/websocket/handlers/GUILD_INTEGRATIONS_UPDATE.js +5 -0
- package/src/client/websocket/handlers/GUILD_MEMBERS_CHUNK.js +39 -0
- package/src/client/websocket/handlers/GUILD_MEMBER_ADD.js +20 -0
- package/src/client/websocket/handlers/GUILD_MEMBER_REMOVE.js +5 -0
- package/src/client/websocket/handlers/GUILD_MEMBER_UPDATE.js +5 -0
- package/src/client/websocket/handlers/GUILD_ROLE_CREATE.js +5 -0
- package/src/client/websocket/handlers/GUILD_ROLE_DELETE.js +5 -0
- package/src/client/websocket/handlers/GUILD_ROLE_UPDATE.js +5 -0
- package/src/client/websocket/handlers/GUILD_SCHEDULED_EVENT_CREATE.js +5 -0
- package/src/client/websocket/handlers/GUILD_SCHEDULED_EVENT_DELETE.js +5 -0
- package/src/client/websocket/handlers/GUILD_SCHEDULED_EVENT_UPDATE.js +5 -0
- package/src/client/websocket/handlers/GUILD_SCHEDULED_EVENT_USER_ADD.js +5 -0
- package/src/client/websocket/handlers/GUILD_SCHEDULED_EVENT_USER_REMOVE.js +5 -0
- package/src/client/websocket/handlers/GUILD_STICKERS_UPDATE.js +5 -0
- package/src/client/websocket/handlers/GUILD_UPDATE.js +5 -0
- package/src/client/websocket/handlers/INTERACTION_MODAL_CREATE.js +12 -0
- package/src/client/websocket/handlers/INVITE_CREATE.js +5 -0
- package/src/client/websocket/handlers/INVITE_DELETE.js +5 -0
- package/src/client/websocket/handlers/MESSAGE_CREATE.js +5 -0
- package/src/client/websocket/handlers/MESSAGE_DELETE.js +5 -0
- package/src/client/websocket/handlers/MESSAGE_DELETE_BULK.js +5 -0
- package/src/client/websocket/handlers/MESSAGE_POLL_VOTE_ADD.js +5 -0
- package/src/client/websocket/handlers/MESSAGE_POLL_VOTE_REMOVE.js +5 -0
- package/src/client/websocket/handlers/MESSAGE_REACTION_ADD.js +5 -0
- package/src/client/websocket/handlers/MESSAGE_REACTION_REMOVE.js +5 -0
- package/src/client/websocket/handlers/MESSAGE_REACTION_REMOVE_ALL.js +5 -0
- package/src/client/websocket/handlers/MESSAGE_REACTION_REMOVE_EMOJI.js +5 -0
- package/src/client/websocket/handlers/MESSAGE_UPDATE.js +16 -0
- package/src/client/websocket/handlers/PRESENCE_UPDATE.js +5 -0
- package/src/client/websocket/handlers/READY.js +121 -0
- package/src/client/websocket/handlers/RELATIONSHIP_ADD.js +19 -0
- package/src/client/websocket/handlers/RELATIONSHIP_REMOVE.js +17 -0
- package/src/client/websocket/handlers/RELATIONSHIP_UPDATE.js +41 -0
- package/src/client/websocket/handlers/RESUMED.js +14 -0
- package/src/client/websocket/handlers/STAGE_INSTANCE_CREATE.js +5 -0
- package/src/client/websocket/handlers/STAGE_INSTANCE_DELETE.js +5 -0
- package/src/client/websocket/handlers/STAGE_INSTANCE_UPDATE.js +5 -0
- package/src/client/websocket/handlers/THREAD_CREATE.js +5 -0
- package/src/client/websocket/handlers/THREAD_DELETE.js +5 -0
- package/src/client/websocket/handlers/THREAD_LIST_SYNC.js +5 -0
- package/src/client/websocket/handlers/THREAD_MEMBERS_UPDATE.js +5 -0
- package/src/client/websocket/handlers/THREAD_MEMBER_UPDATE.js +5 -0
- package/src/client/websocket/handlers/THREAD_UPDATE.js +16 -0
- package/src/client/websocket/handlers/TYPING_START.js +5 -0
- package/src/client/websocket/handlers/USER_GUILD_SETTINGS_UPDATE.js +6 -0
- package/src/client/websocket/handlers/USER_NOTE_UPDATE.js +5 -0
- package/src/client/websocket/handlers/USER_REQUIRED_ACTION_UPDATE.js +78 -0
- package/src/client/websocket/handlers/USER_SETTINGS_UPDATE.js +5 -0
- package/src/client/websocket/handlers/USER_UPDATE.js +5 -0
- package/src/client/websocket/handlers/VOICE_CHANNEL_EFFECT_SEND.js +16 -0
- package/src/client/websocket/handlers/VOICE_CHANNEL_STATUS_UPDATE.js +12 -0
- package/src/client/websocket/handlers/VOICE_SERVER_UPDATE.js +6 -0
- package/src/client/websocket/handlers/VOICE_STATE_UPDATE.js +5 -0
- package/src/client/websocket/handlers/WEBHOOKS_UPDATE.js +5 -0
- package/src/client/websocket/handlers/index.js +84 -0
- package/src/errors/DJSError.js +61 -0
- package/src/errors/Messages.js +217 -0
- package/src/errors/index.js +4 -0
- package/src/index.js +172 -0
- package/src/managers/ApplicationCommandManager.js +264 -0
- package/src/managers/ApplicationCommandPermissionsManager.js +417 -0
- package/src/managers/AutoModerationRuleManager.js +296 -0
- package/src/managers/BaseGuildEmojiManager.js +80 -0
- package/src/managers/BaseManager.js +19 -0
- package/src/managers/BillingManager.js +66 -0
- package/src/managers/CachedManager.js +71 -0
- package/src/managers/ChannelManager.js +148 -0
- package/src/managers/ClientUserSettingManager.js +372 -0
- package/src/managers/DataManager.js +61 -0
- package/src/managers/DeveloperManager.js +254 -0
- package/src/managers/GuildBanManager.js +250 -0
- package/src/managers/GuildChannelManager.js +488 -0
- package/src/managers/GuildEmojiManager.js +171 -0
- package/src/managers/GuildEmojiRoleManager.js +118 -0
- package/src/managers/GuildForumThreadManager.js +108 -0
- package/src/managers/GuildInviteManager.js +213 -0
- package/src/managers/GuildManager.js +338 -0
- package/src/managers/GuildMemberManager.js +599 -0
- package/src/managers/GuildMemberRoleManager.js +195 -0
- package/src/managers/GuildScheduledEventManager.js +314 -0
- package/src/managers/GuildSettingManager.js +155 -0
- package/src/managers/GuildStickerManager.js +179 -0
- package/src/managers/GuildTextThreadManager.js +98 -0
- package/src/managers/InteractionManager.js +39 -0
- package/src/managers/MessageManager.js +423 -0
- package/src/managers/PermissionOverwriteManager.js +164 -0
- package/src/managers/PresenceManager.js +71 -0
- package/src/managers/QuestManager.js +353 -0
- package/src/managers/ReactionManager.js +67 -0
- package/src/managers/ReactionUserManager.js +73 -0
- package/src/managers/RelationshipManager.js +278 -0
- package/src/managers/RoleManager.js +448 -0
- package/src/managers/SessionManager.js +66 -0
- package/src/managers/StageInstanceManager.js +162 -0
- package/src/managers/ThreadManager.js +175 -0
- package/src/managers/ThreadMemberManager.js +186 -0
- package/src/managers/UserManager.js +136 -0
- package/src/managers/UserNoteManager.js +53 -0
- package/src/managers/VoiceStateManager.js +59 -0
- package/src/rest/APIRequest.js +154 -0
- package/src/rest/APIRouter.js +53 -0
- package/src/rest/DiscordAPIError.js +119 -0
- package/src/rest/HTTPError.js +62 -0
- package/src/rest/RESTManager.js +67 -0
- package/src/rest/RateLimitError.js +55 -0
- package/src/rest/RequestHandler.js +466 -0
- package/src/sharding/Shard.js +444 -0
- package/src/sharding/ShardClientUtil.js +279 -0
- package/src/sharding/ShardingManager.js +319 -0
- package/src/structures/AnonymousGuild.js +98 -0
- package/src/structures/ApplicationCommand.js +593 -0
- package/src/structures/ApplicationRoleConnectionMetadata.js +48 -0
- package/src/structures/AutoModerationActionExecution.js +89 -0
- package/src/structures/AutoModerationRule.js +294 -0
- package/src/structures/AutocompleteInteraction.js +107 -0
- package/src/structures/Base.js +43 -0
- package/src/structures/BaseCommandInteraction.js +211 -0
- package/src/structures/BaseGuild.js +116 -0
- package/src/structures/BaseGuildEmoji.js +56 -0
- package/src/structures/BaseGuildTextChannel.js +191 -0
- package/src/structures/BaseGuildVoiceChannel.js +241 -0
- package/src/structures/BaseMessageComponent.js +181 -0
- package/src/structures/ButtonInteraction.js +11 -0
- package/src/structures/CallState.js +63 -0
- package/src/structures/CategoryChannel.js +85 -0
- package/src/structures/Channel.js +284 -0
- package/src/structures/ClientPresence.js +77 -0
- package/src/structures/ClientUser.js +655 -0
- package/src/structures/CommandInteraction.js +41 -0
- package/src/structures/CommandInteractionOptionResolver.js +276 -0
- package/src/structures/ContainerComponent.js +68 -0
- package/src/structures/ContextMenuInteraction.js +65 -0
- package/src/structures/DMChannel.js +219 -0
- package/src/structures/DirectoryChannel.js +20 -0
- package/src/structures/Emoji.js +148 -0
- package/src/structures/FileComponent.js +49 -0
- package/src/structures/ForumChannel.js +31 -0
- package/src/structures/GroupDMChannel.js +394 -0
- package/src/structures/Guild.js +1791 -0
- package/src/structures/GuildAuditLogs.js +746 -0
- package/src/structures/GuildBan.js +59 -0
- package/src/structures/GuildBoost.js +108 -0
- package/src/structures/GuildChannel.js +470 -0
- package/src/structures/GuildEmoji.js +161 -0
- package/src/structures/GuildMember.js +636 -0
- package/src/structures/GuildPreview.js +191 -0
- package/src/structures/GuildPreviewEmoji.js +27 -0
- package/src/structures/GuildScheduledEvent.js +536 -0
- package/src/structures/GuildTemplate.js +236 -0
- package/src/structures/Integration.js +188 -0
- package/src/structures/IntegrationApplication.js +96 -0
- package/src/structures/Interaction.js +290 -0
- package/src/structures/InteractionCollector.js +248 -0
- package/src/structures/InteractionWebhook.js +43 -0
- package/src/structures/Invite.js +358 -0
- package/src/structures/InviteGuild.js +23 -0
- package/src/structures/InviteStageInstance.js +86 -0
- package/src/structures/MediaChannel.js +11 -0
- package/src/structures/MediaGalleryComponent.js +41 -0
- package/src/structures/MediaGalleryItem.js +47 -0
- package/src/structures/Message.js +1252 -0
- package/src/structures/MessageActionRow.js +105 -0
- package/src/structures/MessageAttachment.js +216 -0
- package/src/structures/MessageButton.js +166 -0
- package/src/structures/MessageCollector.js +146 -0
- package/src/structures/MessageComponentInteraction.js +120 -0
- package/src/structures/MessageContextMenuInteraction.js +20 -0
- package/src/structures/MessageEmbed.js +596 -0
- package/src/structures/MessageMentions.js +273 -0
- package/src/structures/MessagePayload.js +354 -0
- package/src/structures/MessageReaction.js +181 -0
- package/src/structures/MessageSelectMenu.js +141 -0
- package/src/structures/Modal.js +161 -0
- package/src/structures/ModalSubmitFieldsResolver.js +53 -0
- package/src/structures/ModalSubmitInteraction.js +119 -0
- package/src/structures/NewsChannel.js +32 -0
- package/src/structures/OAuth2Guild.js +28 -0
- package/src/structures/PermissionOverwrites.js +198 -0
- package/src/structures/Poll.js +108 -0
- package/src/structures/PollAnswer.js +88 -0
- package/src/structures/Presence.js +1157 -0
- package/src/structures/ReactionCollector.js +229 -0
- package/src/structures/ReactionEmoji.js +31 -0
- package/src/structures/Role.js +590 -0
- package/src/structures/SectionComponent.js +48 -0
- package/src/structures/SelectMenuInteraction.js +21 -0
- package/src/structures/SeparatorComponent.js +48 -0
- package/src/structures/Session.js +81 -0
- package/src/structures/StageChannel.js +104 -0
- package/src/structures/StageInstance.js +208 -0
- package/src/structures/Sticker.js +310 -0
- package/src/structures/StickerPack.js +95 -0
- package/src/structures/StoreChannel.js +56 -0
- package/src/structures/Team.js +118 -0
- package/src/structures/TeamMember.js +80 -0
- package/src/structures/TextChannel.js +33 -0
- package/src/structures/TextDisplayComponent.js +40 -0
- package/src/structures/TextInputComponent.js +132 -0
- package/src/structures/ThreadChannel.js +605 -0
- package/src/structures/ThreadMember.js +105 -0
- package/src/structures/ThreadOnlyChannel.js +249 -0
- package/src/structures/ThumbnailComponent.js +57 -0
- package/src/structures/Typing.js +74 -0
- package/src/structures/UnfurledMediaItem.js +29 -0
- package/src/structures/User.js +640 -0
- package/src/structures/UserContextMenuInteraction.js +29 -0
- package/src/structures/VoiceChannel.js +110 -0
- package/src/structures/VoiceChannelEffect.js +69 -0
- package/src/structures/VoiceRegion.js +53 -0
- package/src/structures/VoiceState.js +354 -0
- package/src/structures/WebEmbed.js +373 -0
- package/src/structures/Webhook.js +478 -0
- package/src/structures/WelcomeChannel.js +60 -0
- package/src/structures/WelcomeScreen.js +48 -0
- package/src/structures/Widget.js +87 -0
- package/src/structures/WidgetMember.js +99 -0
- package/src/structures/interfaces/Application.js +953 -0
- package/src/structures/interfaces/Collector.js +300 -0
- package/src/structures/interfaces/InteractionResponses.js +313 -0
- package/src/structures/interfaces/TextBasedChannel.js +821 -0
- package/src/util/APITypes.js +59 -0
- package/src/util/ActivityFlags.js +44 -0
- package/src/util/ApplicationFlags.js +76 -0
- package/src/util/AttachmentFlags.js +38 -0
- package/src/util/BitField.js +170 -0
- package/src/util/ChannelFlags.js +45 -0
- package/src/util/Constants.js +1914 -0
- package/src/util/DataResolver.js +146 -0
- package/src/util/Formatters.js +228 -0
- package/src/util/GuildMemberFlags.js +43 -0
- package/src/util/Intents.js +74 -0
- package/src/util/InviteFlags.js +34 -0
- package/src/util/LimitedCollection.js +131 -0
- package/src/util/MessageFlags.js +63 -0
- package/src/util/Options.js +358 -0
- package/src/util/Permissions.js +202 -0
- package/src/util/PremiumUsageFlags.js +31 -0
- package/src/util/PurchasedFlags.js +33 -0
- package/src/util/RemoteAuth.js +415 -0
- package/src/util/RoleFlags.js +37 -0
- package/src/util/SnowflakeUtil.js +92 -0
- package/src/util/Speaking.js +33 -0
- package/src/util/Sweepers.js +466 -0
- package/src/util/SystemChannelFlags.js +55 -0
- package/src/util/ThreadMemberFlags.js +30 -0
- package/src/util/UserFlags.js +104 -0
- package/src/util/Util.js +1048 -0
- package/typings/enums.d.ts +439 -0
- package/typings/index.d.ts +8505 -0
- package/typings/index.test-d.ts +0 -0
- package/typings/rawDataTypes.d.ts +403 -0
|
@@ -0,0 +1,655 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const { setInterval } = require('node:timers');
|
|
4
|
+
const { Collection } = require('@discordjs/collection');
|
|
5
|
+
const Invite = require('./Invite');
|
|
6
|
+
const User = require('./User');
|
|
7
|
+
const DataResolver = require('../util/DataResolver');
|
|
8
|
+
const PremiumUsageFlags = require('../util/PremiumUsageFlags');
|
|
9
|
+
const PurchasedFlags = require('../util/PurchasedFlags');
|
|
10
|
+
const { Error, TypeError } = require('../errors');
|
|
11
|
+
const Util = require('../util/Util');
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Represents the logged in client's Discord user.
|
|
15
|
+
* @extends {User}
|
|
16
|
+
*/
|
|
17
|
+
class ClientUser extends User {
|
|
18
|
+
#packageName = null;
|
|
19
|
+
#intervalSamsungPresence = setInterval(() => {
|
|
20
|
+
this.client.emit('debug', `[UPDATE] Samsung Presence: ${this.#packageName}`);
|
|
21
|
+
if (!this.#packageName) return;
|
|
22
|
+
this.setSamsungActivity(this.#packageName, 'UPDATE');
|
|
23
|
+
}, 1000 * 60 * 10).unref();
|
|
24
|
+
|
|
25
|
+
_patch(data) {
|
|
26
|
+
super._patch(data);
|
|
27
|
+
|
|
28
|
+
if ('verified' in data) {
|
|
29
|
+
/**
|
|
30
|
+
* Whether or not this account has been verified
|
|
31
|
+
* @type {boolean}
|
|
32
|
+
*/
|
|
33
|
+
this.verified = data.verified;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
if ('mfa_enabled' in data) {
|
|
37
|
+
/**
|
|
38
|
+
* If the bot's {@link Application#owner Owner} has MFA enabled on their account
|
|
39
|
+
* @type {?boolean}
|
|
40
|
+
*/
|
|
41
|
+
this.mfaEnabled = typeof data.mfa_enabled === 'boolean' ? data.mfa_enabled : null;
|
|
42
|
+
} else {
|
|
43
|
+
this.mfaEnabled ??= null;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
if ('token' in data) this.client.token = data.token;
|
|
47
|
+
|
|
48
|
+
if ('purchased_flags' in data) {
|
|
49
|
+
/**
|
|
50
|
+
* Purchased state of the client user.
|
|
51
|
+
* @type {Readonly<PurchasedFlags>}
|
|
52
|
+
*/
|
|
53
|
+
this.purchasedFlags = new PurchasedFlags(data.purchased_flags || 0).freeze();
|
|
54
|
+
} else {
|
|
55
|
+
this.purchasedFlags = new PurchasedFlags().freeze();
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
if ('premium_usage_flags' in data) {
|
|
59
|
+
/**
|
|
60
|
+
* Premium usage state of the client user.
|
|
61
|
+
* @type {Readonly<PremiumUsageFlags>}
|
|
62
|
+
*/
|
|
63
|
+
this.premiumUsageFlags = new PremiumUsageFlags(data.premium_usage_flags || 0);
|
|
64
|
+
} else {
|
|
65
|
+
this.premiumUsageFlags = new PremiumUsageFlags().freeze();
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
if ('phone' in data) {
|
|
69
|
+
/**
|
|
70
|
+
* Phone number of the client user.
|
|
71
|
+
* @type {?string}
|
|
72
|
+
*/
|
|
73
|
+
this.phone = data.phone;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
if ('nsfw_allowed' in data) {
|
|
77
|
+
/**
|
|
78
|
+
* Whether or not the client user is allowed to send NSFW messages [iOS device].
|
|
79
|
+
* @type {?boolean}
|
|
80
|
+
*/
|
|
81
|
+
this.nsfwAllowed = data.nsfw_allowed;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
if ('email' in data) {
|
|
85
|
+
/**
|
|
86
|
+
* Email address of the client user.
|
|
87
|
+
* @type {?string}
|
|
88
|
+
*/
|
|
89
|
+
this.email = data.email;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
if ('bio' in data) {
|
|
93
|
+
/**
|
|
94
|
+
* About me (User)
|
|
95
|
+
* <info>The user must be force fetched for this property to be present or be updated</info>
|
|
96
|
+
* @type {?string}
|
|
97
|
+
*/
|
|
98
|
+
this.bio = data.bio;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
if ('pronouns' in data) {
|
|
102
|
+
/**
|
|
103
|
+
* Pronouns (User)
|
|
104
|
+
* <info>The user must be force fetched for this property to be present or be updated</info>
|
|
105
|
+
* @type {?string}
|
|
106
|
+
*/
|
|
107
|
+
this.pronouns = data.pronouns;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
if ('premium_type' in data) {
|
|
111
|
+
/**
|
|
112
|
+
* Premium types denote the level of premium a user has.
|
|
113
|
+
* @type {number}
|
|
114
|
+
* @see {@link https://discord-userdoccers.vercel.app/resources/user#premium-type}
|
|
115
|
+
*/
|
|
116
|
+
this.premiumType = data.premium_type;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* Represents the client user's presence
|
|
122
|
+
* @type {ClientPresence}
|
|
123
|
+
* @readonly
|
|
124
|
+
*/
|
|
125
|
+
get presence() {
|
|
126
|
+
return this.client.presence;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
/**
|
|
130
|
+
* Data used to edit the logged in client
|
|
131
|
+
* @typedef {Object} ClientUserEditData
|
|
132
|
+
* @property {string} [username] The new username
|
|
133
|
+
* @property {?(BufferResolvable|Base64Resolvable)} [avatar] The new avatar
|
|
134
|
+
* @property {?(BufferResolvable|Base64Resolvable)} [banner] The new banner
|
|
135
|
+
* @property {?string} [bio] The new bio
|
|
136
|
+
*/
|
|
137
|
+
|
|
138
|
+
/**
|
|
139
|
+
* Edits the logged in client.
|
|
140
|
+
* @param {ClientUserEditData} options The new data
|
|
141
|
+
* @returns {Promise<ClientUser>}
|
|
142
|
+
*/
|
|
143
|
+
async edit(options = {}) {
|
|
144
|
+
const data = await this.client.api.users('@me').patch({ data: options });
|
|
145
|
+
const { updated } = this.client.actions.UserUpdate.handle(data);
|
|
146
|
+
return updated ?? this;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
/**
|
|
150
|
+
* Sets the username of the logged in client.
|
|
151
|
+
* <info>Changing usernames in Discord is heavily rate limited, with only 2 requests
|
|
152
|
+
* every hour. Use this sparingly!</info>
|
|
153
|
+
* @param {string} username The new username
|
|
154
|
+
* @param {string} password Current Password
|
|
155
|
+
* @returns {Promise<ClientUser>}
|
|
156
|
+
* @example
|
|
157
|
+
* // Set username
|
|
158
|
+
* client.user.setUsername('discordjs', 'passw@rd')
|
|
159
|
+
* .then(user => console.log(`My new username is ${user.username}`))
|
|
160
|
+
* .catch(console.error);
|
|
161
|
+
*/
|
|
162
|
+
setUsername(username, password) {
|
|
163
|
+
return this.edit({ username, password });
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
/**
|
|
167
|
+
* Sets the avatar of the logged in client.
|
|
168
|
+
* @param {?(BufferResolvable|Base64Resolvable)} avatar The new avatar
|
|
169
|
+
* @returns {Promise<ClientUser>}
|
|
170
|
+
* @example
|
|
171
|
+
* // Set avatar
|
|
172
|
+
* client.user.setAvatar('./avatar.png')
|
|
173
|
+
* .then(user => console.log(`New avatar set!`))
|
|
174
|
+
* .catch(console.error);
|
|
175
|
+
*/
|
|
176
|
+
async setAvatar(avatar) {
|
|
177
|
+
avatar = avatar && (await DataResolver.resolveImage(avatar));
|
|
178
|
+
return this.edit({ avatar });
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
/**
|
|
182
|
+
* Options for setting activities
|
|
183
|
+
* @typedef {Object} ActivitiesOptions
|
|
184
|
+
* @property {string} name Name of the activity
|
|
185
|
+
* @property {string} [state] State of the activity
|
|
186
|
+
* @property {ActivityType|number} [type] Type of the activity
|
|
187
|
+
* @property {string} [url] Twitch / YouTube stream URL
|
|
188
|
+
*/
|
|
189
|
+
|
|
190
|
+
/**
|
|
191
|
+
* Data resembling a raw Discord presence.
|
|
192
|
+
* @typedef {Object} PresenceData
|
|
193
|
+
* @property {PresenceStatusData} [status] Status of the user
|
|
194
|
+
* @property {boolean} [afk] Whether the user is AFK
|
|
195
|
+
* @property {ActivitiesOptions[]|CustomStatus[]|RichPresence[]|SpotifyRPC[]} [activities] Activity the user is playing
|
|
196
|
+
* @property {number|number[]} [shardId] Shard id(s) to have the activity set on
|
|
197
|
+
*/
|
|
198
|
+
|
|
199
|
+
/**
|
|
200
|
+
* Sets the full presence of the client user.
|
|
201
|
+
* @param {PresenceData} data Data for the presence
|
|
202
|
+
* @returns {ClientPresence}
|
|
203
|
+
* @example
|
|
204
|
+
* // Set the client user's presence
|
|
205
|
+
* client.user.setPresence({ activities: [{ name: 'with discord.js' }], status: 'idle' });
|
|
206
|
+
* @see {@link https://github.com/aiko-chan-ai/discord-selfbot.js/blob/main/Document/RichPresence.md}
|
|
207
|
+
*/
|
|
208
|
+
setPresence(data) {
|
|
209
|
+
return this.client.presence.set(data);
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
/**
|
|
213
|
+
* A user's status. Must be one of:
|
|
214
|
+
* * `online`
|
|
215
|
+
* * `idle`
|
|
216
|
+
* * `invisible`
|
|
217
|
+
* * `dnd` (do not disturb)
|
|
218
|
+
* @typedef {string} PresenceStatusData
|
|
219
|
+
*/
|
|
220
|
+
|
|
221
|
+
/**
|
|
222
|
+
* Sets the status of the client user.
|
|
223
|
+
* @param {PresenceStatusData} status Status to change to
|
|
224
|
+
* @param {number|number[]} [shardId] Shard id(s) to have the activity set on
|
|
225
|
+
* @returns {ClientPresence}
|
|
226
|
+
* @example
|
|
227
|
+
* // Set the client user's status
|
|
228
|
+
* client.user.setStatus('idle');
|
|
229
|
+
*/
|
|
230
|
+
setStatus(status, shardId) {
|
|
231
|
+
return this.setPresence({ status, shardId });
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
/**
|
|
235
|
+
* Options for setting an activity.
|
|
236
|
+
* @typedef {Object} ActivityOptions
|
|
237
|
+
* @property {string} name Name of the activity
|
|
238
|
+
* @property {string} [url] Twitch / YouTube stream URL
|
|
239
|
+
* @property {ActivityType|number} [type] Type of the activity
|
|
240
|
+
* @property {number|number[]} [shardId] Shard Id(s) to have the activity set on
|
|
241
|
+
*/
|
|
242
|
+
|
|
243
|
+
/**
|
|
244
|
+
* Sets the activity the client user is playing.
|
|
245
|
+
* @param {string|ActivityOptions} name Activity being played, or options for setting the activity
|
|
246
|
+
* @param {ActivityOptions} [options] Options for setting the activity
|
|
247
|
+
* @returns {ClientPresence}
|
|
248
|
+
* @example
|
|
249
|
+
* // Set the client user's activity
|
|
250
|
+
* client.user.setActivity('discord.js', { type: 'WATCHING' });
|
|
251
|
+
* @see {@link https://github.com/aiko-chan-ai/discord-selfbot.js/blob/main/Document/RichPresence.md}
|
|
252
|
+
*/
|
|
253
|
+
setActivity(name, options = {}) {
|
|
254
|
+
if (!name) return this.setPresence({ activities: [], shardId: options.shardId });
|
|
255
|
+
|
|
256
|
+
const activity = Object.assign({}, options, typeof name === 'object' ? name : { name });
|
|
257
|
+
return this.setPresence({ activities: [activity], shardId: activity.shardId });
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
/**
|
|
261
|
+
* Sets/removes the AFK flag for the client user.
|
|
262
|
+
* @param {boolean} [afk=true] Whether or not the user is AFK
|
|
263
|
+
* @param {number|number[]} [shardId] Shard Id(s) to have the AFK flag set on
|
|
264
|
+
* @returns {ClientPresence}
|
|
265
|
+
*/
|
|
266
|
+
setAFK(afk = true, shardId) {
|
|
267
|
+
return this.setPresence({ afk, shardId });
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
/**
|
|
271
|
+
* Sets the banner of the logged in client.
|
|
272
|
+
* @param {?(BufferResolvable|Base64Resolvable)} banner The new banner
|
|
273
|
+
* @returns {Promise<ClientUser>}
|
|
274
|
+
* @example
|
|
275
|
+
* // Set banner
|
|
276
|
+
* client.user.setBanner('./banner.png')
|
|
277
|
+
* .then(user => console.log(`New banner set!`))
|
|
278
|
+
* .catch(console.error);
|
|
279
|
+
*/
|
|
280
|
+
async setBanner(banner) {
|
|
281
|
+
banner = banner && (await DataResolver.resolveImage(banner));
|
|
282
|
+
return this.edit({ banner });
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
/**
|
|
286
|
+
* Set HyperSquad House
|
|
287
|
+
* @param {string|number} type
|
|
288
|
+
* * `LEAVE`: 0
|
|
289
|
+
* * `HOUSE_BRAVERY`: 1
|
|
290
|
+
* * `HOUSE_BRILLIANCE`: 2
|
|
291
|
+
* * `HOUSE_BALANCE`: 3
|
|
292
|
+
* @returns {Promise<void>}
|
|
293
|
+
* @example
|
|
294
|
+
* // Set HyperSquad HOUSE_BRAVERY
|
|
295
|
+
* client.user.setHypeSquad(1); || client.user.setHypeSquad('HOUSE_BRAVERY');
|
|
296
|
+
* // Leave
|
|
297
|
+
* client.user.setHypeSquad(0);
|
|
298
|
+
*/
|
|
299
|
+
setHypeSquad(type) {
|
|
300
|
+
switch (type) {
|
|
301
|
+
case 'LEAVE': {
|
|
302
|
+
type = 0;
|
|
303
|
+
break;
|
|
304
|
+
}
|
|
305
|
+
case 'HOUSE_BRAVERY': {
|
|
306
|
+
type = 1;
|
|
307
|
+
break;
|
|
308
|
+
}
|
|
309
|
+
case 'HOUSE_BRILLIANCE': {
|
|
310
|
+
type = 2;
|
|
311
|
+
break;
|
|
312
|
+
}
|
|
313
|
+
case 'HOUSE_BALANCE': {
|
|
314
|
+
type = 3;
|
|
315
|
+
break;
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
if (type == 0) {
|
|
319
|
+
return this.client.api.hypesquad.online.delete();
|
|
320
|
+
} else {
|
|
321
|
+
return this.client.api.hypesquad.online.post({
|
|
322
|
+
data: { house_id: type },
|
|
323
|
+
});
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
/**
|
|
328
|
+
* Set Accent color
|
|
329
|
+
* @param {ColorResolvable} color Color to set
|
|
330
|
+
* @returns {Promise<ClientUser>}
|
|
331
|
+
*/
|
|
332
|
+
setAccentColor(color = null) {
|
|
333
|
+
return this.edit({ accent_color: color ? Util.resolveColor(color) : null });
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
/**
|
|
337
|
+
* Set About me
|
|
338
|
+
* @param {string} [bio=null] Bio to set
|
|
339
|
+
* @returns {Promise<ClientUser>}
|
|
340
|
+
*/
|
|
341
|
+
setAboutMe(bio = null) {
|
|
342
|
+
return this.edit({ bio });
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
/**
|
|
346
|
+
* Create an invite [Friend Invites]
|
|
347
|
+
* maxAge: 604800 | maxUses: 1
|
|
348
|
+
* @returns {Promise<Invite>}
|
|
349
|
+
* @see {@link https://github.com/13-05/hidden-disc-docs#js-snippet-for-creating-friend-invites}
|
|
350
|
+
* @example
|
|
351
|
+
* // Options not working
|
|
352
|
+
* client.user.createFriendInvite();
|
|
353
|
+
* .then(console.log)
|
|
354
|
+
* .catch(console.error);
|
|
355
|
+
*/
|
|
356
|
+
async createFriendInvite() {
|
|
357
|
+
const data = await this.client.api.users['@me'].invites.post({
|
|
358
|
+
data: {},
|
|
359
|
+
});
|
|
360
|
+
return new Invite(this.client, data);
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
/**
|
|
364
|
+
* Get all friend invites
|
|
365
|
+
* @returns {Promise<Collection<string, Invite>>}
|
|
366
|
+
*/
|
|
367
|
+
async getAllFriendInvites() {
|
|
368
|
+
const data = await this.client.api.users['@me'].invites.get();
|
|
369
|
+
const collection = new Collection();
|
|
370
|
+
for (const invite of data) {
|
|
371
|
+
collection.set(invite.code, new Invite(this.client, invite));
|
|
372
|
+
}
|
|
373
|
+
return collection;
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
/**
|
|
377
|
+
* Revoke all friend invites
|
|
378
|
+
* @returns {Promise<void>}
|
|
379
|
+
*/
|
|
380
|
+
revokeAllFriendInvites() {
|
|
381
|
+
return this.client.api.users['@me'].invites.delete();
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
/**
|
|
385
|
+
* Sets Discord Playing status to "Playing on Samsung Galaxy". Only selected gamss from discords database works
|
|
386
|
+
* @param {string} packageName Android package name
|
|
387
|
+
* @param {?string} type Must be START, UPDATE, or STOP
|
|
388
|
+
* @returns {Promise<ClientUser>}
|
|
389
|
+
* @example
|
|
390
|
+
* // Set the client user's status
|
|
391
|
+
* client.user.setSamsungActivity('com.YostarJP.BlueArchive', 'START');
|
|
392
|
+
* // Update
|
|
393
|
+
* client.user.setSamsungActivity('com.miHoYo.bh3oversea', 'UPDATE');
|
|
394
|
+
* // Stop
|
|
395
|
+
* client.user.setSamsungActivity('com.miHoYo.GenshinImpact', 'STOP');
|
|
396
|
+
*/
|
|
397
|
+
async setSamsungActivity(packageName, type = 'START') {
|
|
398
|
+
type = type.toUpperCase();
|
|
399
|
+
if (!packageName || typeof packageName !== 'string') throw new Error('Package name is required.');
|
|
400
|
+
if (!['START', 'UPDATE', 'STOP'].includes(type)) throw new Error('Invalid type (Must be START, UPDATE, or STOP)');
|
|
401
|
+
await this.client.api.presences.post({
|
|
402
|
+
data: {
|
|
403
|
+
package_name: packageName,
|
|
404
|
+
update: type,
|
|
405
|
+
},
|
|
406
|
+
});
|
|
407
|
+
if (type !== 'STOP') this.#packageName = packageName;
|
|
408
|
+
else this.#packageName = null;
|
|
409
|
+
return this;
|
|
410
|
+
}
|
|
411
|
+
|
|
412
|
+
/**
|
|
413
|
+
* Stop ringing
|
|
414
|
+
* @param {ChannelResolvable} channel DMChannel | GroupDMChannel
|
|
415
|
+
* @returns {Promise<void>}
|
|
416
|
+
*/
|
|
417
|
+
stopRinging(channel) {
|
|
418
|
+
return this.client.api.channels(this.client.channels.resolveId(channel)).call['stop-ringing'].post({
|
|
419
|
+
data: {},
|
|
420
|
+
});
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
/**
|
|
424
|
+
* Super Reactions
|
|
425
|
+
* @returns {Promise<number>}
|
|
426
|
+
*/
|
|
427
|
+
fetchBurstCredit() {
|
|
428
|
+
return this.client.api.users['@me']['burst-credits'].get().then(d => d.amount);
|
|
429
|
+
}
|
|
430
|
+
|
|
431
|
+
/**
|
|
432
|
+
* Set global display name
|
|
433
|
+
* @param {string} globalName The new display name
|
|
434
|
+
* @returns {Promise<ClientUser>}
|
|
435
|
+
*/
|
|
436
|
+
setGlobalName(globalName = '') {
|
|
437
|
+
return this.edit({ global_name: globalName });
|
|
438
|
+
}
|
|
439
|
+
|
|
440
|
+
/**
|
|
441
|
+
* Set pronouns
|
|
442
|
+
* @param {?string} pronouns Your pronouns
|
|
443
|
+
* @returns {Promise<ClientUser>}
|
|
444
|
+
*/
|
|
445
|
+
setPronouns(pronouns = '') {
|
|
446
|
+
return this.edit({ pronouns });
|
|
447
|
+
}
|
|
448
|
+
|
|
449
|
+
/**
|
|
450
|
+
* Add a widget to the user's profile
|
|
451
|
+
* @param {string} type Widget type (favorite_games, current_games, played_games, want_to_play_games)
|
|
452
|
+
* @param {string} gameId The game ID to add
|
|
453
|
+
* @param {string} [comment] Optional comment for the game
|
|
454
|
+
* @param {string[]} [tags] Optional tags for the game
|
|
455
|
+
* @returns {Promise<Object>}
|
|
456
|
+
*/
|
|
457
|
+
async addWidget(type, gameId, comment = null, tags = []) {
|
|
458
|
+
if (!type || !gameId) {
|
|
459
|
+
throw new TypeError('Widget type and game ID are required');
|
|
460
|
+
}
|
|
461
|
+
|
|
462
|
+
const validTypes = ['favorite_games', 'current_games', 'played_games', 'want_to_play_games'];
|
|
463
|
+
if (!validTypes.includes(type)) {
|
|
464
|
+
throw new TypeError(`Invalid widget type. Must be one of: ${validTypes.join(', ')}`);
|
|
465
|
+
}
|
|
466
|
+
|
|
467
|
+
// Get current widgets first
|
|
468
|
+
const currentWidgets = await this.widgetsList();
|
|
469
|
+
|
|
470
|
+
// Find existing widget of this type or create new one
|
|
471
|
+
let targetWidget = currentWidgets.widgets.find(w => w.data.type === type);
|
|
472
|
+
|
|
473
|
+
if (!targetWidget) {
|
|
474
|
+
// Create new widget if it doesn't exist
|
|
475
|
+
targetWidget = {
|
|
476
|
+
id: Date.now().toString(), // Generate temporary ID
|
|
477
|
+
data: {
|
|
478
|
+
type: type,
|
|
479
|
+
games: [],
|
|
480
|
+
},
|
|
481
|
+
};
|
|
482
|
+
currentWidgets.widgets.push(targetWidget);
|
|
483
|
+
}
|
|
484
|
+
|
|
485
|
+
// Add the game if it doesn't already exist
|
|
486
|
+
const existingGame = targetWidget.data.games.find(g => g.game_id === gameId);
|
|
487
|
+
if (!existingGame) {
|
|
488
|
+
const gameData = { game_id: gameId };
|
|
489
|
+
if (comment !== null) gameData.comment = comment;
|
|
490
|
+
if (tags.length > 0) gameData.tags = tags;
|
|
491
|
+
|
|
492
|
+
targetWidget.data.games.push(gameData);
|
|
493
|
+
}
|
|
494
|
+
|
|
495
|
+
// Update widgets via API
|
|
496
|
+
return this.client.api.users['@me'].profile.patch({
|
|
497
|
+
data: { widgets: currentWidgets.widgets },
|
|
498
|
+
});
|
|
499
|
+
}
|
|
500
|
+
|
|
501
|
+
/**
|
|
502
|
+
* Delete a widget or remove a game from a widget
|
|
503
|
+
* @param {string} type Widget type to modify
|
|
504
|
+
* @param {string} [gameId] Optional game ID to remove (if not provided, removes entire widget)
|
|
505
|
+
* @returns {Promise<Object>}
|
|
506
|
+
*/
|
|
507
|
+
async delWidget(type, gameId = null) {
|
|
508
|
+
if (!type) {
|
|
509
|
+
throw new TypeError('Widget type is required');
|
|
510
|
+
}
|
|
511
|
+
|
|
512
|
+
const validTypes = ['favorite_games', 'current_games', 'played_games', 'want_to_play_games'];
|
|
513
|
+
if (!validTypes.includes(type)) {
|
|
514
|
+
throw new TypeError(`Invalid widget type. Must be one of: ${validTypes.join(', ')}`);
|
|
515
|
+
}
|
|
516
|
+
|
|
517
|
+
// Get current widgets
|
|
518
|
+
const currentWidgets = await this.widgetsList();
|
|
519
|
+
|
|
520
|
+
if (gameId) {
|
|
521
|
+
// Remove specific game from widget
|
|
522
|
+
const targetWidget = currentWidgets.widgets.find(w => w.data.type === type);
|
|
523
|
+
if (targetWidget) {
|
|
524
|
+
targetWidget.data.games = targetWidget.data.games.filter(g => g.game_id !== gameId);
|
|
525
|
+
}
|
|
526
|
+
} else {
|
|
527
|
+
// Remove entire widget
|
|
528
|
+
currentWidgets.widgets = currentWidgets.widgets.filter(w => w.data.type !== type);
|
|
529
|
+
}
|
|
530
|
+
|
|
531
|
+
// Update widgets via API
|
|
532
|
+
return this.client.api.users['@me'].profile.patch({
|
|
533
|
+
data: { widgets: currentWidgets.widgets },
|
|
534
|
+
});
|
|
535
|
+
}
|
|
536
|
+
|
|
537
|
+
/**
|
|
538
|
+
* Get the list of all widgets for the user
|
|
539
|
+
* @returns {Promise<Object>} Object containing widgets array
|
|
540
|
+
*/
|
|
541
|
+
async widgetsList() {
|
|
542
|
+
try {
|
|
543
|
+
const data = await this.client.api.users['@me'].profile.get();
|
|
544
|
+
return data.widgets ? { widgets: data.widgets } : { widgets: [] };
|
|
545
|
+
} catch (error) {
|
|
546
|
+
// If profile endpoint doesn't exist or fails, return empty widgets
|
|
547
|
+
return { widgets: [] };
|
|
548
|
+
}
|
|
549
|
+
}
|
|
550
|
+
|
|
551
|
+
/**
|
|
552
|
+
* Set display name style with font, effect, and colors
|
|
553
|
+
* @param {string|number} fontName Font name or ID
|
|
554
|
+
* @param {string|number} effectName Effect name or ID
|
|
555
|
+
* @param {number|string} color1 Primary color (hex or decimal)
|
|
556
|
+
* @param {number|string} [color2] Secondary color for gradient effects (hex or decimal)
|
|
557
|
+
* @returns {Promise<ClientUser>}
|
|
558
|
+
* @example
|
|
559
|
+
* // Set Sans font with gradient effect
|
|
560
|
+
* client.user.setNameStyle('Sans', 'Gradient', 7183099, 6082490);
|
|
561
|
+
* // Set Tempo font with solid effect
|
|
562
|
+
* client.user.setNameStyle('Tempo', 'Solid', 7183099);
|
|
563
|
+
* // Using IDs directly
|
|
564
|
+
* client.user.setNameStyle(11, 2, 7183099, 6082490);
|
|
565
|
+
*/
|
|
566
|
+
async setNameStyle(fontName, effectName, color1, color2 = null) {
|
|
567
|
+
// Font name/ID mapping
|
|
568
|
+
const fontMap = {
|
|
569
|
+
Sans: 11,
|
|
570
|
+
Tempo: 12,
|
|
571
|
+
Sakura: 3,
|
|
572
|
+
JellyBean: 4,
|
|
573
|
+
Modern: 6,
|
|
574
|
+
Medieval: 7,
|
|
575
|
+
'8Bit': 8,
|
|
576
|
+
Vampire: 10,
|
|
577
|
+
};
|
|
578
|
+
|
|
579
|
+
// Effect name/ID mapping
|
|
580
|
+
const effectMap = {
|
|
581
|
+
Solid: 1,
|
|
582
|
+
Gradient: 2,
|
|
583
|
+
Neon: 3,
|
|
584
|
+
Toon: 4,
|
|
585
|
+
Pop: 5,
|
|
586
|
+
};
|
|
587
|
+
|
|
588
|
+
// Resolve font ID
|
|
589
|
+
let fontId = typeof fontName === 'string' ? fontMap[fontName] : fontName;
|
|
590
|
+
if (!fontId) {
|
|
591
|
+
throw new TypeError(`Invalid font name. Must be one of: ${Object.keys(fontMap).join(', ')} or a valid font ID`);
|
|
592
|
+
}
|
|
593
|
+
|
|
594
|
+
// Resolve effect ID
|
|
595
|
+
let effectId = typeof effectName === 'string' ? effectMap[effectName] : effectName;
|
|
596
|
+
if (!effectId) {
|
|
597
|
+
throw new TypeError(
|
|
598
|
+
`Invalid effect name. Must be one of: ${Object.keys(effectMap).join(', ')} or a valid effect ID`,
|
|
599
|
+
);
|
|
600
|
+
}
|
|
601
|
+
|
|
602
|
+
// Resolve colors
|
|
603
|
+
const resolveColor = color => {
|
|
604
|
+
if (typeof color === 'string') {
|
|
605
|
+
// Handle hex colors
|
|
606
|
+
if (color.startsWith('#')) {
|
|
607
|
+
return parseInt(color.slice(1), 16);
|
|
608
|
+
}
|
|
609
|
+
return parseInt(color, 16);
|
|
610
|
+
}
|
|
611
|
+
return color;
|
|
612
|
+
};
|
|
613
|
+
|
|
614
|
+
const primaryColor = resolveColor(color1);
|
|
615
|
+
const colors = [primaryColor];
|
|
616
|
+
|
|
617
|
+
if (color2 !== null) {
|
|
618
|
+
const secondaryColor = resolveColor(color2);
|
|
619
|
+
colors.push(secondaryColor);
|
|
620
|
+
}
|
|
621
|
+
|
|
622
|
+
// Build the data object
|
|
623
|
+
const data = {
|
|
624
|
+
display_name_font_id: fontId,
|
|
625
|
+
display_name_effect_id: effectId,
|
|
626
|
+
display_name_colors: colors,
|
|
627
|
+
};
|
|
628
|
+
|
|
629
|
+
// Send PATCH request to Discord API
|
|
630
|
+
await this.client.api.users('@me').patch({ data });
|
|
631
|
+
return this;
|
|
632
|
+
}
|
|
633
|
+
|
|
634
|
+
/**
|
|
635
|
+
* Set the TAG of a guild.
|
|
636
|
+
* @param {GuildIDResolve} guild The guild with the tag
|
|
637
|
+
* @returns {Promise<ClientUser>}
|
|
638
|
+
*/
|
|
639
|
+
setClan(guild) {
|
|
640
|
+
const id = this.client.guilds.resolveId(guild);
|
|
641
|
+
if (!id) throw new TypeError('INVALID_TYPE', 'guild', 'GuildResolvable');
|
|
642
|
+
|
|
643
|
+
return this.client.api.users['@me'].clan.put({ data: { identity_guild_id: id, identity_enabled: true } });
|
|
644
|
+
}
|
|
645
|
+
|
|
646
|
+
/**
|
|
647
|
+
* Remove the TAG from your profile
|
|
648
|
+
* @returns {Promise<ClientUser>}
|
|
649
|
+
*/
|
|
650
|
+
deleteClan() {
|
|
651
|
+
return this.client.api.users['@me'].clan.put({ data: { identity_guild_id: null, identity_enabled: false } });
|
|
652
|
+
}
|
|
653
|
+
}
|
|
654
|
+
|
|
655
|
+
module.exports = ClientUser;
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const BaseCommandInteraction = require('./BaseCommandInteraction');
|
|
4
|
+
const CommandInteractionOptionResolver = require('./CommandInteractionOptionResolver');
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Represents a command interaction.
|
|
8
|
+
* @extends {BaseCommandInteraction}
|
|
9
|
+
*/
|
|
10
|
+
class CommandInteraction extends BaseCommandInteraction {
|
|
11
|
+
constructor(client, data) {
|
|
12
|
+
super(client, data);
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* The options passed to the command.
|
|
16
|
+
* @type {CommandInteractionOptionResolver}
|
|
17
|
+
*/
|
|
18
|
+
this.options = new CommandInteractionOptionResolver(
|
|
19
|
+
this.client,
|
|
20
|
+
data.data.options?.map(option => this.transformOption(option, data.data.resolved)) ?? [],
|
|
21
|
+
this.transformResolved(data.data.resolved ?? {}),
|
|
22
|
+
);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Returns a string representation of the command interaction.
|
|
27
|
+
* This can then be copied by a user and executed again in a new command while keeping the option order.
|
|
28
|
+
* @returns {string}
|
|
29
|
+
*/
|
|
30
|
+
toString() {
|
|
31
|
+
const properties = [
|
|
32
|
+
this.commandName,
|
|
33
|
+
this.options._group,
|
|
34
|
+
this.options._subcommand,
|
|
35
|
+
...this.options._hoistedOptions.map(o => `${o.name}:${o.value}`),
|
|
36
|
+
];
|
|
37
|
+
return `/${properties.filter(Boolean).join(' ')}`;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
module.exports = CommandInteraction;
|