// 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 = `
👤 Usuário: ${localStorage.getItem('m2user')}
🗓️ Vencimento: ${vencimento}
⏳ Dias restantes: ${diasRestantes}
📱 Limite de conexões: ${json.Limit}
${getRenewalMessage(diasRestantes)}
👤 Usuário: ${localStorage.getItem('m2user')}
🗓️ Vencimento: ${alternativeJson.expiration_date}
⏳ Dias restantes:${alternativeJson.expiration_days}
📱 Limite de conexões: ${alternativeJson.limit_connections}/${alternativeJson.count_connections}
${getRenewalMessage(alternativeJson.expiration_days)}