diff --git a/Makefile b/Makefile deleted file mode 100644 index e449bca..0000000 --- a/Makefile +++ /dev/null @@ -1,2 +0,0 @@ -deno-example: - deno run --allow-read --allow-env --allow-net examples/deno.ts \ No newline at end of file diff --git a/biscuit.js b/biscuit.js deleted file mode 100644 index bfdffe9..0000000 --- a/biscuit.js +++ /dev/null @@ -1,6319 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file -// This code was bundled using `deno bundle` and it's not recommended to edit it manually - -function calculateTotalShards(gateway) { - if (gateway.manager.totalShards < 100) return gateway.manager.totalShards; - return Math.ceil(gateway.manager.totalShards / (gateway.gatewayBot.sessionStartLimit.maxConcurrency === 1 ? 16 : gateway.gatewayBot.sessionStartLimit.maxConcurrency)) * gateway.gatewayBot.sessionStartLimit.maxConcurrency; -} -function calculateWorkerId(manager, shardId) { - let workerId = Math.floor(shardId / manager.shardsPerWorker); - if (workerId >= manager.totalWorkers) { - workerId = manager.totalWorkers - 1; - } - return workerId; -} -function spawnShards(gateway) { - gateway.prepareBuckets(); - gateway.buckets.forEach((bucket, bucketId)=>{ - for (const worker of bucket.workers){ - for (const shardId of worker.queue){ - gateway.tellWorkerToIdentify(worker.id, shardId, bucketId).catch(console.error); - } - } - }); -} -function delay(ms) { - return new Promise((res)=>setTimeout(()=>{ - res(); - }, ms)); -} -function createLeakyBucket({ max , refillInterval , refillAmount , tokens , waiting , ...rest }) { - return { - max, - refillInterval, - refillAmount: refillAmount > max ? max : refillAmount, - lastRefill: performance.now(), - allowAcquire: true, - nextRefill: function() { - return nextRefill(this); - }, - tokens: function() { - return updateTokens(this); - }, - acquire: async function(amount, highPriority) { - return await acquire(this, amount, highPriority); - }, - tokensState: tokens ?? max, - waiting: waiting ?? [], - ...rest - }; -} -function updateTokens(bucket) { - const timePassed = performance.now() - bucket.lastRefill; - const missedRefills = Math.floor(timePassed / bucket.refillInterval); - bucket.tokensState = Math.min(bucket.tokensState + bucket.refillAmount * missedRefills, bucket.max); - bucket.lastRefill += bucket.refillInterval * missedRefills; - return bucket.tokensState; -} -function nextRefill(bucket) { - updateTokens(bucket); - return performance.now() - bucket.lastRefill + bucket.refillInterval; -} -async function acquire(bucket, amount, highPriority = false) { - if (!bucket.allowAcquire) { - await new Promise((resolve)=>{ - if (highPriority) { - bucket.waiting.unshift(resolve); - } else { - bucket.waiting.push(resolve); - } - }); - if (!bucket.allowAcquire) { - return await acquire(bucket, amount); - } - } - bucket.allowAcquire = false; - let currentTokens = updateTokens(bucket); - if (currentTokens < amount) { - const tokensNeeded = amount - currentTokens; - let refillsNeeded = Math.ceil(tokensNeeded / bucket.refillAmount); - const waitTime = bucket.refillInterval * refillsNeeded; - await delay(waitTime); - updateTokens(bucket); - } - const toSubtract = amount % bucket.refillAmount || amount; - bucket.tokensState -= toSubtract; - bucket.allowAcquire = true; - bucket.waiting.shift()?.(); -} -function prepareBuckets(gateway) { - for(let i = 0; i < gateway.gatewayBot.sessionStartLimit.maxConcurrency; ++i){ - gateway.buckets.set(i, { - workers: [], - leak: createLeakyBucket({ - max: 1, - refillAmount: 1, - refillInterval: gateway.spawnShardDelay - }) - }); - } - for(let shardId = gateway.firstShardId; shardId <= gateway.lastShardId; ++shardId){ - if (shardId >= gateway.manager.totalShards) { - throw new Error(`Shard (id: ${shardId}) is bigger or equal to the used amount of used shards which is ${gateway.manager.totalShards}`); - } - const bucketId = shardId % gateway.gatewayBot.sessionStartLimit.maxConcurrency; - const bucket = gateway.buckets.get(bucketId); - if (!bucket) { - throw new Error(`Shard (id: ${shardId}) got assigned to an illegal bucket id: ${bucketId}, expected a bucket id between 0 and ${gateway.gatewayBot.sessionStartLimit.maxConcurrency - 1}`); - } - const workerId = gateway.calculateWorkerId(shardId); - const worker = bucket.workers.find((w)=>w.id === workerId); - if (worker) { - worker.queue.push(shardId); - } else { - bucket.workers.push({ - id: workerId, - queue: [ - shardId - ] - }); - } - } -} -async function tellWorkerToIdentify(gateway, _workerId, shardId, _bucketId) { - return await gateway.manager.identify(shardId); -} -var PremiumTypes; -(function(PremiumTypes) { - PremiumTypes[PremiumTypes["None"] = 0] = "None"; - PremiumTypes[PremiumTypes["NitroClassic"] = 1] = "NitroClassic"; - PremiumTypes[PremiumTypes["Nitro"] = 2] = "Nitro"; -})(PremiumTypes || (PremiumTypes = {})); -var UserFlags; -(function(UserFlags) { - UserFlags[UserFlags["DiscordEmployee"] = 1] = "DiscordEmployee"; - UserFlags[UserFlags["PartneredServerOwner"] = 2] = "PartneredServerOwner"; - UserFlags[UserFlags["HypeSquadEventsMember"] = 4] = "HypeSquadEventsMember"; - UserFlags[UserFlags["BugHunterLevel1"] = 8] = "BugHunterLevel1"; - UserFlags[UserFlags["HouseBravery"] = 64] = "HouseBravery"; - UserFlags[UserFlags["HouseBrilliance"] = 128] = "HouseBrilliance"; - UserFlags[UserFlags["HouseBalance"] = 256] = "HouseBalance"; - UserFlags[UserFlags["EarlySupporter"] = 512] = "EarlySupporter"; - UserFlags[UserFlags["TeamUser"] = 1024] = "TeamUser"; - UserFlags[UserFlags["BugHunterLevel2"] = 16384] = "BugHunterLevel2"; - UserFlags[UserFlags["VerifiedBot"] = 65536] = "VerifiedBot"; - UserFlags[UserFlags["EarlyVerifiedBotDeveloper"] = 131072] = "EarlyVerifiedBotDeveloper"; - UserFlags[UserFlags["DiscordCertifiedModerator"] = 262144] = "DiscordCertifiedModerator"; - UserFlags[UserFlags["BotHttpInteractions"] = 524288] = "BotHttpInteractions"; -})(UserFlags || (UserFlags = {})); -var ChannelFlags; -(function(ChannelFlags) { - ChannelFlags[ChannelFlags["None"] = 0] = "None"; - ChannelFlags[ChannelFlags["Pinned"] = 2] = "Pinned"; -})(ChannelFlags || (ChannelFlags = {})); -var IntegrationExpireBehaviors; -(function(IntegrationExpireBehaviors) { - IntegrationExpireBehaviors[IntegrationExpireBehaviors["RemoveRole"] = 0] = "RemoveRole"; - IntegrationExpireBehaviors[IntegrationExpireBehaviors["Kick"] = 1] = "Kick"; -})(IntegrationExpireBehaviors || (IntegrationExpireBehaviors = {})); -var VisibilityTypes; -(function(VisibilityTypes) { - VisibilityTypes[VisibilityTypes["None"] = 0] = "None"; - VisibilityTypes[VisibilityTypes["Everyone"] = 1] = "Everyone"; -})(VisibilityTypes || (VisibilityTypes = {})); -var TeamMembershipStates; -(function(TeamMembershipStates) { - TeamMembershipStates[TeamMembershipStates["Invited"] = 1] = "Invited"; - TeamMembershipStates[TeamMembershipStates["Accepted"] = 2] = "Accepted"; -})(TeamMembershipStates || (TeamMembershipStates = {})); -var ApplicationFlags; -(function(ApplicationFlags) { - ApplicationFlags[ApplicationFlags["GatewayPresence"] = 4096] = "GatewayPresence"; - ApplicationFlags[ApplicationFlags["GatewayPresenceLimited"] = 8192] = "GatewayPresenceLimited"; - ApplicationFlags[ApplicationFlags["GatewayGuildMembers"] = 16384] = "GatewayGuildMembers"; - ApplicationFlags[ApplicationFlags["GatewayGuildMembersLimited"] = 32768] = "GatewayGuildMembersLimited"; - ApplicationFlags[ApplicationFlags["VerificationPendingGuildLimit"] = 65536] = "VerificationPendingGuildLimit"; - ApplicationFlags[ApplicationFlags["Embedded"] = 131072] = "Embedded"; - ApplicationFlags[ApplicationFlags["GatewayMessageCount"] = 262144] = "GatewayMessageCount"; - ApplicationFlags[ApplicationFlags["GatewayMessageContentLimited"] = 524288] = "GatewayMessageContentLimited"; -})(ApplicationFlags || (ApplicationFlags = {})); -var MessageComponentTypes; -(function(MessageComponentTypes) { - MessageComponentTypes[MessageComponentTypes["ActionRow"] = 1] = "ActionRow"; - MessageComponentTypes[MessageComponentTypes["Button"] = 2] = "Button"; - MessageComponentTypes[MessageComponentTypes["SelectMenu"] = 3] = "SelectMenu"; - MessageComponentTypes[MessageComponentTypes["InputText"] = 4] = "InputText"; -})(MessageComponentTypes || (MessageComponentTypes = {})); -var TextStyles; -(function(TextStyles) { - TextStyles[TextStyles["Short"] = 1] = "Short"; - TextStyles[TextStyles["Paragraph"] = 2] = "Paragraph"; -})(TextStyles || (TextStyles = {})); -var ButtonStyles; -(function(ButtonStyles) { - ButtonStyles[ButtonStyles["Primary"] = 1] = "Primary"; - ButtonStyles[ButtonStyles["Secondary"] = 2] = "Secondary"; - ButtonStyles[ButtonStyles["Success"] = 3] = "Success"; - ButtonStyles[ButtonStyles["Danger"] = 4] = "Danger"; - ButtonStyles[ButtonStyles["Link"] = 5] = "Link"; -})(ButtonStyles || (ButtonStyles = {})); -var AllowedMentionsTypes; -(function(AllowedMentionsTypes) { - AllowedMentionsTypes["RoleMentions"] = "roles"; - AllowedMentionsTypes["UserMentions"] = "users"; - AllowedMentionsTypes["EveryoneMentions"] = "everyone"; -})(AllowedMentionsTypes || (AllowedMentionsTypes = {})); -var WebhookTypes; -(function(WebhookTypes) { - WebhookTypes[WebhookTypes["Incoming"] = 1] = "Incoming"; - WebhookTypes[WebhookTypes["ChannelFollower"] = 2] = "ChannelFollower"; - WebhookTypes[WebhookTypes["Application"] = 3] = "Application"; -})(WebhookTypes || (WebhookTypes = {})); -var DefaultMessageNotificationLevels; -(function(DefaultMessageNotificationLevels) { - DefaultMessageNotificationLevels[DefaultMessageNotificationLevels["AllMessages"] = 0] = "AllMessages"; - DefaultMessageNotificationLevels[DefaultMessageNotificationLevels["OnlyMentions"] = 1] = "OnlyMentions"; -})(DefaultMessageNotificationLevels || (DefaultMessageNotificationLevels = {})); -var ExplicitContentFilterLevels; -(function(ExplicitContentFilterLevels) { - ExplicitContentFilterLevels[ExplicitContentFilterLevels["Disabled"] = 0] = "Disabled"; - ExplicitContentFilterLevels[ExplicitContentFilterLevels["MembersWithoutRoles"] = 1] = "MembersWithoutRoles"; - ExplicitContentFilterLevels[ExplicitContentFilterLevels["AllMembers"] = 2] = "AllMembers"; -})(ExplicitContentFilterLevels || (ExplicitContentFilterLevels = {})); -var VerificationLevels; -(function(VerificationLevels) { - VerificationLevels[VerificationLevels["None"] = 0] = "None"; - VerificationLevels[VerificationLevels["Low"] = 1] = "Low"; - VerificationLevels[VerificationLevels["Medium"] = 2] = "Medium"; - VerificationLevels[VerificationLevels["High"] = 3] = "High"; - VerificationLevels[VerificationLevels["VeryHigh"] = 4] = "VeryHigh"; -})(VerificationLevels || (VerificationLevels = {})); -var GuildFeatures; -(function(GuildFeatures) { - GuildFeatures["InviteSplash"] = "INVITE_SPLASH"; - GuildFeatures["VipRegions"] = "VIP_REGIONS"; - GuildFeatures["VanityUrl"] = "VANITY_URL"; - GuildFeatures["Verified"] = "VERIFIED"; - GuildFeatures["Partnered"] = "PARTNERED"; - GuildFeatures["Community"] = "COMMUNITY"; - GuildFeatures["Commerce"] = "COMMERCE"; - GuildFeatures["News"] = "NEWS"; - GuildFeatures["Discoverable"] = "DISCOVERABLE"; - GuildFeatures["DiscoverableDisabled"] = "DISCOVERABLE_DISABLED"; - GuildFeatures["Feature"] = "FEATURABLE"; - GuildFeatures["AnimatedIcon"] = "ANIMATED_ICON"; - GuildFeatures["Banner"] = "BANNER"; - GuildFeatures["WelcomeScreenEnabled"] = "WELCOME_SCREEN_ENABLED"; - GuildFeatures["MemberVerificationGateEnabled"] = "MEMBER_VERIFICATION_GATE_ENABLED"; - GuildFeatures["PreviewEnabled"] = "PREVIEW_ENABLED"; - GuildFeatures["TicketedEventsEnabled"] = "TICKETED_EVENTS_ENABLED"; - GuildFeatures["MonetizationEnabled"] = "MONETIZATION_ENABLED"; - GuildFeatures["MoreStickers"] = "MORE_STICKERS"; - GuildFeatures["PrivateThreads"] = "PRIVATE_THREADS"; - GuildFeatures["RoleIcons"] = "ROLE_ICONS"; - GuildFeatures["AutoModeration"] = "AUTO_MODERATION"; -})(GuildFeatures || (GuildFeatures = {})); -var MfaLevels; -(function(MfaLevels) { - MfaLevels[MfaLevels["None"] = 0] = "None"; - MfaLevels[MfaLevels["Elevated"] = 1] = "Elevated"; -})(MfaLevels || (MfaLevels = {})); -var SystemChannelFlags; -(function(SystemChannelFlags) { - SystemChannelFlags[SystemChannelFlags["SuppressJoinNotifications"] = 1] = "SuppressJoinNotifications"; - SystemChannelFlags[SystemChannelFlags["SuppressPremiumSubscriptions"] = 2] = "SuppressPremiumSubscriptions"; - SystemChannelFlags[SystemChannelFlags["SuppressGuildReminderNotifications"] = 4] = "SuppressGuildReminderNotifications"; - SystemChannelFlags[SystemChannelFlags["SuppressJoinNotificationReplies"] = 8] = "SuppressJoinNotificationReplies"; -})(SystemChannelFlags || (SystemChannelFlags = {})); -var PremiumTiers; -(function(PremiumTiers) { - PremiumTiers[PremiumTiers["None"] = 0] = "None"; - PremiumTiers[PremiumTiers["Tier1"] = 1] = "Tier1"; - PremiumTiers[PremiumTiers["Tier2"] = 2] = "Tier2"; - PremiumTiers[PremiumTiers["Tier3"] = 3] = "Tier3"; -})(PremiumTiers || (PremiumTiers = {})); -var GuildNsfwLevel; -(function(GuildNsfwLevel) { - GuildNsfwLevel[GuildNsfwLevel["Default"] = 0] = "Default"; - GuildNsfwLevel[GuildNsfwLevel["Explicit"] = 1] = "Explicit"; - GuildNsfwLevel[GuildNsfwLevel["Safe"] = 2] = "Safe"; - GuildNsfwLevel[GuildNsfwLevel["AgeRestricted"] = 3] = "AgeRestricted"; -})(GuildNsfwLevel || (GuildNsfwLevel = {})); -var ChannelTypes; -(function(ChannelTypes) { - ChannelTypes[ChannelTypes["GuildText"] = 0] = "GuildText"; - ChannelTypes[ChannelTypes["DM"] = 1] = "DM"; - ChannelTypes[ChannelTypes["GuildVoice"] = 2] = "GuildVoice"; - ChannelTypes[ChannelTypes["GroupDm"] = 3] = "GroupDm"; - ChannelTypes[ChannelTypes["GuildCategory"] = 4] = "GuildCategory"; - ChannelTypes[ChannelTypes["GuildNews"] = 5] = "GuildNews"; - ChannelTypes[ChannelTypes["GuildNewsThread"] = 10] = "GuildNewsThread"; - ChannelTypes[ChannelTypes["GuildPublicThread"] = 11] = "GuildPublicThread"; - ChannelTypes[ChannelTypes["GuildPrivateThread"] = 12] = "GuildPrivateThread"; - ChannelTypes[ChannelTypes["GuildStageVoice"] = 13] = "GuildStageVoice"; - ChannelTypes[ChannelTypes["GuildDirectory"] = 14] = "GuildDirectory"; - ChannelTypes[ChannelTypes["GuildForum"] = 15] = "GuildForum"; -})(ChannelTypes || (ChannelTypes = {})); -var OverwriteTypes; -(function(OverwriteTypes) { - OverwriteTypes[OverwriteTypes["Role"] = 0] = "Role"; - OverwriteTypes[OverwriteTypes["Member"] = 1] = "Member"; -})(OverwriteTypes || (OverwriteTypes = {})); -var VideoQualityModes; -(function(VideoQualityModes) { - VideoQualityModes[VideoQualityModes["Auto"] = 1] = "Auto"; - VideoQualityModes[VideoQualityModes["Full"] = 2] = "Full"; -})(VideoQualityModes || (VideoQualityModes = {})); -var ActivityTypes; -(function(ActivityTypes) { - ActivityTypes[ActivityTypes["Game"] = 0] = "Game"; - ActivityTypes[ActivityTypes["Streaming"] = 1] = "Streaming"; - ActivityTypes[ActivityTypes["Listening"] = 2] = "Listening"; - ActivityTypes[ActivityTypes["Watching"] = 3] = "Watching"; - ActivityTypes[ActivityTypes["Custom"] = 4] = "Custom"; - ActivityTypes[ActivityTypes["Competing"] = 5] = "Competing"; -})(ActivityTypes || (ActivityTypes = {})); -var MessageTypes; -(function(MessageTypes) { - MessageTypes[MessageTypes["Default"] = 0] = "Default"; - MessageTypes[MessageTypes["RecipientAdd"] = 1] = "RecipientAdd"; - MessageTypes[MessageTypes["RecipientRemove"] = 2] = "RecipientRemove"; - MessageTypes[MessageTypes["Call"] = 3] = "Call"; - MessageTypes[MessageTypes["ChannelNameChange"] = 4] = "ChannelNameChange"; - MessageTypes[MessageTypes["ChannelIconChange"] = 5] = "ChannelIconChange"; - MessageTypes[MessageTypes["ChannelPinnedMessage"] = 6] = "ChannelPinnedMessage"; - MessageTypes[MessageTypes["GuildMemberJoin"] = 7] = "GuildMemberJoin"; - MessageTypes[MessageTypes["UserPremiumGuildSubscription"] = 8] = "UserPremiumGuildSubscription"; - MessageTypes[MessageTypes["UserPremiumGuildSubscriptionTier1"] = 9] = "UserPremiumGuildSubscriptionTier1"; - MessageTypes[MessageTypes["UserPremiumGuildSubscriptionTier2"] = 10] = "UserPremiumGuildSubscriptionTier2"; - MessageTypes[MessageTypes["UserPremiumGuildSubscriptionTier3"] = 11] = "UserPremiumGuildSubscriptionTier3"; - MessageTypes[MessageTypes["ChannelFollowAdd"] = 12] = "ChannelFollowAdd"; - MessageTypes[MessageTypes["GuildDiscoveryDisqualified"] = 14] = "GuildDiscoveryDisqualified"; - MessageTypes[MessageTypes["GuildDiscoveryRequalified"] = 15] = "GuildDiscoveryRequalified"; - MessageTypes[MessageTypes["GuildDiscoveryGracePeriodInitialWarning"] = 16] = "GuildDiscoveryGracePeriodInitialWarning"; - MessageTypes[MessageTypes["GuildDiscoveryGracePeriodFinalWarning"] = 17] = "GuildDiscoveryGracePeriodFinalWarning"; - MessageTypes[MessageTypes["ThreadCreated"] = 18] = "ThreadCreated"; - MessageTypes[MessageTypes["Reply"] = 19] = "Reply"; - MessageTypes[MessageTypes["ChatInputCommand"] = 20] = "ChatInputCommand"; - MessageTypes[MessageTypes["ThreadStarterMessage"] = 21] = "ThreadStarterMessage"; - MessageTypes[MessageTypes["GuildInviteReminder"] = 22] = "GuildInviteReminder"; - MessageTypes[MessageTypes["ContextMenuCommand"] = 23] = "ContextMenuCommand"; - MessageTypes[MessageTypes["AutoModerationAction"] = 24] = "AutoModerationAction"; -})(MessageTypes || (MessageTypes = {})); -var MessageActivityTypes; -(function(MessageActivityTypes) { - MessageActivityTypes[MessageActivityTypes["Join"] = 1] = "Join"; - MessageActivityTypes[MessageActivityTypes["Spectate"] = 2] = "Spectate"; - MessageActivityTypes[MessageActivityTypes["Listen"] = 3] = "Listen"; - MessageActivityTypes[MessageActivityTypes["JoinRequest"] = 4] = "JoinRequest"; -})(MessageActivityTypes || (MessageActivityTypes = {})); -var StickerTypes; -(function(StickerTypes) { - StickerTypes[StickerTypes["Standard"] = 1] = "Standard"; - StickerTypes[StickerTypes["Guild"] = 2] = "Guild"; -})(StickerTypes || (StickerTypes = {})); -var StickerFormatTypes; -(function(StickerFormatTypes) { - StickerFormatTypes[StickerFormatTypes["Png"] = 1] = "Png"; - StickerFormatTypes[StickerFormatTypes["APng"] = 2] = "APng"; - StickerFormatTypes[StickerFormatTypes["Lottie"] = 3] = "Lottie"; -})(StickerFormatTypes || (StickerFormatTypes = {})); -var InteractionTypes; -(function(InteractionTypes) { - InteractionTypes[InteractionTypes["Ping"] = 1] = "Ping"; - InteractionTypes[InteractionTypes["ApplicationCommand"] = 2] = "ApplicationCommand"; - InteractionTypes[InteractionTypes["MessageComponent"] = 3] = "MessageComponent"; - InteractionTypes[InteractionTypes["ApplicationCommandAutocomplete"] = 4] = "ApplicationCommandAutocomplete"; - InteractionTypes[InteractionTypes["ModalSubmit"] = 5] = "ModalSubmit"; -})(InteractionTypes || (InteractionTypes = {})); -var ApplicationCommandOptionTypes; -(function(ApplicationCommandOptionTypes) { - ApplicationCommandOptionTypes[ApplicationCommandOptionTypes["SubCommand"] = 1] = "SubCommand"; - ApplicationCommandOptionTypes[ApplicationCommandOptionTypes["SubCommandGroup"] = 2] = "SubCommandGroup"; - ApplicationCommandOptionTypes[ApplicationCommandOptionTypes["String"] = 3] = "String"; - ApplicationCommandOptionTypes[ApplicationCommandOptionTypes["Integer"] = 4] = "Integer"; - ApplicationCommandOptionTypes[ApplicationCommandOptionTypes["Boolean"] = 5] = "Boolean"; - ApplicationCommandOptionTypes[ApplicationCommandOptionTypes["User"] = 6] = "User"; - ApplicationCommandOptionTypes[ApplicationCommandOptionTypes["Channel"] = 7] = "Channel"; - ApplicationCommandOptionTypes[ApplicationCommandOptionTypes["Role"] = 8] = "Role"; - ApplicationCommandOptionTypes[ApplicationCommandOptionTypes["Mentionable"] = 9] = "Mentionable"; - ApplicationCommandOptionTypes[ApplicationCommandOptionTypes["Number"] = 10] = "Number"; - ApplicationCommandOptionTypes[ApplicationCommandOptionTypes["Attachment"] = 11] = "Attachment"; -})(ApplicationCommandOptionTypes || (ApplicationCommandOptionTypes = {})); -var AuditLogEvents; -(function(AuditLogEvents) { - AuditLogEvents[AuditLogEvents["GuildUpdate"] = 1] = "GuildUpdate"; - AuditLogEvents[AuditLogEvents["ChannelCreate"] = 10] = "ChannelCreate"; - AuditLogEvents[AuditLogEvents["ChannelUpdate"] = 11] = "ChannelUpdate"; - AuditLogEvents[AuditLogEvents["ChannelDelete"] = 12] = "ChannelDelete"; - AuditLogEvents[AuditLogEvents["ChannelOverwriteCreate"] = 13] = "ChannelOverwriteCreate"; - AuditLogEvents[AuditLogEvents["ChannelOverwriteUpdate"] = 14] = "ChannelOverwriteUpdate"; - AuditLogEvents[AuditLogEvents["ChannelOverwriteDelete"] = 15] = "ChannelOverwriteDelete"; - AuditLogEvents[AuditLogEvents["MemberKick"] = 20] = "MemberKick"; - AuditLogEvents[AuditLogEvents["MemberPrune"] = 21] = "MemberPrune"; - AuditLogEvents[AuditLogEvents["MemberBanAdd"] = 22] = "MemberBanAdd"; - AuditLogEvents[AuditLogEvents["MemberBanRemove"] = 23] = "MemberBanRemove"; - AuditLogEvents[AuditLogEvents["MemberUpdate"] = 24] = "MemberUpdate"; - AuditLogEvents[AuditLogEvents["MemberRoleUpdate"] = 25] = "MemberRoleUpdate"; - AuditLogEvents[AuditLogEvents["MemberMove"] = 26] = "MemberMove"; - AuditLogEvents[AuditLogEvents["MemberDisconnect"] = 27] = "MemberDisconnect"; - AuditLogEvents[AuditLogEvents["BotAdd"] = 28] = "BotAdd"; - AuditLogEvents[AuditLogEvents["RoleCreate"] = 30] = "RoleCreate"; - AuditLogEvents[AuditLogEvents["RoleUpdate"] = 31] = "RoleUpdate"; - AuditLogEvents[AuditLogEvents["RoleDelete"] = 32] = "RoleDelete"; - AuditLogEvents[AuditLogEvents["InviteCreate"] = 40] = "InviteCreate"; - AuditLogEvents[AuditLogEvents["InviteUpdate"] = 41] = "InviteUpdate"; - AuditLogEvents[AuditLogEvents["InviteDelete"] = 42] = "InviteDelete"; - AuditLogEvents[AuditLogEvents["WebhookCreate"] = 50] = "WebhookCreate"; - AuditLogEvents[AuditLogEvents["WebhookUpdate"] = 51] = "WebhookUpdate"; - AuditLogEvents[AuditLogEvents["WebhookDelete"] = 52] = "WebhookDelete"; - AuditLogEvents[AuditLogEvents["EmojiCreate"] = 60] = "EmojiCreate"; - AuditLogEvents[AuditLogEvents["EmojiUpdate"] = 61] = "EmojiUpdate"; - AuditLogEvents[AuditLogEvents["EmojiDelete"] = 62] = "EmojiDelete"; - AuditLogEvents[AuditLogEvents["MessageDelete"] = 72] = "MessageDelete"; - AuditLogEvents[AuditLogEvents["MessageBulkDelete"] = 73] = "MessageBulkDelete"; - AuditLogEvents[AuditLogEvents["MessagePin"] = 74] = "MessagePin"; - AuditLogEvents[AuditLogEvents["MessageUnpin"] = 75] = "MessageUnpin"; - AuditLogEvents[AuditLogEvents["IntegrationCreate"] = 80] = "IntegrationCreate"; - AuditLogEvents[AuditLogEvents["IntegrationUpdate"] = 81] = "IntegrationUpdate"; - AuditLogEvents[AuditLogEvents["IntegrationDelete"] = 82] = "IntegrationDelete"; - AuditLogEvents[AuditLogEvents["StageInstanceCreate"] = 83] = "StageInstanceCreate"; - AuditLogEvents[AuditLogEvents["StageInstanceUpdate"] = 84] = "StageInstanceUpdate"; - AuditLogEvents[AuditLogEvents["StageInstanceDelete"] = 85] = "StageInstanceDelete"; - AuditLogEvents[AuditLogEvents["StickerCreate"] = 90] = "StickerCreate"; - AuditLogEvents[AuditLogEvents["StickerUpdate"] = 91] = "StickerUpdate"; - AuditLogEvents[AuditLogEvents["StickerDelete"] = 92] = "StickerDelete"; - AuditLogEvents[AuditLogEvents["GuildScheduledEventCreate"] = 100] = "GuildScheduledEventCreate"; - AuditLogEvents[AuditLogEvents["GuildScheduledEventUpdate"] = 101] = "GuildScheduledEventUpdate"; - AuditLogEvents[AuditLogEvents["GuildScheduledEventDelete"] = 102] = "GuildScheduledEventDelete"; - AuditLogEvents[AuditLogEvents["ThreadCreate"] = 110] = "ThreadCreate"; - AuditLogEvents[AuditLogEvents["ThreadUpdate"] = 111] = "ThreadUpdate"; - AuditLogEvents[AuditLogEvents["ThreadDelete"] = 112] = "ThreadDelete"; - AuditLogEvents[AuditLogEvents["ApplicationCommandPermissionUpdate"] = 121] = "ApplicationCommandPermissionUpdate"; - AuditLogEvents[AuditLogEvents["AutoModerationRuleCreate"] = 140] = "AutoModerationRuleCreate"; - AuditLogEvents[AuditLogEvents["AutoModerationRuleUpdate"] = 141] = "AutoModerationRuleUpdate"; - AuditLogEvents[AuditLogEvents["AutoModerationRuleDelete"] = 142] = "AutoModerationRuleDelete"; - AuditLogEvents[AuditLogEvents["AutoModerationBlockMessage"] = 143] = "AutoModerationBlockMessage"; -})(AuditLogEvents || (AuditLogEvents = {})); -var ScheduledEventPrivacyLevel; -(function(ScheduledEventPrivacyLevel) { - ScheduledEventPrivacyLevel[ScheduledEventPrivacyLevel["GuildOnly"] = 2] = "GuildOnly"; -})(ScheduledEventPrivacyLevel || (ScheduledEventPrivacyLevel = {})); -var ScheduledEventEntityType; -(function(ScheduledEventEntityType) { - ScheduledEventEntityType[ScheduledEventEntityType["StageInstance"] = 1] = "StageInstance"; - ScheduledEventEntityType[ScheduledEventEntityType["Voice"] = 2] = "Voice"; - ScheduledEventEntityType[ScheduledEventEntityType["External"] = 3] = "External"; -})(ScheduledEventEntityType || (ScheduledEventEntityType = {})); -var ScheduledEventStatus; -(function(ScheduledEventStatus) { - ScheduledEventStatus[ScheduledEventStatus["Scheduled"] = 1] = "Scheduled"; - ScheduledEventStatus[ScheduledEventStatus["Active"] = 2] = "Active"; - ScheduledEventStatus[ScheduledEventStatus["Completed"] = 3] = "Completed"; - ScheduledEventStatus[ScheduledEventStatus["Canceled"] = 4] = "Canceled"; -})(ScheduledEventStatus || (ScheduledEventStatus = {})); -var TargetTypes; -(function(TargetTypes) { - TargetTypes[TargetTypes["Stream"] = 1] = "Stream"; - TargetTypes[TargetTypes["EmbeddedApplication"] = 2] = "EmbeddedApplication"; -})(TargetTypes || (TargetTypes = {})); -var ApplicationCommandTypes; -(function(ApplicationCommandTypes) { - ApplicationCommandTypes[ApplicationCommandTypes["ChatInput"] = 1] = "ChatInput"; - ApplicationCommandTypes[ApplicationCommandTypes["User"] = 2] = "User"; - ApplicationCommandTypes[ApplicationCommandTypes["Message"] = 3] = "Message"; -})(ApplicationCommandTypes || (ApplicationCommandTypes = {})); -var ApplicationCommandPermissionTypes; -(function(ApplicationCommandPermissionTypes) { - ApplicationCommandPermissionTypes[ApplicationCommandPermissionTypes["Role"] = 1] = "Role"; - ApplicationCommandPermissionTypes[ApplicationCommandPermissionTypes["User"] = 2] = "User"; - ApplicationCommandPermissionTypes[ApplicationCommandPermissionTypes["Channel"] = 3] = "Channel"; -})(ApplicationCommandPermissionTypes || (ApplicationCommandPermissionTypes = {})); -var ActivityFlags; -(function(ActivityFlags) { - ActivityFlags[ActivityFlags["Instance"] = 1] = "Instance"; - ActivityFlags[ActivityFlags["Join"] = 2] = "Join"; - ActivityFlags[ActivityFlags["Spectate"] = 4] = "Spectate"; - ActivityFlags[ActivityFlags["JoinRequest"] = 8] = "JoinRequest"; - ActivityFlags[ActivityFlags["Sync"] = 16] = "Sync"; - ActivityFlags[ActivityFlags["Play"] = 32] = "Play"; - ActivityFlags[ActivityFlags["PartyPrivacyFriends"] = 64] = "PartyPrivacyFriends"; - ActivityFlags[ActivityFlags["PartyPrivacyVoiceChannel"] = 128] = "PartyPrivacyVoiceChannel"; - ActivityFlags[ActivityFlags["Embedded"] = 256] = "Embedded"; -})(ActivityFlags || (ActivityFlags = {})); -var BitwisePermissionFlags; -(function(BitwisePermissionFlags) { - BitwisePermissionFlags[BitwisePermissionFlags["CREATE_INSTANT_INVITE"] = 0x0000000000000001] = "CREATE_INSTANT_INVITE"; - BitwisePermissionFlags[BitwisePermissionFlags["KICK_MEMBERS"] = 0x0000000000000002] = "KICK_MEMBERS"; - BitwisePermissionFlags[BitwisePermissionFlags["BAN_MEMBERS"] = 0x0000000000000004] = "BAN_MEMBERS"; - BitwisePermissionFlags[BitwisePermissionFlags["ADMINISTRATOR"] = 0x0000000000000008] = "ADMINISTRATOR"; - BitwisePermissionFlags[BitwisePermissionFlags["MANAGE_CHANNELS"] = 0x0000000000000010] = "MANAGE_CHANNELS"; - BitwisePermissionFlags[BitwisePermissionFlags["MANAGE_GUILD"] = 0x0000000000000020] = "MANAGE_GUILD"; - BitwisePermissionFlags[BitwisePermissionFlags["ADD_REACTIONS"] = 0x0000000000000040] = "ADD_REACTIONS"; - BitwisePermissionFlags[BitwisePermissionFlags["VIEW_AUDIT_LOG"] = 0x0000000000000080] = "VIEW_AUDIT_LOG"; - BitwisePermissionFlags[BitwisePermissionFlags["PRIORITY_SPEAKER"] = 0x0000000000000100] = "PRIORITY_SPEAKER"; - BitwisePermissionFlags[BitwisePermissionFlags["STREAM"] = 0x0000000000000200] = "STREAM"; - BitwisePermissionFlags[BitwisePermissionFlags["VIEW_CHANNEL"] = 0x0000000000000400] = "VIEW_CHANNEL"; - BitwisePermissionFlags[BitwisePermissionFlags["SEND_MESSAGES"] = 0x0000000000000800] = "SEND_MESSAGES"; - BitwisePermissionFlags[BitwisePermissionFlags["SEND_TTS_MESSAGES"] = 0x0000000000001000] = "SEND_TTS_MESSAGES"; - BitwisePermissionFlags[BitwisePermissionFlags["MANAGE_MESSAGES"] = 0x0000000000002000] = "MANAGE_MESSAGES"; - BitwisePermissionFlags[BitwisePermissionFlags["EMBED_LINKS"] = 0x0000000000004000] = "EMBED_LINKS"; - BitwisePermissionFlags[BitwisePermissionFlags["ATTACH_FILES"] = 0x0000000000008000] = "ATTACH_FILES"; - BitwisePermissionFlags[BitwisePermissionFlags["READ_MESSAGE_HISTORY"] = 0x0000000000010000] = "READ_MESSAGE_HISTORY"; - BitwisePermissionFlags[BitwisePermissionFlags["MENTION_EVERYONE"] = 0x0000000000020000] = "MENTION_EVERYONE"; - BitwisePermissionFlags[BitwisePermissionFlags["USE_EXTERNAL_EMOJIS"] = 0x0000000000040000] = "USE_EXTERNAL_EMOJIS"; - BitwisePermissionFlags[BitwisePermissionFlags["VIEW_GUILD_INSIGHTS"] = 0x0000000000080000] = "VIEW_GUILD_INSIGHTS"; - BitwisePermissionFlags[BitwisePermissionFlags["CONNECT"] = 0x0000000000100000] = "CONNECT"; - BitwisePermissionFlags[BitwisePermissionFlags["SPEAK"] = 0x0000000000200000] = "SPEAK"; - BitwisePermissionFlags[BitwisePermissionFlags["MUTE_MEMBERS"] = 0x0000000000400000] = "MUTE_MEMBERS"; - BitwisePermissionFlags[BitwisePermissionFlags["DEAFEN_MEMBERS"] = 0x0000000000800000] = "DEAFEN_MEMBERS"; - BitwisePermissionFlags[BitwisePermissionFlags["MOVE_MEMBERS"] = 0x0000000001000000] = "MOVE_MEMBERS"; - BitwisePermissionFlags[BitwisePermissionFlags["USE_VAD"] = 0x0000000002000000] = "USE_VAD"; - BitwisePermissionFlags[BitwisePermissionFlags["CHANGE_NICKNAME"] = 0x0000000004000000] = "CHANGE_NICKNAME"; - BitwisePermissionFlags[BitwisePermissionFlags["MANAGE_NICKNAMES"] = 0x0000000008000000] = "MANAGE_NICKNAMES"; - BitwisePermissionFlags[BitwisePermissionFlags["MANAGE_ROLES"] = 0x0000000010000000] = "MANAGE_ROLES"; - BitwisePermissionFlags[BitwisePermissionFlags["MANAGE_WEBHOOKS"] = 0x0000000020000000] = "MANAGE_WEBHOOKS"; - BitwisePermissionFlags[BitwisePermissionFlags["MANAGE_EMOJIS"] = 0x0000000040000000] = "MANAGE_EMOJIS"; - BitwisePermissionFlags[BitwisePermissionFlags["USE_SLASH_COMMANDS"] = 0x0000000080000000] = "USE_SLASH_COMMANDS"; - BitwisePermissionFlags[BitwisePermissionFlags["REQUEST_TO_SPEAK"] = 0x0000000100000000] = "REQUEST_TO_SPEAK"; - BitwisePermissionFlags[BitwisePermissionFlags["MANAGE_EVENTS"] = 0x0000000200000000] = "MANAGE_EVENTS"; - BitwisePermissionFlags[BitwisePermissionFlags["MANAGE_THREADS"] = 0x0000000400000000] = "MANAGE_THREADS"; - BitwisePermissionFlags[BitwisePermissionFlags["CREATE_PUBLIC_THREADS"] = 0x0000000800000000] = "CREATE_PUBLIC_THREADS"; - BitwisePermissionFlags[BitwisePermissionFlags["CREATE_PRIVATE_THREADS"] = 0x0000001000000000] = "CREATE_PRIVATE_THREADS"; - BitwisePermissionFlags[BitwisePermissionFlags["USE_EXTERNAL_STICKERS"] = 0x0000002000000000] = "USE_EXTERNAL_STICKERS"; - BitwisePermissionFlags[BitwisePermissionFlags["SEND_MESSAGES_IN_THREADS"] = 0x0000004000000000] = "SEND_MESSAGES_IN_THREADS"; - BitwisePermissionFlags[BitwisePermissionFlags["USE_EMBEDDED_ACTIVITIES"] = 0x0000008000000000] = "USE_EMBEDDED_ACTIVITIES"; - BitwisePermissionFlags[BitwisePermissionFlags["MODERATE_MEMBERS"] = 0x0000010000000000] = "MODERATE_MEMBERS"; -})(BitwisePermissionFlags || (BitwisePermissionFlags = {})); -var VoiceOpcodes; -(function(VoiceOpcodes) { - VoiceOpcodes[VoiceOpcodes["Identify"] = 0] = "Identify"; - VoiceOpcodes[VoiceOpcodes["SelectProtocol"] = 1] = "SelectProtocol"; - VoiceOpcodes[VoiceOpcodes["Ready"] = 2] = "Ready"; - VoiceOpcodes[VoiceOpcodes["Heartbeat"] = 3] = "Heartbeat"; - VoiceOpcodes[VoiceOpcodes["SessionDescription"] = 4] = "SessionDescription"; - VoiceOpcodes[VoiceOpcodes["Speaking"] = 5] = "Speaking"; - VoiceOpcodes[VoiceOpcodes["HeartbeatACK"] = 6] = "HeartbeatACK"; - VoiceOpcodes[VoiceOpcodes["Resume"] = 7] = "Resume"; - VoiceOpcodes[VoiceOpcodes["Hello"] = 8] = "Hello"; - VoiceOpcodes[VoiceOpcodes["Resumed"] = 9] = "Resumed"; - VoiceOpcodes[VoiceOpcodes["ClientDisconnect"] = 13] = "ClientDisconnect"; -})(VoiceOpcodes || (VoiceOpcodes = {})); -var VoiceCloseEventCodes; -(function(VoiceCloseEventCodes) { - VoiceCloseEventCodes[VoiceCloseEventCodes["UnknownOpcode"] = 4001] = "UnknownOpcode"; - VoiceCloseEventCodes[VoiceCloseEventCodes["FailedToDecodePayload"] = 4002] = "FailedToDecodePayload"; - VoiceCloseEventCodes[VoiceCloseEventCodes["NotAuthenticated"] = 4003] = "NotAuthenticated"; - VoiceCloseEventCodes[VoiceCloseEventCodes["AuthenticationFailed"] = 4004] = "AuthenticationFailed"; - VoiceCloseEventCodes[VoiceCloseEventCodes["AlreadyAuthenticated"] = 4005] = "AlreadyAuthenticated"; - VoiceCloseEventCodes[VoiceCloseEventCodes["SessionNoLongerValid"] = 4006] = "SessionNoLongerValid"; - VoiceCloseEventCodes[VoiceCloseEventCodes["SessionTimedOut"] = 4009] = "SessionTimedOut"; - VoiceCloseEventCodes[VoiceCloseEventCodes["ServerNotFound"] = 4011] = "ServerNotFound"; - VoiceCloseEventCodes[VoiceCloseEventCodes["UnknownProtocol"] = 4012] = "UnknownProtocol"; - VoiceCloseEventCodes[VoiceCloseEventCodes["Disconnect"] = 4014] = "Disconnect"; - VoiceCloseEventCodes[VoiceCloseEventCodes["VoiceServerCrashed"] = 4015] = "VoiceServerCrashed"; - VoiceCloseEventCodes[VoiceCloseEventCodes["UnknownEncryptionMode"] = 4016] = "UnknownEncryptionMode"; -})(VoiceCloseEventCodes || (VoiceCloseEventCodes = {})); -var RpcErrorCodes; -(function(RpcErrorCodes) { - RpcErrorCodes[RpcErrorCodes["UnknownError"] = 1000] = "UnknownError"; - RpcErrorCodes[RpcErrorCodes["InvalidPayload"] = 4000] = "InvalidPayload"; - RpcErrorCodes[RpcErrorCodes["InvalidCommand"] = 4002] = "InvalidCommand"; - RpcErrorCodes[RpcErrorCodes["InvalidGuild"] = 4003] = "InvalidGuild"; - RpcErrorCodes[RpcErrorCodes["InvalidEvent"] = 4004] = "InvalidEvent"; - RpcErrorCodes[RpcErrorCodes["InvalidChannel"] = 4005] = "InvalidChannel"; - RpcErrorCodes[RpcErrorCodes["InvalidPermissions"] = 4006] = "InvalidPermissions"; - RpcErrorCodes[RpcErrorCodes["InvalidClientId"] = 4007] = "InvalidClientId"; - RpcErrorCodes[RpcErrorCodes["InvalidOrigin"] = 4008] = "InvalidOrigin"; - RpcErrorCodes[RpcErrorCodes["InvalidToken"] = 4009] = "InvalidToken"; - RpcErrorCodes[RpcErrorCodes["InvalidUser"] = 4010] = "InvalidUser"; - RpcErrorCodes[RpcErrorCodes["OAuth2Error"] = 5000] = "OAuth2Error"; - RpcErrorCodes[RpcErrorCodes["SelectChannelTimedOut"] = 5001] = "SelectChannelTimedOut"; - RpcErrorCodes[RpcErrorCodes["GetGuildTimedOut"] = 5002] = "GetGuildTimedOut"; - RpcErrorCodes[RpcErrorCodes["SelectVoiceForceRequired"] = 5003] = "SelectVoiceForceRequired"; - RpcErrorCodes[RpcErrorCodes["CaptureShortcutAlreadyListening"] = 5004] = "CaptureShortcutAlreadyListening"; -})(RpcErrorCodes || (RpcErrorCodes = {})); -var RpcCloseEventCodes; -(function(RpcCloseEventCodes) { - RpcCloseEventCodes[RpcCloseEventCodes["InvalidClientId"] = 4000] = "InvalidClientId"; - RpcCloseEventCodes[RpcCloseEventCodes["InvalidOrigin"] = 4001] = "InvalidOrigin"; - RpcCloseEventCodes[RpcCloseEventCodes["RateLimited"] = 4002] = "RateLimited"; - RpcCloseEventCodes[RpcCloseEventCodes["TokenRevoked"] = 4003] = "TokenRevoked"; - RpcCloseEventCodes[RpcCloseEventCodes["InvalidVersion"] = 4004] = "InvalidVersion"; - RpcCloseEventCodes[RpcCloseEventCodes["InvalidEncoding"] = 4005] = "InvalidEncoding"; -})(RpcCloseEventCodes || (RpcCloseEventCodes = {})); -var HTTPResponseCodes; -(function(HTTPResponseCodes) { - HTTPResponseCodes[HTTPResponseCodes["Ok"] = 200] = "Ok"; - HTTPResponseCodes[HTTPResponseCodes["Created"] = 201] = "Created"; - HTTPResponseCodes[HTTPResponseCodes["NoContent"] = 204] = "NoContent"; - HTTPResponseCodes[HTTPResponseCodes["NotModified"] = 304] = "NotModified"; - HTTPResponseCodes[HTTPResponseCodes["BadRequest"] = 400] = "BadRequest"; - HTTPResponseCodes[HTTPResponseCodes["Unauthorized"] = 401] = "Unauthorized"; - HTTPResponseCodes[HTTPResponseCodes["Forbidden"] = 403] = "Forbidden"; - HTTPResponseCodes[HTTPResponseCodes["NotFound"] = 404] = "NotFound"; - HTTPResponseCodes[HTTPResponseCodes["MethodNotAllowed"] = 405] = "MethodNotAllowed"; - HTTPResponseCodes[HTTPResponseCodes["TooManyRequests"] = 429] = "TooManyRequests"; - HTTPResponseCodes[HTTPResponseCodes["GatewayUnavailable"] = 502] = "GatewayUnavailable"; -})(HTTPResponseCodes || (HTTPResponseCodes = {})); -var GatewayCloseEventCodes; -(function(GatewayCloseEventCodes) { - GatewayCloseEventCodes[GatewayCloseEventCodes["NormalClosure"] = 1000] = "NormalClosure"; - GatewayCloseEventCodes[GatewayCloseEventCodes["UnknownError"] = 4000] = "UnknownError"; - GatewayCloseEventCodes[GatewayCloseEventCodes["UnknownOpcode"] = 4001] = "UnknownOpcode"; - GatewayCloseEventCodes[GatewayCloseEventCodes["DecodeError"] = 4002] = "DecodeError"; - GatewayCloseEventCodes[GatewayCloseEventCodes["NotAuthenticated"] = 4003] = "NotAuthenticated"; - GatewayCloseEventCodes[GatewayCloseEventCodes["AuthenticationFailed"] = 4004] = "AuthenticationFailed"; - GatewayCloseEventCodes[GatewayCloseEventCodes["AlreadyAuthenticated"] = 4005] = "AlreadyAuthenticated"; - GatewayCloseEventCodes[GatewayCloseEventCodes["InvalidSeq"] = 4007] = "InvalidSeq"; - GatewayCloseEventCodes[GatewayCloseEventCodes["RateLimited"] = 4008] = "RateLimited"; - GatewayCloseEventCodes[GatewayCloseEventCodes["SessionTimedOut"] = 4009] = "SessionTimedOut"; - GatewayCloseEventCodes[GatewayCloseEventCodes["InvalidShard"] = 4010] = "InvalidShard"; - GatewayCloseEventCodes[GatewayCloseEventCodes["ShardingRequired"] = 4011] = "ShardingRequired"; - GatewayCloseEventCodes[GatewayCloseEventCodes["InvalidApiVersion"] = 4012] = "InvalidApiVersion"; - GatewayCloseEventCodes[GatewayCloseEventCodes["InvalidIntents"] = 4013] = "InvalidIntents"; - GatewayCloseEventCodes[GatewayCloseEventCodes["DisallowedIntents"] = 4014] = "DisallowedIntents"; -})(GatewayCloseEventCodes || (GatewayCloseEventCodes = {})); -var InviteTargetTypes; -(function(InviteTargetTypes) { - InviteTargetTypes[InviteTargetTypes["Stream"] = 1] = "Stream"; - InviteTargetTypes[InviteTargetTypes["EmbeddedApplication"] = 2] = "EmbeddedApplication"; -})(InviteTargetTypes || (InviteTargetTypes = {})); -var GatewayOpcodes; -(function(GatewayOpcodes) { - GatewayOpcodes[GatewayOpcodes["Dispatch"] = 0] = "Dispatch"; - GatewayOpcodes[GatewayOpcodes["Heartbeat"] = 1] = "Heartbeat"; - GatewayOpcodes[GatewayOpcodes["Identify"] = 2] = "Identify"; - GatewayOpcodes[GatewayOpcodes["PresenceUpdate"] = 3] = "PresenceUpdate"; - GatewayOpcodes[GatewayOpcodes["VoiceStateUpdate"] = 4] = "VoiceStateUpdate"; - GatewayOpcodes[GatewayOpcodes["Resume"] = 6] = "Resume"; - GatewayOpcodes[GatewayOpcodes["Reconnect"] = 7] = "Reconnect"; - GatewayOpcodes[GatewayOpcodes["RequestGuildMembers"] = 8] = "RequestGuildMembers"; - GatewayOpcodes[GatewayOpcodes["InvalidSession"] = 9] = "InvalidSession"; - GatewayOpcodes[GatewayOpcodes["Hello"] = 10] = "Hello"; - GatewayOpcodes[GatewayOpcodes["HeartbeatACK"] = 11] = "HeartbeatACK"; -})(GatewayOpcodes || (GatewayOpcodes = {})); -var GatewayIntents; -(function(GatewayIntents) { - GatewayIntents[GatewayIntents["Guilds"] = 1] = "Guilds"; - GatewayIntents[GatewayIntents["GuildMembers"] = 2] = "GuildMembers"; - GatewayIntents[GatewayIntents["GuildBans"] = 4] = "GuildBans"; - GatewayIntents[GatewayIntents["GuildEmojis"] = 8] = "GuildEmojis"; - GatewayIntents[GatewayIntents["GuildIntegrations"] = 16] = "GuildIntegrations"; - GatewayIntents[GatewayIntents["GuildWebhooks"] = 32] = "GuildWebhooks"; - GatewayIntents[GatewayIntents["GuildInvites"] = 64] = "GuildInvites"; - GatewayIntents[GatewayIntents["GuildVoiceStates"] = 128] = "GuildVoiceStates"; - GatewayIntents[GatewayIntents["GuildPresences"] = 256] = "GuildPresences"; - GatewayIntents[GatewayIntents["GuildMessages"] = 512] = "GuildMessages"; - GatewayIntents[GatewayIntents["GuildMessageReactions"] = 1024] = "GuildMessageReactions"; - GatewayIntents[GatewayIntents["GuildMessageTyping"] = 2048] = "GuildMessageTyping"; - GatewayIntents[GatewayIntents["DirectMessages"] = 4096] = "DirectMessages"; - GatewayIntents[GatewayIntents["DirectMessageReactions"] = 8192] = "DirectMessageReactions"; - GatewayIntents[GatewayIntents["DirectMessageTyping"] = 16384] = "DirectMessageTyping"; - GatewayIntents[GatewayIntents["MessageContent"] = 32768] = "MessageContent"; - GatewayIntents[GatewayIntents["GuildScheduledEvents"] = 65536] = "GuildScheduledEvents"; - GatewayIntents[GatewayIntents["AutoModerationConfiguration"] = 1048576] = "AutoModerationConfiguration"; - GatewayIntents[GatewayIntents["AutoModerationExecution"] = 2097152] = "AutoModerationExecution"; -})(GatewayIntents || (GatewayIntents = {})); -var InteractionResponseTypes; -(function(InteractionResponseTypes) { - InteractionResponseTypes[InteractionResponseTypes["Pong"] = 1] = "Pong"; - InteractionResponseTypes[InteractionResponseTypes["ChannelMessageWithSource"] = 4] = "ChannelMessageWithSource"; - InteractionResponseTypes[InteractionResponseTypes["DeferredChannelMessageWithSource"] = 5] = "DeferredChannelMessageWithSource"; - InteractionResponseTypes[InteractionResponseTypes["DeferredUpdateMessage"] = 6] = "DeferredUpdateMessage"; - InteractionResponseTypes[InteractionResponseTypes["UpdateMessage"] = 7] = "UpdateMessage"; - InteractionResponseTypes[InteractionResponseTypes["ApplicationCommandAutocompleteResult"] = 8] = "ApplicationCommandAutocompleteResult"; - InteractionResponseTypes[InteractionResponseTypes["Modal"] = 9] = "Modal"; -})(InteractionResponseTypes || (InteractionResponseTypes = {})); -var Errors; -(function(Errors) { - Errors["BOTS_HIGHEST_ROLE_TOO_LOW"] = "BOTS_HIGHEST_ROLE_TOO_LOW"; - Errors["CHANNEL_NOT_FOUND"] = "CHANNEL_NOT_FOUND"; - Errors["CHANNEL_NOT_IN_GUILD"] = "CHANNEL_NOT_IN_GUILD"; - Errors["CHANNEL_NOT_TEXT_BASED"] = "CHANNEL_NOT_TEXT_BASED"; - Errors["CHANNEL_NOT_STAGE_VOICE"] = "CHANNEL_NOT_STAGE_VOICE"; - Errors["MESSAGE_MAX_LENGTH"] = "MESSAGE_MAX_LENGTH"; - Errors["RULES_CHANNEL_CANNOT_BE_DELETED"] = "RULES_CHANNEL_CANNOT_BE_DELETED"; - Errors["UPDATES_CHANNEL_CANNOT_BE_DELETED"] = "UPDATES_CHANNEL_CANNOT_BE_DELETED"; - Errors["INVALID_TOPIC_LENGTH"] = "INVALID_TOPIC_LENGTH"; - Errors["GUILD_NOT_DISCOVERABLE"] = "GUILD_NOT_DISCOVERABLE"; - Errors["GUILD_WIDGET_NOT_ENABLED"] = "GUILD_WIDGET_NOT_ENABLED"; - Errors["GUILD_NOT_FOUND"] = "GUILD_NOT_FOUND"; - Errors["MEMBER_NOT_FOUND"] = "MEMBER_NOT_FOUND"; - Errors["MEMBER_NOT_IN_VOICE_CHANNEL"] = "MEMBER_NOT_IN_VOICE_CHANNEL"; - Errors["MEMBER_SEARCH_LIMIT_TOO_HIGH"] = "MEMBER_SEARCH_LIMIT_TOO_HIGH"; - Errors["MEMBER_SEARCH_LIMIT_TOO_LOW"] = "MEMBER_SEARCH_LIMIT_TOO_LOW"; - Errors["PRUNE_MAX_DAYS"] = "PRUNE_MAX_DAYS"; - Errors["ROLE_NOT_FOUND"] = "ROLE_NOT_FOUND"; - Errors["INVALID_THREAD_PARENT_CHANNEL_TYPE"] = "INVALID_THREAD_PARENT_CHANNEL_TYPE"; - Errors["GUILD_NEWS_CHANNEL_ONLY_SUPPORT_PUBLIC_THREADS"] = "GUILD_NEWS_CHANNEL_ONLY_SUPPORT_PUBLIC_THREADS"; - Errors["NOT_A_THREAD_CHANNEL"] = "NOT_A_THREAD_CHANNEL"; - Errors["MISSING_MANAGE_THREADS_AND_NOT_MEMBER"] = "MISSING_MANAGE_THREADS_AND_NOT_MEMBER"; - Errors["CANNOT_GET_MEMBERS_OF_AN_UNJOINED_PRIVATE_THREAD"] = "CANNOT_GET_MEMBERS_OF_AN_UNJOINED_PRIVATE_THREAD"; - Errors["HAVE_TO_BE_THE_CREATOR_OF_THE_THREAD_OR_HAVE_MANAGE_THREADS_TO_REMOVE_MEMBERS"] = "HAVE_TO_BE_THE_CREATOR_OF_THE_THREAD_OR_HAVE_MANAGE_THREADS_TO_REMOVE_MEMBERS"; - Errors["INVALID_GET_MESSAGES_LIMIT"] = "INVALID_GET_MESSAGES_LIMIT"; - Errors["DELETE_MESSAGES_MIN"] = "DELETE_MESSAGES_MIN"; - Errors["PRUNE_MIN_DAYS"] = "PRUNE_MIN_DAYS"; - Errors["INVALID_SLASH_DESCRIPTION"] = "INVALID_SLASH_DESCRIPTION"; - Errors["INVALID_SLASH_NAME"] = "INVALID_SLASH_NAME"; - Errors["INVALID_SLASH_OPTIONS"] = "INVALID_SLASH_OPTIONS"; - Errors["INVALID_SLASH_OPTIONS_CHOICES"] = "INVALID_SLASH_OPTIONS_CHOICES"; - Errors["TOO_MANY_SLASH_OPTIONS"] = "TOO_MANY_SLASH_OPTIONS"; - Errors["INVALID_SLASH_OPTION_CHOICE_NAME"] = "INVALID_SLASH_OPTION_CHOICE_NAME"; - Errors["INVALID_SLASH_OPTIONS_CHOICE_VALUE_TYPE"] = "INVALID_SLASH_OPTIONS_CHOICE_VALUE_TYPE"; - Errors["TOO_MANY_SLASH_OPTION_CHOICES"] = "TOO_MANY_SLASH_OPTION_CHOICES"; - Errors["ONLY_STRING_OR_INTEGER_OPTIONS_CAN_HAVE_CHOICES"] = "ONLY_STRING_OR_INTEGER_OPTIONS_CAN_HAVE_CHOICES"; - Errors["INVALID_SLASH_OPTION_NAME"] = "INVALID_SLASH_OPTION_NAME"; - Errors["INVALID_SLASH_OPTION_DESCRIPTION"] = "INVALID_SLASH_OPTION_DESCRIPTION"; - Errors["INVALID_CONTEXT_MENU_COMMAND_NAME"] = "INVALID_CONTEXT_MENU_COMMAND_NAME"; - Errors["INVALID_CONTEXT_MENU_COMMAND_DESCRIPTION"] = "INVALID_CONTEXT_MENU_COMMAND_DESCRIPTION"; - Errors["INVALID_WEBHOOK_NAME"] = "INVALID_WEBHOOK_NAME"; - Errors["INVALID_WEBHOOK_OPTIONS"] = "INVALID_WEBHOOK_OPTIONS"; - Errors["MISSING_ADD_REACTIONS"] = "MISSING_ADD_REACTIONS"; - Errors["MISSING_ADMINISTRATOR"] = "MISSING_ADMINISTRATOR"; - Errors["MISSING_ATTACH_FILES"] = "MISSING_ATTACH_FILES"; - Errors["MISSING_BAN_MEMBERS"] = "MISSING_BAN_MEMBERS"; - Errors["MISSING_CHANGE_NICKNAME"] = "MISSING_CHANGE_NICKNAME"; - Errors["MISSING_CONNECT"] = "MISSING_CONNECT"; - Errors["MISSING_CREATE_INSTANT_INVITE"] = "MISSING_CREATE_INSTANT_INVITE"; - Errors["MISSING_DEAFEN_MEMBERS"] = "MISSING_DEAFEN_MEMBERS"; - Errors["MISSING_EMBED_LINKS"] = "MISSING_EMBED_LINKS"; - Errors["MISSING_INTENT_GUILD_MEMBERS"] = "MISSING_INTENT_GUILD_MEMBERS"; - Errors["MISSING_KICK_MEMBERS"] = "MISSING_KICK_MEMBERS"; - Errors["MISSING_MANAGE_CHANNELS"] = "MISSING_MANAGE_CHANNELS"; - Errors["MISSING_MANAGE_EMOJIS"] = "MISSING_MANAGE_EMOJIS"; - Errors["MISSING_MANAGE_GUILD"] = "MISSING_MANAGE_GUILD"; - Errors["MISSING_MANAGE_MESSAGES"] = "MISSING_MANAGE_MESSAGES"; - Errors["MISSING_MANAGE_NICKNAMES"] = "MISSING_MANAGE_NICKNAMES"; - Errors["MISSING_MANAGE_ROLES"] = "MISSING_MANAGE_ROLES"; - Errors["MISSING_MANAGE_WEBHOOKS"] = "MISSING_MANAGE_WEBHOOKS"; - Errors["MISSING_MENTION_EVERYONE"] = "MISSING_MENTION_EVERYONE"; - Errors["MISSING_MOVE_MEMBERS"] = "MISSING_MOVE_MEMBERS"; - Errors["MISSING_MUTE_MEMBERS"] = "MISSING_MUTE_MEMBERS"; - Errors["MISSING_PRIORITY_SPEAKER"] = "MISSING_PRIORITY_SPEAKER"; - Errors["MISSING_READ_MESSAGE_HISTORY"] = "MISSING_READ_MESSAGE_HISTORY"; - Errors["MISSING_SEND_MESSAGES"] = "MISSING_SEND_MESSAGES"; - Errors["MISSING_SEND_TTS_MESSAGES"] = "MISSING_SEND_TTS_MESSAGES"; - Errors["MISSING_SPEAK"] = "MISSING_SPEAK"; - Errors["MISSING_STREAM"] = "MISSING_STREAM"; - Errors["MISSING_USE_VAD"] = "MISSING_USE_VAD"; - Errors["MISSING_USE_EXTERNAL_EMOJIS"] = "MISSING_USE_EXTERNAL_EMOJIS"; - Errors["MISSING_VIEW_AUDIT_LOG"] = "MISSING_VIEW_AUDIT_LOG"; - Errors["MISSING_VIEW_CHANNEL"] = "MISSING_VIEW_CHANNEL"; - Errors["MISSING_VIEW_GUILD_INSIGHTS"] = "MISSING_VIEW_GUILD_INSIGHTS"; - Errors["NICKNAMES_MAX_LENGTH"] = "NICKNAMES_MAX_LENGTH"; - Errors["USERNAME_INVALID_CHARACTER"] = "USERNAME_INVALID_CHARACTER"; - Errors["USERNAME_INVALID_USERNAME"] = "USERNAME_INVALID_USERNAME"; - Errors["USERNAME_MAX_LENGTH"] = "USERNAME_MAX_LENGTH"; - Errors["USERNAME_MIN_LENGTH"] = "USERNAME_MIN_LENGTH"; - Errors["NONCE_TOO_LONG"] = "NONCE_TOO_LONG"; - Errors["INVITE_MAX_AGE_INVALID"] = "INVITE_MAX_AGE_INVALID"; - Errors["INVITE_MAX_USES_INVALID"] = "INVITE_MAX_USES_INVALID"; - Errors["RATE_LIMIT_RETRY_MAXED"] = "RATE_LIMIT_RETRY_MAXED"; - Errors["REQUEST_CLIENT_ERROR"] = "REQUEST_CLIENT_ERROR"; - Errors["REQUEST_SERVER_ERROR"] = "REQUEST_SERVER_ERROR"; - Errors["REQUEST_UNKNOWN_ERROR"] = "REQUEST_UNKNOWN_ERROR"; - Errors["TOO_MANY_COMPONENTS"] = "TOO_MANY_COMPONENTS"; - Errors["TOO_MANY_ACTION_ROWS"] = "TOO_MANY_ACTION_ROWS"; - Errors["LINK_BUTTON_CANNOT_HAVE_CUSTOM_ID"] = "LINK_BUTTON_CANNOT_HAVE_CUSTOM_ID"; - Errors["COMPONENT_LABEL_TOO_BIG"] = "COMPONENT_LABEL_TOO_BIG"; - Errors["COMPONENT_CUSTOM_ID_TOO_BIG"] = "COMPONENT_CUSTOM_ID_TOO_BIG"; - Errors["BUTTON_REQUIRES_CUSTOM_ID"] = "BUTTON_REQUIRES_CUSTOM_ID"; - Errors["COMPONENT_SELECT_MUST_BE_ALONE"] = "COMPONENT_SELECT_MUST_BE_ALONE"; - Errors["COMPONENT_PLACEHOLDER_TOO_BIG"] = "COMPONENT_PLACEHOLDER_TOO_BIG"; - Errors["COMPONENT_SELECT_MIN_VALUE_TOO_LOW"] = "COMPONENT_SELECT_MIN_VALUE_TOO_LOW"; - Errors["COMPONENT_SELECT_MIN_VALUE_TOO_MANY"] = "COMPONENT_SELECT_MIN_VALUE_TOO_MANY"; - Errors["COMPONENT_SELECT_MAX_VALUE_TOO_LOW"] = "COMPONENT_SELECT_MAX_VALUE_TOO_LOW"; - Errors["COMPONENT_SELECT_MAX_VALUE_TOO_MANY"] = "COMPONENT_SELECT_MAX_VALUE_TOO_MANY"; - Errors["COMPONENT_SELECT_OPTIONS_TOO_LOW"] = "COMPONENT_SELECT_OPTIONS_TOO_LOW"; - Errors["COMPONENT_SELECT_OPTIONS_TOO_MANY"] = "COMPONENT_SELECT_OPTIONS_TOO_MANY"; - Errors["SELECT_OPTION_LABEL_TOO_BIG"] = "SELECT_OPTION_LABEL_TOO_BIG"; - Errors["SELECT_OPTION_VALUE_TOO_BIG"] = "SELECT_OPTION_VALUE_TOO_BIG"; - Errors["SELECT_OPTION_TOO_MANY_DEFAULTS"] = "SELECT_OPTION_TOO_MANY_DEFAULTS"; - Errors["COMPONENT_SELECT_MIN_HIGHER_THAN_MAX"] = "COMPONENT_SELECT_MIN_HIGHER_THAN_MAX"; - Errors["CANNOT_ADD_USER_TO_ARCHIVED_THREADS"] = "CANNOT_ADD_USER_TO_ARCHIVED_THREADS"; - Errors["CANNOT_LEAVE_ARCHIVED_THREAD"] = "CANNOT_LEAVE_ARCHIVED_THREAD"; - Errors["CANNOT_REMOVE_FROM_ARCHIVED_THREAD"] = "CANNOT_REMOVE_FROM_ARCHIVED_THREAD"; - Errors["YOU_CAN_NOT_DM_THE_BOT_ITSELF"] = "YOU_CAN_NOT_DM_THE_BOT_ITSELF"; -})(Errors || (Errors = {})); -var Locales; -(function(Locales) { - Locales["Danish"] = "da"; - Locales["German"] = "de"; - Locales["EnglishUk"] = "en-GB"; - Locales["EnglishUs"] = "en-US"; - Locales["Spanish"] = "es-ES"; - Locales["French"] = "fr"; - Locales["Croatian"] = "hr"; - Locales["Italian"] = "it"; - Locales["Lithuanian"] = "lt"; - Locales["Hungarian"] = "hu"; - Locales["Dutch"] = "nl"; - Locales["Norwegian"] = "no"; - Locales["Polish"] = "pl"; - Locales["PortugueseBrazilian"] = "pt-BR"; - Locales["RomanianRomania"] = "ro"; - Locales["Finnish"] = "fi"; - Locales["Swedish"] = "sv-SE"; - Locales["Vietnamese"] = "vi"; - Locales["Turkish"] = "tr"; - Locales["Czech"] = "cs"; - Locales["Greek"] = "el"; - Locales["Bulgarian"] = "bg"; - Locales["Russian"] = "ru"; - Locales["Ukrainian"] = "uk"; - Locales["Hindi"] = "hi"; - Locales["Thai"] = "th"; - Locales["ChineseChina"] = "zh-CN"; - Locales["Japanese"] = "ja"; - Locales["ChineseTaiwan"] = "zh-TW"; - Locales["Korean"] = "ko"; -})(Locales || (Locales = {})); -const GATEWAY_RATE_LIMIT_RESET_INTERVAL = 60_000; -var ShardState; -(function(ShardState) { - ShardState[ShardState["Connected"] = 0] = "Connected"; - ShardState[ShardState["Connecting"] = 1] = "Connecting"; - ShardState[ShardState["Disconnected"] = 2] = "Disconnected"; - ShardState[ShardState["Unidentified"] = 3] = "Unidentified"; - ShardState[ShardState["Identifying"] = 4] = "Identifying"; - ShardState[ShardState["Resuming"] = 5] = "Resuming"; - ShardState[ShardState["Offline"] = 6] = "Offline"; -})(ShardState || (ShardState = {})); -var ShardSocketCloseCodes; -(function(ShardSocketCloseCodes) { - ShardSocketCloseCodes[ShardSocketCloseCodes["Shutdown"] = 3000] = "Shutdown"; - ShardSocketCloseCodes[ShardSocketCloseCodes["ResumeClosingOldConnection"] = 3024] = "ResumeClosingOldConnection"; - ShardSocketCloseCodes[ShardSocketCloseCodes["ZombiedConnection"] = 3010] = "ZombiedConnection"; - ShardSocketCloseCodes[ShardSocketCloseCodes["TestingFinished"] = 3064] = "TestingFinished"; - ShardSocketCloseCodes[ShardSocketCloseCodes["Resharded"] = 3065] = "Resharded"; - ShardSocketCloseCodes[ShardSocketCloseCodes["ReIdentifying"] = 3066] = "ReIdentifying"; -})(ShardSocketCloseCodes || (ShardSocketCloseCodes = {})); -async function identify(shard) { - if (shard.state === ShardState.Connected) { - shard.close(ShardSocketCloseCodes.ReIdentifying, "Re-identifying closure of old connection."); - } - shard.state = ShardState.Identifying; - shard.events.identifying?.(shard); - if (!shard.isOpen()) { - await shard.connect(); - } - await shard.requestIdentify(); - shard.send({ - op: GatewayOpcodes.Identify, - d: { - token: `Bot ${shard.gatewayConfig.token}`, - compress: shard.gatewayConfig.compress, - properties: shard.gatewayConfig.properties, - intents: shard.gatewayConfig.intents, - shard: [ - shard.id, - shard.totalShards - ], - presence: await shard.makePresence?.(shard.id) - } - }, true); - return new Promise((resolve)=>{ - shard.resolves.set("READY", ()=>{ - shard.events.identified?.(shard); - resolve(); - }); - shard.resolves.set("INVALID_SESSION", ()=>{ - shard.resolves.delete("READY"); - resolve(); - }); - }); -} -const BTYPE = Object.freeze({ - UNCOMPRESSED: 0, - FIXED: 1, - DYNAMIC: 2 -}); -const LENGTH_EXTRA_BIT_LEN = [ - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 1, - 1, - 1, - 1, - 2, - 2, - 2, - 2, - 3, - 3, - 3, - 3, - 4, - 4, - 4, - 4, - 5, - 5, - 5, - 5, - 0, -]; -const LENGTH_EXTRA_BIT_BASE = [ - 3, - 4, - 5, - 6, - 7, - 8, - 9, - 10, - 11, - 13, - 15, - 17, - 19, - 23, - 27, - 31, - 35, - 43, - 51, - 59, - 67, - 83, - 99, - 115, - 131, - 163, - 195, - 227, - 258, -]; -const DISTANCE_EXTRA_BIT_BASE = [ - 1, - 2, - 3, - 4, - 5, - 7, - 9, - 13, - 17, - 25, - 33, - 49, - 65, - 97, - 129, - 193, - 257, - 385, - 513, - 769, - 1025, - 1537, - 2049, - 3073, - 4097, - 6145, - 8193, - 12289, - 16385, - 24577, -]; -const DISTANCE_EXTRA_BIT_LEN = [ - 0, - 0, - 0, - 0, - 1, - 1, - 2, - 2, - 3, - 3, - 4, - 4, - 5, - 5, - 6, - 6, - 7, - 7, - 8, - 8, - 9, - 9, - 10, - 10, - 11, - 11, - 12, - 12, - 13, - 13, -]; -const CODELEN_VALUES = [ - 16, - 17, - 18, - 0, - 8, - 7, - 9, - 6, - 10, - 5, - 11, - 4, - 12, - 3, - 13, - 2, - 14, - 1, - 15, -]; -function generateHuffmanTable(codelenValues) { - const codelens = Object.keys(codelenValues); - let codelen = 0; - let codelenMax = 0; - let codelenMin = Number.MAX_SAFE_INTEGER; - codelens.forEach((key)=>{ - codelen = Number(key); - if (codelenMax < codelen) codelenMax = codelen; - if (codelenMin > codelen) codelenMin = codelen; - }); - let code = 0; - let values; - const bitlenTables = {}; - for(let bitlen = codelenMin; bitlen <= codelenMax; bitlen++){ - values = codelenValues[bitlen]; - if (values === undefined) values = []; - values.sort((a, b)=>{ - if (a < b) return -1; - if (a > b) return 1; - return 0; - }); - const table = {}; - values.forEach((value)=>{ - table[code] = value; - code++; - }); - bitlenTables[bitlen] = table; - code <<= 1; - } - return bitlenTables; -} -function makeFixedHuffmanCodelenValues() { - const codelenValues = {}; - codelenValues[7] = []; - codelenValues[8] = []; - codelenValues[9] = []; - for(let i = 0; i <= 287; i++){ - i <= 143 ? codelenValues[8].push(i) : i <= 255 ? codelenValues[9].push(i) : i <= 279 ? codelenValues[7].push(i) : codelenValues[8].push(i); - } - return codelenValues; -} -class BitReadStream { - buffer; - bufferIndex; - nowBits; - nowBitsLength = 0; - isEnd = false; - constructor(buffer, offset = 0){ - this.buffer = buffer; - this.bufferIndex = offset; - this.nowBits = buffer[offset]; - this.nowBitsLength = 8; - } - read() { - if (this.isEnd) throw new Error("Lack of data length"); - const bit = this.nowBits & 1; - if (this.nowBitsLength > 1) { - this.nowBitsLength--; - this.nowBits >>= 1; - } else { - this.bufferIndex++; - if (this.bufferIndex < this.buffer.length) { - this.nowBits = this.buffer[this.bufferIndex]; - this.nowBitsLength = 8; - } else { - this.nowBitsLength = 0; - this.isEnd = true; - } - } - return bit; - } - readRange(length) { - while(this.nowBitsLength <= length){ - this.nowBits |= this.buffer[++this.bufferIndex] << this.nowBitsLength; - this.nowBitsLength += 8; - } - const bits = this.nowBits & (1 << length) - 1; - this.nowBits >>>= length; - this.nowBitsLength -= length; - return bits; - } - readRangeCoded(length) { - let bits = 0; - for(let i = 0; i < length; i++){ - bits <<= 1; - bits |= this.read(); - } - return bits; - } -} -class Uint8WriteStream { - index = 0; - buffer; - length; - _extendedSize; - constructor(extendedSize){ - this.buffer = new Uint8Array(extendedSize); - this.length = extendedSize; - this._extendedSize = extendedSize; - } - write(value) { - if (this.length <= this.index) { - this.length += this._extendedSize; - const newBuffer = new Uint8Array(this.length); - const nowSize = this.buffer.length; - for(let i = 0; i < nowSize; i++){ - newBuffer[i] = this.buffer[i]; - } - this.buffer = newBuffer; - } - this.buffer[this.index] = value; - this.index++; - } -} -const FIXED_HUFFMAN_TABLE = generateHuffmanTable(makeFixedHuffmanCodelenValues()); -function inflate(input, offset = 0) { - const buffer = new Uint8WriteStream(input.length * 10); - const stream = new BitReadStream(input, offset); - let bFinal = 0; - let bType = 0; - while(bFinal !== 1){ - bFinal = stream.readRange(1); - bType = stream.readRange(2); - if (bType === BTYPE.UNCOMPRESSED) { - inflateUncompressedBlock(stream, buffer); - } else if (bType === BTYPE.FIXED) { - inflateFixedBlock(stream, buffer); - } else if (bType === BTYPE.DYNAMIC) { - inflateDynamicBlock(stream, buffer); - } else { - throw new Error("Not supported BTYPE : " + bType); - } - if (bFinal === 0 && stream.isEnd) { - throw new Error("Data length is insufficient"); - } - } - return buffer.buffer.subarray(0, buffer.index); -} -function inflateUncompressedBlock(stream, buffer) { - if (stream.nowBitsLength < 8) { - stream.readRange(stream.nowBitsLength); - } - const LEN = stream.readRange(8) | stream.readRange(8) << 8; - const NLEN = stream.readRange(8) | stream.readRange(8) << 8; - if (LEN + NLEN !== 65535) { - throw new Error("Data is corrupted"); - } - for(let i = 0; i < LEN; i++){ - buffer.write(stream.readRange(8)); - } -} -function inflateFixedBlock(stream, buffer) { - const tables = FIXED_HUFFMAN_TABLE; - const codelens = Object.keys(tables); - let codelen = 0; - let codelenMax = 0; - let codelenMin = Number.MAX_SAFE_INTEGER; - codelens.forEach((key)=>{ - codelen = Number(key); - if (codelenMax < codelen) codelenMax = codelen; - if (codelenMin > codelen) codelenMin = codelen; - }); - let code = 0; - let value; - let repeatLengthCode; - let repeatLengthValue; - let repeatLengthExt; - let repeatDistanceCode; - let repeatDistanceValue; - let repeatDistanceExt; - let repeatStartIndex; - while(!stream.isEnd){ - value = undefined; - codelen = codelenMin; - code = stream.readRangeCoded(codelenMin); - while(true){ - value = tables[codelen][code]; - if (value !== undefined) { - break; - } - if (codelenMax <= codelen) { - throw new Error("Data is corrupted"); - } - codelen++; - code <<= 1; - code |= stream.read(); - } - if (value < 256) { - buffer.write(value); - continue; - } - if (value === 256) { - break; - } - repeatLengthCode = value - 257; - repeatLengthValue = LENGTH_EXTRA_BIT_BASE[repeatLengthCode]; - repeatLengthExt = LENGTH_EXTRA_BIT_LEN[repeatLengthCode]; - if (0 < repeatLengthExt) { - repeatLengthValue += stream.readRange(repeatLengthExt); - } - repeatDistanceCode = stream.readRangeCoded(5); - repeatDistanceValue = DISTANCE_EXTRA_BIT_BASE[repeatDistanceCode]; - repeatDistanceExt = DISTANCE_EXTRA_BIT_LEN[repeatDistanceCode]; - if (0 < repeatDistanceExt) { - repeatDistanceValue += stream.readRange(repeatDistanceExt); - } - repeatStartIndex = buffer.index - repeatDistanceValue; - for(let i = 0; i < repeatLengthValue; i++){ - buffer.write(buffer.buffer[repeatStartIndex + i]); - } - } -} -function inflateDynamicBlock(stream, buffer) { - const HLIT = stream.readRange(5) + 257; - const HDIST = stream.readRange(5) + 1; - const HCLEN = stream.readRange(4) + 4; - let codelenCodelen = 0; - const codelenCodelenValues = {}; - for(let i = 0; i < HCLEN; i++){ - codelenCodelen = stream.readRange(3); - if (codelenCodelen === 0) { - continue; - } - if (!codelenCodelenValues[codelenCodelen]) { - codelenCodelenValues[codelenCodelen] = []; - } - codelenCodelenValues[codelenCodelen].push(CODELEN_VALUES[i]); - } - const codelenHuffmanTables = generateHuffmanTable(codelenCodelenValues); - const codelenCodelens = Object.keys(codelenHuffmanTables); - let codelenCodelenMax = 0; - let codelenCodelenMin = Number.MAX_SAFE_INTEGER; - codelenCodelens.forEach((key)=>{ - codelenCodelen = Number(key); - if (codelenCodelenMax < codelenCodelen) codelenCodelenMax = codelenCodelen; - if (codelenCodelenMin > codelenCodelen) codelenCodelenMin = codelenCodelen; - }); - const dataCodelenValues = {}; - const distanceCodelenValues = {}; - let codelenCode = 0; - let runlengthCode; - let repeat = 0; - let codelen = 0; - const codesNumber = HLIT + HDIST; - for(let i1 = 0; i1 < codesNumber;){ - runlengthCode = undefined; - codelenCodelen = codelenCodelenMin; - codelenCode = stream.readRangeCoded(codelenCodelenMin); - while(true){ - runlengthCode = codelenHuffmanTables[codelenCodelen][codelenCode]; - if (runlengthCode !== undefined) { - break; - } - if (codelenCodelenMax <= codelenCodelen) { - throw new Error("Data is corrupted"); - } - codelenCodelen++; - codelenCode <<= 1; - codelenCode |= stream.read(); - } - if (runlengthCode === 16) { - repeat = 3 + stream.readRange(2); - } else if (runlengthCode === 17) { - repeat = 3 + stream.readRange(3); - codelen = 0; - } else if (runlengthCode === 18) { - repeat = 11 + stream.readRange(7); - codelen = 0; - } else { - repeat = 1; - codelen = runlengthCode; - } - if (codelen <= 0) { - i1 += repeat; - } else { - while(repeat){ - if (i1 < HLIT) { - if (!dataCodelenValues[codelen]) { - dataCodelenValues[codelen] = []; - } - dataCodelenValues[codelen].push(i1++); - } else { - if (!distanceCodelenValues[codelen]) { - distanceCodelenValues[codelen] = []; - } - distanceCodelenValues[codelen].push((i1++) - HLIT); - } - repeat--; - } - } - } - const dataHuffmanTables = generateHuffmanTable(dataCodelenValues); - const distanceHuffmanTables = generateHuffmanTable(distanceCodelenValues); - const dataCodelens = Object.keys(dataHuffmanTables); - let dataCodelen = 0; - let dataCodelenMax = 0; - let dataCodelenMin = Number.MAX_SAFE_INTEGER; - dataCodelens.forEach((key)=>{ - dataCodelen = Number(key); - if (dataCodelenMax < dataCodelen) dataCodelenMax = dataCodelen; - if (dataCodelenMin > dataCodelen) dataCodelenMin = dataCodelen; - }); - const distanceCodelens = Object.keys(distanceHuffmanTables); - let distanceCodelen = 0; - let distanceCodelenMax = 0; - let distanceCodelenMin = Number.MAX_SAFE_INTEGER; - distanceCodelens.forEach((key)=>{ - distanceCodelen = Number(key); - if (distanceCodelenMax < distanceCodelen) { - distanceCodelenMax = distanceCodelen; - } - if (distanceCodelenMin > distanceCodelen) { - distanceCodelenMin = distanceCodelen; - } - }); - let dataCode = 0; - let data; - let repeatLengthCode; - let repeatLengthValue; - let repeatLengthExt; - let repeatDistanceCode; - let repeatDistanceValue; - let repeatDistanceExt; - let repeatDistanceCodeCodelen; - let repeatDistanceCodeCode; - let repeatStartIndex; - while(!stream.isEnd){ - data = undefined; - dataCodelen = dataCodelenMin; - dataCode = stream.readRangeCoded(dataCodelenMin); - while(true){ - data = dataHuffmanTables[dataCodelen][dataCode]; - if (data !== undefined) { - break; - } - if (dataCodelenMax <= dataCodelen) { - throw new Error("Data is corrupted"); - } - dataCodelen++; - dataCode <<= 1; - dataCode |= stream.read(); - } - if (data < 256) { - buffer.write(data); - continue; - } - if (data === 256) { - break; - } - repeatLengthCode = data - 257; - repeatLengthValue = LENGTH_EXTRA_BIT_BASE[repeatLengthCode]; - repeatLengthExt = LENGTH_EXTRA_BIT_LEN[repeatLengthCode]; - if (0 < repeatLengthExt) { - repeatLengthValue += stream.readRange(repeatLengthExt); - } - repeatDistanceCode = undefined; - repeatDistanceCodeCodelen = distanceCodelenMin; - repeatDistanceCodeCode = stream.readRangeCoded(distanceCodelenMin); - while(true){ - repeatDistanceCode = distanceHuffmanTables[repeatDistanceCodeCodelen][repeatDistanceCodeCode]; - if (repeatDistanceCode !== undefined) { - break; - } - if (distanceCodelenMax <= repeatDistanceCodeCodelen) { - throw new Error("Data is corrupted"); - } - repeatDistanceCodeCodelen++; - repeatDistanceCodeCode <<= 1; - repeatDistanceCodeCode |= stream.read(); - } - repeatDistanceValue = DISTANCE_EXTRA_BIT_BASE[repeatDistanceCode]; - repeatDistanceExt = DISTANCE_EXTRA_BIT_LEN[repeatDistanceCode]; - if (0 < repeatDistanceExt) { - repeatDistanceValue += stream.readRange(repeatDistanceExt); - } - repeatStartIndex = buffer.index - repeatDistanceValue; - for(let i2 = 0; i2 < repeatLengthValue; i2++){ - buffer.write(buffer.buffer[repeatStartIndex + i2]); - } - } -} -function inflate1(input) { - const stream = new BitReadStream(input); - const CM = stream.readRange(4); - if (CM !== 8) { - throw new Error("Not compressed by deflate"); - } - stream.readRange(4); - stream.readRange(5); - stream.readRange(1); - stream.readRange(2); - return inflate(input, 2); -} -const decoder = new TextDecoder(); -async function handleMessage(shard, message_) { - let message = message_.data; - if (shard.gatewayConfig.compress && message instanceof Blob) { - message = decoder.decode(inflate1(new Uint8Array(await message.arrayBuffer()))); - } - if (typeof message !== "string") return; - const messageData = JSON.parse(message); - switch(messageData.op){ - case GatewayOpcodes.Heartbeat: - { - if (!shard.isOpen()) return; - shard.heart.lastBeat = Date.now(); - shard.socket?.send(JSON.stringify({ - op: GatewayOpcodes.Heartbeat, - d: shard.previousSequenceNumber - })); - shard.events.heartbeat?.(shard); - break; - } - case GatewayOpcodes.Hello: - { - const interval = messageData.d.heartbeat_interval; - shard.startHeartbeating(interval); - if (shard.state !== ShardState.Resuming) { - shard.bucket = createLeakyBucket({ - max: shard.calculateSafeRequests(), - refillInterval: GATEWAY_RATE_LIMIT_RESET_INTERVAL, - refillAmount: shard.calculateSafeRequests(), - waiting: shard.bucket.waiting - }); - } - shard.events.hello?.(shard); - break; - } - case GatewayOpcodes.HeartbeatACK: - { - shard.heart.acknowledged = true; - shard.heart.lastAck = Date.now(); - if (shard.heart.lastBeat) { - shard.heart.rtt = shard.heart.lastAck - shard.heart.lastBeat; - } - shard.events.heartbeatAck?.(shard); - break; - } - case GatewayOpcodes.Reconnect: - { - shard.events.requestedReconnect?.(shard); - await shard.resume(); - break; - } - case GatewayOpcodes.InvalidSession: - { - const resumable = messageData.d; - shard.events.invalidSession?.(shard, resumable); - await delay(Math.floor((Math.random() * 4 + 1) * 1000)); - shard.resolves.get("INVALID_SESSION")?.(messageData); - shard.resolves.delete("INVALID_SESSION"); - if (!resumable) { - await shard.identify(); - break; - } - await shard.resume(); - break; - } - } - if (messageData.t === "RESUMED") { - shard.state = ShardState.Connected; - shard.events.resumed?.(shard); - shard.offlineSendQueue.map((resolve)=>resolve()); - shard.resolves.get("RESUMED")?.(messageData); - shard.resolves.delete("RESUMED"); - } else if (messageData.t === "READY") { - const payload = messageData.d; - shard.sessionId = payload.session_id; - shard.state = ShardState.Connected; - shard.offlineSendQueue.map((resolve)=>resolve()); - shard.resolves.get("READY")?.(messageData); - shard.resolves.delete("READY"); - } - if (messageData.s !== null) { - shard.previousSequenceNumber = messageData.s; - } - shard.events.message?.(shard, messageData); -} -function startHeartbeating(shard, interval) { - shard.heart.interval = interval; - if ([ - ShardState.Disconnected, - ShardState.Offline - ].includes(shard.state)) { - shard.state = ShardState.Unidentified; - } - const jitter = Math.ceil(shard.heart.interval * (Math.random() || 0.5)); - shard.heart.timeoutId = setTimeout(()=>{ - shard.socket?.send(JSON.stringify({ - op: GatewayOpcodes.Heartbeat, - d: shard.previousSequenceNumber - })); - shard.heart.lastBeat = Date.now(); - shard.heart.acknowledged = false; - shard.heart.intervalId = setInterval(async ()=>{ - if (!shard.heart.acknowledged) { - shard.close(ShardSocketCloseCodes.ZombiedConnection, "Zombied connection, did not receive an heartbeat ACK in time."); - return await shard.identify(); - } - shard.heart.acknowledged = false; - shard.socket?.send(JSON.stringify({ - op: GatewayOpcodes.Heartbeat, - d: shard.previousSequenceNumber - })); - shard.heart.lastBeat = Date.now(); - shard.events.heartbeat?.(shard); - }, shard.heart.interval); - }, jitter); -} -function stopHeartbeating(shard) { - clearInterval(shard.heart.intervalId); - clearTimeout(shard.heart.timeoutId); -} -async function resume(shard) { - if (shard.isOpen()) { - shard.close(ShardSocketCloseCodes.ResumeClosingOldConnection, "Reconnecting the shard, closing old connection."); - } - if (!shard.sessionId) { - return await shard.identify(); - } - shard.state = ShardState.Resuming; - await shard.connect(); - shard.send({ - op: GatewayOpcodes.Resume, - d: { - token: `Bot ${shard.gatewayConfig.token}`, - session_id: shard.sessionId, - seq: shard.previousSequenceNumber ?? 0 - } - }, true); - return new Promise((resolve)=>{ - shard.resolves.set("RESUMED", ()=>resolve()); - shard.resolves.set("INVALID_SESSION", ()=>{ - shard.resolves.delete("RESUMED"); - resolve(); - }); - }); -} -function calculateSafeRequests(shard) { - const safeRequests = shard.maxRequestsPerRateLimitTick - Math.ceil(shard.rateLimitResetInterval / shard.heart.interval) * 2; - return safeRequests < 0 ? 0 : safeRequests; -} -async function checkOffline(shard, highPriority) { - if (!shard.isOpen()) { - await new Promise((resolve)=>{ - if (highPriority) { - shard.offlineSendQueue.unshift(resolve); - } else { - shard.offlineSendQueue.push(resolve); - } - }); - } -} -async function send(shard, message, highPriority) { - await checkOffline(shard, highPriority); - await shard.bucket.acquire(1, highPriority); - await checkOffline(shard, highPriority); - shard.socket?.send(JSON.stringify(message)); -} -async function handleClose(shard, close) { - shard.stopHeartbeating(); - switch(close.code){ - case ShardSocketCloseCodes.TestingFinished: - { - shard.state = ShardState.Offline; - shard.events.disconnected?.(shard); - return; - } - case ShardSocketCloseCodes.Shutdown: - case ShardSocketCloseCodes.ReIdentifying: - case ShardSocketCloseCodes.Resharded: - case ShardSocketCloseCodes.ResumeClosingOldConnection: - case ShardSocketCloseCodes.ZombiedConnection: - { - shard.state = ShardState.Disconnected; - shard.events.disconnected?.(shard); - return; - } - case GatewayCloseEventCodes.UnknownOpcode: - case GatewayCloseEventCodes.NotAuthenticated: - case GatewayCloseEventCodes.InvalidSeq: - case GatewayCloseEventCodes.RateLimited: - case GatewayCloseEventCodes.SessionTimedOut: - { - shard.state = ShardState.Identifying; - shard.events.disconnected?.(shard); - return await shard.identify(); - } - case GatewayCloseEventCodes.AuthenticationFailed: - case GatewayCloseEventCodes.InvalidShard: - case GatewayCloseEventCodes.ShardingRequired: - case GatewayCloseEventCodes.InvalidApiVersion: - case GatewayCloseEventCodes.InvalidIntents: - case GatewayCloseEventCodes.DisallowedIntents: - { - shard.state = ShardState.Offline; - shard.events.disconnected?.(shard); - throw new Error(close.reason || "Discord gave no reason! GG! You broke Discord!"); - } - case GatewayCloseEventCodes.UnknownError: - case GatewayCloseEventCodes.DecodeError: - case GatewayCloseEventCodes.AlreadyAuthenticated: - default: - { - shard.state = ShardState.Resuming; - shard.events.disconnected?.(shard); - return await shard.resume(); - } - } -} -async function connect(shard) { - let gotHello = false; - if (![ - ShardState.Identifying, - ShardState.Resuming - ].includes(shard.state)) { - shard.state = ShardState.Connecting; - } - shard.events.connecting?.(shard); - const socket = new WebSocket(`${shard.gatewayConfig.url}/?v=${shard.gatewayConfig.version}&encoding=json`); - shard.socket = socket; - socket.onerror = (event)=>console.log({ - error: event - }); - socket.onclose = (event)=>shard.handleClose(event); - socket.onmessage = (message)=>{ - gotHello = true; - shard.handleMessage(message); - }; - return new Promise((resolve)=>{ - socket.onopen = ()=>{ - setTimeout(()=>{ - if (!gotHello) { - shard.handleMessage({ - data: JSON.stringify({ - t: null, - s: null, - op: 10, - d: { - heartbeat_interval: 41250 - } - }) - }); - } - }, 250); - if (![ - ShardState.Identifying, - ShardState.Resuming - ].includes(shard.state)) { - shard.state = ShardState.Unidentified; - } - shard.events.connected?.(shard); - resolve(); - }; - }); -} -function close(shard, code, reason) { - if (shard.socket?.readyState !== WebSocket.OPEN) return; - return shard.socket?.close(code, reason); -} -async function shutdown(shard) { - shard.close(ShardSocketCloseCodes.Shutdown, "Shard shutting down."); - shard.state = ShardState.Offline; -} -function isOpen(shard) { - return shard.socket?.readyState === WebSocket.OPEN; -} -const BASE_URL = "https://discord.com/api"; -const DISCORDENO_VERSION = "13.0.0-rc45"; -const USER_AGENT = `DiscordBot (https://github.com/discordeno/discordeno, v${DISCORDENO_VERSION})`; -const IMAGE_BASE_URL = "https://cdn.discordapp.com"; -const baseEndpoints = { - BASE_URL: `${BASE_URL}/v${10}`, - CDN_URL: IMAGE_BASE_URL -}; -function createShard(options) { - const calculateSafeRequestsOverwritten = options.calculateSafeRequests ?? calculateSafeRequests; - const closeOverwritten = options.close ?? close; - const connectOverwritten = options.connect ?? connect; - const identifyOverwritten = options.identify ?? identify; - const sendOverwritten = options.send ?? send; - const shutdownOverwritten = options.shutdown ?? shutdown; - const resumeOverwritten = options.resume ?? resume; - const handleCloseOverwritten = options.handleClose ?? handleClose; - const handleMessageOverwritten = options.handleMessage ?? handleMessage; - const isOpenOverwritten = options.isOpen ?? isOpen; - const startHeartbeatingOverwritten = options.startHeartbeating ?? startHeartbeating; - const stopHeartbeatingOverwritten = options.stopHeartbeating ?? stopHeartbeating; - return { - gatewayConfig: { - compress: options.gatewayConfig.compress ?? false, - intents: options.gatewayConfig.intents ?? 0, - properties: { - os: options.gatewayConfig?.properties?.os ?? "linux", - browser: options.gatewayConfig?.properties?.browser ?? "Discordeno", - device: options.gatewayConfig?.properties?.device ?? "Discordeno" - }, - token: options.gatewayConfig.token, - url: options.gatewayConfig.url ?? "wss://gateway.discord.gg", - version: options.gatewayConfig.version ?? 10 - }, - heart: { - acknowledged: false, - interval: 45000 - }, - id: options.id, - maxRequestsPerRateLimitTick: 120, - previousSequenceNumber: options.previousSequenceNumber || null, - rateLimitResetInterval: 60_000, - sessionId: undefined, - socket: undefined, - state: ShardState.Offline, - totalShards: options.totalShards, - events: options.events ?? {}, - calculateSafeRequests: function() { - return calculateSafeRequestsOverwritten(this); - }, - close: function(code, reason) { - return closeOverwritten(this, code, reason); - }, - connect: async function() { - return await connectOverwritten(this); - }, - identify: async function() { - return await identifyOverwritten(this); - }, - isOpen: function() { - return isOpenOverwritten(this); - }, - makePresence: options.makePresence, - resume: async function() { - return await resumeOverwritten(this); - }, - send: async function(message, highPriority = false) { - return await sendOverwritten(this, message, highPriority); - }, - shutdown: async function() { - return await shutdownOverwritten(this); - }, - bucket: createLeakyBucket({ - max: 120, - refillInterval: 60_000, - refillAmount: 120 - }), - handleClose: async function(close) { - return await handleCloseOverwritten(this, close); - }, - handleMessage: async function(message) { - return await handleMessageOverwritten(this, message); - }, - requestIdentify: async function() { - return await options.requestIdentify(this.id); - }, - offlineSendQueue: [], - resolves: new Map(), - startHeartbeating: function(interval) { - return startHeartbeatingOverwritten(this, interval); - }, - stopHeartbeating: function() { - return stopHeartbeatingOverwritten(this); - } - }; -} -function createShardManager(options) { - return { - createShardOptions: { - ...options.createShardOptions, - events: { - ...options.createShardOptions?.events, - message: options.createShardOptions?.events?.message ?? options.handleMessage - } - }, - gatewayConfig: options.gatewayConfig, - shards: new Map(options.shardIds.map((shardId)=>{ - const shard = createShard({ - ...options.createShardOptions, - id: shardId, - totalShards: options.totalShards, - gatewayConfig: options.gatewayConfig, - requestIdentify: async function() { - return await options.requestIdentify(shardId); - } - }); - return [ - shardId, - shard - ]; - })), - totalShards: options.totalShards, - identify: async function(shardId) { - let shard = this.shards.get(shardId); - if (!shard) { - shard = createShard({ - ...this.createShardOptions, - id: shardId, - totalShards: this.totalShards, - gatewayConfig: this.gatewayConfig, - requestIdentify: async function() { - return await options.requestIdentify(shardId); - } - }); - this.shards.set(shardId, shard); - } - return await shard.identify(); - }, - kill: async function(shardId) { - const shard = this.shards.get(shardId); - if (!shard) return; - this.shards.delete(shardId); - return await shard.shutdown(); - }, - requestIdentify: options.requestIdentify - }; -} -async function stop(gateway, code, reason) { - gateway.manager.shards.forEach((shard)=>shard.close(code, reason)); - await delay(5000); -} -function createGatewayManager(options) { - const prepareBucketsOverwritten = options.prepareBuckets ?? prepareBuckets; - const spawnShardsOverwritten = options.spawnShards ?? spawnShards; - const stopOverwritten = options.stop ?? stop; - const tellWorkerToIdentifyOverwritten = options.tellWorkerToIdentify ?? tellWorkerToIdentify; - const calculateTotalShardsOverwritten = options.calculateTotalShards ?? calculateTotalShards; - const calculateWorkerIdOverwritten = options.calculateWorkerId ?? calculateWorkerId; - const totalShards = (options.totalShards ?? options.gatewayBot.shards) ?? 1; - const gatewayManager = { - buckets: new Map(), - firstShardId: options.firstShardId ?? 0, - gatewayBot: options.gatewayBot, - lastShardId: (options.lastShardId ?? totalShards - 1) ?? 1, - manager: {}, - spawnShardDelay: options.spawnShardDelay ?? 5300, - shardsPerWorker: options.shardsPerWorker ?? 25, - totalWorkers: options.totalWorkers ?? 4, - prepareBuckets: function() { - return prepareBucketsOverwritten(this); - }, - spawnShards: function() { - return spawnShardsOverwritten(this); - }, - stop: function(code, reason) { - return stopOverwritten(this, code, reason); - }, - tellWorkerToIdentify: function(workerId, shardId, bucketId) { - return tellWorkerToIdentifyOverwritten(this, workerId, shardId, bucketId); - }, - debug: options.debug || function() {}, - calculateTotalShards: function() { - return calculateTotalShardsOverwritten(this); - }, - calculateWorkerId: function(shardId) { - return calculateWorkerIdOverwritten(this, shardId); - } - }; - gatewayManager.manager = createShardManager({ - createShardOptions: options.createShardOptions, - gatewayConfig: options.gatewayConfig, - shardIds: [], - totalShards, - handleMessage: function(shard, message) { - return options.handleDiscordPayload(shard, message); - }, - requestIdentify: async (shardId)=>{ - await gatewayManager.buckets.get(shardId % gatewayManager.gatewayBot.sessionStartLimit.maxConcurrency).leak.acquire(1); - } - }); - return gatewayManager; -} -function checkRateLimits(rest, url) { - const ratelimited = rest.rateLimitedPaths.get(url); - const global = rest.rateLimitedPaths.get("global"); - const now = Date.now(); - if (ratelimited && now < ratelimited.resetTimestamp) { - return ratelimited.resetTimestamp - now; - } - if (global && now < global.resetTimestamp) { - return global.resetTimestamp - now; - } - return false; -} -function cleanupQueues(rest) { - for (const [key, queue] of rest.pathQueues){ - rest.debug(`[REST - cleanupQueues] Running for of loop. ${key}`); - if (queue.requests.length) continue; - rest.pathQueues.delete(key); - } - if (!rest.pathQueues.size) rest.processingQueue = false; -} -function createRequestBody(rest, options) { - const headers = { - "user-agent": USER_AGENT - }; - if (!options.unauthorized) headers["authorization"] = `Bot ${rest.token}`; - if (options.headers) { - for(const key in options.headers){ - headers[key.toLowerCase()] = options.headers[key]; - } - } - if (options.method === "GET") { - options.body = undefined; - } - if (options.body?.reason) { - headers["X-Audit-Log-Reason"] = encodeURIComponent(options.body.reason); - options.body.reason = undefined; - } - if (options.body?.file) { - if (!Array.isArray(options.body.file)) { - options.body.file = [ - options.body.file - ]; - } - const form = new FormData(); - for(let i = 0; i < options.body.file.length; i++){ - form.append(`file${i}`, options.body.file[i].blob, options.body.file[i].name); - } - form.append("payload_json", JSON.stringify({ - ...options.body, - file: undefined - })); - options.body.file = form; - } else if (options.body && ![ - "GET", - "DELETE" - ].includes(options.method)) { - headers["Content-Type"] = "application/json"; - } - return { - headers, - body: options.body?.file ?? JSON.stringify(options.body), - method: options.method - }; -} -async function processGlobalQueue(rest) { - if (!rest.globalQueue.length) return; - if (rest.globalQueueProcessing) return; - rest.globalQueueProcessing = true; - while(rest.globalQueue.length){ - if (rest.globallyRateLimited) { - setTimeout(()=>{ - rest.debug(`[REST - processGlobalQueue] Globally rate limited, running setTimeout.`); - rest.processGlobalQueue(rest); - }, 1000); - break; - } - if (rest.invalidRequests === rest.maxInvalidRequests - rest.invalidRequestsSafetyAmount) { - setTimeout(()=>{ - const time = rest.invalidRequestsInterval - (Date.now() - rest.invalidRequestFrozenAt); - rest.debug(`[REST - processGlobalQueue] Freeze global queue because of invalid requests. Time Remaining: ${time / 1000} seconds.`); - rest.processGlobalQueue(rest); - }, 1000); - break; - } - const request = rest.globalQueue.shift(); - if (!request) continue; - const urlResetIn = rest.checkRateLimits(rest, request.basicURL); - const bucketResetIn = request.payload.bucketId ? rest.checkRateLimits(rest, request.payload.bucketId) : false; - if (urlResetIn || bucketResetIn) { - setTimeout(()=>{ - rest.debug(`[REST - processGlobalQueue] rate limited, running setTimeout.`); - rest.globalQueue.unshift(request); - rest.processGlobalQueue(rest); - }, urlResetIn || bucketResetIn); - continue; - } - await rest.sendRequest(rest, { - url: request.urlToUse, - method: request.request.method, - bucketId: request.payload.bucketId, - reject: request.request.reject, - respond: request.request.respond, - retryCount: request.payload.retryCount ?? 0, - payload: rest.createRequestBody(rest, { - method: request.request.method, - body: request.payload.body - }) - }).catch(()=>null); - } - rest.globalQueueProcessing = false; -} -function processQueue(rest, id) { - const queue = rest.pathQueues.get(id); - if (!queue) return; - while(queue.requests.length){ - rest.debug(`[REST - processQueue] Running while loop.`); - const queuedRequest = queue.requests[0]; - if (!queuedRequest) break; - const basicURL = rest.simplifyUrl(queuedRequest.request.url, queuedRequest.request.method); - const urlResetIn = rest.checkRateLimits(rest, basicURL); - if (urlResetIn) { - if (!queue.isWaiting) { - queue.isWaiting = true; - setTimeout(()=>{ - queue.isWaiting = false; - rest.debug(`[REST - processQueue] rate limited, running setTimeout.`); - rest.processQueue(rest, id); - }, urlResetIn); - } - break; - } - const bucketResetIn = queuedRequest.payload.bucketId ? rest.checkRateLimits(rest, queuedRequest.payload.bucketId) : false; - if (bucketResetIn) continue; - rest.debug(`[REST - Add To Global Queue] ${JSON.stringify(queuedRequest.payload)}`); - rest.globalQueue.push({ - ...queuedRequest, - urlToUse: queuedRequest.request.url, - basicURL - }); - rest.processGlobalQueue(rest); - queue.requests.shift(); - } - rest.cleanupQueues(rest); -} -function processRateLimitedPaths(rest) { - const now = Date.now(); - for (const [key, value] of rest.rateLimitedPaths.entries()){ - rest.debug(`[REST - processRateLimitedPaths] Running for of loop. ${value.resetTimestamp - now}`); - if (value.resetTimestamp > now) continue; - rest.rateLimitedPaths.delete(key); - if (key === "global") rest.globallyRateLimited = false; - } - if (!rest.rateLimitedPaths.size) { - rest.processingRateLimitedPaths = false; - } else { - rest.processingRateLimitedPaths = true; - setTimeout(()=>{ - rest.debug(`[REST - processRateLimitedPaths] Running setTimeout.`); - rest.processRateLimitedPaths(rest); - }, 1000); - } -} -function processRequest(rest, request, payload) { - const route = request.url.substring(request.url.indexOf("api/")); - const parts = route.split("/"); - parts.shift(); - if (parts[0]?.startsWith("v")) parts.shift(); - request.url = `${BASE_URL}/v${rest.version}/${parts.join("/")}`; - parts.shift(); - const url = rest.simplifyUrl(request.url, request.method); - const queue = rest.pathQueues.get(url); - if (queue) { - queue.requests.push({ - request, - payload - }); - } else { - rest.pathQueues.set(url, { - isWaiting: false, - requests: [ - { - request, - payload - }, - ] - }); - rest.processQueue(rest, url); - } -} -function processRequestHeaders(rest, url, headers) { - let rateLimited = false; - const remaining = headers.get("x-ratelimit-remaining"); - const retryAfter = headers.get("x-ratelimit-reset-after"); - const reset = Date.now() + Number(retryAfter) * 1000; - const global = headers.get("x-ratelimit-global"); - const bucketId = headers.get("x-ratelimit-bucket") || undefined; - if (remaining === "0") { - rateLimited = true; - rest.rateLimitedPaths.set(url, { - url, - resetTimestamp: reset, - bucketId - }); - if (bucketId) { - rest.rateLimitedPaths.set(bucketId, { - url, - resetTimestamp: reset, - bucketId - }); - } - } - if (global) { - const retryAfter1 = headers.get("retry-after"); - const globalReset = Date.now() + Number(retryAfter1) * 1000; - rest.debug(`[REST = Globally Rate Limited] URL: ${url} | Global Rest: ${globalReset}`); - rest.globallyRateLimited = true; - rateLimited = true; - rest.rateLimitedPaths.set("global", { - url: "global", - resetTimestamp: globalReset, - bucketId - }); - if (bucketId) { - rest.rateLimitedPaths.set(bucketId, { - url: "global", - resetTimestamp: globalReset, - bucketId - }); - } - } - if (rateLimited && !rest.processingRateLimitedPaths) { - rest.processRateLimitedPaths(rest); - } - return rateLimited ? bucketId : undefined; -} -function convertRestError(errorStack, data) { - errorStack.message = `[${data.status}] ${data.error}\n${data.body}`; - return errorStack; -} -async function runMethod(rest, method, route, body, options) { - rest.debug(`[REST - RequestCreate] Method: ${method} | URL: ${route} | Retry Count: ${options?.retryCount ?? 0} | Bucket ID: ${options?.bucketId} | Body: ${JSON.stringify(body)}`); - const errorStack = new Error("Location:"); - Error.captureStackTrace?.(errorStack); - if (!baseEndpoints.BASE_URL.startsWith(BASE_URL) && route[0] === "/") { - const result = await fetch(`${baseEndpoints.BASE_URL}${route}`, { - body: body ? JSON.stringify(body) : undefined, - headers: { - Authorization: rest.secretKey, - "Content-Type": "application/json" - }, - method - }).catch((error)=>{ - errorStack.message = error?.message; - console.error(error); - throw errorStack; - }); - if (!result.ok) { - errorStack.message = result.statusText; - rest.debug(`[ERROR] ${errorStack.message}`); - await result.text(); - throw errorStack; - } - return result.status !== 204 ? await result.json() : undefined; - } - return new Promise((resolve, reject)=>{ - rest.processRequest(rest, { - url: route[0] === "/" ? `${BASE_URL}/v${10}${route}` : route, - method, - reject: (data)=>{ - const restError = rest.convertRestError(errorStack, data); - reject(restError); - }, - respond: (data)=>resolve(data.status !== 204 ? JSON.parse(data.body ?? "{}") : undefined) - }, { - bucketId: options?.bucketId, - body: body, - retryCount: options?.retryCount ?? 0, - headers: options?.headers - }); - }); -} -function simplifyUrl(url, method) { - let route = url.replace(/\/([a-z-]+)\/(?:[0-9]{17,19})/g, function(match, p) { - return [ - "channels", - "guilds" - ].includes(p) ? match : `/${p}/skillzPrefersID`; - }).replace(/\/reactions\/[^/]+/g, "/reactions/skillzPrefersID"); - if (route.includes("/reactions")) { - route = route.substring(0, route.indexOf("/reactions") + "/reactions".length); - } - if (method === "DELETE" && route.endsWith("/messages/skillzPrefersID")) { - route = method + route; - } - return route; -} -function removeTokenPrefix(token, type = "REST") { - if (!token) throw new Error(`The ${type} was not given a token. Please provide a token and try again.`); - if (!token.startsWith("Bot ")) return token; - return token.substring(token.indexOf(" ") + 1); -} -function getBotIdFromToken(token) { - return BigInt(atob(token.split(".")[0])); -} -async function sendRequest(rest, options) { - try { - rest.debug(`[REST - fetching] URL: ${options.url} | ${JSON.stringify(options)}`); - const newURL = options.url.startsWith(BASE_URL) ? options.url : `${BASE_URL}/v${rest.version}/${options.url}`; - rest.debug(`[REST - url data] URL: ${newURL}`); - const response = await fetch(new Request(newURL, { - method: options.method, - headers: options.payload?.headers, - body: options.payload?.body - })); - rest.debug(`[REST - fetched] URL: ${options.url} | ${JSON.stringify(options)}`); - const bucketIdFromHeaders = rest.processRequestHeaders(rest, rest.simplifyUrl(options.url, options.method), response.headers); - if (bucketIdFromHeaders) { - options.bucketId = bucketIdFromHeaders; - } - if (response.status < 200 || response.status >= 400) { - rest.debug(`[REST - httpError] Payload: ${JSON.stringify(options)} | Response: ${JSON.stringify(response)}`); - let error = "REQUEST_UNKNOWN_ERROR"; - switch(response.status){ - case HTTPResponseCodes.BadRequest: - error = "The options was improperly formatted, or the server couldn't understand it."; - break; - case HTTPResponseCodes.Unauthorized: - error = "The Authorization header was missing or invalid."; - break; - case HTTPResponseCodes.Forbidden: - error = "The Authorization token you passed did not have permission to the resource."; - break; - case HTTPResponseCodes.NotFound: - error = "The resource at the location specified doesn't exist."; - break; - case HTTPResponseCodes.MethodNotAllowed: - error = "The HTTP method used is not valid for the location specified."; - break; - case HTTPResponseCodes.GatewayUnavailable: - error = "There was not a gateway available to process your options. Wait a bit and retry."; - break; - } - if (rest.invalidRequestErrorStatuses.includes(response.status) && !(response.status === 429 && response.headers.get("X-RateLimit-Scope"))) { - ++rest.invalidRequests; - if (!rest.invalidRequestsTimeoutId) { - rest.invalidRequestsTimeoutId = setTimeout(()=>{ - rest.debug(`[REST - processGlobalQueue] Resetting invalid optionss counter in setTimeout.`); - rest.invalidRequests = 0; - rest.invalidRequestsTimeoutId = 0; - }, rest.invalidRequestsInterval); - } - } - if (response.status !== 429) { - options.reject?.({ - ok: false, - status: response.status, - error, - body: response.type ? JSON.stringify(await response.json()) : undefined - }); - throw new Error(JSON.stringify({ - ok: false, - status: response.status, - error, - body: response.type ? JSON.stringify(await response.json()) : undefined - })); - } else { - if (options.retryCount && (options.retryCount++) >= rest.maxRetryCount) { - rest.debug(`[REST - RetriesMaxed] ${JSON.stringify(options)}`); - options.reject?.({ - ok: false, - status: response.status, - error: "The options was rate limited and it maxed out the retries limit." - }); - return; - } - } - } - if (response.status === 204) { - rest.debug(`[REST - FetchSuccess] URL: ${options.url} | ${JSON.stringify(options)}`); - options.respond?.({ - ok: true, - status: 204 - }); - return; - } else { - const json = JSON.stringify(await response.json()); - rest.debug(`[REST - fetchSuccess] ${JSON.stringify(options)}`); - options.respond?.({ - ok: true, - status: 200, - body: json - }); - return JSON.parse(json); - } - } catch (error1) { - rest.debug(`[REST - fetchFailed] Payload: ${JSON.stringify(options)} | Error: ${error1}`); - options.reject?.({ - ok: false, - status: 599, - error: "Internal Proxy Error" - }); - throw new Error("Something went wrong in sendRequest", { - cause: error1 - }); - } -} -function createRestManager(options) { - const version = options.version || 10; - if (options.customUrl) { - baseEndpoints.BASE_URL = `${options.customUrl}/v${version}`; - } - return { - invalidRequests: 0, - maxInvalidRequests: 10000, - invalidRequestsInterval: 600000, - invalidRequestsTimeoutId: 0, - invalidRequestsSafetyAmount: 1, - invalidRequestFrozenAt: 0, - invalidRequestErrorStatuses: [ - 401, - 403, - 429 - ], - version, - token: removeTokenPrefix(options.token), - maxRetryCount: options.maxRetryCount || 10, - secretKey: options.secretKey || "discordeno_best_lib_ever", - customUrl: options.customUrl || "", - pathQueues: new Map(), - processingQueue: false, - processingRateLimitedPaths: false, - globallyRateLimited: false, - globalQueue: [], - globalQueueProcessing: false, - rateLimitedPaths: new Map(), - debug: options.debug || function(_text) {}, - checkRateLimits: options.checkRateLimits || checkRateLimits, - cleanupQueues: options.cleanupQueues || cleanupQueues, - processQueue: options.processQueue || processQueue, - processRateLimitedPaths: options.processRateLimitedPaths || processRateLimitedPaths, - processRequestHeaders: options.processRequestHeaders || processRequestHeaders, - processRequest: options.processRequest || processRequest, - createRequestBody: options.createRequestBody || createRequestBody, - runMethod: options.runMethod || runMethod, - simplifyUrl: options.simplifyUrl || simplifyUrl, - processGlobalQueue: options.processGlobalQueue || processGlobalQueue, - convertRestError: options.convertRestError || convertRestError, - sendRequest: options.sendRequest || sendRequest - }; -} -var AutoModerationEventTypes; -(function(AutoModerationEventTypes) { - AutoModerationEventTypes[AutoModerationEventTypes["MessageSend"] = 1] = "MessageSend"; -})(AutoModerationEventTypes || (AutoModerationEventTypes = {})); -var AutoModerationTriggerTypes; -(function(AutoModerationTriggerTypes) { - AutoModerationTriggerTypes[AutoModerationTriggerTypes["Keyword"] = 1] = "Keyword"; - AutoModerationTriggerTypes[AutoModerationTriggerTypes["HarmfulLink"] = 2] = "HarmfulLink"; - AutoModerationTriggerTypes[AutoModerationTriggerTypes["Spam"] = 3] = "Spam"; - AutoModerationTriggerTypes[AutoModerationTriggerTypes["KeywordPreset"] = 4] = "KeywordPreset"; -})(AutoModerationTriggerTypes || (AutoModerationTriggerTypes = {})); -var DiscordAutoModerationRuleTriggerMetadataPresets; -(function(DiscordAutoModerationRuleTriggerMetadataPresets) { - DiscordAutoModerationRuleTriggerMetadataPresets[DiscordAutoModerationRuleTriggerMetadataPresets["Profanity"] = 1] = "Profanity"; - DiscordAutoModerationRuleTriggerMetadataPresets[DiscordAutoModerationRuleTriggerMetadataPresets["SexualContent"] = 2] = "SexualContent"; - DiscordAutoModerationRuleTriggerMetadataPresets[DiscordAutoModerationRuleTriggerMetadataPresets["Slurs"] = 3] = "Slurs"; -})(DiscordAutoModerationRuleTriggerMetadataPresets || (DiscordAutoModerationRuleTriggerMetadataPresets = {})); -var AutoModerationActionType; -(function(AutoModerationActionType) { - AutoModerationActionType[AutoModerationActionType["BlockMessage"] = 1] = "BlockMessage"; - AutoModerationActionType[AutoModerationActionType["SendAlertMessage"] = 2] = "SendAlertMessage"; - AutoModerationActionType[AutoModerationActionType["Timeout"] = 3] = "Timeout"; -})(AutoModerationActionType || (AutoModerationActionType = {})); -class Permissions { - static Flags = BitwisePermissionFlags; - bitfield; - constructor(bitfield){ - this.bitfield = Permissions.resolve(bitfield); - } - has(bit) { - if (this.bitfield & BigInt(Permissions.Flags.ADMINISTRATOR)) { - return true; - } - return !!(this.bitfield & Permissions.resolve(bit)); - } - static resolve(bit) { - switch(typeof bit){ - case "bigint": - return bit; - case "number": - return BigInt(bit); - case "string": - return BigInt(Permissions.Flags[bit]); - case "object": - return Permissions.resolve(bit.map((p)=>BigInt(Permissions.Flags[p])).reduce((acc, cur)=>acc | cur, 0n)); - default: - throw new TypeError(`Cannot resolve permission: ${bit}`); - } - } -} -class EventEmitter { - listeners = new Map(); - #addListener(event, func) { - this.listeners.set(event, this.listeners.get(event) || []); - this.listeners.get(event)?.push(func); - return this; - } - on(event, func) { - return this.#addListener(event, func); - } - #removeListener(event1, func1) { - if (this.listeners.has(event1)) { - const listener = this.listeners.get(event1); - if (listener?.includes(func1)) { - listener.splice(listener.indexOf(func1), 1); - if (listener.length === 0) { - this.listeners.delete(event1); - } - } - } - return this; - } - off(event, func) { - return this.#removeListener(event, func); - } - once(event, func) { - const closure = ()=>{ - func(); - this.off(event, func); - }; - const listener = this.listeners.get(event) ?? []; - listener.push(closure); - return this; - } - emit(event, ...args) { - const listener = this.listeners.get(event); - if (!listener) { - return false; - } - listener.forEach((f)=>f(...args)); - return true; - } - listenerCount(eventName) { - return this.listeners.get(eventName)?.length ?? 0; - } - rawListeners(eventName) { - return this.listeners.get(eventName); - } -} -var MessageFlags; -(function(MessageFlags) { - MessageFlags[MessageFlags["CrossPosted"] = 1] = "CrossPosted"; - MessageFlags[MessageFlags["IsCrosspost"] = 2] = "IsCrosspost"; - MessageFlags[MessageFlags["SupressEmbeds"] = 4] = "SupressEmbeds"; - MessageFlags[MessageFlags["SourceMessageDeleted"] = 8] = "SourceMessageDeleted"; - MessageFlags[MessageFlags["Urgent"] = 16] = "Urgent"; - MessageFlags[MessageFlags["HasThread"] = 32] = "HasThread"; - MessageFlags[MessageFlags["Ephemeral"] = 64] = "Ephemeral"; - MessageFlags[MessageFlags["Loading"] = 128] = "Loading"; - MessageFlags[MessageFlags["FailedToMentionSomeRolesInThread"] = 256] = "FailedToMentionSomeRolesInThread"; -})(MessageFlags || (MessageFlags = {})); -class Util { - static formatImageURL(url, size = 128, format) { - return `${url}.${format || (url.includes("/a_") ? "gif" : "jpg")}?size=${size}`; - } - static iconHashToBigInt(hash) { - return BigInt("0x" + (hash.startsWith("a_") ? `a${hash.substring(2)}` : `b${hash}`)); - } - static iconBigintToHash(icon) { - const hash = icon.toString(16); - return hash.startsWith("a") ? `a_${hash.substring(1)}` : hash.substring(1); - } -} -function USER_AVATAR(userId, icon) { - return `${baseEndpoints.CDN_URL}/avatars/${userId}/${icon}`; -} -function EMOJI_URL(id, animated = false) { - return `https://cdn.discordapp.com/emojis/${id}.${animated ? "gif" : "png"}`; -} -function USER_DEFAULT_AVATAR(altIcon) { - return `${baseEndpoints.CDN_URL}/embed/avatars/${altIcon}.png`; -} -function GUILD_BANNER(guildId, icon) { - return `${baseEndpoints.CDN_URL}/banners/${guildId}/${icon}`; -} -function GUILD_SPLASH(guildId, icon) { - return `${baseEndpoints.CDN_URL}/splashes/${guildId}/${icon}`; -} -function GUILD_ICON(guildId, icon) { - return `${baseEndpoints.CDN_URL}/icons/${guildId}/${icon}`; -} -function USER(userId) { - return `/users/${userId}`; -} -function GATEWAY_BOT() { - return "/gateway/bot"; -} -function CHANNEL(channelId) { - return `/channels/${channelId}`; -} -function CHANNEL_INVITES(channelId) { - return `/channels/${channelId}/invites`; -} -function CHANNEL_TYPING(channelId) { - return `/channels/${channelId}/typing`; -} -function CHANNEL_MESSAGES(channelId, options) { - let url = `/channels/${channelId}/messages?`; - if (options) { - if (options.after) url += `after=${options.after}`; - if (options.before) url += `&before=${options.before}`; - if (options.around) url += `&around=${options.around}`; - if (options.limit) url += `&limit=${options.limit}`; - } - return url; -} -function CHANNEL_MESSAGE(channelId, messageId) { - return `/channels/${channelId}/messages/${messageId}`; -} -function GUILD_MEMBER(guildId, userId) { - return `/guilds/${guildId}/members/${userId}`; -} -function GUILD_BAN(guildId, userId) { - return `/guilds/${guildId}/bans/${userId}`; -} -function GUILD_ROLE(guildId, roleId) { - return `/guilds/${guildId}/roles/${roleId}`; -} -function GUILD_ROLES(guildId) { - return `/guilds/${guildId}/roles`; -} -function GUILD_EMOJIS(guildId) { - return `/guilds/${guildId}/emojis`; -} -function GUILD_EMOJI(guildId, emojiId) { - return `/guilds/${guildId}/emojis/${emojiId}`; -} -function GUILDS() { - return `/guilds`; -} -function INVITE(inviteCode, options) { - let url = `/invites/${inviteCode}?`; - if (options) { - if (options.withCounts) url += `with_counts=${options.withCounts}`; - if (options.withExpiration) url += `&with_expiration=${options.withExpiration}`; - if (options.scheduledEventId) url += `&guild_scheduled_event_id=${options.scheduledEventId}`; - } - return url; -} -function GUILD_INVITES(guildId) { - return `/guilds/${guildId}/invites`; -} -function INTERACTION_ID_TOKEN(interactionId, token) { - return `/interactions/${interactionId}/${token}/callback`; -} -function WEBHOOK_MESSAGE(webhookId, token, messageId) { - return `/webhooks/${webhookId}/${token}/messages/${messageId}`; -} -function WEBHOOK_TOKEN(webhookId, token) { - if (!token) return `/webhooks/${webhookId}`; - return `/webhooks/${webhookId}/${token}`; -} -function WEBHOOK(webhookId, token, options) { - let url = `/webhooks/${webhookId}/${token}`; - if (options?.wait) url += `?wait=${options.wait}`; - if (options?.threadId) url += `?threadId=${options.threadId}`; - if (options?.wait && options.threadId) url += `?wait=${options.wait}&threadId=${options.threadId}`; - return url; -} -function USER_NICK(guildId) { - return `/guilds/${guildId}/members/@me`; -} -function GUILD_PRUNE(guildId, options) { - let url = `/guilds/${guildId}/prune?`; - if (options?.days) url += `days=${options.days}`; - if (options?.includeRoles) url += `&include_roles=${options.includeRoles}`; - return url; -} -function CHANNEL_PIN(channelId, messageId) { - return `/channels/${channelId}/pins/${messageId}`; -} -function CHANNEL_PINS(channelId) { - return `/channels/${channelId}/pins`; -} -function CHANNEL_MESSAGE_REACTION_ME(channelId, messageId, emoji) { - return `/channels/${channelId}/messages/${messageId}/reactions/${encodeURIComponent(emoji)}/@me`; -} -function CHANNEL_MESSAGE_REACTION_USER(channelId, messageId, emoji, userId) { - return `/channels/${channelId}/messages/${messageId}/reactions/${encodeURIComponent(emoji)}/${userId}`; -} -function CHANNEL_MESSAGE_REACTIONS(channelId, messageId) { - return `/channels/${channelId}/messages/${messageId}/reactions`; -} -function CHANNEL_MESSAGE_REACTION(channelId, messageId, emoji, options) { - let url = `/channels/${channelId}/messages/${messageId}/reactions/${encodeURIComponent(emoji)}?`; - if (options?.after) url += `after=${options.after}`; - if (options?.limit) url += `&limit=${options.limit}`; - return url; -} -function CHANNEL_MESSAGE_CROSSPOST(channelId, messageId) { - return `/channels/${channelId}/messages/${messageId}/crosspost`; -} -function GUILD_MEMBER_ROLE(guildId, memberId, roleId) { - return `/guilds/${guildId}/members/${memberId}/roles/${roleId}`; -} -function CHANNEL_WEBHOOKS(channelId) { - return `/channels/${channelId}/webhooks`; -} -function THREAD_START_PUBLIC(channelId, messageId) { - return `/channels/${channelId}/messages/${messageId}/threads`; -} -function THREAD_START_PRIVATE(channelId) { - return `/channels/${channelId}/threads`; -} -function THREAD_ACTIVE(guildId) { - return `/guilds/${guildId}/threads/active`; -} -function THREAD_ME(channelId) { - return `/channels/${channelId}/thread-members/@me`; -} -function THREAD_MEMBERS(channelId) { - return `/channels/${channelId}/thread-members`; -} -function THREAD_USER(channelId, userId) { - return `/channels/${channelId}/thread-members/${userId}`; -} -function THREAD_ARCHIVED_PUBLIC(channelId, options) { - let url = `/channels/${channelId}/threads/archived/public?`; - if (options) { - if (options.before) url += `before=${new Date(options.before).toISOString()}`; - if (options.limit) url += `&limit=${options.limit}`; - } - return url; -} -function THREAD_ARCHIVED_PRIVATE_JOINED(channelId, options) { - let url = `/channels/${channelId}/users/@me/threads/archived/private?`; - if (options) { - if (options.before) url += `before=${new Date(options.before).toISOString()}`; - if (options.limit) url += `&limit=${options.limit}`; - } - return url; -} -function STAGE_INSTANCE(channelId) { - return `/stage-instances/${channelId}`; -} -function APPLICATION_COMMANDS(appId, commandId) { - if (commandId) return `/applications/${appId}/commands/${commandId}`; - return `/applications/${appId}/commands`; -} -function GUILD_APPLICATION_COMMANDS(appId, guildId, commandId) { - if (commandId) return `/applications/${appId}/guilds/${guildId}/commands/${commandId}`; - return `/applications/${appId}/guilds/${guildId}/commands`; -} -function GUILD_APPLICATION_COMMANDS_PERMISSIONS(appId, guildId, commandId) { - if (commandId) return `/applications/${appId}/guilds/${guildId}/commands/${commandId}/permissions`; - return `/applications/${appId}/guilds/${guildId}/commands/permissions`; -} -function GUILD_APPLICATION_COMMANDS_LOCALIZATIONS(appId, guildId, commandId, withLocalizations) { - let url = `/applications/${appId}/guilds/${guildId}/commands/${commandId}?`; - if (withLocalizations !== undefined) { - url += `with_localizations=${withLocalizations}`; - } - return url; -} -function STICKER_PACKS() { - return `stickers-packs`; -} -class User { - constructor(session, data){ - this.session = session; - this.id = data.id; - this.username = data.username; - this.discriminator = data.discriminator; - this.avatarHash = data.avatar ? Util.iconHashToBigInt(data.avatar) : undefined; - this.accentColor = data.accent_color; - this.bot = !!data.bot; - this.system = !!data.system; - this.banner = data.banner; - } - session; - id; - username; - discriminator; - avatarHash; - accentColor; - bot; - system; - banner; - get tag() { - return `${this.username}#${this.discriminator}}`; - } - avatarURL(options = { - size: 128 - }) { - let url; - if (!this.avatarHash) { - url = USER_DEFAULT_AVATAR(Number(this.discriminator) % 5); - } else { - url = USER_AVATAR(this.id, Util.iconBigintToHash(this.avatarHash)); - } - return Util.formatImageURL(url, options.size, options.format); - } - toString() { - return `<@${this.id}>`; - } -} -class AutoModerationRule { - constructor(session, data){ - this.session = session; - this.id = data.id; - this.guildId = data.guild_id; - this.name = data.name; - this.creatorId = data.creator_id; - this.eventType = data.event_type; - this.triggerType = data.trigger_type; - this.triggerMetadata = { - keywordFilter: data.trigger_metadata.keyword_filter, - presets: data.trigger_metadata.presets - }; - this.actions = data.actions.map((action)=>Object.create({ - type: action.type, - metadata: { - channelId: action.metadata.channel_id, - durationSeconds: action.metadata.duration_seconds - } - })); - this.enabled = !!data.enabled; - this.exemptRoles = data.exempt_roles; - this.exemptChannels = data.exempt_channels; - } - session; - id; - guildId; - name; - creatorId; - eventType; - triggerType; - triggerMetadata; - actions; - enabled; - exemptRoles; - exemptChannels; -} -class AutoModerationExecution { - constructor(session, data){ - this.session = session; - this.guildId = data.guild_id; - this.action = Object.create({ - type: data.action.type, - metadata: { - channelId: data.action.metadata.channel_id, - durationSeconds: data.action.metadata.duration_seconds - } - }); - this.ruleId = data.rule_id; - this.ruleTriggerType = data.rule_trigger_type; - this.userId = data.user_id; - this.content = data.content; - if (data.channel_id) { - this.channelId = data.channel_id; - } - if (data.message_id) { - this.messageId = data.message_id; - } - if (data.alert_system_message_id) { - this.alertSystemMessageId = data.alert_system_message_id; - } - if (data.matched_keyword) { - this.matchedKeyword = data.matched_keyword; - } - if (data.matched_content) { - this.matched_content = data.matched_content; - } - } - session; - guildId; - action; - ruleId; - ruleTriggerType; - userId; - channelId; - messageId; - alertSystemMessageId; - content; - matchedKeyword; - matched_content; -} -class Emoji { - constructor(session, data){ - this.id = data.id; - this.name = data.name; - this.animated = !!data.animated; - this.available = !!data.available; - this.requireColons = !!data.require_colons; - this.session = session; - } - id; - session; - name; - animated; - available; - requireColons; -} -const Snowflake = { - snowflakeToTimestamp (id) { - return (Number(id) >> 22) + 14200704e5; - } -}; -class WelcomeChannel { - constructor(session, data){ - this.session = session; - this.channelId = data.channel_id; - this.description = data.description; - this.emoji = new Emoji(session, { - name: data.emoji_name ? data.emoji_name : undefined, - id: data.emoji_id ? data.emoji_id : undefined - }); - } - session; - channelId; - description; - emoji; - get id() { - return this.channelId; - } -} -class WelcomeScreen { - constructor(session, data){ - this.session = session; - this.welcomeChannels = data.welcome_channels.map((welcomeChannel)=>new WelcomeChannel(session, welcomeChannel)); - if (data.description) { - this.description = data.description; - } - } - session; - description; - welcomeChannels; -} -class ThreadMember { - constructor(session, data){ - this.session = session; - this.id = data.id; - this.flags = data.flags; - this.timestamp = Date.parse(data.join_timestamp); - } - session; - id; - flags; - timestamp; - get threadId() { - return this.id; - } - async quitThread(memberId = this.session.botId) { - await this.session.rest.runMethod(this.session.rest, "DELETE", THREAD_USER(this.id, memberId)); - } - async fetchMember(memberId = this.session.botId) { - const member = await this.session.rest.runMethod(this.session.rest, "GET", THREAD_USER(this.id, memberId)); - return new ThreadMember(this.session, member); - } -} -async function urlToBase64(url) { - const buffer = await fetch(url).then((res)=>res.arrayBuffer()); - const imageStr = encode(buffer); - const type = url.substring(url.lastIndexOf(".") + 1); - return `data:image/${type};base64,${imageStr}`; -} -const base64abc = [ - "A", - "B", - "C", - "D", - "E", - "F", - "G", - "H", - "I", - "J", - "K", - "L", - "M", - "N", - "O", - "P", - "Q", - "R", - "S", - "T", - "U", - "V", - "W", - "X", - "Y", - "Z", - "a", - "b", - "c", - "d", - "e", - "f", - "g", - "h", - "i", - "j", - "k", - "l", - "m", - "n", - "o", - "p", - "q", - "r", - "s", - "t", - "u", - "v", - "w", - "x", - "y", - "z", - "0", - "1", - "2", - "3", - "4", - "5", - "6", - "7", - "8", - "9", - "+", - "/", -]; -function encode(data) { - const uint8 = typeof data === "string" ? new TextEncoder().encode(data) : data instanceof Uint8Array ? data : new Uint8Array(data); - let result = "", i; - const l = uint8.length; - for(i = 2; i < l; i += 3){ - result += base64abc[uint8[i - 2] >> 2]; - result += base64abc[(uint8[i - 2] & 0x03) << 4 | uint8[i - 1] >> 4]; - result += base64abc[(uint8[i - 1] & 0x0f) << 2 | uint8[i] >> 6]; - result += base64abc[uint8[i] & 0x3f]; - } - if (i === l + 1) { - result += base64abc[uint8[i - 2] >> 2]; - result += base64abc[(uint8[i - 2] & 0x03) << 4]; - result += "=="; - } - if (i === l) { - result += base64abc[uint8[i - 2] >> 2]; - result += base64abc[(uint8[i - 2] & 0x03) << 4 | uint8[i - 1] >> 4]; - result += base64abc[(uint8[i - 1] & 0x0f) << 2]; - result += "="; - } - return result; -} -function NewTeam(session, data) { - return { - icon: data.icon ? data.icon : undefined, - id: data.id, - members: data.members.map((member)=>{ - return { - membershipState: member.membership_state, - permissions: member.permissions, - teamId: member.team_id, - user: new User(session, member.user) - }; - }), - ownerUserId: data.owner_user_id, - name: data.name - }; -} -class Application { - constructor(session, data){ - this.id = data.id; - this.session = session; - this.name = data.name; - this.icon = data.icon || undefined; - this.description = data.description; - this.rpcOrigins = data.rpc_origins; - this.botPublic = data.bot_public; - this.botRequireCodeGrant = data.bot_require_code_grant; - this.termsOfServiceURL = data.terms_of_service_url; - this.privacyPolicyURL = data.privacy_policy_url; - this.owner = data.owner ? new User(session, data.owner) : undefined; - this.summary = ""; - this.verifyKey = data.verify_key; - this.team = data.team ? NewTeam(session, data.team) : undefined; - this.guildId = data.guild_id; - this.coverImage = data.cover_image; - this.tags = data.tags; - this.installParams = data.install_params; - this.customInstallURL = data.custom_install_url; - } - session; - id; - name; - icon; - description; - rpcOrigins; - botPublic; - botRequireCodeGrant; - termsOfServiceURL; - privacyPolicyURL; - owner; - summary; - verifyKey; - team; - guildId; - primarySkuId; - slug; - coverImage; - flags; - tags; - installParams; - customInstallURL; -} -class Attachment { - constructor(session, data){ - this.session = session; - this.id = data.id; - this.contentType = data.content_type ? data.content_type : undefined; - this.attachment = data.url; - this.proxyUrl = data.proxy_url; - this.name = data.filename; - this.size = data.size; - this.height = data.height ? data.height : undefined; - this.width = data.width ? data.width : undefined; - this.ephemeral = !!data.ephemeral; - } - session; - id; - contentType; - attachment; - proxyUrl; - name; - size; - height; - width; - ephemeral; -} -class BaseComponent { - constructor(type){ - this.type = type; - } - type; - isActionRow() { - return this.type === MessageComponentTypes.ActionRow; - } - isButton() { - return this.type === MessageComponentTypes.Button; - } - isSelectMenu() { - return this.type === MessageComponentTypes.SelectMenu; - } - isTextInput() { - return this.type === MessageComponentTypes.InputText; - } -} -class Button extends BaseComponent { - constructor(session, data){ - super(data.type); - this.session = session; - this.type = data.type; - this.customId = data.custom_id; - this.label = data.label; - this.style = data.style; - this.disabled = data.disabled; - if (data.emoji) { - this.emoji = new Emoji(session, data.emoji); - } - } - session; - type; - customId; - label; - style; - disabled; - emoji; -} -class LinkButton extends BaseComponent { - constructor(session, data){ - super(data.type); - this.session = session; - this.type = data.type; - this.url = data.url; - this.label = data.label; - this.style = data.style; - this.disabled = data.disabled; - if (data.emoji) { - this.emoji = new Emoji(session, data.emoji); - } - } - session; - type; - url; - label; - style; - disabled; - emoji; -} -class SelectMenu extends BaseComponent { - constructor(session, data){ - super(data.type); - this.session = session; - this.type = data.type; - this.customId = data.custom_id; - this.options = data.options.map((option)=>{ - return { - label: option.label, - description: option.description, - emoji: option.emoji || new Emoji(session, option.emoji), - value: option.value - }; - }); - this.placeholder = data.placeholder; - this.minValues = data.min_values; - this.maxValues = data.max_values; - this.disabled = data.disabled; - } - session; - type; - customId; - options; - placeholder; - minValues; - maxValues; - disabled; -} -class TextInput extends BaseComponent { - constructor(session, data){ - super(data.type); - this.session = session; - this.type = data.type; - this.customId = data.custom_id; - this.label = data.label; - this.style = data.style; - this.placeholder = data.placeholder; - this.value = data.value; - this.minLength = data.min_length; - this.maxLength = data.max_length; - } - session; - type; - style; - customId; - label; - placeholder; - value; - minLength; - maxLength; -} -class ActionRow extends BaseComponent { - constructor(session, data){ - super(data.type); - this.session = session; - this.type = data.type; - this.components = data.components.map((component)=>{ - switch(component.type){ - case MessageComponentTypes.Button: - if (component.style === ButtonStyles.Link) { - return new LinkButton(session, component); - } - return new Button(session, component); - case MessageComponentTypes.SelectMenu: - return new SelectMenu(session, component); - case MessageComponentTypes.InputText: - return new TextInput(session, component); - case MessageComponentTypes.ActionRow: - throw new Error("Cannot have an action row inside an action row"); - } - }); - } - session; - type; - components; -} -class ComponentFactory { - static from(session, component) { - switch(component.type){ - case MessageComponentTypes.ActionRow: - return new ActionRow(session, component); - case MessageComponentTypes.Button: - if (component.style === ButtonStyles.Link) { - return new Button(session, component); - } - return new Button(session, component); - case MessageComponentTypes.SelectMenu: - return new SelectMenu(session, component); - case MessageComponentTypes.InputText: - return new TextInput(session, component); - } - } -} -function calculateShardId(gateway, guildId) { - if (gateway.manager.totalShards === 1) return 0; - return Number((guildId >> 22n) % BigInt(gateway.manager.totalShards - 1)); -} -class Member { - constructor(session, data, guildId){ - this.session = session; - this.user = new User(session, data.user); - this.guildId = guildId; - this.avatarHash = data.avatar ? Util.iconHashToBigInt(data.avatar) : undefined; - this.nickname = data.nick ? data.nick : undefined; - this.joinedTimestamp = Number.parseInt(data.joined_at); - this.roles = data.roles; - this.deaf = !!data.deaf; - this.mute = !!data.mute; - this.pending = !!data.pending; - this.communicationDisabledUntilTimestamp = data.communication_disabled_until ? Number.parseInt(data.communication_disabled_until) : undefined; - } - session; - user; - guildId; - avatarHash; - nickname; - joinedTimestamp; - roles; - deaf; - mute; - pending; - communicationDisabledUntilTimestamp; - get id() { - return this.user.id; - } - get nicknameOrUsername() { - return this.nickname ?? this.user.username; - } - get joinedAt() { - return new Date(this.joinedTimestamp); - } - async ban(options) { - await Guild.prototype.banMember.call({ - id: this.guildId, - session: this.session - }, this.user.id, options); - return this; - } - async kick(options) { - await Guild.prototype.kickMember.call({ - id: this.guildId, - session: this.session - }, this.user.id, options); - return this; - } - async unban() { - await Guild.prototype.unbanMember.call({ - id: this.guildId, - session: this.session - }, this.user.id); - } - async edit(options) { - const member = await Guild.prototype.editMember.call({ - id: this.guildId, - session: this.session - }, this.user.id, options); - return member; - } - async addRole(roleId, options = {}) { - await Guild.prototype.addRole.call({ - id: this.guildId, - session: this.session - }, this.user.id, roleId, options); - } - async removeRole(roleId, options = {}) { - await Guild.prototype.removeRole.call({ - id: this.guildId, - session: this.session - }, this.user.id, roleId, options); - } - avatarURL(options = { - size: 128 - }) { - let url; - if (this.user.bot) { - return this.user.avatarURL(); - } - if (!this.avatarHash) { - url = USER_DEFAULT_AVATAR(Number(this.user.discriminator) % 5); - } else { - url = USER_AVATAR(this.user.id, Util.iconBigintToHash(this.avatarHash)); - } - return Util.formatImageURL(url, options.size, options.format); - } - toString() { - return `<@!${this.user.id}>`; - } -} -function NewMessageReactionAdd(session, data) { - return { - userId: data.user_id, - channelId: data.channel_id, - messageId: data.message_id, - guildId: data.guild_id, - member: data.member ? new Member(session, data.member, data.guild_id || "") : undefined, - emoji: new Emoji(session, data.emoji) - }; -} -class BaseChannel { - constructor(session, data){ - this.id = data.id; - this.session = session; - this.name = data.name; - this.type = data.type; - } - id; - session; - name; - type; - isText() { - return textBasedChannels.includes(this.type); - } - isVoice() { - return this.type === ChannelTypes.GuildVoice; - } - isDM() { - return this.type === ChannelTypes.DM; - } - isNews() { - return this.type === ChannelTypes.GuildNews; - } - isThread() { - return this.type === ChannelTypes.GuildPublicThread || this.type === ChannelTypes.GuildPrivateThread; - } - isStage() { - return this.type === ChannelTypes.GuildStageVoice; - } - toString() { - return `<#${this.id}>`; - } -} -class Webhook { - constructor(session, data){ - this.session = session; - this.id = data.id; - this.type = data.type; - this.token = data.token; - if (data.avatar) { - this.avatar = Util.iconHashToBigInt(data.avatar); - } - if (data.user) { - this.user = new User(session, data.user); - } - if (data.guild_id) { - this.guildId = data.guild_id; - } - if (data.channel_id) { - this.channelId = data.channel_id; - } - if (data.application_id) { - this.applicationId = data.application_id; - } - } - session; - id; - type; - token; - avatar; - applicationId; - channelId; - guildId; - user; - async execute(options) { - if (!this.token) { - return; - } - const data = { - content: options?.content, - embeds: options?.embeds, - tts: options?.tts, - allowed_mentions: options?.allowedMentions, - components: options?.components, - file: options?.files - }; - const message = await this.session.rest.sendRequest(this.session.rest, { - url: WEBHOOK(this.id, this.token, { - wait: options?.wait, - threadId: options?.threadId - }), - method: "POST", - payload: this.session.rest.createRequestBody(this.session.rest, { - method: "POST", - body: { - ...data - } - }) - }); - return options?.wait ?? true ? new Message(this.session, message) : undefined; - } - async fetch() { - const message = await this.session.rest.runMethod(this.session.rest, "GET", WEBHOOK_TOKEN(this.id, this.token)); - return new Webhook(this.session, message); - } - async fetchMessage(messageId) { - if (!this.token) { - return; - } - const message = await this.session.rest.runMethod(this.session.rest, "GET", WEBHOOK_MESSAGE(this.id, this.token, messageId)); - return new Message(this.session, message); - } -} -class MessageReaction { - constructor(session, data){ - this.session = session; - this.me = data.me; - this.count = data.count; - this.emoji = new Emoji(session, data.emoji); - } - session; - me; - count; - emoji; -} -class Message { - constructor(session, data){ - this.session = session; - this.id = data.id; - this.type = data.type; - this.channelId = data.channel_id; - this.guildId = data.guild_id; - this.applicationId = data.application_id; - if (!data.webhook_id) { - this.author = new User(session, data.author); - } - this.flags = data.flags; - this.pinned = !!data.pinned; - this.tts = !!data.tts; - this.content = data.content; - this.nonce = data.nonce; - this.mentionEveryone = data.mention_everyone; - this.timestamp = Date.parse(data.timestamp); - this.editedTimestamp = data.edited_timestamp ? Date.parse(data.edited_timestamp) : undefined; - this.reactions = data.reactions?.map((react)=>new MessageReaction(session, react)) ?? []; - this.attachments = data.attachments.map((attachment)=>new Attachment(session, attachment)); - this.embeds = data.embeds; - if (data.thread && data.guild_id) { - this.thread = new ThreadChannel(session, data.thread, data.guild_id); - } - if (data.webhook_id && data.author.discriminator === "0000") { - this.webhook = { - id: data.webhook_id, - username: data.author.username, - discriminator: data.author.discriminator, - avatar: data.author.avatar ? Util.iconHashToBigInt(data.author.avatar) : undefined - }; - } - if (data.guild_id && data.member && !this.isWebhookMessage()) { - this.member = new Member(session, { - ...data.member, - user: data.author - }, data.guild_id); - } - this.components = data.components?.map((component)=>ComponentFactory.from(session, component)) ?? []; - if (data.activity) { - this.activity = { - partyId: data.activity.party_id, - type: data.activity.type - }; - } - if (data.sticker_items) { - this.stickers = data.sticker_items.map((si)=>{ - return { - id: si.id, - name: si.name, - formatType: si.format_type - }; - }); - } - } - session; - id; - type; - channelId; - guildId; - applicationId; - author; - flags; - pinned; - tts; - content; - nonce; - mentionEveryone; - timestamp; - editedTimestamp; - stickers; - reactions; - attachments; - embeds; - member; - thread; - components; - webhook; - activity; - get createdTimestamp() { - return Snowflake.snowflakeToTimestamp(this.id); - } - get createdAt() { - return new Date(this.createdTimestamp); - } - get sentAt() { - return new Date(this.timestamp); - } - get editedAt() { - return this.editedTimestamp ? new Date(this.editedTimestamp) : undefined; - } - get edited() { - return this.editedTimestamp; - } - get url() { - return `https://discord.com/channels/${this.guildId ?? "@me"}/${this.channelId}/${this.id}`; - } - get isBot() { - return this.author.bot; - } - async pin() { - await this.session.rest.runMethod(this.session.rest, "PUT", CHANNEL_PIN(this.channelId, this.id)); - } - async unpin() { - await this.session.rest.runMethod(this.session.rest, "DELETE", CHANNEL_PIN(this.channelId, this.id)); - } - async edit(options) { - const message = await this.session.rest.runMethod(this.session.rest, "POST", CHANNEL_MESSAGE(this.id, this.channelId), { - content: options.content, - allowed_mentions: { - parse: options.allowedMentions?.parse, - roles: options.allowedMentions?.roles, - users: options.allowedMentions?.users, - replied_user: options.allowedMentions?.repliedUser - }, - flags: options.flags, - embeds: options.embeds - }); - return message; - } - async suppressEmbeds(suppress = true) { - if (this.flags === MessageFlags.SupressEmbeds && suppress === false) { - return; - } - const message = await this.edit({ - flags: MessageFlags.SupressEmbeds - }); - return message; - } - async delete({ reason }) { - await this.session.rest.runMethod(this.session.rest, "DELETE", CHANNEL_MESSAGE(this.channelId, this.id), { - reason - }); - return this; - } - async reply(options) { - const message = await this.session.rest.runMethod(this.session.rest, "POST", CHANNEL_MESSAGES(this.channelId), { - content: options.content, - file: options.files, - allowed_mentions: { - parse: options.allowedMentions?.parse, - roles: options.allowedMentions?.roles, - users: options.allowedMentions?.users, - replied_user: options.allowedMentions?.repliedUser - }, - message_reference: options.messageReference ? { - message_id: options.messageReference.messageId, - channel_id: options.messageReference.channelId, - guild_id: options.messageReference.guildId, - fail_if_not_exists: options.messageReference.failIfNotExists ?? true - } : undefined, - embeds: options.embeds, - tts: options.tts, - components: options.components - }); - return new Message(this.session, message); - } - get react() { - return this.addReaction; - } - async addReaction(reaction) { - const r = typeof reaction === "string" ? reaction : `${reaction.name}:${reaction.id}`; - await this.session.rest.runMethod(this.session.rest, "PUT", CHANNEL_MESSAGE_REACTION_ME(this.channelId, this.id, r), {}); - } - async removeReaction(reaction, options) { - const r = typeof reaction === "string" ? reaction : `${reaction.name}:${reaction.id}`; - await this.session.rest.runMethod(this.session.rest, "DELETE", options?.userId ? CHANNEL_MESSAGE_REACTION_USER(this.channelId, this.id, r, options.userId) : CHANNEL_MESSAGE_REACTION_ME(this.channelId, this.id, r)); - } - async fetchReactions(reaction, options) { - const r = typeof reaction === "string" ? reaction : `${reaction.name}:${reaction.id}`; - const users = await this.session.rest.runMethod(this.session.rest, "GET", CHANNEL_MESSAGE_REACTION(this.channelId, this.id, encodeURIComponent(r), options)); - return users.map((user)=>new User(this.session, user)); - } - async removeReactionEmoji(reaction) { - const r = typeof reaction === "string" ? reaction : `${reaction.name}:${reaction.id}`; - await this.session.rest.runMethod(this.session.rest, "DELETE", CHANNEL_MESSAGE_REACTION(this.channelId, this.id, r)); - } - async nukeReactions() { - await this.session.rest.runMethod(this.session.rest, "DELETE", CHANNEL_MESSAGE_REACTIONS(this.channelId, this.id)); - } - async crosspost() { - const message = await this.session.rest.runMethod(this.session.rest, "POST", CHANNEL_MESSAGE_CROSSPOST(this.channelId, this.id)); - return new Message(this.session, message); - } - async fetch() { - const message = await this.session.rest.runMethod(this.session.rest, "GET", CHANNEL_MESSAGE(this.channelId, this.id)); - if (!message?.id) return; - return new Message(this.session, message); - } - get publish() { - return this.crosspost; - } - inGuild() { - return !!this.guildId; - } - isWebhookMessage() { - return !!this.webhook; - } -} -class BaseGuild { - constructor(session, data){ - this.session = session; - this.id = data.id; - this.name = data.name; - this.iconHash = data.icon ? Util.iconHashToBigInt(data.icon) : undefined; - this.features = data.features; - } - session; - id; - name; - iconHash; - features; - get createdTimestamp() { - return Snowflake.snowflakeToTimestamp(this.id); - } - get createdAt() { - return new Date(this.createdTimestamp); - } - get partnered() { - return this.features.includes(GuildFeatures.Partnered); - } - get verified() { - return this.features.includes(GuildFeatures.Verified); - } - iconURL(options = { - size: 128 - }) { - if (this.iconHash) { - return Util.formatImageURL(GUILD_ICON(this.id, Util.iconBigintToHash(this.iconHash)), options.size, options.format); - } - } - toString() { - return this.name; - } -} -function NewInviteCreate(session, invite) { - return { - channelId: invite.channel_id, - code: invite.code, - createdAt: invite.created_at, - guildId: invite.guild_id, - inviter: invite.inviter ? new User(session, invite.inviter) : undefined, - maxAge: invite.max_age, - maxUses: invite.max_uses, - targetType: invite.target_type, - targetUser: invite.target_user ? new User(session, invite.target_user) : undefined, - targetApplication: invite.target_application ? new Application(session, invite.target_application) : undefined, - temporary: invite.temporary, - uses: invite.uses - }; -} -class Role { - constructor(session, data, guildId){ - this.session = session; - this.id = data.id; - this.guildId = guildId; - this.hoist = data.hoist; - this.iconHash = data.icon ? Util.iconHashToBigInt(data.icon) : undefined; - this.color = data.color; - this.name = data.name; - this.unicodeEmoji = data.unicode_emoji; - this.mentionable = data.mentionable; - this.managed = data.managed; - this.permissions = new Permissions(BigInt(data.permissions)); - } - session; - id; - guildId; - hoist; - iconHash; - color; - name; - unicodeEmoji; - mentionable; - managed; - permissions; - get createdTimestamp() { - return Snowflake.snowflakeToTimestamp(this.id); - } - get createdAt() { - return new Date(this.createdTimestamp); - } - get hexColor() { - return `#${this.color.toString(16).padStart(6, "0")}`; - } - async delete() { - await Guild.prototype.deleteRole.call({ - id: this.guildId, - session: this.session - }, this.id); - } - async edit(options) { - const role = await Guild.prototype.editRole.call({ - id: this.guildId, - session: this.session - }, this.id, options); - return role; - } - async add(memberId, options = {}) { - await Guild.prototype.addRole.call({ - id: this.guildId, - session: this.session - }, memberId, this.id, options); - } - async remove(memberId, options = {}) { - await Guild.prototype.removeRole.call({ - id: this.guildId, - session: this.session - }, memberId, this.id, options); - } - toString() { - switch(this.id){ - case this.guildId: - return "@everyone"; - default: - return `<@&${this.id}>`; - } - } -} -class GuildEmoji extends Emoji { - constructor(session, data, guildId){ - super(session, data); - this.guildId = guildId; - this.roles = data.roles; - this.user = data.user ? new User(this.session, data.user) : undefined; - this.managed = !!data.managed; - this.id = super.id; - } - guildId; - roles; - user; - managed; - id; - async edit(options) { - const emoji = await Guild.prototype.editEmoji.call({ - id: this.guildId, - session: this.session - }, this.id, options); - return emoji; - } - async delete({ reason } = {}) { - await Guild.prototype.deleteEmoji.call({ - id: this.guildId, - session: this.session - }, this.id, { - reason - }); - return this; - } - get url() { - return EMOJI_URL(this.id, this.animated); - } -} -const textBasedChannels = [ - ChannelTypes.DM, - ChannelTypes.GroupDm, - ChannelTypes.GuildPrivateThread, - ChannelTypes.GuildPublicThread, - ChannelTypes.GuildNews, - ChannelTypes.GuildVoice, - ChannelTypes.GuildText, -]; -class TextChannel { - constructor(session, data){ - this.session = session; - this.id = data.id; - this.name = data.name; - this.type = data.type; - this.rateLimitPerUser = data.rate_limit_per_user ?? 0; - this.nsfw = !!data.nsfw ?? false; - if (data.last_message_id) { - this.lastMessageId = data.last_message_id; - } - if (data.last_pin_timestamp) { - this.lastPinTimestamp = data.last_pin_timestamp; - } - } - session; - id; - name; - type; - lastMessageId; - lastPinTimestamp; - rateLimitPerUser; - nsfw; - static applyTo(klass, ignore = []) { - const methods = [ - "fetchPins", - "createInvite", - "fetchMessages", - "sendTyping", - "pinMessage", - "unpinMessage", - "addReaction", - "removeReaction", - "nukeReactions", - "fetchPins", - "sendMessage", - "editMessage", - "createWebhook", - ]; - for (const method of methods){ - if (ignore.includes(method)) continue; - klass.prototype[method] = TextChannel.prototype[method]; - } - } - async fetchPins() { - const messages = await this.session.rest.runMethod(this.session.rest, "GET", CHANNEL_PINS(this.id)); - return messages[0] ? messages.map((x)=>new Message(this.session, x)) : []; - } - async createInvite(options) { - const invite = await this.session.rest.runMethod(this.session.rest, "POST", CHANNEL_INVITES(this.id), options ? { - max_age: options.maxAge, - max_uses: options.maxUses, - temporary: options.temporary, - unique: options.unique, - target_type: options.targetType, - target_user_id: options.targetUserId, - target_application_id: options.targetApplicationId - } : {}); - return new Invite(this.session, invite); - } - async fetchMessages(options) { - if (options?.limit > 100) throw Error("Values must be between 0-100"); - const messages = await this.session.rest.runMethod(this.session.rest, "GET", CHANNEL_MESSAGES(this.id, options)); - return messages[0] ? messages.map((x)=>new Message(this.session, x)) : []; - } - async sendTyping() { - await this.session.rest.runMethod(this.session.rest, "POST", CHANNEL_TYPING(this.id)); - } - async pinMessage(messageId) { - await Message.prototype.pin.call({ - id: messageId, - channelId: this.id, - session: this.session - }); - } - async unpinMessage(messageId) { - await Message.prototype.unpin.call({ - id: messageId, - channelId: this.id, - session: this.session - }); - } - async addReaction(messageId, reaction) { - await Message.prototype.addReaction.call({ - channelId: this.id, - id: messageId, - session: this.session - }, reaction); - } - async removeReaction(messageId, reaction, options) { - await Message.prototype.removeReaction.call({ - channelId: this.id, - id: messageId, - session: this.session - }, reaction, options); - } - async removeReactionEmoji(messageId, reaction) { - await Message.prototype.removeReactionEmoji.call({ - channelId: this.id, - id: messageId, - session: this.session - }, reaction); - } - async nukeReactions(messageId) { - await Message.prototype.nukeReactions.call({ - channelId: this.id, - id: messageId - }); - } - async fetchReactions(messageId, reaction, options) { - const users = await Message.prototype.fetchReactions.call({ - channelId: this.id, - id: messageId, - session: this.session - }, reaction, options); - return users; - } - sendMessage(options) { - return Message.prototype.reply.call({ - channelId: this.id, - session: this.session - }, options); - } - editMessage(messageId, options) { - return Message.prototype.edit.call({ - channelId: this.id, - id: messageId, - session: this.session - }, options); - } - async createWebhook(options) { - const webhook = await this.session.rest.runMethod(this.session.rest, "POST", CHANNEL_WEBHOOKS(this.id), { - name: options.name, - avatar: options.avatar ? urlToBase64(options.avatar) : undefined, - reason: options.reason - }); - return new Webhook(this.session, webhook); - } -} -class GuildChannel extends BaseChannel { - constructor(session, data, guildId){ - super(session, data); - this.type = data.type; - this.guildId = guildId; - this.position = data.position; - data.topic ? this.topic = data.topic : null; - data.parent_id ? this.parentId = data.parent_id : undefined; - } - type; - guildId; - topic; - position; - parentId; - async fetchInvites() { - const invites = await this.session.rest.runMethod(this.session.rest, "GET", CHANNEL_INVITES(this.id)); - return invites.map((invite)=>new Invite(this.session, invite)); - } - async edit(options) { - const channel = await this.session.rest.runMethod(this.session.rest, "PATCH", CHANNEL(this.id), { - name: options.name, - type: "type" in options ? options.type : undefined, - position: options.position, - topic: "topic" in options ? options.topic : undefined, - nsfw: "nfsw" in options ? options.nfsw : undefined, - rate_limit_per_user: "rateLimitPerUser" in options ? options.rateLimitPerUser : undefined, - bitrate: "bitrate" in options ? options.bitrate : undefined, - user_limit: "userLimit" in options ? options.userLimit : undefined, - permissions_overwrites: options.permissionOverwrites, - parent_id: "parentId" in options ? options.parentId : undefined, - rtc_region: "rtcRegion" in options ? options.rtcRegion : undefined, - video_quality_mode: "videoQualityMode" in options ? options.videoQualityMode : undefined, - default_auto_archive_duration: "defaultAutoArchiveDuration" in options ? options.defaultAutoArchiveDuration : undefined - }); - return ChannelFactory.from(this.session, channel); - } - async getArchivedThreads(options) { - let func; - switch(options.type){ - case "public": - func = THREAD_ARCHIVED_PUBLIC; - break; - case "private": - func = THREAD_START_PRIVATE; - break; - case "privateJoinedThreads": - func = THREAD_ARCHIVED_PRIVATE_JOINED; - break; - } - const { threads , members , has_more } = await this.session.rest.runMethod(this.session.rest, "GET", func(this.id, options)); - return { - threads: Object.fromEntries(threads.map((thread)=>[ - thread.id, - new ThreadChannel(this.session, thread, this.id) - ])), - members: Object.fromEntries(members.map((threadMember)=>[ - threadMember.id, - new ThreadMember(this.session, threadMember) - ])), - hasMore: has_more - }; - } - async createThread(options) { - const thread = await this.session.rest.runMethod(this.session.rest, "POST", "messageId" in options ? THREAD_START_PUBLIC(this.id, options.messageId) : THREAD_START_PRIVATE(this.id), { - name: options.name, - auto_archive_duration: options.autoArchiveDuration - }); - return new ThreadChannel(this.session, thread, thread.guild_id ?? this.guildId); - } -} -class BaseVoiceChannel extends GuildChannel { - constructor(session, data, guildId){ - super(session, data, guildId); - this.bitRate = data.bitrate; - this.userLimit = data.user_limit ?? 0; - this.videoQuality = data.video_quality_mode; - this.nsfw = !!data.nsfw; - this.type = data.type; - if (data.rtc_region) { - this.rtcRegion = data.rtc_region; - } - } - type; - bitRate; - userLimit; - rtcRegion; - videoQuality; - nsfw; - async connect(options) { - const shardId = calculateShardId(this.session.gateway, BigInt(super.guildId)); - const shard = this.session.gateway.manager.shards.get(shardId); - if (!shard) { - throw new Error(`Shard (id: ${shardId} not found`); - } - await shard.send({ - op: GatewayOpcodes.VoiceStateUpdate, - d: { - guild_id: super.guildId, - channel_id: super.id, - self_mute: Boolean(options?.selfMute), - self_deaf: options?.selfDeaf ?? true - } - }); - } -} -class DMChannel extends BaseChannel { - constructor(session, data){ - super(session, data); - this.user = new User(this.session, data.recipents.find((r)=>r.id !== this.session.botId)); - this.type = data.type; - if (data.last_message_id) { - this.lastMessageId = data.last_message_id; - } - } - type; - user; - lastMessageId; - async close() { - const channel = await this.session.rest.runMethod(this.session.rest, "DELETE", CHANNEL(this.id)); - return new DMChannel(this.session, channel); - } -} -TextChannel.applyTo(DMChannel); -class VoiceChannel extends BaseVoiceChannel { - constructor(session, data, guildId){ - super(session, data, guildId); - this.type = data.type; - } - type; -} -TextChannel.applyTo(VoiceChannel); -class NewsChannel extends GuildChannel { - constructor(session, data, guildId){ - super(session, data, guildId); - this.type = data.type; - this.defaultAutoArchiveDuration = data.default_auto_archive_duration; - } - type; - defaultAutoArchiveDuration; - crosspostMessage(messageId) { - return Message.prototype.crosspost.call({ - id: messageId, - channelId: this.id, - session: this.session - }); - } - get publishMessage() { - return this.crosspostMessage; - } -} -TextChannel.applyTo(NewsChannel); -class StageChannel extends BaseVoiceChannel { - constructor(session, data, guildId){ - super(session, data, guildId); - this.type = data.type; - this.topic = data.topic ? data.topic : undefined; - } - type; - topic; -} -class ThreadChannel extends GuildChannel { - constructor(session, data, guildId){ - super(session, data, guildId); - this.type = data.type; - this.archived = !!data.thread_metadata?.archived; - this.archiveTimestamp = data.thread_metadata?.archive_timestamp; - this.autoArchiveDuration = data.thread_metadata?.auto_archive_duration; - this.locked = !!data.thread_metadata?.locked; - this.messageCount = data.message_count; - this.memberCount = data.member_count; - this.ownerId = data.owner_id; - if (data.member) { - this.member = new ThreadMember(session, data.member); - } - } - type; - archived; - archiveTimestamp; - autoArchiveDuration; - locked; - messageCount; - memberCount; - member; - ownerId; - async joinThread() { - await this.session.rest.runMethod(this.session.rest, "PUT", THREAD_ME(this.id)); - } - async addToThread(guildMemberId) { - await this.session.rest.runMethod(this.session.rest, "PUT", THREAD_USER(this.id, guildMemberId)); - } - async leaveToThread(guildMemberId) { - await this.session.rest.runMethod(this.session.rest, "DELETE", THREAD_USER(this.id, guildMemberId)); - } - removeMember(memberId = this.session.botId) { - return ThreadMember.prototype.quitThread.call({ - id: this.id, - session: this.session - }, memberId); - } - fetchMember(memberId = this.session.botId) { - return ThreadMember.prototype.fetchMember.call({ - id: this.id, - session: this.session - }, memberId); - } - async fetchMembers() { - const members = await this.session.rest.runMethod(this.session.rest, "GET", THREAD_MEMBERS(this.id)); - return members.map((threadMember)=>new ThreadMember(this.session, threadMember)); - } -} -TextChannel.applyTo(ThreadChannel); -class GuildTextChannel extends GuildChannel { - constructor(session, data, guildId){ - super(session, data, guildId); - this.type = data.type; - } - type; -} -TextChannel.applyTo(GuildTextChannel); -class ChannelFactory { - static fromGuildChannel(session, channel) { - switch(channel.type){ - case ChannelTypes.GuildPublicThread: - case ChannelTypes.GuildPrivateThread: - return new ThreadChannel(session, channel, channel.guild_id); - case ChannelTypes.GuildText: - return new GuildTextChannel(session, channel, channel.guild_id); - case ChannelTypes.GuildNews: - return new NewsChannel(session, channel, channel.guild_id); - case ChannelTypes.GuildVoice: - return new VoiceChannel(session, channel, channel.guild_id); - case ChannelTypes.GuildStageVoice: - return new StageChannel(session, channel, channel.guild_id); - default: - throw new Error("Channel was not implemented"); - } - } - static from(session, channel) { - switch(channel.type){ - case ChannelTypes.GuildPublicThread: - case ChannelTypes.GuildPrivateThread: - return new ThreadChannel(session, channel, channel.guild_id); - case ChannelTypes.GuildText: - return new GuildTextChannel(session, channel, channel.guild_id); - case ChannelTypes.GuildNews: - return new NewsChannel(session, channel, channel.guild_id); - case ChannelTypes.DM: - return new DMChannel(session, channel); - case ChannelTypes.GuildVoice: - return new VoiceChannel(session, channel, channel.guild_id); - case ChannelTypes.GuildStageVoice: - return new StageChannel(session, channel, channel.guild_id); - default: - if (textBasedChannels.includes(channel.type)) { - return new TextChannel(session, channel); - } - throw new Error("Channel was not implemented"); - } - } -} -class AnonymousGuild extends BaseGuild { - constructor(session, data){ - super(session, data); - this.splashHash = data.splash ? Util.iconHashToBigInt(data.splash) : undefined; - this.bannerHash = data.banner ? Util.iconHashToBigInt(data.banner) : undefined; - this.verificationLevel = data.verification_level; - this.vanityUrlCode = data.vanity_url_code ? data.vanity_url_code : undefined; - this.nsfwLevel = data.nsfw_level; - this.description = data.description ? data.description : undefined; - this.premiumSubscriptionCount = data.premium_subscription_count; - } - splashHash; - bannerHash; - verificationLevel; - vanityUrlCode; - nsfwLevel; - description; - premiumSubscriptionCount; - splashURL(options = { - size: 128 - }) { - if (this.splashHash) { - return Util.formatImageURL(GUILD_SPLASH(this.id, Util.iconBigintToHash(this.splashHash)), options.size, options.format); - } - } - bannerURL(options = { - size: 128 - }) { - if (this.bannerHash) { - return Util.formatImageURL(GUILD_BANNER(this.id, Util.iconBigintToHash(this.bannerHash)), options.size, options.format); - } - } -} -class InviteGuild extends AnonymousGuild { - constructor(session, data){ - super(session, data); - if (data.welcome_screen) { - this.welcomeScreen = new WelcomeScreen(session, data.welcome_screen); - } - } - welcomeScreen; -} -class Guild extends BaseGuild { - constructor(session, data){ - super(session, data); - this.splashHash = data.splash ? Util.iconHashToBigInt(data.splash) : undefined; - this.discoverySplashHash = data.discovery_splash ? Util.iconHashToBigInt(data.discovery_splash) : undefined; - this.ownerId = data.owner_id; - this.widgetEnabled = !!data.widget_enabled; - this.widgetChannelId = data.widget_channel_id ? data.widget_channel_id : undefined; - this.vefificationLevel = data.verification_level; - this.defaultMessageNotificationLevel = data.default_message_notifications; - this.explicitContentFilterLevel = data.explicit_content_filter; - this.members = new Map(data.members?.map((member)=>[ - data.id, - new Member(session, { - ...member, - user: member.user - }, data.id) - ])); - this.roles = new Map(data.roles.map((role)=>[ - data.id, - new Role(session, role, data.id) - ])); - this.emojis = new Map(data.emojis.map((guildEmoji)=>[ - guildEmoji.id, - new GuildEmoji(session, guildEmoji, data.id) - ])); - this.channels = new Map(data.channels?.map((guildChannel)=>[ - guildChannel.id, - new GuildChannel(session, guildChannel, data.id) - ])); - } - splashHash; - discoverySplashHash; - ownerId; - widgetEnabled; - widgetChannelId; - vefificationLevel; - defaultMessageNotificationLevel; - explicitContentFilterLevel; - members; - roles; - emojis; - channels; - async editBotNickname(options) { - const result = await this.session.rest.runMethod(this.session.rest, "PATCH", USER_NICK(this.id), options); - return result?.nick; - } - async createEmoji(options) { - if (options.image && !options.image.startsWith("data:image/")) { - options.image = await urlToBase64(options.image); - } - const emoji = await this.session.rest.runMethod(this.session.rest, "POST", GUILD_EMOJIS(this.id), options); - return new GuildEmoji(this.session, emoji, this.id); - } - async deleteEmoji(id, { reason } = {}) { - await this.session.rest.runMethod(this.session.rest, "DELETE", GUILD_EMOJI(this.id, id), { - reason - }); - } - async editEmoji(id, options) { - const emoji = await this.session.rest.runMethod(this.session.rest, "PATCH", GUILD_EMOJI(this.id, id), options); - return new GuildEmoji(this.session, emoji, this.id); - } - async createRole(options) { - let icon; - if (options.iconHash) { - if (typeof options.iconHash === "string") { - icon = options.iconHash; - } else { - icon = Util.iconBigintToHash(options.iconHash); - } - } - const role = await this.session.rest.runMethod(this.session.rest, "PUT", GUILD_ROLES(this.id), { - name: options.name, - color: options.color, - icon, - unicode_emoji: options.unicodeEmoji, - hoist: options.hoist, - mentionable: options.mentionable - }); - return new Role(this.session, role, this.id); - } - async deleteRole(roleId) { - await this.session.rest.runMethod(this.session.rest, "DELETE", GUILD_ROLE(this.id, roleId)); - } - async editRole(roleId, options) { - const role = await this.session.rest.runMethod(this.session.rest, "PATCH", GUILD_ROLE(this.id, roleId), { - name: options.name, - color: options.color, - hoist: options.hoist, - mentionable: options.mentionable - }); - return new Role(this.session, role, this.id); - } - async addRole(memberId, roleId, { reason } = {}) { - await this.session.rest.runMethod(this.session.rest, "PUT", GUILD_MEMBER_ROLE(this.id, memberId, roleId), { - reason - }); - } - async removeRole(memberId, roleId, { reason } = {}) { - await this.session.rest.runMethod(this.session.rest, "DELETE", GUILD_MEMBER_ROLE(this.id, memberId, roleId), { - reason - }); - } - async moveRoles(options) { - const roles = await this.session.rest.runMethod(this.session.rest, "PATCH", GUILD_ROLES(this.id), options); - return roles.map((role)=>new Role(this.session, role, this.id)); - } - async deleteInvite(inviteCode) { - await this.session.rest.runMethod(this.session.rest, "DELETE", INVITE(inviteCode), {}); - } - async fetchInvite(inviteCode, options) { - const inviteMetadata = await this.session.rest.runMethod(this.session.rest, "GET", INVITE(inviteCode, options)); - return new Invite(this.session, inviteMetadata); - } - async fetchInvites() { - const invites = await this.session.rest.runMethod(this.session.rest, "GET", GUILD_INVITES(this.id)); - return invites.map((invite)=>new Invite(this.session, invite)); - } - async banMember(memberId, options) { - await this.session.rest.runMethod(this.session.rest, "PUT", GUILD_BAN(this.id, memberId), options ? { - delete_message_days: options.deleteMessageDays, - reason: options.reason - } : {}); - } - async kickMember(memberId, { reason }) { - await this.session.rest.runMethod(this.session.rest, "DELETE", GUILD_MEMBER(this.id, memberId), { - reason - }); - } - async unbanMember(memberId) { - await this.session.rest.runMethod(this.session.rest, "DELETE", GUILD_BAN(this.id, memberId)); - } - async editMember(memberId, options) { - const member = await this.session.rest.runMethod(this.session.rest, "PATCH", GUILD_MEMBER(this.id, memberId), { - nick: options.nick, - roles: options.roles, - mute: options.mute, - deaf: options.deaf, - channel_id: options.channelId, - communication_disabled_until: options.communicationDisabledUntil ? new Date(options.communicationDisabledUntil).toISOString() : undefined - }); - return new Member(this.session, member, this.id); - } - async pruneMembers(options) { - const result = await this.session.rest.runMethod(this.session.rest, "POST", GUILD_PRUNE(this.id), { - days: options.days, - compute_prune_count: options.computePruneCount, - include_roles: options.includeRoles - }); - return result.pruned; - } - async getPruneCount() { - const result = await this.session.rest.runMethod(this.session.rest, "GET", GUILD_PRUNE(this.id)); - return result.pruned; - } - async getActiveThreads() { - const { threads , members } = await this.session.rest.runMethod(this.session.rest, "GET", THREAD_ACTIVE(this.id)); - return { - threads: Object.fromEntries(threads.map((thread)=>[ - thread.id, - new ThreadChannel(this.session, thread, this.id) - ])), - members: Object.fromEntries(members.map((threadMember)=>[ - threadMember.id, - new ThreadMember(this.session, threadMember) - ])) - }; - } - async leave() {} - async delete() { - await this.session.rest.runMethod(this.session.rest, "DELETE", GUILDS()); - } - static async create(session, options) { - const guild = await session.rest.runMethod(session.rest, "POST", GUILDS(), { - name: options.name, - afk_channel_id: options.afkChannelId, - afk_timeout: options.afkTimeout, - default_message_notifications: options.defaultMessageNotifications, - explicit_content_filter: options.explicitContentFilter, - system_channel_flags: options.systemChannelFlags, - verification_level: options.verificationLevel, - icon: "iconURL" in options ? options.iconURL || urlToBase64(options.iconURL) : options.iconHash || Util.iconBigintToHash(options.iconHash), - channels: options.channels?.map((channel)=>({ - name: channel.name, - nsfw: channel.nsfw, - id: channel.id, - bitrate: channel.bitrate, - parent_id: channel.parentId, - permission_overwrites: channel.permissionOverwrites, - rtc_region: channel.rtcRegion, - user_limit: channel.userLimit, - video_quality_mode: channel.videoQualityMode, - rate_limit_per_user: channel.rateLimitPerUser - })), - roles: options.roles?.map((role)=>({ - name: role.name, - id: role.id, - color: role.color, - mentionable: role.mentionable, - hoist: role.hoist, - position: role.position, - unicode_emoji: role.unicodeEmoji, - icon: options.iconURL || urlToBase64(options.iconURL) - })) - }); - return new Guild(session, guild); - } - async edit(session, options) { - const guild = await session.rest.runMethod(session.rest, "PATCH", GUILDS(), { - name: options.name, - afk_channel_id: options.afkChannelId, - afk_timeout: options.afkTimeout, - default_message_notifications: options.defaultMessageNotifications, - explicit_content_filter: options.explicitContentFilter, - system_channel_flags: options.systemChannelFlags, - verification_level: options.verificationLevel, - icon: "iconURL" in options ? options.iconURL || urlToBase64(options.iconURL) : options.iconHash || Util.iconBigintToHash(options.iconHash), - splash: "splashURL" in options ? options.splashURL || urlToBase64(options.splashURL) : options.splashHash || Util.iconBigintToHash(options.iconHash), - banner: "bannerURL" in options ? options.bannerURL || urlToBase64(options.bannerURL) : options.bannerHash || Util.iconBigintToHash(options.bannerHash), - discovery_splash: "discoverySplashURL" in options ? options.discoverySplashURL || urlToBase64(options.discoverySplashURL) : options.discoverySplashHash || Util.iconBigintToHash(options.discoverySplashHash), - owner_id: options.ownerId, - rules_channel_id: options.rulesChannelId, - public_updates_channel_id: options.publicUpdatesChannelId, - preferred_locale: options.preferredLocale, - features: options.features, - description: options.description, - premiumProgressBarEnabled: options.premiumProgressBarEnabled - }); - return new Guild(session, guild); - } -} -class Invite { - constructor(session, data){ - this.session = session; - this.guild = data.guild ? new InviteGuild(session, data.guild) : undefined; - this.approximateMemberCount = data.approximate_member_count ? data.approximate_member_count : undefined; - this.approximatePresenceCount = data.approximate_presence_count ? data.approximate_presence_count : undefined; - this.code = data.code; - this.expiresAt = data.expires_at ? Number.parseInt(data.expires_at) : undefined; - this.inviter = data.inviter ? new User(session, data.inviter) : undefined; - this.targetUser = data.target_user ? new User(session, data.target_user) : undefined; - this.targetApplication = data.target_application ? new Application(session, data.target_application) : undefined; - this.targetType = data.target_type; - if (data.channel) { - const guildId = data.guild && data.guild?.id ? data.guild.id : ""; - this.channel = new GuildChannel(session, data.channel, guildId); - } - if (data.guild_scheduled_event) { - this.guildScheduledEvent = { - id: data.guild_scheduled_event.id, - guildId: data.guild_scheduled_event.guild_id, - channelId: data.guild_scheduled_event.channel_id ? data.guild_scheduled_event.channel_id : undefined, - creatorId: data.guild_scheduled_event.creator_id ? data.guild_scheduled_event.creator_id : undefined, - name: data.guild_scheduled_event.name, - description: data.guild_scheduled_event.description ? data.guild_scheduled_event.description : undefined, - scheduledStartTime: data.guild_scheduled_event.scheduled_start_time, - scheduledEndTime: data.guild_scheduled_event.scheduled_end_time ? data.guild_scheduled_event.scheduled_end_time : undefined, - privacyLevel: data.guild_scheduled_event.privacy_level, - status: data.guild_scheduled_event.status, - entityType: data.guild_scheduled_event.entity_type, - entityId: data.guild ? data.guild.id : undefined, - entityMetadata: data.guild_scheduled_event.entity_metadata ? data.guild_scheduled_event.entity_metadata : undefined, - creator: data.guild_scheduled_event.creator ? new User(session, data.guild_scheduled_event.creator) : undefined, - userCount: data.guild_scheduled_event.user_count ? data.guild_scheduled_event.user_count : undefined, - image: data.guild_scheduled_event.image ? data.guild_scheduled_event.image : undefined - }; - } - if (data.stage_instance) { - const guildId1 = data.guild && data.guild?.id ? data.guild.id : ""; - this.stageInstance = { - members: data.stage_instance.members.map((m)=>new Member(session, m, guildId1)), - participantCount: data.stage_instance.participant_count, - speakerCount: data.stage_instance.speaker_count, - topic: data.stage_instance.topic - }; - } - } - session; - guild; - approximateMemberCount; - approximatePresenceCount; - code; - expiresAt; - inviter; - targetUser; - targetType; - channel; - stageInstance; - guildScheduledEvent; - targetApplication; - async delete() { - await Guild.prototype.deleteInvite.call(this.guild, this.code); - return this; - } -} -var PrivacyLevels; -(function(PrivacyLevels) { - PrivacyLevels[PrivacyLevels["Public"] = 1] = "Public"; - PrivacyLevels[PrivacyLevels["GuildOnly"] = 2] = "GuildOnly"; -})(PrivacyLevels || (PrivacyLevels = {})); -class StageInstance { - constructor(session, data){ - this.session = session; - this.id = data.id; - this.channelId = data.channel_id; - this.guildId = data.guild_id; - this.topic = data.topic; - this.privacyLevel = data.privacy_level; - this.discoverableDisabled = data.discoverable_disabled; - this.guildScheduledEventId = data.guild_scheduled_event_id; - } - session; - id; - channelId; - guildId; - topic; - privacyLevel; - discoverableDisabled; - guildScheduledEventId; - async edit(options) { - const stageInstance = await this.session.rest.runMethod(this.session.rest, "PATCH", STAGE_INSTANCE(this.id), { - topic: options.topic, - privacy_level: options.privacyLevel - }); - return new StageInstance(this.session, stageInstance); - } - async delete() { - await this.session.rest.runMethod(this.session.rest, "DELETE", STAGE_INSTANCE(this.id)); - } -} -class ScheduledEvent { - constructor(session, data){ - this.session = session; - this.id = data.id; - this.guildId = data.guild_id; - this.channelId = data.channel_id; - this.creatorId = data.creator_id ? data.creator_id : undefined; - this.name = data.name; - this.description = data.description; - this.scheduledStartTime = data.scheduled_start_time; - this.scheduledEndTime = data.scheduled_end_time; - this.privacyLevel = PrivacyLevels.GuildOnly; - this.status = data.status; - this.entityType = data.entity_type; - this.entityMetadata = data.entity_metadata ? data.entity_metadata : undefined; - this.creator = data.creator ? new User(session, data.creator) : undefined; - this.userCount = data.user_count; - this.image = data.image ? data.image : undefined; - } - session; - id; - guildId; - channelId; - creatorId; - name; - description; - scheduledStartTime; - scheduledEndTime; - privacyLevel; - status; - entityType; - entityMetadata; - creator; - userCount; - image; -} -var StatusTypes; -(function(StatusTypes) { - StatusTypes[StatusTypes["online"] = 0] = "online"; - StatusTypes[StatusTypes["dnd"] = 1] = "dnd"; - StatusTypes[StatusTypes["idle"] = 2] = "idle"; - StatusTypes[StatusTypes["invisible"] = 3] = "invisible"; - StatusTypes[StatusTypes["offline"] = 4] = "offline"; -})(StatusTypes || (StatusTypes = {})); -class Presence { - constructor(session, data){ - this.session = session; - this.user = new User(this.session, data.user); - this.guildId = data.guild_id; - this.status = StatusTypes[data.status]; - this.activities = data.activities.map((activity)=>Object.create({ - name: activity.name, - type: activity.type, - url: activity.url ? activity.url : undefined, - createdAt: activity.created_at, - timestamps: activity.timestamps, - applicationId: activity.application_id, - details: activity.details ? activity.details : undefined, - state: activity.state, - emoji: activity.emoji ? activity.emoji : undefined, - party: activity.party ? activity.party : undefined, - assets: activity.assets ? { - largeImage: activity.assets.large_image, - largeText: activity.assets.large_text, - smallImage: activity.assets.small_image, - smallText: activity.assets.small_text - } : null, - secrets: activity.secrets ? activity.secrets : undefined, - instance: !!activity.instance, - flags: activity.flags, - buttons: activity.buttons - })); - this.clientStatus = data.client_status; - } - session; - user; - guildId; - status; - activities; - clientStatus; -} -class Integration { - constructor(session, data){ - this.id = data.id; - this.session = session; - data.guild_id ? this.guildId = data.guild_id : null; - this.name = data.name; - this.type = data.type; - this.enabled = !!data.enabled; - this.syncing = !!data.syncing; - this.roleId = data.role_id; - this.enableEmoticons = !!data.enable_emoticons; - this.expireBehavior = data.expire_behavior; - this.expireGracePeriod = data.expire_grace_period; - this.syncedAt = data.synced_at; - this.subscriberCount = data.subscriber_count; - this.revoked = !!data.revoked; - this.user = data.user ? new User(session, data.user) : undefined; - this.account = { - id: data.account.id, - name: data.account.name - }; - if (data.application) { - this.application = { - id: data.application.id, - name: data.application.name, - icon: data.application.icon ? data.application.icon : undefined, - description: data.application.description, - bot: data.application.bot ? new User(session, data.application.bot) : undefined - }; - } - } - session; - id; - guildId; - name; - type; - enabled; - syncing; - roleId; - enableEmoticons; - expireBehavior; - expireGracePeriod; - syncedAt; - subscriberCount; - revoked; - user; - account; - application; -} -class BaseInteraction { - constructor(session, data){ - this.session = session; - this.id = data.id; - this.token = data.token; - this.type = data.type; - this.guildId = data.guild_id; - this.channelId = data.channel_id; - this.applicationId = data.application_id; - this.version = data.version; - const perms = data.app_permissions; - if (perms) { - this.appPermissions = new Permissions(BigInt(perms)); - } - if (!data.guild_id) { - this.user = new User(session, data.user); - } else { - this.member = new Member(session, data.member, data.guild_id); - } - } - session; - id; - token; - type; - guildId; - channelId; - applicationId; - user; - member; - appPermissions; - version; - get createdTimestamp() { - return Snowflake.snowflakeToTimestamp(this.id); - } - get createdAt() { - return new Date(this.createdTimestamp); - } - isCommand() { - return this.type === InteractionTypes.ApplicationCommand; - } - isAutoComplete() { - return this.type === InteractionTypes.ApplicationCommandAutocomplete; - } - isComponent() { - return this.type === InteractionTypes.MessageComponent; - } - isPing() { - return this.type === InteractionTypes.Ping; - } - isModalSubmit() { - return this.type === InteractionTypes.ModalSubmit; - } - inGuild() { - return !!this.guildId; - } -} -function transformOasisInteractionDataOption(o) { - const output = { - ...o, - Otherwise: o.value - }; - switch(o.type){ - case ApplicationCommandOptionTypes.String: - output.String = o.value; - break; - case ApplicationCommandOptionTypes.Number: - output.Number = o.value; - break; - case ApplicationCommandOptionTypes.Integer: - output.Integer = o.value; - break; - case ApplicationCommandOptionTypes.Boolean: - output.Boolean = o.value; - break; - case ApplicationCommandOptionTypes.Role: - output.Role = BigInt(o.value); - break; - case ApplicationCommandOptionTypes.User: - output.User = BigInt(o.value); - break; - case ApplicationCommandOptionTypes.Channel: - output.Channel = BigInt(o.value); - break; - case ApplicationCommandOptionTypes.Mentionable: - case ApplicationCommandOptionTypes.SubCommand: - case ApplicationCommandOptionTypes.SubCommandGroup: - default: - output.Otherwise = o.value; - } - return output; -} -class CommandInteractionOptionResolver { - #subcommand; - #group; - hoistedOptions; - resolved; - constructor(options, resolved){ - this.hoistedOptions = options?.map(transformOasisInteractionDataOption) ?? []; - if (this.hoistedOptions[0]?.type === ApplicationCommandOptionTypes.SubCommandGroup) { - this.#group = this.hoistedOptions[0].name; - this.hoistedOptions = (this.hoistedOptions[0].options ?? []).map(transformOasisInteractionDataOption); - } - if (this.hoistedOptions[0]?.type === ApplicationCommandOptionTypes.SubCommand) { - this.#subcommand = this.hoistedOptions[0].name; - this.hoistedOptions = (this.hoistedOptions[0].options ?? []).map(transformOasisInteractionDataOption); - } - this.resolved = resolved; - } - getTypedOption(name, type, properties, required) { - const option = this.get(name, required); - if (!option) { - return; - } - if (option.type !== type) {} - if (required === true && properties.every((prop)=>typeof option[prop] === "undefined")) { - throw new TypeError(`Properties ${properties.join(", ")} are missing in option ${name}`); - } - return option; - } - get(name, required) { - const option = this.hoistedOptions.find((o)=>typeof name === "number" ? o.name === name.toString() : o.name === name); - if (!option) { - if (required && name in this.hoistedOptions.map((o)=>o.name)) { - throw new TypeError("Option marked as required was undefined"); - } - return; - } - return option; - } - getString(name, required = false) { - const option = this.getTypedOption(name, ApplicationCommandOptionTypes.String, [ - "Otherwise" - ], required); - return option?.Otherwise ?? undefined; - } - getNumber(name, required = false) { - const option = this.getTypedOption(name, ApplicationCommandOptionTypes.Number, [ - "Otherwise" - ], required); - return option?.Otherwise ?? undefined; - } - getInteger(name, required = false) { - const option = this.getTypedOption(name, ApplicationCommandOptionTypes.Integer, [ - "Otherwise" - ], required); - return option?.Otherwise ?? undefined; - } - getBoolean(name, required = false) { - const option = this.getTypedOption(name, ApplicationCommandOptionTypes.Boolean, [ - "Otherwise" - ], required); - return option?.Otherwise ?? undefined; - } - getUser(name, required = false) { - const option = this.getTypedOption(name, ApplicationCommandOptionTypes.User, [ - "Otherwise" - ], required); - return option?.Otherwise ?? undefined; - } - getChannel(name, required = false) { - const option = this.getTypedOption(name, ApplicationCommandOptionTypes.Channel, [ - "Otherwise" - ], required); - return option?.Otherwise ?? undefined; - } - getMentionable(name, required = false) { - const option = this.getTypedOption(name, ApplicationCommandOptionTypes.Mentionable, [ - "Otherwise" - ], required); - return option?.Otherwise ?? undefined; - } - getRole(name, required = false) { - const option = this.getTypedOption(name, ApplicationCommandOptionTypes.Role, [ - "Otherwise" - ], required); - return option?.Otherwise ?? undefined; - } - getAttachment(name, required = false) { - const option = this.getTypedOption(name, ApplicationCommandOptionTypes.Attachment, [ - "Otherwise" - ], required); - return option?.Otherwise ?? undefined; - } - getFocused(full = false) { - const focusedOption = this.hoistedOptions.find((option)=>option.focused); - if (!focusedOption) { - throw new TypeError("No option found"); - } - return full ? focusedOption : focusedOption.Otherwise; - } - getSubCommand(required = true) { - if (required && !this.#subcommand) { - throw new TypeError("Option marked as required was undefined"); - } - return [ - this.#subcommand, - this.hoistedOptions - ]; - } - getSubCommandGroup(required = false) { - if (required && !this.#group) { - throw new TypeError("Option marked as required was undefined"); - } - return [ - this.#group, - this.hoistedOptions - ]; - } -} -class CommandInteraction extends BaseInteraction { - constructor(session, data){ - super(session, data); - this.type = data.type; - this.commandId = data.data.id; - this.commandName = data.data.name; - this.commandType = data.data.type; - this.commandGuildId = data.data.guild_id; - this.options = new CommandInteractionOptionResolver(data.data.options ?? []); - this.resolved = { - users: new Map(), - members: new Map(), - roles: new Map(), - attachments: new Map(), - messages: new Map() - }; - if (data.data.resolved?.users) { - for (const [id, u] of Object.entries(data.data.resolved.users)){ - this.resolved.users.set(id, new User(session, u)); - } - } - if (data.data.resolved?.members && !!super.guildId) { - for (const [id1, m] of Object.entries(data.data.resolved.members)){ - this.resolved.members.set(id1, new Member(session, m, super.guildId)); - } - } - if (data.data.resolved?.roles && !!super.guildId) { - for (const [id2, r] of Object.entries(data.data.resolved.roles)){ - this.resolved.roles.set(id2, new Role(session, r, super.guildId)); - } - } - if (data.data.resolved?.attachments) { - for (const [id3, a] of Object.entries(data.data.resolved.attachments)){ - this.resolved.attachments.set(id3, new Attachment(session, a)); - } - } - if (data.data.resolved?.messages) { - for (const [id4, m1] of Object.entries(data.data.resolved.messages)){ - this.resolved.messages.set(id4, new Message(session, m1)); - } - } - } - type; - commandId; - commandName; - commandType; - commandGuildId; - resolved; - options; - responded = false; - async sendFollowUp(options) { - const message = await Webhook.prototype.execute.call({ - id: this.applicationId, - token: this.token, - session: this.session - }, options); - return message; - } - async respond({ type , data: options }) { - const data = { - content: options?.content, - custom_id: options?.customId, - file: options?.files, - allowed_mentions: options?.allowedMentions, - flags: options?.flags, - chocies: options?.choices, - embeds: options?.embeds, - title: options?.title - }; - if (!this.responded) { - await this.session.rest.sendRequest(this.session.rest, { - url: INTERACTION_ID_TOKEN(this.id, this.token), - method: "POST", - payload: this.session.rest.createRequestBody(this.session.rest, { - method: "POST", - body: { - type, - data, - file: options?.files - }, - headers: { - "Authorization": "" - } - }) - }); - this.responded = true; - return; - } - return this.sendFollowUp(data); - } -} -class ComponentInteraction extends BaseInteraction { - constructor(session, data){ - super(session, data); - this.type = data.type; - this.componentType = data.data.component_type; - this.customId = data.data.custom_id; - this.targetId = data.data.target_id; - this.values = data.data.values; - this.message = new Message(session, data.message); - } - type; - componentType; - customId; - targetId; - values; - message; - responded = false; - isButton() { - return this.componentType === MessageComponentTypes.Button; - } - isActionRow() { - return this.componentType === MessageComponentTypes.ActionRow; - } - isTextInput() { - return this.componentType === MessageComponentTypes.InputText; - } - isSelectMenu() { - return this.componentType === MessageComponentTypes.SelectMenu; - } - sendFollowUp(options) { - return CommandInteraction.prototype.sendFollowUp.call(this, options); - } - respond(options) { - return CommandInteraction.prototype.respond.call(this, options); - } -} -class PingInteraction extends BaseInteraction { - constructor(session, data){ - super(session, data); - this.type = data.type; - this.commandId = data.data.id; - this.commandName = data.data.name; - this.commandType = data.data.type; - this.commandGuildId = data.data.guild_id; - } - type; - commandId; - commandName; - commandType; - commandGuildId; - async pong() { - await this.session.rest.runMethod(this.session.rest, "POST", INTERACTION_ID_TOKEN(this.id, this.token), { - type: InteractionResponseTypes.Pong - }); - } -} -class AutoCompleteInteraction extends BaseInteraction { - constructor(session, data){ - super(session, data); - this.type = data.type; - this.commandId = data.data.id; - this.commandName = data.data.name; - this.commandType = data.data.type; - this.commandGuildId = data.data.guild_id; - } - type; - commandId; - commandName; - commandType; - commandGuildId; - async respond(choices) { - await this.session.rest.runMethod(this.session.rest, "POST", INTERACTION_ID_TOKEN(this.id, this.token), { - data: { - choices - }, - type: InteractionResponseTypes.ApplicationCommandAutocompleteResult - }); - } -} -class ModalSubmitInteraction extends BaseInteraction { - constructor(session, data){ - super(session, data); - this.type = data.type; - this.componentType = data.data.component_type; - this.customId = data.data.custom_id; - this.targetId = data.data.target_id; - this.values = data.data.values; - this.components = data.data?.components?.map(ModalSubmitInteraction.transformComponent); - if (data.message) { - this.message = new Message(session, data.message); - } - } - type; - componentType; - customId; - targetId; - values; - message; - components; - static transformComponent(component) { - return { - type: component.type, - components: component.components.map((component)=>{ - return { - customId: component.custom_id, - value: component.value - }; - }) - }; - } - inMessage() { - return !!this.message; - } -} -class InteractionFactory { - static from(session, interaction) { - switch(interaction.type){ - case InteractionTypes.Ping: - return new PingInteraction(session, interaction); - case InteractionTypes.ApplicationCommand: - return new CommandInteraction(session, interaction); - case InteractionTypes.MessageComponent: - return new ComponentInteraction(session, interaction); - case InteractionTypes.ApplicationCommandAutocomplete: - return new AutoCompleteInteraction(session, interaction); - case InteractionTypes.ModalSubmit: - return new ModalSubmitInteraction(session, interaction); - } - } -} -const READY = (session, shardId, payload)=>{ - session.applicationId = payload.application.id; - session.botId = payload.user.id; - session.emit("ready", { - ...payload, - user: new User(session, payload.user) - }, shardId); -}; -const MESSAGE_CREATE = (session, _shardId, message)=>{ - session.emit("messageCreate", new Message(session, message)); -}; -const MESSAGE_UPDATE = (session, _shardId, new_message)=>{ - if (!new_message.edited_timestamp) { - const message = { - session, - id: new_message.id, - guildId: new_message.guild_id, - channelId: new_message.channel_id - }; - Object.setPrototypeOf(message, Message.prototype); - session.emit("messageUpdate", message); - return; - } - session.emit("messageUpdate", new Message(session, new_message)); -}; -const MESSAGE_DELETE = (session, _shardId, { id , channel_id , guild_id })=>{ - session.emit("messageDelete", { - id, - channelId: channel_id, - guildId: guild_id - }); -}; -const GUILD_CREATE = (session, _shardId, guild)=>{ - session.emit("guildCreate", new Guild(session, guild)); -}; -const GUILD_DELETE = (session, _shardId, guild)=>{ - session.emit("guildDelete", { - id: guild.id, - unavailable: true - }); -}; -const GUILD_MEMBER_ADD = (session, _shardId, member)=>{ - session.emit("guildMemberAdd", new Member(session, member, member.guild_id)); -}; -const GUILD_MEMBER_UPDATE = (session, _shardId, member)=>{ - session.emit("guildMemberUpdate", new Member(session, member, member.guild_id)); -}; -const GUILD_MEMBER_REMOVE = (session, _shardId, member)=>{ - session.emit("guildMemberRemove", new User(session, member.user), member.guild_id); -}; -const GUILD_BAN_ADD = (session, _shardId, data)=>{ - session.emit("guildBanAdd", { - guildId: data.guild_id, - user: data.user - }); -}; -const GUILD_BAN_REMOVE = (session, _shardId, data)=>{ - session.emit("guildBanRemove", { - guildId: data.guild_id, - user: data.user - }); -}; -const GUILD_EMOJIS_UPDATE = (session, _shardId, data)=>{ - session.emit("guildEmojisUpdate", { - guildId: data.guild_id, - emojis: data.emojis - }); -}; -const GUILD_ROLE_CREATE = (session, _shardId, data)=>{ - session.emit("guildRoleCreate", { - guildId: data.guild_id, - role: data.role - }); -}; -const GUILD_ROLE_UPDATE = (session, _shardId, data)=>{ - session.emit("guildRoleUpdate", { - guildId: data.guild_id, - role: data.role - }); -}; -const GUILD_ROLE_DELETE = (session, _shardId, data)=>{ - session.emit("guildRoleDelete", { - guildId: data.guild_id, - roleId: data.role_id - }); -}; -const TYPING_START = (session, _shardId, payload)=>{ - session.emit("typingStart", { - channelId: payload.channel_id, - guildId: payload.guild_id ? payload.guild_id : undefined, - userId: payload.user_id, - timestamp: payload.timestamp, - member: payload.guild_id ? new Member(session, payload.member, payload.guild_id) : undefined - }); -}; -const INTERACTION_CREATE = (session, _shardId, interaction)=>{ - session.emit("interactionCreate", InteractionFactory.from(session, interaction)); -}; -const CHANNEL_CREATE = (session, _shardId, channel)=>{ - session.emit("channelCreate", ChannelFactory.from(session, channel)); -}; -const CHANNEL_UPDATE = (session, _shardId, channel)=>{ - session.emit("channelUpdate", ChannelFactory.from(session, channel)); -}; -const CHANNEL_DELETE = (session, _shardId, channel)=>{ - if (!channel.guild_id) return; - session.emit("channelDelete", new GuildChannel(session, channel, channel.guild_id)); -}; -const THREAD_CREATE = (session, _shardId, channel)=>{ - if (!channel.guild_id) return; - session.emit("threadCreate", new ThreadChannel(session, channel, channel.guild_id)); -}; -const THREAD_UPDATE = (session, _shardId, channel)=>{ - if (!channel.guild_id) return; - session.emit("threadUpdate", new ThreadChannel(session, channel, channel.guild_id)); -}; -const THREAD_DELETE = (session, _shardId, channel)=>{ - if (!channel.guild_id) return; - session.emit("threadDelete", new ThreadChannel(session, channel, channel.guild_id)); -}; -const THREAD_MEMBER_UPDATE = (session, _shardId, payload)=>{ - session.emit("threadMemberUpdate", { - guildId: payload.guild_id, - id: payload.id, - userId: payload.user_id, - joinedAt: payload.joined_at, - flags: payload.flags - }); -}; -const THREAD_MEMBERS_UPDATE = (session, _shardId, payload)=>{ - session.emit("threadMembersUpdate", { - memberCount: payload.member_count, - addedMembers: payload.added_members ? payload.added_members.map((tm)=>new ThreadMember(session, tm)) : undefined, - removedMemberIds: payload.removed_member_ids ? payload.removed_member_ids : undefined, - guildId: payload.guild_id, - id: payload.id - }); -}; -const THREAD_LIST_SYNC = (session, _shardId, payload)=>{ - session.emit("threadListSync", { - guildId: payload.guild_id, - channelIds: payload.channel_ids ?? [], - threads: payload.threads.map((channel)=>new ThreadChannel(session, channel, payload.guild_id)), - members: payload.members.map((member)=>new ThreadMember(session, member)) - }); -}; -const CHANNEL_PINS_UPDATE = (session, _shardId, payload)=>{ - session.emit("channelPinsUpdate", { - guildId: payload.guild_id, - channelId: payload.channel_id, - lastPinTimestamp: payload.last_pin_timestamp ? Date.parse(payload.last_pin_timestamp) : undefined - }); -}; -const USER_UPDATE = (session, _shardId, payload)=>{ - session.emit("userUpdate", new User(session, payload)); -}; -const PRESENCE_UPDATE = (session, _shardId, payload)=>{ - session.emit("presenceUpdate", new Presence(session, payload)); -}; -const WEBHOOKS_UPDATE = (session, _shardId, webhook)=>{ - session.emit("webhooksUpdate", { - guildId: webhook.guild_id, - channelId: webhook.channel_id - }); -}; -const INTEGRATION_CREATE = (session, _shardId, payload)=>{ - session.emit("integrationCreate", new Integration(session, payload)); -}; -const INTEGRATION_UPDATE = (session, _shardId, payload)=>{ - session.emit("integrationCreate", new Integration(session, payload)); -}; -const INTEGRATION_DELETE = (session, _shardId, payload)=>{ - session.emit("integrationDelete", { - id: payload.id, - guildId: payload.guild_id, - applicationId: payload.application_id - }); -}; -const AUTO_MODERATION_RULE_CREATE = (session, _shardId, payload)=>{ - session.emit("autoModerationRuleCreate", new AutoModerationRule(session, payload)); -}; -const AUTO_MODERATION_RULE_UPDATE = (session, _shardId, payload)=>{ - session.emit("autoModerationRuleUpdate", new AutoModerationRule(session, payload)); -}; -const AUTO_MODERATION_RULE_DELETE = (session, _shardId, payload)=>{ - session.emit("autoModerationRuleDelete", new AutoModerationRule(session, payload)); -}; -const AUTO_MODERATION_ACTION_EXECUTE = (session, _shardId, payload)=>{ - session.emit("autoModerationActionExecution", new AutoModerationExecution(session, payload)); -}; -const MESSAGE_REACTION_ADD = (session, _shardId, reaction)=>{ - session.emit("messageReactionAdd", NewMessageReactionAdd(session, reaction)); -}; -const MESSAGE_REACTION_REMOVE = (session, _shardId, reaction)=>{ - session.emit("messageReactionRemove", NewMessageReactionAdd(session, reaction)); -}; -const MESSAGE_REACTION_REMOVE_ALL = (session, _shardId, reaction)=>{ - session.emit("messageReactionRemoveAll", NewMessageReactionAdd(session, reaction)); -}; -const MESSAGE_REACTION_REMOVE_EMOJI = (session, _shardId, reaction)=>{ - session.emit("messageReactionRemoveEmoji", NewMessageReactionAdd(session, reaction)); -}; -const INVITE_CREATE = (session, _shardId, invite)=>{ - session.emit("inviteCreate", NewInviteCreate(session, invite)); -}; -const INVITE_DELETE = (session, _shardId, data)=>{ - session.emit("inviteDelete", { - channelId: data.channel_id, - guildId: data.guild_id, - code: data.code - }); -}; -const STAGE_INSTANCE_CREATE = (session, _shardId, payload)=>{ - session.emit("stageInstanceCreate", new StageInstance(session, payload)); -}; -const STAGE_INSTANCE_UPDATE = (session, _shardId, payload)=>{ - session.emit("stageInstanceUpdate", new StageInstance(session, payload)); -}; -const STAGE_INSTANCE_DELETE = (session, _shardId, payload)=>{ - session.emit("stageInstanceDelete", new StageInstance(session, payload)); -}; -const GUILD_SCHEDULED_EVENT_CREATE = (session, _shardId, payload)=>{ - session.emit("guildScheduledEventCreate", new ScheduledEvent(session, payload)); -}; -const GUILD_SCHEDULED_EVENT_UPDATE = (session, _shardId, payload)=>{ - session.emit("guildScheduledEventUpdate", new ScheduledEvent(session, payload)); -}; -const GUILD_SCHEDULED_EVENT_DELETE = (session, _shardId, payload)=>{ - session.emit("guildScheduledEventDelete", new ScheduledEvent(session, payload)); -}; -const GUILD_SCHEDULED_EVENT_USER_ADD = (session, _shardId, payload)=>{ - session.emit("guildScheduledEventUserAdd", { - scheduledEventId: payload.guild_scheduled_event_id, - userId: payload.user_id, - guildId: payload.guild_id - }); -}; -const GUILD_SCHEDULED_EVENT_USER_REMOVE = (session, _shardId, payload)=>{ - session.emit("guildScheduledEventUserRemove", { - scheduledEventId: payload.guild_scheduled_event_id, - userId: payload.user_id, - guildId: payload.guild_id - }); -}; -const raw = (session, shardId, data)=>{ - session.emit("raw", data, shardId); -}; -const mod = { - READY: READY, - MESSAGE_CREATE: MESSAGE_CREATE, - MESSAGE_UPDATE: MESSAGE_UPDATE, - MESSAGE_DELETE: MESSAGE_DELETE, - GUILD_CREATE: GUILD_CREATE, - GUILD_DELETE: GUILD_DELETE, - GUILD_MEMBER_ADD: GUILD_MEMBER_ADD, - GUILD_MEMBER_UPDATE: GUILD_MEMBER_UPDATE, - GUILD_MEMBER_REMOVE: GUILD_MEMBER_REMOVE, - GUILD_BAN_ADD: GUILD_BAN_ADD, - GUILD_BAN_REMOVE: GUILD_BAN_REMOVE, - GUILD_EMOJIS_UPDATE: GUILD_EMOJIS_UPDATE, - GUILD_ROLE_CREATE: GUILD_ROLE_CREATE, - GUILD_ROLE_UPDATE: GUILD_ROLE_UPDATE, - GUILD_ROLE_DELETE: GUILD_ROLE_DELETE, - TYPING_START: TYPING_START, - INTERACTION_CREATE: INTERACTION_CREATE, - CHANNEL_CREATE: CHANNEL_CREATE, - CHANNEL_UPDATE: CHANNEL_UPDATE, - CHANNEL_DELETE: CHANNEL_DELETE, - THREAD_CREATE: THREAD_CREATE, - THREAD_UPDATE: THREAD_UPDATE, - THREAD_DELETE: THREAD_DELETE, - THREAD_MEMBER_UPDATE: THREAD_MEMBER_UPDATE, - THREAD_MEMBERS_UPDATE: THREAD_MEMBERS_UPDATE, - THREAD_LIST_SYNC: THREAD_LIST_SYNC, - CHANNEL_PINS_UPDATE: CHANNEL_PINS_UPDATE, - USER_UPDATE: USER_UPDATE, - PRESENCE_UPDATE: PRESENCE_UPDATE, - WEBHOOKS_UPDATE: WEBHOOKS_UPDATE, - INTEGRATION_CREATE: INTEGRATION_CREATE, - INTEGRATION_UPDATE: INTEGRATION_UPDATE, - INTEGRATION_DELETE: INTEGRATION_DELETE, - AUTO_MODERATION_RULE_CREATE: AUTO_MODERATION_RULE_CREATE, - AUTO_MODERATION_RULE_UPDATE: AUTO_MODERATION_RULE_UPDATE, - AUTO_MODERATION_RULE_DELETE: AUTO_MODERATION_RULE_DELETE, - AUTO_MODERATION_ACTION_EXECUTE: AUTO_MODERATION_ACTION_EXECUTE, - MESSAGE_REACTION_ADD: MESSAGE_REACTION_ADD, - MESSAGE_REACTION_REMOVE: MESSAGE_REACTION_REMOVE, - MESSAGE_REACTION_REMOVE_ALL: MESSAGE_REACTION_REMOVE_ALL, - MESSAGE_REACTION_REMOVE_EMOJI: MESSAGE_REACTION_REMOVE_EMOJI, - INVITE_CREATE: INVITE_CREATE, - INVITE_DELETE: INVITE_DELETE, - STAGE_INSTANCE_CREATE: STAGE_INSTANCE_CREATE, - STAGE_INSTANCE_UPDATE: STAGE_INSTANCE_UPDATE, - STAGE_INSTANCE_DELETE: STAGE_INSTANCE_DELETE, - GUILD_SCHEDULED_EVENT_CREATE: GUILD_SCHEDULED_EVENT_CREATE, - GUILD_SCHEDULED_EVENT_UPDATE: GUILD_SCHEDULED_EVENT_UPDATE, - GUILD_SCHEDULED_EVENT_DELETE: GUILD_SCHEDULED_EVENT_DELETE, - GUILD_SCHEDULED_EVENT_USER_ADD: GUILD_SCHEDULED_EVENT_USER_ADD, - GUILD_SCHEDULED_EVENT_USER_REMOVE: GUILD_SCHEDULED_EVENT_USER_REMOVE, - raw: raw -}; -class Session extends EventEmitter { - options; - rest; - gateway; - #botId; - #applicationId; - set applicationId(id) { - this.#applicationId = id; - } - get applicationId() { - return this.#applicationId; - } - set botId(id) { - this.#botId = id; - } - get botId() { - return this.#botId; - } - constructor(options){ - super(); - this.options = options; - const defHandler = (shard, data)=>{ - mod.raw(this, shard.id, data); - if (!data.t || !data.d) { - return; - } - mod[data.t]?.(this, shard.id, data.d); - }; - this.rest = createRestManager({ - token: this.options.token, - debug: (text)=>{ - super.rawListeners("debug")?.forEach((fn)=>fn(text)); - }, - secretKey: this.options.rest?.secretKey ?? undefined - }); - this.gateway = createGatewayManager({ - gatewayBot: this.options.gateway?.data ?? {}, - gatewayConfig: { - token: this.options.token, - intents: this.options.intents - }, - handleDiscordPayload: this.options.rawHandler ?? defHandler - }); - this.#botId = getBotIdFromToken(options.token).toString(); - } - on(event, func) { - return super.on(event, func); - } - off(event, func) { - return super.off(event, func); - } - once(event, func) { - return super.once(event, func); - } - emit(event, ...params) { - return super.emit(event, ...params); - } - editStatus(shardId, status) { - const shard = this.gateway.manager.shards.get(shardId); - if (!shard) { - throw new Error(`Unknown shard ${shardId}`); - } - shard.send({ - op: GatewayOpcodes.PresenceUpdate, - d: { - status: status.status, - since: null, - afk: false, - activities: status.activities.map((activity)=>{ - return { - name: activity.name, - type: activity.type, - url: activity.url, - created_at: activity.createdAt, - timestamps: activity.timestamps, - application_id: this.applicationId, - details: activity.details, - state: activity.state, - emoji: activity.emoji || { - name: activity.emoji.name, - id: activity.emoji.id, - animated: activity.emoji.animated - }, - party: activity.party, - assets: activity.assets ? { - large_image: activity.assets.largeImage, - large_text: activity.assets.largeText, - small_image: activity.assets.smallImage, - small_text: activity.assets.smallText - } : undefined, - secrets: activity.secrets, - instance: activity.instance, - flags: activity.flags, - buttons: activity.buttons - }; - }) - } - }); - } - async fetchUser(id) { - const user = await this.rest.runMethod(this.rest, "GET", USER(id)); - if (!user.id) return; - return new User(this, user); - } - createApplicationCommand(options, guildId) { - return this.rest.runMethod(this.rest, "POST", guildId ? GUILD_APPLICATION_COMMANDS(this.applicationId, guildId) : APPLICATION_COMMANDS(this.applicationId), this.isContextApplicationCommand(options) ? { - name: options.name, - name_localizations: options.nameLocalizations, - type: options.type - } : { - name: options.name, - name_localizations: options.nameLocalizations, - description: options.description, - description_localizations: options.descriptionLocalizations, - type: options.type, - options: options.options, - default_member_permissions: options.defaultMemberPermissions ? new Permissions(options.defaultMemberPermissions).bitfield.toString() : undefined, - dm_permission: options.dmPermission - }); - } - deleteApplicationCommand(id, guildId) { - return this.rest.runMethod(this.rest, "DELETE", guildId ? GUILD_APPLICATION_COMMANDS(this.applicationId, guildId, id) : APPLICATION_COMMANDS(this.applicationId, id)); - } - updateApplicationCommandPermissions(guildId, id, bearerToken, options) { - return this.rest.runMethod(this.rest, "PUT", GUILD_APPLICATION_COMMANDS_PERMISSIONS(this.applicationId, guildId, id), { - permissions: options - }, { - headers: { - authorization: `Bearer ${bearerToken}` - } - }); - } - fetchApplicationCommand(id, options) { - return this.rest.runMethod(this.rest, "GET", options?.guildId ? GUILD_APPLICATION_COMMANDS_LOCALIZATIONS(this.applicationId, options.guildId, id, options?.withLocalizations) : APPLICATION_COMMANDS(this.applicationId, id)); - } - fetchApplicationCommandPermissions(guildId) { - return this.rest.runMethod(this.rest, "GET", GUILD_APPLICATION_COMMANDS_PERMISSIONS(this.applicationId, guildId)); - } - fetchApplicationCommandPermission(guildId, id) { - return this.rest.runMethod(this.rest, "GET", GUILD_APPLICATION_COMMANDS_PERMISSIONS(this.applicationId, guildId, id)); - } - upsertApplicationCommand(id, options, guildId) { - return this.rest.runMethod(this.rest, "PATCH", guildId ? GUILD_APPLICATION_COMMANDS(this.applicationId, guildId) : APPLICATION_COMMANDS(this.applicationId, id), this.isContextApplicationCommand(options) ? { - name: options.name, - type: options.type - } : { - name: options.name, - description: options.description, - type: options.type, - options: options.options - }); - } - upsertApplicationCommands(options, guildId) { - return this.rest.runMethod(this.rest, "PUT", guildId ? GUILD_APPLICATION_COMMANDS(this.applicationId, guildId) : APPLICATION_COMMANDS(this.applicationId), options.map((o)=>this.isContextApplicationCommand(o) ? { - name: o.name, - type: o.type - } : { - name: o.name, - description: o.description, - type: o.type, - options: o.options - })); - } - fetchCommands(guildId) { - return this.rest.runMethod(this.rest, "GET", guildId ? GUILD_APPLICATION_COMMANDS(this.applicationId, guildId) : APPLICATION_COMMANDS(this.applicationId)); - } - isContextApplicationCommand(cmd) { - return cmd.type === ApplicationCommandTypes.Message || cmd.type === ApplicationCommandTypes.User; - } - async start() { - const getGatewayBot = ()=>this.rest.runMethod(this.rest, "GET", GATEWAY_BOT()); - if (!Object.keys(this.options.gateway?.data ?? {}).length) { - const nonParsed = await getGatewayBot(); - this.gateway.gatewayBot = { - url: nonParsed.url, - shards: nonParsed.shards, - sessionStartLimit: { - total: nonParsed.session_start_limit.total, - remaining: nonParsed.session_start_limit.remaining, - resetAfter: nonParsed.session_start_limit.reset_after, - maxConcurrency: nonParsed.session_start_limit.max_concurrency - } - }; - this.gateway.lastShardId = this.gateway.gatewayBot.shards - 1; - this.gateway.manager.totalShards = this.gateway.gatewayBot.shards; - } - this.gateway.spawnShards(); - } -} -class Sticker { - constructor(session, data){ - this.session = session; - this.id = data.id; - this.packId = data.pack_id; - this.name = data.name; - this.description = data.description; - this.tags = data.tags.split(","); - this.type = data.type; - this.formatType = data.format_type; - this.available = !!data.available; - this.guildId = data.guild_id; - this.user = data.user ? new User(this.session, data.user) : undefined; - this.sortValue = data.sort_value; - } - session; - id; - packId; - name; - description; - tags; - type; - formatType; - available; - guildId; - user; - sortValue; - async fetchPremiumPack() { - const data = await this.session.rest.runMethod(this.session.rest, "GET", STICKER_PACKS()); - return { - id: data.id, - stickers: data.stickers.map((st)=>new Sticker(this.session, st)), - name: data.name, - skuId: data.sku_id, - coverStickerId: data.cover_sticker_id, - description: data.description, - bannerAssetId: data.banner_asset_id - }; - } -} -class ChoiceBuilder { - name; - value; - setName(name) { - this.name = name; - return this; - } - setValue(value) { - this.value = value; - return this; - } - toJSON() { - if (!this.name) throw new TypeError("Property 'name' is required"); - if (!this.value) throw new TypeError("Property 'value' is required"); - return { - name: this.name, - value: this.value - }; - } -} -class OptionBuilder { - required; - autocomplete; - constructor(type, name, description){ - this.type = type; - this.name = name; - this.description = description; - this.type = type; - this.name = name; - this.description = description; - } - setType(type) { - return this.type = type, this; - } - setName(name) { - return this.name = name, this; - } - setDescription(description) { - return this.description = description, this; - } - setRequired(required) { - return this.required = required, this; - } - toJSON() { - if (!this.type) throw new TypeError("Property 'type' is required"); - if (!this.name) throw new TypeError("Property 'name' is required"); - if (!this.description) { - throw new TypeError("Property 'description' is required"); - } - const applicationCommandOption = { - type: this.type, - name: this.name, - description: this.description, - required: this.required ? true : false - }; - return applicationCommandOption; - } - type; - name; - description; -} -class OptionBuilderLimitedValues extends OptionBuilder { - choices; - minValue; - maxValue; - constructor(type, name, description){ - super(); - this.type = type; - this.name = name; - this.description = description; - this.type = type; - this.name = name; - this.description = description; - } - setMinValue(n) { - return this.minValue = n, this; - } - setMaxValue(n) { - return this.maxValue = n, this; - } - addChoice(fn) { - const choice = fn(new ChoiceBuilder()); - this.choices ??= []; - this.choices.push(choice); - return this; - } - toJSON() { - return { - ...super.toJSON(), - choices: this.choices?.map((c)=>c.toJSON()) ?? [], - minValue: this.minValue, - maxValue: this.maxValue - }; - } - type; - name; - description; -} -class OptionBuilderString extends OptionBuilder { - choices; - constructor(type, name, description){ - super(); - this.type = type; - this.name = name; - this.description = description; - this.type = type; - this.name = name; - this.description = description; - } - addChoice(fn) { - const choice = fn(new ChoiceBuilder()); - this.choices ??= []; - this.choices.push(choice); - return this; - } - toJSON() { - return { - ...super.toJSON(), - choices: this.choices?.map((c)=>c.toJSON()) ?? [] - }; - } - type; - name; - description; -} -class OptionBuilderChannel extends OptionBuilder { - channelTypes; - constructor(type, name, description){ - super(); - this.type = type; - this.name = name; - this.description = description; - this.type = type; - this.name = name; - this.description = description; - } - addChannelTypes(...channels) { - this.channelTypes ??= []; - this.channelTypes.push(...channels); - return this; - } - toJSON() { - return { - ...super.toJSON(), - channelTypes: this.channelTypes ?? [] - }; - } - type; - name; - description; -} -class OptionBased { - options; - addOption(fn, type) { - const option = fn(new OptionBuilder(type)); - this.options ??= []; - this.options.push(option); - return this; - } - addNestedOption(fn) { - const option = fn(new OptionBuilder(ApplicationCommandOptionTypes.SubCommand)); - this.options ??= []; - this.options.push(option); - return this; - } - addStringOption(fn) { - const option = fn(new OptionBuilderString(ApplicationCommandOptionTypes.String)); - this.options ??= []; - this.options.push(option); - return this; - } - addIntegerOption(fn) { - const option = fn(new OptionBuilderLimitedValues(ApplicationCommandOptionTypes.Integer)); - this.options ??= []; - this.options.push(option); - return this; - } - addNumberOption(fn) { - const option = fn(new OptionBuilderLimitedValues(ApplicationCommandOptionTypes.Number)); - this.options ??= []; - this.options.push(option); - return this; - } - addBooleanOption(fn) { - return this.addOption(fn, ApplicationCommandOptionTypes.Boolean); - } - addSubCommand(fn) { - const option = fn(new OptionBuilderNested(ApplicationCommandOptionTypes.SubCommand)); - this.options ??= []; - this.options.push(option); - return this; - } - addSubCommandGroup(fn) { - const option = fn(new OptionBuilderNested(ApplicationCommandOptionTypes.SubCommandGroup)); - this.options ??= []; - this.options.push(option); - return this; - } - addUserOption(fn) { - return this.addOption(fn, ApplicationCommandOptionTypes.User); - } - addChannelOption(fn) { - const option = fn(new OptionBuilderChannel(ApplicationCommandOptionTypes.Channel)); - this.options ??= []; - this.options.push(option); - return this; - } - addRoleOption(fn) { - return this.addOption(fn, ApplicationCommandOptionTypes.Role); - } - addMentionableOption(fn) { - return this.addOption(fn, ApplicationCommandOptionTypes.Mentionable); - } - static applyTo(klass, ignore = []) { - const methods = [ - "addOption", - "addNestedOption", - "addStringOption", - "addIntegerOption", - "addNumberOption", - "addBooleanOption", - "addSubCommand", - "addSubCommandGroup", - "addUserOption", - "addChannelOption", - "addRoleOption", - "addMentionableOption", - ]; - for (const method of methods){ - if (ignore.includes(method)) continue; - klass.prototype[method] = OptionBased.prototype[method]; - } - } -} -class OptionBuilderNested extends OptionBuilder { - constructor(type, name, description){ - super(); - this.type = type; - this.name = name; - this.description = description; - this.type = type; - this.name = name; - this.description = description; - } - toJSON() { - if (!this.type) throw new TypeError("Property 'type' is required"); - if (!this.name) throw new TypeError("Property 'name' is required"); - if (!this.description) { - throw new TypeError("Property 'description' is required"); - } - return { - type: this.type, - name: this.name, - description: this.description, - options: this.options?.map((o)=>o.toJSON()) ?? [], - required: this.required ? true : false - }; - } - type; - name; - description; -} -OptionBased.applyTo(OptionBuilderNested); -class ApplicationCommandBuilder { - constructor(type = ApplicationCommandTypes.ChatInput, name = "", description = "", defaultMemberPermissions, nameLocalizations, descriptionLocalizations, dmPermission = true){ - this.type = type; - this.name = name; - this.description = description; - this.defaultMemberPermissions = defaultMemberPermissions; - this.nameLocalizations = nameLocalizations; - this.descriptionLocalizations = descriptionLocalizations; - this.dmPermission = dmPermission; - this.type = type; - this.name = name; - this.description = description; - this.defaultMemberPermissions = defaultMemberPermissions; - this.nameLocalizations = nameLocalizations; - this.descriptionLocalizations = descriptionLocalizations; - this.dmPermission = dmPermission; - } - setType(type) { - return this.type = type, this; - } - setName(name) { - return this.name = name, this; - } - setDescription(description) { - return this.description = description, this; - } - setDefaultMemberPermission(perm) { - return this.defaultMemberPermissions = perm, this; - } - setNameLocalizations(l) { - return this.nameLocalizations = l, this; - } - setDescriptionLocalizations(l) { - return this.descriptionLocalizations = l, this; - } - setDmPermission(perm) { - return this.dmPermission = perm, this; - } - type; - name; - description; - defaultMemberPermissions; - nameLocalizations; - descriptionLocalizations; - dmPermission; -} -class ChatInputApplicationCommandBuilder extends ApplicationCommandBuilder { - type = ApplicationCommandTypes.ChatInput; - toJSON() { - if (!this.type) throw new TypeError("Propety 'type' is required"); - if (!this.name) throw new TypeError("Propety 'name' is required"); - if (!this.description) { - throw new TypeError("Propety 'description' is required"); - } - return { - type: ApplicationCommandTypes.ChatInput, - name: this.name, - description: this.description, - options: this.options?.map((o)=>o.toJSON()) ?? [], - defaultMemberPermissions: this.defaultMemberPermissions, - nameLocalizations: this.nameLocalizations, - descriptionLocalizations: this.descriptionLocalizations, - dmPermission: this.dmPermission - }; - } -} -OptionBased.applyTo(ChatInputApplicationCommandBuilder); -const cache_sym = Symbol("@cache"); -function __default(session) { - const cache = { - guilds: new StructCache(session), - users: new StructCache(session), - dms: new StructCache(session), - emojis: new StructCache(session), - cache: cache_sym, - session - }; - session.on("raw", (data)=>{ - const raw = data.d; - switch(data.t){ - case "MESSAGE_CREATE": - messageBootstrapper(cache, raw, false); - break; - case "MESSAGE_UPDATE": - messageBootstrapper(cache, raw, !raw.edited_timestamp); - break; - case "CHANNEL_UPDATE": - case "CHANNEL_CREATE": - channelBootstrapper(cache, raw); - break; - case "GUILD_MEMBER_ADD": - memberBootstrapper(cache, raw, raw.guild_id); - break; - case "GUILD_CREATE": - guildBootstrapper(cache, raw); - break; - case "GUILD_DELETE": - cache.guilds.delete(raw.id); - break; - case "MESSAGE_REACTION_ADD": - reactionBootstrapper(cache, raw, false); - break; - case "MESSAGE_REACTION_REMOVE": - reactionBootstrapper(cache, raw, false); - break; - case "MESSAGE_REACTION_REMOVE_ALL": - reactionBootstrapperDeletions(cache, raw); - break; - } - }); - return cache; -} -class StructCache extends Map { - constructor(session, entries){ - super(entries); - this.session = session; - } - session; - get(key) { - return super.get(key); - } - set(key, value) { - return super.set(key, value); - } - has(key) { - return super.has(key); - } - clear() { - return super.clear(); - } - random(amount) { - const arr = [ - ...this.values() - ]; - if (typeof amount === "undefined") return arr[Math.floor(Math.random() * arr.length)]; - if (!arr.length) return []; - if (amount && amount > arr.length) amount = arr.length; - return Array.from({ - length: Math.min(amount, arr.length) - }, ()=>arr.splice(Math.floor(Math.random() * arr.length), 1)[0]); - } - find(fn) { - for (const [key, value] of this.entries()){ - if (fn(value, key, this)) return value; - } - return undefined; - } - filter(fn) { - const result = new StructCache(this.session); - for (const [key, value] of this.entries()){ - if (fn(value, key, this)) result.set(key, value); - } - return result; - } - forEach(fn) { - super.forEach((v, k)=>{ - fn(v, k, this); - }); - } - clone() { - return new StructCache(this.session, this.entries()); - } - concat(structures) { - const conc = this.clone(); - for (const structure of structures){ - if (!structure || !(structure instanceof StructCache)) continue; - for (const [key, value] of structure.entries()){ - conc.set(key, value); - } - } - return conc; - } - some(fn) { - for (const [key, value] of this.entries()){ - if (fn(value, key, this)) { - return true; - } - } - return false; - } - every(fn) { - for (const [key, value] of this.entries()){ - if (!fn(value, key, this)) { - return false; - } - } - return true; - } - first(amount) { - if (!amount || amount <= 1) { - return this.values().next().value; - } - const values = [ - ...this.values() - ]; - amount = Math.min(values.length, amount); - return values.slice(0, amount); - } - last(amount) { - const values = [ - ...this.values() - ]; - if (!amount || amount <= 1) { - return values[values.length - 1]; - } - amount = Math.min(values.length, amount); - return values.slice(-amount); - } - reverse() { - const entries = [ - ...this.entries() - ].reverse(); - this.clear(); - for (const [key, value] of entries)this.set(key, value); - return this; - } - map(fn) { - const result = []; - for (const [key, value] of this.entries()){ - result.push(fn(value, key, this)); - } - return result; - } - reduce(fn, initV) { - const entries = this.entries(); - const first = entries.next().value; - let result = initV; - if (result !== undefined) { - result = fn(result, first[1], first[0], this); - } else { - result = first; - } - for (const [key, value] of entries){ - result = fn(result, value, key, this); - } - return result; - } - get size() { - return super.size; - } - get empty() { - return this.size === 0; - } - updateFields(key, obj) { - const value = this.get(key); - if (!value) { - return; - } - for(const prop in obj){ - if (obj[prop]) { - value[prop] = obj[prop]; - } - } - return this.set(key, value); - } - getOr(key, or) { - return this.get(key) ?? or; - } - retrieve(key, fn) { - const value = this.get(key); - if (!value) { - return; - } - return fn(value); - } -} -function reactionBootstrapperDeletions(cache, payload) { - if (payload.guild_id) { - cache.guilds.retrieve(payload.guild_id, (guild)=>{ - guild.channels.retrieve(payload.channel_id, (channel)=>{ - channel.messages.retrieve(payload.message_id, (message)=>{ - message.reactions = []; - }); - }); - }); - } else { - cache.dms.retrieve(payload.channel_id, (channel)=>{ - channel.messages.retrieve(payload.message_id, (message)=>{ - message.reactions = []; - }); - }); - } -} -function reactionBootstrapper(cache, reaction, remove) { - cache.emojis.set(reaction.emoji.id ?? reaction.emoji.name, new Emoji(cache.session, reaction.emoji)); - function onAdd(message) { - const reactions = message.reactions.map((r)=>r.emoji.name); - const upsertData = { - count: 1, - emoji: reaction.emoji, - me: reaction.user_id === cache.session.botId - }; - if (reactions.length === 0) { - message.reactions = []; - } else if (!reactions.includes(reaction.emoji.name)) { - message.reactions.push(new MessageReaction(cache.session, upsertData)); - } else { - const current = message.reactions?.[reactions.indexOf(reaction.emoji.name)]; - if (current && message.reactions?.[message.reactions.indexOf(current)]) { - ++message.reactions[message.reactions.indexOf(current)].count; - } - } - } - function onRemove(message) { - const reactions = message.reactions.map((r)=>r.emoji.name); - if (reactions.indexOf(reaction.emoji.name) !== undefined) { - const current = message.reactions[reactions.indexOf(reaction.emoji.name)]; - if (current) { - if (current.count > 0) { - current.count--; - } - if (current.count === 0) { - message.reactions.splice(reactions?.indexOf(reaction.emoji.name), 1); - } - } - } - } - if (reaction.guild_id) { - cache.guilds.retrieve(reaction.guild_id, (guild)=>{ - guild.channels.retrieve(reaction.channel_id, (channel)=>{ - channel.messages.retrieve(reaction.message_id, (message)=>{ - if (remove) onRemove(message); - else onAdd(message); - }); - }); - }); - } else { - cache.dms.retrieve(reaction.channel_id, (channel)=>{ - channel.messages.retrieve(reaction.message_id, (message)=>{ - if (remove) onRemove(message); - else onAdd(message); - }); - }); - } -} -function userBootstrapper(cache, user) { - cache.users.set(user.id, new User(cache.session, user)); -} -function emojiBootstrapper(cache, emoji, guildId) { - if (!emoji.id) return; - cache.emojis.set(emoji.id, new GuildEmoji(cache.session, emoji, guildId)); -} -function channelBootstrapper(cache, channel) { - if (!channel.guild_id) return; - cache.guilds.retrieve(channel.guild_id, (guild)=>{ - if (textBasedChannels.includes(channel.type)) { - guild.channels.set(channel.id, Object.assign(ChannelFactory.fromGuildChannel(cache.session, channel), { - messages: new StructCache(cache.session) - })); - } else { - guild.channels.set(channel.id, ChannelFactory.fromGuildChannel(cache.session, channel)); - } - }); -} -function memberBootstrapper(cache, member, guildId) { - cache.guilds.retrieve(guildId, (guild)=>{ - guild.members.set(member.user.id, Object.assign(new Member(cache.session, member, guildId), { - userId: member.user.id, - get user () { - return cache.users.get(this.userId); - } - })); - }); -} -function messageBootstrapper(cache, message, partial) { - if (message.member) { - const member = Object.assign(message.member, { - user: message.author - }); - memberBootstrapper(cache, member, message.guild_id); - } - if (cache.dms.has(message.channel_id)) { - cache.dms.retrieve(message.channel_id, (dm)=>{ - dm.messages[partial ? "updateFields" : "set"](message.id, Object.assign(new Message(cache.session, message), { - authorId: message.author.id, - get author () { - return cache.users.get(this.authorId); - } - })); - }); - } else { - cache.guilds.retrieve(message.guild_id, (guild)=>guild.channels.retrieve(message.channel_id, (dm)=>{ - dm.messages[partial ? "updateFields" : "set"](message.id, Object.assign(new Message(cache.session, message), { - authorId: message.author.id, - get author () { - return cache.users.get(this.authorId); - } - })); - })); - } -} -function guildBootstrapper(cache, guild) { - const members = new StructCache(cache.session, guild.members?.map((data)=>{ - const obj = Object.assign(new Member(cache.session, data, guild.id), { - userId: data.user.id, - get user () { - return cache.users.get(this.userId); - } - }); - return [ - data.user.id, - obj - ]; - })); - const channels = new StructCache(cache.session, guild.channels?.map((data)=>{ - const obj = Object.assign(ChannelFactory.from(cache.session, data), { - messages: new Map() - }); - return [ - data.id, - obj - ]; - })); - cache.guilds.set(guild.id, Object.assign(new Guild(cache.session, guild), { - members, - channels - })); -} -export { cache_sym as cache_sym }; -export { StructCache as StructCache }; -export { reactionBootstrapperDeletions as reactionBootstrapperDeletions }; -export { reactionBootstrapper as reactionBootstrapper }; -export { userBootstrapper as userBootstrapper }; -export { emojiBootstrapper as emojiBootstrapper }; -export { channelBootstrapper as channelBootstrapper }; -export { memberBootstrapper as memberBootstrapper }; -export { messageBootstrapper as messageBootstrapper }; -export { guildBootstrapper as guildBootstrapper }; -export { __default as enableCache }; -export { Session as default };