Ir para o conteúdo principal

Componentes de Mensagem

Componentes de mensagem — os quais chamaremos "componentes" daqui em diante — são um framework para adicionar elementos interativos às mensagens que o seu aplicativo ou bot envia. Eles são acessíveis, personalizáveis e fáceis de usar.

Existem vários tipos diferentes de componentes; esta documentação descreverá os fundamentos deste novo framework e cada exemplo.

Botão

Botões são componentes interativos que renderizam em mensagens. Eles podem ser clicados por usuários e enviar um interação para seu aplicativo quando clicados.

Button

app.components.ts
import { Injectable } from '@nestjs/common';
import { Context, Button, ButtonContext } from 'necord';

@Injectable()
export class AppComponents {
@Button('BUTTON')
public async onButton(@Context() [interaction]: ButtonContext): Promise<void> {
await interaction.reply({ content: 'Button clicked!' });
}
}

Botão Dinâmico

Você pode criar botões com o campo dinâmico 'id'. Isso é útil para passar metadados para botões.

Botões dinâmicos usam um formato path-to-regexp para realizar a correspondência de expressão regular. Transforme uma string de caminho como user/:name em uma expressão regular.

Para criar um botão dinâmico

import { ButtonBuilder, ButtonStyle } from 'discord.js';

new ButtonBuilder()
.setCustomId('click/12345')
.setLabel('LABEL')
.setStyle(ButtonStyle.Primary)

Para receber um botão dinâmico

import { Injectable } from '@nestjs/common';
import { Button, ButtonContext, ComponentParam, Context } from 'necord';

@Injectable()
export class AppComponents {
@Button('click/:value')
public async onButton(
@Context() [interaction]: ButtonContext,
@ComponentParam('value') value: string
): Promise<void> {
await interaction.reply({ content: `Button clicked! Value: ${value}` });
}
}

Menu de Seleção

Menus de Seleção são outro componente interativo que renderiza em mensagens. No desktop, clicar em um menu de seleção abre uma interface de usuário no estilo dropdown; no celular, tocar em um menu de seleção abre uma half-sheet com as opções.

Select Menu

O Discord introduziu novos componentes de menu de seleção:

  • String Select
  • User Select
  • Role Select
  • Mentionable Select
  • Channel Select

String Select

String Select é um Menu de Seleção para escolher as opções de texto definidas

Para criar a String Select:

import { StringSelectMenuBuilder } from 'discord.js';

new StringSelectMenuBuilder()
.setCustomId('STRING_SELECT_MENU') // replace with your customId
.setPlaceholder('Select your color')
.setMaxValues(1)
.setMinValues(1)
.setOptions([
{ label: 'Red', value: 'Red' },
{ label: 'Blue', value: 'Blue' },
{ label: 'Yellow', value: 'Yellow' }
])

Para receber uma seleção de string:

import { Injectable } from '@nestjs/common';
import { Context, StringSelect, StringSelectContext, SelectedStrings } from 'necord';

@Injectable()
export class AppComponents {
@StringSelect('STRING_SELECT_MENU')
public async onStringSelect(
@Context() [interaction]: StringSelectContext,
@SelectedStrings() selected: string[]
): Promise<void> {
await interaction.reply({
content: `Your selected color - ${selected.join(' ')}`
});
}
}

User Select

User Select são Menus de seleção para selecionar usuários

Para criar um User Select:

import { UserSelectMenuBuilder } from 'discord.js';

new UserSelectMenuBuilder()
.setCustomId('USER_SELECT_MENU')
.setPlaceholder('Select a user')
.setMaxValues(1)
.setMinValues(1)

Para receber um User Select:

import { Injectable } from '@nestjs/common';
import {
Context,
UserSelect,
UserSelectContext,
SelectedUsers,
ISelectedUsers,
SelectedMembers,
ISelectedMembers
} from 'necord';

@Injectable()
export class AppComponents {
@UserSelect('USER_SELECT_MENU')
public async onUserSelect(
@Context() [interaction]: UserSelectContext,
@SelectedUsers() users: ISelectedUsers, // Collection of users
@SelectedMembers() members: ISelectedMembers // Collection of members
): Promise<void> {
await interaction.reply({
content: `
Selected users - ${users.map(user => user.username).join(',')}\n
Selected members - ${members.map(member => member.user?.username).join(',')}
`
});
}
}

Role Select

Role Select são Menus de seleção para selecionar cargos

Para criar um Role Select:

import { RoleSelectMenuBuilder } from 'discord.js';

new RoleSelectMenuBuilder()
.setCustomId('ROLE_SELECT_MENU')
.setPlaceholder('Select a role')
.setMaxValues(1)
.setMinValues(1)

Para receber um Role Select:

import { Injectable } from '@nestjs/common';
import {
Context,
RoleSelect,
RoleSelectContext,
SelectedRoles,
ISelectedRoles,
} from 'necord';

@Injectable()
export class AppComponents {
@RoleSelect('ROLE_SELECT_MENU')
public async onRoleSelect(
@Context() [interaction]: RoleSelectContext,
@SelectedRoles() roles: ISelectedRoles, // Collection of roles
): Promise<void> {
await interaction.reply({
content: `
Selected roles - ${roles.map(role => role.id).join(',')}
`
});
}
}

Channel Select

Channel Select são Menus de seleção para selecionar canais

Para criar um Channel Select:

import { ChannelSelectMenuBuilder } from 'discord.js';

new ChannelSelectMenuBuilder()
.setCustomId('CHANNEL_SELECT_MENU')
.setPlaceholder('Select a channel')
.setMaxValues(1)
.setMinValues(1)

Para receber um Channel Select:

import { Injectable } from '@nestjs/common';
import {
Context,
ChannelSelect,
ChannelSelectContext,
SelectedChannels,
ISelectedChannels
} from 'necord';

@Injectable()
export class AppComponents {
@ChannelSelect('CHANNEL_SELECT_MENU')
public async onChannelSelect(
@Context() [interaction]: ChannelSelectContext,
@SelectedChannels() channels: ISelectedChannels, // Collection of channels
): Promise<void> {
await interaction.reply({
content: `
Selected channels - ${channels.map(channel => channel.id).join(',')}
`
});
}
}

Mentionable Select

Seleção mencionável é um Menu de seleção para selecionar menções (usuários e cargos)

Para criar um Mentionable Select:

import { MentionableSelectMenuBuilder } from 'discord.js';

new MentionableSelectMenuBuilder()
.setCustomId('MENTIONABLE_SELECT_MENU')
.setPlaceholder('Select a user/role')
.setMaxValues(1)
.setMinValues(1)

Para receber um Mentionable Select:

import { Injectable } from '@nestjs/common';
import {
Context,
MentionableSelect,
MentionableSelectContext,
SelectedUsers,
ISelectedUsers,
SelectedMembers,
ISelectedMembers,
SelectedRoles,
ISelectedRoles,
} from 'necord';

@Injectable()
export class AppComponents {
@MentionableSelect('MENTIONABLE_SELECT_MENU')
public async onMentionableSelect(
@Context() [interaction]: MentionableSelectContext,
@SelectedUsers() users: ISelectedUsers,
@SelectedMembers() members: ISelectedMembers,
@SelectedRoles() roles: ISelectedRoles
): Promise<void> {
await interaction.reply({
content: `
Selected users - ${users.map(user => user.username).join(',')}\n
Selected members - ${members.map(member => member.user?.username).join(',')}\n
Selected roles - ${roles.map(role => role.name).join(',')}
`
});
}
}

Menu de Seleção Dinâmico

Todos os tipos de Menu, suportem o formato dinâmico id usando path-to-regexp.

Para criar um menu de seleção dinâmico

import { StringSelectMenuBuilder } from 'discord.js';

new StringSelectMenuBuilder()
.setCustomId('preferences/color')
.setPlaceholder('Select a color')
.setMaxValues(1)
.setMinValues(1)
.setOptions([
{ label: 'Red', value: 'Red' },
{ label: 'Blue', value: 'Blue' },
{ label: 'Yellow', value: 'Yellow' }
])

Para receber um menu de seleção dinâmico

import { Injectable } from '@nestjs/common';
import {
ComponentParam,
Context,
SelectedStrings,
StringSelect,
StringSelectContext
} from 'necord';

@Injectable()
export class AppComponents {
@StringSelect('preferences/:item')
public async onPreferenceSelect(
@Context() [interaction]: StringSelectContext,
@SelectedStrings() values: string[],
@ComponentParam('item') item: string
): Promise<void> {
await interaction.reply({
content: `
${item} = ${values.join(',')}\n
`
});
}
}

Os menus de seleção dinâmica são compatíveis com :

  • StringSelect
  • UserSelect
  • RoleSelect
  • MentionableSelect
  • ChannelSelect

Você pode ver um exemplo funcional aqui.