Case study
WonderBot — Bot Modular para Discord
Bot modular para Discord desenvolvido em TypeScript e Node.js, com recursos de reprodução de música, gerenciamento de filas, comandos administrativos, funcionalidades para jogos e integração com canais de voz. A aplicação utiliza Discord.js, FFmpeg e yt-dlp e possui ambiente conteinerizado com Docker.
Tecnologias
O problema
Bots para Discord que acumulam diversas funcionalidades podem rapidamente se tornar difíceis de manter quando comandos, eventos, reprodução de áudio e integrações são concentrados em uma única estrutura. Além disso, a reprodução de música em canais de voz exige lidar com diferentes componentes externos, gerenciamento de estado por servidor, filas de reprodução, processamento de áudio e comunicação com serviços externos.
A solução
Foi desenvolvido um bot modular utilizando TypeScript e Discord.js, separando funcionalidades por domínio, como música, administração, comandos gerais, RPG e integrações relacionadas a jogos. O módulo de música implementa gerenciamento independente de filas por servidor e oferece comandos para reproduzir, pausar, continuar, pular, remover, repetir e consultar músicas. Os metadados das músicas são obtidos através do yt-dlp, enquanto FFmpeg e as bibliotecas de áudio utilizadas pelo Discord são responsáveis pelo processamento necessário para reprodução em canais de voz. A aplicação também possui scripts para registro dos slash commands e um ambiente Docker contendo todas as dependências nativas necessárias para executar o bot de forma consistente.
Responsabilidades
Responsável pela arquitetura e desenvolvimento do bot, incluindo organização modular dos comandos e eventos, integração com a API do Discord, implementação do sistema de reprodução de áudio e gerenciamento de filas por servidor. Também fui responsável pela integração com ferramentas externas para obtenção e processamento de mídia, tratamento de comandos de reprodução, gerenciamento do ciclo de vida das conexões de voz e criação do ambiente Docker contendo as dependências necessárias para execução da aplicação.
Decisões técnicas
TypeScript foi adotado para melhorar a previsibilidade e manutenção do código em uma aplicação baseada fortemente em eventos. Discord.js foi utilizado como camada principal de integração com a API do Discord, enquanto o projeto foi dividido em módulos independentes para reduzir acoplamento entre funcionalidades. A lógica de música foi separada entre comandos, services, managers e interfaces, evitando concentrar a lógica de reprodução diretamente nos handlers dos comandos. yt-dlp é utilizado para recuperar informações e recursos relacionados às músicas solicitadas, enquanto FFmpeg e bibliotecas de áudio compatíveis com Discord são utilizadas para o processamento do stream. O gerenciamento das músicas é realizado por servidor, permitindo manter filas e estados de reprodução independentes para diferentes comunidades. Docker foi utilizado para criar um ambiente reproduzível contendo Node.js e dependências adicionais como Python, FFmpeg, Opus, libsodium, yt-dlp e Chromium.
Resultados
O projeto resultou em um bot extensível capaz de operar em servidores Discord com diferentes módulos de funcionalidades. O sistema de música permite administrar filas independentes, controlar o estado da reprodução e fornecer informações sobre as faixas utilizando comandos nativos do Discord. A arquitetura modular tornou possível adicionar novas categorias de funcionalidades sem concentrar toda a aplicação em um único fluxo, enquanto a conteinerização simplificou a configuração das diversas dependências necessárias para processamento de mídia e áudio.