Skip to content

🎨 Visual Guide - Multi-Platform Bot

πŸ“ Arquitetura em Camadas (ASCII)

╔════════════════════════════════════════════════════════════════╗
β•‘                    PLATAFORMAS DE MENSAGERIA                   β•‘
β•‘  β”Œβ”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”          β•‘
β•‘  β”‚Slack β”‚  β”‚ Telegram β”‚  β”‚ WhatsApp β”‚  β”‚ Discord  β”‚          β•‘
β•‘  β””β”€β”€β”¬β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”˜          β•‘
β•šβ•β•β•β•β•β•ͺ═══════════β•ͺ═════════════β•ͺ═════════════β•ͺ════════════════╝
      β”‚           β”‚             β”‚             β”‚
      β”‚ POST      β”‚ POST        β”‚ POST        β”‚ POST
      β–Ό           β–Ό             β–Ό             β–Ό
╔════════════════════════════════════════════════════════════════╗
β•‘                      WEBHOOK UNIFICADO                         β•‘
β•‘                     FastAPI (/webhook/*)                       β•‘
β•‘  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”     β•‘
β•‘  β”‚  Router: Identifica plataforma pelo path             β”‚     β•‘
β•‘  β”‚  /slack/events β†’ SlackAdapter                        β”‚     β•‘
β•‘  β”‚  /telegram/webhook β†’ TelegramAdapter                 β”‚     β•‘
β•‘  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜     β•‘
β•šβ•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•ͺ═══════════════════════════════════╝
                             β”‚
                             β–Ό
╔════════════════════════════════════════════════════════════════╗
β•‘                    MESSAGING FRAMEWORK                         β•‘
β•‘  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”     β•‘
β•‘  β”‚              AdapterFactory                          β”‚     β•‘
β•‘  β”‚  β€’ Registra adapters via env vars                    β”‚     β•‘
β•‘  β”‚  β€’ get_adapter(platform)                             β”‚     β•‘
β•‘  β”‚  β€’ get_adapter_by_webhook_path(path)                 β”‚     β•‘
β•‘  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜     β•‘
β•‘                             β”‚                                  β•‘
β•‘  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”      β•‘
β•‘  β”‚         MessagingAdapter (Interface)                β”‚      β•‘
β•‘  β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€     β•‘
β•‘  β”‚  SlackAdapter    β”‚ TelegramAdapter β”‚ WhatsAppAdapterβ”‚      β•‘
β•‘  β”‚  βœ… ProduΓ§Γ£o     β”‚ ⚠️ Exemplo      β”‚ ⚠️ Exemplo     β”‚      β•‘
β•‘  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜     β•‘
β•‘                             β”‚                                  β•‘
β•‘  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”      β•‘
β•‘  β”‚        ConversationProcessor                        β”‚      β•‘
β•‘  β”‚  β€’ process_message(IncomingMessage, Adapter)        β”‚      β•‘
β•‘  β”‚  β€’ Feedback visual (typing, tool status)            β”‚      β•‘
β•‘  β”‚  β€’ DelegaΓ§Γ£o ao ADK Runner                          β”‚      β•‘
β•‘  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜     β•‘
β•šβ•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•ͺ═══════════════════════════════════╝
                             β”‚
                             β–Ό
╔════════════════════════════════════════════════════════════════╗
β•‘                   ADK RUNNER + AGENT                           β•‘
β•‘  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”     β•‘
β•‘  β”‚  β€’ root_agent (iFriend Agent)                        β”‚     β•‘
β•‘  β”‚  β€’ SessionService (Redis/CloudSQL)                   β”‚     β•‘
β•‘  β”‚  β€’ MemoryService (CloudSQL/Redis)                    β”‚     β•‘
β•‘  β”‚  β€’ Tools (booking, produtos, FAQ, etc.)              β”‚     β•‘
β•‘  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜     β•‘
β•šβ•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•

πŸ”„ Fluxo de Mensagem (SequΓͺncia)

πŸ‘€ UsuΓ‘rio                      Slack                Webhook              Factory           Adapter         Processor        Runner          Agent
   β”‚                              β”‚                     β”‚                    β”‚                 β”‚                β”‚               β”‚              β”‚
   │──── "OlΓ‘" ───────────────────▢│                     β”‚                    β”‚                 β”‚                β”‚               β”‚              β”‚
   β”‚                              β”‚                     β”‚                    β”‚                 β”‚                β”‚               β”‚              β”‚
   β”‚                              │─── POST /webhook/slack/events ──────────▢│                  β”‚                β”‚               β”‚              β”‚
   β”‚                              β”‚                     β”‚                    β”‚                 β”‚                β”‚               β”‚              β”‚
   β”‚                              β”‚                     │─── get_adapter_by_webhook_path() ───▢│                 β”‚               β”‚              β”‚
   β”‚                              β”‚                     β”‚                    β”‚                 β”‚                β”‚               β”‚              β”‚
   β”‚                              β”‚                     │◀──── SlackAdapter ──────────────────│                 β”‚               β”‚              β”‚
   β”‚                              β”‚                     β”‚                    β”‚                 β”‚                β”‚               β”‚              β”‚
   β”‚                              β”‚                     │────── parse_webhook_request() ──────────────────────▢│                β”‚               β”‚              β”‚
   β”‚                              β”‚                     β”‚                    β”‚                 β”‚                β”‚               β”‚              β”‚
   β”‚                              β”‚                     │◀─── IncomingMessage(platform="slack", text="OlΓ‘") ───│                β”‚               β”‚              β”‚
   β”‚                              β”‚                     β”‚                    β”‚                 β”‚                β”‚               β”‚              β”‚
   β”‚                              β”‚                     │────── process_message() ─────────────────────────────────────────────▢│               β”‚              β”‚
   β”‚                              β”‚                     β”‚                    β”‚                 β”‚                β”‚               β”‚              β”‚
   β”‚                              │◀──── "πŸ” Processando..." ────────────────────────────────────────────────────────────────────│               β”‚              β”‚
   β”‚                              β”‚                     β”‚                    β”‚                 β”‚                β”‚               β”‚              β”‚
   │◀──── "πŸ” Processando..." ────│                     β”‚                    β”‚                 β”‚                β”‚               β”‚              β”‚
   β”‚                              β”‚                     β”‚                    β”‚                 β”‚                β”‚               β”‚              β”‚
   β”‚                              β”‚                     β”‚                    β”‚                 β”‚                │──── run_async() ─────────────▢│
   β”‚                              β”‚                     β”‚                    β”‚                 β”‚                β”‚               β”‚              β”‚
   β”‚                              β”‚                     β”‚                    β”‚                 β”‚                β”‚               │─── process ──▢│
   β”‚                              β”‚                     β”‚                    β”‚                 β”‚                β”‚               β”‚              β”‚
   β”‚                              β”‚                     β”‚                    β”‚                 β”‚                │◀── Event ────────────────────│
   β”‚                              β”‚                     β”‚                    β”‚                 β”‚                β”‚               β”‚              β”‚
   β”‚                              │◀──── "πŸ” Buscando produtos..." ────────────────────────────────────────────────────────────────│               β”‚              β”‚
   β”‚                              β”‚                     β”‚                    β”‚                 β”‚                β”‚               β”‚              β”‚
   │◀──── "πŸ” Buscando..." ───────│                     β”‚                    β”‚                 β”‚                β”‚               β”‚              β”‚
   β”‚                              β”‚                     β”‚                    β”‚                 β”‚                β”‚               β”‚              β”‚
   β”‚                              β”‚                     β”‚                    β”‚                 β”‚                │◀── Final Event ──────────────│
   β”‚                              β”‚                     β”‚                    β”‚                 β”‚                β”‚               β”‚              β”‚
   β”‚                              │◀──── (delete status) ───────────────────────────────────────────────────────────────────────│               β”‚              β”‚
   β”‚                              β”‚                     β”‚                    β”‚                 β”‚                β”‚               β”‚              β”‚
   β”‚                              │◀──── OutgoingMessage("Resposta final") ──────────────────────────────────────────────────────│               β”‚              β”‚
   β”‚                              β”‚                     β”‚                    β”‚                 β”‚                β”‚               β”‚              β”‚
   │◀──── "Resposta final" ───────│                     β”‚                    β”‚                 β”‚                β”‚               β”‚              β”‚
   β”‚                              β”‚                     β”‚                    β”‚                 β”‚                β”‚               β”‚              β”‚

πŸ”Œ Estrutura de Dados (Classes)

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚   MessagingAdapter (ABC)       β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ + config: Dict                 β”‚
β”‚ + platform_name: str           β”‚
β”‚ + webhook_path: str            β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ + setup()                      β”‚
β”‚ + parse_webhook_request()      β”‚
β”‚ + send_message()               β”‚
β”‚ + format_text()                β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
             β”‚
             β”‚ extends
             β”‚
    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
    β”‚                  β”‚                  β”‚
    β–Ό                  β–Ό                  β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚SlackAdapter β”‚  β”‚TelegramAdp. β”‚  β”‚WhatsAppAdp. β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€  β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€  β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚-bot_app     β”‚  β”‚-bot         β”‚  β”‚-client      β”‚
β”‚-bot_user_id β”‚  β”‚-bot_usernameβ”‚  β”‚             β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”         β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚   IncomingMessage       β”‚         β”‚   OutgoingMessage       β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€         β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ + platform: str         β”‚         β”‚ + text: str             β”‚
β”‚ + user_id: str          β”‚         β”‚ + channel_id: str       β”‚
β”‚ + channel_id: str       β”‚         β”‚ + thread_id: str        β”‚
β”‚ + thread_id: str        β”‚         β”‚ + message_type: enum    β”‚
β”‚ + text: str             β”‚         β”‚ + metadata: dict        β”‚
β”‚ + message_type: enum    β”‚         β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
β”‚ + is_direct_message:boolβ”‚
β”‚ + metadata: dict        β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

πŸ—‚οΈ Estrutura de Arquivos (Tree)

ifriend-agents/
β”‚
β”œβ”€β”€ πŸ“ messaging/                    ← NOVO: Framework extensΓ­vel
β”‚   β”œβ”€β”€ __init__.py
β”‚   β”œβ”€β”€ base.py                      Interface abstrata
β”‚   β”œβ”€β”€ factory.py                   Factory de adaptadores
β”‚   β”œβ”€β”€ processor.py                 Processador central
β”‚   β”œβ”€β”€ README.md                    API reference
β”‚   └── πŸ“ adapters/
β”‚       β”œβ”€β”€ __init__.py
β”‚       β”œβ”€β”€ slack_adapter.py         βœ… ProduΓ§Γ£o
β”‚       β”œβ”€β”€ telegram_adapter.py      ⚠️ Exemplo
β”‚       └── whatsapp_adapter.py      ⚠️ Exemplo
β”‚
β”œβ”€β”€ πŸ“ ifriend_agent/                ← CΓ³digo do agente (inalterado)
β”‚   β”œβ”€β”€ agent.py
β”‚   β”œβ”€β”€ tools/
β”‚   β”œβ”€β”€ config/
β”‚   └── ...
β”‚
β”œβ”€β”€ πŸ“ docs/                         ← DocumentaΓ§Γ£o
β”‚   β”œβ”€β”€ MESSAGING_ARCHITECTURE.md
β”‚   β”œβ”€β”€ MESSAGING_EXAMPLES.md
β”‚   β”œβ”€β”€ MESSAGING_DIAGRAMS.md
β”‚   └── ...
β”‚
β”œβ”€β”€ πŸ“ tests/                        ← Testes
β”‚   β”œβ”€β”€ test_messaging_examples.py
β”‚   └── ...
β”‚
β”œβ”€β”€ unified_bot.py                   ← NOVO: Bot multi-plataforma
β”œβ”€β”€ slack_bot.py                     ← MANTIDO: Bot antigo
β”‚
β”œβ”€β”€ README.md                        ← README principal
β”œβ”€β”€ MIGRATION_GUIDE.md               ← Guia de migraΓ§Γ£o
β”œβ”€β”€ QUICK_REFERENCE.md               ← ReferΓͺncia rΓ‘pida
β”œβ”€β”€ REFACTORING_SUMMARY.md           ← SumΓ‘rio executivo
β”œβ”€β”€ CHANGELOG.md                     ← Changelog
β”‚
β”œβ”€β”€ requirements-messaging.txt       ← Deps opcionais
β”œβ”€β”€ .env.example                     ← Config exemplo
└── docker-compose.yml

🎯 Comparação: Antes vs Depois (Visual)

ANTES (MonolΓ­tico)

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚         slack_bot.py                β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”‚
β”‚  β”‚ β€’ Webhook handling           β”‚   β”‚
β”‚  β”‚ β€’ Parse eventos Slack        β”‚   β”‚
β”‚  β”‚ β€’ Formatar texto             β”‚   β”‚
β”‚  β”‚ β€’ Enviar mensagens           β”‚   β”‚
β”‚  β”‚ β€’ Processar com Runner       β”‚   β”‚
β”‚  β”‚ β€’ LΓ³gica de retry            β”‚   β”‚
β”‚  β”‚ β€’ Filtros de bot             β”‚   β”‚
β”‚  β”‚ β€’ Typing indicators          β”‚   β”‚
β”‚  β”‚                              β”‚   β”‚
β”‚  β”‚ πŸ”΄ TUDO MISTURADO            β”‚   β”‚
β”‚  β”‚ πŸ”΄ ACOPLADO AO SLACK         β”‚   β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

❌ Adicionar WhatsApp = Reescrever tudo

DEPOIS (Modular)

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚              unified_bot.py                           β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”‚
β”‚  β”‚ β€’ Webhook routing (APENAS)                     β”‚   β”‚
β”‚  β”‚ β€’ Health check                                 β”‚   β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
            β”‚ delega
            β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚           messaging/ (Framework)                      β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”‚
β”‚  β”‚ AdapterFactory  β”‚  β”‚ ConversationProcessor    β”‚   β”‚
β”‚  β”‚ β€’ Auto-detect   β”‚  β”‚ β€’ OrquestraΓ§Γ£o          β”‚   β”‚
β”‚  β”‚ β€’ Gerencia      β”‚  β”‚ β€’ AgnΓ³stico plataforma  β”‚   β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β”‚
β”‚                                                       β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚
β”‚  β”‚ Adapters (PlugΓ‘veis)                          β”‚  β”‚
β”‚  β”‚ β€’ SlackAdapter    βœ…                          β”‚  β”‚
β”‚  β”‚ β€’ TelegramAdapter ⚠️                          β”‚  β”‚
β”‚  β”‚ β€’ WhatsAppAdapter ⚠️                          β”‚  β”‚
β”‚  β”‚ β€’ DiscordAdapter  πŸ“‹ (futuro)                 β”‚  β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

βœ… Adicionar WhatsApp = 1 adapter (~100 linhas, 2 horas)
βœ… SeparaΓ§Γ£o clara de responsabilidades
βœ… TestΓ‘vel e extensΓ­vel

πŸ“ˆ MΓ©tricas de Sucesso

Tempo para Adicionar Nova Plataforma
────────────────────────────────────────

ANTES: β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ 16 horas
DEPOIS: β–ˆβ–ˆ 2 horas

ReduΓ§Γ£o: 87.5% ↓


Linhas de CΓ³digo Duplicado
────────────────────────────────────────

ANTES: β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ 300+ linhas
DEPOIS:  0 linhas

ReduΓ§Γ£o: 100% ↓


Webhooks NecessΓ‘rios (3 plataformas)
────────────────────────────────────────

ANTES: β–ˆβ–ˆβ–ˆ 3 webhooks
DEPOIS: β–ˆ 1 webhook

ReduΓ§Γ£o: 66% ↓

πŸš€ Roadmap Visual

2026-Q1 βœ…
β”œβ”€β”€ Multi-Platform Framework
β”œβ”€β”€ Slack Adapter (ProduΓ§Γ£o)
β”œβ”€β”€ Telegram Adapter (Exemplo)
β”œβ”€β”€ WhatsApp Adapter (Exemplo)
└── DocumentaΓ§Γ£o Completa

2026-Q2 πŸ“‹
β”œβ”€β”€ Discord Adapter
β”œβ”€β”€ Testes UnitΓ‘rios Completos
β”œβ”€β”€ CI/CD Pipeline
└── MΓ©tricas (Prometheus)

2026-Q3 πŸ“‹
β”œβ”€β”€ Microsoft Teams
β”œβ”€β”€ Rich Messages (buttons, cards)
β”œβ”€β”€ Attachments Support
└── Analytics Dashboard

2026-Q4 πŸ“‹
β”œβ”€β”€ Multi-tenancy
β”œβ”€β”€ A/B Testing Framework
β”œβ”€β”€ Voice Messages
└── i18n Support

ASCII Art criado com amor ❀️