Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
d187354
The compiler is now its own thing
Didas-git Nov 18, 2024
52b6054
`ready` should be the first listener to be compiled
Didas-git Nov 18, 2024
e6f549d
Keep WSManager's old functionality
Didas-git Nov 18, 2024
3031590
Add beta tags so they can be published
Didas-git Nov 18, 2024
5715ab5
Bring back `createClient`
Didas-git Nov 25, 2024
301aa41
Remove `raw` listener support
Didas-git Nov 25, 2024
8d78786
docs -> guides
Didas-git Nov 25, 2024
19245c9
new guide
Didas-git Nov 30, 2024
4932597
Update lockfile
Didas-git Nov 30, 2024
8ad2055
Token type can now be set in `REST`
Didas-git Apr 3, 2025
59fa4e0
Remove `member` from `User`
Didas-git Apr 3, 2025
99c1aaa
Partially revert 8d78786ff0833584bf424276bda1b96f69e9ae5b
Didas-git Apr 3, 2025
11d5832
Go back to old doc structure
Didas-git Apr 3, 2025
48f0517
Simplify listener compiler
Didas-git Apr 27, 2025
9d0ea93
Remove `Create Guild` endpoint
Didas-git Apr 27, 2025
6ab4876
Add components v2 types
Didas-git Apr 27, 2025
1ac2393
Add missing union
Didas-git Apr 27, 2025
bc661b0
Update jsx to match
Didas-git Apr 27, 2025
b9354ba
Support for components v2
Didas-git Apr 28, 2025
9f1fc22
Bump versions to publish beta
Didas-git Apr 28, 2025
9101d89
Fix compiler bug
Didas-git Apr 28, 2025
1fed3d6
Further reduce compiler duplication
Didas-git Apr 28, 2025
6b9f9f1
Massive handlers rework
Didas-git Apr 29, 2025
d647ea9
Improve type inference
Didas-git Apr 29, 2025
343186d
Rework application command store inference to use overrides instead
Didas-git Apr 29, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file modified bun.lockb
Binary file not shown.
2 changes: 1 addition & 1 deletion packages/core/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "lilybird",
"version": "0.8.0",
"version": "0.9.0-beta.4",
"description": "A bun-first discord api wrapper written in TS",
"main": "./dist/index.js",
"author": "DidaS",
Expand Down
582 changes: 54 additions & 528 deletions packages/core/src/client.ts

Large diffs are not rendered by default.

415 changes: 415 additions & 0 deletions packages/core/src/compiler.ts

Large diffs are not rendered by default.

12 changes: 10 additions & 2 deletions packages/core/src/enums/interaction.ts
Original file line number Diff line number Diff line change
Expand Up @@ -46,15 +46,23 @@ export const enum ComponentType {
UserSelect,
RoleSelect,
MentionableSelect,
ChannelSelect
ChannelSelect,
Section,
TextDisplay,
Thumbnail,
MediaGallery,
File,
Separator,
Container = 17
}

export const enum ButtonStyle {
Primary = 1,
Secondary,
Success,
Danger,
Link
Link,
Premium
}

export const enum TextInputStyle {
Expand Down
4 changes: 3 additions & 1 deletion packages/core/src/enums/message.ts
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,9 @@ export const enum MessageFlags {
LOADING = 128,
FAILED_TO_MENTION_SOME_ROLES_IN_THREAD = 256,
SUPPRESS_NOTIFICATIONS = 4096,
IS_VOICE_MESSAGE = 8192
IS_VOICE_MESSAGE = 8192,
HAS_SNAPSHOT = 16384,
IS_COMPONENTS_V2 = 32768
}

export const enum AttachmentFlags {
Expand Down
14 changes: 7 additions & 7 deletions packages/core/src/http/rest.ts
Original file line number Diff line number Diff line change
Expand Up @@ -48,15 +48,18 @@ export class RestError extends Error {

// I ran out of ideas for naming this thing
type ExtractedData = ({ data: { attachments: Array<unknown> | undefined } } | { attachments: Array<unknown> | undefined }) & { reason?: string };
export type TokenType = "Bearer" | "Bot";

export class REST {
// eslint-disable-next-line @typescript-eslint/naming-convention
public static readonly BaseURL = "https://discord.com/api/v10/";

#token?: string | undefined;
#tokenType: TokenType;

public constructor(token?: string) {
public constructor(token?: string, tokenType: TokenType = "Bot") {
this.#token = token;
this.#tokenType = tokenType;
}

public async makeAPIRequest<T>(method: "GET" | "POST" | "PATCH" | "DELETE" | "PUT", path: string, data: FormData, reason?: string): Promise<T>;
Expand All @@ -65,7 +68,7 @@ export class REST {
const opts: RequestInit = {
method,
headers: {
Authorization: `Bot ${this.#token}`,
Authorization: `${this.#tokenType} ${this.#token}`,
// eslint-disable-next-line @typescript-eslint/naming-convention
"User-Agent": `DiscordBot/LilyBird/${(<{ version: string }>packageJson).version}`
}
Expand Down Expand Up @@ -128,8 +131,9 @@ export class REST {
return <T> await response.json();
}

public setToken(token: string | undefined): void {
public setToken(token: string | undefined, tokenType: TokenType = "Bot"): void {
this.#token = token;
this.#tokenType = tokenType;
}

//#region Gateway
Expand Down Expand Up @@ -517,10 +521,6 @@ export class REST {

//#endregion Emoji
//#region Guild
public async createGuild(body: Guild.Create.GuildJSONParams): Promise<Guild.Structure> {
return this.makeAPIRequest("POST", "guilds", body);
}

public async getGuild(guildId: string, withCounts = false): Promise<Guild.Structure> {
return this.makeAPIRequest("GET", `guilds/${guildId}?with_counts=${withCounts}`);
}
Expand Down
2 changes: 2 additions & 0 deletions packages/core/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,5 +4,7 @@ export { REST } from "./http/rest.js";
export * as CDN from "./http/cdn.js";

export * from "./enums/index.js";
export * from "./ws/manager.js";
export * from "./compiler.js";
export * from "./client.js";
export * from "./utils.js";
183 changes: 91 additions & 92 deletions packages/core/src/typings/client.ts
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
import type { CachingManager } from "../cache/manager.js";
import type { CacheManagerStructure } from "./cache-manager.js";
import type { CachingManager } from "../cache/manager.js";
import type { DispatchFunction } from "../ws/manager.js";
import type { Application } from "./application.js";
import type { Awaitable } from "./utils.js";
import type { Client } from "../client.js";

import type {
CachingDelegationType,
TransformerReturnType,
CacheExecutionPolicy,
DebugIdentifier,
Intents
DebugIdentifier
} from "#enums";

import type {
Expand All @@ -29,7 +29,6 @@ import type {
GuildIntegrationsUpdate,
MessageReactionRemove,
MessagePollVoteRemove,
ReceiveDispatchEvent,
GuildStickersUpdate,
StageInstanceCreate,
StageInstanceUpdate,
Expand Down Expand Up @@ -77,7 +76,7 @@ import type {
Ready
} from "./gateway-events.js";

export type ClientListeners<T extends Transformers> = {
export type Listeners<C, T extends Transformers<C>> = {
[K in keyof T]?: T[K] extends { handler: unknown }
? (T[K] & {})["handler"] extends ((...args: any) => infer R)
? R extends [unknown, ...Array<unknown>] ? ((...arg: R) => Awaitable<unknown>) : ((arg: R) => Awaitable<unknown>)
Expand All @@ -87,79 +86,79 @@ export type ClientListeners<T extends Transformers> = {
: never
};

export type Transformer<T> = {
export type Transformer<C, T> = {
return: TransformerReturnType,
handler: (...args: [client: Client, payload: T]) => unknown
handler: (...args: [client: C, payload: T]) => unknown
};

export interface Transformers {
raw?: {
return: TransformerReturnType,
handler: (data: ReceiveDispatchEvent) => unknown
};
ready?: Transformer<Ready["d"]>;
resumed?: Transformer<undefined>;
applicationCommandPermissionsUpdate?: Transformer<ApplicationCommandPermissionsUpdate["d"]>;
autoModerationRuleCreate?: Transformer<AutoModerationRuleCreate["d"]>;
autoModerationRuleUpdate?: Transformer<AutoModerationRuleUpdate["d"]>;
autoModerationRuleDelete?: Transformer<AutoModerationRuleDelete["d"]>;
autoModerationActionExecution?: Transformer<AutoModerationActionExecution["d"]>;
channelCreate?: Transformer<ChannelCreate["d"]>;
channelUpdate?: Transformer<ChannelUpdate["d"]>;
channelDelete?: Transformer<ChannelDelete["d"]>;
channelPinsUpdate?: Transformer<ChannelPinsUpdate["d"]>;
threadCreate?: Transformer<ThreadCreate["d"]>;
threadUpdate?: Transformer<ThreadUpdate["d"]>;
threadDelete?: Transformer<ThreadDelete["d"]>;
threadListSync?: Transformer<ThreadListSync["d"]>;
threadMemberUpdate?: Transformer<ThreadMemberUpdate["d"]>;
threadMembersUpdate?: Transformer<ThreadMembersUpdate["d"]>;
guildCreate?: Transformer<GuildCreate["d"]>;
guildUpdate?: Transformer<GuildUpdate["d"]>;
guildDelete?: Transformer<GuildDelete["d"]>;
guildAuditLogEntryCreate?: Transformer<GuildAuditLogEntryCreate["d"]>;
guildBanAdd?: Transformer<GuildBanAdd["d"]>;
guildBanRemove?: Transformer<GuildBanRemove["d"]>;
guildEmojisUpdate?: Transformer<GuildEmojisUpdate["d"]>;
guildStickersUpdate?: Transformer<GuildStickersUpdate["d"]>;
guildIntegrationsUpdate?: Transformer<GuildIntegrationsUpdate["d"]>;
guildMemberAdd?: Transformer<GuildMemberAdd["d"]>;
guildMemberRemove?: Transformer<GuildMemberRemove["d"]>;
guildMemberUpdate?: Transformer<GuildMemberUpdate["d"]>;
guildMembersChunk?: Transformer<GuildMembersChunk["d"]>;
guildRoleCreate?: Transformer<GuildRoleCreate["d"]>;
guildRoleUpdate?: Transformer<GuildRoleUpdate["d"]>;
guildRoleDelete?: Transformer<GuildRoleDelete["d"]>;
guildScheduledEventCreate?: Transformer<GuildScheduledEventCreate["d"]>;
guildScheduledEventUpdate?: Transformer<GuildScheduledEventUpdate["d"]>;
guildScheduledEventDelete?: Transformer<GuildScheduledEventDelete["d"]>;
guildScheduledEventUserAdd?: Transformer<GuildScheduledEventUserAdd["d"]>;
guildScheduledEventUserRemove?: Transformer<GuildScheduledEventUserRemove["d"]>;
integrationCreate?: Transformer<IntegrationCreate["d"]>;
integrationUpdate?: Transformer<IntegrationUpdate["d"]>;
integrationDelete?: Transformer<IntegrationDelete["d"]>;
interactionCreate?: Transformer<InteractionCreate["d"]>;
inviteCreate?: Transformer<InviteCreate["d"]>;
inviteDelete?: Transformer<InviteDelete["d"]>;
messageCreate?: Transformer<MessageCreate["d"]>;
messageUpdate?: Transformer<MessageUpdate["d"]>;
messageDelete?: Transformer<MessageDelete["d"]>;
messageDeleteBulk?: Transformer<MessageDeleteBulk["d"]>;
messageReactionAdd?: Transformer<MessageReactionAdd["d"]>;
messageReactionRemove?: Transformer<MessageReactionRemove["d"]>;
messageReactionRemoveAll?: Transformer<MessageReactionRemoveAll["d"]>;
messageReactionRemoveEmoji?: Transformer<MessageReactionRemoveEmoji["d"]>;
presenceUpdate?: Transformer<PresenceUpdate["d"]>;
stageInstanceCreate?: Transformer<StageInstanceCreate["d"]>;
stageInstanceUpdate?: Transformer<StageInstanceUpdate["d"]>;
stageInstanceDelete?: Transformer<StageInstanceCreate["d"]>;
typingStart?: Transformer<TypingStart["d"]>;
userUpdate?: Transformer<UserUpdate["d"]>;
voiceStateUpdate?: Transformer<VoiceStateUpdate["d"]>;
voiceServerUpdate?: Transformer<VoiceServerUpdate["d"]>;
webhookUpdate?: Transformer<WebhookUpdate["d"]>;
messagePollVoteAdd?: Transformer<MessagePollVoteAdd["d"]>;
messagePollVoteRemove?: Transformer<MessagePollVoteRemove["d"]>;
export interface Transformers<C> {
/**
* Special case, its a `ready` handler that only fires once
*/
setup?: Transformer<C, Ready["d"]>;
ready?: Transformer<C, Ready["d"]>;
resumed?: Transformer<C, undefined>;
applicationCommandPermissionsUpdate?: Transformer<C, ApplicationCommandPermissionsUpdate["d"]>;
autoModerationRuleCreate?: Transformer<C, AutoModerationRuleCreate["d"]>;
autoModerationRuleUpdate?: Transformer<C, AutoModerationRuleUpdate["d"]>;
autoModerationRuleDelete?: Transformer<C, AutoModerationRuleDelete["d"]>;
autoModerationActionExecution?: Transformer<C, AutoModerationActionExecution["d"]>;
channelCreate?: Transformer<C, ChannelCreate["d"]>;
channelUpdate?: Transformer<C, ChannelUpdate["d"]>;
channelDelete?: Transformer<C, ChannelDelete["d"]>;
channelPinsUpdate?: Transformer<C, ChannelPinsUpdate["d"]>;
threadCreate?: Transformer<C, ThreadCreate["d"]>;
threadUpdate?: Transformer<C, ThreadUpdate["d"]>;
threadDelete?: Transformer<C, ThreadDelete["d"]>;
threadListSync?: Transformer<C, ThreadListSync["d"]>;
threadMemberUpdate?: Transformer<C, ThreadMemberUpdate["d"]>;
threadMembersUpdate?: Transformer<C, ThreadMembersUpdate["d"]>;
guildCreate?: Transformer<C, GuildCreate["d"]>;
guildUpdate?: Transformer<C, GuildUpdate["d"]>;
guildDelete?: Transformer<C, GuildDelete["d"]>;
guildAuditLogEntryCreate?: Transformer<C, GuildAuditLogEntryCreate["d"]>;
guildBanAdd?: Transformer<C, GuildBanAdd["d"]>;
guildBanRemove?: Transformer<C, GuildBanRemove["d"]>;
guildEmojisUpdate?: Transformer<C, GuildEmojisUpdate["d"]>;
guildStickersUpdate?: Transformer<C, GuildStickersUpdate["d"]>;
guildIntegrationsUpdate?: Transformer<C, GuildIntegrationsUpdate["d"]>;
guildMemberAdd?: Transformer<C, GuildMemberAdd["d"]>;
guildMemberRemove?: Transformer<C, GuildMemberRemove["d"]>;
guildMemberUpdate?: Transformer<C, GuildMemberUpdate["d"]>;
guildMembersChunk?: Transformer<C, GuildMembersChunk["d"]>;
guildRoleCreate?: Transformer<C, GuildRoleCreate["d"]>;
guildRoleUpdate?: Transformer<C, GuildRoleUpdate["d"]>;
guildRoleDelete?: Transformer<C, GuildRoleDelete["d"]>;
guildScheduledEventCreate?: Transformer<C, GuildScheduledEventCreate["d"]>;
guildScheduledEventUpdate?: Transformer<C, GuildScheduledEventUpdate["d"]>;
guildScheduledEventDelete?: Transformer<C, GuildScheduledEventDelete["d"]>;
guildScheduledEventUserAdd?: Transformer<C, GuildScheduledEventUserAdd["d"]>;
guildScheduledEventUserRemove?: Transformer<C, GuildScheduledEventUserRemove["d"]>;
integrationCreate?: Transformer<C, IntegrationCreate["d"]>;
integrationUpdate?: Transformer<C, IntegrationUpdate["d"]>;
integrationDelete?: Transformer<C, IntegrationDelete["d"]>;
interactionCreate?: Transformer<C, InteractionCreate["d"]>;
inviteCreate?: Transformer<C, InviteCreate["d"]>;
inviteDelete?: Transformer<C, InviteDelete["d"]>;
messageCreate?: Transformer<C, MessageCreate["d"]>;
messageUpdate?: Transformer<C, MessageUpdate["d"]>;
messageDelete?: Transformer<C, MessageDelete["d"]>;
messageDeleteBulk?: Transformer<C, MessageDeleteBulk["d"]>;
messageReactionAdd?: Transformer<C, MessageReactionAdd["d"]>;
messageReactionRemove?: Transformer<C, MessageReactionRemove["d"]>;
messageReactionRemoveAll?: Transformer<C, MessageReactionRemoveAll["d"]>;
messageReactionRemoveEmoji?: Transformer<C, MessageReactionRemoveEmoji["d"]>;
presenceUpdate?: Transformer<C, PresenceUpdate["d"]>;
stageInstanceCreate?: Transformer<C, StageInstanceCreate["d"]>;
stageInstanceUpdate?: Transformer<C, StageInstanceUpdate["d"]>;
stageInstanceDelete?: Transformer<C, StageInstanceCreate["d"]>;
typingStart?: Transformer<C, TypingStart["d"]>;
userUpdate?: Transformer<C, UserUpdate["d"]>;
voiceStateUpdate?: Transformer<C, VoiceStateUpdate["d"]>;
voiceServerUpdate?: Transformer<C, VoiceServerUpdate["d"]>;
webhookUpdate?: Transformer<C, WebhookUpdate["d"]>;
messagePollVoteAdd?: Transformer<C, MessagePollVoteAdd["d"]>;
messagePollVoteRemove?: Transformer<C, MessagePollVoteRemove["d"]>;
}

export interface SelectiveCache {
Expand Down Expand Up @@ -216,31 +215,31 @@ export interface DefaultCache extends BaseCachingStructure {
}

// eslint-disable-next-line @typescript-eslint/no-empty-object-type
export type ParseCachingManager<T extends ClientOptions<Transformers>> = T["caching"] extends {}
? T["caching"]["applyTransformers"] extends true
? T["caching"] extends { transformerTypes: (infer U extends CacheWithTransformers["transformerTypes"]) }
export type ParseCachingManager<T extends CachingOptions> = T extends {}
? T["applyTransformers"] extends true
? T extends { transformerTypes: (infer U extends CacheWithTransformers["transformerTypes"]) }
? CachingManager<U["guild"], U["channel"], U["voiceState"]> : never
: T["caching"]["delegate"] extends CachingDelegationType.EXTERNAL
? T["caching"]["manager"] & {}
: T["delegate"] extends CachingDelegationType.EXTERNAL
? T["manager"] & {}
: CachingManager
: never;

export type DebugFunction = (identifier: DebugIdentifier, payload?: unknown) => any;

export interface BaseClientOptions<T extends Transformers> {
export interface ClientOptions {
intents: number;
listeners: ClientListeners<T>;
transformers?: T;
dispatch?: DispatchFunction;
presence?: UpdatePresenceStructure;
caching?: (DefaultCache | ExternalCache | TransformersCache) & ApplyTransformers;
useDebugRest?: boolean;
setup?: (client: Client) => Awaitable<any>;
cachingManager?: CacheManagerStructure;
}

export interface ClientOptions<T extends Transformers> extends Omit<BaseClientOptions<T>, "intents"> {
intents: Array<Intents> | number;
token: string;
attachDebugListener?: boolean;
customCacheKeys?: BaseCachingStructure["customKeys"];
debugListener?: (identifier: DebugIdentifier, payload: unknown) => void;
export type CachingOptions = (DefaultCache | ExternalCache | TransformersCache) & ApplyTransformers;

export interface MockClient {
/** By default this is a UserStructure, but can change according to your transformers*/
readonly user: any;
readonly sessionId: string;
readonly application: Application.Structure;
readonly cache: CacheManagerStructure;
}
20 changes: 0 additions & 20 deletions packages/core/src/typings/guild.ts
Original file line number Diff line number Diff line change
Expand Up @@ -366,26 +366,6 @@ export declare namespace Guild {
}

export namespace Create {
/**
* @see {@link https://discord.com/developers/docs/resources/guild#create-guild-json-params}
*/
export interface GuildJSONParams {
name: string;
icon?: DiscordImageData;
verification_level?: VerificationLevel;
default_message_notifications?: DefaultMessageNotificationLevel;
explicit_content_filter?: ExplicitContentFilterLevel;
roles?: Array<Role.Structure>;
channels?: Partial<Channel.Structure>;
afk_channel_id?: string;
afk_timeout?: number;
system_channel_id?: string;
/**
* Bitfield of {@link SystemChannelFlags}
*/
system_channel_flags?: number;
}

/**
* @see {@link https://discord.com/developers/docs/resources/guild#create-guild-channel-json-params}
*/
Expand Down
Loading