Componentes de mensaje
Los bots adjuntan components con la forma de Discord a sus mensajes exactamente como en Discord, y un clic llega como INTERACTION_CREATE con el flujo habitual de token y callback, así que las bibliotecas no necesitan cambios. Esta página cubre qué muestra GameVox, cómo llegan las interacciones a tu app y dónde los límites difieren de Discord.
Qué funciona
- Filas de acción (tipo 1) con botones (tipo 2, estilos 1 a 5) y selectores de texto (tipo 3). Un botón de enlace (estilo 5) abre su
urly nunca envía una interacción. - Servidores en la nube y autoalojados. Los componentes se guardan con el mensaje y se devuelven en las lecturas REST y en
MESSAGE_CREATE/MESSAGE_UPDATE. Editar un mensaje concomponents: []los elimina. - Todos los clientes. El cliente de escritorio y web, iOS y Android muestran botones y selectores de texto (como máximo 5 filas de 5 controles por mensaje) y muestran modales y respuestas efímeras.
- Modales (callback tipo 9) y respuestas efímeras (
flags: 64), descritos más abajo.
Un mensaje con una fila de botones y un selector:
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" }
]
}
]
}
]
} No compatible
- Selectores de usuario, rol, mencionable y canal (tipos 5 a 8). Se aceptan y se guardan, pero los clientes los muestran desactivados, así que nunca producen una interacción.
- Componentes v2 (componentes de diseño). No se muestran.
- Botones premium (estilo 6). Se muestran desactivados.
- MD. Las interacciones con componentes, los modales y las respuestas efímeras solo funcionan en canales de servidor.
Recibir un clic
Un clic llega como INTERACTION_CREATE con type: 3 (MESSAGE_COMPONENT), con data.custom_id, data.component_type y, en un selector, data.values. message es el mensaje completo en el que se hizo clic, con sus componentes, sean cuales sean los intents de tu bot. Un modal enviado llega como type: 5 (MODAL_SUBMIT) con los valores introducidos en data.components.
GameVox comprueba cada clic contra el mensaje guardado antes de que tu app lo vea: el control debe seguir en el mensaje y estar activado, los valores del selector deben estar entre sus opciones y dentro de min_values / max_values, y el miembro debe poder ver el canal. Un clic solo se entrega a la app cuyo bot publicó el mensaje.
Las interacciones se entregan por la conexión de gateway de tu bot, o se envían por POST a tu URL del endpoint de interacciones si has definido una (consulta OAuth2). En modo HTTP hay dos diferencias con Discord:
- Mantén igualmente una sesión de gateway conectada. GameVox entrega cada interacción a tu app a través de ella antes de enviarla por POST a tu endpoint. Sin una sesión conectada no se entrega nada, y a quien hace clic se le indica que la app no está en línea.
- El cuerpo de la respuesta se ignora. Responde llamando a
POST /interactions/{id}/{token}/callback; un callback devuelto en el cuerpo de la respuesta al POST no llega a nadie.
Responder
Usa el endpoint de callback habitual. El token de la interacción es válido durante 15 minutos.
| Tipo | Efecto |
|---|---|
4 CHANNEL_MESSAGE_WITH_SOURCE | Publica una respuesta en el canal. Con flags: 64 la respuesta es efímera. |
5 DEFERRED_CHANNEL_MESSAGE_WITH_SOURCE | Confirma ahora; el primer PATCH .../messages/@original publica la respuesta. Con flags: 64 esa respuesta es efímera. |
6 DEFERRED_UPDATE_MESSAGE | Confirma sin ningún cambio visible. A partir de ahí @original se refiere al mensaje en el que se hizo clic, así que un PATCH .../messages/@original posterior lo edita. |
7 UPDATE_MESSAGE | Edita en el sitio el mensaje en el que se hizo clic, componentes incluidos. |
9 MODAL | Abre un modal para el miembro que hizo clic. |
Los mensajes de seguimiento (hasta 5 por interacción, flags: 64 para efímeros) y GET / PATCH / DELETE sobre @original y sobre los mensajes de seguimiento funcionan como en Discord. Los tipos 4, 5 y 9 y las respuestas efímeras también funcionan con comandos de barra; los tipos 6 y 7 necesitan un mensaje en el que se haya hecho clic.
Respuestas efímeras
Una respuesta efímera solo llega al miembro que provocó la interacción, en las sesiones que tenga abiertas, y se marca como visible solo para esa persona. Nunca se escribe en el canal: no aparece en el historial de mensajes ni en MESSAGE_CREATE, desaparece cuando el miembro recarga, y tu app puede editarla o borrarla durante 15 minutos. Los componentes de una respuesta efímera funcionan como cualquier otro. Esto es igual en servidores en la nube y autoalojados.
Modales
- Hasta 5 filas de acción con campos de texto (tipo 4). Todo lo demás en un modal se descarta. El estilo 1 es una sola línea; el estilo 2, un párrafo.
- El título y las etiquetas se recortan a 45 caracteres y los textos de ejemplo a 100. Un campo admite hasta 4000 caracteres.
requiredes true por defecto. - GameVox comprueba el envío contra el modal que abrió (campos obligatorios,
min_length,max_length) antes de que tu app lo vea. - Un modal caduca a los 15 minutos y solo se puede enviar una vez.
Límites
componentsde un mensaje: 64 KiB de JSON en servidores en la nube; 128 KiB y 40 componentes de primer nivel en servidores autoalojados. Una solicitud mayor falla con400.custom_id: hasta 100 caracteres; un control con uno más largo no se puede usar. Selectores: hasta 25 valores de hasta 100 caracteres cada uno.- Clics: una interacción con componentes por miembro y servidor cada 0,7 segundos. Un servidor autoalojado además permite como máximo 5 clics por miembro en 5 segundos. Los clics más rápidos se rechazan y nunca llegan a tu app.
- Respuestas efímeras y modales: 120 por app para cada miembro en una ventana de 15 minutos, contados juntos. Editar uno existente no cuenta. Por encima del límite, la solicitud falla con
429. - Contenido de una respuesta efímera: hasta 4000 caracteres.