Portal do Desenvolvedor
Experimental A plataforma de bots e apps está em desenvolvimento ativo. O suporte a servidores auto-hospedados chegou em 13/08/2026 com menos recursos que a nuvem. Veja o que é suportado.
← Documentação

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 url e 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 com components: [] 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.

TipoEfeito
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

  • components de 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 com 400.
  • 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.

← Voltar para a documentação