<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>GUARDIAN</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.10.5/font/bootstrap-icons.css">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha3/dist/css/bootstrap.min.css">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0-beta3/css/all.min.css" integrity="sha512-Fo3rlrZj/k7ujTnHg4CGR2D7kSs0v4LLanw2qksYuRlEzO+tcaEPQogQ0KaoGN26/zrn20ImR1DfuLWnOo7aBA==" crossorigin="anonymous" referrerpolicy="no-referrer" />
<script src="https://cdn.tailwindcss.com">
<link rel="stylesheet" href="css.css">
</script>
<style>
@import url('https://fonts.googleapis.com/css2?family=Be+Vietnam+Pro:wght@400;500;600;700&family=Outfit:wght@100;200;300;400;500;600;700&display=swap');
:root {
/*Editar o modal*/
--btn-modal: #0000003f;
--btn-border: 1px solid #4071FF;
--btn-modal-border: 50px;
--modal-shadow: #ffffff;
--modal-bg: #171e2e;
--modal-icon: #fff;
--config-color: #0000003f;
--category-color: #0000003f;
--text-color: #ffffff;
/*Editar Layout*/
--fundo: #ffffff;
--topo: #F7F7FC;
--icon: #4071FF;
--icon-bg: #E5EAFC;
--config: #F7F7FC;
--box-border: 1px solid #C0C6DE;
--box-bg: transparent;
--box-icon: black;
--info1: #C0C6DE;
--info2: #4071FF;
}
body {
font-family: 'Be Vietnam Pro', sans-serif;
background: var(--fundo);
height: 100vh;
width: 100vw;
justify-content: center;
align-items: center;
}
.container {
display: flex;
flex-direction: row;
justify-content: space-between;
background: var(--topo);
width: 100vw;
padding: 0 auto;
}
button.power-icon {
font-size: 2.5em;
box-shadow: 0 20px 25px 0px #4071ff54, 0 2px 0px 0px #4071ff10;
}
.app-bg-gray-1 {
background: var(--config);
}
.app-bg-gray-2 {
background: var(--icon-bg);
}
.app-bg-gray-3 {
background: #fff;
}
.app-bg-4 {
background: linear-gradient(-45deg, #13cf8e, #13cf8e, #0098ff, #5995fd);
background-size: 400% 400%;
animation: gradient 5s ease infinite;
}
@keyframes gradient {
0% {
background-position: 0% 50%;
}
50% {
background-position: 100% 50%;
}
100% {
background-position: 0% 50%;
}
}
.app-bg-blue {
background: #4071FF;
}
.app-color-blue {
color: #4071FF;
}
.app-color-gray-1 {
color: #C0C6DE;
}
.app-rounded {
border-bottom-left-radius: 50px;
border-bottom-right-radius: 50px;
}
.status {
font-size: 1em;
}
.put {
border-radius: 60px;
}
.icon {
font-size: 0.8em;
color: var(--box-icon);
}
input {
width: 100%;
background: transparent;
border: none;
outline: none;
color: var(--box-typing);
line-height: 1;
font-weight: 600;
font-size: 1.1rem;
}
.box {
border: var(--box-border);
background: var(--box-bg);
}
.tool {
align-items: center;
justify-content: center;
text-align: center;
}
.tool-bt {
background: var(--btn-modal);
height: 50px;
width: 150px;
border: var(--btn-border);
}
.info {
color: var(--info2);
}
.info1 {
color: var(--info1);
}
.info2 {
color: var(--modal-icon);
}
.info3 {
font-size: 1.2em;
color: var(--icon);
}
.modal {
backdrop-filter: blur(5px);
-webkit-backdrop-filter: blur(5px);
}
.modal-content {
border: none;
background: var(--modal-bg);
box-shadow: 0 5px 10px var(--modal-shadow);
color: var(--text-color);
}
.modal-dialog {
padding: 0 0.5rem;
}
.bg-category {
background: var(--category-color);
}
.bg-config {
background: var(--config-color);
}
.btn{
width: 150px;
background-color: #171e2e;
outline: none;
height: 49px;
border-radius: var(--btn-modal-border);
text-transform: uppercase;
font-weight: 600;
margin: 10px 0;
cursor: pointer;
transition: 0.5s;
border: var(--btn-border);
}
</style>
</head>
<body class="h-screen">
<div class="container px-6 pt-10 pb-44 app-rounded">
<button class="app-bg-blue h-12 rounded-2xl py-2 px-5 text-white" onclick="ToolsModal.show()"><i class="bi bi-list-nested mr-2"></i>Mais</button>
<button class="put w-12 h-12 app-bg-gray-2 rounded-2xl place-items-center p-2" onclick="DtStartAppUpdate.execute()"><i class="info3 bi bi-arrow-repeat"></i></button>
<button class="put w-12 h-12 app-bg-gray-2 rounded-2xl place-items-center p-2" onclick="loggerModal.show()"><i class="info3 bi bi-file-earmark-text"></i></button>
</div>
<div class="flex flex-row items-center justify-center -top-32 relative">
<div class="w-56 h-56 app-bg-gray-3 rounded-full items-center justify-center flex">
<div class="w-44 h-44 app-bg-4 rounded-full flex justify-center items-center">
<button class="fa-solid fa-power-off bg-white app-color-blue rounded-full p-10 power-icon" onclick="startStopVpn()"></button>
</div>
</div>
</div>
<div class="flex flex-col -top-36 relative">
<div class="py-3 flex flex-row justify-center items-center">
<span class="app-color-gray-1 mr-2">INSIRA SEU LOGIN</span>
<i class="fa-solid fa-check app-color-gray-1"></i>
</div>
<div class="box d-flex gap-2 justify-content-center mb-1 mt-1 flex flex-row items-center px-6 py-2.5 mx-6 rounded-xl app-bg-gray-1 border-2">
<i class="icon fa fa-cogs"></i>
<input type="text" placeholder="CONFIG." disabled id="config">
<i class="icon fa fa-angle-double-down"></i>
</div>
<div class="box d-flex gap-2 justify-content-center mb-2 mt-1 items-center px-6 py-2 mx-6 rounded-xl border-slate-150 border-2">
<i class="icon fa fa-user"></i>
<input type="text" placeholder="Nome de usuario" id="username">
</div>
<div class="box d-flex gap-2 justify-content-center items-center px-6 py-2 mx-6 rounded-xl border-slate-150 border-2">
<i class="icon fa fa-lock"></i>
<input type="text" placeholder="Senha" id="password">
<i class="icon fa fa-eye" onclick="password.type==`text`?password.type = `password`:password.type = `text`"></i>
</div>
<div class="d-flex gap-2 justify-content-center mb-2 mt-1 flex flex-row items-center px-6 py-2 mx-6 rounded-xl border-slate-150 border-2">
<i class="icon fa fa-lock"></i>
<input type="text" placeholder="V2ray UUID" id="uuid">
<i class="icon fa fa-eye" onclick="uuid.type==`text`?uuid.type = `password`:uuid.type = `text`"></i>
</div>
<div class="flex flex-row items-center justify-center mt-4">
<span class="status app-color-blue font-semibold" id="state">DESCONECTADO</span>
</div>
<div class="flex flex-row items-center justify-center mt-2">
<i class="info1 fa-solid fa-rss app-color-gray-1 mr-2"></i>
<span class="info1 font-semibold text-xs mr-2" id="name">REDE</span>
<span class="info font-semibold text-xs" id="ip">127.0.0.1</span>
</div>
<div class="flex flex-row items-center justify-center mt-1">
<i class="info1 fa-solid fa-user app-color-gray-1 mr-2"></i>
<span class="info font-semibold text-xs" id="total">00</span>
</div>
</div>
</div>
<div class="modal fade" id="configModal">
<div class="modal-dialog modal-dialog-centered" role="document">
<div class="modal-content rounded-3 shadow">
<div class="modal-header border-bottom-0 pb-0">
<h1 class="modal-title fs-5" style="color: var(--text-color);">CONFIGURAÇÕES</h1>
<button class="btn-close btn-close-white" data-bs-dismiss="modal"></button>
</div>
<div class="modal-body p-1 text-center">
<ul class="list-group bg-transparent overflow-y-auto config-body" style="max-height: 600px;"></ul>
</div>
</div>
</div>
</div>
<div class="modal fade" id="loggerModal">
<div class="modal-dialog modal-dialog-centered" role="document">
<div class="modal-content rounded-3 shadow">
<div class="modal-body p-1 text-center">
<ul class="list-group bg-transparent overflow-y-auto logger-content" style="max-height: 600px;">
</ul>
</div>
<div class="modal-footer flex-nowrap p-0">
<button class="btn btn-primary w-100 clear-logger" style="background-color:var(--btn-modal);">LIMPAR</button>
<button type="button" class="btn btn-primary w-100" data-bs-dismiss="modal" style="background-color: var(--btn-modal);">FECHAR</button>
</div>
</div>
</div>
</div>
<div class="tool webm modal fade" index="-1" id="ToolsModal">
<div class="modal-dialog modal-dialog-centered" role="document">
<div class="modal-content">
<div class="tool modal-header">
<h5 class="modal-title" style="color:#ffffff;">FERRAMENTAS</h5>
</div>
<div class="modal-body">
<button class="tool-bt rounded-2xl text-white" onclick="DtStartCheckUser.execute()"><i class="info2 bi bi-calendar-check mr-2"></i>VALIDADE</button>
</div>
<div class="modal-body">
<button class="tool-bt rounded-2xl text-white" data-bs-target="#speedTestModal" data-bs-toggle="modal"><i class="info2 bi bi-speedometer mr-2"></i>SPEEDTEST</button>
<button class="tool-bt rounded-2xl text-white" onclick="DtStartWebViewActivity.execute('https://t.me/DTunnelGroup')"><i class="info2 bi bi-globe mr-2"></i>WEBVIEW</button>
</div>
<div class="modal-body">
<button class="tool-bt rounded-2xl text-white" onclick="DtStartApnActivity.execute()"><i class="info2 bi bi-wifi mr-2"></i>APN</button>
<button class="tool-bt rounded-2xl text-white" onclick="DtIgnoreBatteryOptimizations.execute()"><i class="info2 bi bi-battery-full mr-2"></i>BATERIA</button>
</div>
<div class="modal-body">
<button class="tool-bt rounded-2xl text-white" onclick="DtCleanApp.execute()"><i class="info2 bi bi-trash3 mr-2"></i>LIMPAR</button>
</div>
<div class="tool modal-footer">
<button type="button" class="btn btn-primary" data-bs-dismiss="modal" style="background-color: var(--btn-modal);">FECHAR</button>
</div>
</div>
</div>
</div>
<div class="modal fade" id="checkUserModal" index="1">
<div class="modal-dialog modal-dialog-centered" role="document">
<div class="modal-content rounded-3 shadow">
<div class="modal-header border-bottom-0 pb-0">
<h1 class="modal-title fs-5 chk-title text-light"></h1>
<button class="btn-close btn-close-white" data-bs-dismiss="modal"></button>
</div>
<div class="modal-body text-center">
<p class="fs-5 mb-0 chk-message text-light"></p>
</div>
</div>
</div>
</div>
<div class="md modal fade" id="speedTestModal">
<div class="md modal-dialog modal-dialog-centered" role="document">
<div class="md modal-content rounded-3 shadow">
<div class="md modal-header border-bottom-0 py-3">
<button class="btn-close btn-close-white" data-bs-dismiss="modal"
aria-label="Close"></button>
</div>
<div class="modal-body ratio rounded-bottom-3" style="height: 600px;">
<div class="spinner d-flex w-100 h-100 align-items-center justify-content-center">
<div class="spinner-border text-light p-5" role="status">
<span class="visually-hidden">Loading...</span>
</div>
</div>
<iframe class="rounded-bottom-3" id="speedFrame"></iframe>
</div>
</div>
</div>
</div>
<script type="text/javascript" src="bootstrap.js"></script>
<script>
const logoImg = document.getElementById("logoImg");
const configModalButton = document.getElementById("configModalButton");
const user = document.getElementById("user");
const pass = document.getElementById("password");
const startOrStopButton = document.getElementById("startOrStopButton");
const updateButton = document.getElementById("updateButton");
const loggerButton = document.getElementById("loggerButton");
const state = document.getElementById("state");
const operadora = document.getElementById("Operadora");
operadora.innerHTML = "Operadora: " + app.getOperadoraEmUso();
// setTema();
const version = document.getElementById("Version");
version.innerHTML = "Versão da config: " + app.getVersion();
function loadLogs() {
var logList = document.getElementById("logList");
var logs = JSON.parse(app.getlogs())
var formattedLogs = '';
logs.forEach(item => {
formattedLogs += '<li class="list-group-item bg-transparent p-0 border-0 text-start ms-2 text-wrap" style="font-size: 12px; color: var(--text-color);">';
formattedLogs += item.TIME;
formattedLogs += '</li>';
});
logList.innerHTML = '<ul class="list-group">' + formattedLogs + '</ul>';
}
var modal = new bootstrap.Modal(document.getElementById('configModal'));
const serverOptions = document.getElementById('serverOptions');
var servers = JSON.parse(app.getJsonServers());
function createServerCard(server) {
const card = document.createElement('div');
card.classList.add('set-configs');
card.style.backgroundColor = server.ConfigColor;
var configImage = document.createElement('img');
configImage.src = server.ConfigImage;
const cardBody = document.createElement('div');
cardBody.classList.add('card-body');
const cardTitle = document.createElement('h5');
cardTitle.classList.add('card-title');
const configName = document.createElement('span');
configName.textContent = server.ConfigName;
cardTitle.appendChild(configImage);
cardTitle.appendChild(configName);
cardBody.appendChild(cardTitle);
card.appendChild(cardBody);
card.addEventListener('click', function () {
selectServer(server);
});
return card;
}
function selectServer(server) {
configModalButton.value = server.ConfigName;
app.returnConfigId(server.ConfigId);
localStorage.setItem('configSelecionada', JSON.stringify(server));
modal.hide();
}
servers.forEach(function (server) {
const card = createServerCard(server);
serverOptions.appendChild(card);
});
function startOrStop() {
if (user.value != "" && pass.value != "") {
localStorage.setItem('usuario', user.value);
localStorage.setItem('senha', pass.value);
app.setUserAndPass(user.value, pass.value);
}
app.startOrStop();
}
var previousLogs = [];
function checkAndLoadLogs() {
var logs = JSON.parse(app.getlogs());
if (!arraysAreEqual(logs, previousLogs)) {
previousLogs = logs;
loadLogs();
}
}
function arraysAreEqual(arr1, arr2) {
if (arr1.length !== arr2.length) {
return false;
}
for (var i = 0; i < arr1.length; i++) {
if (arr1[i].TIME !== arr2[i].TIME) {
return false;
}
}
return true;
}
async function startCheckuser() {
try {
const dataString = await app.getCheckuserDados();
console.log("CHECKUSER: " + dataString);
if (dataString !== "null") {
const data = JSON.parse(dataString);
var myModal = new bootstrap.Modal(document.getElementById('checkuserModal'));
myModal.show();
const strCheckValidade =
`Usuario: <span style="color: green;">${data.username}</span><br/>
Expira em: <span style="color: green;">${data.expiration_date}</span><br/>
Dias Restantes: <span style="color: green;">${data.expiration_days}</span><br/>
Conectados: <span style="color: green;">${data.count_connection} / ${data.limiter_user}</span>`;
document.getElementById('checkuser').innerHTML = strCheckValidade;
}
} catch (error) {
console.error("Erro ao buscar dados do usuário:", error);
}
}
var previousState = null;
function updateState() {
var currentState = app.getState();
if (currentState !== previousState) {
if (currentState == "Conectado") {
state.innerHTML = "<span style='color: green;'>"+ currentState +"</span>";
startCheckuser();
startOrStopButton.innerText = "Parar VPN"
} else if (currentState == "Iniciando" || currentState == "Autenticando" || currentState == "Conectando") {
state.innerHTML = "<span style='color: orange;'>" + currentState + "</span>";
startOrStopButton.innerText = "Parar VPN"
} else if (currentState == "Reconectando" || currentState == "Desconectado") {
state.innerHTML = "<span style='color: red;'>" + currentState + "</span>";
} else {
state.innerHTML = "<span style='color: orange;'>" + currentState + "</span>";
startOrStopButton.innerText = "Iniciar VPN"
}
previousState = currentState;
}
}
setInterval(function() {
updateState();
checkAndLoadLogs();
}, 0);
logoImg.src = app.getLogoUrl();
document.body.style.backgroundImage = `url('${app.getBackUrl()}')`;
document.body.style.backgroundSize = 'cover';
document.body.style.backgroundRepeat = 'no-repeat';
document.body.style.backgroundPosition = 'center';
document.addEventListener("DOMContentLoaded", function () {
// Verificar se há usuário e senha salvos no localStorage
const usuarioSalvo = localStorage.getItem('usuario');
const senhaSalva = localStorage.getItem('senha');
const configSalva = localStorage.getItem('configSelecionada');
if (configSalva) {
const configSelecionada = JSON.parse(configSalva);
// Atualize a interface do usuário com a configuração salva
configModalButton.value = configSelecionada.ConfigName;
// Você pode fazer outras ações relacionadas à configuração aqui, se necessário
}
if (usuarioSalvo && senhaSalva) {
// Preencher os campos de usuário e senha com os valores salvos
user.value = usuarioSalvo;
pass.value = senhaSalva;
}
});
</script>
</body>
</html>