INDEX / ARCHITECTURE.md
akra35567's picture
Upload 58 files
3b348ee verified

🤖 AKIRA BOT V21 — ARQUITETURA OOP

Visão Geral

Akira Bot V21 foi completamente refatorado com uma arquitetura Orientada a Objetos (OOP) moderna, modular e escalável. O código foi dividido em 6+ classes especializadas, cada uma com responsabilidade única, totalizando mais de 3000 linhas de código bem organizado.

Estrutura de Diretórios

/index/
├── index.js                    # Arquivo principal (orquestrador)
├── index.js.old               # Backup da versão anterior
├── package.json               # Dependências
└── modules/                   # Pasta com todas as classes
    ├── ConfigManager.js       # Gerenciamento de configurações
    ├── APIClient.js           # Cliente HTTP com retry (api.py)
    ├── AudioProcessor.js      # STT, TTS, efeitos de áudio
    ├── MediaProcessor.js      # Imagens, vídeos, stickers, YouTube
    ├── MessageProcessor.js    # Análise de mensagens e contexto
    ├── ModerationSystem.js    # Moderação: mute, ban, anti-link
    └── BotCore.js             # Núcleo: Baileys wrapper, event loop

Classes Principais

1. ConfigManager (Singleton)

Arquivo: modules/ConfigManager.js

Gerencia todas as configurações globais do bot.

Responsabilidades:

  • Leitura de variáveis de ambiente
  • Constantes de configuração
  • Validação de configurações críticas
  • Permissões de dono

Exemplo de uso:

const config = ConfigManager.getInstance();
console.log(config.BOT_NUMERO_REAL);
console.log(config.isDono('244937035662', 'Isaac Quarenta'));

Configurações disponíveis:

PORT, API_URL, API_TIMEOUT, API_RETRY_ATTEMPTS
BOT_NUMERO_REAL, BOT_NAME, BOT_VERSION, PREFIXO
TEMP_FOLDER, AUTH_FOLDER, DATABASE_FOLDER, LOGS_FOLDER
DEEPGRAM_API_KEY, DEEPGRAM_MODEL, STT_LANGUAGE
TTS_LANGUAGE, TTS_SLOW
RATE_LIMIT_WINDOW, RATE_LIMIT_MAX_CALLS
MUTE_DEFAULT_MINUTES, AUTO_BAN_AFTER_MUTES
YT_MAX_SIZE_MB, YT_QUALITY
FEATURE_STT_ENABLED, FEATURE_TTS_ENABLED, etc.

2. APIClient

Arquivo: modules/APIClient.js

Cliente HTTP para comunicação com api.py com retry automático.

Responsabilidades:

  • Formatar payloads conforme esperado por api.py
  • Requisições HTTP com retry exponencial
  • Integração com vision/OCR
  • Health checks

Payload Padrão:

{
  usuario: 'Isaac',
  numero: '244937035662',
  mensagem: 'Oi, tudo bem?',
  tipo_conversa: 'pv',  // ou 'grupo'
  tipo_mensagem: 'texto', // ou 'audio', 'image', 'video'
  mensagem_citada: '',
  reply_metadata: {
    is_reply: false,
    reply_to_bot: false,
    quoted_author_name: '',
    context_hint: ''
  },
  historico: [],
  forcar_busca: false,
  imagem: {
    dados: 'base64...',
    mime_type: 'image/jpeg',
    descricao: 'Análise de visão'
  }
}

Exemplo de uso:

const apiClient = new APIClient(logger);
const payload = apiClient.buildPayload({
  usuario: 'Isaac',
  numero: '244937035662',
  mensagem: 'Olá'
});
const resultado = await apiClient.processMessage(payload);

3. AudioProcessor

Arquivo: modules/AudioProcessor.js

Processa áudio: STT (Deepgram), TTS (Google), efeitos.

Responsabilidades:

  • Speech-to-Text via Deepgram API
  • Text-to-Speech via Google TTS
  • Aplicação de efeitos (nightcore, slow, bass, etc.)
  • Cache de TTS para performance
  • Detecção de tipo de áudio

Métodos principais:

speechToText(audioBuffer, language = 'pt')  // STT
textToSpeech(text, language = 'pt')         // TTS
applyAudioEffect(buffer, effect)            // Efeitos: nightcore, slow, bass, treble, echo
detectAudioType(buffer)                     // Detecta tipo (ogg, mp3, wav, etc)

Exemplo:

const audioProc = new AudioProcessor(logger);

// STT
const transcricao = await audioProc.speechToText(audioBuffer);
console.log(transcricao.texto); // "Olá, como você está?"

// TTS
const tts = await audioProc.textToSpeech('Oi! Tudo bem?');
await sock.sendMessage(jid, { audio: tts.buffer, ptt: true });

// Efeito
const nightcore = await audioProc.applyAudioEffect(buffer, 'nightcore');

4. MediaProcessor

Arquivo: modules/MediaProcessor.js

Processa mídia: imagens, vídeos, stickers, YouTube.

Responsabilidades:

  • Download de mídia via Baileys
  • Criação de stickers (estáticos e animados)
  • Conversão sticker ↔ imagem
  • Download de áudio do YouTube
  • Busca de músicas

Métodos principais:

downloadMedia(message, mimeType)           // Download de mídia
bufferToBase64(buffer)                     // Conversão
createStickerFromImage(imageBuffer)        // Sticker de imagem
createAnimatedStickerFromVideo(videoBuffer) // Sticker animado
convertStickerToImage(stickerBuffer)       // Converte sticker para PNG
downloadYouTubeAudio(url)                  // Download de áudio YT
searchYouTube(query, limit)                // Busca no YouTube

Exemplo:

const mediaProc = new MediaProcessor(logger);

// Download e criar sticker
const imageBuffer = await mediaProc.downloadMedia(message.imageMessage, 'image');
const sticker = await mediaProc.createStickerFromImage(imageBuffer);
await sock.sendMessage(jid, { sticker: sticker.buffer });

// YouTube
const resultado = await mediaProc.downloadYouTubeAudio('https://youtube.com/watch?v=...');
if (resultado.sucesso) {
  await sock.sendMessage(jid, { audio: resultado.buffer });
}

5. MessageProcessor

Arquivo: modules/MessageProcessor.js

Análise inteligente de mensagens e contexto.

Responsabilidades:

  • Extração de texto, número, tipo de conversação
  • Detecção de reply e contexto
  • Análise de comandos
  • Rate limiting
  • Sanitização de texto

Métodos principais:

extractUserNumber(message)                 // Número do usuário
extractText(message)                       // Extrai texto
getConversationType(message)               // 'pv' ou 'grupo'
extractReplyInfo(message)                  // Info de reply
isCommand(text)                            // É comando?
parseCommand(text)                         // Parse de comando
isBotMentioned(message)                    // Bot mencionado?
checkRateLimit(userId)                     // Verifica rate limit

Exemplo:

const msgProc = new MessageProcessor(logger);

const numero = msgProc.extractUserNumber(message);
const texto = msgProc.extractText(message);
const tipo = msgProc.getConversationType(message); // 'pv' ou 'grupo'

const replyInfo = msgProc.extractReplyInfo(message);
if (replyInfo) {
  console.log(replyInfo.textoMensagemCitada);
  console.log(replyInfo.ehRespostaAoBot);
}

// Rate limiting
if (!msgProc.checkRateLimit(numero)) {
  console.log('Rate limit excedido!');
}

6. ModerationSystem

Arquivo: modules/ModerationSystem.js

Sistema avançado de moderação.

Responsabilidades:

  • Mute com escalação (duplica tempo a cada mute)
  • Ban permanente ou temporário
  • Anti-link automático
  • Anti-spam
  • Contadores diários

Métodos principais:

muteUser(groupId, userId, minutes)         // Muta com escalação
unmuteUser(groupId, userId)                // Remove mute
isUserMuted(groupId, userId)               // Verifica mute
banUser(userId, reason, expiresIn)         // Bane usuário
unbanUser(userId)                          // Remove ban
isBanned(userId)                           // Verifica ban
toggleAntiLink(groupId, enable)            // Ativa/desativa anti-link
isAntiLinkActive(groupId)                  // Verifica status
containsLink(text)                         // Detecta link
checkSpam(userId)                          // Verifica spam

Exemplo:

const moderation = new ModerationSystem(logger);

// Mute
const muteResult = moderation.muteUser(groupId, userId, 5);
console.log(`Mutado por ${muteResult.minutes} minutos`);

// Anti-link
moderation.toggleAntiLink(groupId, true);
if (moderation.containsLink(texto)) {
  // Remove usuário
}

// Ban
moderation.banUser(userId, 'Spam', 24*60*60*1000); // 24h

7. BotCore

Arquivo: modules/BotCore.js

Núcleo do bot: orquestração, event loop, Baileys wrapper.

Responsabilidades:

  • Inicialização e conexão com WhatsApp
  • Main loop de processamento de mensagens
  • Orquestração de todas as classes
  • Gestão de estado e QR Code
  • Event handling

Métodos principais:

initialize()                               // Inicializa bot
connect()                                  // Conecta ao WhatsApp
getStatus()                                // Status atual
getStats()                                 // Estatísticas
getQRCode()                                // QR Code atual

Fluxo de processamento:

Mensagem recebida
    ↓
Deduplicação (últimos 30s)
    ↓
Verificação de ban/spam
    ↓
Verificação de mute (grupos)
    ↓
Processamento (áudio/texto)
    ↓
Extração de contexto e reply
    ↓
Verificação de rate limit
    ↓
Chamada à API (api.py)
    ↓
STT/TTS se necessário
    ↓
Envio da resposta

Fluxo de Mensagem Detalhado

1. Mensagem de Texto Recebida

handleMessagesUpsert() [BotCore]
  ↓
processMessage() [BotCore]
  ├─ extractUserNumber() [MessageProcessor]
  ├─ extractText() [MessageProcessor]
  ├─ extractReplyInfo() [MessageProcessor]
  ├─ checkRateLimit() [MessageProcessor]
  ├─ buildPayload() [APIClient]
  ├─ processMessage() [APIClient] → POST /akira (api.py)
  └─ sendMessage() [BotCore]

2. Mensagem de Áudio Recebida

handleMessagesUpsert() [BotCore]
  ↓
handleAudioMessage() [BotCore]
  ├─ downloadMedia() [MediaProcessor]
  ├─ speechToText() [AudioProcessor] → Deepgram API
  ├─ [Processa como texto...]
  └─ textToSpeech() [AudioProcessor] → Google TTS
      └─ sendMessage() com áudio [BotCore]

3. Comandos (prefixo #)

Exemplo: #sticker
  ↓
isCommand() verifica prefixo
  ↓
parseCommand() extrai comando e args
  ↓
CommandHandler executa lógica
  └─ (Futuramente: classe CommandHandler)

Conformidade com api.py

O APIClient formata mensagens exatamente como api.py espera:

Exemplo: Reply em grupo

// Usuário responde a bot em grupo
const payload = {
  usuario: 'Isaac',
  numero: '244937035662',
  mensagem: 'O que é isso?',           // Mensagem ATUAL
  tipo_conversa: 'grupo',
  tipo_mensagem: 'texto',
  mensagem_citada: 'Como posso ajudar?', // Mensagem citada COMPLETA
  reply_metadata: {
    is_reply: true,
    reply_to_bot: true,               // Flag BOT_ID
    quoted_author_name: 'Akira',
    quoted_author_numero: '244937035662',
    quoted_type: 'texto',
    context_hint: '(Usuário respondendo à mensagem do bot)'
  },
  grupo_id: '...',
  contexto_grupo: 'Meu Grupo'
}

// api.py recebe:
// - Mensagem atual para responder
// - Mensagem citada para contexto
// - Flag de reply ao bot para lógica especial

Variáveis de Ambiente

# Servidor
PORT=3000

# WhatsApp/API
API_URL=http://localhost:8000/api/akira
BOT_NUMERO=244937035662
BOT_NAME=Akira

# STT (Deepgram)
DEEPGRAM_API_KEY=seu_token_aqui
DEEPGRAM_MODEL=nova-2
STT_LANGUAGE=pt

# TTS
TTS_LANGUAGE=pt
TTS_SLOW=false

# YouTube
YT_MAX_SIZE_MB=25
YT_QUALITY=highestaudio

# Moderação
MUTE_DEFAULT_MINUTES=5
AUTO_BAN_AFTER_MUTES=3

# Features
FEATURE_STT=true
FEATURE_TTS=true
FEATURE_YT=true
FEATURE_STICKERS=true
FEATURE_MODERATION=true
FEATURE_VISION=true

Endpoints HTTP

GET /

Página de status do bot

GET /qr

QR Code para conectar

GET /health

Health check

GET /stats

Estatísticas detalhadas

POST /reset-cache

Limpa todos os caches

POST /moderation/toggle-antilink

{
  "groupId": "120363...",
  "enable": true
}

Padrões de Design Utilizados

  1. Singleton (ConfigManager)

    • Uma única instância globalmente acessível
  2. Factory (APIClient, AudioProcessor)

    • Cria instâncias com injeção de logger
  3. Observer (BotCore com events)

    • Event-driven para Baileys
  4. Strategy (AudioProcessor com efeitos)

    • Diferentes estratégias para processamento de áudio
  5. Cache (TTLCache em APIClient)

    • Cache com expiração automática

Performance e Otimizações

Cache

  • STT Cache: Evita re-transcrever mesmo áudio
  • TTS Cache: Reutiliza áudios gerados
  • Media Cache: Evita re-download

Deduplicação

  • Mensagens duplicadas ignoradas (30s)
  • Impede processamento duplo em case de retry

Rate Limiting

  • Máximo 6 requisições por 8 segundos
  • Proteção contra spam de comandos

Conexão com api.py

  • Retry automático (até 3 tentativas)
  • Backoff exponencial (1s, 2s, 4s)
  • Timeout de 120s

Limpeza de Memória

  • Maps de mute/ban auto-limpam expirados
  • Cache de mensagens com limite máximo
  • Spam cache com limite de 1000 entradas

Exemplos de Uso

Iniciar o bot

cd /home/elliot_pro/Programação/akira/index
node index.js

Acessar status

curl http://localhost:3000/health | jq

Resetar caches

curl -X POST http://localhost:3000/reset-cache

Ativar anti-link em grupo

curl -X POST http://localhost:3000/moderation/toggle-antilink \
  -H "Content-Type: application/json" \
  -d '{"groupId": "120363...", "enable": true}'

Escalabilidade Futura

Classe CommandHandler (planejada)

class CommandHandler {
  registerCommand(name, handler, options = {})
  executeCommand(comando, args, message)
  // Centralize todos os comandos (#sticker, #play, etc)
}

Classe DatabaseManager (planejada)

class DatabaseManager {
  saveUserData(userId, data)
  getUserData(userId)
  // Persistência de dados de usuários
}

Classe LevelingSystem (planejada)

class LevelingSystem {
  addXP(userId, amount)
  checkLevelUp(userId)
  // Sistema de leveling e patentes
}

Dependências Principais

{
  "@whiskeysockets/baileys": "^6.0.0",
  "express": "^4.18.0",
  "axios": "^1.6.0",
  "pino": "^8.0.0",
  "qrcode": "^1.5.0",
  "ffmpeg-fluent": "^2.1.2",
  "google-tts-api": "^2.0.2",
  "@distube/ytdl-core": "^4.11.5",
  "yt-search": "^2.10.0"
}

Próximos Passos

  1. ✅ Arquitetura OOP completa
  2. ✅ Integração com api.py
  3. ✅ STT/TTS funcional
  4. ⏳ CommandHandler centralizado
  5. ⏳ DatabaseManager para persistência
  6. ⏳ LevelingSystem (XP, patentes)
  7. ⏳ Dashboard web

Versão: 21.02.2025
Arquitetura: OOP com 6+ classes especializadas
Status: Pronto para produção
Linha de código: ~3000+ linhas bem organizadas