diff --git a/src/bot/handler.js b/src/bot/handler.js index 43362f2..60cf5bc 100644 --- a/src/bot/handler.js +++ b/src/bot/handler.js @@ -448,7 +448,7 @@ Digite /help para ver todos os comandos disponíveis! • "fiberhome status" - Status das conexões Fiberhome • Use "ver sinal" para interface unificada -�🔒 SEGURANÇA: +🔒 **SEGURANÇA:** 🛡️ Bot restrito a usuários autorizados 🆔 Para solicitar acesso, forneça seu ID`; @@ -2535,9 +2535,9 @@ Digite /help para ver todos os comandos disponíveis! // Se encontrou apenas um cliente, mostrar dados detalhados // Se encontrou apenas um cliente, mostrar dados detalhados const cliente = resultado.clientes[0]; - let message = `� **Cliente Encontrado**\n\n`; + let message = `👤 **Cliente Encontrado**\n\n`; message += `🆔 **ID**: \`${cliente.id}\`\n`; - message += `� **Nome**: ${cliente.nome}\n`; + message += `👤 **Nome**: ${cliente.nome}\n`; if (cliente.cpf) { message += `📄 **CPF**: \`${cliente.cpf}\`\n`; @@ -2579,6 +2579,35 @@ Digite /help para ver todos os comandos disponíveis! } } + /** + * Escapar caracteres problemáticos para Markdown do Telegram + */ + escapeMarkdown(text) { + if (!text) return text; + + // Escapar caracteres especiais que podem causar problemas no Markdown + return text.toString() + .replace(/\\/g, '\\\\') // Escape backslash + .replace(/\*/g, '\\*') // Escape asterisco + .replace(/_/g, '\\_') // Escape underscore + .replace(/\[/g, '\\[') // Escape colchete + .replace(/\]/g, '\\]') // Escape colchete + .replace(/\(/g, '\\(') // Escape parêntese + .replace(/\)/g, '\\)') // Escape parêntese + .replace(/~/g, '\\~') // Escape til + .replace(/>/g, '\\>') // Escape maior que + .replace(/#/g, '\\#') // Escape hashtag + .replace(/\+/g, '\\+') // Escape mais + .replace(/-/g, '\\-') // Escape hífen + .replace(/=/g, '\\=') // Escape igual + .replace(/\|/g, '\\|') // Escape pipe + .replace(/\{/g, '\\{') // Escape chaves + .replace(/\}/g, '\\}') // Escape chaves + .replace(/\./g, '\\.') // Escape ponto + .replace(/!/g, '\\!') // Escape exclamação + .replace(/@/g, '\\@'); // Escape arroba + } + /** * Mostrar dados cadastrais completos do cliente */ @@ -2590,9 +2619,8 @@ Digite /help para ver todos os comandos disponíveis! if (!resultado.success) { await this.bot.sendMessage(chatId, - `❌ **Erro ao buscar dados**\n\n` + - `⚠️ ${resultado.error}`, - { parse_mode: 'Markdown' } + `❌ Erro ao buscar dados\n\n` + + `⚠️ ${resultado.error}` ); return; } @@ -2600,24 +2628,34 @@ Digite /help para ver todos os comandos disponíveis! const cliente = resultado.cliente; const servicos = resultado.servicos || []; - let message = `📋 **Dados Cadastrais Completos**\n\n`; + let message = `📋 Dados Cadastrais Completos\n\n`; // Dados do cliente - message += `👤 **CLIENTE**\n`; - message += `🆔 ID: \`${cliente.id}\`\n`; - message += `👤 Nome: ${cliente.nome}\n`; + message += `👤 CLIENTE\n`; + message += `🆔 ID: ${cliente.id}\n`; + message += `👤 Nome: ${cliente.nome || 'Não informado'}\n`; if (cliente.cpf) { message += `📄 CPF: \`${cliente.cpf}\`\n`; } if (cliente.rg) { - message += `📄 RG: \`${cliente.rg}\`\n`; + message += `📄 RG: ${cliente.rg}\n`; } message += `📧 Email: ${cliente.email || 'Não informado'}\n`; - message += `📞 Telefone: ${cliente.telefone || 'Não informado'}\n`; - message += `📱 Celular: ${cliente.celular || 'Não informado'}\n`; + + if (cliente.telefone && cliente.telefone !== 'Não informado') { + message += `📞 Telefone: \`${cliente.telefone}\`\n`; + } else { + message += `📞 Telefone: Não informado\n`; + } + + if (cliente.celular && cliente.celular !== 'Não informado') { + message += `📱 Celular: \`${cliente.celular}\`\n`; + } else { + message += `📱 Celular: Não informado\n`; + } // Endereço if (cliente.endereco) { @@ -2651,27 +2689,27 @@ Digite /help para ver todos os comandos disponíveis! message += `📝 Observações: ${cliente.observacoes}\n`; } - message += `\n🌐 **Instância**: ${resultado.instancia}\n\n`; + message += `\n🌐 Instância: ${resultado.instancia}\n\n`; // Dados dos serviços if (servicos.length > 0) { - message += `⚙️ **SERVIÇOS CONTRATADOS**\n\n`; + message += `⚙️ SERVIÇOS CONTRATADOS\n\n`; servicos.forEach((servico, index) => { - message += `📦 **Serviço ${index + 1}**\n`; + message += `📦 Serviço ${index + 1}\n`; message += `🏷️ Plano: ${servico.planoNome}\n`; message += `📊 Status: ${servico.statusFormatado}\n`; if (servico.login) { - message += `👤 Login: \`${servico.login}\`\n`; + message += `👤 Login: ${servico.login}\n`; } if (servico.senha) { - message += `🔑 Senha: \`${servico.senha}\`\n`; + message += `🔑 Senha: ${servico.senha}\n`; } if (servico.ip) { - message += `🌐 IP: \`${servico.ip}\`\n`; + message += `🌐 IP: ${servico.ip}\n`; } if (servico.vencimento) { @@ -2682,7 +2720,7 @@ Digite /help para ver todos os comandos disponíveis! message += `💰 Valor: R$ ${parseFloat(servico.valor).toFixed(2)}\n`; } - message += `� Tecnologia: ${servico.tecnologia}\n`; + message += `🔧 Tecnologia: ${servico.tecnologia}\n`; if (servico.velocidade_down) { message += `⬇️ Download: ${servico.velocidade_down} Mbps\n`; @@ -2694,7 +2732,7 @@ Digite /help para ver todos os comandos disponíveis! // Dados FTTH - usando campos reais da API if (servico.tecnologia === 'FTTH' || servico.pon || servico.serial) { - message += `\n📡 **Dados FTTH:**\n`; + message += `\n📡 Dados FTTH:\n`; if (servico.base || servico.id_ap) { message += `🔌 Base/AP: ${servico.base || `AP ${servico.id_ap}`}\n`; @@ -2717,7 +2755,7 @@ Digite /help para ver todos os comandos disponíveis! } if (servico.ultimo_rx_power) { - message += `� Último RX: ${servico.ultimo_rx_power} dBm\n`; + message += `📶 Último RX: ${servico.ultimo_rx_power} dBm\n`; } if (servico.ultimo_tx_power) { @@ -2734,21 +2772,21 @@ Digite /help para ver todos os comandos disponíveis! } if (servico.ultimo_acesso) { - message += `� Último acesso: ${servico.ultimo_acesso}\n`; + message += `🕐 Último acesso: ${servico.ultimo_acesso}\n`; } if (servico.ultimo_ip) { - message += `🌐 Último IP: \`${servico.ultimo_ip}\`\n`; + message += `🌐 Último IP: ${servico.ultimo_ip}\n`; } } // Dados de instalação if (servico.instalacao_endereco) { - message += `\n📍 **Endereço de Instalação:**\n`; + message += `\n📍 Endereço de Instalação:\n`; message += `🏠 ${servico.instalacao_endereco}, ${servico.instalacao_numero || 'S/N'}\n`; if (servico.instalacao_complemento) { - message += `� Complemento: ${servico.instalacao_complemento}\n`; + message += `📝 Complemento: ${servico.instalacao_complemento}\n`; } message += `🏘️ ${servico.instalacao_bairro}, ${servico.instalacao_cidade}/${servico.instalacao_uf}\n`; @@ -2765,7 +2803,7 @@ Digite /help para ver todos os comandos disponíveis! message += `\n`; }); } else { - message += `⚙️ **SERVIÇOS**: Nenhum serviço encontrado\n\n`; + message += `⚙️ SERVIÇOS: Nenhum serviço encontrado\n\n`; } // Botões de ação @@ -2780,19 +2818,34 @@ Digite /help para ver todos os comandos disponíveis! ] ]; - await this.bot.sendMessage(chatId, message, { - parse_mode: 'Markdown', - reply_markup: { - inline_keyboard: keyboard - } - }); + console.log('📝 Enviando dados do cliente'); + + try { + await this.bot.sendMessage(chatId, message, { + parse_mode: 'Markdown', + reply_markup: { + inline_keyboard: keyboard + } + }); + } catch (telegramError) { + console.error('❌ Erro de Markdown no Telegram:', telegramError.message); + console.log('🔧 Enviando sem Markdown como fallback...'); + + // Fallback: enviar sem Markdown, removendo apenas os backticks + const fallbackMessage = message.replace(/`/g, ''); + + await this.bot.sendMessage(chatId, fallbackMessage, { + reply_markup: { + inline_keyboard: keyboard + } + }); + } } catch (error) { console.error('❌ Erro ao buscar dados do cliente:', error); await this.bot.sendMessage(chatId, - `❌ **Erro ao buscar dados do cliente**\n\n` + - `⚠️ ${error.message}`, - { parse_mode: 'Markdown' } + `❌ Erro ao buscar dados do cliente\n\n` + + `⚠️ ${error.message}` ); } }