Como criar um launcher com notificações push para seu servidor de MU Online
Construa um launcher próprio para o seu servidor de MU Online com sistema de atualização de arquivos e notificações push, avisando os jogadores em tempo real sobre eventos, quedas de servidor e novas versões.
Um launcher é o primeiro programa que o jogador abre antes de sequer ver a tela de login do MU Online, e por isso é um canal de comunicação subutilizado pela maioria dos servidores privados. Além da função básica de verificar e baixar atualizações de arquivos do cliente, um launcher moderno pode man
Um launcher é o primeiro programa que o jogador abre antes de sequer ver a tela de login do MU Online, e por isso é um canal de comunicação subutilizado pela maioria dos servidores privados. Além da função básica de verificar e baixar atualizações de arquivos do cliente, um launcher moderno pode manter uma conexão persistente com o servidor e exibir notificações push em tempo real — avisando sobre eventos que estão prestes a começar, quedas inesperadas do servidor, ou o lançamento de uma nova season. Este tutorial constrói esse launcher com Electron, cobrindo desde a verificação de integridade de arquivos até o sistema de notificações via WebSocket.
Arquitetura geral do launcher
Um launcher completo tem três componentes que trabalham juntos:
| Componente | Responsabilidade |
|---|---|
| Verificador de arquivos | Compara a versão local do cliente com a versão publicada no servidor |
| Atualizador | Baixa e aplica os arquivos novos ou alterados |
| Cliente de notificações | Mantém conexão com o servidor de notificações e exibe alertas em tempo real |
Este tutorial foca principalmente no terceiro componente, assumindo que o launcher já tem (ou vai ter) as duas primeiras funções básicas implementadas.
Pré-requisitos
- Launcher existente baseado em Electron, ou disposição para construir um do zero com Node.js + Electron.
- Um servidor Node.js separado (pode rodar na mesma VPS do site) para o backend de notificações.
- Painel administrativo com autenticação, de onde a equipe vai disparar as notificações.
- Certificado SSL válido no domínio usado pelo backend de notificações (WebSocket seguro,
wss://).
Passo 1 — Estrutura do backend de notificações
Crie um serviço Node.js dedicado, separado da aplicação principal do site, responsável por manter as conexões WebSocket dos launchers abertos e broadcast das mensagens:
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 pelo painel admin para disparar notificações
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'));
Passo 2 — Autenticar o painel administrativo
O endpoint /broadcast nunca deve ficar acessível sem autenticação — caso contrário, qualquer pessoa poderia enviar notificações falsas para todos os jogadores, um vetor claro de phishing. Gere um token JWT de longa duração apenas para a equipe administrativa, armazenado com segurança no painel, e valide-o em toda chamada ao endpoint.
Passo 3 — Conectar o launcher ao WebSocket
No processo principal do Electron, abra a conexão assim que o launcher iniciar e mantenha reconexão automática em caso de queda:
// main.js (processo principal do 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();
Passo 4 — Exibir notificações nativas do sistema operacional
O módulo Notification do Electron usa o sistema nativo de notificações do Windows (toast) ou macOS, então o jogador recebe o alerta mesmo com o launcher minimizado na bandeja do sistema, desde que o processo continue rodando em segundo plano.
Passo 5 — Categorizar tipos de notificação
Defina categorias no payload enviado pelo backend, permitindo que o launcher trate cada tipo de forma diferente (ícone, som, prioridade):
| Categoria | Exemplo de uso | Prioridade visual |
|---|---|---|
evento | "Invasão começa em 10 minutos" | Alta, com som |
manutencao | "Servidor entrará em manutenção às 22h" | Alta, persistente |
queda | "Servidor caiu, equipe já está verificando" | Crítica, som + destaque |
novidade | "Nova season lançada, confira as mudanças" | Normal, sem som |
Passo 6 — Criar o painel de disparo de notificações
No painel administrativo (o mesmo usado para gerenciar contas e rankings), adicione um formulário simples que envia a categoria, título e corpo da mensagem para o endpoint /broadcast. Restrinja esse formulário a contas com papel de administrador ou moderador sênior — o disparo de notificações em massa deve ter o mesmo nível de controle de acesso que qualquer ação administrativa sensível.
Passo 7 — Detectar quedas de servidor automaticamente
Complementando o disparo manual, configure uma checagem periódica (a cada 1-2 minutos) que testa a conexão com o ConnectServer/GameServer. Se a checagem falhar por duas verificações consecutivas (evitando falso positivo por instabilidade momentânea), dispare automaticamente uma notificação de categoria queda para todos os launchers conectados, sem depender de um administrador estar disponível para notar e avisar manualmente.
Passo 8 — Testar reconexão e resiliência
- Force o fechamento do backend de notificações com o launcher aberto e confirme que ele tenta reconectar automaticamente.
- Envie uma notificação de teste de cada categoria e confirme a exibição correta no sistema operacional.
- Teste o launcher minimizado na bandeja e confirme que a notificação nativa aparece mesmo assim.
- Simule uma queda do GameServer e confirme que a detecção automática dispara a notificação correta.
Erros comuns e soluções
| Sintoma | Causa provável | Solução |
|---|---|---|
| Launcher não recebe notificações | Certificado SSL inválido no wss:// | Renove o certificado e valide a URL do WebSocket |
| Qualquer pessoa consegue disparar notificação | Endpoint /broadcast sem autenticação | Exija JWT válido de conta administrativa |
| Notificação não aparece com launcher minimizado | Processo em segundo plano finalizado pelo sistema | Configure o launcher para continuar rodando na bandeja |
| Falso alarme de queda de servidor | Checagem única sem confirmação | Exija duas falhas consecutivas antes de notificar |
| Reconexão gera múltiplas conexões duplicadas | Falta de controle de conexão única por cliente | Feche a conexão anterior antes de abrir uma nova |
Checklist de lançamento
- Backend de notificações rodando com WebSocket seguro (
wss://). - Endpoint de broadcast protegido por autenticação JWT administrativa.
- Launcher conectando automaticamente e reconectando após queda.
- Notificações nativas do sistema operacional testadas em Windows.
- Categorias de notificação definidas e diferenciadas visualmente.
- Painel administrativo de disparo restrito a papéis autorizados.
- Detecção automática de queda de servidor configurada e testada.
Com o launcher notificando jogadores em tempo real, o próximo passo é integrar esse canal ao restante do ecossistema de comunicação — conectando o mesmo backend de notificações ao bot de Discord e ao painel de eventos do servidor de MU Online, centralizando os avisos em um único ponto de disparo.
Perguntas frequentes
Preciso reescrever o launcher do zero ou dá para adicionar push a um launcher existente?
Depende da arquitetura do launcher atual. Se ele já for baseado em Electron ou tiver um processo em segundo plano capaz de manter conexão de rede, dá para adicionar um módulo de notificações sem reescrever o launcher inteiro. Launchers muito antigos em Delphi/VB podem exigir mais adaptação ou até uma reescrita parcial.
Notificações push funcionam com o launcher fechado?
Depende da implementação. Notificações do sistema operacional (toast do Windows) exigem que pelo menos um processo em segundo plano do launcher esteja rodando para recebê-las. Uma alternativa mais leve é rodar apenas um serviço mínimo que escuta o servidor de notificações e aciona o launcher completo quando necessário.
Como evito que o sistema de notificações seja usado para enviar spam ou phishing?
Restrinja o envio de notificações a um painel administrativo autenticado, nunca exposto publicamente sem login, e sempre assine/valide a origem da mensagem no lado do cliente antes de exibir qualquer notificação, evitando que um servidor de notificação falso seja injetado no launcher de outra forma.
Que tecnologia usar para o servidor de notificações: WebSocket ou polling HTTP?
WebSocket é mais eficiente para notificações em tempo real, pois mantém uma conexão aberta e evita requisições repetidas. Polling HTTP é mais simples de implementar e funciona bem para volumes baixos de notificação (poucas por hora), mas gera mais tráfego desnecessário em escala.
O sistema de atualização de arquivos do launcher e o de notificações push são a mesma coisa?
Não, mas se complementam. A atualização de arquivos garante que o cliente do jogador tenha a versão correta instalada; as notificações push avisam o jogador sobre eventos e mudanças em tempo real, independente de haver ou não uma atualização de arquivo pendente.