diff --git a/packages/builders/src/components/selectMenu/UnsafeSelectMenuOption.ts b/packages/builders/src/components/selectMenu/UnsafeSelectMenuOption.ts index fea1076ec..6115fd377 100644 --- a/packages/builders/src/components/selectMenu/UnsafeSelectMenuOption.ts +++ b/packages/builders/src/components/selectMenu/UnsafeSelectMenuOption.ts @@ -43,8 +43,8 @@ export class UnsafeSelectMenuOptionBuilder { } /** - * Sets the emoji to display on this button - * @param emoji The emoji to display on this button + * Sets the emoji to display on this option + * @param emoji The emoji to display on this option */ public setEmoji(emoji: APIMessageComponentEmoji) { this.data.emoji = emoji; diff --git a/packages/discord.js/src/index.js b/packages/discord.js/src/index.js index ec5bbb42d..403cca54e 100644 --- a/packages/discord.js/src/index.js +++ b/packages/discord.js/src/index.js @@ -142,6 +142,7 @@ exports.Role = require('./structures/Role').Role; exports.SelectMenuBuilder = require('./structures/SelectMenuBuilder'); exports.SelectMenuComponent = require('./structures/SelectMenuComponent'); exports.SelectMenuInteraction = require('./structures/SelectMenuInteraction'); +exports.SelectMenuOptionBuilder = require('./structures/SelectMenuOptionBuilder'); exports.StageChannel = require('./structures/StageChannel'); exports.StageInstance = require('./structures/StageInstance').StageInstance; exports.Sticker = require('./structures/Sticker').Sticker; @@ -208,7 +209,6 @@ exports.UserFlags = require('discord-api-types/v10').UserFlags; exports.WebhookType = require('discord-api-types/v10').WebhookType; exports.UnsafeButtonBuilder = require('@discordjs/builders').UnsafeButtonBuilder; exports.UnsafeSelectMenuBuilder = require('@discordjs/builders').UnsafeSelectMenuBuilder; -exports.SelectMenuOptionBuilder = require('@discordjs/builders').SelectMenuOptionBuilder; exports.UnsafeSelectMenuOptionBuilder = require('@discordjs/builders').UnsafeSelectMenuOptionBuilder; exports.DiscordAPIError = require('@discordjs/rest').DiscordAPIError; exports.HTTPError = require('@discordjs/rest').HTTPError; diff --git a/packages/discord.js/src/structures/ButtonBuilder.js b/packages/discord.js/src/structures/ButtonBuilder.js index 403b1ff1c..986195b0f 100644 --- a/packages/discord.js/src/structures/ButtonBuilder.js +++ b/packages/discord.js/src/structures/ButtonBuilder.js @@ -2,12 +2,25 @@ const { ButtonBuilder: BuildersButtonComponent, isJSONEncodable } = require('@discordjs/builders'); const Transformers = require('../util/Transformers'); +const Util = require('../util/Util'); class ButtonBuilder extends BuildersButtonComponent { constructor(data) { super(Transformers.toSnakeCase(data)); } + /** + * Sets the emoji to display on this button + * @param {string|APIMessageComponentEmoji} emoji The emoji to display on this button + * @returns {ButtonComponent} + */ + setEmoji(emoji) { + if (typeof emoji === 'string') { + return super.setEmoji(Util.parseEmoji(emoji)); + } + return super.setEmoji(emoji); + } + /** * Creates a new button builder from json data * @param {JSONEncodable | APIButtonComponent} other The other data diff --git a/packages/discord.js/src/structures/SelectMenuOptionBuilder.js b/packages/discord.js/src/structures/SelectMenuOptionBuilder.js new file mode 100644 index 000000000..c716bb4a6 --- /dev/null +++ b/packages/discord.js/src/structures/SelectMenuOptionBuilder.js @@ -0,0 +1,23 @@ +'use strict'; + +const { SelectMenuOptionBuilder: BuildersSelectMenuOption } = require('@discordjs/builders'); +const Util = require('../util/Util'); + +/** + * Represents a select menu option + */ +class SelectMenuOptionBuilder extends BuildersSelectMenuOption { + /** + * Sets the emoji to display on this option + * @param {ComponentEmojiResolvable} emoji The emoji to display on this option + * @returns {SelectMenuOptionBuilder} + */ + setEmoji(emoji) { + if (typeof emoji === 'string') { + return super.setEmoji(Util.parseEmoji(emoji)); + } + return super.setEmoji(emoji); + } +} + +module.exports = SelectMenuOptionBuilder; diff --git a/packages/discord.js/src/util/Components.js b/packages/discord.js/src/util/Components.js index 2f7eae695..80d486102 100644 --- a/packages/discord.js/src/util/Components.js +++ b/packages/discord.js/src/util/Components.js @@ -57,6 +57,11 @@ const { ComponentType } = require('discord-api-types/v10'); * @typedef {ActionRowData|ButtonComponentData|SelectMenuComponentData|TextInputComponentData} ComponentData */ +/** + * Any emoji data that can be used within a button + * @typedef {APIMessageComponentEmoji|string} ComponentEmojiResolvable + */ + class Components extends null { /** * Transforms API data into a component diff --git a/packages/discord.js/typings/index.d.ts b/packages/discord.js/typings/index.d.ts index facb22803..61e07c7c3 100644 --- a/packages/discord.js/typings/index.d.ts +++ b/packages/discord.js/typings/index.d.ts @@ -19,6 +19,7 @@ import { roleMention, SelectMenuBuilder as BuilderSelectMenuComponent, TextInputBuilder as BuilderTextInputComponent, + UnsafeSelectMenuOptionBuilder as BuildersSelectMenuOption, spoiler, strikethrough, time, @@ -539,9 +540,12 @@ export class ButtonComponent extends Component { public get url(): string | null; } +export type ComponentEmojiResolvable = APIMessageComponentEmoji | string; + export class ButtonBuilder extends BuilderButtonComponent { public constructor(data?: ButtonComponentData | (Omit & { type?: ComponentType.Button })); public static from(other: JSONEncodable | APIButtonComponent): ButtonBuilder; + public override setEmoji(emoji: ComponentEmojiResolvable): this; } export class SelectMenuBuilder extends BuilderSelectMenuComponent { @@ -551,6 +555,10 @@ export class SelectMenuBuilder extends BuilderSelectMenuComponent { public static from(other: JSONEncodable | APISelectMenuComponent): SelectMenuBuilder; } +export class SelectMenuOptionBuilder extends BuildersSelectMenuOption { + public setEmoji(emoji: ComponentEmojiResolvable): this; +} + export class TextInputBuilder extends BuilderTextInputComponent { public constructor(data?: TextInputComponentData | APITextInputComponent); public static from(other: JSONEncodable | APITextInputComponent): TextInputBuilder; @@ -5304,6 +5312,7 @@ export { ApplicationCommandPermissionType, APIEmbedField, APISelectMenuOption, + APIMessageComponentEmoji, AuditLogEvent, ButtonStyle, ChannelType, @@ -5341,7 +5350,6 @@ export { export { UnsafeButtonBuilder, UnsafeSelectMenuBuilder, - SelectMenuOptionBuilder, UnsafeSelectMenuOptionBuilder, MessageActionRowComponentBuilder, ModalActionRowComponentBuilder, diff --git a/packages/discord.js/typings/index.test-d.ts b/packages/discord.js/typings/index.test-d.ts index 1d094ea03..6a667134d 100644 --- a/packages/discord.js/typings/index.test-d.ts +++ b/packages/discord.js/typings/index.test-d.ts @@ -1367,7 +1367,16 @@ new SelectMenuBuilder({ new ButtonBuilder({ style: ButtonStyle.Danger, -}); +}) + .setEmoji('') + .setEmoji('<:foo:123>') + .setEmoji('foobar:123') + .setEmoji('😏') + .setEmoji({ + name: 'test', + id: '123', + animated: false, + }); // @ts-expect-error new EmbedBuilder().setColor('abc');