bakit 2.2.4 → 3.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.mjs","names":["REST","ShardingManager","#setupShardsListeners","#user","#handleDispatch","#tryEmitReady","#ready"],"sources":["../src/lib/structures/BaseStructure.ts","../src/lib/structures/User.ts","../src/lib/structures/Message.ts","../src/lib/structures/channel/BaseChannel.ts","../src/lib/mixins/ChannelMixin.ts","../src/lib/structures/channel/GuildTextChannel.ts","../src/lib/structures/channel/GuildVoiceChannel.ts","../src/lib/utils/channel.ts","../src/lib/structures/Guild.ts","../src/lib/client/ClientHelper.ts","../src/lib/client/Partial.ts","../src/lib/utils/IntentsBitField.ts","../src/lib/client/Client.ts"],"sourcesContent":["import type { Client } from \"../client/Client.js\";\n\nexport class BaseStructure {\n\tdeclare public client: Client;\n\n\tpublic constructor(client: Client) {\n\t\tObject.defineProperty(this, \"client\", {\n\t\t\tvalue: client,\n\t\t\tenumerable: false,\n\t\t\twritable: false,\n\t\t});\n\t}\n\n\tpublic toJSON() {\n\t\treturn {};\n\t}\n}\n","import { getSnowflakeDate } from \"@bakit/utils\";\nimport { BaseStructure } from \"./BaseStructure.js\";\n\nimport type { Client } from \"../client/Client.js\";\nimport type { APIUser, GatewayReadyDispatchData } from \"discord-api-types/v10\";\n\nexport type UserPayload = APIUser | GatewayReadyDispatchData[\"user\"];\n\nexport class User extends BaseStructure {\n\tpublic constructor(\n\t\tclient: Client,\n\t\tpublic data: UserPayload,\n\t) {\n\t\tsuper(client);\n\t}\n\n\tpublic get id() {\n\t\treturn this.data.id;\n\t}\n\n\tpublic get username() {\n\t\treturn this.data.username;\n\t}\n\n\tpublic get discriminator() {\n\t\treturn this.data.discriminator;\n\t}\n\n\tpublic get globalName() {\n\t\treturn this.data.global_name;\n\t}\n\n\tpublic get tag() {\n\t\tconst hasDiscriminator = this.discriminator !== \"0\" && this.discriminator !== \"0000\";\n\t\treturn hasDiscriminator ? `${this.username}#${this.discriminator}` : this.username;\n\t}\n\n\tpublic get displayName() {\n\t\treturn this.globalName ?? this.tag;\n\t}\n\n\tpublic get avatar() {\n\t\treturn this.data.avatar ?? undefined;\n\t}\n\n\tpublic get bot() {\n\t\treturn !!this.data.bot;\n\t}\n\n\tpublic get system() {\n\t\treturn !!this.data.system;\n\t}\n\n\tpublic get mfaEnabled() {\n\t\treturn this.data.mfa_enabled;\n\t}\n\n\tpublic get locale() {\n\t\treturn this.data.locale;\n\t}\n\n\tpublic get verified() {\n\t\treturn this.data.verified;\n\t}\n\n\tpublic get email() {\n\t\treturn this.data.email;\n\t}\n\n\tpublic get flags() {\n\t\treturn this.data.flags;\n\t}\n\n\tpublic get premiumType() {\n\t\treturn this.data.premium_type;\n\t}\n\n\tpublic get publicFlags() {\n\t\treturn this.data.public_flags;\n\t}\n\n\tpublic get banner() {\n\t\treturn this.data.banner;\n\t}\n\n\tpublic get accentColor() {\n\t\treturn this.data.accent_color ?? undefined;\n\t}\n\n\tpublic get createdAt() {\n\t\treturn getSnowflakeDate(this.id);\n\t}\n\n\tpublic get createdTimestamp() {\n\t\treturn this.createdAt.getTime();\n\t}\n\n\tpublic get hexAccentColor() {\n\t\treturn this.accentColor !== undefined ? `#${this.accentColor.toString(16).padStart(6, \"0\")}` : undefined;\n\t}\n\n\tpublic get defaultAvatarURL() {\n\t\t// For users on the new username system, index will be (user_id >> 22) % 6.\n\t\t// For users on the legacy username system, index will be discriminator % 5.\n\t\tconst hasDiscriminator = this.discriminator !== \"0\" && this.discriminator !== \"0000\";\n\t\tconst index = hasDiscriminator ? BigInt(this.discriminator) % 5n : (BigInt(this.id) >> 22n) % 6n;\n\n\t\treturn `https://cdn.discordapp.com/embed/avatars/${index}.png`;\n\t}\n\n\tpublic getAvatarURL(options?: { size?: number; extension?: \"png\" | \"jpg\" | \"webp\" | \"gif\" }): string | undefined {\n\t\tif (!this.avatar) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst isAnimated = this.avatar.startsWith(\"a_\");\n\t\tconst ext = options?.extension ?? (isAnimated ? \"gif\" : \"png\");\n\n\t\tconst size = options?.size ? `?size=${options.size}` : \"\";\n\n\t\treturn `https://cdn.discordapp.com/avatars/${this.id}/${this.avatar}.${ext}${size}`;\n\t}\n\n\tpublic getDisplayAvatarURL(options?: { size?: number; extension?: \"png\" | \"jpg\" | \"webp\" | \"gif\" }) {\n\t\treturn this.getAvatarURL(options) ?? this.defaultAvatarURL;\n\t}\n\n\tpublic equals(other: User | string) {\n\t\tif (typeof other === \"string\") {\n\t\t\treturn other === this.id;\n\t\t}\n\n\t\treturn (\n\t\t\tother.id === this.id &&\n\t\t\tother.username === this.username &&\n\t\t\tother.discriminator === this.discriminator &&\n\t\t\tother.bot === this.bot &&\n\t\t\tother.createdTimestamp === this.createdTimestamp\n\t\t);\n\t}\n\n\tpublic override toJSON() {\n\t\treturn this.data;\n\t}\n\n\tpublic override toString() {\n\t\treturn `<@${this.id}>`;\n\t}\n}\n","import { BaseStructure } from \"./BaseStructure.js\";\nimport { User } from \"./User.js\";\n\nimport type { Client } from \"../client/Client.js\";\nimport type {\n\tAPIMessage,\n\tGatewayMessageCreateDispatchData,\n\tGatewayMessageUpdateDispatchData,\n} from \"discord-api-types/v10\";\nimport type { MessageReplyOptions } from \"../client/ClientHelper.js\";\nimport type { TextBasedChannel } from \"./channel/BaseChannel.js\";\n\nexport type MessagePayload = APIMessage | GatewayMessageCreateDispatchData | GatewayMessageUpdateDispatchData;\n\nexport class Message extends BaseStructure {\n\tprotected cachedAuthor?: User;\n\n\tpublic constructor(\n\t\tclient: Client,\n\t\tpublic data: MessagePayload,\n\t) {\n\t\tsuper(client);\n\t}\n\n\tpublic get partial() {\n\t\treturn typeof this.data.content !== \"string\" || typeof this.data.author !== \"object\";\n\t}\n\n\tpublic get content() {\n\t\treturn this.data.content;\n\t}\n\n\tpublic get id() {\n\t\treturn this.data.id;\n\t}\n\n\tpublic get channelId() {\n\t\treturn this.data.channel_id;\n\t}\n\n\tpublic get channel(): TextBasedChannel {\n\t\treturn this.guild!.channels.get(this.channelId)! as TextBasedChannel;\n\t}\n\n\tpublic get guildId() {\n\t\treturn \"guild_id\" in this.data ? this.data.guild_id : undefined;\n\t}\n\n\tpublic get guild() {\n\t\treturn this.guildId ? this.client.guilds.get(this.guildId) : undefined;\n\t}\n\n\tpublic get author() {\n\t\tthis.cachedAuthor ??= new User(this.client, this.data.author);\n\t\treturn this.cachedAuthor;\n\t}\n\n\tpublic get createdAt() {\n\t\treturn new Date(this.data.timestamp);\n\t}\n\n\tpublic get editedAt() {\n\t\treturn this.data.edited_timestamp ? new Date(this.data.edited_timestamp) : undefined;\n\t}\n\n\tpublic get createdTimestamp() {\n\t\treturn this.createdAt.getTime();\n\t}\n\n\tpublic get editedTimestamp() {\n\t\treturn this.editedAt?.getTime();\n\t}\n\n\tpublic get url() {\n\t\treturn `https://discord.com/channels/${this.guildId ?? \"@me\"}/${this.channelId}/${this.id}`;\n\t}\n\n\tpublic async fetch(): Promise<Message> {\n\t\tconst message = await this.client.helper.fetchMessage(this.channelId, this.id);\n\t\tthis.data = message.data;\n\t\tthis.cachedAuthor = message.cachedAuthor;\n\t\treturn this;\n\t}\n\n\tpublic async reply(options: MessageReplyOptions) {\n\t\treturn this.client.helper.replyMessage(this.channelId, this.id, options);\n\t}\n\n\tpublic async sendToChannel(options: MessageReplyOptions) {\n\t\treturn this.client.helper.createMessage(this.channelId, options);\n\t}\n\n\tpublic override toJSON() {\n\t\treturn this.data;\n\t}\n\n\tpublic override toString() {\n\t\treturn this.data.content;\n\t}\n}\n","import { BaseStructure } from \"../BaseStructure.js\";\n\nimport type { Client } from \"../../client/Client.js\";\nimport type {\n\tAPIChannel,\n\tAPIChannelBase,\n\tChannelType,\n\tGatewayChannelCreateDispatchData,\n\tGatewayChannelUpdateDispatchData,\n} from \"discord-api-types/v10\";\n\nimport type { GuildTextChannel } from \"./GuildTextChannel.js\";\nimport type { GuildVoiceChannel } from \"./GuildVoiceChannel.js\";\n\nexport type BaseChannelPayload =\n\t| APIChannelBase<ChannelType>\n\t| GatewayChannelCreateDispatchData\n\t| GatewayChannelUpdateDispatchData\n\t| APIChannel;\n\nexport type TextBasedChannel = GuildTextChannel | GuildVoiceChannel;\nexport type VoiceBasedChannel = GuildVoiceChannel;\nexport type GuildChannel = GuildTextChannel | GuildVoiceChannel;\n\nexport type Channel = TextBasedChannel | VoiceBasedChannel | GuildChannel;\n\nexport abstract class BaseChannel<D extends BaseChannelPayload> extends BaseStructure {\n\tpublic constructor(\n\t\tclient: Client,\n\t\tpublic data: D,\n\t) {\n\t\tsuper(client);\n\t}\n\n\tpublic get id() {\n\t\treturn this.data.id;\n\t}\n\n\tpublic get type() {\n\t\treturn this.data.type;\n\t}\n\n\tpublic override toString() {\n\t\treturn `<#${this.id}>`;\n\t}\n\n\tpublic override toJSON() {\n\t\treturn this.data;\n\t}\n\n\tpublic isTextBased(): this is TextBasedChannel {\n\t\treturn \"send\" in this;\n\t}\n\n\tpublic isVoiceBased(): this is VoiceBasedChannel {\n\t\treturn \"join\" in this;\n\t}\n\n\tpublic inGuild(): this is GuildChannel {\n\t\treturn \"guild_id\" in this.data;\n\t}\n\n\tpublic _patch(data: Partial<D>) {\n\t\tthis.data = { ...this.data, ...data };\n\t}\n}\n","import { createMixin } from \"tiny-mixin\";\n\nimport { type AbstractConstructor } from \"@bakit/utils\";\n\nimport type { BaseChannel } from \"../structures/channel/BaseChannel.js\";\nimport type { MessageCreateOptions } from \"../client/ClientHelper.js\";\nimport type {\n\tAPIGuildChannel,\n\tAPITextBasedChannel,\n\tAPIVoiceChannelBase,\n\tChannelType,\n\tGuildChannelType,\n} from \"discord-api-types/v10\";\n\ntype TextChannelBase = BaseChannel<APITextBasedChannel<ChannelType>>;\ntype VoiceChannelBase = BaseChannel<APIVoiceChannelBase<GuildChannelType>>;\ntype GuildChannelBase = BaseChannel<APIGuildChannel>;\n\nexport const TextBasedChannelMixin = createMixin(<T extends AbstractConstructor<TextChannelBase>>(base: T) => {\n\tabstract class TextBasedChannel extends base {\n\t\tpublic send(options: MessageCreateOptions) {\n\t\t\treturn this.client.helper.createMessage(this.id, options);\n\t\t}\n\t}\n\n\treturn TextBasedChannel;\n});\n\n// TODO: add voice methods\nexport const VoiceBasedChannelMixin = createMixin(<T extends AbstractConstructor<VoiceChannelBase>>(base: T) => {\n\tabstract class VoiceBasedChannel extends base {}\n\n\treturn VoiceBasedChannel;\n});\n\nexport const GuildChannelMixin = createMixin(<T extends AbstractConstructor<GuildChannelBase>>(base: T) => {\n\tabstract class GuildChannel extends base {\n\t\tpublic get guildId() {\n\t\t\tif (!this.data.guild_id) {\n\t\t\t\tthrow new Error(\"This channel is not a guild channel\");\n\t\t\t}\n\n\t\t\treturn this.data.guild_id;\n\t\t}\n\n\t\tpublic get guild() {\n\t\t\treturn this.client.guilds.get(this.guildId)!;\n\t\t}\n\t}\n\n\treturn GuildChannel;\n});\n","import { BaseChannel } from \"./BaseChannel.js\";\nimport { GuildChannelMixin, TextBasedChannelMixin } from \"@/lib/mixins/ChannelMixin.js\";\nimport { applyMixins } from \"tiny-mixin\";\n\nimport type { APITextBasedChannel, ChannelType } from \"discord-api-types/v10\";\n\nexport class GuildTextChannel extends applyMixins(BaseChannel<APITextBasedChannel<ChannelType.GuildText>>, [\n\tGuildChannelMixin,\n\tTextBasedChannelMixin,\n]) {}\n","import { applyMixins } from \"tiny-mixin\";\nimport { BaseChannel } from \"./BaseChannel.js\";\nimport { GuildChannelMixin, TextBasedChannelMixin, VoiceBasedChannelMixin } from \"@/lib/mixins/ChannelMixin.js\";\nimport type { APIGuildVoiceChannel } from \"discord-api-types/v10\";\n\nexport class GuildVoiceChannel extends applyMixins(BaseChannel<APIGuildVoiceChannel>, [\n\tGuildChannelMixin,\n\tTextBasedChannelMixin,\n\tVoiceBasedChannelMixin,\n]) {}\n","import { GuildTextChannel, GuildVoiceChannel, type BaseChannelPayload } from \"../structures/index.js\";\nimport { ChannelType, type APITextBasedChannel, type APIVoiceChannelBase } from \"discord-api-types/v10\";\n\nimport type { Client } from \"../client/Client.js\";\n\nexport function createChannel(client: Client, data: BaseChannelPayload) {\n\tswitch (data.type) {\n\t\tcase ChannelType.GuildText:\n\t\t\treturn new GuildTextChannel(client, data as APITextBasedChannel<ChannelType.GuildText>);\n\t\tcase ChannelType.GuildVoice:\n\t\t\treturn new GuildVoiceChannel(client, data as APIVoiceChannelBase<ChannelType.GuildVoice>);\n\t\tdefault:\n\t\t\treturn null;\n\t}\n}\n","import { Collection } from \"@discordjs/collection\";\n\nimport { BaseStructure } from \"./BaseStructure.js\";\n\nimport { createChannel } from \"../utils/channel.js\";\n\nimport type { Client } from \"../client/Client.js\";\nimport type { APIGuild, GatewayGuildCreateDispatchData, GatewayGuildUpdateDispatchData } from \"discord-api-types/v10\";\nimport type { Channel } from \"./channel/BaseChannel.js\";\n\nexport type GuildPayload = APIGuild | GatewayGuildUpdateDispatchData | GatewayGuildCreateDispatchData;\n\nexport class Guild extends BaseStructure {\n\tprivate cachedChannels: Collection<string, Channel> | undefined;\n\n\tpublic constructor(\n\t\tclient: Client,\n\t\tpublic data: GuildPayload,\n\t) {\n\t\tsuper(client);\n\t}\n\n\tpublic get id() {\n\t\treturn this.data.id;\n\t}\n\n\tpublic get name() {\n\t\treturn this.data.name;\n\t}\n\n\tpublic get icon() {\n\t\treturn this.data.icon;\n\t}\n\n\tpublic get banner() {\n\t\treturn this.data.banner;\n\t}\n\n\tpublic get owner() {\n\t\treturn this.data.owner_id;\n\t}\n\n\tpublic get mfaLevel() {\n\t\treturn this.data.mfa_level;\n\t}\n\n\tpublic get verificationLevel() {\n\t\treturn this.data.verification_level;\n\t}\n\n\tpublic get channels() {\n\t\tif (!this.cachedChannels) {\n\t\t\tthis.cachedChannels = new Collection();\n\n\t\t\tif (\"channels\" in this.data) {\n\t\t\t\tfor (const data of this.data.channels) {\n\t\t\t\t\tconst channel = createChannel(this.client, data);\n\n\t\t\t\t\tif (!channel) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.cachedChannels.set(channel.id, channel);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this.cachedChannels;\n\t}\n\n\tpublic _patch(data: Partial<GuildPayload>) {\n\t\tthis.data = { ...this.data, ...data };\n\t}\n\n\t// public get roles() {\n\t// \treturn this.data.roles;\n\t// }\n}\n","import { Routes } from \"discord-api-types/v10\";\n\nimport { Message } from \"../structures/Message.js\";\nimport { Guild } from \"../structures/Guild.js\";\n\nimport type { Client } from \"./Client.js\";\nimport type { APIAllowedMentions, APIEmbed, APIMessageReference, APIMessage, APIGuild } from \"discord-api-types/v10\";\n\nexport interface MessageCreateOptions {\n\tcontent?: string;\n\ttts?: boolean;\n\n\tembeds?: APIEmbed[];\n\n\tallowedMentions?: APIAllowedMentions;\n\tmessageReference?: APIMessageReference;\n\n\tflags?: number;\n}\n\nexport type MessageReplyOptions = Omit<MessageCreateOptions, \"messageReference\">;\n\nexport class ClientHelper {\n\tdeclare public readonly client: Client;\n\n\tpublic constructor(client: Client) {\n\t\tObject.defineProperty(this, \"client\", {\n\t\t\tvalue: client,\n\t\t\tenumerable: false,\n\t\t\twritable: false,\n\t\t});\n\t}\n\n\tpublic async fetchMessage(channelId: string, messageId: string) {\n\t\tconst data = await this.client.rest.get<APIMessage>(Routes.channelMessage(channelId, messageId));\n\t\treturn new Message(this.client, data);\n\t}\n\n\tpublic async deleteMessage(channelId: string, messageId: string) {\n\t\treturn this.client.rest.delete(Routes.channelMessage(channelId, messageId));\n\t}\n\n\tpublic async createMessage(channelId: string, options: MessageCreateOptions) {\n\t\treturn this.client.rest.post<APIMessage>(Routes.channelMessages(channelId), {\n\t\t\tbody: ClientHelper.toAPICreateMessagePayload(options),\n\t\t});\n\t}\n\n\tpublic async replyMessage(channelId: string, messageId: string, options: MessageReplyOptions) {\n\t\treturn this.createMessage(channelId, {\n\t\t\t...options,\n\t\t\tmessageReference: {\n\t\t\t\tchannel_id: channelId,\n\t\t\t\tmessage_id: messageId,\n\t\t\t},\n\t\t});\n\t}\n\n\tpublic async fetchGuild(guildId: string) {\n\t\tconst data = await this.client.rest.get<APIGuild>(Routes.guild(guildId));\n\t\treturn new Guild(this.client, data);\n\t}\n\n\tpublic static toAPICreateMessagePayload(options: MessageCreateOptions) {\n\t\treturn {\n\t\t\tcontent: options.content,\n\t\t\ttts: options.tts,\n\t\t\tembeds: options.embeds,\n\t\t\tallowed_mentions: options.allowedMentions,\n\t\t\tmessage_reference: options.messageReference,\n\t\t\tflags: options.flags,\n\t\t};\n\t}\n}\n","export enum Partial {\n\tMessage,\n\tUser,\n}\n","import { GatewayIntentBits } from \"discord-api-types/v10\";\n\nexport type IntentResolvable = number | bigint | GatewayIntentBits | GatewayIntentBits[];\n\nexport class IntentsBitField {\n\tprivate readonly value: bigint;\n\n\tpublic constructor(input: IntentResolvable) {\n\t\tthis.value = IntentsBitField.resolve(input);\n\t}\n\n\tpublic static resolve(input: IntentResolvable): bigint {\n\t\tif (Array.isArray(input)) {\n\t\t\treturn input.reduce((acc, intent) => acc | BigInt(intent), 0n);\n\t\t}\n\n\t\treturn BigInt(input);\n\t}\n\n\tpublic has(intent: GatewayIntentBits): boolean {\n\t\treturn (this.value & BigInt(intent)) !== 0n;\n\t}\n\n\tpublic toBigInt(): bigint {\n\t\treturn this.value;\n\t}\n\n\tpublic toNumber(): number {\n\t\treturn Number(this.value);\n\t}\n\n\tpublic toJSON(): string {\n\t\treturn this.value.toString();\n\t}\n\n\tpublic toString(): string {\n\t\treturn this.value.toString();\n\t}\n}\n","import EventEmitter from \"node:events\";\n\nimport { ShardingManager, type ShardingManagerOptions } from \"@bakit/gateway\";\nimport { REST, type RESTLike } from \"@bakit/rest\";\nimport { Collection } from \"@discordjs/collection\";\n\nimport { GatewayDispatchEvents, type GatewayDispatchPayload, type GatewayReceivePayload } from \"discord-api-types/v10\";\n\nimport { Message } from \"../structures/Message.js\";\nimport { User } from \"../structures/User.js\";\nimport { Guild } from \"../structures/Guild.js\";\n\nimport { ClientHelper } from \"./ClientHelper.js\";\nimport { Partial } from \"./Partial.js\";\nimport { IntentsBitField, type IntentResolvable } from \"../utils/IntentsBitField.js\";\nimport { createChannel } from \"../utils/channel.js\";\n\nimport type { Channel } from \"../structures/index.js\";\n\nexport interface ClientOptions {\n\ttoken: string;\n\tintents: IntentResolvable | IntentsBitField;\n\tsharding?: ClientShardingOptions;\n\tpartials?: Partial[];\n}\n\nexport type ClientShardingOptions = Omit<ShardingManagerOptions, \"token\" | \"intents\">;\n\nexport interface ClientEvents {\n\tready: [user: User];\n\terror: [error: Error];\n\n\tdispatch: [shardId: number, payload: GatewayDispatchPayload];\n\traw: [shardId: number, payload: GatewayReceivePayload];\n\n\tmessageCreate: [message: Message];\n\tmessageUpdate: [message: Message];\n\tmessageDelete: [message: { id: string; channelId: string; guildId?: string }];\n\n\tuserUpdate: [user: User];\n\n\tguildCreate: [guild: Guild];\n\tguildAvailable: [guild: Guild];\n\tguildUpdate: [guild: Guild];\n\tguildDelete: [guild: Guild];\n\n\tchannelCreate: [channel: Channel];\n\tchannelUpdate: [channel: Channel];\n\tchannelDelete: [channel: Channel];\n}\n\nexport class Client extends EventEmitter<ClientEvents> {\n\tpublic readonly options: Omit<Required<ClientOptions>, \"partials\" | \"intents\"> & {\n\t\tpartials: Set<Partial>;\n\t\tintents: IntentsBitField;\n\t};\n\n\tpublic readonly shards: ShardingManager;\n\tpublic readonly rest: RESTLike;\n\tpublic readonly helper: ClientHelper;\n\n\tpublic readonly guilds = new Collection<string, Guild>();\n\n\t#user?: User;\n\t#ready = false;\n\n\tpublic constructor(options: ClientOptions, rest?: RESTLike) {\n\t\tsuper();\n\n\t\tconst intents = options.intents instanceof IntentsBitField ? options.intents : new IntentsBitField(options.intents);\n\t\tconst sharding = {\n\t\t\tshardsPerCluster: options.sharding?.shardsPerCluster ?? 1,\n\t\t\ttotalShards: options.sharding?.totalShards ?? 1,\n\t\t};\n\n\t\tthis.options = {\n\t\t\ttoken: options.token,\n\t\t\tintents,\n\t\t\tsharding,\n\t\t\tpartials: new Set(options.partials ?? []),\n\t\t};\n\n\t\tthis.rest = rest ?? new REST({ token: options.token });\n\n\t\tthis.shards = new ShardingManager(\n\t\t\t{\n\t\t\t\t...this.options.sharding,\n\t\t\t\ttoken: this.options.token,\n\t\t\t\tintents: this.options.intents.toBigInt(),\n\t\t\t},\n\t\t\trest,\n\t\t);\n\n\t\tthis.helper = new ClientHelper(this);\n\n\t\tthis.#setupShardsListeners();\n\t}\n\n\tget user() {\n\t\treturn this.#user;\n\t}\n\n\tpublic async login() {\n\t\tif (this.#user || this.shards.ready || this.shards.clusters.size > 0) {\n\t\t\tthrow new Error(\"Cannot login twice\");\n\t\t}\n\n\t\tawait this.shards.spawn();\n\n\t\treturn new Promise<void>((resolve, reject) => {\n\t\t\tconst cleanup = () => {\n\t\t\t\tthis.removeListener(\"ready\", onReady);\n\t\t\t\tthis.removeListener(\"error\", onError);\n\t\t\t};\n\n\t\t\tconst onReady = () => {\n\t\t\t\tcleanup();\n\t\t\t\tresolve();\n\t\t\t};\n\n\t\t\tconst onError = (error: Error) => {\n\t\t\t\tcleanup();\n\t\t\t\treject(error);\n\t\t\t};\n\n\t\t\tthis.once(\"ready\", onReady);\n\t\t\tthis.once(\"error\", onError);\n\t\t});\n\t}\n\n\t#setupShardsListeners() {\n\t\tthis.shards.on(\"dispatch\", (_, shardId, payload) => this.#handleDispatch(shardId, payload));\n\t\tthis.shards.on(\"raw\", (_, shardId, payload) => this.emit(\"raw\", shardId, payload));\n\t\tthis.shards.once(\"ready\", () => this.#tryEmitReady());\n\t}\n\n\tasync #handleDispatch(shardId: number, payload: GatewayDispatchPayload) {\n\t\tthis.emit(\"dispatch\", shardId, payload);\n\n\t\tswitch (payload.t) {\n\t\t\tcase GatewayDispatchEvents.Ready: {\n\t\t\t\tthis.#user ??= new User(this, payload.d.user);\n\n\t\t\t\t// Usually, this won't do anything but still be good to have\n\t\t\t\t// in case the shards emit `ready` event out of order\n\t\t\t\tthis.#tryEmitReady();\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase GatewayDispatchEvents.MessageCreate: {\n\t\t\t\tconst message = new Message(this, payload.d);\n\n\t\t\t\tif (message.partial && !this.options.partials.has(Partial.Message)) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tthis.emit(\"messageCreate\", message);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase GatewayDispatchEvents.MessageUpdate: {\n\t\t\t\tconst message = new Message(this, payload.d);\n\n\t\t\t\tif (message.partial && !this.options.partials.has(Partial.Message)) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tthis.emit(\"messageUpdate\", message);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase GatewayDispatchEvents.MessageDelete: {\n\t\t\t\tthis.emit(\"messageDelete\", {\n\t\t\t\t\tid: payload.d.id,\n\t\t\t\t\tchannelId: payload.d.channel_id,\n\t\t\t\t\tguildId: payload.d.guild_id,\n\t\t\t\t});\n\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase GatewayDispatchEvents.UserUpdate: {\n\t\t\t\tif (payload.d.id === this.#user?.id) {\n\t\t\t\t\tthis.#user = new User(this, payload.d);\n\t\t\t\t}\n\n\t\t\t\tthis.emit(\"userUpdate\", new User(this, payload.d));\n\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase GatewayDispatchEvents.GuildCreate: {\n\t\t\t\tlet guild = this.guilds.get(payload.d.id);\n\n\t\t\t\tif (guild) {\n\t\t\t\t\tguild[\"_patch\"](payload.d);\n\t\t\t\t} else {\n\t\t\t\t\tguild = new Guild(this, payload.d);\n\t\t\t\t}\n\n\t\t\t\tthis.guilds.set(payload.d.id, guild);\n\n\t\t\t\tif (payload.d.unavailable) {\n\t\t\t\t\tthis.emit(\"guildCreate\", guild);\n\t\t\t\t} else {\n\t\t\t\t\tthis.emit(\"guildAvailable\", guild);\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase GatewayDispatchEvents.GuildDelete: {\n\t\t\t\tconst guild = this.guilds.get(payload.d.id);\n\n\t\t\t\tif (!guild) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tthis.guilds.delete(payload.d.id);\n\t\t\t\tthis.emit(\"guildDelete\", guild);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase GatewayDispatchEvents.GuildUpdate: {\n\t\t\t\tlet guild = this.guilds.get(payload.d.id);\n\n\t\t\t\tif (guild) {\n\t\t\t\t\tguild._patch(payload.d);\n\t\t\t\t} else {\n\t\t\t\t\tguild = new Guild(this, payload.d);\n\t\t\t\t\tthis.guilds.set(payload.d.id, guild);\n\t\t\t\t}\n\n\t\t\t\tthis.emit(\"guildUpdate\", guild);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase GatewayDispatchEvents.ChannelCreate: {\n\t\t\t\tconst channel = createChannel(this, payload.d);\n\n\t\t\t\tif (!channel) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (channel.inGuild()) {\n\t\t\t\t\tchannel.guild.channels.set(channel.id, channel);\n\t\t\t\t}\n\n\t\t\t\tthis.emit(\"channelCreate\", channel);\n\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase GatewayDispatchEvents.ChannelUpdate: {\n\t\t\t\tconst guild = this.guilds.get(payload.d.guild_id);\n\n\t\t\t\tif (!guild) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tlet channel: Channel | null | undefined = guild.channels.get(payload.d.id);\n\n\t\t\t\tif (!channel) {\n\t\t\t\t\tchannel = createChannel(this, payload.d);\n\n\t\t\t\t\tif (!channel) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tguild.channels.set(payload.d.id, channel);\n\t\t\t\t} else {\n\t\t\t\t\tchannel._patch(payload.d);\n\t\t\t\t}\n\n\t\t\t\tthis.emit(\"channelUpdate\", channel);\n\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase GatewayDispatchEvents.ChannelDelete: {\n\t\t\t\tconst guild = this.guilds.get(payload.d.guild_id);\n\n\t\t\t\tif (!guild) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst channel = guild.channels.get(payload.d.id);\n\n\t\t\t\tif (!channel) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tguild.channels.delete(payload.d.id);\n\t\t\t\tthis.emit(\"channelDelete\", channel);\n\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * We use this method to emit ready event only once since we have 2 ways to emit it.\n\t * @private\n\t */\n\t#tryEmitReady() {\n\t\tif (this.#ready || !this.#user || !this.shards.ready) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.#ready = true;\n\t\tthis.emit(\"ready\", this.#user!);\n\t}\n}\n\nexport function createClient(options: ClientOptions) {\n\treturn new Client(options);\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,14 +1,19 @@
1
1
  {
2
2
  "name": "bakit",
3
- "version": "2.2.4",
4
- "description": "A framework for discordeno",
3
+ "version": "3.0.1",
4
+ "description": "A modern, full-stack Discord API wrapper and framework",
5
5
  "type": "module",
6
6
  "exports": {
7
7
  ".": {
8
- "import": "./dist/index.js",
9
- "types": "./dist/index.d.ts"
10
- },
11
- "./cli": "./dist/cli.js"
8
+ "import": {
9
+ "types": "./dist/index.d.mts",
10
+ "default": "./dist/index.mjs"
11
+ },
12
+ "require": {
13
+ "types": "./dist/index.d.cts",
14
+ "default": "./dist/index.cjs"
15
+ }
16
+ }
12
17
  },
13
18
  "bin": {
14
19
  "bakit": "./dist/cli.js"
@@ -35,18 +40,20 @@
35
40
  "tsx": "^4.21.0"
36
41
  },
37
42
  "dependencies": {
38
- "commander": "^14.0.2",
39
- "discord-api-types": "^0.38.37",
43
+ "@discordjs/collection": "^2.1.1",
44
+ "commander": "^14.0.3",
45
+ "discord-api-types": "^0.38.38",
40
46
  "dotenv": "^17.2.3",
41
47
  "tiny-glob": "^0.2.9",
48
+ "tiny-mixin": "^1.1.1",
42
49
  "type-fest": "^4.41.0",
43
- "@bakit/gateway": "^2.1.9",
44
- "@bakit/rest": "^2.1.0",
45
- "@bakit/service": "^3.2.1",
46
- "@bakit/utils": "^2.0.0"
50
+ "@bakit/rest": "^3.0.3",
51
+ "@bakit/gateway": "^3.0.3",
52
+ "@bakit/utils": "^3.0.1",
53
+ "@bakit/service": "^4.0.3"
47
54
  },
48
55
  "scripts": {
49
- "build": "tsup",
56
+ "build": "tsdown --config-loader unrun",
50
57
  "type-check": "tsc --noEmit",
51
58
  "test": "vitest run --pass-with-no-tests"
52
59
  }
package/dist/cli.js DELETED
@@ -1,79 +0,0 @@
1
- #!/usr/bin/env node
2
- import { fileURLToPath, pathToFileURL } from 'url';
3
- import { fork } from 'child_process';
4
- import { config } from 'dotenv';
5
- import { program } from 'commander';
6
- import glob from 'tiny-glob';
7
- import { startServiceServer } from '@bakit/service';
8
-
9
- // package.json
10
- var package_default = {
11
- name: "bakit",
12
- version: "2.2.4"};
13
-
14
- // src/lib/cli/index.ts
15
- config();
16
- program.name(package_default.name).description("Bakit CLI tool").version(package_default.version);
17
- program.command("start").description("Start the services").argument("[name...]", "Name of the service to start").action(start);
18
- program.parse();
19
- var cliPath = fileURLToPath(import.meta.url);
20
- async function start(names) {
21
- await runSupervisor(names);
22
- }
23
- async function runSupervisor(names = []) {
24
- if (names.length === 1) {
25
- await runServiceWorker(names[0]);
26
- return;
27
- }
28
- let services = await loadServices();
29
- if (names.length === 0)
30
- return spawnServices(services);
31
- let nameSet = new Set(names), toStart = services.filter((s) => nameSet.has(s.name));
32
- if (toStart.length !== nameSet.size) {
33
- let found = new Set(toStart.map((s) => s.name)), missing = names.filter((n) => !found.has(n));
34
- console.error(`Service(s) not found: ${missing.join(", ")}`), process.exit(1);
35
- }
36
- return spawnServices(toStart);
37
- }
38
- function spawnServices(services) {
39
- let children = [];
40
- process.on("SIGINT", shutdown), process.on("SIGTERM", shutdown);
41
- let hasTSX = hasPackage("tsx");
42
- for (let service of services) {
43
- let child = fork(cliPath, ["start", service.name], {
44
- env: {
45
- ...process.env,
46
- BAKIT_SERVICE_NAME: service.name,
47
- NODE_OPTIONS: hasTSX ? "--import tsx" : void 0
48
- },
49
- stdio: "inherit"
50
- });
51
- child.on("exit", (code) => {
52
- console.log(`Service "${service.name}" exited with code ${code}`);
53
- }), children.push(child);
54
- }
55
- async function shutdown() {
56
- await Promise.all(
57
- children.map((child) => new Promise((resolve) => {
58
- child.once("exit", resolve), child.kill("SIGTERM"), setTimeout(() => child.kill("SIGKILL"), 5e3);
59
- }))
60
- ), process.exit(0);
61
- }
62
- }
63
- async function loadServices() {
64
- let paths = await glob("src/services/**/*.{js,ts}");
65
- return await Promise.all(
66
- paths.map(async (path) => (await import(pathToFileURL(path).href)).default)
67
- );
68
- }
69
- async function runServiceWorker(name) {
70
- let service = (await loadServices()).find((s) => s.name === name);
71
- service || (console.error(`Service "${name}" not found.`), process.exit(1)), await startServiceServer(service), console.log(`Service "${name}" started as server`);
72
- }
73
- function hasPackage(name) {
74
- try {
75
- return import.meta.resolve(name), !0;
76
- } catch {
77
- return false;
78
- }
79
- }
package/dist/index.d.ts DELETED
@@ -1,148 +0,0 @@
1
- import { REST } from '@bakit/rest';
2
- export { REST, RESTEndpoint, RESTEvents, RESTMethod, RESTOptions, createREST } from '@bakit/rest';
3
- import { EventBus } from '@bakit/utils';
4
- export { Awaitable, Collection, EventBus, EventMap, FunctionLike, Promisify, PromisifyValue, Queue, QueueOptions, ReadonlyCollection, RejectFn, ResolveFn, attachEventBus, capitalize, createEventBus, createQueue, isPlainObject, isPromiseLike, promisify, sleep } from '@bakit/utils';
5
- import { APIUser, APIMessage, ChannelType, Snowflake, APIChannel, APIChannelBase, APIGuildTextChannel, APIDMChannel, APIPublicThreadChannel, APIPrivateThreadChannel, APITextBasedChannel, TextChannelType, APIGuildChannel, GuildTextChannelType, APIThreadChannel, MessageFlags, GatewayReceivePayload } from 'discord-api-types/v10';
6
- import { GatewayMessageCreateDispatchData } from 'discord-api-types/v9';
7
- import * as discord_api_types_globals from 'discord-api-types/globals';
8
- export { DEFAULT_GATEWAY_MANAGER_OPTIONS, DEFAULT_WORKER_PATH, GatewayManager, GatewayManagerEvents, GatewayManagerOptions, GatewayWorker, GatewayWorkerEvents, GatewayWorkerOptions, GatewayWorkerState, createGatewayManager, createWorker } from '@bakit/gateway';
9
- export { RPCError, RPCErrorPayload, RPCHandler, RPCRequestMessage, RPCResponseMessage, Serializable, Service, ServiceFunction, ServiceOptions, TransportClient, TransportClientOptions, TransportDriver, TransportServer, TransportServerOptions, createIPCClient, createIPCServer, createService, createTransportClient, createTransportServer, deserializeRPCError, getIPCPath, serializeRPCError } from '@bakit/service';
10
-
11
- interface User {
12
- readonly client: Client;
13
- readonly id: string;
14
- readonly username: string;
15
- readonly discriminator: string;
16
- readonly globalName?: string | null;
17
- readonly avatar?: string | null;
18
- readonly system?: boolean;
19
- readonly mfaEnabled?: boolean;
20
- readonly banner?: string | null;
21
- readonly accentColor?: number;
22
- readonly locale?: string;
23
- readonly verified?: boolean;
24
- readonly email?: string | null;
25
- readonly flags?: number;
26
- readonly premiumType?: number;
27
- readonly publicFlags?: number;
28
- }
29
- declare function createUser(client: Client, data: APIUser): User;
30
-
31
- interface Message {
32
- readonly client: Client;
33
- readonly id: string;
34
- readonly channelId: string;
35
- readonly guildId?: string;
36
- readonly author: User;
37
- readonly content: string;
38
- readonly timestamp: string;
39
- readonly editedTimestamp?: string;
40
- readonly tts: boolean;
41
- readonly mentionEveryone: boolean;
42
- readonly mentions: readonly User[];
43
- readonly mentionRoles: readonly string[];
44
- readonly nonce?: string | number;
45
- readonly pinned: boolean;
46
- readonly webhookId?: string;
47
- readonly type: number;
48
- readonly applicationId?: string;
49
- readonly flags?: number;
50
- readonly referencedMessage?: Message;
51
- readonly position?: number;
52
- }
53
- declare function createMessage(client: Client, data: APIMessage | GatewayMessageCreateDispatchData): Message;
54
-
55
- interface TextBasedChannelSingleton {
56
- lastMessageId?: Snowflake;
57
- send(content: string): Promise<Message>;
58
- send(options: CreateMessageOptions): Promise<Message>;
59
- send(options: CreateMessageOptions | string): Promise<Message>;
60
- }
61
- interface VoiceBasedChannelSingleton {
62
- join(): Promise<void>;
63
- }
64
- interface GuildBasedChannelSingleton {
65
- readonly name: string;
66
- readonly guildId?: Snowflake;
67
- readonly parentId?: Snowflake;
68
- }
69
- interface GuildTextBasedChannelSingleton extends GuildBasedChannelSingleton, TextBasedChannelSingleton {
70
- }
71
- interface ThreadBasedChannelSingleton extends GuildTextBasedChannelSingleton {
72
- readonly messageCount?: number;
73
- readonly memberCount?: number;
74
- readonly ownerId?: Snowflake;
75
- readonly totalMessageSent?: number;
76
- readonly appliedTags?: Snowflake[];
77
- }
78
- interface BaseChannel {
79
- readonly client: Client;
80
- readonly id: string;
81
- readonly type: ChannelType;
82
- isTextBased(): this is GuildTextChannel | DMChannel | PublicThreadChannel | PrivateThreadChannel;
83
- isVoiceBased(): this is VoiceChannel | StageChannel;
84
- isGuildBased(): this is GuildTextChannel | VoiceChannel | StageChannel | PublicThreadChannel | PrivateThreadChannel;
85
- isThreadBased(): this is PublicThreadChannel | PrivateThreadChannel;
86
- isDm(): this is DMChannel;
87
- isGuildText(): this is GuildTextChannel;
88
- isVoice(): this is VoiceChannel;
89
- isStage(): this is StageChannel;
90
- isPublicThread(): this is PublicThreadChannel;
91
- isPrivateThread(): this is PrivateThreadChannel;
92
- }
93
- interface DMChannel extends BaseChannel, TextBasedChannelSingleton {
94
- readonly recipients?: User[];
95
- }
96
- interface GuildTextChannel extends BaseChannel, GuildTextBasedChannelSingleton {
97
- }
98
- interface VoiceChannel extends GuildTextChannel, VoiceBasedChannelSingleton {
99
- }
100
- interface StageChannel extends GuildTextChannel, VoiceBasedChannelSingleton {
101
- }
102
- interface PublicThreadChannel extends BaseChannel, ThreadBasedChannelSingleton {
103
- }
104
- interface PrivateThreadChannel extends BaseChannel, ThreadBasedChannelSingleton {
105
- }
106
- type Channel = GuildTextChannel | DMChannel | PublicThreadChannel | VoiceChannel | StageChannel | BaseChannel;
107
- declare function createChannel(client: Client, data: APIChannel): Channel;
108
- declare function createBaseChannel(client: Client, data: APIChannelBase<ChannelType>): BaseChannel;
109
- declare function createGuildTextChannel(client: Client, data: APIGuildTextChannel<ChannelType.GuildText>): GuildTextChannel;
110
- declare function createDMChannel(client: Client, data: APIDMChannel): DMChannel;
111
- declare function createPublicThreadChannel(client: Client, data: APIPublicThreadChannel): PublicThreadChannel;
112
- declare function createPrivateThreadChannel(client: Client, data: APIPrivateThreadChannel): PrivateThreadChannel;
113
- declare function createVoiceChannel(client: Client, data: APIGuildTextChannel<ChannelType.GuildVoice>): VoiceChannel;
114
- declare function createStageChannel(client: Client, data: APIGuildTextChannel<ChannelType.GuildStageVoice>): StageChannel;
115
- declare function createTextBasedChannelSingleton(client: Client, data: APITextBasedChannel<TextChannelType>): TextBasedChannelSingleton;
116
- declare function createVoiceBasedChannelSingleton(_client: Client, _data: APIChannelBase<ChannelType.GuildVoice> | APIChannelBase<ChannelType.GuildStageVoice>): VoiceBasedChannelSingleton;
117
- declare function createGuildBasedChannelSingleton(data: APIGuildChannel): GuildBasedChannelSingleton;
118
- declare function createGuildTextBasedChannelSingleton(client: Client, data: APIGuildTextChannel<GuildTextChannelType>): GuildTextBasedChannelSingleton;
119
- declare function createThreadBasedChannelSingleton(client: Client, data: APIThreadChannel): ThreadBasedChannelSingleton;
120
-
121
- interface CreateMessageOptions {
122
- content?: string;
123
- flags?: MessageFlags;
124
- }
125
-
126
- declare function createHelpers(client: Client): {
127
- user: {
128
- getById(id: discord_api_types_globals.Snowflake): Promise<User | undefined>;
129
- getCurrent(): Promise<User>;
130
- };
131
- channel: {
132
- getById(id: discord_api_types_globals.Snowflake): Promise<Channel | undefined>;
133
- createMessage(channelId: discord_api_types_globals.Snowflake, options: CreateMessageOptions | string): Promise<Message>;
134
- deleteMessage(channelId: discord_api_types_globals.Snowflake, messageId: discord_api_types_globals.Snowflake): Promise<void>;
135
- };
136
- };
137
-
138
- interface Client extends EventBus<ClientEvents> {
139
- rest: REST;
140
- helpers: ReturnType<typeof createHelpers>;
141
- }
142
- interface ClientEvents {
143
- raw: [payload: GatewayReceivePayload];
144
- messageCreate: [message: Message];
145
- }
146
- declare function createClient(rest: REST): Client;
147
-
148
- export { type BaseChannel, type Channel, type Client, type ClientEvents, type DMChannel, type GuildBasedChannelSingleton, type GuildTextBasedChannelSingleton, type GuildTextChannel, type Message, type PrivateThreadChannel, type PublicThreadChannel, type StageChannel, type TextBasedChannelSingleton, type ThreadBasedChannelSingleton, type User, type VoiceBasedChannelSingleton, type VoiceChannel, createBaseChannel, createChannel, createClient, createDMChannel, createGuildBasedChannelSingleton, createGuildTextBasedChannelSingleton, createGuildTextChannel, createMessage, createPrivateThreadChannel, createPublicThreadChannel, createStageChannel, createTextBasedChannelSingleton, createThreadBasedChannelSingleton, createUser, createVoiceBasedChannelSingleton, createVoiceChannel };