From 8449bd04423c3f0e5b4f5c3cbb3d034940bb67d1 Mon Sep 17 00:00:00 2001 From: Rodrigo Martins Date: Thu, 9 Apr 2026 21:52:47 -0300 Subject: [PATCH] cgnat: debug Signed-off-by: Rodrigo Martins --- src/bot/handler.js | 22 +++++++++++++--------- src/topsapp/manager.js | 36 +++++++++++++++++++++++++++++++----- 2 files changed, 44 insertions(+), 14 deletions(-) diff --git a/src/bot/handler.js b/src/bot/handler.js index 4c8be2c..642abea 100644 --- a/src/bot/handler.js +++ b/src/bot/handler.js @@ -9006,7 +9006,7 @@ Digite /help para ver todos os comandos disponíveis! { parse_mode: 'Markdown' } ); - const result = await this.topsapp.obterAcessosPorEstacao( + const result = await this.topsapp.obterAcessosPorIp( session.privateIP, dataStr, dataStr @@ -9020,23 +9020,24 @@ Digite /help para ver todos os comandos disponíveis! return; } - const acessos = result.data?.dados || []; - - if (acessos.length === 0) { + if (result.total === 0) { + const extra = result.totalGeral > 0 + ? `\n\n_(${result.totalGeral} registros no período, nenhum com IP \`${session.privateIP}\`)_` + : ''; await this.bot.sendMessage(chatId, - `ℹ️ Nenhum acesso encontrado para o IP \`${session.privateIP}\` em ${dataStr}.`, + `ℹ️ Nenhum acesso encontrado para o IP \`${session.privateIP}\` em ${dataStr}.${extra}`, { parse_mode: 'Markdown' } ); return; } // Filtrar por hora se informada - let filtrados = acessos; + let filtrados = result.dados; if (horaStr) { const [hh, mm] = horaStr.split(':').map(Number); const refMs = hh * 3600000 + mm * 60000; const janela = 3600000; // ±1 hora - filtrados = acessos.filter(a => { + filtrados = result.dados.filter(a => { const inicioMatch = a.inicio ? a.inicio.match(/(\d{2}):(\d{2})/) : null; if (!inicioMatch) return true; const aMs = parseInt(inicioMatch[1]) * 3600000 + parseInt(inicioMatch[2]) * 60000; @@ -9046,7 +9047,7 @@ Digite /help para ver todos os comandos disponíveis! if (filtrados.length === 0) { await this.bot.sendMessage(chatId, - `ℹ️ Nenhum acesso encontrado para \`${session.privateIP}\` próximo às ${horaStr} em ${dataStr}.`, + `ℹ️ Nenhum acesso de \`${session.privateIP}\` próximo às ${horaStr} em ${dataStr}.\n_(${result.total} registro(s) no dia fora desse horário)_`, { parse_mode: 'Markdown' } ); return; @@ -9077,8 +9078,11 @@ Digite /help para ver todos os comandos disponíveis! } if (result.total === 0) { + const extra = result.totalGeral > 0 + ? `\n\n_(${result.totalGeral} conexões online, nenhuma com IP \`${privateIP}\`)_` + : `\n\n_(nenhuma conexão online no momento)_`; await this.bot.sendMessage(chatId, - `ℹ️ Nenhuma conexão ativa encontrada para o IP \`${privateIP}\` no momento.`, + `ℹ️ Nenhuma conexão ativa encontrada para o IP \`${privateIP}\`.${extra}`, { parse_mode: 'Markdown' } ); return; diff --git a/src/topsapp/manager.js b/src/topsapp/manager.js index acbb178..8e1a6b4 100644 --- a/src/topsapp/manager.js +++ b/src/topsapp/manager.js @@ -1330,19 +1330,38 @@ class TopSappManager { } /** - * Busca acessos por estação/IP privado CGNAT no TopSapp + * Busca acessos por data no TopSapp e filtra pelo IP privado CGNAT client-side + * (estacao = nome NAS, não o IP — por isso filtramos pelo campo `ip` da resposta) */ - async obterAcessosPorEstacao(estacao, dataInicial, dataFinal, location = '') { + async obterAcessosPorIp(privateIP, dataInicial, dataFinal, location = '') { if (!this.isReady()) { return { success: false, error: 'TopSapp não está configurado' }; } try { const credentials = this.config.getCredentialsByLocation(location); const instance = this.api.getInstanceByLocation(location); - const params = { estacao }; + const params = {}; if (dataInicial) params.dataInicial = dataInicial; if (dataFinal) params.dataFinal = dataFinal; - return await this.api.obterAcessos(params, instance, credentials); + const result = await this.api.obterAcessos(params, instance, credentials); + + if (!result.success) return result; + + const todos = result.data?.dados || []; + console.log(`🔍 CGNAT: ${todos.length} acessos retornados para o período`); + if (todos.length > 0) { + console.log(`🔍 CGNAT: campos do primeiro registro:`, Object.keys(todos[0])); + console.log(`🔍 CGNAT: amostra ip/estacao:`, todos.slice(0, 3).map(a => ({ ip: a.ip, estacao: a.estacao, usuario: a.usuario }))); + } + + const encontrados = todos.filter(a => a.ip === privateIP); + return { + success: true, + dados: encontrados, + total: encontrados.length, + totalGeral: todos.length, + instance: result.instance + }; } catch (error) { return { success: false, error: error.message }; } @@ -1350,6 +1369,7 @@ class TopSappManager { /** * Busca qual serviço está usando um IP privado CGNAT agora (conexões ativas) + * Usa ObterClientesServicos com conexao: "online" e filtra client-side pelo campo ip */ async buscarConexaoAtivaPorIp(privateIP, location = '') { if (!this.isReady()) { @@ -1363,12 +1383,18 @@ class TopSappManager { if (!result.success) return result; const todos = result.data?.dados || []; - const encontrados = todos.filter(s => s.ip === privateIP); + console.log(`🔍 CGNAT ativas: ${todos.length} conexões online retornadas`); + if (todos.length > 0) { + console.log(`🔍 CGNAT ativas: campos do primeiro registro:`, Object.keys(todos[0])); + console.log(`🔍 CGNAT ativas: amostra ip/usuario:`, todos.slice(0, 3).map(s => ({ ip: s.ip, usuario: s.usuario }))); + } + const encontrados = todos.filter(s => s.ip === privateIP); return { success: true, dados: encontrados, total: encontrados.length, + totalGeral: todos.length, instance: result.instance }; } catch (error) {