[[:templates_ai:funcionalidades:laravel:telegram_bot_passos|{{wiki:user:undo_24.png}}]]
====== Passo 01: Sistema de Rastreamento de Fluxo - Telegram Webhook ======
===== ⚠️ INSTRUÇÕES IMPORTANTES ANTES DE COMEÇAR =====
**Para evitar erros durante a implementação, siga EXATAMENTE estas etapas:**
✅ **1. Ler o template COMPLETO da página**
* Leia toda a documentação antes de começar
* Entenda o fluxo completo de implementação
* Identifique dependências entre os passos
✅ **2. Identificar TODOS os arquivos mencionados**
* Liste todos os arquivos que serão criados/modificados
* Verifique se já existem no projeto
* Anote o caminho exato de cada arquivo
✅ **3. Verificar a estrutura EXATA de cada arquivo**
* Confirme namespaces e imports corretos
* Verifique se dependências estão instaladas
* Valide sintaxe PHP antes de implementar
✅ **4. Implementar linha por linha conforme template**
* Copie o código EXATAMENTE como mostrado
* Não modifique namespaces ou imports
* Execute comandos na ordem especificada
**🚨 ATENÇÃO:**
* **NÃO pule etapas** - cada passo tem dependências
* **NÃO modifique** o código fornecido sem entender as consequências
* **SEMPRE teste** após cada implementação
* **MANTENHA backup** antes de grandes alterações
===== 📋 Visão Geral =====
Sistema de rastreamento de fluxo de mensagens que monitora a execução de métodos e gera relatórios detalhados. Depende do sistema de logging e pode ser reutilizado em outros projetos.
===== 🚀 Comando de Implementação =====
implementar sistema rastreamento fluxo telegram
===== ⚙️ Pré-requisitos =====
- **Sistema de Logging** implementado
- **Laravel** instalado
- **PHP 8.0+** configurado
===== 📁 Arquivos do Módulo =====
=== 🏗️ Contracts ===
* **`app/Contracts/MessageFlowTrackerInterface.php`**
- Interface para rastreamento de fluxo de mensagens
- Define métodos para tracking de execução
- Geração de relatórios
* **`app/Contracts/MessageTrackingInterface.php`**
- Interface para classes que precisam de tracking
- Define métodos de inicialização e finalização
=== 🔧 Services ===
* **`app/Services/MessageFlowTrackerService.php`**
- Implementação principal do rastreamento
- Cache de execuções
- Geração de relatórios
- Integração com logging
=== 🏭 Providers ===
* **`app/Providers/MessageFlowServiceProvider.php`**
- Service Provider para injeção de dependência
- Configuração de tracking
=== ⚙️ Configurações ===
* **`config/message-flow.php`**
- Configuração de rastreamento
- Timeouts e limites
- Configurações de cache
===== 🔧 Implementação Passo a Passo =====
=== Passo 1: Criar Interfaces ===
=== Passo 2: Implementar Service ===
isEnabled = config('message-flow.enabled', false);
$this->messageId = uniqid('msg_', true);
// Define o fluxo esperado para cada tipo de mensagem
$this->expectedMethods = [
'text' => [
'TelegramMessageProcessorService.processWebhookPayload',
'TelegramMessageProcessorService.processTextMessage',
'TelegramBotService.processMessage',
// UnifiedCommandSystem is the current command processor; optional to track
// 'UnifiedCommandSystem.processCommand',
// Response can be sent via keyboard or plain text; we track keyboard variant
'TelegramChannel.sendMessageWithKeyboard'
],
'voice' => [
'TelegramMessageProcessorService.processWebhookPayload',
'TelegramMessageProcessorService.processVoiceMessage',
'SpeechToTextService.convertVoiceToText',
'TelegramBotService.processMessage',
// Response can be via sendTextMessage or sendMessageWithKeyboard
'TelegramChannel.sendMessageWithKeyboard'
],
'callback_query' => [
'TelegramMessageProcessorService.processWebhookPayload',
'TelegramMessageProcessorService.processCallbackQuery',
'TelegramBotService.processCallbackQuery',
'TelegramChannel.sendTextMessage'
]
];
}
/**
* Método interno para tracking (usado pelo trait)
*/
public function trackMethodInternal(string $className, string $methodName, array $inputData = [], array $outputData = []): void
{
$this->trackMethod($className, $methodName, $inputData, $outputData);
}
/**
* Registra que um método foi executado
*/
public function trackMethod(string $className, string $methodName, array $inputData = [], array $outputData = []): void
{
if (!$this->isEnabled) return;
$methodKey = "{$className}.{$methodName}";
$startTime = microtime(true);
$this->executedMethods[] = $methodKey;
$this->methodData[$methodKey] = [
'input' => $inputData,
'output' => $outputData,
'start_time' => $startTime,
'execution_time' => 0
];
$this->timestamps[$methodKey] = $startTime;
Log::info("Message flow: Method executed", [
'message_id' => $this->messageId,
'method' => $methodKey,
'input_data' => $inputData
]);
}
/**
* Método interno para finalizar tracking (usado pelo trait)
*/
public function endMethodInternal(string $className, string $methodName, array $outputData = []): void
{
$this->endMethod($className, $methodName, $outputData);
}
/**
* Finaliza o tracking de um método
*/
public function endMethod(string $className, string $methodName, array $outputData = []): void
{
if (!$this->isEnabled) return;
$methodKey = "{$className}.{$methodName}";
if (isset($this->methodData[$methodKey])) {
$endTime = microtime(true);
$startTime = $this->methodData[$methodKey]['start_time'];
$executionTime = ($endTime - $startTime) * 1000; // em milissegundos
$this->methodData[$methodKey]['output'] = $outputData;
$this->methodData[$methodKey]['execution_time'] = $executionTime;
$this->methodData[$methodKey]['end_time'] = $endTime;
}
}
/**
* Identifica o tipo de mensagem baseado no payload
*/
public function identifyMessageType(array $payload): string
{
if (isset($payload['callback_query'])) return 'callback_query';
if (isset($payload['message']['voice'])) return 'voice';
if (isset($payload['message']['text'])) return 'text';
return 'unknown';
}
/**
* Gera relatório completo do fluxo
*/
public function generateFlowReport(array $payload): string
{
if (!$this->isEnabled) return '';
$messageType = $this->identifyMessageType($payload);
$expectedMethods = $this->expectedMethods[$messageType] ?? [];
$report = "🔄 **Rastreamento da Mensagem**\n\n";
$report .= "📋 **Informações Gerais**\n";
$report .= "• ID da Mensagem: `{$this->messageId}`\n";
$report .= "• Tipo: " . $this->getMessageTypeEmoji($messageType) . " " . strtoupper($messageType) . "\n";
$report .= "• Conteúdo: " . $this->extractMessageContent($payload) . "\n";
$report .= "• Timestamp: " . now()->format('H:i:s.u') . "\n\n";
$report .= "✅ **Métodos Executados**\n";
if (empty($this->executedMethods)) {
$report .= "❌ Nenhum método foi executado!\n\n";
} else {
foreach ($this->executedMethods as $index => $method) {
$methodData = $this->methodData[$method] ?? [];
$executionTime = $methodData['execution_time'] ?? 0;
$report .= ($index + 1) . ". **{$method}**\n";
$report .= " ⏱️ Tempo: " . round($executionTime, 2) . "ms\n";
if (!empty($methodData['input'])) {
$report .= " 📥 Entrada: " . $this->summarizeData($methodData['input']) . "\n";
}
if (!empty($methodData['output'])) {
$report .= " 📤 Saída: " . $this->summarizeData($methodData['output']) . "\n";
}
$report .= "\n";
}
}
$report .= "❌ **Métodos NÃO Executados (Esperados)**\n";
$missingMethods = array_diff($expectedMethods, $this->executedMethods);
// OR logic for response methods on text and voice messages
if ($messageType === 'text' || $messageType === 'voice') {
$responseOr = [
'TelegramChannel.sendMessageWithKeyboard',
'TelegramChannel.sendTextMessage'
];
$executedResponse = array_intersect($this->executedMethods, $responseOr);
if (!empty($executedResponse)) {
$missingMethods = array_values(array_diff($missingMethods, $responseOr));
}
}
if (empty($missingMethods)) {
$report .= "✅ Todos os métodos esperados foram executados!\n\n";
} else {
foreach ($missingMethods as $method) {
$report .= "• **{$method}** - ❌ NÃO EXECUTADO\n";
}
$report .= "\n";
}
$report .= "⚠️ **Análise do Problema**\n";
if (!empty($missingMethods)) {
$report .= "A mensagem não foi processada completamente porque:\n";
foreach ($missingMethods as $method) {
$report .= "• " . $this->explainMissingMethod($method) . "\n";
}
} else {
$report .= "Todos os métodos foram executados com sucesso.\n";
}
$report .= "\n🔧 **Dicas para Debug**\n";
$report .= "• Verifique logs do Laravel para erros\n";
$report .= "• Confirme se todos os serviços estão ativos\n";
$report .= "• Verifique permissões e configurações\n";
return $report;
}
/**
* Gera relatório resumido para o usuário
*/
public function generateUserReport(array $payload): string
{
if (!$this->isEnabled) return '';
$messageType = $this->identifyMessageType($payload);
$expectedMethods = $this->expectedMethods[$messageType] ?? [];
$missingMethods = array_diff($expectedMethods, $this->executedMethods);
// OR logic for response methods on text and voice messages
if ($messageType === 'text' || $messageType === 'voice') {
$responseOr = [
'TelegramChannel.sendMessageWithKeyboard',
'TelegramChannel.sendTextMessage'
];
$executedResponse = array_intersect($this->executedMethods, $responseOr);
if (!empty($executedResponse)) {
$missingMethods = array_values(array_diff($missingMethods, $responseOr));
}
}
if (empty($missingMethods)) {
return "✅ Sua mensagem foi processada com sucesso em todas as etapas!";
}
$report = "❌ Sua mensagem não foi processada completamente.\n\n";
$report .= "**Etapas executadas:** " . count($this->executedMethods) . "/" . count($expectedMethods) . "\n\n";
if (count($missingMethods) <= 3) {
$report .= "**Etapas que falharam:**\n";
foreach ($missingMethods as $method) {
$report .= "• " . $this->getUserFriendlyMethodName($method) . "\n";
}
} else {
$report .= "**Muitas etapas falharam** - Entre em contato com o suporte.\n";
}
$report .= "\n💡 **Sugestões:**\n";
$report .= "• Tente novamente em alguns instantes\n";
$report .= "• Use comandos simples como /start ou /help\n";
$report .= "• Se o problema persistir, contate o suporte\n";
return $report;
}
/**
* Salva o rastreamento no cache para análise posterior
*/
public function saveTrace(): void
{
if (!$this->isEnabled) return;
$trace = [
'message_id' => $this->messageId,
'executed_methods' => $this->executedMethods,
'expected_methods' => $this->expectedMethods[$this->identifyMessageType([])] ?? [],
'method_data' => $this->methodData,
'timestamps' => $this->timestamps,
'created_at' => now()->toISOString()
];
Cache::put("message_trace:{$this->messageId}", $trace, now()->addHours(24));
}
/**
* Inicia o tracking de uma nova mensagem
*/
public function startTracking(string $messageId): void
{
$this->messageId = $messageId;
$this->clearTrace();
$this->isEnabled = config('message-flow.enabled', false);
}
/**
* Finaliza o tracking e salva o trace
*/
public function endTracking(): void
{
$this->saveTrace();
$this->clearTrace();
}
/**
* Limpa o rastreamento atual
*/
public function clearTrace(): void
{
$this->executedMethods = [];
$this->methodData = [];
$this->timestamps = [];
$this->messageId = uniqid('msg_', true);
}
/**
* Verifica se o tracking está habilitado
*/
public function isEnabled(): bool
{
return $this->isEnabled;
}
/**
* Retorna os métodos executados
*/
public function getExecutedMethods(): array
{
return $this->executedMethods;
}
/**
* Retorna os métodos esperados para o tipo de mensagem
*/
public function getExpectedMethods(): array
{
$messageType = $this->identifyMessageType([]);
return $this->expectedMethods[$messageType] ?? [];
}
/**
* Retorna os dados dos métodos
*/
public function getMethodData(): array
{
return $this->methodData;
}
// Métodos auxiliares privados
private function getMessageTypeEmoji(string $type): string
{
return match($type) {
'text' => '📝',
'voice' => '🎤',
'callback_query' => '🔘',
default => '❓'
};
}
private function extractMessageContent(array $payload): string
{
if (isset($payload['message']['text'])) {
return '"' . $payload['message']['text'] . '"';
}
if (isset($payload['message']['voice'])) {
return 'Mensagem de voz';
}
if (isset($payload['callback_query']['data'])) {
return 'Callback: ' . $payload['callback_query']['data'];
}
return 'Conteúdo desconhecido';
}
private function summarizeData(array $data): string
{
if (empty($data)) return 'Sem dados';
$summary = [];
foreach ($data as $key => $value) {
if (is_string($value) && strlen($value) < 30) {
$summary[] = "$key: $value";
} elseif (is_numeric($value)) {
$summary[] = "$key: $value";
} elseif (is_bool($value)) {
$summary[] = "$key: " . ($value ? 'Sim' : 'Não');
}
}
return implode(', ', array_slice($summary, 0, 3));
}
private function explainMissingMethod(string $method): string
{
$explanations = [
'TelegramMessageProcessorService.processWebhookPayload' => 'Falha na validação inicial do payload',
'TelegramMessageProcessorService.processTextMessage' => 'Falha no processamento da mensagem de texto',
'TelegramBotService.processMessage' => 'Falha no serviço principal do bot',
'TelegramCommandParser.parseCommand' => 'Falha na interpretação do comando',
'TelegramCommandHandlerManager.handleCommand' => 'Falha no gerenciamento de comandos',
'TelegramChannel.sendTextMessage' => 'Falha no envio da resposta',
'TelegramChannel.sendMessageWithKeyboard' => 'Falha no envio da resposta',
'SpeechToTextService.convertVoiceToText' => 'Falha na conversão de voz para texto'
];
return $explanations[$method] ?? 'Método não executado por razão desconhecida';
}
private function getUserFriendlyMethodName(string $method): string
{
$names = [
'TelegramMessageProcessorService.processWebhookPayload' => 'Validação da mensagem',
'TelegramMessageProcessorService.processTextMessage' => 'Processamento do texto',
'TelegramBotService.processMessage' => 'Análise do comando',
'TelegramCommandParser.parseCommand' => 'Interpretação do comando',
'TelegramCommandHandlerManager.handleCommand' => 'Execução do comando',
'TelegramChannel.sendTextMessage' => 'Envio da resposta',
'TelegramChannel.sendMessageWithKeyboard' => 'Envio da resposta',
'SpeechToTextService.convertVoiceToText' => 'Conversão de voz'
];
return $names[$method] ?? 'Processamento da mensagem';
}
}
=== Passo 3: Criar Provider ===
app->singleton(MessageFlowTrackerInterface::class, MessageFlowTrackerService::class);
}
/**
* Bootstrap services.
*/
public function boot(): void
{
// Publica o arquivo de configuração
$this->publishes([
__DIR__.'/../../config/message-flow.php' => config_path('message-flow.php'),
], 'message-flow-config');
}
}
=== Passo 4: Configurar Message Flow ===
#config/message-flow.php
env('MESSAGE_FLOW_TRACKING_ENABLED', false),
/*
|--------------------------------------------------------------------------
| Tracking Configuration
|--------------------------------------------------------------------------
|
| Configure what and how to track in the message flow
|
*/
'tracking' => [
'log_to_file' => env('MESSAGE_FLOW_LOG_TO_FILE', false),
'send_to_user' => env('MESSAGE_FLOW_SEND_TO_USER', true),
'cache_traces' => env('MESSAGE_FLOW_CACHE_TRACES', false),
'stages_to_track' => [
'webhook_received',
'payload_validated',
'duplicate_check',
'message_processed',
'database_operations',
'external_api_calls',
'response_sent',
'error_handling'
],
'categories_to_track' => [
'system',
'validation',
'database',
'external_api',
'processing',
'response',
'error'
]
],
/*
|--------------------------------------------------------------------------
| Output Configuration
|--------------------------------------------------------------------------
|
| Configure how and where to output the tracking information
|
*/
'output' => [
'send_to_user' => env('MESSAGE_FLOW_SEND_TO_USER', true),
'log_to_file' => env('MESSAGE_FLOW_LOG_TO_FILE', false),
'store_in_database' => env('MESSAGE_FLOW_STORE_IN_DATABASE', false),
'cache_for_monitoring' => env('MESSAGE_FLOW_CACHE_FOR_MONITORING', true),
'formats' => [
'telegram' => true,
'whatsapp' => true,
'email' => true,
'console' => true
]
],
/*
|--------------------------------------------------------------------------
| Performance Configuration
|--------------------------------------------------------------------------
|
| Configure performance thresholds and monitoring
|
*/
'performance' => [
'slow_stage_threshold' => env('MESSAGE_FLOW_SLOW_THRESHOLD', 100), // milliseconds
'very_slow_stage_threshold' => env('MESSAGE_FLOW_VERY_SLOW_THRESHOLD', 500), // milliseconds
'memory_warning_threshold' => env('MESSAGE_FLOW_MEMORY_WARNING', 50), // MB
'memory_critical_threshold' => env('MESSAGE_FLOW_MEMORY_CRITICAL', 100), // MB
'track_query_count' => env('MESSAGE_FLOW_TRACK_QUERIES', true),
'track_memory_usage' => env('MESSAGE_FLOW_TRACK_MEMORY', true),
'track_execution_time' => env('MESSAGE_FLOW_TRACK_TIME', true)
],
/*
|--------------------------------------------------------------------------
| Storage Configuration
|--------------------------------------------------------------------------
|
| Configure how to store and manage tracking data
|
*/
'storage' => [
'cache_ttl' => env('MESSAGE_FLOW_CACHE_TTL', 1440), // minutes (24 hours)
'database_ttl' => env('MESSAGE_FLOW_DB_TTL', 10080), // minutes (7 days)
'file_ttl' => env('MESSAGE_FLOW_FILE_TTL', 43200), // minutes (30 days)
'max_traces_per_user' => env('MESSAGE_FLOW_MAX_TRACES', 100),
'max_stages_per_trace' => env('MESSAGE_FLOW_MAX_STAGES', 50),
'cleanup_frequency' => env('MESSAGE_FLOW_CLEANUP_FREQ', 3600), // seconds
],
/*
|--------------------------------------------------------------------------
| Report Configuration
|--------------------------------------------------------------------------
|
| Configure report generation and formatting
|
*/
'reports' => [
'user_report_enabled' => env('MESSAGE_FLOW_USER_REPORT', true),
'developer_report_enabled' => env('MESSAGE_FLOW_DEV_REPORT', true),
'performance_report_enabled' => env('MESSAGE_FLOW_PERF_REPORT', true),
'user_report_format' => env('MESSAGE_FLOW_USER_FORMAT', 'telegram'),
'developer_report_format' => env('MESSAGE_FLOW_DEV_FORMAT', 'json'),
'include_performance_insights' => env('MESSAGE_FLOW_INCLUDE_INSIGHTS', true),
'include_recommendations' => env('MESSAGE_FLOW_INCLUDE_RECOMMENDATIONS', true),
'include_error_details' => env('MESSAGE_FLOW_INCLUDE_ERRORS', true)
]
];
=== Passo 5: Registrar Provider ===
#config/app.php
'providers' => [
// ... outros providers
App\Providers\MessageFlowServiceProvider::class,
],
===== ✅ Validação do Módulo =====
=== Checklist de Implementação ===
* [ ] Interface `MessageFlowTrackerInterface` criada
* [ ] Interface `MessageTrackingInterface` criada
* [ ] Service `MessageFlowTrackerService` implementado
* [ ] Provider `MessageFlowServiceProvider` registrado
* [ ] Configuração `message-flow.php` criada
* [ ] Integração com sistema de logging
=== Comandos de Validação ===
# Verificar configuração
php artisan config:cache
php artisan config:show message-flow
# Testar tracking
php artisan tinker
# >>> $tracker = app(\App\Contracts\MessageFlowTrackerInterface::class);
# >>> $tracker->trackMethod('TestClass', 'testMethod');
# >>> $tracker->endMethod('TestClass', 'testMethod');
# >>> $tracker->generateReport();