-
-
Notifications
You must be signed in to change notification settings - Fork 4k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
feat(MessageSelectMenu): droppybois (#5692)
Co-authored-by: Antonio Román <kyradiscord@gmail.com>
- Loading branch information
Showing
11 changed files
with
336 additions
and
14 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,202 @@ | ||
'use strict'; | ||
|
||
const BaseMessageComponent = require('./BaseMessageComponent'); | ||
const { MessageComponentTypes } = require('../util/Constants'); | ||
const Util = require('../util/Util'); | ||
|
||
/** | ||
* Represents a select menu message component | ||
* @extends {BaseMessageComponent} | ||
*/ | ||
class MessageSelectMenu extends BaseMessageComponent { | ||
/** | ||
* @typedef {BaseMessageComponentOptions} MessageSelectMenuOptions | ||
* @property {string} [customID] A unique string to be sent in the interaction when clicked | ||
* @property {string} [placeholder] Custom placeholder text to display when nothing is selected | ||
* @property {number} [minValues] The minimum number of selections required | ||
* @property {number} [maxValues] The maximum number of selections allowed | ||
* @property {MessageSelectOption[]} [options] Options for the select menu | ||
* @property {boolean} [disabled=false] Disables the select menu to prevent interactions | ||
*/ | ||
|
||
/** | ||
* @typedef {Object} MessageSelectOption | ||
* @property {string} label The text to be displayed on this option | ||
* @property {string} value The value to be sent for this option | ||
* @property {?string} description Optional description to show for this option | ||
* @property {?RawEmoji} emoji Emoji to display for this option | ||
* @property {boolean} default Render this option as the default selection | ||
*/ | ||
|
||
/** | ||
* @typedef {Object} MessageSelectOptionData | ||
* @property {string} label The text to be displayed on this option | ||
* @property {string} value The value to be sent for this option | ||
* @property {string} [description] Optional description to show for this option | ||
* @property {EmojiIdentifierResolvable} [emoji] Emoji to display for this option | ||
* @property {boolean} [default] Render this option as the default selection | ||
*/ | ||
|
||
/** | ||
* @param {MessageSelectMenu|MessageSelectMenuOptions} [data={}] MessageSelectMenu to clone or raw data | ||
*/ | ||
constructor(data = {}) { | ||
super({ type: 'SELECT_MENU' }); | ||
|
||
this.setup(data); | ||
} | ||
|
||
setup(data) { | ||
/** | ||
* A unique string to be sent in the interaction when clicked | ||
* @type {?string} | ||
*/ | ||
this.customID = data.custom_id ?? data.customID ?? null; | ||
|
||
/** | ||
* Custom placeholder text to display when nothing is selected | ||
* @type {?string} | ||
*/ | ||
this.placeholder = data.placeholder ?? null; | ||
|
||
/** | ||
* The minimum number of selections required | ||
* @type {?number} | ||
*/ | ||
this.minValues = data.min_values ?? data.minValues ?? null; | ||
|
||
/** | ||
* The maximum number of selections allowed | ||
* @type {?number} | ||
*/ | ||
this.maxValues = data.max_values ?? data.maxValues ?? null; | ||
|
||
/** | ||
* Options for the select menu | ||
* @type {MessageSelectOption[]} | ||
*/ | ||
this.options = this.constructor.normalizeOptions(data.options ?? []); | ||
|
||
/** | ||
* Whether this select menu is currently disabled | ||
* @type {?boolean} | ||
*/ | ||
this.disabled = data.disabled ?? false; | ||
} | ||
|
||
/** | ||
* Sets the custom ID of this select menu | ||
* @param {string} customID A unique string to be sent in the interaction when clicked | ||
* @returns {MessageSelectMenu} | ||
*/ | ||
setCustomID(customID) { | ||
this.customID = Util.verifyString(customID, RangeError, 'SELECT_MENU_CUSTOM_ID'); | ||
return this; | ||
} | ||
|
||
/** | ||
* Sets the interactive status of the select menu | ||
* @param {boolean} disabled Whether this select menu should be disabled | ||
* @returns {MessageSelectMenu} | ||
*/ | ||
setDisabled(disabled) { | ||
this.disabled = disabled; | ||
return this; | ||
} | ||
|
||
/** | ||
* Sets the maximum number of selections allowed for this select menu | ||
* @param {number} maxValues Number of selections to be allowed | ||
* @returns {MessageSelectMenu} | ||
*/ | ||
setMaxValues(maxValues) { | ||
this.maxValues = maxValues; | ||
return this; | ||
} | ||
|
||
/** | ||
* Sets the minimum number of selections required for this select menu | ||
* <info>This will default the maxValues to the number of options, unless manually set</info> | ||
* @param {number} minValues Number of selections to be required | ||
* @returns {MessageSelectMenu} | ||
*/ | ||
setMinValues(minValues) { | ||
this.minValues = minValues; | ||
return this; | ||
} | ||
|
||
/** | ||
* Sets the placeholder of this select menu | ||
* @param {string} placeholder Custom placeholder text to display when nothing is selected | ||
* @returns {MessageSelectMenu} | ||
*/ | ||
setPlaceholder(placeholder) { | ||
this.placeholder = Util.verifyString(placeholder, RangeError, 'SELECT_MENU_PLACEHOLDER'); | ||
return this; | ||
} | ||
|
||
/** | ||
* Adds options to the select menu. | ||
* @param {...(MessageSelectOption[]|MessageSelectOption[])} options The options to add | ||
* @returns {MessageSelectMenu} | ||
*/ | ||
addOptions(...options) { | ||
this.options.push(...this.constructor.normalizeOptions(options)); | ||
return this; | ||
} | ||
|
||
/** | ||
* Removes, replaces, and inserts options in the select menu. | ||
* @param {number} index The index to start at | ||
* @param {number} deleteCount The number of options to remove | ||
* @param {...MessageSelectOption|MessageSelectOption[]} [options] The replacing option objects | ||
* @returns {MessageSelectMenu} | ||
*/ | ||
spliceOptions(index, deleteCount, ...options) { | ||
this.options.splice(index, deleteCount, ...this.constructor.normalizeOptions(...options)); | ||
return this; | ||
} | ||
|
||
/** | ||
* Transforms this select menu to a plain object | ||
* @returns {Object} The raw data of this select menu | ||
*/ | ||
toJSON() { | ||
return { | ||
custom_id: this.customID, | ||
disabled: this.disabled, | ||
placeholder: this.placeholder, | ||
min_values: this.minValues, | ||
max_values: this.maxValues ?? (this.minValues ? this.options.length : undefined), | ||
options: this.options, | ||
type: typeof this.type === 'string' ? MessageComponentTypes[this.type] : this.type, | ||
}; | ||
} | ||
|
||
/** | ||
* Normalizes option input and resolves strings and emojis. | ||
* @param {MessageSelectOptionData} option The select menu option to normalize | ||
* @returns {MessageSelectOption} | ||
*/ | ||
static normalizeOption(option) { | ||
let { label, value, description, emoji } = option; | ||
|
||
label = Util.verifyString(label, RangeError, 'SELECT_OPTION_LABEL'); | ||
value = Util.verifyString(value, RangeError, 'SELECT_OPTION_VALUE'); | ||
emoji = emoji ? Util.resolvePartialEmoji(emoji) : null; | ||
description = description ? Util.verifyString(description, RangeError, 'SELECT_OPTION_DESCRIPTION', true) : null; | ||
|
||
return { label, value, description, emoji, default: option.default ?? false }; | ||
} | ||
|
||
/** | ||
* Normalizes option input and resolves strings and emojis. | ||
* @param {...MessageSelectOptionData|MessageSelectOption[]} options The select menu options to normalize | ||
* @returns {MessageSelectOption[]} | ||
*/ | ||
static normalizeOptions(...options) { | ||
return options.flat(Infinity).map(option => this.normalizeOption(option)); | ||
} | ||
} | ||
|
||
module.exports = MessageSelectMenu; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,21 @@ | ||
'use strict'; | ||
|
||
const MessageComponentInteraction = require('./MessageComponentInteraction'); | ||
|
||
/** | ||
* Represents a select menu interaction. | ||
* @extends {MessageComponentInteraction} | ||
*/ | ||
class SelectMenuInteraction extends MessageComponentInteraction { | ||
constructor(client, data) { | ||
super(client, data); | ||
|
||
/** | ||
* The values selected, if the component which was interacted with was a select menu | ||
* @type {string[]} | ||
*/ | ||
this.values = this.componentType === 'SELECT_MENU' ? data.data.values : null; | ||
} | ||
} | ||
|
||
module.exports = SelectMenuInteraction; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.