Instalación
Uso
- Botones, menús de selección, encuestas, reacciones y ediciones nativos;
ctx.stream()edita un mensaje a medida que crece el texto. - El bot mantiene una reacción por mensaje, como en WhatsApp/Telegram: un
nuevo
ctx.react(emoji)reemplaza la anterior yctx.react('')la quita. Discord borra reacciones por emoji, así que el provider recuerda el que puso (en memoria,reactionMemory, 1000 mensajes por defecto); si no lo conoce (se puso antes de reiniciar o salió del LRU) rechaza conUnsupportedContentError. - Las interacciones tienen un plazo estricto de confirmación
(
interactionsRequireAck), así que el core confirma cada una exactamente una vez por ti: una confirmación diferida antes del primer envío del handler, poco antes del plazo de ~3 s o al terminar el handler, lo que ocurra antes. Llama actx.acknowledge('texto')antes de responder para contestar con un texto inmediato; una vez enviada la confirmación automática,ctx.acknowledge('texto')envíatextocomo respuesta normal yctx.acknowledge()no hace nada. ctx.interaction.ides el id de la interacción a secas: su token no sale del provider. Como red de seguridad, el provider también difiere cualquier interacción que siga sin respuesta trasautoAcknowledgeMs(2000 ms por defecto;falselo desactiva). Unctx.acknowledge('texto')tardío, ya confirmada, sale como followup, conappIdo, si falta, con el id de aplicación que Discord manda en READY y en cada interacción; si no se conoce ninguno, la llamada rechaza conProviderErroren vez de descartar el texto.- Más de 25 botones (5 filas de 5), 25 opciones de menú o 10 respuestas de
encuesta rechazan con
UnsupportedContentErroren vez de descartar opciones; el texto de más de 2000 caracteres se divide en varios mensajes. - Cada llamada REST vence tras
requestTimeoutMs(60 s por defecto); las subidas de archivos, trasuploadTimeoutMs(5 min). - Los mensajes de sistema (entradas al servidor, fijados, boosts…) y los de
bots no se enrutan. Un mensaje sin texto ni archivo llega como
sticker(con la imagen del sticker como media) ounknown(solo embeds, o el intent Message Content desactivado), nunca como texto vacío. - Todo mensaje que envía el provider lleva
allowed_mentions(por defecto{ parse: ['users'] }, opciónallowedMentions), así que un texto que el bot repite no puede mencionar a@everyone,@hereni a un rol;SendOptions.mentions,platformData.allowed_mentionsy los payloadsnativelo sustituyen. Una respuesta citada sigue notificando al autor del mensaje citado (replied_user: true;allowedMentions.replied_user: falseresponde sin notificar). - Los ids van en las URLs REST codificados, y un id vacío,
.o..rechaza conProviderError: un id manipulado nunca llega a otra ruta. Los votos de las encuestas nativas no llegan como eventos. - Un mensaje reenviado trae el texto y la media reenviados (de su snapshot),
no una respuesta citada; si no tiene nada legible llega como
unknown. Una encuesta nativa llega comotype: 'poll'con la pregunta como cuerpo. - Mensajes editados (
MESSAGE_UPDATEconedited_timestamp) llegan como mensajes con el texto nuevo y elref.idoriginal;isEditedMessage(ctx)de@botmesh/discordlos distingue yeditedMessages: 'ignore'los descarta. Las demás actualizaciones (previsualizaciones de enlaces, fijados, flags) no se enrutan: el provider entrega una edición una sola vez poredited_timestamp(recuerda el último de los 1000 mensajes editados más recientes), así que fijar un mensaje editado no lo vuelve a entregar.
Siguientes pasos
- Canales: elegir un canal, la matriz de capacidades y el contrato común de los canales.
- Respuestas en streaming: un mensaje editado a medida que crece el texto.
- README del paquete