Documentación para Desarrolladores (API de Imágenes)

Introducción

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.

¿Cómo funciona?

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.

1. Datos de Licencia

Utilizado por el generador de licencias (id.html).

KEYWORD convoyrama-data

Estructura JSON

{
  "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"
}

2. Datos de Evento

Utilizado por el creador de eventos personalizados (event.html).

KEYWORD convoyrama-event-data

Estructura JSON

{
  "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"
}

Ejemplo de Implementación (Node.js)

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);
}