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.
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:
| Componente | Responsabilidad |
|---|---|
| Verificador de archivos | Compara la versión local del cliente con la versión publicada en el servidor |
| Actualizador | Descarga y aplica los archivos nuevos o modificados |
| Cliente de notificaciones | Mantiene 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ía | Ejemplo de uso | Prioridad 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
- Fuerza el cierre del backend de notificaciones con el launcher abierto y confirma que intenta reconectar automáticamente.
- Envía una notificación de prueba de cada categoría y confirma que se muestre correctamente en el sistema operativo.
- Prueba el launcher minimizado en la bandeja y confirma que la notificación nativa aparece igual.
- Simula una caída del GameServer y confirma que la detección automática dispara la notificación correcta.
Errores comunes y soluciones
| Síntoma | Causa probable | Solución |
|---|---|---|
| El launcher no recibe notificaciones | Certificado SSL inválido en el wss:// | Renueva el certificado y valida la URL del WebSocket |
| Cualquier persona puede disparar una notificación | Endpoint /broadcast sin autenticación | Exige un JWT válido de cuenta administrativa |
| La notificación no aparece con el launcher minimizado | Proceso en segundo plano finalizado por el sistema | Configura el launcher para que siga corriendo en la bandeja |
| Falsa alarma de caída de servidor | Verificación única sin confirmación | Exige dos fallas consecutivas antes de notificar |
| La reconexión genera múltiples conexiones duplicadas | Falta de control de conexión única por cliente | Cierra 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.