@discord-additions/components
Version:
Some helpful additions to make creating components easier.
177 lines • 12.2 kB
JavaScript
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const ActionRow_1 = __importDefault(require("./Structures/ActionRow"));
const Button_1 = __importDefault(require("./Structures/Button"));
const SelectMenu_1 = __importDefault(require("./Structures/SelectMenu"));
const TextInput_1 = __importDefault(require("./Structures/TextInput"));
const Constants_1 = require("./util/Constants");
class ComponentHelper {
rowMax = 5;
rows = [];
currentIndex = 0;
constructor(rowMax) {
if (rowMax)
this.rowMax = rowMax;
}
setRowMax(rowMax) {
this.rowMax = rowMax;
return this;
}
getCurrentRow() {
return (this.rows[this.currentIndex] || (this.rows[this.currentIndex] = new ActionRow_1.default()));
}
/**
* Star a new action row
*
* @param {Array<ValidComponents>} [components=[]] - the components to start this new row with
* @returns {this}
*/
addRow(components = []) {
this.currentIndex++;
this.rows.push(new ActionRow_1.default().addComponents(...components));
return this;
}
/**
* Add a component to the current row, or a new row depending on certain conditions
*
* @param {ValidComponents} component - the component to add
* @returns {this}
*/
addComponent(component) {
const cur = this.getCurrentRow();
if (component.type === Constants_1.ComponentTypes.SELECT_MENU) {
if (cur.isEmpty()) {
cur.addComponent(component);
this.addRow();
return this;
}
else {
this.addRow([component]).addRow();
return this;
}
}
if (cur.size >= this.rowMax)
return this.addRow([component]);
else {
cur.addComponent(component);
return this;
}
}
/**
* bulk add several components
*
* @param {Array<ValidComponents>} components - the components to add
* @returns {this}
*/
addComponents(...components) {
components.map(c => this.addComponent(c));
return this;
}
/**
* Add an interaction button to the current row
*
* @param {InteractionButtonStyle} style - the style of the button (see [this](https://discord.com/developers/docs/interactions/message-components#button-object-button-styles))
* @param {string} customID - a developer-defined identifier for the button, max 100 characters
* @param {string} [label] - text that appears on the button, max 80 characters
* @param {PartialEmoji} [emoji] - an emoji that appears on the button
* @param {boolean} [disabled] - whether the button is disabled
* @returns {this}
*/
addInteractionButton(style, customID, label, emoji, disabled) {
this.addComponent(new Button_1.default(style, customID).load(style, customID, label, emoji, disabled));
return this;
}
/**
* Add a url button to the current row
*
* @param {string} url - the url to open when clicked
* @param {string} label - text that appears on the button, max 80 characters
* @param {PartialEmoji} [emoji] - an emoji that appears on the button
* @param {boolean} [disabled] - whether the button is disabled
* @returns {this}
*/
addURLButton(url, label, emoji, disabled) {
this.addComponent(new Button_1.default(Constants_1.ButtonStyles.LINK, url).load(Constants_1.ButtonStyles.LINK, url, label, emoji, disabled));
return this;
}
get addLinkButton() { return this.addURLButton.bind(this); }
/**
* Add a select menu (to the current row, if empty - else as a new row)
*
* @param {string} customID - a developer-defined identifier for the button, max 100 characters
* @param {Array<SelectMenuOption>} options - the choices in the select, max 25
* @param {string} [placeholder] - custom placeholder text if nothing is selected, max 100 characters
* @param {number} [minValues] - the minimum number of items that must be chosen; default 1, min 0, max 25
* @param {number} [maxValues] - the maximum number of items that can be chosen; default 1, max 25
* @param {boolean} [disabled] - disable the select, default false
* @returns {this}
*/
addSelectMenu(customID, options, placeholder, minValues, maxValues, disabled) {
this.addComponent(new SelectMenu_1.default(customID).load(customID, options, placeholder, minValues, maxValues, disabled));
return this;
}
/**
* Add a text input to the current row
*
* @param {TextInputStyle} style - the style of the text input (see [this](https://discord.com/developers/docs/interactions/message-components#text-inputs-text-input-styles))
* @param {string} label - the label for this component
* @param {string} customID - a developer-defined identifier for the input, max 100 characters
* @param {string} [placeholder] - custom placeholder text if the input is empty, max 100 characters
* @param {string} [value] - a pre-filled value for this component, max 4000 characters
* @param {number} [minLength] - the minimum input length for a text input, min 0, max 4000
* @param {number} [maxLength] - the maximum input length for a text input, min 1, max 4000
* @param {boolean} [required] - whether this component is required to be filled, default true
* @returns
*/
addTextInput(style, label, customID, placeholder, value, minLength, maxLength, required) {
this.addComponent(new TextInput_1.default(style, label, customID).load(style, label, customID, placeholder, value, minLength, maxLength, required));
return this;
}
/**
* remove all of the rows that are empty
*
* @returns {this}
*/
removeEmptyRows() {
this.rows.forEach((row, index) => {
if (row.size === 0)
this.rows.splice(index, 1);
});
this.currentIndex = this.rows.length - 1;
return this;
}
/** convert the current contents to JSON */
toJSON() { return this.removeEmptyRows().rows.map(row => row.toJSON()); }
/**
* Convert an emoji to a partial
*
* @param {string} emoji - the unicode point of the emoji if default, else the fully qualified emoji
* @param {("default" | "custom")} type - default if built in (unicode), custom otherwise
* @returns {PartialEmoji}
* @example emojiToPartial("🐾", "default")
* @example emojiToPartial("<:paws8:681748079778463796>", "custom")
*/
static emojiToPartial(emoji, type) {
if (type === "default")
return {
id: null,
name: emoji,
animated: false
};
else {
const [, anim, name, id] = /^<?(a)?:(.*):([\d]{15,21})>?$/.exec(emoji) ?? [];
if (!name || !id)
return this.emojiToPartial(emoji, "default");
return {
id,
name,
animated: anim === "a"
};
}
}
}
exports.default = ComponentHelper;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29tcG9uZW50SGVscGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL0NvbXBvbmVudEhlbHBlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLHVFQUErQztBQUMvQyxpRUFBeUM7QUFFekMseUVBQWlEO0FBQ2pELHVFQUErQztBQUMvQyxnREFBZ0U7QUFNaEUsTUFBcUIsZUFBZTtJQUNuQyxNQUFNLEdBQVcsQ0FBQyxDQUFDO0lBQ1gsSUFBSSxHQUFxQixFQUFFLENBQUM7SUFDNUIsWUFBWSxHQUFHLENBQUMsQ0FBQztJQUN6QixZQUFZLE1BQWU7UUFDMUIsSUFBSSxNQUFNO1lBQUUsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7SUFDbEMsQ0FBQztJQUVELFNBQVMsQ0FBQyxNQUFjO1FBQ3ZCLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBQ3JCLE9BQU8sSUFBSSxDQUFDO0lBQ2IsQ0FBQztJQUVPLGFBQWE7UUFDcEIsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsSUFBSSxtQkFBUyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzNGLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILE1BQU0sQ0FBQyxhQUFxQyxFQUFFO1FBQzdDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUNwQixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLG1CQUFTLEVBQUUsQ0FBQyxhQUFhLENBQUMsR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDO1FBQzdELE9BQU8sSUFBSSxDQUFDO0lBQ2IsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsWUFBWSxDQUFDLFNBQTBCO1FBQ3RDLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUNqQyxJQUFJLFNB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