// Cache para respostas HTTP
let httpCache = {};
function requestHTTP(url, onSuccess, onError) {
// Verifica se os dados já estão no cache
if (httpCache[url]) {
onSuccess(httpCache[url]);
return;
}
var xhr = new XMLHttpRequest();
xhr.open('GET', url, true);
xhr.setRequestHeader("Cache-Control", "no-cache, no-store, must-revalidate");
xhr.setRequestHeader("Pragma", "no-cache");
xhr.setRequestHeader("Expires", "0");
xhr.onload = function () {
if (xhr.status == 200) {
// Armazena a resposta no cache
httpCache[url] = xhr.responseText;
onSuccess(xhr.responseText);
} else {
onError(xhr.statusText);
}
};
xhr.onerror = function () {
onError("Erro de Rede");
};
xhr.send(null);
}
function postHTTP(url, data, onSuccess, onError) {
// Cria um objeto XMLHttpRequest
var xhr = new XMLHttpRequest();
// Abre uma conexão POST com a URL fornecida
xhr.open('POST', url, true);
// Define o cabeçalho "Content-Type" para enviar dados codificados em URL
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
// Define a função de callback quando a requisição for concluída
xhr.onload = function () {
if (xhr.status == 200) {
// Se a requisição for bem-sucedida, chama a função de sucesso com a resposta
onSuccess(xhr.responseText);
} else {
// Se a requisição falhar, chama a função de erro com o status da requisição
onError(xhr.statusText);
}
};
// Define a função de callback quando ocorrer um erro de rede
xhr.onerror = function () {
onError("Erro de Rede");
};
// Envia a requisição POST com os dados fornecidos, convertidos para uma string JSON
xhr.send(JSON.stringify(data));
}
function exibirDados(json) {
// Obtém a data atual
var currentDate = new Date();
// Cria uma nova data com base na data atual
var expirationDate = new Date(currentDate);
// Adiciona o número de meses, dias e horas fornecidos aos valores da data de expiração
expirationDate.setMonth(expirationDate.getMonth() + parseInt(json.Months));
expirationDate.setDate(expirationDate.getDate() + parseInt(json.Days));
expirationDate.setHours(expirationDate.getHours() + parseInt(json.Hours));
// Formata a data de expiração para exibição
var formattedExpirationDate = expirationDate.toLocaleDateString();
// Calcula o número de dias restantes até a data de expiração
var daysRemaining = Math.ceil((expirationDate - currentDate) / (1000 * 60 * 60 * 24));
// Retorna um objeto com o vencimento formatado e os dias restantes
return {
vencimento: formattedExpirationDate,
diasRestantes: daysRemaining
};
}
var usePost = false;
// false para chkuser do SCRIPT SSHPLUS PRO
// true para chkuser do PAINEL MIRACLE ATLANTUS
function executeHTTPFunction(option, url, data, onSuccess, onError) {
// Executa a função apropriada com base na opção fornecida
if (option === 0) {
requestHTTP(url, onSuccess, onError);
} else if (option === 1) {
postHTTP(url, data, onSuccess, onError);
}
}
let modalShown = false;
function getRenewalMessage(daysRemaining) {
// Verifica se o modal já está sendo exibido
if (modalShown) {
return '';
}
// Verifica o número de dias restantes e exibe um modal se necessário
if (daysRemaining <= 3 && daysRemaining > 0) {
vuevet.constructModal('⚠️ Vencendo...', 'Seu período de acesso está prestes a terminar. Por favor, renove para continuar a utilizar nossos serviços.', 'Ok');
modalShown = true;
} else if (daysRemaining === 0) {
vuevet.constructModal('⚠️ Vence hoje...', 'Seu acesso expira nas próximas horas renove o quanto antes.', 'Ok');
modalShown = true;
} else {
return '';
}
}
function getBackgroundColorForDaysRemaining(daysRemaining) {
// Verifica o número de dias restantes e retorna uma cor de plano de fundo correspondente
if (daysRemaining === "Não disponível") {
return 'transparent';
} else if (daysRemaining <= 3) {
return '#ff0000'; // vermelho
} else if (daysRemaining <= 5) {
return '#ff9900'; // laranja
} else {
return 'transparent';
}
}
function handleModal(title, message) {
// Verifica se o modal já está sendo exibido e, se não estiver, exibe um novo modal
if (!vuevet.isModalVisible()) {
vuevet.constructModal(title, message, 'Ok');
}
}
injectValidity = function () {
let CHECK_WEB = ''; // Coloca sua URL do painel web dentro de aspas ex: 'https://seupainel.com
// Verifica se o ID do dispositivo está armazenado no localStorage
if (localStorage.getItem('m2deviceid') == null) {
// Gera uma string aleatória para o ID do dispositivo
let randomString = function (length) {
var text = "";
var possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
for (var i = 0; i < length; i++)
text += possible.charAt(Math.floor(Math.random() * possible.length));
return text;
}
// Armazena o ID do dispositivo gerado no localStorage
localStorage.setItem('m2deviceid', randomString(11));
}
let IP_CONNECTED = ['']; // IP CHKUSER DEVE FICAR ENTRE ASPAS EX: '191.0.0'
// SE FOR VARIOS IPS SEPARA COM VÍRGULA, EX ['191','192','193']
let CHECK_PORT = 5000; // PORTA CHKUSER
let mUser = localStorage.getItem('m2user');
executeHTTPFunction(1, "https://api.ipify.org?format=json", {},
function (datac) {
var json1 = JSON.parse(datac);
IP_CONNECTED = [json1.ip, ...IP_CONNECTED];
for (let i = 0; i < IP_CONNECTED.length; i++) {
// Envia uma requisição para verificar os dados do usuário
executeHTTPFunction(usePost ? 0 : 1, CHECK_WEB + '/miracle/gordon/checkuser.php', {
user: localStorage.getItem('m2user'),
password: localStorage.getItem('m2pass'),
deviceid: localStorage.getItem('m2deviceid'),
ip: IP_CONNECTED[i]
},
function (data) {
$('#sksmain').fadeOut(0);
var json = JSON.parse(data)
if (json.Status == "blockdevice") {
// Interrompe o protocolo se o dispositivo estiver bloqueado no painel web atlantus
AtlantusRouter.stopProtocol();
vuevet.constructModal('Conexões Simultâneas.', 'Identificamos que este login está sendo usado em outro dispositivo ou aplicativo. Por favor, entre em contato com o fornecedor para liberação.', 'Entendi');
return;
}
if (json.Months !== undefined && json.Days !== undefined && json.Hours !== undefined) {
// Exibe os dados do usuário
const { vencimento, diasRestantes } = exibirDados(json);
const bgColor = getBackgroundColorForDaysRemaining(diasRestantes);
const userData = document.querySelector('#dtconnection');
userData.innerHTML = `<p style="text-align:center; font-size: 16px">
<span style="font-weight:bold; color: white">👤 Usuário:</span> ${localStorage.getItem('m2user')}<br>
<span style="font-weight:bold; color: white">🗓️ Vencimento:</span> ${vencimento} <br>
<span style="font-weight:bold; color: white; background-color:${bgColor}">⏳ Dias restantes:</span> ${diasRestantes}<br>
<span style="font-weight:bold; color: white">📱 Limite de conexões:</span> ${json.Limit}<br>
${getRenewalMessage(diasRestantes)}
</p>`;
handleModal();
}
},
function (error) {
console.log("Erro ao tentar obter dados do usuário: " + error);
// Tenta obter os dados do usuário usando uma rota alternativa
executeHTTPFunction(usePost ? 0 : 1, 'http://' + IP_CONNECTED[i] + ':' + CHECK_PORT + '/check/' + mUser, {},
function (alternativeData) {
var alternativeJson = JSON.parse(alternativeData);
function checkConnectionLimit(countConnections, limitConnections) {
// Verifica se o número de conexões excede o limite permitido
if (countConnections > limitConnections) {
AtlantusRouter.stopProtocol();
vuevet.constructModal('📵 Limite de conexões.', 'O número de conexões ultrapassou o limite permitido.', 'Ok');
}
}
function updateAndShowUserData(alternativeJson) {
// Atualiza e exibe os dados do usuário
var expirationDate = alternativeJson.expiration_date || "Não disponível";
var expirationDays = alternativeJson.expiration_days || "Não disponível";
var limitConnections = alternativeJson.limit_connections || "Não disponível";
var countConnections = alternativeJson.count_connections || "Não disponível";
checkConnectionLimit(countConnections, limitConnections);
const userData = document.querySelector('#dtconnection');
const bgColor = getBackgroundColorForDaysRemaining(alternativeJson.expiration_days);
userData.innerHTML = `<p style="text-align:center; font-size: 16px">
<span style="font-weight:bold; color: white">👤 Usuário:</span> ${localStorage.getItem('m2user')}<br>
<span style="font-weight:bold; color: white">🗓️ Vencimento:</span> ${alternativeJson.expiration_date} <br>
<span style="font-weight:bold; color: white; background-color: ${bgColor}; padding: 2px 5px; border-radius: 3px;">⏳ Dias restantes:</span><span style="color: white; background-color: ${bgColor}; padding: 2px 5px; border-radius: 3px;">${alternativeJson.expiration_days}</span><br>
<span style="font-weight:bold; color: white">📱 Limite de conexões:</span> ${alternativeJson.limit_connections}/${alternativeJson.count_connections}<br>${getRenewalMessage(alternativeJson.expiration_days)}
</p>`;
}
updateAndShowUserData(alternativeJson);
// Atualiza os dados do usuário periodicamente
setInterval(function () {
requestHTTP('http://' + IP_CONNECTED[i] + ':' + CHECK_PORT + '/check/' + mUser,
function (updatedData) {
var updatedJson = JSON.parse(updatedData);
updateAndShowUserData(updatedJson);
},
function (error) {
console.error("Erro ao tentar atualizar os dados do usuário: " + error);
});
}, 300000); // Atualiza a cada 5 minutos
},
function (error) {
console.error("Erro ao tentar obter os dados do usuário: " + error);
});
});
}
},
function (error) {
console.log("Erro ao tentar obter IP: " + error);
});
}
function executeHTTPFunction(option, url, data, onSuccess, onError) {
// Executa a função apropriada com base na opção fornecida
if (option === 0) {
postHTTP(url, data, onSuccess, onError);
} else if (option === 1) {
requestHTTP(url, onSuccess, onError);
}
}
document.addEventListener('DOMContentLoaded', function () {
injectValidity();
});