# EuroTrans Launcher

Companion app que conecta tu partida de Euro Truck Simulator 2 con EuroTrans:
autentica tu wallet, manda heartbeats, lee la telemetria del camion y la
envia a la API para aceptar contratos y cobrar entregas automaticamente.

## 1. Instalar el plugin de telemetria en ETS2

Este launcher no se conecta directamente al juego (eso requeriria una DLL
nativa compilada con el SDK de SCS dentro de Windows). En vez de reinventar
eso, usa el plugin **open-source estandar de la comunidad**
([Funbit/ets2-telemetry-server](https://github.com/Funbit/ets2-telemetry-server)),
el mismo que usan TruckersMP, TrucksBook y herramientas similares.

Ese proyecto trae su propio instalador grafico (`Ets2Telemetry.exe`) que
intenta detectar la carpeta de ETS2 el solo, pero puede fallar si el juego
esta instalado en otra unidad o en una biblioteca de Steam no estandar. Por
eso nuestro script **no depende de esa deteccion**: busca la carpeta el
mismo (chequea las rutas tipicas de Steam, lee `libraryfolders.vdf` para
encontrar todas las bibliotecas, y si nada de eso funciona te pide que
pegues la ruta a mano), copia el plugin directamente y configura el
firewall de Windows.

**Opcion automatica (recomendada, sin usar la terminal):**

Hace doble clic en `scripts/Instalar-Telemetria-ETS2.bat`. Si Windows muestra
"Windows protegio tu PC" (SmartScreen), toca "Mas informacion" -> "Ejecutar
de todas formas" (pasa por ser un archivo nuevo, no por ser inseguro). El
.bat lleva el script de PowerShell embebido dentro de si mismo (es un solo
archivo autosuficiente, no necesita ningun otro archivo en la misma
carpeta), asi que no hace falta abrir PowerShell a mano ni descargar nada
mas. Puedes copiarlo y compartirlo solo, sin el resto del launcher.

**Opcion automatica via terminal** (equivalente, para quien prefiera ver
los comandos):

```powershell
cd launcher
npm install
npm run setup:plugin
```

Cualquiera de las dos hace lo mismo: descarga el paquete, busca tu carpeta
de ETS2 (con varios metodos; si no la encuentra te pide que la pegues),
copia el plugin ahi mismo, configura el firewall y el permiso de red de
Windows (necesita Administrador la primera vez — eso y nada mas es lo que
no se puede automatizar, por una proteccion del sistema operativo, no una
limitacion del script), inicia el servidor y verifica que quedo corriendo
en `http://127.0.0.1:25555/api/ets2/telemetry`. Tambien deja un acceso
directo en el inicio de Windows para que no tengas que abrirlo cada vez, y
otros dos accesos directos para abrirlo a mano si lo necesitas: uno en el
**escritorio** y otro en la **carpeta del launcher** (donde descomprimiste
el zip), ambos llamados `Ets2Telemetry.exe` y con el **icono del propio
juego** (lo toman directamente de `eurotrucks2.exe`, no es una copia
modificada). Son accesos directos y no copias del `.exe` real porque el
servidor necesita los archivos que tiene al lado en su carpeta de
instalacion (la pagina web de su panel, etc.) — una copia suelta del `.exe`
en otro sitio no arrancaria bien.

Despues de arrancar el servidor de telemetria, el script tambien abre
**Euro Truck Simulator 2 automaticamente** (via `steam://rungameid/227300`,
que arranca Steam si no estaba abierto y lanza el juego). Solo espera a que
cargue y entra a una partida para que se conecte con el servidor.

Al iniciar el servidor por primera vez puede aparecer una ventana
preguntando por la carpeta de **American Truck Simulator (ATS)** — es otro
juego de la misma compania que el mismo plugin soporta. Si no tienes ATS
instalado, hace clic en "Cancel" en esa ventana: es normal, viene del
programa oficial de Funbit, y no afecta a tu plugin de ETS2 (que el script
ya copio en el paso anterior).

Para volver a probar en cualquier momento sin reinstalar:

```powershell
npm run test:plugin
```

**Opcion manual** (si el script falla o preferis hacerlo a mano):

1. Descarga el zip del proyecto: https://github.com/Funbit/ets2-telemetry-server/archive/refs/heads/master.zip
2. Descomprimilo en cualquier carpeta.
3. Copia `server\Ets2Plugins\win_x64\plugins\ets2-telemetry-server.dll`
   (o la version `win_x86` si tu ETS2 es de 32 bits) a
   `<carpeta de tu ETS2>\bin\win_x64\plugins\` (crea la carpeta `plugins`
   si no existe).
4. Corre `server\Ets2Telemetry.exe` desde la carpeta donde descomprimiste
   el zip, para que el servidor quede escuchando.
5. Inicia ETS2. El plugin expone la telemetria en
   `http://127.0.0.1:25555/api/ets2/telemetry`.
6. Verifica abriendo esa URL en el navegador mientras el juego corre: deberias
   ver un JSON con `"game": { "connected": true, ... }`.

## 2. Instalar y arrancar el launcher (opcion recomendada, sin terminal)

El zip que se descarga desde `/setup/` ya incluye `.env` configurado y dos
archivos de doble clic, pensados para que un jugador sin experiencia tecnica
no tenga que escribir ningun comando:

1. Descomprime el zip en una carpeta.
2. Haz doble clic en **`EuroTrans-Instalador.exe`**. Este instalador (hecho
   con NSIS, ver `installer/installer.nsi`) instala Node.js si falta, corre
   `npm install`, y al terminar muestra una ventana con el mismo estilo
   visual que `/setup/` y un boton **Continuar**. Windows puede pedir
   permiso de administrador la primera vez (lo necesita para instalar
   Node.js) — es normal, hay que aceptarlo.
3. Al pulsar **Continuar**, se abre `Iniciar-EuroTrans.bat` en una consola
   nueva, que corre `npm start` y abre tu navegador para conectar tu wallet
   (MetaMask o Immutable Passport).
4. Si en algun momento cierras esa consola por error, vuelve a hacer doble
   clic en `Iniciar-EuroTrans.bat` (queda en la misma carpeta) para abrirla
   de nuevo ubicada correctamente, sin tener que repetir la instalacion.

`EuroTrans-Instalador.exe` no escribe nada fuera de esa carpeta (no usa
Archivos de programa ni el registro): solo automatiza lo que el jugador
haria a mano en el paso 2b.

`Iniciar-EuroTrans.bat` se mantiene como `.bat` (no como `.exe` con icono)
a proposito: un `.exe` nuevo y sin firmar descargado/distribuido por su
cuenta dispara el aviso de "archivo no se descarga habitualmente" de
Edge/Chrome (SmartScreen de aplicaciones) antes de poder ejecutarlo, algo
que los `.bat` no sufren con la misma intensidad. Se probo convertirlo (y
`Instalar-EuroTrans-Todo.bat`) a `.exe` con icono propio, pero se revirtio
por ese motivo — ver el aviso similar mas abajo sobre SmartScreen al
ejecutar `EuroTrans-Instalador.exe`.

## 2b. Configurar el launcher a mano (alternativa via terminal)

```bash
cd launcher
npm install
cp .env.example .env
```

Edita `.env` si quieres cambiar algo (no es necesario para jugar):

- `EUROTRANS_API_URL`: por defecto `https://ets2.lastgamestudio.fun`.
- `LAUNCHER_TELEMETRY_URL`: por defecto `http://127.0.0.1:25555/api/ets2/telemetry`,
  donde el plugin del paso 1 expone la telemetria.

Tu identidad de jugador es tu wallet de **MetaMask** o tu cuenta de
**Immutable Passport** (Google/Apple/email, sin extensiones) — el launcher
no genera ni guarda ninguna wallet propia. Internamente usa el mismo patron
"device code" que `gh auth login`/`docker login`: pide un codigo a la API,
abre `EUROTRANS_API_URL/setup/connect.html` con ese codigo, y espera
(haciendo polling) a que termines de conectarte ahi.

## 3. Correr (si usaste la opcion 2b)

```bash
npm start
```

Vas a ver algo asi:

```
[auth] Abriendo el navegador para conectar tu wallet...
[auth] sesion iniciada para 0xabcd... (no expira)
[launcher] corriendo. Ctrl+C para salir.
[contracts] aceptado #12: Rotterdam -> Paris (Food, 25.00000000 LGST)
[delivery] entrega completada del contrato #12
```

Se va a abrir tu navegador en una pestana donde elegis MetaMask o Immutable
Passport. Cuando termines de conectarte ahi, la consola del launcher sigue
sola.

El launcher manda heartbeats cada `LAUNCHER_HEARTBEAT_INTERVAL_MS` y
telemetria cada `LAUNCHER_TELEMETRY_INTERVAL_MS`. Si no tenes un contrato
activo y `LAUNCHER_AUTO_ACCEPT_CONTRACTS=true`, acepta automaticamente el de
mejor recompensa disponible para tu nivel.

## Limitaciones conocidas

- La primera version de `EuroTrans-Instalador.exe` cerraba la ventana de
  progreso con `taskkill /FI "WINDOWTITLE eq ..."`, que exige una
  coincidencia exacta del titulo y puede fallar en silencio segun la
  version de Windows — si fallaba, la ventana de progreso se quedaba
  abierta para siempre encima de las demas, dando la falsa impresion de
  que la instalacion se habia colgado tras el mensaje de exito. Ahora la
  ventana de progreso se lanza con PowerShell (`Start-Process -PassThru`),
  se guarda su PID real en un archivo temporal, y se cierra por ese PID
  (`Stop-Process`), con el `taskkill` por titulo solo como red de
  seguridad adicional. Tampoco esto se ha podido probar contra Windows
  real todavia.
- `EuroTrans-Instalador.exe` (`installer/installer.nsi`) se compilo con NSIS
  en este servidor Linux y **no se probo todavia contra Windows real**.
  Usa `mshta.exe` (incluido en todas las versiones de Windows) para mostrar
  las ventanas de progreso/exito con el mismo estilo que `/setup/`, y pide
  permiso de administrador siempre (`RequestExecutionLevel admin`) para
  poder instalar Node.js cuando falta — eso significa que pedira permiso de
  administrador incluso si Node.js ya esta instalado, es una simplificacion
  deliberada para no complicar la elevacion condicional. Si algo falla, la
  opcion 2b (terminal) siempre funciona como respaldo. Al ser un `.exe`
  nuevo y sin firmar, puede disparar avisos de SmartScreen al ejecutarlo
  (el jugador puede continuar con "Mas informacion" -> "Ejecutar de todas
  formas", ya documentado en `/setup/`). El riesgo de que el navegador lo
  bloquee al *descargarlo* es menor que con un `.exe` standalone porque
  viaja dentro de `eurotrans-launcher.zip`, no se descarga el `.exe` por
  si solo — por eso `Instalar-EuroTrans-Todo.bat` (descarga directa, fuera
  de la web) se mantuvo como `.bat` y no se convirtio a `.exe`.
- El mapeo de telemetria del plugin Funbit (`launcher/src/telemetry/funbitSource.js`)
  esta escrito segun la documentacion publica del proyecto, pero **no fue
  probado contra el juego real** (este entorno no tiene Windows ni ETS2
  instalado). Si algun campo no coincide exactamente al probarlo, ajustar ahi.
- La distancia recorrida se estima como `(distancia total del viaje) - (distancia
  restante segun el plugin)`. Si el plugin no reporta `navigation.estimatedDistance`
  de forma estable, esa estimacion puede ser imprecisa.
- La deteccion automatica de la carpeta de ETS2 y la configuracion de firewall/
  permiso de red (`scripts/install-telemetry-plugin.ps1` y el .bat) tampoco
  fueron probadas contra Windows real por la misma razon. La logica replica lo
  que el instalador oficial de Funbit hace segun su propia documentacion
  (mismo nombre de regla de firewall, mismo puerto), pero si algo falla en la
  practica, la opcion manual de la seccion anterior siempre funciona como
  respaldo.
- El login con **Immutable Passport** (`setup/connect.html`) se escribio en
  base a la documentacion publica de Immutable (nombre de paquete npm,
  metodo para obtener el access token tras el login), pero **no se probo
  contra un login real** todavia. El flujo de "device code" que lo conecta
  con el launcher si esta probado de punta a punta contra la API en
  produccion. Si el boton de Passport falla en el paso de "obtener token",
  revisar el snippet de codigo que Immutable Hub muestra para este client ID
  en hub.immutable.com y ajustar `getPassport()`/`handlePassportCallback()`
  en `setup/connect.html`. El login con **MetaMask** usa solo `window.ethereum`
  estandar y el mismo challenge/firma que ya estaba validado, asi que deberia
  funcionar sin ajustes.
