O maior portal de MU Online do Brasil — desde 2003
Tutorial Avançado Infra

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.

RO Rodrigo · Atualizado em 25 mar 2017 · ⏱ 17 min de leitura
Resposta rápida

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:

ComponenteResponsabilidade
Verificador de arquivosCompara a versão local do cliente com a versão publicada no servidor
AtualizadorBaixa e aplica os arquivos novos ou alterados
Cliente de notificaçõesManté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):

CategoriaExemplo de usoPrioridade 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

  1. Force o fechamento do backend de notificações com o launcher aberto e confirme que ele tenta reconectar automaticamente.
  2. Envie uma notificação de teste de cada categoria e confirme a exibição correta no sistema operacional.
  3. Teste o launcher minimizado na bandeja e confirme que a notificação nativa aparece mesmo assim.
  4. Simule uma queda do GameServer e confirme que a detecção automática dispara a notificação correta.

Erros comuns e soluções

SintomaCausa provávelSolução
Launcher não recebe notificaçõesCertificado SSL inválido no wss://Renove o certificado e valide a URL do WebSocket
Qualquer pessoa consegue disparar notificaçãoEndpoint /broadcast sem autenticaçãoExija JWT válido de conta administrativa
Notificação não aparece com launcher minimizadoProcesso em segundo plano finalizado pelo sistemaConfigure o launcher para continuar rodando na bandeja
Falso alarme de queda de servidorChecagem única sem confirmaçãoExija duas falhas consecutivas antes de notificar
Reconexão gera múltiplas conexões duplicadasFalta de controle de conexão única por clienteFeche 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.

RO
Fundador e editor-chefe

Rodrigo mantém o ViciadosMU desde os primórdios do portal. Especialista em criação e administração de servidores de MU Online, história do jogo e a evolução das seasons — escreveu boa parte do acervo antes de 2024.

Continue lendo

Artigos relacionados