El mayor portal de MU Online de Brasil — desde 2003
Tutorial Avanzado Infraestructura

Cómo crear un launcher con notificaciones push para tu servidor de MU Online

Construye un launcher propio para tu servidor de MU Online con sistema de actualización de archivos y notificaciones push, avisando a los jugadores en tiempo real sobre eventos, caídas de servidor y nuevas versiones.

RO Rodrigo · Actualizado el 25 mar 2017 · ⏱ 17 min de lectura
Respuesta rápida

Un launcher es el primer programa que el jugador abre incluso antes de ver la pantalla de inicio de sesión de MU Online, y por eso es un canal de comunicación subutilizado por la mayoría de los servidores privados. Además de la función básica de verificar y descargar actualizaciones de archivos del

Un launcher es el primer programa que el jugador abre incluso antes de ver la pantalla de inicio de sesión de MU Online, y por eso es un canal de comunicación subutilizado por la mayoría de los servidores privados. Además de la función básica de verificar y descargar actualizaciones de archivos del cliente, un launcher moderno puede mantener una conexión persistente con el servidor y mostrar notificaciones push en tiempo real, avisando sobre eventos que están por comenzar, caídas inesperadas del servidor o el lanzamiento de una nueva season. Este tutorial construye ese launcher con Electron, cubriendo desde la verificación de integridad de archivos hasta el sistema de notificaciones vía WebSocket.

Arquitectura general del launcher

Un launcher completo tiene tres componentes que trabajan juntos:

ComponenteResponsabilidad
Verificador de archivosCompara la versión local del cliente con la versión publicada en el servidor
ActualizadorDescarga y aplica los archivos nuevos o modificados
Cliente de notificacionesMantiene conexión con el servidor de notificaciones y muestra alertas en tiempo real

Este tutorial se enfoca principalmente en el tercer componente, asumiendo que el launcher ya tiene (o va a tener) las dos primeras funciones básicas implementadas.

Requisitos previos

  • Launcher existente basado en Electron, o disposición para construir uno desde cero con Node.js + Electron.
  • Un servidor Node.js separado (puede correr en la misma VPS del sitio) para el backend de notificaciones.
  • Panel administrativo con autenticación, desde donde el equipo va a disparar las notificaciones.
  • Certificado SSL válido en el dominio usado por el backend de notificaciones (WebSocket seguro, wss://).

Paso 1 — Estructura del backend de notificaciones

Crea un servicio Node.js dedicado, separado de la aplicación principal del sitio, responsable de mantener las conexiones WebSocket de los launchers abiertos y hacer broadcast de los mensajes:

mkdir mu-notify-server && cd mu-notify-server
npm init -y
npm install ws express jsonwebtoken dotenv
// server.js
const { WebSocketServer } = require('ws');
const express = require('express');
const jwt = require('jsonwebtoken');
require('dotenv').config();

const app = express();
app.use(express.json());

const clients = new Set();

const wss = new WebSocketServer({ port: 8081 });
wss.on('connection', (ws) => {
  clients.add(ws);
  ws.on('close', () => clients.delete(ws));
});

// Endpoint autenticado usado por el panel admin para disparar notificaciones
app.post('/broadcast', (req, res) => {
  const auth = req.headers.authorization?.split(' ')[1];
  try {
    jwt.verify(auth, process.env.ADMIN_JWT_SECRET);
  } catch {
    return res.status(401).json({ error: 'não autorizado' });
  }
  const payload = JSON.stringify(req.body);
  clients.forEach(ws => ws.readyState === 1 && ws.send(payload));
  res.json({ enviados: clients.size });
});

app.listen(3001, () => console.log('API de broadcast na porta 3001'));

Paso 2 — Autenticar el panel administrativo

El endpoint /broadcast nunca debe quedar accesible sin autenticación; de lo contrario, cualquier persona podría enviar notificaciones falsas a todos los jugadores, un vector claro de phishing. Genera un token JWT de larga duración solo para el equipo administrativo, almacenado con seguridad en el panel, y valídalo en cada llamada al endpoint.

Paso 3 — Conectar el launcher al WebSocket

En el proceso principal de Electron, abre la conexión apenas inicie el launcher y mantén la reconexión automática en caso de caída:

// main.js (proceso principal de Electron)
const WebSocket = require('ws');
const { Notification } = require('electron');

function conectarNotificacoes() {
  const ws = new WebSocket('wss://notify.seuservidor.com');

  ws.on('message', (data) => {
    const msg = JSON.parse(data);
    new Notification({
      title: msg.titulo || 'Aviso do servidor',
      body: msg.corpo,
      icon: 'assets/icon.png'
    }).show();
  });

  ws.on('close', () => {
    setTimeout(conectarNotificacoes, 5000); // tenta reconectar em 5s
  });

  ws.on('error', () => ws.close());
}

conectarNotificacoes();

Paso 4 — Mostrar notificaciones nativas del sistema operativo

El módulo Notification de Electron usa el sistema nativo de notificaciones de Windows (toast) o macOS, así que el jugador recibe la alerta incluso con el launcher minimizado en la bandeja del sistema, siempre que el proceso siga corriendo en segundo plano.

Paso 5 — Categorizar tipos de notificación

Define categorías en el payload enviado por el backend, permitiendo que el launcher trate cada tipo de forma diferente (ícono, sonido, prioridad):

CategoríaEjemplo de usoPrioridad visual
evento"La invasión comienza en 10 minutos"Alta, con sonido
manutencao"El servidor entrará en mantenimiento a las 22h"Alta, persistente
queda"El servidor cayó, el equipo ya está revisando"Crítica, sonido + destaque
novidade"Nueva season lanzada, revisa los cambios"Normal, sin sonido

Paso 6 — Crear el panel de disparo de notificaciones

En el panel administrativo (el mismo usado para gestionar cuentas y rankings), agrega un formulario simple que envíe la categoría, título y cuerpo del mensaje al endpoint /broadcast. Restringe este formulario a cuentas con rol de administrador o moderador sénior; el disparo de notificaciones masivas debe tener el mismo nivel de control de acceso que cualquier acción administrativa sensible.

Paso 7 — Detectar caídas de servidor automáticamente

Complementando el disparo manual, configura una verificación periódica (cada 1-2 minutos) que pruebe la conexión con el ConnectServer/GameServer. Si la verificación falla en dos comprobaciones consecutivas (evitando un falso positivo por inestabilidad momentánea), dispara automáticamente una notificación de categoría queda a todos los launchers conectados, sin depender de que un administrador esté disponible para notarlo y avisar manualmente.

Paso 8 — Probar reconexión y resiliencia

  1. Fuerza el cierre del backend de notificaciones con el launcher abierto y confirma que intenta reconectar automáticamente.
  2. Envía una notificación de prueba de cada categoría y confirma que se muestre correctamente en el sistema operativo.
  3. Prueba el launcher minimizado en la bandeja y confirma que la notificación nativa aparece igual.
  4. Simula una caída del GameServer y confirma que la detección automática dispara la notificación correcta.

Errores comunes y soluciones

SíntomaCausa probableSolución
El launcher no recibe notificacionesCertificado SSL inválido en el wss://Renueva el certificado y valida la URL del WebSocket
Cualquier persona puede disparar una notificaciónEndpoint /broadcast sin autenticaciónExige un JWT válido de cuenta administrativa
La notificación no aparece con el launcher minimizadoProceso en segundo plano finalizado por el sistemaConfigura el launcher para que siga corriendo en la bandeja
Falsa alarma de caída de servidorVerificación única sin confirmaciónExige dos fallas consecutivas antes de notificar
La reconexión genera múltiples conexiones duplicadasFalta de control de conexión única por clienteCierra la conexión anterior antes de abrir una nueva

Lista de verificación de lanzamiento

  • Backend de notificaciones corriendo con WebSocket seguro (wss://).
  • Endpoint de broadcast protegido por autenticación JWT administrativa.
  • Launcher conectándose automáticamente y reconectando tras una caída.
  • Notificaciones nativas del sistema operativo probadas en Windows.
  • Categorías de notificación definidas y diferenciadas visualmente.
  • Panel administrativo de disparo restringido a roles autorizados.
  • Detección automática de caída de servidor configurada y probada.

Con el launcher notificando a los jugadores en tiempo real, el siguiente paso es integrar ese canal al resto del ecosistema de comunicación, conectando el mismo backend de notificaciones al bot de Discord y al panel de eventos del servidor de MU Online, centralizando los avisos en un único punto de disparo.

Preguntas frecuentes

¿Necesito reescribir el launcher desde cero o se puede agregar push a uno existente?

Depende de la arquitectura del launcher actual. Si ya está basado en Electron o tiene un proceso en segundo plano capaz de mantener conexión de red, se puede agregar un módulo de notificaciones sin reescribir todo el launcher. Launchers muy antiguos en Delphi/VB pueden requerir más adaptación o incluso una reescritura parcial.

¿Las notificaciones push funcionan con el launcher cerrado?

Depende de la implementación. Las notificaciones del sistema operativo (toast de Windows) requieren que al menos un proceso en segundo plano del launcher esté corriendo para recibirlas. Una alternativa más liviana es correr solo un servicio mínimo que escucha al servidor de notificaciones y activa el launcher completo cuando sea necesario.

¿Cómo evito que el sistema de notificaciones se use para enviar spam o phishing?

Restringe el envío de notificaciones a un panel administrativo autenticado, nunca expuesto públicamente sin login, y siempre firma/valida el origen del mensaje del lado del cliente antes de mostrar cualquier notificación, evitando que un servidor de notificación falso se inyecte en el launcher de otra forma.

¿Qué tecnología usar para el servidor de notificaciones: WebSocket o polling HTTP?

WebSocket es más eficiente para notificaciones en tiempo real, ya que mantiene una conexión abierta y evita solicitudes repetidas. El polling HTTP es más simple de implementar y funciona bien para volúmenes bajos de notificación (pocas por hora), pero genera más tráfico innecesario a escala.

¿El sistema de actualización de archivos del launcher y el de notificaciones push son lo mismo?

No, pero se complementan. La actualización de archivos garantiza que el cliente del jugador tenga la versión correcta instalada; las notificaciones push avisan al jugador sobre eventos y cambios en tiempo real, independientemente de si hay o no una actualización de archivo pendiente.

RO
Fundador y editor jefe

Rodrigo mantiene ViciadosMU desde los inicios del portal. Especialista en creación y administración de servidores de MU Online, historia del juego y la evolución de las seasons — escribió buena parte del archivo antes de 2024.

Sigue leyendo

Artículos relacionados