discord-container-builder
Version:
A simplified, developer-friendly API for Discord.js v2 Components that reduces boilerplate and improves code readability.
110 lines (99 loc) • 3.89 kB
text/typescript
import {
ContainerBuilder as DiscordContainerBuilder,
TextDisplayBuilder as DiscordTextDisplayBuilder,
SeparatorBuilder as DiscordSeparatorBuilder,
ActionRowBuilder as DiscordActionRowBuilder,
MessageActionRowComponentBuilder,
} from 'discord.js';
import { TextDisplayBuilder } from './TextDisplayBuilder';
import { SeparatorBuilder } from './SeparatorBuilder';
import { ActionRowBuilder } from './ActionRowBuilder';
/**
* Simplified ContainerBuilder that provides a cleaner API for creating Discord.js v2 Container components
*/
export class ContainerBuilder {
private readonly container: DiscordContainerBuilder;
constructor() {
this.container = new DiscordContainerBuilder();
}
/**
* Add text display components to the container
* @param components - TextDisplayBuilder instances or raw Discord TextDisplayBuilders
* @returns The ContainerBuilder instance for chaining
*/
addTextDisplayComponents(...components: (TextDisplayBuilder | DiscordTextDisplayBuilder)[]): this {
const discordComponents = components.map(component =>
component instanceof TextDisplayBuilder ? component.build() : component
);
this.container.addTextDisplayComponents(...discordComponents);
return this;
}
/**
* Add separator components to the container
* @param components - SeparatorBuilder instances or raw Discord SeparatorBuilders
* @returns The ContainerBuilder instance for chaining
*/
addSeparatorComponents(...components: (SeparatorBuilder | DiscordSeparatorBuilder)[]): this {
const discordComponents = components.map(component =>
component instanceof SeparatorBuilder ? component.build() : component
);
this.container.addSeparatorComponents(...discordComponents);
return this;
}
/**
* Add action row components to the container
* @param components - ActionRowBuilder instances or raw Discord ActionRowBuilders
* @returns The ContainerBuilder instance for chaining
*/
addActionRowComponents(...components: (ActionRowBuilder | DiscordActionRowBuilder<MessageActionRowComponentBuilder>)[]): this {
const discordComponents = components.map(component =>
component instanceof ActionRowBuilder ? component.build() : component
);
// Type assertion needed because our ActionRowBuilder is designed for message components
this.container.addActionRowComponents(...(discordComponents as any));
return this;
}
/**
* Add a text display with simplified API
* @param content - The text content to display
* @returns The ContainerBuilder instance for chaining
*/
addText(content: string): this {
return this.addTextDisplayComponents(new TextDisplayBuilder().setContent(content));
}
/**
* Add a separator with simplified API
* @param options - Optional separator configuration
* @returns The ContainerBuilder instance for chaining
*/
addSeparator(options?: { spacing?: any; divider?: boolean }): this {
const separator = new SeparatorBuilder();
if (options?.spacing) separator.setSpacing(options.spacing);
if (options?.divider !== undefined) separator.setDivider(options.divider);
return this.addSeparatorComponents(separator);
}
/**
* Add an action row with simplified API
* @param callback - Function to configure the action row
* @returns The ContainerBuilder instance for chaining
*/
addActionRow(callback: (row: ActionRowBuilder) => void): this {
const row = new ActionRowBuilder();
callback(row);
return this.addActionRowComponents(row);
}
/**
* Build the final Discord.js ContainerBuilder
* @returns The Discord.js ContainerBuilder instance
*/
build(): DiscordContainerBuilder {
return this.container;
}
/**
* Get the JSON representation of the container
* @returns The JSON data
*/
toJSON(): any {
return this.container.toJSON();
}
}