baff.js 0.0.0-stage → 0.1.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.
- package/CHANGELOG.md +25 -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 +53 -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 +115 -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 +49 -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 +111 -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 +57 -5
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ModalBuilder = exports.TextInputBuilder = void 0;
|
|
4
|
+
const constants_js_1 = require("../../util/constants.js");
|
|
5
|
+
const validate_js_1 = require("../validate.js");
|
|
6
|
+
const ActionRowBuilder_js_1 = require("./ActionRowBuilder.js");
|
|
7
|
+
const shared_js_1 = require("./shared.js");
|
|
8
|
+
class TextInputBuilder extends shared_js_1.ComponentBuilder {
|
|
9
|
+
customId;
|
|
10
|
+
label;
|
|
11
|
+
style = constants_js_1.TextInputStyle.Short;
|
|
12
|
+
placeholder;
|
|
13
|
+
minLength = 0;
|
|
14
|
+
maxLength = 4000;
|
|
15
|
+
required = true;
|
|
16
|
+
value;
|
|
17
|
+
setCustomId(customId) {
|
|
18
|
+
this.customId = customId;
|
|
19
|
+
return this;
|
|
20
|
+
}
|
|
21
|
+
setLabel(label) {
|
|
22
|
+
this.label = label;
|
|
23
|
+
return this;
|
|
24
|
+
}
|
|
25
|
+
setStyle(style) {
|
|
26
|
+
this.style = style === 'short' ? 1 : style === 'paragraph' ? 2 : style;
|
|
27
|
+
return this;
|
|
28
|
+
}
|
|
29
|
+
setPlaceholder(placeholder) {
|
|
30
|
+
this.placeholder = placeholder;
|
|
31
|
+
return this;
|
|
32
|
+
}
|
|
33
|
+
setMinLength(length) {
|
|
34
|
+
this.minLength = length;
|
|
35
|
+
return this;
|
|
36
|
+
}
|
|
37
|
+
setMaxLength(length) {
|
|
38
|
+
this.maxLength = length;
|
|
39
|
+
return this;
|
|
40
|
+
}
|
|
41
|
+
setRequired(required = true) {
|
|
42
|
+
this.required = required;
|
|
43
|
+
return this;
|
|
44
|
+
}
|
|
45
|
+
setValue(value) {
|
|
46
|
+
this.value = value;
|
|
47
|
+
return this;
|
|
48
|
+
}
|
|
49
|
+
toJSON() {
|
|
50
|
+
const code = 'INVALID_COMPONENT';
|
|
51
|
+
if (this.style !== 1 && this.style !== 2)
|
|
52
|
+
(0, validate_js_1.fail)(code, 'textInput.style', 'must be Short (1) or Paragraph (2).');
|
|
53
|
+
(0, validate_js_1.range)(code, 'textInput.minLength', this.minLength, 0, 4000);
|
|
54
|
+
(0, validate_js_1.range)(code, 'textInput.maxLength', this.maxLength, 1, 4000);
|
|
55
|
+
if (this.minLength > this.maxLength)
|
|
56
|
+
(0, validate_js_1.fail)(code, 'textInput', 'has minLength above maxLength.');
|
|
57
|
+
const out = this.base(constants_js_1.ComponentType.TextInput);
|
|
58
|
+
out.custom_id = (0, validate_js_1.text)(code, 'textInput.customId', this.customId, 100);
|
|
59
|
+
out.style = this.style;
|
|
60
|
+
out.label = (0, validate_js_1.text)(code, 'textInput.label', this.label, 45);
|
|
61
|
+
const placeholder = (0, validate_js_1.text)(code, 'textInput.placeholder', this.placeholder, 100, { optional: true });
|
|
62
|
+
if (placeholder !== undefined)
|
|
63
|
+
out.placeholder = placeholder;
|
|
64
|
+
out.min_length = this.minLength;
|
|
65
|
+
out.max_length = this.maxLength;
|
|
66
|
+
out.required = this.required;
|
|
67
|
+
const value = (0, validate_js_1.text)(code, 'textInput.value', this.value, 4000, { optional: true });
|
|
68
|
+
if (value !== undefined) {
|
|
69
|
+
if ([...value].length > this.maxLength)
|
|
70
|
+
(0, validate_js_1.fail)(code, 'textInput.value', 'is longer than maxLength.');
|
|
71
|
+
out.value = value;
|
|
72
|
+
}
|
|
73
|
+
return out;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
exports.TextInputBuilder = TextInputBuilder;
|
|
77
|
+
class ModalBuilder {
|
|
78
|
+
customId;
|
|
79
|
+
title;
|
|
80
|
+
rows = [];
|
|
81
|
+
setCustomId(customId) {
|
|
82
|
+
this.customId = customId;
|
|
83
|
+
return this;
|
|
84
|
+
}
|
|
85
|
+
setTitle(title) {
|
|
86
|
+
this.title = title;
|
|
87
|
+
return this;
|
|
88
|
+
}
|
|
89
|
+
addComponents(...rows) {
|
|
90
|
+
this.rows.push(...rows);
|
|
91
|
+
return this;
|
|
92
|
+
}
|
|
93
|
+
setComponents(...rows) {
|
|
94
|
+
this.rows = [...rows];
|
|
95
|
+
return this;
|
|
96
|
+
}
|
|
97
|
+
toJSON() {
|
|
98
|
+
const code = 'INVALID_COMPONENT';
|
|
99
|
+
if (!this.rows.length || this.rows.length > 5)
|
|
100
|
+
(0, validate_js_1.fail)(code, 'modal.components', 'needs 1-5 rows, each with one text input.');
|
|
101
|
+
const seen = new Set();
|
|
102
|
+
const components = this.rows.map((row) => {
|
|
103
|
+
const wrapped = row instanceof ActionRowBuilder_js_1.ActionRowBuilder ? row : new ActionRowBuilder_js_1.ActionRowBuilder().addComponents(row);
|
|
104
|
+
const json = wrapped.toModalJSON();
|
|
105
|
+
const id = json.components[0].custom_id;
|
|
106
|
+
if (seen.has(id))
|
|
107
|
+
(0, validate_js_1.fail)(code, 'modal.components', `custom id "${id}" is used twice.`);
|
|
108
|
+
seen.add(id);
|
|
109
|
+
return json;
|
|
110
|
+
});
|
|
111
|
+
return {
|
|
112
|
+
title: (0, validate_js_1.text)(code, 'modal.title', this.title, 45),
|
|
113
|
+
custom_id: (0, validate_js_1.text)(code, 'modal.customId', this.customId, 100),
|
|
114
|
+
components
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
exports.ModalBuilder = ModalBuilder;
|
|
@@ -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,192 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ChannelSelectMenuBuilder = exports.MentionableSelectMenuBuilder = exports.RoleSelectMenuBuilder = exports.UserSelectMenuBuilder = exports.StringSelectMenuBuilder = exports.StringSelectMenuOptionBuilder = void 0;
|
|
4
|
+
const constants_js_1 = require("../../util/constants.js");
|
|
5
|
+
const validate_js_1 = require("../validate.js");
|
|
6
|
+
const shared_js_1 = require("./shared.js");
|
|
7
|
+
class StringSelectMenuOptionBuilder {
|
|
8
|
+
data;
|
|
9
|
+
constructor(data = {}) {
|
|
10
|
+
this.data = data;
|
|
11
|
+
}
|
|
12
|
+
setLabel(label) {
|
|
13
|
+
this.data.label = label;
|
|
14
|
+
return this;
|
|
15
|
+
}
|
|
16
|
+
setValue(value) {
|
|
17
|
+
this.data.value = value;
|
|
18
|
+
return this;
|
|
19
|
+
}
|
|
20
|
+
setDescription(description) {
|
|
21
|
+
this.data.description = description;
|
|
22
|
+
return this;
|
|
23
|
+
}
|
|
24
|
+
setEmoji(emoji) {
|
|
25
|
+
this.data.emoji = emoji;
|
|
26
|
+
return this;
|
|
27
|
+
}
|
|
28
|
+
setDefault(value = true) {
|
|
29
|
+
this.data.default = value;
|
|
30
|
+
return this;
|
|
31
|
+
}
|
|
32
|
+
toJSON(path = 'option') {
|
|
33
|
+
const code = 'INVALID_COMPONENT';
|
|
34
|
+
const out = {
|
|
35
|
+
label: (0, validate_js_1.text)(code, `${path}.label`, this.data.label, 100),
|
|
36
|
+
value: (0, validate_js_1.text)(code, `${path}.value`, this.data.value, 100)
|
|
37
|
+
};
|
|
38
|
+
const description = (0, validate_js_1.text)(code, `${path}.description`, this.data.description, 100, { optional: true });
|
|
39
|
+
const emoji = (0, shared_js_1.emojiJSON)(`${path}.emoji`, this.data.emoji);
|
|
40
|
+
if (description !== undefined)
|
|
41
|
+
out.description = description;
|
|
42
|
+
if (emoji)
|
|
43
|
+
out.emoji = emoji;
|
|
44
|
+
out.default = this.data.default ?? false;
|
|
45
|
+
return out;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
exports.StringSelectMenuOptionBuilder = StringSelectMenuOptionBuilder;
|
|
49
|
+
class SelectMenuBase extends shared_js_1.ComponentBuilder {
|
|
50
|
+
customId;
|
|
51
|
+
placeholder;
|
|
52
|
+
min = 1;
|
|
53
|
+
max = 1;
|
|
54
|
+
disabled = false;
|
|
55
|
+
setCustomId(customId) {
|
|
56
|
+
this.customId = customId;
|
|
57
|
+
return this;
|
|
58
|
+
}
|
|
59
|
+
setPlaceholder(placeholder) {
|
|
60
|
+
this.placeholder = placeholder;
|
|
61
|
+
return this;
|
|
62
|
+
}
|
|
63
|
+
setMinValues(min) {
|
|
64
|
+
this.min = min;
|
|
65
|
+
return this;
|
|
66
|
+
}
|
|
67
|
+
setMaxValues(max) {
|
|
68
|
+
this.max = max;
|
|
69
|
+
return this;
|
|
70
|
+
}
|
|
71
|
+
setDisabled(disabled = true) {
|
|
72
|
+
this.disabled = disabled;
|
|
73
|
+
return this;
|
|
74
|
+
}
|
|
75
|
+
finish(out, defaults) {
|
|
76
|
+
const code = 'INVALID_COMPONENT';
|
|
77
|
+
out.custom_id = (0, validate_js_1.text)(code, 'select.customId', this.customId, 100);
|
|
78
|
+
const placeholder = (0, validate_js_1.text)(code, 'select.placeholder', this.placeholder, 150, { optional: true });
|
|
79
|
+
if (placeholder !== undefined)
|
|
80
|
+
out.placeholder = placeholder;
|
|
81
|
+
(0, validate_js_1.range)(code, 'select.minValues', this.min, 0, 25);
|
|
82
|
+
(0, validate_js_1.range)(code, 'select.maxValues', this.max, 1, 25);
|
|
83
|
+
if (this.min > this.max)
|
|
84
|
+
(0, validate_js_1.fail)(code, 'select', 'has minValues above maxValues.');
|
|
85
|
+
if (defaults > this.max)
|
|
86
|
+
(0, validate_js_1.fail)(code, 'select', 'has more default values than maxValues allows.');
|
|
87
|
+
out.min_values = this.min;
|
|
88
|
+
out.max_values = this.max;
|
|
89
|
+
out.disabled = this.disabled;
|
|
90
|
+
return out;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
class StringSelectMenuBuilder extends SelectMenuBase {
|
|
94
|
+
kind = constants_js_1.ComponentType.StringSelect;
|
|
95
|
+
options = [];
|
|
96
|
+
addOptions(...options) {
|
|
97
|
+
this.options.push(...options);
|
|
98
|
+
return this;
|
|
99
|
+
}
|
|
100
|
+
setOptions(...options) {
|
|
101
|
+
this.options = [...options];
|
|
102
|
+
return this;
|
|
103
|
+
}
|
|
104
|
+
toJSON() {
|
|
105
|
+
const code = 'INVALID_COMPONENT';
|
|
106
|
+
if (!this.options.length || this.options.length > 25)
|
|
107
|
+
(0, validate_js_1.fail)(code, 'select.options', 'needs 1-25 options.');
|
|
108
|
+
if (this.max > this.options.length)
|
|
109
|
+
(0, validate_js_1.fail)(code, 'select.maxValues', `can't be more than the number of options (${this.options.length}).`);
|
|
110
|
+
const seen = new Set();
|
|
111
|
+
const options = this.options.map((option, i) => {
|
|
112
|
+
const builder = option instanceof StringSelectMenuOptionBuilder ? option : new StringSelectMenuOptionBuilder(option);
|
|
113
|
+
const json = builder.toJSON(`select.options[${i}]`);
|
|
114
|
+
if (seen.has(json.value))
|
|
115
|
+
(0, validate_js_1.fail)(code, `select.options[${i}].value`, `"${json.value}" is used twice; option values must be unique.`);
|
|
116
|
+
seen.add(json.value);
|
|
117
|
+
return json;
|
|
118
|
+
});
|
|
119
|
+
const out = this.base(this.kind);
|
|
120
|
+
out.options = options;
|
|
121
|
+
return this.finish(out, options.filter((o) => o.default).length);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
exports.StringSelectMenuBuilder = StringSelectMenuBuilder;
|
|
125
|
+
class EntitySelectBuilder extends SelectMenuBase {
|
|
126
|
+
defaults = [];
|
|
127
|
+
addDefaults(...values) {
|
|
128
|
+
for (const value of values) {
|
|
129
|
+
if (!this.allowed.includes(value.type))
|
|
130
|
+
(0, validate_js_1.fail)('INVALID_COMPONENT', 'select.defaultValues', `type must be ${this.allowed.join(' or ')}.`);
|
|
131
|
+
}
|
|
132
|
+
this.defaults.push(...values);
|
|
133
|
+
return this;
|
|
134
|
+
}
|
|
135
|
+
build() {
|
|
136
|
+
const out = this.base(this.kind);
|
|
137
|
+
if (this.defaults.length)
|
|
138
|
+
out.default_values = this.defaults;
|
|
139
|
+
return this.finish(out, this.defaults.length);
|
|
140
|
+
}
|
|
141
|
+
toJSON() {
|
|
142
|
+
return this.build();
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
class UserSelectMenuBuilder extends EntitySelectBuilder {
|
|
146
|
+
kind = constants_js_1.ComponentType.UserSelect;
|
|
147
|
+
allowed = ['user'];
|
|
148
|
+
setDefaultUsers(...ids) {
|
|
149
|
+
return this.addDefaults(...ids.map((id) => ({ id, type: 'user' })));
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
exports.UserSelectMenuBuilder = UserSelectMenuBuilder;
|
|
153
|
+
class RoleSelectMenuBuilder extends EntitySelectBuilder {
|
|
154
|
+
kind = constants_js_1.ComponentType.RoleSelect;
|
|
155
|
+
allowed = ['role'];
|
|
156
|
+
setDefaultRoles(...ids) {
|
|
157
|
+
return this.addDefaults(...ids.map((id) => ({ id, type: 'role' })));
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
exports.RoleSelectMenuBuilder = RoleSelectMenuBuilder;
|
|
161
|
+
class MentionableSelectMenuBuilder extends EntitySelectBuilder {
|
|
162
|
+
kind = constants_js_1.ComponentType.MentionableSelect;
|
|
163
|
+
allowed = ['user', 'role'];
|
|
164
|
+
setDefaultValues(...values) {
|
|
165
|
+
return this.addDefaults(...values);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
exports.MentionableSelectMenuBuilder = MentionableSelectMenuBuilder;
|
|
169
|
+
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]);
|
|
170
|
+
class ChannelSelectMenuBuilder extends EntitySelectBuilder {
|
|
171
|
+
kind = constants_js_1.ComponentType.ChannelSelect;
|
|
172
|
+
allowed = ['channel'];
|
|
173
|
+
types = [];
|
|
174
|
+
setDefaultChannels(...ids) {
|
|
175
|
+
return this.addDefaults(...ids.map((id) => ({ id, type: 'channel' })));
|
|
176
|
+
}
|
|
177
|
+
setChannelTypes(...types) {
|
|
178
|
+
for (const type of types) {
|
|
179
|
+
if (!CHANNEL_TYPES.has(type))
|
|
180
|
+
(0, validate_js_1.fail)('INVALID_COMPONENT', 'select.channelTypes', `"${type}" is not a channel type.`);
|
|
181
|
+
}
|
|
182
|
+
this.types = [...new Set(types)];
|
|
183
|
+
return this;
|
|
184
|
+
}
|
|
185
|
+
toJSON() {
|
|
186
|
+
const out = this.build();
|
|
187
|
+
if (this.types.length)
|
|
188
|
+
out.channel_types = this.types;
|
|
189
|
+
return out;
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
exports.ChannelSelectMenuBuilder = ChannelSelectMenuBuilder;
|
|
@@ -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,32 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ComponentBuilder = void 0;
|
|
4
|
+
exports.emojiJSON = emojiJSON;
|
|
5
|
+
exports.jsonList = jsonList;
|
|
6
|
+
const validate_js_1 = require("../validate.js");
|
|
7
|
+
function emojiJSON(path, emoji) {
|
|
8
|
+
if (emoji === undefined)
|
|
9
|
+
return undefined;
|
|
10
|
+
if (typeof emoji === 'string') {
|
|
11
|
+
if (!emoji.trim())
|
|
12
|
+
return (0, validate_js_1.fail)('INVALID_COMPONENT', path, 'must be an emoji.');
|
|
13
|
+
return { name: emoji.trim() };
|
|
14
|
+
}
|
|
15
|
+
if (!emoji.id && !emoji.name)
|
|
16
|
+
return (0, validate_js_1.fail)('INVALID_COMPONENT', path, 'needs a name (Unicode emoji) or an id (custom emoji).');
|
|
17
|
+
return emoji.id ? { id: emoji.id, name: emoji.name ?? 'emoji', animated: emoji.animated ?? false } : { name: emoji.name };
|
|
18
|
+
}
|
|
19
|
+
function jsonList(list) {
|
|
20
|
+
return list.map((item) => (0, validate_js_1.resolveJSON)(item));
|
|
21
|
+
}
|
|
22
|
+
class ComponentBuilder {
|
|
23
|
+
componentId;
|
|
24
|
+
setId(id) {
|
|
25
|
+
this.componentId = id;
|
|
26
|
+
return this;
|
|
27
|
+
}
|
|
28
|
+
base(type) {
|
|
29
|
+
return this.componentId === undefined ? { type } : { type, id: this.componentId };
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
exports.ComponentBuilder = ComponentBuilder;
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { AttachmentBuilder, type RawFile } from '../rest/files.js';
|
|
2
|
+
import type { APIComponent, APIEmbed } from '../types.js';
|
|
3
|
+
import { EmbedBuilder } from './EmbedBuilder.js';
|
|
4
|
+
import { type Serializable } from './validate.js';
|
|
5
|
+
export interface PollData {
|
|
6
|
+
question: string;
|
|
7
|
+
answers: {
|
|
8
|
+
text: string;
|
|
9
|
+
emoji?: string;
|
|
10
|
+
}[];
|
|
11
|
+
duration?: number;
|
|
12
|
+
allowMultiselect?: boolean;
|
|
13
|
+
}
|
|
14
|
+
export interface MessageOptions {
|
|
15
|
+
content?: string;
|
|
16
|
+
embeds?: (EmbedBuilder | APIEmbed)[];
|
|
17
|
+
components?: (Serializable | APIComponent)[];
|
|
18
|
+
files?: (AttachmentBuilder | RawFile)[];
|
|
19
|
+
flags?: number;
|
|
20
|
+
ephemeral?: boolean;
|
|
21
|
+
replyTo?: string;
|
|
22
|
+
mentionReply?: boolean;
|
|
23
|
+
stickers?: string[];
|
|
24
|
+
poll?: PollData;
|
|
25
|
+
nonce?: string;
|
|
26
|
+
}
|
|
27
|
+
export interface ResolvedMessage {
|
|
28
|
+
body: Record<string, unknown>;
|
|
29
|
+
files: RawFile[];
|
|
30
|
+
}
|
|
31
|
+
export declare function checkComponents(list: APIComponent[], v2: boolean): void;
|
|
32
|
+
export declare function resolveEmbeds(embeds: (EmbedBuilder | APIEmbed)[]): APIEmbed[];
|
|
33
|
+
export declare function resolveMessage(input: string | MessageOptions, options?: {
|
|
34
|
+
allowEphemeral?: boolean;
|
|
35
|
+
}): ResolvedMessage;
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.checkComponents = checkComponents;
|
|
4
|
+
exports.resolveEmbeds = resolveEmbeds;
|
|
5
|
+
exports.resolveMessage = resolveMessage;
|
|
6
|
+
const BaffError_js_1 = require("../errors/BaffError.js");
|
|
7
|
+
const files_js_1 = require("../rest/files.js");
|
|
8
|
+
const constants_js_1 = require("../util/constants.js");
|
|
9
|
+
const EmbedBuilder_js_1 = require("./EmbedBuilder.js");
|
|
10
|
+
const validate_js_1 = require("./validate.js");
|
|
11
|
+
const V2_ONLY = new Set([constants_js_1.ComponentType.Section, constants_js_1.ComponentType.TextDisplay, constants_js_1.ComponentType.MediaGallery, constants_js_1.ComponentType.Separator, constants_js_1.ComponentType.Container]);
|
|
12
|
+
const MAX_COMPONENTS = 40;
|
|
13
|
+
const MAX_ROWS = 5;
|
|
14
|
+
const MAX_TEXT = 4000;
|
|
15
|
+
function checkComponents(list, v2) {
|
|
16
|
+
const code = 'INVALID_COMPONENT';
|
|
17
|
+
if (!v2 && list.length > MAX_ROWS)
|
|
18
|
+
throw new BaffError_js_1.BaffError(code, `A message can have up to ${MAX_ROWS} action rows (or use the IsComponentsV2 flag).`);
|
|
19
|
+
let total = 0;
|
|
20
|
+
let textLength = 0;
|
|
21
|
+
const ids = new Set();
|
|
22
|
+
const visit = (component) => {
|
|
23
|
+
total++;
|
|
24
|
+
if (typeof component.custom_id === 'string') {
|
|
25
|
+
if (ids.has(component.custom_id))
|
|
26
|
+
throw new BaffError_js_1.BaffError(code, `Custom id "${component.custom_id}" is used twice in one message.`);
|
|
27
|
+
ids.add(component.custom_id);
|
|
28
|
+
}
|
|
29
|
+
if (component.type === constants_js_1.ComponentType.TextDisplay)
|
|
30
|
+
textLength += [...String(component.content)].length;
|
|
31
|
+
for (const child of component.components ?? [])
|
|
32
|
+
visit(child);
|
|
33
|
+
if (component.accessory)
|
|
34
|
+
visit(component.accessory);
|
|
35
|
+
};
|
|
36
|
+
list.forEach(visit);
|
|
37
|
+
if (total > MAX_COMPONENTS)
|
|
38
|
+
throw new BaffError_js_1.BaffError(code, `A message can have up to ${MAX_COMPONENTS} components in total (nested ones included); this has ${total}.`);
|
|
39
|
+
if (textLength > MAX_TEXT)
|
|
40
|
+
throw new BaffError_js_1.BaffError(code, `Text displays can have up to ${MAX_TEXT} characters in total; this has ${textLength}.`);
|
|
41
|
+
}
|
|
42
|
+
function resolveEmbeds(embeds) {
|
|
43
|
+
if (embeds.length > EmbedBuilder_js_1.EmbedLimits.embeds)
|
|
44
|
+
throw new BaffError_js_1.BaffError('INVALID_EMBED', `A message can have up to ${EmbedBuilder_js_1.EmbedLimits.embeds} embeds.`);
|
|
45
|
+
const out = embeds.map((embed) => (embed instanceof EmbedBuilder_js_1.EmbedBuilder ? embed.toJSON() : new EmbedBuilder_js_1.EmbedBuilder(embed).toJSON()));
|
|
46
|
+
const total = embeds.reduce((sum, embed) => sum + (embed instanceof EmbedBuilder_js_1.EmbedBuilder ? embed : new EmbedBuilder_js_1.EmbedBuilder(embed)).length, 0);
|
|
47
|
+
if (total > EmbedBuilder_js_1.EmbedLimits.total)
|
|
48
|
+
throw new BaffError_js_1.BaffError('INVALID_EMBED', `Embeds can have up to ${EmbedBuilder_js_1.EmbedLimits.total} characters in total; these have ${total}.`);
|
|
49
|
+
return out;
|
|
50
|
+
}
|
|
51
|
+
function resolveMessage(input, options = {}) {
|
|
52
|
+
const message = typeof input === 'string' ? { content: input } : input;
|
|
53
|
+
const body = {};
|
|
54
|
+
let flags = message.flags ?? 0;
|
|
55
|
+
if (message.content !== undefined)
|
|
56
|
+
body.content = message.content;
|
|
57
|
+
if (message.embeds)
|
|
58
|
+
body.embeds = resolveEmbeds(message.embeds);
|
|
59
|
+
if (message.components) {
|
|
60
|
+
const components = message.components.map((c) => (0, validate_js_1.resolveJSON)(c));
|
|
61
|
+
if (components.some((c) => V2_ONLY.has(c.type)))
|
|
62
|
+
flags |= constants_js_1.MessageFlags.IsComponentsV2;
|
|
63
|
+
checkComponents(components, (flags & constants_js_1.MessageFlags.IsComponentsV2) !== 0);
|
|
64
|
+
body.components = components;
|
|
65
|
+
}
|
|
66
|
+
if ((flags & constants_js_1.MessageFlags.IsComponentsV2) !== 0 && (body.content || body.embeds?.length)) {
|
|
67
|
+
throw new BaffError_js_1.BaffError('INVALID_COMPONENT', 'A message with the IsComponentsV2 flag can not have content or embeds: put the text in text displays.');
|
|
68
|
+
}
|
|
69
|
+
if (message.ephemeral) {
|
|
70
|
+
if (!options.allowEphemeral)
|
|
71
|
+
throw new BaffError_js_1.BaffError('INVALID_MESSAGE', 'ephemeral only works on interaction replies.');
|
|
72
|
+
body.ephemeral = true;
|
|
73
|
+
}
|
|
74
|
+
if (flags)
|
|
75
|
+
body.flags = flags;
|
|
76
|
+
if (message.replyTo)
|
|
77
|
+
body.replyTo = message.replyTo;
|
|
78
|
+
if (message.mentionReply !== undefined)
|
|
79
|
+
body.mentionReply = message.mentionReply;
|
|
80
|
+
if (message.stickers?.length)
|
|
81
|
+
body.stickerIds = message.stickers;
|
|
82
|
+
if (message.poll)
|
|
83
|
+
body.poll = message.poll;
|
|
84
|
+
if (message.nonce)
|
|
85
|
+
body.nonce = message.nonce;
|
|
86
|
+
const files = (message.files ?? []).map((f) => (f instanceof files_js_1.AttachmentBuilder ? f.toFile() : f));
|
|
87
|
+
return { body, files };
|
|
88
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export declare function fail(code: string, path: string, message: string): never;
|
|
2
|
+
export declare function text(code: string, path: string, value: unknown, max: number, options?: {
|
|
3
|
+
min?: number;
|
|
4
|
+
optional?: boolean;
|
|
5
|
+
}): string | undefined;
|
|
6
|
+
export declare function url(code: string, path: string, value: unknown, optional?: boolean): string | undefined;
|
|
7
|
+
export declare function range(code: string, path: string, value: number, min: number, max: number): number;
|
|
8
|
+
export interface Serializable {
|
|
9
|
+
toJSON(): unknown;
|
|
10
|
+
}
|
|
11
|
+
export declare function isSerializable(value: unknown): value is Serializable;
|
|
12
|
+
export declare function resolveJSON<T>(value: T | Serializable): T;
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.fail = fail;
|
|
4
|
+
exports.text = text;
|
|
5
|
+
exports.url = url;
|
|
6
|
+
exports.range = range;
|
|
7
|
+
exports.isSerializable = isSerializable;
|
|
8
|
+
exports.resolveJSON = resolveJSON;
|
|
9
|
+
const BaffError_js_1 = require("../errors/BaffError.js");
|
|
10
|
+
function fail(code, path, message) {
|
|
11
|
+
throw new BaffError_js_1.BaffError(code, `${path} ${message}`);
|
|
12
|
+
}
|
|
13
|
+
function text(code, path, value, max, options = {}) {
|
|
14
|
+
if (value === undefined || value === null || value === '') {
|
|
15
|
+
if (options.optional)
|
|
16
|
+
return undefined;
|
|
17
|
+
return fail(code, path, `is required (${options.min ?? 1}-${max} characters).`);
|
|
18
|
+
}
|
|
19
|
+
if (typeof value !== 'string')
|
|
20
|
+
return fail(code, path, 'must be a string.');
|
|
21
|
+
if ((options.min ?? 1) > value.length || [...value].length > max)
|
|
22
|
+
return fail(code, path, `must be ${options.min ?? 1}-${max} characters.`);
|
|
23
|
+
return value;
|
|
24
|
+
}
|
|
25
|
+
function url(code, path, value, optional = true) {
|
|
26
|
+
if (value === undefined || value === null) {
|
|
27
|
+
if (optional)
|
|
28
|
+
return undefined;
|
|
29
|
+
return fail(code, path, 'is required.');
|
|
30
|
+
}
|
|
31
|
+
if (typeof value !== 'string' || value.length > 2048)
|
|
32
|
+
return fail(code, path, 'must be an http:// or https:// URL.');
|
|
33
|
+
let parsed;
|
|
34
|
+
try {
|
|
35
|
+
parsed = new URL(value);
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
return fail(code, path, 'must be an http:// or https:// URL.');
|
|
39
|
+
}
|
|
40
|
+
if (!/^https?:$/.test(parsed.protocol) || parsed.username || parsed.password)
|
|
41
|
+
return fail(code, path, 'must be an http:// or https:// URL.');
|
|
42
|
+
return value;
|
|
43
|
+
}
|
|
44
|
+
function range(code, path, value, min, max) {
|
|
45
|
+
if (!Number.isInteger(value) || value < min || value > max)
|
|
46
|
+
return fail(code, path, `must be a whole number from ${min} to ${max}.`);
|
|
47
|
+
return value;
|
|
48
|
+
}
|
|
49
|
+
function isSerializable(value) {
|
|
50
|
+
return typeof value === 'object' && value !== null && typeof value.toJSON === 'function';
|
|
51
|
+
}
|
|
52
|
+
function resolveJSON(value) {
|
|
53
|
+
return (isSerializable(value) ? value.toJSON() : value);
|
|
54
|
+
}
|