Monitor de guilds e personagens para servidores de Open Tibia com notificações em tempo real via Discord.
OT Notifier é um sistema de monitoramento multi-servidor para Open Tibia. Ele acompanha membros de guilds, detecta mudanças de nível (up/down) e mortes de personagens, enviando notificações automáticas via webhook do Discord.
| Funcionalidade | Detalhe |
|---|---|
| Monitoramento de guild | Scraping periódico dos membros da guild |
| Level up / down | Detecta subidas e descidas de nível com streak |
| Mortes | Notifica mortes com matadores e nível perdido |
| Anti-bot | Detecção de Cloudflare |
| Rate limiting | Controle de requisições por servidor (Bottleneck) |
| Cache de personagens | Cache LRU com TTL configurável para reduzir scraping |
| CLI interativa | Gerenciamento completo de servidores via terminal |
| Multi-servidor | Cada servidor roda em processo worker isolado |
| Docker | Suporte nativo com volumes persistentes |
# Clone o repositório
$ git clone https://github.com/VitorFirmino/ot_notifier.git
$ cd ot_notifier
# Instale as dependências
$ npm install
# (Opcional) Configure variáveis de ambiente
$ cp .env.example .env$ npm run manageAcesso ao menu interativo para adicionar, configurar e testar servidores e webhooks.
# Produção
$ npm run start
# Desenvolvimento (com hot-reload)
$ npm run dev# Subir com Docker Compose
$ docker compose up --build -d
# Gerenciar servidores dentro do container
$ docker compose exec ot_notifier npm run manage
# Ver logs
$ docker compose logs -fOs dados dos servidores são persistidos em volumes Docker — ao remover e recriar o container os estados são mantidos.
Adicione servidores manualmente ou via CLI:
[
{
"id": "meu_servidor",
"name": "Meu Servidor",
"url": "https://meuservidor.com/guilds/MinhaGuild",
"enabled": true,
"webhookUrl": "https://discord.com/api/webhooks/..."
}
]Em vez de salvar o webhook no JSON, você pode defini-lo no .env.
O padrão é WEBHOOK_URL_ + o id do servidor em MAIÚSCULAS:
# servers.json → "id": "meu_servidor"
WEBHOOK_URL_MEU_SERVIDOR=https://discord.com/api/webhooks/ID/TOKEN
# servers.json → "id": "global_retro_pvp"
WEBHOOK_URL_GLOBAL_RETRO_PVP=https://discord.com/api/webhooks/ID/TOKEN
# Prefixo agrupado: aplica para todos os servidores cujo id começa com "global"
# Ex: global_retro_pvp, global_hardcore, global_optional — todos usam o mesmo webhook
WEBHOOK_URL_GLOBAL=https://discord.com/api/webhooks/ID/TOKENO sistema tenta primeiro o match exato, depois o prefixo mais longo, e por último o webhook salvo no JSON.
Cada servidor tem um arquivo de configuração individual com opções avançadas:
| Opção | Descrição | Padrão |
|---|---|---|
concurrency |
Requisições simultâneas | 3 |
requestDelay |
Delay entre requisições (ms) | 1000 |
checkInterval |
Intervalo de verificação (ms) | 120000 |
batchSize |
Tamanho do lote de personagens | 10 |
src/
├── application/
│ ├── managers/ # Ciclo de vida (render, shutdown, processos)
│ └── workers/
│ └── handlers/ # Lógica principal de verificação por servidor
├── cli/
│ └── index.ts # CLI interativa (gerenciamento de servidores)
├── infrastructure/
│ ├── scraping/
│ │ ├── http/ # Axios client, rate limiter, Bottleneck
│ │ ├── parsers/ # Cheerio parsers (personagens, mortes)
│ │ └── utils/ # User-agent generator
│ └── storage/
│ ├── servers.json # Lista de servidores monitorados
│ ├── data/ # Configuração individual por servidor
│ └── serverConfigManager.ts
└── shared/
├── errors/ # Hierarquia de erros tipados
├── types/ # Tipos globais (character, server, webhook)
└── utils/ # Logger, cache, retry, timeout, blockRenderer
| Comando | Descrição |
|---|---|
npm run start |
Inicia o monitoramento |
npm run dev |
Modo desenvolvimento com hot-reload |
npm run manage |
Abre a CLI interativa |
npm run type-check |
Verificação de tipos TypeScript |
npm run lint |
Lint com ESLint |
npm run format |
Formata o código com Prettier |
npm run test |
Testes com Vitest |
- Node.js 22 — Runtime
- TypeScript 5 — Tipagem estática
- tsx — Execução direta de TypeScript
- Axios + Cheerio — HTTP e scraping HTML
- Playwright — Scraping de páginas com Cloudflare
- Bottleneck — Rate limiting robusto
- Chalk + Boxen — UI de terminal
- proper-lockfile — Locks atômicos para arquivos de estado
- Vitest — Testes unitários
- Docker — Containerização
Este projeto está sob a licença ISC.
Feito por Vitor Firmino
