Merge pull request #391 from aiko-chan-ai/new-select-menu

feat(SelectMenu): SelectMenu v2
This commit is contained in:
Cinnamon 2022-11-05 20:05:45 +07:00 committed by GitHub
commit 5810144d71
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
10 changed files with 176 additions and 73 deletions

View File

@ -47,7 +47,11 @@ class InteractionCreateAction extends Action {
case MessageComponentTypes.BUTTON: case MessageComponentTypes.BUTTON:
InteractionType = ButtonInteraction; InteractionType = ButtonInteraction;
break; break;
case MessageComponentTypes.SELECT_MENU: case MessageComponentTypes.STRING_SELECT_MENU:
case MessageComponentTypes.USER_SELECT_MENU:
case MessageComponentTypes.ROLE_SELECT_MENU:
case MessageComponentTypes.MENTIONABLE_SELECT_MENU:
case MessageComponentTypes.CHANNEL_SELECT_MENU:
InteractionType = SelectMenuInteraction; InteractionType = SelectMenuInteraction;
break; break;
default: default:

View File

@ -5,7 +5,13 @@ const { findBestMatch } = require('string-similarity');
const Base = require('./Base'); const Base = require('./Base');
const ApplicationCommandPermissionsManager = require('../managers/ApplicationCommandPermissionsManager'); const ApplicationCommandPermissionsManager = require('../managers/ApplicationCommandPermissionsManager');
const MessageAttachment = require('../structures/MessageAttachment'); const MessageAttachment = require('../structures/MessageAttachment');
const { ApplicationCommandOptionTypes, ApplicationCommandTypes, ChannelTypes, Events } = require('../util/Constants'); const {
ApplicationCommandOptionTypes,
ApplicationCommandTypes,
ChannelTypes,
Events,
InteractionTypes,
} = require('../util/Constants');
const DataResolver = require('../util/DataResolver'); const DataResolver = require('../util/DataResolver');
const Permissions = require('../util/Permissions'); const Permissions = require('../util/Permissions');
const SnowflakeUtil = require('../util/SnowflakeUtil'); const SnowflakeUtil = require('../util/SnowflakeUtil');
@ -797,14 +803,12 @@ class ApplicationCommand extends Base {
dataAdd = [dataAdd]; dataAdd = [dataAdd];
} }
const data = { const data = {
type: autocomplete ? 4 : 2, // Slash command, context menu type: autocomplete ? InteractionTypes.APPLICATION_COMMAND_AUTOCOMPLETE : InteractionTypes.APPLICATION_COMMAND,
// Type: 4: Auto-complete
application_id: this.applicationId, application_id: this.applicationId,
guild_id: message.guildId, guild_id: message.guildId,
channel_id: message.channelId, channel_id: message.channelId,
session_id: this.client.session_id, session_id: this.client.session_id,
data: { data: {
// ApplicationCommandData
version: this.version, version: this.version,
id: this.id, id: this.id,
name: this.name, name: this.name,
@ -932,13 +936,12 @@ class ApplicationCommand extends Base {
if (this.type == 'CHAT_INPUT') return false; if (this.type == 'CHAT_INPUT') return false;
const nonce = SnowflakeUtil.generate(); const nonce = SnowflakeUtil.generate();
const data = { const data = {
type: 2, // Slash command, context menu type: InteractionTypes.APPLICATION_COMMAND,
application_id: this.applicationId, application_id: this.applicationId,
guild_id: message.guildId, guild_id: message.guildId,
channel_id: message.channelId, channel_id: message.channelId,
session_id: this.client.session_id, session_id: this.client.session_id,
data: { data: {
// ApplicationCommandData
version: this.version, version: this.version,
id: this.id, id: this.id,
name: this.name, name: this.name,

View File

@ -76,7 +76,11 @@ class BaseMessageComponent {
component = data instanceof MessageButton ? data : new MessageButton(data); component = data instanceof MessageButton ? data : new MessageButton(data);
break; break;
} }
case MessageComponentTypes.SELECT_MENU: { case MessageComponentTypes.STRING_SELECT_MENU:
case MessageComponentTypes.USER_SELECT_MENU:
case MessageComponentTypes.ROLE_SELECT_MENU:
case MessageComponentTypes.MENTIONABLE_SELECT_MENU:
case MessageComponentTypes.CHANNEL_SELECT_MENU: {
const MessageSelectMenu = require('./MessageSelectMenu'); const MessageSelectMenu = require('./MessageSelectMenu');
component = data instanceof MessageSelectMenu ? data : new MessageSelectMenu(data); component = data instanceof MessageSelectMenu ? data : new MessageSelectMenu(data);
break; break;

View File

@ -1068,33 +1068,34 @@ class Message extends Base {
* @param {Array<string>} options Menu Options * @param {Array<string>} options Menu Options
* @returns {Promise<InteractionResponse>} * @returns {Promise<InteractionResponse>}
*/ */
async selectMenu(menuID, options = []) { selectMenu(menuID, options = []) {
if (!this.components[0]) throw new TypeError('MESSAGE_NO_COMPONENTS'); if (!this.components[0]) throw new TypeError('MESSAGE_NO_COMPONENTS');
let menuFirst; const menuAll = [];
let menuCorrect; for (const row of this.components) {
let menuCount = 0; for (const component of row.components) {
await Promise.all( if (
this.components.map(row => { [
const firstElement = row.components[0]; // Because 1 row has only 1 menu; 'STRING_SELECT_MENU',
if (firstElement.type == 'SELECT_MENU') { 'USER_SELECT_MENU',
menuCount++; 'ROLE_SELECT_MENU',
if (firstElement.customId == menuID) { 'MENTIONABLE_SELECT_MENU',
menuCorrect = firstElement; 'CHANNEL_SELECT_MENU',
} else if (!menuFirst) { ].includes(component.type)
menuFirst = firstElement; ) {
menuAll.push(component);
} }
} }
return true;
}),
);
if (menuCount == 0) throw new TypeError('MENU_NOT_FOUND');
if (!menuCorrect) {
if (menuCount == 1) menuCorrect = menuFirst;
else if (typeof menuID !== 'string') throw new TypeError('MENU_ID_NOT_STRING');
else throw new TypeError('MENU_ID_NOT_FOUND');
} }
if (menuAll.length == 0) throw new TypeError('MENU_NOT_FOUND');
if (menuAll.length == 1) {
return menuAll[0].select(this, Array.isArray(menuID) ? menuID : options);
} else {
if (typeof menuID !== 'string') throw new TypeError('MENU_ID_NOT_STRING');
const menuCorrect = menuAll.find(menu => menu.customId == menuID);
if (!menuCorrect) throw new TypeError('MENU_NOT_FOUND');
return menuCorrect.select(this, Array.isArray(menuID) ? menuID : options); return menuCorrect.select(this, Array.isArray(menuID) ? menuID : options);
} }
}
// //
/** /**
* Send context Menu v2 * Send context Menu v2

View File

@ -3,7 +3,7 @@
const { setTimeout } = require('node:timers'); const { setTimeout } = require('node:timers');
const BaseMessageComponent = require('./BaseMessageComponent'); const BaseMessageComponent = require('./BaseMessageComponent');
const { RangeError } = require('../errors'); const { RangeError } = require('../errors');
const { MessageButtonStyles, MessageComponentTypes } = require('../util/Constants'); const { MessageButtonStyles, MessageComponentTypes, InteractionTypes } = require('../util/Constants');
const SnowflakeUtil = require('../util/SnowflakeUtil'); const SnowflakeUtil = require('../util/SnowflakeUtil');
const Util = require('../util/Util'); const Util = require('../util/Util');
const { lazy } = require('../util/Util'); const { lazy } = require('../util/Util');
@ -175,16 +175,16 @@ class MessageButton extends BaseMessageComponent {
if (!(message instanceof Message())) throw new Error('[UNKNOWN_MESSAGE] Please pass a valid Message'); if (!(message instanceof Message())) throw new Error('[UNKNOWN_MESSAGE] Please pass a valid Message');
if (!this.customId || this.style == 5 || this.disabled) return false; // Button URL, Disabled if (!this.customId || this.style == 5 || this.disabled) return false; // Button URL, Disabled
const data = { const data = {
type: 3, // ? type: InteractionTypes.MESSAGE_COMPONENT,
nonce, nonce,
guild_id: message.guild?.id ?? null, // In DMs guild_id: message.guild?.id ?? null,
channel_id: message.channel.id, channel_id: message.channel.id,
message_id: message.id, message_id: message.id,
application_id: message.applicationId ?? message.author.id, application_id: message.applicationId ?? message.author.id,
session_id: message.client.session_id, session_id: message.client.session_id,
message_flags: message.flags.bitfield, message_flags: message.flags.bitfield,
data: { data: {
component_type: 2, // Button component_type: MessageComponentTypes.BUTTON,
custom_id: this.customId, custom_id: this.customId,
}, },
}; };

View File

@ -3,7 +3,7 @@
const { setTimeout } = require('node:timers'); const { setTimeout } = require('node:timers');
const BaseMessageComponent = require('./BaseMessageComponent'); const BaseMessageComponent = require('./BaseMessageComponent');
const { Message } = require('./Message'); const { Message } = require('./Message');
const { MessageComponentTypes } = require('../util/Constants'); const { MessageComponentTypes, InteractionTypes } = require('../util/Constants');
const SnowflakeUtil = require('../util/SnowflakeUtil'); const SnowflakeUtil = require('../util/SnowflakeUtil');
const Util = require('../util/Util'); const Util = require('../util/Util');
@ -44,7 +44,7 @@ class MessageSelectMenu extends BaseMessageComponent {
* @param {MessageSelectMenu|MessageSelectMenuOptions} [data={}] MessageSelectMenu to clone or raw data * @param {MessageSelectMenu|MessageSelectMenuOptions} [data={}] MessageSelectMenu to clone or raw data
*/ */
constructor(data = {}) { constructor(data = {}) {
super({ type: 'SELECT_MENU' }); super({ type: data?.type ? MessageComponentTypes[data.type] : 'STRING_SELECT_MENU' });
this.setup(data); this.setup(data);
} }
@ -87,6 +87,28 @@ class MessageSelectMenu extends BaseMessageComponent {
this.disabled = data.disabled ?? false; this.disabled = data.disabled ?? false;
} }
/**
* @typedef {string} SelectMenuTypes
* Must be one of:
* * `STRING_SELECT_MENU`
* * `USER_SELECT_MENU`
* * `ROLE_SELECT_MENU`
* * `MENTIONABLE_SELECT_MENU`
* * `CHANNEL_SELECT_MENU`
*/
/**
* Set type of select menu
* @param {SelectMenuTypes} type Type of select menu
* @returns {MessageSelectMenu}
*/
setType(type) {
if (!type) type = MessageComponentTypes.STRING_SELECT_MENU;
this.type = MessageSelectMenu.resolveType(type);
return this;
}
/** /**
* Sets the custom id of this select menu * Sets the custom id of this select menu
* @param {string} customId A unique string to be sent in the interaction when clicked * @param {string} customId A unique string to be sent in the interaction when clicked
@ -202,6 +224,10 @@ class MessageSelectMenu extends BaseMessageComponent {
return { label, value, description, emoji, default: option.default ?? false }; return { label, value, description, emoji, default: option.default ?? false };
} }
static resolveType(type) {
return typeof type === 'string' ? type : MessageComponentTypes[type];
}
/** /**
* Normalizes option input and resolves strings and emojis. * Normalizes option input and resolves strings and emojis.
* @param {...MessageSelectOptionData|MessageSelectOptionData[]} options The select menu options to normalize * @param {...MessageSelectOptionData|MessageSelectOptionData[]} options The select menu options to normalize
@ -218,11 +244,9 @@ class MessageSelectMenu extends BaseMessageComponent {
* @returns {Promise<InteractionResponse>} * @returns {Promise<InteractionResponse>}
*/ */
async select(message, values = []) { async select(message, values = []) {
// Github copilot is the best :))
// POST data from https://github.com/phamleduy04
if (!(message instanceof Message)) throw new Error('[UNKNOWN_MESSAGE] Please pass a valid Message'); if (!(message instanceof Message)) throw new Error('[UNKNOWN_MESSAGE] Please pass a valid Message');
if (!Array.isArray(values)) throw new TypeError('[INVALID_VALUES] Please pass an array of values'); if (!Array.isArray(values)) throw new TypeError('[INVALID_VALUES] Please pass an array of values');
if (!this.customId || this.disabled || values.length == 0) return false; // Disabled or null customID or [] array if (!this.customId || this.disabled) return false; // Disabled or null customID
// Check value is invalid [Max options is 20] => For loop // Check value is invalid [Max options is 20] => For loop
if (values.length < this.minValues) { if (values.length < this.minValues) {
throw new RangeError(`[SELECT_MENU_MIN_VALUES] The minimum number of values is ${this.minValues}`); throw new RangeError(`[SELECT_MENU_MIN_VALUES] The minimum number of values is ${this.minValues}`);
@ -230,30 +254,68 @@ class MessageSelectMenu extends BaseMessageComponent {
if (values.length > this.maxValues) { if (values.length > this.maxValues) {
throw new RangeError(`[SELECT_MENU_MAX_VALUES] The maximum number of values is ${this.maxValues}`); throw new RangeError(`[SELECT_MENU_MAX_VALUES] The maximum number of values is ${this.maxValues}`);
} }
const validValue = this.options.map(obj => obj.value); const enableCheck = {};
const check_ = await values.find(element => { this.options.forEach(obj => {
if (typeof element !== 'string') return true; enableCheck[obj.value] = obj.default;
if (!validValue.includes(element)) return true;
return false;
}); });
if (check_) { const parseValues = value => {
throw new RangeError( switch (this.type) {
`[SELECT_MENU_INVALID_VALUE] The value ${check_} is invalid. Please use a valid value ${validValue.join(', ')}`, case 'STRING_SELECT_MENU': {
); if (typeof value !== 'string') throw new TypeError('[INVALID_VALUE] Please pass a string value');
const value_ = this.options.find(obj => obj.value === value || obj.label === value);
if (!value_) throw new Error('[INVALID_VALUE] Please pass a valid value');
return value_.value;
} }
case 'USER_SELECT_MENU': {
const userId = this.client.users.resolveId(value);
if (!userId) throw new Error('[INVALID_VALUE] Please pass a valid user');
return userId;
}
case 'ROLE_SELECT_MENU': {
const roleId = this.client.roles.resolveId(value);
if (!roleId) throw new Error('[INVALID_VALUE] Please pass a valid role');
return roleId;
}
case 'MENTIONABLE_SELECT_MENU': {
const mentionableId = this.client.users.resolveId(value) || this.client.roles.resolveId(value);
if (!mentionableId) throw new Error('[INVALID_VALUE] Please pass a valid mentionable');
return mentionableId;
}
case 'CHANNEL_SELECT_MENU': {
const channelId = this.client.channels.resolveId(value);
if (!channelId) throw new Error('[INVALID_VALUE] Please pass a valid channel');
return channelId;
}
default: {
throw new Error(`[INVALID_TYPE] Please pass a valid select menu type (Got ${this.type})`);
}
}
};
for (const value of values) {
const value_ = parseValues(value);
if (value_ in enableCheck) {
enableCheck[value_] = !enableCheck[value_];
} else {
enableCheck[value_] = true;
}
}
values = values?.length ? Object.keys(enableCheck).filter(key => enableCheck[key]) : [];
const nonce = SnowflakeUtil.generate(); const nonce = SnowflakeUtil.generate();
const data = { const data = {
type: 3, // ? type: InteractionTypes.MESSAGE_COMPONENT,
guild_id: message.guild?.id ?? null, // In DMs guild_id: message.guild?.id ?? null,
channel_id: message.channel.id, channel_id: message.channel.id,
message_id: message.id, message_id: message.id,
application_id: message.applicationId ?? message.author.id, application_id: message.applicationId ?? message.author.id,
session_id: message.client.session_id, session_id: message.client.session_id,
message_flags: message.flags.bitfield, message_flags: message.flags.bitfield,
data: { data: {
component_type: 3, // Select Menu component_type: MessageComponentTypes[this.type],
custom_id: this.customId, custom_id: this.customId,
type: 3, // Select Menu type: MessageComponentTypes[this.type],
values, values,
}, },
nonce, nonce,

View File

@ -6,28 +6,28 @@ const Package = (exports.Package = require('../../package.json'));
const { Error, RangeError, TypeError } = require('../errors'); const { Error, RangeError, TypeError } = require('../errors');
// #88: https://jnrbsn.github.io/user-agents/user-agents.json // #88: https://jnrbsn.github.io/user-agents/user-agents.json
const listUserAgent = [ const listUserAgent = [
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36',
'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36', 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36',
'Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36', 'Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36',
'Mozilla/5.0 (Macintosh; Intel Mac OS X 12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 13_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36',
'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36', 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36',
'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:106.0) Gecko/20100101 Firefox/106.0', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:106.0) Gecko/20100101 Firefox/106.0',
'Mozilla/5.0 (Macintosh; Intel Mac OS X 12.6; rv:106.0) Gecko/20100101 Firefox/106.0', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 13.0; rv:106.0) Gecko/20100101 Firefox/106.0',
'Mozilla/5.0 (X11; Linux i686; rv:106.0) Gecko/20100101 Firefox/106.0', 'Mozilla/5.0 (X11; Linux i686; rv:106.0) Gecko/20100101 Firefox/106.0',
'Mozilla/5.0 (X11; Linux x86_64; rv:106.0) Gecko/20100101 Firefox/106.0', 'Mozilla/5.0 (X11; Linux x86_64; rv:106.0) Gecko/20100101 Firefox/106.0',
'Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:106.0) Gecko/20100101 Firefox/106.0', 'Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:106.0) Gecko/20100101 Firefox/106.0',
'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:106.0) Gecko/20100101 Firefox/106.0', 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:106.0) Gecko/20100101 Firefox/106.0',
'Mozilla/5.0 (X11; Fedora; Linux x86_64; rv:106.0) Gecko/20100101 Firefox/106.0', 'Mozilla/5.0 (X11; Fedora; Linux x86_64; rv:106.0) Gecko/20100101 Firefox/106.0',
'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:102.0) Gecko/20100101 Firefox/102.0', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:102.0) Gecko/20100101 Firefox/102.0',
'Mozilla/5.0 (Macintosh; Intel Mac OS X 12.6; rv:102.0) Gecko/20100101 Firefox/102.0', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 13.0; rv:102.0) Gecko/20100101 Firefox/102.0',
'Mozilla/5.0 (X11; Linux i686; rv:102.0) Gecko/20100101 Firefox/102.0', 'Mozilla/5.0 (X11; Linux i686; rv:102.0) Gecko/20100101 Firefox/102.0',
'Mozilla/5.0 (Linux x86_64; rv:102.0) Gecko/20100101 Firefox/102.0', 'Mozilla/5.0 (Linux x86_64; rv:102.0) Gecko/20100101 Firefox/102.0',
'Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:102.0) Gecko/20100101 Firefox/102.0', 'Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:102.0) Gecko/20100101 Firefox/102.0',
'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:102.0) Gecko/20100101 Firefox/102.0', 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:102.0) Gecko/20100101 Firefox/102.0',
'Mozilla/5.0 (X11; Fedora; Linux x86_64; rv:102.0) Gecko/20100101 Firefox/102.0', 'Mozilla/5.0 (X11; Fedora; Linux x86_64; rv:102.0) Gecko/20100101 Firefox/102.0',
'Mozilla/5.0 (Macintosh; Intel Mac OS X 12_6) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.6 Safari/605.1.15', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 13_0) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.1 Safari/605.1.15',
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.52', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36 Edg/107.0.1418.35',
'Mozilla/5.0 (Macintosh; Intel Mac OS X 12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.52', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 13_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36 Edg/107.0.1418.35',
]; ];
/** /**
@ -1513,12 +1513,26 @@ exports.InteractionResponseTypes = createEnum([
* The type of a message component * The type of a message component
* * ACTION_ROW * * ACTION_ROW
* * BUTTON * * BUTTON
* * SELECT_MENU * * STRING_SELECT_MENU
* * TEXT_INPUT * * TEXT_INPUT
* * USER_SELECT_MENU
* * ROLE_SELECT_MENU
* * MENTIONABLE_SELECT_MENU
* * CHANNEL_SELECT_MENU
* @typedef {string} MessageComponentType * @typedef {string} MessageComponentType
* @see {@link https://discord.com/developers/docs/interactions/message-components#component-object-component-types} * @see {@link https://discord.com/developers/docs/interactions/message-components#component-object-component-types}
*/ */
exports.MessageComponentTypes = createEnum([null, 'ACTION_ROW', 'BUTTON', 'SELECT_MENU', 'TEXT_INPUT']); exports.MessageComponentTypes = createEnum([
null,
'ACTION_ROW',
'BUTTON',
'STRING_SELECT_MENU',
'TEXT_INPUT',
'USER_SELECT_MENU',
'ROLE_SELECT_MENU',
'MENTIONABLE_SELECT_MENU',
'CHANNEL_SELECT_MENU',
]);
/** /**
* The style of a message button * The style of a message button

View File

@ -181,14 +181,14 @@ class Options extends null {
browser: 'Chrome', browser: 'Chrome',
device: '', device: '',
system_locale: 'en-US', system_locale: 'en-US',
browser_version: '105.0.0.0', browser_version: '107.0.0.0',
os_version: '10', os_version: '10',
referrer: '', referrer: '',
referring_domain: '', referring_domain: '',
referrer_current: '', referrer_current: '',
referring_domain_current: '', referring_domain_current: '',
release_channel: 'stable', release_channel: 'stable',
client_build_number: 154186, client_build_number: 156668,
client_event_source: null, client_event_source: null,
}, },
// ? capabilities: 1021, // ? capabilities: 1021,

6
typings/enums.d.ts vendored
View File

@ -218,8 +218,12 @@ export const enum MessageButtonStyles {
export const enum MessageComponentTypes { export const enum MessageComponentTypes {
ACTION_ROW = 1, ACTION_ROW = 1,
BUTTON = 2, BUTTON = 2,
SELECT_MENU = 3, STRING_SELECT_MENU = 3,
TEXT_INPUT = 4, TEXT_INPUT = 4,
USER_SELECT_MENU = 5,
ROLE_SELECT_MENU = 6,
MENTIONABLE_SELECT_MENU = 7,
CHANNEL_SELECT_MENU = 8,
} }
export const enum ModalComponentTypes { export const enum ModalComponentTypes {

21
typings/index.d.ts vendored
View File

@ -1863,8 +1863,12 @@ export type AwaitMessageCollectorOptionsParams<
export interface StringMappedInteractionTypes<Cached extends CacheType = CacheType> { export interface StringMappedInteractionTypes<Cached extends CacheType = CacheType> {
BUTTON: ButtonInteraction<Cached>; BUTTON: ButtonInteraction<Cached>;
SELECT_MENU: SelectMenuInteraction<Cached>; STRING_SELECT_MENU: SelectMenuInteraction<Cached>;
ACTION_ROW: MessageComponentInteraction<Cached>; ACTION_ROW: MessageComponentInteraction<Cached>;
USER_SELECT_MENU: SelectMenuInteraction<Cached>;
ROLE_SELECT_MENU: SelectMenuInteraction<Cached>;
MENTIONABLE_SELECT_MENU: SelectMenuInteraction<Cached>;
CHANNEL_SELECT_MENU: SelectMenuInteraction<Cached>;
} }
export type WrapBooleanCache<T extends boolean> = If<T, 'cached', CacheType>; export type WrapBooleanCache<T extends boolean> = If<T, 'cached', CacheType>;
@ -1873,9 +1877,13 @@ export type MappedInteractionTypes<Cached extends boolean = boolean> = EnumValue
typeof MessageComponentTypes, typeof MessageComponentTypes,
{ {
BUTTON: ButtonInteraction<WrapBooleanCache<Cached>>; BUTTON: ButtonInteraction<WrapBooleanCache<Cached>>;
SELECT_MENU: SelectMenuInteraction<WrapBooleanCache<Cached>>; STRING_SELECT_MENU: SelectMenuInteraction<WrapBooleanCache<Cached>>;
ACTION_ROW: MessageComponentInteraction<WrapBooleanCache<Cached>>; ACTION_ROW: MessageComponentInteraction<WrapBooleanCache<Cached>>;
TEXT_INPUT: ModalSubmitInteraction<WrapBooleanCache<Cached>>; TEXT_INPUT: ModalSubmitInteraction<WrapBooleanCache<Cached>>;
USER_SELECT_MENU: SelectMenuInteraction<WrapBooleanCache<Cached>>;
ROLE_SELECT_MENU: SelectMenuInteraction<WrapBooleanCache<Cached>>;
MENTIONABLE_SELECT_MENU: SelectMenuInteraction<WrapBooleanCache<Cached>>;
CHANNEL_SELECT_MENU: SelectMenuInteraction<WrapBooleanCache<Cached>>;
} }
>; >;
@ -2248,9 +2256,10 @@ export class MessageSelectMenu extends BaseMessageComponent {
public minValues: number | null; public minValues: number | null;
public options: MessageSelectOption[]; public options: MessageSelectOption[];
public placeholder: string | null; public placeholder: string | null;
public type: 'SELECT_MENU'; public type: SelectMenuTypes;
public addOptions(...options: MessageSelectOptionData[] | MessageSelectOptionData[][]): this; public addOptions(...options: MessageSelectOptionData[] | MessageSelectOptionData[][]): this;
public setOptions(...options: MessageSelectOptionData[] | MessageSelectOptionData[][]): this; public setOptions(...options: MessageSelectOptionData[] | MessageSelectOptionData[][]): this;
public setType(type: SelectMenuTypes): this;
public setCustomId(customId: string): this; public setCustomId(customId: string): this;
public setDisabled(disabled?: boolean): this; public setDisabled(disabled?: boolean): this;
public setMaxValues(maxValues: number): this; public setMaxValues(maxValues: number): this;
@ -2262,7 +2271,7 @@ export class MessageSelectMenu extends BaseMessageComponent {
...options: MessageSelectOptionData[] | MessageSelectOptionData[][] ...options: MessageSelectOptionData[] | MessageSelectOptionData[][]
): this; ): this;
public toJSON(): APISelectMenuComponent; public toJSON(): APISelectMenuComponent;
public select(message: Message, values: string[]): Promise<InteractionResponse>; public select(message: Message, values?: string[]): Promise<InteractionResponse>;
} }
// Todo // Todo
@ -2544,6 +2553,8 @@ export class Role extends Base {
public static comparePositions(role1: Role, role2: Role): number; public static comparePositions(role1: Role, role2: Role): number;
} }
export type SelectMenuTypes = 'STRING_SELECT_MENU' | 'USER_SELECT_MENU' | 'ROLE_SELECT_MENU' | 'MENTIONABLE_SELECT_MENU' | 'CHANNEL_SELECT_MENU';
export class SelectMenuInteraction<Cached extends CacheType = CacheType> extends MessageComponentInteraction<Cached> { export class SelectMenuInteraction<Cached extends CacheType = CacheType> extends MessageComponentInteraction<Cached> {
public constructor(client: Client, data: RawMessageSelectMenuInteractionData); public constructor(client: Client, data: RawMessageSelectMenuInteractionData);
public readonly component: CacheTypeReducer< public readonly component: CacheTypeReducer<
@ -2553,7 +2564,7 @@ export class SelectMenuInteraction<Cached extends CacheType = CacheType> extends
MessageSelectMenu | APISelectMenuComponent, MessageSelectMenu | APISelectMenuComponent,
MessageSelectMenu | APISelectMenuComponent MessageSelectMenu | APISelectMenuComponent
>; >;
public componentType: 'SELECT_MENU'; public componentType: SelectMenuTypes;
public values: string[]; public values: string[];
public inGuild(): this is SelectMenuInteraction<'raw' | 'cached'>; public inGuild(): this is SelectMenuInteraction<'raw' | 'cached'>;
public inCachedGuild(): this is SelectMenuInteraction<'cached'>; public inCachedGuild(): this is SelectMenuInteraction<'cached'>;