Documentación para Desarrolladores (API de Imágenes)
Las herramientas de Convoyrama (Generador de Licencias y Creador de Eventos) no solo crean imágenes visuales, sino que también incrustan metadatos estructurados (JSON) dentro de los archivos PNG generados.
Esto permite que bots de Discord (como Robotito) y otras aplicaciones lean la información directamente desde la imagen sin necesidad de OCR ni bases de datos externas.
Los datos se almacenan en un chunk auxiliar de tipo tEXt dentro de la estructura del PNG. Usamos claves específicas (Keywords) para diferenciar el tipo de contenido.
Utilizado por el generador de licencias (id.html).
KEYWORD convoyrama-data
{
"name": "Nombre del Usuario",
"license_number": "UY12345",
"country": "UY", // Código ISO de 2 letras
"rank": 5, // Nivel calculado por antigüedad (1-12)
"is_verified": true, // Si se validó con la API de TruckersMP
"truckersmp_link": "https://truckersmp.com/user/...",
"vtc_link": "https://truckersmp.com/vtc/...",
"tmp_join_date": "2020-01-15 14:30:00", // Fecha de registro en TMP
"generated_at": "2023-10-27T10:00:00.000Z"
}
Utilizado por el creador de eventos personalizados (event.html).
KEYWORD convoyrama-event-data
{
"eventName": "Gran Convoy Semanal",
"eventLink": "https://truckersmp.com/events/...",
"description": "Descripción completa del evento...",
"server": "Simulation 1",
"startPlace": "Paris (Tradeaux)",
"destination": "Calais (Port)",
"meetingTimestamp": 1704067200, // Timestamp Unix (segundos)
"departureTimestamp": 1704068100,
"arrivalTimestamp": 1704071100,
"meetingGameTime": { "hours": 14, "minutes": 30 }, // Hora in-game
"ianaTimeZone": "America/Montevideo"
}
Puedes usar paquetes como png-chunk-text y png-chunks-extract para leer estos datos fácilmente.
const extract = require('png-chunks-extract');
const text = require('png-chunk-text');
const fs = require('fs');
// 1. Leer el archivo como buffer
const buffer = fs.readFileSync('evento.png');
// 2. Extraer los chunks
const chunks = extract(buffer);
// 3. Filtrar y decodificar chunks de texto
const textChunks = chunks
.filter(chunk => chunk.name === 'tEXt')
.map(chunk => text.decode(chunk.data));
// 4. Buscar nuestra keyword
const eventData = textChunks.find(c => c.keyword === 'convoyrama-event-data');
if (eventData) {
const data = JSON.parse(eventData.text);
console.log("Evento encontrado:", data.eventName);
}