Componentes de mensagem
Bots anexam components no formato do Discord às suas mensagens exatamente como no Discord, e um clique chega como INTERACTION_CREATE com o fluxo habitual de token e callback, então as bibliotecas não precisam de mudanças. Esta página cobre o que o GameVox exibe, como as interações chegam ao seu app e onde os limites diferem do Discord.
O que funciona
- Linhas de ação (tipo 1) com botões (tipo 2, estilos 1 a 5) e seletores de texto (tipo 3). Um botão de link (estilo 5) abre a sua
urle nunca envia uma interação. - Servidores na nuvem e auto-hospedados. Os componentes são armazenados com a mensagem e retornados nas leituras REST e em
MESSAGE_CREATE/MESSAGE_UPDATE. Editar uma mensagem comcomponents: []os remove. - Todos os clientes. O cliente desktop e web, iOS e Android exibem botões e seletores de texto (no máximo 5 linhas de 5 controles por mensagem) e mostram modais e respostas efêmeras.
- Modais (callback tipo 9) e respostas efêmeras (
flags: 64), descritos abaixo.
Uma mensagem com uma linha de botões e um seletor:
POST /api/v10/channels/{channel_id}/messages
{
"content": "Next map?",
"components": [
{
"type": 1,
"components": [
{ "type": 2, "style": 1, "label": "Vote", "custom_id": "vote" },
{ "type": 2, "style": 5, "label": "Rules", "url": "https://example.com/rules" }
]
},
{
"type": 1,
"components": [
{
"type": 3,
"custom_id": "map",
"placeholder": "Pick a map",
"options": [
{ "label": "Dust", "value": "dust" },
{ "label": "Nuke", "value": "nuke" }
]
}
]
}
]
} Não suportado
- Seletores de usuário, cargo, mencionável e canal (tipos 5 a 8). São aceitos e armazenados, mas os clientes os mostram desativados, então nunca geram uma interação.
- Componentes v2 (componentes de layout). Não são exibidos.
- Botões premium (estilo 6). São mostrados desativados.
- DMs. Interações com componentes, modais e respostas efêmeras só funcionam em canais de servidor.
Recebendo um clique
Um clique chega como INTERACTION_CREATE com type: 3 (MESSAGE_COMPONENT), trazendo data.custom_id, data.component_type e, em um seletor, data.values. message é a mensagem completa que foi clicada, com os componentes, independentemente dos intents do seu bot. Um modal enviado chega como type: 5 (MODAL_SUBMIT) com os valores preenchidos em data.components.
O GameVox confere cada clique com a mensagem armazenada antes que o seu app o veja: o controle ainda precisa estar na mensagem e ativado, os valores do seletor precisam estar entre as opções e dentro de min_values / max_values, e o membro precisa conseguir ver o canal. Um clique só é entregue ao app cujo bot postou a mensagem.
As interações são entregues pela conexão de gateway do seu bot, ou enviadas por POST para a sua URL do endpoint de interações se você definir uma (veja OAuth2). No modo HTTP, duas coisas diferem do Discord:
- Mantenha uma sessão de gateway conectada mesmo assim. O GameVox entrega cada interação ao seu app por meio dela antes de enviá-la por POST ao seu endpoint. Sem uma sessão conectada nada é entregue, e quem clica é avisado de que o app não está online.
- O corpo da resposta é ignorado. Responda chamando
POST /interactions/{id}/{token}/callback; um callback devolvido no corpo da resposta ao POST não chega a ninguém.
Respondendo
Use o endpoint de callback habitual. O token da interação vale por 15 minutos.
| Tipo | Efeito |
|---|---|
4 CHANNEL_MESSAGE_WITH_SOURCE | Posta uma resposta no canal. Com flags: 64 a resposta é efêmera. |
5 DEFERRED_CHANNEL_MESSAGE_WITH_SOURCE | Confirma agora; o primeiro PATCH .../messages/@original posta a resposta. Com flags: 64 essa resposta é efêmera. |
6 DEFERRED_UPDATE_MESSAGE | Confirma sem mudança visível. A partir daí @original se refere à mensagem clicada, então um PATCH .../messages/@original posterior a edita. |
7 UPDATE_MESSAGE | Edita a mensagem clicada no lugar, componentes incluídos. |
9 MODAL | Abre um modal para o membro que clicou. |
Follow-ups (até 5 por interação, flags: 64 para efêmero) e GET / PATCH / DELETE em @original e em mensagens de follow-up funcionam como no Discord. Os tipos 4, 5 e 9 e as respostas efêmeras também funcionam em comandos de barra; os tipos 6 e 7 precisam de uma mensagem clicada.
Respostas efêmeras
Uma resposta efêmera vai só para o membro que disparou a interação, nas sessões que ele tem abertas, e é marcada como visível só para ele. Ela nunca é gravada no canal: não aparece no histórico de mensagens nem em MESSAGE_CREATE, some quando o membro recarrega, e o seu app pode editá-la ou apagá-la por 15 minutos. Componentes em uma resposta efêmera funcionam como quaisquer outros. É igual em servidores na nuvem e auto-hospedados.
Modais
- Até 5 linhas de ação com campos de texto (tipo 4). Qualquer outra coisa em um modal é descartada. O estilo 1 é uma linha só; o estilo 2, um parágrafo.
- O título e os rótulos são cortados em 45 caracteres e os placeholders em 100. Um campo comporta até 4000 caracteres.
requiredé true por padrão. - O GameVox confere o envio com o modal que abriu (campos obrigatórios,
min_length,max_length) antes que o seu app o veja. - Um modal expira após 15 minutos e só pode ser enviado uma vez.
Limites
componentsde uma mensagem: 64 KiB de JSON em servidores na nuvem; 128 KiB e 40 componentes de nível superior em servidores auto-hospedados. Uma requisição maior falha com400.custom_id: até 100 caracteres; um controle com um mais longo não pode ser usado. Seletores: até 25 valores de até 100 caracteres cada.- Cliques: uma interação com componentes por membro e por servidor a cada 0,7 segundo. Um servidor auto-hospedado também permite no máximo 5 cliques por membro em 5 segundos. Cliques mais rápidos são recusados e nunca chegam ao seu app.
- Respostas efêmeras e modais: 120 por app para cada membro em uma janela de 15 minutos, contados juntos. Editar um existente não conta. Acima do limite a requisição falha com
429. - Conteúdo de uma resposta efêmera: até 4000 caracteres.