cgnat: fix search topsapp active
Signed-off-by: Rodrigo Martins <rodrigo@martinsevieira.adv.br>
This commit is contained in:
1 parent
501d0ca396
commit
18e08ec6c2
3 files changed
+98
-23
No files matched your search
@@ -0,0 +1,8 @@
|
|||||||
|
{
|
||||||
|
"permissions": {
|
||||||
|
"allow": [
|
||||||
|
"Bash(node --check \"c:\\\\Users\\\\rodri\\\\build\\\\rodrigonet\\\\src\\\\bot\\\\handler.js\")",
|
||||||
|
"Bash(node --check \"c:\\\\Users\\\\rodri\\\\build\\\\rodrigonet\\\\src\\\\topsapp\\\\manager.js\")"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
+79
-19
@@ -2152,6 +2152,27 @@ Digite /help para ver todos os comandos disponíveis!
|
|||||||
await this._configurarRoteadorPorServico(chatId, userId, servico, location);
|
await this._configurarRoteadorPorServico(chatId, userId, servico, location);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
} else if (data.startsWith('cgnat_ativas_')) {
|
||||||
|
console.log(`🔍 Condição cgnat_ativas_ atendida`);
|
||||||
|
await this.bot.answerCallbackQuery(callbackQuery.id);
|
||||||
|
const privateIP = data.replace('cgnat_ativas_', '');
|
||||||
|
await this.handleCgnatConsultarAtivas(chatId, privateIP);
|
||||||
|
} else if (data.startsWith('cgnat_pedir_data_')) {
|
||||||
|
console.log(`🔍 Condição cgnat_pedir_data_ atendida`);
|
||||||
|
await this.bot.answerCallbackQuery(callbackQuery.id);
|
||||||
|
const privateIP = data.replace('cgnat_pedir_data_', '');
|
||||||
|
this.userSessions.set(userId, {
|
||||||
|
type: 'cgnat_aguardando_datetime',
|
||||||
|
privateIP,
|
||||||
|
publicIP: null,
|
||||||
|
porta: null
|
||||||
|
});
|
||||||
|
await this.bot.sendMessage(chatId,
|
||||||
|
`📅 Digite a data e hora do acesso para \`${privateIP}\`:\n` +
|
||||||
|
`Formato: \`DD/MM/AAAA HH:MM\` ou \`DD/MM/AAAA\`\n\n` +
|
||||||
|
`Ou envie *cancelar* para encerrar.`,
|
||||||
|
{ parse_mode: 'Markdown' }
|
||||||
|
);
|
||||||
} else if (data.startsWith('buscar_cgnat_user_')) {
|
} else if (data.startsWith('buscar_cgnat_user_')) {
|
||||||
console.log(`🔍 Condição buscar_cgnat_user_ atendida`);
|
console.log(`🔍 Condição buscar_cgnat_user_ atendida`);
|
||||||
await this.bot.answerCallbackQuery(callbackQuery.id);
|
await this.bot.answerCallbackQuery(callbackQuery.id);
|
||||||
@@ -8916,26 +8937,26 @@ Digite /help para ver todos os comandos disponíveis!
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const keyboard = {
|
||||||
|
inline_keyboard: [
|
||||||
|
[
|
||||||
|
{ text: '🟢 Conexões ativas agora', callback_data: `cgnat_ativas_${entry.privateIP}` },
|
||||||
|
{ text: '📅 Informar data e hora', callback_data: `cgnat_pedir_data_${entry.privateIP}` }
|
||||||
|
],
|
||||||
|
[{ text: '❌ Cancelar', callback_data: 'cancel_action' }]
|
||||||
|
]
|
||||||
|
};
|
||||||
|
|
||||||
await this.bot.sendMessage(chatId,
|
await this.bot.sendMessage(chatId,
|
||||||
`🌐 *Resultado CGNAT*\n\n` +
|
`🌐 *Resultado CGNAT*\n\n` +
|
||||||
`📡 IP Público: \`${publicIp}\`\n` +
|
`📡 IP Público: \`${publicIp}\`\n` +
|
||||||
`🔌 Porta: \`${porta}\`\n` +
|
`🔌 Porta: \`${porta}\`\n` +
|
||||||
`🖥️ IP Privado: \`${entry.privateIP}\`\n` +
|
`🖥️ IP Privado: \`${entry.privateIP}\`\n` +
|
||||||
`📊 Range de portas: \`${entry.portStart} – ${entry.portEnd}\`\n\n` +
|
`📊 Range de portas: \`${entry.portStart} – ${entry.portEnd}\`\n\n` +
|
||||||
`🔍 Deseja consultar quem usava este IP no TopSapp?\n` +
|
`🔍 Deseja consultar quem está/estava usando este IP no TopSapp?`,
|
||||||
`Digite a data e hora do acesso no formato:\n` +
|
{ parse_mode: 'Markdown', reply_markup: keyboard }
|
||||||
`\`DD/MM/AAAA HH:MM\`\n\n` +
|
|
||||||
`Ou envie *cancelar* para encerrar.`,
|
|
||||||
{ parse_mode: 'Markdown' }
|
|
||||||
);
|
);
|
||||||
|
|
||||||
this.userSessions.set(userId, {
|
|
||||||
type: 'cgnat_aguardando_datetime',
|
|
||||||
privateIP: entry.privateIP,
|
|
||||||
publicIP: publicIp,
|
|
||||||
porta
|
|
||||||
});
|
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
// Listar todos os IPs privados
|
// Listar todos os IPs privados
|
||||||
const entries = cgnatParser.lookupAll(publicIp);
|
const entries = cgnatParser.lookupAll(publicIp);
|
||||||
@@ -9031,10 +9052,49 @@ Digite /help para ver todos os comandos disponíveis!
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
let msg = `🌐 *Acessos CGNAT — \`${session.privateIP}\`*\n`;
|
const titulo = `Acessos em ${dataStr}${horaStr ? ' ± 1h de ' + horaStr : ''}`;
|
||||||
msg += `📅 Data: ${dataStr}${horaStr ? ' ± 1h de ' + horaStr : ''}\n\n`;
|
await this._exibirAcessosCgnat(chatId, session.privateIP, filtrados, titulo);
|
||||||
|
}
|
||||||
|
|
||||||
for (const a of filtrados.slice(0, 10)) {
|
/**
|
||||||
|
* Consulta conexões ATIVAS agora para o IP privado CGNAT (status: on)
|
||||||
|
*/
|
||||||
|
async handleCgnatConsultarAtivas(chatId, privateIP) {
|
||||||
|
await this.bot.sendMessage(chatId,
|
||||||
|
`🔍 Consultando conexões ativas para \`${privateIP}\`...`,
|
||||||
|
{ parse_mode: 'Markdown' }
|
||||||
|
);
|
||||||
|
|
||||||
|
const result = await this.topsapp.obterAcessosPorEstacao(privateIP, null, null, '', 'on');
|
||||||
|
|
||||||
|
if (!result.success) {
|
||||||
|
await this.bot.sendMessage(chatId,
|
||||||
|
`❌ Erro ao consultar TopSapp: ${result.error}`,
|
||||||
|
{ parse_mode: 'Markdown' }
|
||||||
|
);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const acessos = result.data?.dados || [];
|
||||||
|
|
||||||
|
if (acessos.length === 0) {
|
||||||
|
await this.bot.sendMessage(chatId,
|
||||||
|
`ℹ️ Nenhuma conexão ativa encontrada para o IP \`${privateIP}\` no momento.`,
|
||||||
|
{ parse_mode: 'Markdown' }
|
||||||
|
);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
await this._exibirAcessosCgnat(chatId, privateIP, acessos, '🟢 Conexões ativas');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Exibe os acessos CGNAT e oferece botão para ver dados do cliente
|
||||||
|
*/
|
||||||
|
async _exibirAcessosCgnat(chatId, privateIP, acessos, titulo) {
|
||||||
|
let msg = `🌐 *${titulo} — \`${privateIP}\`*\n\n`;
|
||||||
|
|
||||||
|
for (const a of acessos.slice(0, 10)) {
|
||||||
const inicio = a.inicio ? a.inicio.replace(/\.\d+.*$/, '').replace('T', ' ') : '—';
|
const inicio = a.inicio ? a.inicio.replace(/\.\d+.*$/, '').replace('T', ' ') : '—';
|
||||||
const termino = a.termino ? a.termino.replace(/\.\d+.*$/, '').replace('T', ' ') : 'ativo';
|
const termino = a.termino ? a.termino.replace(/\.\d+.*$/, '').replace('T', ' ') : 'ativo';
|
||||||
msg += `👤 *${a.usuario || '—'}*\n`;
|
msg += `👤 *${a.usuario || '—'}*\n`;
|
||||||
@@ -9044,14 +9104,14 @@ Digite /help para ver todos os comandos disponíveis!
|
|||||||
msg += '\n';
|
msg += '\n';
|
||||||
}
|
}
|
||||||
|
|
||||||
if (filtrados.length > 10) {
|
if (acessos.length > 10) {
|
||||||
msg += `_... e mais ${filtrados.length - 10} registro(s)._\n`;
|
msg += `_... e mais ${acessos.length - 10} registro(s)._\n`;
|
||||||
}
|
}
|
||||||
|
|
||||||
await this.bot.sendMessage(chatId, msg, { parse_mode: 'Markdown' });
|
await this.bot.sendMessage(chatId, msg, { parse_mode: 'Markdown' });
|
||||||
|
|
||||||
// Se encontrou usuário(s), oferecer busca de nome do cliente
|
// Se único login, oferecer busca no TopSapp
|
||||||
const logins = [...new Set(filtrados.slice(0, 10).map(a => a.usuario).filter(Boolean))];
|
const logins = [...new Set(acessos.slice(0, 10).map(a => a.usuario).filter(Boolean))];
|
||||||
if (logins.length === 1) {
|
if (logins.length === 1) {
|
||||||
const keyboard = {
|
const keyboard = {
|
||||||
inline_keyboard: [[
|
inline_keyboard: [[
|
||||||
|
|||||||
+11
-4
@@ -1332,18 +1332,25 @@ class TopSappManager {
|
|||||||
/**
|
/**
|
||||||
* Busca acessos por estação/IP privado CGNAT no TopSapp
|
* Busca acessos por estação/IP privado CGNAT no TopSapp
|
||||||
* @param {string} estacao - IP privado (ex: 100.110.0.5) ou nome da estação
|
* @param {string} estacao - IP privado (ex: 100.110.0.5) ou nome da estação
|
||||||
* @param {string} dataInicial - formato dd/mm/yyyy
|
* @param {string|null} dataInicial - formato dd/mm/yyyy (ignorado se status='on')
|
||||||
* @param {string} dataFinal - formato dd/mm/yyyy
|
* @param {string|null} dataFinal - formato dd/mm/yyyy (ignorado se status='on')
|
||||||
* @param {string} location
|
* @param {string} location
|
||||||
|
* @param {string} status - 'on' para listar apenas conexões ativas (ignora período)
|
||||||
*/
|
*/
|
||||||
async obterAcessosPorEstacao(estacao, dataInicial, dataFinal, location = '') {
|
async obterAcessosPorEstacao(estacao, dataInicial, dataFinal, location = '', status = null) {
|
||||||
if (!this.isReady()) {
|
if (!this.isReady()) {
|
||||||
return { success: false, error: 'TopSapp não está configurado' };
|
return { success: false, error: 'TopSapp não está configurado' };
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
const credentials = this.config.getCredentialsByLocation(location);
|
const credentials = this.config.getCredentialsByLocation(location);
|
||||||
const instance = this.api.getInstanceByLocation(location);
|
const instance = this.api.getInstanceByLocation(location);
|
||||||
const params = { estacao, dataInicial, dataFinal };
|
const params = { estacao };
|
||||||
|
if (status) {
|
||||||
|
params.status = status;
|
||||||
|
} else {
|
||||||
|
if (dataInicial) params.dataInicial = dataInicial;
|
||||||
|
if (dataFinal) params.dataFinal = dataFinal;
|
||||||
|
}
|
||||||
return await this.api.obterAcessos(params, instance, credentials);
|
return await this.api.obterAcessos(params, instance, credentials);
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
return { success: false, error: error.message };
|
return { success: false, error: error.message };
|
||||||
|
|||||||
Reference in new issue
Block a user