Sistema de Voz Dinâmico para League of Legends
O VoiceLeague é um bot de Discord engenheirado para automatizar a comunicação de times de League of Legends. Ele detecta quando um jogador registrado entra em partida, cria instantaneamente um canal de voz temporário e gerencia o ciclo de vida deste canal até o fim do jogo.
O projeto utiliza o estado da arte do ecossistema TypeScript moderno para garantir performance e baixa latência:
- Runtime: Bun para execução ultra-rápida, servidor HTTP e gerenciamento de dependências.
- Linguagem: TypeScript (Strict Mode) para máxima segurança de tipos.
- Interface: Discord.js (v14+) para interação com a API do Discord.
- ORM & Banco: Drizzle ORM com SQLite (Bun:SQLite) para persistência leve.
- Validação: Zod para esquemas de dados e variáveis de ambiente.
- Integração: Riot Games API (Active Games V5 & Account V1).
O projeto segue princípios de Clean Architecture e SOLID, organizados nas seguintes camadas:
- Use Cases (Domain Logic): Centraliza as regras de negócio, como registro de jogadores e gerenciamento de preferências.
- Engine (Watchdog): O núcleo reativo que processa o monitoramento. Combina Polling Adaptativo com Eventos Reativos (Presence & Voice Updates).
- Service Layer: Abstrai integrações externas (Riot API, Voice Manager, Notification Service).
- Webhooks Server: Servidor HTTP interno via
Bun.servepara notificações externas de atividade. - Padrão de Segurança: Uso sistemático de wrappers
safeAsyncesafeRunpara tratamento de erros sem aninhamentos de try/catch.
Para que o bot funcione corretamente, você deve configurar as seguintes permissões e intents no Discord Developer Portal:
Acesse a aba Bot e ative as seguintes opções:
- Presence Intent: Necessária para detectar quando o usuário entra no cliente do League of Legends.
- Server Members Intent: Necessária para gerenciar cargos e permissões.
- Guild Presences: Fundamental para o funcionamento do motor de Watchdog.
Ao gerar o link de convite, selecione o scope bot e applications.commands. As permissões mínimas necessárias são:
- General Permissions:
Manage Channels(criar/deletar salas),View Channels. - Text Permissions:
Send Messages,Embed Links,Read Message History. - Voice Permissions:
Connect,Speak,Move Members(para o Auto-Join).
Certifique-se de que o cargo do bot esteja acima dos usuários que ele deve mover entre canais de voz, caso contrário, o Discord bloqueará a ação.
- Bun instalado (v1.0+ recomendado).
- Riot Developer Portal: Obtenha uma
RIOT_TOKEN(API Key).
# Clone o repositório
git clone https://github.com/Dev-Etto/VoiceLeague.git
# Instale as dependências
bun install
# Configure as variáveis de ambiente
cp .env.example .env
# Edite o .env com suas chaves (RIOT_TOKEN, DISCORD_TOKEN, etc.)
# Prepare o banco de dados (Migrations)
bun run db:push
# Inicie em modo de desenvolvimento
bun run dev| Comando | Parâmetros | Descrição |
|---|---|---|
/register |
riotid |
Vincula sua conta (Ex: Faker#KR1) ao seu ID do Discord. |
/autojoin |
enabled |
Liga/Desliga a entrada automática no canal de voz ao iniciar partida. |
/status |
- | Mostra suas contas vinculadas e o estado atual do monitoramento. |
/unregister |
- | Remove todos os seus dados e interrompe o monitoramento. |
O bot expõe um servidor de webhooks na porta 3000 para integrações imediatas:
- Endpoint:
POST /webhook/activity - Payload:
{ "discordId": "string" } - Ação: Dispara um
triggerImmediateCheckno motor de monitoramento para o usuário informado, ignorando o intervalo de polling.
Este projeto prioriza a qualidade técnica e segue rigorosamente:
- Clean Code & SOLID: Código modular e de responsabilidade única.
- TypeScript Estrito: Proibido o uso de
any. - Early Return: Lógica limpa evitando aninhamentos desnecessários.
- Tratamento de Erros: Uso do padrão Result com o utilitário
safeAsync. - Mobile-First Docs: Documentação e logs otimizados para leitura rápida.
| Script | Comando | Descrição |
|---|---|---|
dev |
bun run --watch src/index.ts |
Modo live-reload para desenvolvimento. |
start |
bun run src/index.ts |
Execução em produção. |
test |
bun test |
Executa a suíte completa de testes unitários e integração. |
db:push |
bun x drizzle-kit push |
Sincroniza o banco local com o schema do Drizzle. |
db:studio |
bun x drizzle-kit studio |
Interface visual para o banco de dados SQLite. |
- Faça um Fork do projeto.
- Crie uma Branch (
git checkout -b feature/minha-feature). - Siga o padrão de Commits Semânticos (
feat:,fix:,docs:). - Certifique-se de que os testes passam (
bun test). - Abra um Pull Request.
Desenvolvido por Dev-Etto