baff.js 0.0.0-stage → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +20 -0
- package/LICENSE +7 -0
- package/README.md +244 -3
- package/dist/cjs/builders/EmbedBuilder.d.ts +51 -0
- package/dist/cjs/builders/EmbedBuilder.js +150 -0
- package/dist/cjs/builders/SlashCommandBuilder.d.ts +69 -0
- package/dist/cjs/builders/SlashCommandBuilder.js +185 -0
- package/dist/cjs/builders/components/ActionRowBuilder.d.ts +14 -0
- package/dist/cjs/builders/components/ActionRowBuilder.js +45 -0
- package/dist/cjs/builders/components/ButtonBuilder.d.ts +19 -0
- package/dist/cjs/builders/components/ButtonBuilder.js +69 -0
- package/dist/cjs/builders/components/LayoutBuilders.d.ts +63 -0
- package/dist/cjs/builders/components/LayoutBuilders.js +179 -0
- package/dist/cjs/builders/components/ModalBuilder.d.ts +36 -0
- package/dist/cjs/builders/components/ModalBuilder.js +118 -0
- package/dist/cjs/builders/components/SelectMenuBuilder.d.ts +80 -0
- package/dist/cjs/builders/components/SelectMenuBuilder.js +192 -0
- package/dist/cjs/builders/components/shared.d.ts +16 -0
- package/dist/cjs/builders/components/shared.js +32 -0
- package/dist/cjs/builders/messagePayload.d.ts +35 -0
- package/dist/cjs/builders/messagePayload.js +88 -0
- package/dist/cjs/builders/validate.d.ts +12 -0
- package/dist/cjs/builders/validate.js +54 -0
- package/dist/cjs/client/Client.d.ts +63 -0
- package/dist/cjs/client/Client.js +152 -0
- package/dist/cjs/client/dispatch.d.ts +2 -0
- package/dist/cjs/client/dispatch.js +224 -0
- package/dist/cjs/client/events.d.ts +129 -0
- package/dist/cjs/client/events.js +2 -0
- package/dist/cjs/collectors/Collector.d.ts +37 -0
- package/dist/cjs/collectors/Collector.js +84 -0
- package/dist/cjs/collectors/InteractionCollector.d.ts +21 -0
- package/dist/cjs/collectors/InteractionCollector.js +44 -0
- package/dist/cjs/collectors/MessageCollector.d.ts +14 -0
- package/dist/cjs/collectors/MessageCollector.js +23 -0
- package/dist/cjs/errors/BaffError.d.ts +26 -0
- package/dist/cjs/errors/BaffError.js +39 -0
- package/dist/cjs/gateway/Gateway.d.ts +53 -0
- package/dist/cjs/gateway/Gateway.js +128 -0
- package/dist/cjs/http/handler.d.ts +11 -0
- package/dist/cjs/http/handler.js +72 -0
- package/dist/cjs/http/verify.d.ts +11 -0
- package/dist/cjs/http/verify.js +28 -0
- package/dist/cjs/index.d.ts +51 -0
- package/dist/cjs/index.js +185 -0
- package/dist/cjs/managers/CachedManager.d.ts +16 -0
- package/dist/cjs/managers/CachedManager.js +18 -0
- package/dist/cjs/managers/ChannelManager.d.ts +23 -0
- package/dist/cjs/managers/ChannelManager.js +85 -0
- package/dist/cjs/managers/CommandManager.d.ts +32 -0
- package/dist/cjs/managers/CommandManager.js +72 -0
- package/dist/cjs/managers/EventManager.d.ts +15 -0
- package/dist/cjs/managers/EventManager.js +36 -0
- package/dist/cjs/managers/ExpressionManagers.d.ts +36 -0
- package/dist/cjs/managers/ExpressionManagers.js +73 -0
- package/dist/cjs/managers/InviteManager.d.ts +17 -0
- package/dist/cjs/managers/InviteManager.js +26 -0
- package/dist/cjs/managers/MemberManager.d.ts +31 -0
- package/dist/cjs/managers/MemberManager.js +62 -0
- package/dist/cjs/managers/MessageManager.d.ts +32 -0
- package/dist/cjs/managers/MessageManager.js +79 -0
- package/dist/cjs/managers/RoleManager.d.ts +22 -0
- package/dist/cjs/managers/RoleManager.js +73 -0
- package/dist/cjs/managers/ServerChannelManager.d.ts +20 -0
- package/dist/cjs/managers/ServerChannelManager.js +30 -0
- package/dist/cjs/managers/ServerManager.d.ts +12 -0
- package/dist/cjs/managers/ServerManager.js +62 -0
- package/dist/cjs/managers/ThreadManager.d.ts +12 -0
- package/dist/cjs/managers/ThreadManager.js +20 -0
- package/dist/cjs/managers/UserManager.d.ts +11 -0
- package/dist/cjs/managers/UserManager.js +38 -0
- package/dist/cjs/managers/VoiceManager.d.ts +8 -0
- package/dist/cjs/managers/VoiceManager.js +17 -0
- package/dist/cjs/package.json +1 -0
- package/dist/cjs/rest/REST.d.ts +58 -0
- package/dist/cjs/rest/REST.js +193 -0
- package/dist/cjs/rest/Routes.d.ts +54 -0
- package/dist/cjs/rest/Routes.js +58 -0
- package/dist/cjs/rest/files.d.ts +19 -0
- package/dist/cjs/rest/files.js +37 -0
- package/dist/cjs/structures/Base.d.ts +13 -0
- package/dist/cjs/structures/Base.js +30 -0
- package/dist/cjs/structures/Message.d.ts +91 -0
- package/dist/cjs/structures/Message.js +200 -0
- package/dist/cjs/structures/Role.d.ts +34 -0
- package/dist/cjs/structures/Role.js +84 -0
- package/dist/cjs/structures/ScheduledEvent.d.ts +37 -0
- package/dist/cjs/structures/ScheduledEvent.js +73 -0
- package/dist/cjs/structures/Server.d.ts +68 -0
- package/dist/cjs/structures/Server.js +124 -0
- package/dist/cjs/structures/ServerAssets.d.ts +48 -0
- package/dist/cjs/structures/ServerAssets.js +104 -0
- package/dist/cjs/structures/ServerMember.d.ts +47 -0
- package/dist/cjs/structures/ServerMember.js +138 -0
- package/dist/cjs/structures/User.d.ts +35 -0
- package/dist/cjs/structures/User.js +87 -0
- package/dist/cjs/structures/Webhook.d.ts +30 -0
- package/dist/cjs/structures/Webhook.js +68 -0
- package/dist/cjs/structures/channels/BaseChannel.d.ts +49 -0
- package/dist/cjs/structures/channels/BaseChannel.js +81 -0
- package/dist/cjs/structures/channels/DMChannel.d.ts +9 -0
- package/dist/cjs/structures/channels/DMChannel.js +21 -0
- package/dist/cjs/structures/channels/ServerChannels.d.ts +57 -0
- package/dist/cjs/structures/channels/ServerChannels.js +138 -0
- package/dist/cjs/structures/channels/TextBasedChannel.d.ts +25 -0
- package/dist/cjs/structures/channels/TextBasedChannel.js +53 -0
- package/dist/cjs/structures/interactions/BaseInteraction.d.ts +74 -0
- package/dist/cjs/structures/interactions/BaseInteraction.js +221 -0
- package/dist/cjs/structures/interactions/CommandInteraction.d.ts +44 -0
- package/dist/cjs/structures/interactions/CommandInteraction.js +109 -0
- package/dist/cjs/structures/interactions/ComponentInteraction.d.ts +44 -0
- package/dist/cjs/structures/interactions/ComponentInteraction.js +64 -0
- package/dist/cjs/structures/interactions/ModalSubmitInteraction.d.ts +29 -0
- package/dist/cjs/structures/interactions/ModalSubmitInteraction.js +42 -0
- package/dist/cjs/structures/interactions/createInteraction.d.ts +4 -0
- package/dist/cjs/structures/interactions/createInteraction.js +34 -0
- package/dist/cjs/types.d.ts +369 -0
- package/dist/cjs/types.js +2 -0
- package/dist/cjs/util/Collection.d.ts +32 -0
- package/dist/cjs/util/Collection.js +145 -0
- package/dist/cjs/util/Permissions.d.ts +87 -0
- package/dist/cjs/util/Permissions.js +113 -0
- package/dist/cjs/util/Snowflake.d.ts +20 -0
- package/dist/cjs/util/Snowflake.js +40 -0
- package/dist/cjs/util/TypedEmitter.d.ts +17 -0
- package/dist/cjs/util/TypedEmitter.js +5 -0
- package/dist/cjs/util/constants.d.ts +78 -0
- package/dist/cjs/util/constants.js +81 -0
- package/dist/cjs/util/emoji.d.ts +8 -0
- package/dist/cjs/util/emoji.js +10 -0
- package/dist/cjs/util/formatters.d.ts +29 -0
- package/dist/cjs/util/formatters.js +55 -0
- package/dist/esm/builders/EmbedBuilder.d.ts +51 -0
- package/dist/esm/builders/EmbedBuilder.js +145 -0
- package/dist/esm/builders/SlashCommandBuilder.d.ts +69 -0
- package/dist/esm/builders/SlashCommandBuilder.js +170 -0
- package/dist/esm/builders/components/ActionRowBuilder.d.ts +14 -0
- package/dist/esm/builders/components/ActionRowBuilder.js +41 -0
- package/dist/esm/builders/components/ButtonBuilder.d.ts +19 -0
- package/dist/esm/builders/components/ButtonBuilder.js +65 -0
- package/dist/esm/builders/components/LayoutBuilders.d.ts +63 -0
- package/dist/esm/builders/components/LayoutBuilders.js +169 -0
- package/dist/esm/builders/components/ModalBuilder.d.ts +36 -0
- package/dist/esm/builders/components/ModalBuilder.js +113 -0
- package/dist/esm/builders/components/SelectMenuBuilder.d.ts +80 -0
- package/dist/esm/builders/components/SelectMenuBuilder.js +183 -0
- package/dist/esm/builders/components/shared.d.ts +16 -0
- package/dist/esm/builders/components/shared.js +26 -0
- package/dist/esm/builders/messagePayload.d.ts +35 -0
- package/dist/esm/builders/messagePayload.js +83 -0
- package/dist/esm/builders/validate.d.ts +12 -0
- package/dist/esm/builders/validate.js +46 -0
- package/dist/esm/client/Client.d.ts +63 -0
- package/dist/esm/client/Client.js +147 -0
- package/dist/esm/client/dispatch.d.ts +2 -0
- package/dist/esm/client/dispatch.js +221 -0
- package/dist/esm/client/events.d.ts +129 -0
- package/dist/esm/client/events.js +1 -0
- package/dist/esm/collectors/Collector.d.ts +37 -0
- package/dist/esm/collectors/Collector.js +78 -0
- package/dist/esm/collectors/InteractionCollector.d.ts +21 -0
- package/dist/esm/collectors/InteractionCollector.js +40 -0
- package/dist/esm/collectors/MessageCollector.d.ts +14 -0
- package/dist/esm/collectors/MessageCollector.js +19 -0
- package/dist/esm/errors/BaffError.d.ts +26 -0
- package/dist/esm/errors/BaffError.js +33 -0
- package/dist/esm/gateway/Gateway.d.ts +53 -0
- package/dist/esm/gateway/Gateway.js +124 -0
- package/dist/esm/http/handler.d.ts +11 -0
- package/dist/esm/http/handler.js +68 -0
- package/dist/esm/http/verify.d.ts +11 -0
- package/dist/esm/http/verify.js +22 -0
- package/dist/esm/index.d.ts +51 -0
- package/dist/esm/index.js +49 -0
- package/dist/esm/managers/CachedManager.d.ts +16 -0
- package/dist/esm/managers/CachedManager.js +14 -0
- package/dist/esm/managers/ChannelManager.d.ts +23 -0
- package/dist/esm/managers/ChannelManager.js +81 -0
- package/dist/esm/managers/CommandManager.d.ts +32 -0
- package/dist/esm/managers/CommandManager.js +67 -0
- package/dist/esm/managers/EventManager.d.ts +15 -0
- package/dist/esm/managers/EventManager.js +32 -0
- package/dist/esm/managers/ExpressionManagers.d.ts +36 -0
- package/dist/esm/managers/ExpressionManagers.js +68 -0
- package/dist/esm/managers/InviteManager.d.ts +17 -0
- package/dist/esm/managers/InviteManager.js +22 -0
- package/dist/esm/managers/MemberManager.d.ts +31 -0
- package/dist/esm/managers/MemberManager.js +58 -0
- package/dist/esm/managers/MessageManager.d.ts +32 -0
- package/dist/esm/managers/MessageManager.js +75 -0
- package/dist/esm/managers/RoleManager.d.ts +22 -0
- package/dist/esm/managers/RoleManager.js +69 -0
- package/dist/esm/managers/ServerChannelManager.d.ts +20 -0
- package/dist/esm/managers/ServerChannelManager.js +26 -0
- package/dist/esm/managers/ServerManager.d.ts +12 -0
- package/dist/esm/managers/ServerManager.js +58 -0
- package/dist/esm/managers/ThreadManager.d.ts +12 -0
- package/dist/esm/managers/ThreadManager.js +16 -0
- package/dist/esm/managers/UserManager.d.ts +11 -0
- package/dist/esm/managers/UserManager.js +34 -0
- package/dist/esm/managers/VoiceManager.d.ts +8 -0
- package/dist/esm/managers/VoiceManager.js +13 -0
- package/dist/esm/package.json +1 -0
- package/dist/esm/rest/REST.d.ts +58 -0
- package/dist/esm/rest/REST.js +188 -0
- package/dist/esm/rest/Routes.d.ts +54 -0
- package/dist/esm/rest/Routes.js +55 -0
- package/dist/esm/rest/files.d.ts +19 -0
- package/dist/esm/rest/files.js +31 -0
- package/dist/esm/structures/Base.d.ts +13 -0
- package/dist/esm/structures/Base.js +25 -0
- package/dist/esm/structures/Message.d.ts +91 -0
- package/dist/esm/structures/Message.js +194 -0
- package/dist/esm/structures/Role.d.ts +34 -0
- package/dist/esm/structures/Role.js +79 -0
- package/dist/esm/structures/ScheduledEvent.d.ts +37 -0
- package/dist/esm/structures/ScheduledEvent.js +68 -0
- package/dist/esm/structures/Server.d.ts +68 -0
- package/dist/esm/structures/Server.js +120 -0
- package/dist/esm/structures/ServerAssets.d.ts +48 -0
- package/dist/esm/structures/ServerAssets.js +98 -0
- package/dist/esm/structures/ServerMember.d.ts +47 -0
- package/dist/esm/structures/ServerMember.js +133 -0
- package/dist/esm/structures/User.d.ts +35 -0
- package/dist/esm/structures/User.js +82 -0
- package/dist/esm/structures/Webhook.d.ts +30 -0
- package/dist/esm/structures/Webhook.js +63 -0
- package/dist/esm/structures/channels/BaseChannel.d.ts +49 -0
- package/dist/esm/structures/channels/BaseChannel.js +77 -0
- package/dist/esm/structures/channels/DMChannel.d.ts +9 -0
- package/dist/esm/structures/channels/DMChannel.js +17 -0
- package/dist/esm/structures/channels/ServerChannels.d.ts +57 -0
- package/dist/esm/structures/channels/ServerChannels.js +129 -0
- package/dist/esm/structures/channels/TextBasedChannel.d.ts +25 -0
- package/dist/esm/structures/channels/TextBasedChannel.js +49 -0
- package/dist/esm/structures/interactions/BaseInteraction.d.ts +74 -0
- package/dist/esm/structures/interactions/BaseInteraction.js +217 -0
- package/dist/esm/structures/interactions/CommandInteraction.d.ts +44 -0
- package/dist/esm/structures/interactions/CommandInteraction.js +104 -0
- package/dist/esm/structures/interactions/ComponentInteraction.d.ts +44 -0
- package/dist/esm/structures/interactions/ComponentInteraction.js +53 -0
- package/dist/esm/structures/interactions/ModalSubmitInteraction.d.ts +29 -0
- package/dist/esm/structures/interactions/ModalSubmitInteraction.js +37 -0
- package/dist/esm/structures/interactions/createInteraction.d.ts +4 -0
- package/dist/esm/structures/interactions/createInteraction.js +31 -0
- package/dist/esm/types.d.ts +369 -0
- package/dist/esm/types.js +1 -0
- package/dist/esm/util/Collection.d.ts +32 -0
- package/dist/esm/util/Collection.js +141 -0
- package/dist/esm/util/Permissions.d.ts +87 -0
- package/dist/esm/util/Permissions.js +109 -0
- package/dist/esm/util/Snowflake.d.ts +20 -0
- package/dist/esm/util/Snowflake.js +37 -0
- package/dist/esm/util/TypedEmitter.d.ts +17 -0
- package/dist/esm/util/TypedEmitter.js +2 -0
- package/dist/esm/util/constants.d.ts +78 -0
- package/dist/esm/util/constants.js +78 -0
- package/dist/esm/util/emoji.d.ts +8 -0
- package/dist/esm/util/emoji.js +7 -0
- package/dist/esm/util/formatters.d.ts +29 -0
- package/dist/esm/util/formatters.js +34 -0
- package/package.json +58 -6
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import type { APIComponent } from '../../types.js';
|
|
2
|
+
import { type ColorResolvable } from '../EmbedBuilder.js';
|
|
3
|
+
import { ButtonBuilder } from './ButtonBuilder.js';
|
|
4
|
+
import { ComponentBuilder, type ComponentInput } from './shared.js';
|
|
5
|
+
export declare class TextDisplayBuilder extends ComponentBuilder {
|
|
6
|
+
private content?;
|
|
7
|
+
constructor(content?: string);
|
|
8
|
+
setContent(content: string): this;
|
|
9
|
+
toJSON(): APIComponent;
|
|
10
|
+
}
|
|
11
|
+
export declare class ThumbnailBuilder extends ComponentBuilder {
|
|
12
|
+
private media?;
|
|
13
|
+
private description?;
|
|
14
|
+
private spoiler;
|
|
15
|
+
setURL(mediaUrl: string): this;
|
|
16
|
+
setDescription(description: string): this;
|
|
17
|
+
setSpoiler(spoiler?: boolean): this;
|
|
18
|
+
toJSON(): APIComponent;
|
|
19
|
+
}
|
|
20
|
+
export declare class MediaGalleryItemBuilder {
|
|
21
|
+
private media?;
|
|
22
|
+
private description?;
|
|
23
|
+
private spoiler;
|
|
24
|
+
setURL(mediaUrl: string): this;
|
|
25
|
+
setDescription(description: string): this;
|
|
26
|
+
setSpoiler(spoiler?: boolean): this;
|
|
27
|
+
toJSON(path?: string): Record<string, unknown>;
|
|
28
|
+
}
|
|
29
|
+
export declare class MediaGalleryBuilder extends ComponentBuilder {
|
|
30
|
+
private items;
|
|
31
|
+
addItems(...items: (MediaGalleryItemBuilder | {
|
|
32
|
+
media: {
|
|
33
|
+
url: string;
|
|
34
|
+
};
|
|
35
|
+
description?: string;
|
|
36
|
+
spoiler?: boolean;
|
|
37
|
+
})[]): this;
|
|
38
|
+
toJSON(): APIComponent;
|
|
39
|
+
}
|
|
40
|
+
export declare class SeparatorBuilder extends ComponentBuilder {
|
|
41
|
+
private divider;
|
|
42
|
+
private spacing;
|
|
43
|
+
setDivider(divider?: boolean): this;
|
|
44
|
+
setSpacing(spacing: number): this;
|
|
45
|
+
toJSON(): APIComponent;
|
|
46
|
+
}
|
|
47
|
+
export declare class SectionBuilder extends ComponentBuilder {
|
|
48
|
+
private texts;
|
|
49
|
+
private accessory?;
|
|
50
|
+
addTextDisplayComponents(...texts: (TextDisplayBuilder | string)[]): this;
|
|
51
|
+
setThumbnailAccessory(thumbnail: ThumbnailBuilder): this;
|
|
52
|
+
setButtonAccessory(button: ButtonBuilder): this;
|
|
53
|
+
toJSON(): APIComponent;
|
|
54
|
+
}
|
|
55
|
+
export declare class ContainerBuilder extends ComponentBuilder {
|
|
56
|
+
private children;
|
|
57
|
+
private accent?;
|
|
58
|
+
private spoiler;
|
|
59
|
+
addComponents(...components: ComponentInput[]): this;
|
|
60
|
+
setAccentColor(color: ColorResolvable | null): this;
|
|
61
|
+
setSpoiler(spoiler?: boolean): this;
|
|
62
|
+
toJSON(): APIComponent;
|
|
63
|
+
}
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
import { ComponentType, SeparatorSpacing } from '../../util/constants.js';
|
|
2
|
+
import { resolveColor } from '../EmbedBuilder.js';
|
|
3
|
+
import { fail, range, resolveJSON, text, url } from '../validate.js';
|
|
4
|
+
import { ComponentBuilder } from './shared.js';
|
|
5
|
+
const code = 'INVALID_COMPONENT';
|
|
6
|
+
export class TextDisplayBuilder extends ComponentBuilder {
|
|
7
|
+
content;
|
|
8
|
+
constructor(content) {
|
|
9
|
+
super();
|
|
10
|
+
this.content = content;
|
|
11
|
+
}
|
|
12
|
+
setContent(content) {
|
|
13
|
+
this.content = content;
|
|
14
|
+
return this;
|
|
15
|
+
}
|
|
16
|
+
toJSON() {
|
|
17
|
+
return { ...this.base(ComponentType.TextDisplay), content: text(code, 'textDisplay.content', this.content, 4000) };
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
export class ThumbnailBuilder extends ComponentBuilder {
|
|
21
|
+
media;
|
|
22
|
+
description;
|
|
23
|
+
spoiler = false;
|
|
24
|
+
setURL(mediaUrl) {
|
|
25
|
+
this.media = mediaUrl;
|
|
26
|
+
return this;
|
|
27
|
+
}
|
|
28
|
+
setDescription(description) {
|
|
29
|
+
this.description = description;
|
|
30
|
+
return this;
|
|
31
|
+
}
|
|
32
|
+
setSpoiler(spoiler = true) {
|
|
33
|
+
this.spoiler = spoiler;
|
|
34
|
+
return this;
|
|
35
|
+
}
|
|
36
|
+
toJSON() {
|
|
37
|
+
const out = this.base(ComponentType.Thumbnail);
|
|
38
|
+
out.media = { url: url(code, 'thumbnail.url', this.media, false) };
|
|
39
|
+
const description = text(code, 'thumbnail.description', this.description, 1024, { optional: true });
|
|
40
|
+
if (description !== undefined)
|
|
41
|
+
out.description = description;
|
|
42
|
+
out.spoiler = this.spoiler;
|
|
43
|
+
return out;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
export class MediaGalleryItemBuilder {
|
|
47
|
+
media;
|
|
48
|
+
description;
|
|
49
|
+
spoiler = false;
|
|
50
|
+
setURL(mediaUrl) {
|
|
51
|
+
this.media = mediaUrl;
|
|
52
|
+
return this;
|
|
53
|
+
}
|
|
54
|
+
setDescription(description) {
|
|
55
|
+
this.description = description;
|
|
56
|
+
return this;
|
|
57
|
+
}
|
|
58
|
+
setSpoiler(spoiler = true) {
|
|
59
|
+
this.spoiler = spoiler;
|
|
60
|
+
return this;
|
|
61
|
+
}
|
|
62
|
+
toJSON(path = 'mediaGallery.items[0]') {
|
|
63
|
+
const out = { media: { url: url(code, `${path}.url`, this.media, false) } };
|
|
64
|
+
const description = text(code, `${path}.description`, this.description, 1024, { optional: true });
|
|
65
|
+
if (description !== undefined)
|
|
66
|
+
out.description = description;
|
|
67
|
+
out.spoiler = this.spoiler;
|
|
68
|
+
return out;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
export class MediaGalleryBuilder extends ComponentBuilder {
|
|
72
|
+
items = [];
|
|
73
|
+
addItems(...items) {
|
|
74
|
+
this.items.push(...items);
|
|
75
|
+
return this;
|
|
76
|
+
}
|
|
77
|
+
toJSON() {
|
|
78
|
+
if (!this.items.length || this.items.length > 10)
|
|
79
|
+
fail(code, 'mediaGallery.items', 'needs 1-10 items.');
|
|
80
|
+
const items = this.items.map((item, i) => {
|
|
81
|
+
const path = `mediaGallery.items[${i}]`;
|
|
82
|
+
if (item instanceof MediaGalleryItemBuilder)
|
|
83
|
+
return item.toJSON(path);
|
|
84
|
+
const built = new MediaGalleryItemBuilder().setURL(item.media.url);
|
|
85
|
+
if (item.description)
|
|
86
|
+
built.setDescription(item.description);
|
|
87
|
+
if (item.spoiler)
|
|
88
|
+
built.setSpoiler();
|
|
89
|
+
return built.toJSON(path);
|
|
90
|
+
});
|
|
91
|
+
return { ...this.base(ComponentType.MediaGallery), items };
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
export class SeparatorBuilder extends ComponentBuilder {
|
|
95
|
+
divider = true;
|
|
96
|
+
spacing = SeparatorSpacing.Small;
|
|
97
|
+
setDivider(divider = true) {
|
|
98
|
+
this.divider = divider;
|
|
99
|
+
return this;
|
|
100
|
+
}
|
|
101
|
+
setSpacing(spacing) {
|
|
102
|
+
this.spacing = spacing;
|
|
103
|
+
return this;
|
|
104
|
+
}
|
|
105
|
+
toJSON() {
|
|
106
|
+
if (this.spacing !== 1 && this.spacing !== 2)
|
|
107
|
+
fail(code, 'separator.spacing', 'must be Small (1) or Large (2).');
|
|
108
|
+
return { ...this.base(ComponentType.Separator), divider: this.divider, spacing: this.spacing };
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
export class SectionBuilder extends ComponentBuilder {
|
|
112
|
+
texts = [];
|
|
113
|
+
accessory;
|
|
114
|
+
addTextDisplayComponents(...texts) {
|
|
115
|
+
this.texts.push(...texts);
|
|
116
|
+
return this;
|
|
117
|
+
}
|
|
118
|
+
setThumbnailAccessory(thumbnail) {
|
|
119
|
+
this.accessory = thumbnail;
|
|
120
|
+
return this;
|
|
121
|
+
}
|
|
122
|
+
setButtonAccessory(button) {
|
|
123
|
+
this.accessory = button;
|
|
124
|
+
return this;
|
|
125
|
+
}
|
|
126
|
+
toJSON() {
|
|
127
|
+
if (!this.texts.length || this.texts.length > 3)
|
|
128
|
+
fail(code, 'section.components', 'needs 1-3 text displays.');
|
|
129
|
+
if (!this.accessory)
|
|
130
|
+
fail(code, 'section.accessory', 'is required: a thumbnail or a button.');
|
|
131
|
+
return {
|
|
132
|
+
...this.base(ComponentType.Section),
|
|
133
|
+
components: this.texts.map((t) => (typeof t === 'string' ? new TextDisplayBuilder(t) : t).toJSON()),
|
|
134
|
+
accessory: this.accessory.toJSON()
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
export class ContainerBuilder extends ComponentBuilder {
|
|
139
|
+
children = [];
|
|
140
|
+
accent;
|
|
141
|
+
spoiler = false;
|
|
142
|
+
addComponents(...components) {
|
|
143
|
+
this.children.push(...components);
|
|
144
|
+
return this;
|
|
145
|
+
}
|
|
146
|
+
setAccentColor(color) {
|
|
147
|
+
this.accent = color === null ? undefined : resolveColor(color);
|
|
148
|
+
return this;
|
|
149
|
+
}
|
|
150
|
+
setSpoiler(spoiler = true) {
|
|
151
|
+
this.spoiler = spoiler;
|
|
152
|
+
return this;
|
|
153
|
+
}
|
|
154
|
+
toJSON() {
|
|
155
|
+
if (!this.children.length)
|
|
156
|
+
fail(code, 'container.components', 'needs at least one component.');
|
|
157
|
+
const allowed = [ComponentType.ActionRow, ComponentType.Section, ComponentType.TextDisplay, ComponentType.MediaGallery, ComponentType.Separator];
|
|
158
|
+
const components = this.children.map((child, i) => {
|
|
159
|
+
const json = resolveJSON(child);
|
|
160
|
+
if (!allowed.includes(json.type))
|
|
161
|
+
fail(code, `container.components[${i}]`, 'can be an action row, section, text display, media gallery or separator.');
|
|
162
|
+
return json;
|
|
163
|
+
});
|
|
164
|
+
const out = { ...this.base(ComponentType.Container), components, spoiler: this.spoiler };
|
|
165
|
+
if (this.accent !== undefined)
|
|
166
|
+
out.accent_color = range(code, 'container.accentColor', this.accent, 0, 0xffffff);
|
|
167
|
+
return out;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { APIComponent } from '../../types.js';
|
|
2
|
+
import { ActionRowBuilder } from './ActionRowBuilder.js';
|
|
3
|
+
import { ComponentBuilder } from './shared.js';
|
|
4
|
+
export declare class TextInputBuilder extends ComponentBuilder {
|
|
5
|
+
private customId?;
|
|
6
|
+
private label?;
|
|
7
|
+
private style;
|
|
8
|
+
private placeholder?;
|
|
9
|
+
private minLength;
|
|
10
|
+
private maxLength;
|
|
11
|
+
private required;
|
|
12
|
+
private value?;
|
|
13
|
+
setCustomId(customId: string): this;
|
|
14
|
+
setLabel(label: string): this;
|
|
15
|
+
setStyle(style: number | 'short' | 'paragraph'): this;
|
|
16
|
+
setPlaceholder(placeholder: string): this;
|
|
17
|
+
setMinLength(length: number): this;
|
|
18
|
+
setMaxLength(length: number): this;
|
|
19
|
+
setRequired(required?: boolean): this;
|
|
20
|
+
setValue(value: string): this;
|
|
21
|
+
toJSON(): APIComponent;
|
|
22
|
+
}
|
|
23
|
+
export declare class ModalBuilder {
|
|
24
|
+
private customId?;
|
|
25
|
+
private title?;
|
|
26
|
+
private rows;
|
|
27
|
+
setCustomId(customId: string): this;
|
|
28
|
+
setTitle(title: string): this;
|
|
29
|
+
addComponents(...rows: (ActionRowBuilder | TextInputBuilder)[]): this;
|
|
30
|
+
setComponents(...rows: (ActionRowBuilder | TextInputBuilder)[]): this;
|
|
31
|
+
toJSON(): {
|
|
32
|
+
title: string;
|
|
33
|
+
custom_id: string;
|
|
34
|
+
components: APIComponent[];
|
|
35
|
+
};
|
|
36
|
+
}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import { ComponentType, TextInputStyle } from '../../util/constants.js';
|
|
2
|
+
import { fail, range, text } from '../validate.js';
|
|
3
|
+
import { ActionRowBuilder } from './ActionRowBuilder.js';
|
|
4
|
+
import { ComponentBuilder } from './shared.js';
|
|
5
|
+
export class TextInputBuilder extends ComponentBuilder {
|
|
6
|
+
customId;
|
|
7
|
+
label;
|
|
8
|
+
style = TextInputStyle.Short;
|
|
9
|
+
placeholder;
|
|
10
|
+
minLength = 0;
|
|
11
|
+
maxLength = 4000;
|
|
12
|
+
required = true;
|
|
13
|
+
value;
|
|
14
|
+
setCustomId(customId) {
|
|
15
|
+
this.customId = customId;
|
|
16
|
+
return this;
|
|
17
|
+
}
|
|
18
|
+
setLabel(label) {
|
|
19
|
+
this.label = label;
|
|
20
|
+
return this;
|
|
21
|
+
}
|
|
22
|
+
setStyle(style) {
|
|
23
|
+
this.style = style === 'short' ? 1 : style === 'paragraph' ? 2 : style;
|
|
24
|
+
return this;
|
|
25
|
+
}
|
|
26
|
+
setPlaceholder(placeholder) {
|
|
27
|
+
this.placeholder = placeholder;
|
|
28
|
+
return this;
|
|
29
|
+
}
|
|
30
|
+
setMinLength(length) {
|
|
31
|
+
this.minLength = length;
|
|
32
|
+
return this;
|
|
33
|
+
}
|
|
34
|
+
setMaxLength(length) {
|
|
35
|
+
this.maxLength = length;
|
|
36
|
+
return this;
|
|
37
|
+
}
|
|
38
|
+
setRequired(required = true) {
|
|
39
|
+
this.required = required;
|
|
40
|
+
return this;
|
|
41
|
+
}
|
|
42
|
+
setValue(value) {
|
|
43
|
+
this.value = value;
|
|
44
|
+
return this;
|
|
45
|
+
}
|
|
46
|
+
toJSON() {
|
|
47
|
+
const code = 'INVALID_COMPONENT';
|
|
48
|
+
if (this.style !== 1 && this.style !== 2)
|
|
49
|
+
fail(code, 'textInput.style', 'must be Short (1) or Paragraph (2).');
|
|
50
|
+
range(code, 'textInput.minLength', this.minLength, 0, 4000);
|
|
51
|
+
range(code, 'textInput.maxLength', this.maxLength, 1, 4000);
|
|
52
|
+
if (this.minLength > this.maxLength)
|
|
53
|
+
fail(code, 'textInput', 'has minLength above maxLength.');
|
|
54
|
+
const out = this.base(ComponentType.TextInput);
|
|
55
|
+
out.custom_id = text(code, 'textInput.customId', this.customId, 100);
|
|
56
|
+
out.style = this.style;
|
|
57
|
+
out.label = text(code, 'textInput.label', this.label, 45);
|
|
58
|
+
const placeholder = text(code, 'textInput.placeholder', this.placeholder, 100, { optional: true });
|
|
59
|
+
if (placeholder !== undefined)
|
|
60
|
+
out.placeholder = placeholder;
|
|
61
|
+
out.min_length = this.minLength;
|
|
62
|
+
out.max_length = this.maxLength;
|
|
63
|
+
out.required = this.required;
|
|
64
|
+
const value = text(code, 'textInput.value', this.value, 4000, { optional: true });
|
|
65
|
+
if (value !== undefined) {
|
|
66
|
+
if ([...value].length > this.maxLength)
|
|
67
|
+
fail(code, 'textInput.value', 'is longer than maxLength.');
|
|
68
|
+
out.value = value;
|
|
69
|
+
}
|
|
70
|
+
return out;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
export class ModalBuilder {
|
|
74
|
+
customId;
|
|
75
|
+
title;
|
|
76
|
+
rows = [];
|
|
77
|
+
setCustomId(customId) {
|
|
78
|
+
this.customId = customId;
|
|
79
|
+
return this;
|
|
80
|
+
}
|
|
81
|
+
setTitle(title) {
|
|
82
|
+
this.title = title;
|
|
83
|
+
return this;
|
|
84
|
+
}
|
|
85
|
+
addComponents(...rows) {
|
|
86
|
+
this.rows.push(...rows);
|
|
87
|
+
return this;
|
|
88
|
+
}
|
|
89
|
+
setComponents(...rows) {
|
|
90
|
+
this.rows = [...rows];
|
|
91
|
+
return this;
|
|
92
|
+
}
|
|
93
|
+
toJSON() {
|
|
94
|
+
const code = 'INVALID_COMPONENT';
|
|
95
|
+
if (!this.rows.length || this.rows.length > 5)
|
|
96
|
+
fail(code, 'modal.components', 'needs 1-5 rows, each with one text input.');
|
|
97
|
+
const seen = new Set();
|
|
98
|
+
const components = this.rows.map((row) => {
|
|
99
|
+
const wrapped = row instanceof ActionRowBuilder ? row : new ActionRowBuilder().addComponents(row);
|
|
100
|
+
const json = wrapped.toModalJSON();
|
|
101
|
+
const id = json.components[0].custom_id;
|
|
102
|
+
if (seen.has(id))
|
|
103
|
+
fail(code, 'modal.components', `custom id "${id}" is used twice.`);
|
|
104
|
+
seen.add(id);
|
|
105
|
+
return json;
|
|
106
|
+
});
|
|
107
|
+
return {
|
|
108
|
+
title: text(code, 'modal.title', this.title, 45),
|
|
109
|
+
custom_id: text(code, 'modal.customId', this.customId, 100),
|
|
110
|
+
components
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import type { APIComponent } from '../../types.js';
|
|
2
|
+
import { ComponentBuilder, type EmojiInput } from './shared.js';
|
|
3
|
+
export interface SelectOptionData {
|
|
4
|
+
label: string;
|
|
5
|
+
value: string;
|
|
6
|
+
description?: string;
|
|
7
|
+
emoji?: EmojiInput;
|
|
8
|
+
default?: boolean;
|
|
9
|
+
}
|
|
10
|
+
export declare class StringSelectMenuOptionBuilder {
|
|
11
|
+
data: Partial<SelectOptionData>;
|
|
12
|
+
constructor(data?: Partial<SelectOptionData>);
|
|
13
|
+
setLabel(label: string): this;
|
|
14
|
+
setValue(value: string): this;
|
|
15
|
+
setDescription(description: string): this;
|
|
16
|
+
setEmoji(emoji: EmojiInput): this;
|
|
17
|
+
setDefault(value?: boolean): this;
|
|
18
|
+
toJSON(path?: string): Record<string, unknown>;
|
|
19
|
+
}
|
|
20
|
+
declare abstract class SelectMenuBase extends ComponentBuilder {
|
|
21
|
+
protected customId?: string;
|
|
22
|
+
protected placeholder?: string;
|
|
23
|
+
protected min: number;
|
|
24
|
+
protected max: number;
|
|
25
|
+
protected disabled: boolean;
|
|
26
|
+
protected abstract readonly kind: number;
|
|
27
|
+
setCustomId(customId: string): this;
|
|
28
|
+
setPlaceholder(placeholder: string): this;
|
|
29
|
+
setMinValues(min: number): this;
|
|
30
|
+
setMaxValues(max: number): this;
|
|
31
|
+
setDisabled(disabled?: boolean): this;
|
|
32
|
+
protected finish(out: APIComponent, defaults: number): APIComponent;
|
|
33
|
+
}
|
|
34
|
+
export declare class StringSelectMenuBuilder extends SelectMenuBase {
|
|
35
|
+
protected readonly kind: 3;
|
|
36
|
+
private options;
|
|
37
|
+
addOptions(...options: (StringSelectMenuOptionBuilder | SelectOptionData)[]): this;
|
|
38
|
+
setOptions(...options: (StringSelectMenuOptionBuilder | SelectOptionData)[]): this;
|
|
39
|
+
toJSON(): APIComponent;
|
|
40
|
+
}
|
|
41
|
+
declare abstract class EntitySelectBuilder extends SelectMenuBase {
|
|
42
|
+
protected abstract readonly allowed: readonly string[];
|
|
43
|
+
protected defaults: {
|
|
44
|
+
id: string;
|
|
45
|
+
type: string;
|
|
46
|
+
}[];
|
|
47
|
+
protected addDefaults(...values: {
|
|
48
|
+
id: string;
|
|
49
|
+
type: string;
|
|
50
|
+
}[]): this;
|
|
51
|
+
protected build(): APIComponent;
|
|
52
|
+
toJSON(): APIComponent;
|
|
53
|
+
}
|
|
54
|
+
export declare class UserSelectMenuBuilder extends EntitySelectBuilder {
|
|
55
|
+
protected readonly kind: 5;
|
|
56
|
+
protected readonly allowed: string[];
|
|
57
|
+
setDefaultUsers(...ids: string[]): this;
|
|
58
|
+
}
|
|
59
|
+
export declare class RoleSelectMenuBuilder extends EntitySelectBuilder {
|
|
60
|
+
protected readonly kind: 6;
|
|
61
|
+
protected readonly allowed: string[];
|
|
62
|
+
setDefaultRoles(...ids: string[]): this;
|
|
63
|
+
}
|
|
64
|
+
export declare class MentionableSelectMenuBuilder extends EntitySelectBuilder {
|
|
65
|
+
protected readonly kind: 7;
|
|
66
|
+
protected readonly allowed: string[];
|
|
67
|
+
setDefaultValues(...values: {
|
|
68
|
+
id: string;
|
|
69
|
+
type: 'user' | 'role';
|
|
70
|
+
}[]): this;
|
|
71
|
+
}
|
|
72
|
+
export declare class ChannelSelectMenuBuilder extends EntitySelectBuilder {
|
|
73
|
+
protected readonly kind: 8;
|
|
74
|
+
protected readonly allowed: string[];
|
|
75
|
+
private types;
|
|
76
|
+
setDefaultChannels(...ids: string[]): this;
|
|
77
|
+
setChannelTypes(...types: (string | number)[]): this;
|
|
78
|
+
toJSON(): APIComponent;
|
|
79
|
+
}
|
|
80
|
+
export {};
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
import { ComponentType } from '../../util/constants.js';
|
|
2
|
+
import { fail, range, text } from '../validate.js';
|
|
3
|
+
import { ComponentBuilder, emojiJSON } from './shared.js';
|
|
4
|
+
export class StringSelectMenuOptionBuilder {
|
|
5
|
+
data;
|
|
6
|
+
constructor(data = {}) {
|
|
7
|
+
this.data = data;
|
|
8
|
+
}
|
|
9
|
+
setLabel(label) {
|
|
10
|
+
this.data.label = label;
|
|
11
|
+
return this;
|
|
12
|
+
}
|
|
13
|
+
setValue(value) {
|
|
14
|
+
this.data.value = value;
|
|
15
|
+
return this;
|
|
16
|
+
}
|
|
17
|
+
setDescription(description) {
|
|
18
|
+
this.data.description = description;
|
|
19
|
+
return this;
|
|
20
|
+
}
|
|
21
|
+
setEmoji(emoji) {
|
|
22
|
+
this.data.emoji = emoji;
|
|
23
|
+
return this;
|
|
24
|
+
}
|
|
25
|
+
setDefault(value = true) {
|
|
26
|
+
this.data.default = value;
|
|
27
|
+
return this;
|
|
28
|
+
}
|
|
29
|
+
toJSON(path = 'option') {
|
|
30
|
+
const code = 'INVALID_COMPONENT';
|
|
31
|
+
const out = {
|
|
32
|
+
label: text(code, `${path}.label`, this.data.label, 100),
|
|
33
|
+
value: text(code, `${path}.value`, this.data.value, 100)
|
|
34
|
+
};
|
|
35
|
+
const description = text(code, `${path}.description`, this.data.description, 100, { optional: true });
|
|
36
|
+
const emoji = emojiJSON(`${path}.emoji`, this.data.emoji);
|
|
37
|
+
if (description !== undefined)
|
|
38
|
+
out.description = description;
|
|
39
|
+
if (emoji)
|
|
40
|
+
out.emoji = emoji;
|
|
41
|
+
out.default = this.data.default ?? false;
|
|
42
|
+
return out;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
class SelectMenuBase extends ComponentBuilder {
|
|
46
|
+
customId;
|
|
47
|
+
placeholder;
|
|
48
|
+
min = 1;
|
|
49
|
+
max = 1;
|
|
50
|
+
disabled = false;
|
|
51
|
+
setCustomId(customId) {
|
|
52
|
+
this.customId = customId;
|
|
53
|
+
return this;
|
|
54
|
+
}
|
|
55
|
+
setPlaceholder(placeholder) {
|
|
56
|
+
this.placeholder = placeholder;
|
|
57
|
+
return this;
|
|
58
|
+
}
|
|
59
|
+
setMinValues(min) {
|
|
60
|
+
this.min = min;
|
|
61
|
+
return this;
|
|
62
|
+
}
|
|
63
|
+
setMaxValues(max) {
|
|
64
|
+
this.max = max;
|
|
65
|
+
return this;
|
|
66
|
+
}
|
|
67
|
+
setDisabled(disabled = true) {
|
|
68
|
+
this.disabled = disabled;
|
|
69
|
+
return this;
|
|
70
|
+
}
|
|
71
|
+
finish(out, defaults) {
|
|
72
|
+
const code = 'INVALID_COMPONENT';
|
|
73
|
+
out.custom_id = text(code, 'select.customId', this.customId, 100);
|
|
74
|
+
const placeholder = text(code, 'select.placeholder', this.placeholder, 150, { optional: true });
|
|
75
|
+
if (placeholder !== undefined)
|
|
76
|
+
out.placeholder = placeholder;
|
|
77
|
+
range(code, 'select.minValues', this.min, 0, 25);
|
|
78
|
+
range(code, 'select.maxValues', this.max, 1, 25);
|
|
79
|
+
if (this.min > this.max)
|
|
80
|
+
fail(code, 'select', 'has minValues above maxValues.');
|
|
81
|
+
if (defaults > this.max)
|
|
82
|
+
fail(code, 'select', 'has more default values than maxValues allows.');
|
|
83
|
+
out.min_values = this.min;
|
|
84
|
+
out.max_values = this.max;
|
|
85
|
+
out.disabled = this.disabled;
|
|
86
|
+
return out;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
export class StringSelectMenuBuilder extends SelectMenuBase {
|
|
90
|
+
kind = ComponentType.StringSelect;
|
|
91
|
+
options = [];
|
|
92
|
+
addOptions(...options) {
|
|
93
|
+
this.options.push(...options);
|
|
94
|
+
return this;
|
|
95
|
+
}
|
|
96
|
+
setOptions(...options) {
|
|
97
|
+
this.options = [...options];
|
|
98
|
+
return this;
|
|
99
|
+
}
|
|
100
|
+
toJSON() {
|
|
101
|
+
const code = 'INVALID_COMPONENT';
|
|
102
|
+
if (!this.options.length || this.options.length > 25)
|
|
103
|
+
fail(code, 'select.options', 'needs 1-25 options.');
|
|
104
|
+
if (this.max > this.options.length)
|
|
105
|
+
fail(code, 'select.maxValues', `can't be more than the number of options (${this.options.length}).`);
|
|
106
|
+
const seen = new Set();
|
|
107
|
+
const options = this.options.map((option, i) => {
|
|
108
|
+
const builder = option instanceof StringSelectMenuOptionBuilder ? option : new StringSelectMenuOptionBuilder(option);
|
|
109
|
+
const json = builder.toJSON(`select.options[${i}]`);
|
|
110
|
+
if (seen.has(json.value))
|
|
111
|
+
fail(code, `select.options[${i}].value`, `"${json.value}" is used twice; option values must be unique.`);
|
|
112
|
+
seen.add(json.value);
|
|
113
|
+
return json;
|
|
114
|
+
});
|
|
115
|
+
const out = this.base(this.kind);
|
|
116
|
+
out.options = options;
|
|
117
|
+
return this.finish(out, options.filter((o) => o.default).length);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
class EntitySelectBuilder extends SelectMenuBase {
|
|
121
|
+
defaults = [];
|
|
122
|
+
addDefaults(...values) {
|
|
123
|
+
for (const value of values) {
|
|
124
|
+
if (!this.allowed.includes(value.type))
|
|
125
|
+
fail('INVALID_COMPONENT', 'select.defaultValues', `type must be ${this.allowed.join(' or ')}.`);
|
|
126
|
+
}
|
|
127
|
+
this.defaults.push(...values);
|
|
128
|
+
return this;
|
|
129
|
+
}
|
|
130
|
+
build() {
|
|
131
|
+
const out = this.base(this.kind);
|
|
132
|
+
if (this.defaults.length)
|
|
133
|
+
out.default_values = this.defaults;
|
|
134
|
+
return this.finish(out, this.defaults.length);
|
|
135
|
+
}
|
|
136
|
+
toJSON() {
|
|
137
|
+
return this.build();
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
export class UserSelectMenuBuilder extends EntitySelectBuilder {
|
|
141
|
+
kind = ComponentType.UserSelect;
|
|
142
|
+
allowed = ['user'];
|
|
143
|
+
setDefaultUsers(...ids) {
|
|
144
|
+
return this.addDefaults(...ids.map((id) => ({ id, type: 'user' })));
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
export class RoleSelectMenuBuilder extends EntitySelectBuilder {
|
|
148
|
+
kind = ComponentType.RoleSelect;
|
|
149
|
+
allowed = ['role'];
|
|
150
|
+
setDefaultRoles(...ids) {
|
|
151
|
+
return this.addDefaults(...ids.map((id) => ({ id, type: 'role' })));
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
export class MentionableSelectMenuBuilder extends EntitySelectBuilder {
|
|
155
|
+
kind = ComponentType.MentionableSelect;
|
|
156
|
+
allowed = ['user', 'role'];
|
|
157
|
+
setDefaultValues(...values) {
|
|
158
|
+
return this.addDefaults(...values);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
const CHANNEL_TYPES = new Set(['text', 'dm', 'voice', 'group_dm', 'category', 'announcement', 'thread', 'stage', 'forum', 0, 1, 2, 3, 4, 5, 10, 11, 12, 13, 15]);
|
|
162
|
+
export class ChannelSelectMenuBuilder extends EntitySelectBuilder {
|
|
163
|
+
kind = ComponentType.ChannelSelect;
|
|
164
|
+
allowed = ['channel'];
|
|
165
|
+
types = [];
|
|
166
|
+
setDefaultChannels(...ids) {
|
|
167
|
+
return this.addDefaults(...ids.map((id) => ({ id, type: 'channel' })));
|
|
168
|
+
}
|
|
169
|
+
setChannelTypes(...types) {
|
|
170
|
+
for (const type of types) {
|
|
171
|
+
if (!CHANNEL_TYPES.has(type))
|
|
172
|
+
fail('INVALID_COMPONENT', 'select.channelTypes', `"${type}" is not a channel type.`);
|
|
173
|
+
}
|
|
174
|
+
this.types = [...new Set(types)];
|
|
175
|
+
return this;
|
|
176
|
+
}
|
|
177
|
+
toJSON() {
|
|
178
|
+
const out = this.build();
|
|
179
|
+
if (this.types.length)
|
|
180
|
+
out.channel_types = this.types;
|
|
181
|
+
return out;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { APIComponent } from '../../types.js';
|
|
2
|
+
import { type Serializable } from '../validate.js';
|
|
3
|
+
export type EmojiInput = string | {
|
|
4
|
+
id?: string;
|
|
5
|
+
name?: string;
|
|
6
|
+
animated?: boolean;
|
|
7
|
+
};
|
|
8
|
+
export type ComponentInput<T extends Serializable = Serializable> = T | APIComponent;
|
|
9
|
+
export declare function emojiJSON(path: string, emoji: EmojiInput | undefined): Record<string, unknown> | undefined;
|
|
10
|
+
export declare function jsonList(list: readonly ComponentInput[]): APIComponent[];
|
|
11
|
+
export declare abstract class ComponentBuilder {
|
|
12
|
+
protected componentId?: number;
|
|
13
|
+
setId(id: number): this;
|
|
14
|
+
protected base(type: number): APIComponent;
|
|
15
|
+
abstract toJSON(): APIComponent;
|
|
16
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { fail, resolveJSON } from '../validate.js';
|
|
2
|
+
export function emojiJSON(path, emoji) {
|
|
3
|
+
if (emoji === undefined)
|
|
4
|
+
return undefined;
|
|
5
|
+
if (typeof emoji === 'string') {
|
|
6
|
+
if (!emoji.trim())
|
|
7
|
+
return fail('INVALID_COMPONENT', path, 'must be an emoji.');
|
|
8
|
+
return { name: emoji.trim() };
|
|
9
|
+
}
|
|
10
|
+
if (!emoji.id && !emoji.name)
|
|
11
|
+
return fail('INVALID_COMPONENT', path, 'needs a name (Unicode emoji) or an id (custom emoji).');
|
|
12
|
+
return emoji.id ? { id: emoji.id, name: emoji.name ?? 'emoji', animated: emoji.animated ?? false } : { name: emoji.name };
|
|
13
|
+
}
|
|
14
|
+
export function jsonList(list) {
|
|
15
|
+
return list.map((item) => resolveJSON(item));
|
|
16
|
+
}
|
|
17
|
+
export class ComponentBuilder {
|
|
18
|
+
componentId;
|
|
19
|
+
setId(id) {
|
|
20
|
+
this.componentId = id;
|
|
21
|
+
return this;
|
|
22
|
+
}
|
|
23
|
+
base(type) {
|
|
24
|
+
return this.componentId === undefined ? { type } : { type, id: this.componentId };
|
|
25
|
+
}
|
|
26
|
+
}
|