MeuHTML


SUBMITTED BY: appcass

DATE: Sept. 13, 2023, 2:13 a.m.

UPDATED: Sept. 13, 2023, 8:02 p.m.

FORMAT: Text only

SIZE: 24.7 kB

HITS: 934

  1. <!DOCTYPE html>
  2. <html lang="pt-BR">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge" />
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  7. <title>ULKTunnel</title>
  8. <link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/npm/toastify-js/src/toastify.min.css">
  9. <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha3/dist/css/bootstrap.min.css" rel="stylesheet"
  10. integrity="sha384-KK94CHFLLe+nY2dmCWGMq91rCGa5gtU4mk92HdvYe+M/SXH301p5ILy+dN9+nJOZ" crossorigin="anonymous">
  11. <script type="text/javascript"
  12. src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha3/dist/js/bootstrap.bundle.min.js"
  13. integrity="sha384-ENjdO4Dr2bkBIFxQpeoTz1HIcje39Wm4jDKdf19U8gI4ddQ3GYNS7NTKfAdVQSZe"
  14. crossorigin="anonymous"></script>
  15. <style>
  16. @import url('https://fonts.googleapis.com/css2?family=Roboto:ital,wght@0,100;0,300;0,400;0,500;0,700;0,900;1,100;1,300;1,400;1,500;1,700;1,900&display=swap');
  17. * {
  18. margin: 0;
  19. padding: 0;
  20. box-sizing: border-box;
  21. font-family: 'Roboto', sans-serif;
  22. }
  23. body {
  24. height: 100vh;
  25. display: flex;
  26. flex-direction: column;
  27. align-items: center;
  28. justify-content: center;
  29. background-image: url("https://i.imgur.com/BFL4F9l.jpg"); /* Substitua pelo seu fundo*/
  30. background-size: cover;
  31. background-repeat: no-repeat;
  32. background-position: center;
  33. }
  34. .logo-container {
  35. display: flex;
  36. justify-content: center;
  37. }
  38. .logo-container img {
  39. /* Tamanho da logo */
  40. width: 250px;
  41. height: 250px;
  42. }
  43. .container {
  44. height: 100%;
  45. display: flex;
  46. flex-direction: column;
  47. justify-content: center;
  48. max-width: 450px;
  49. }
  50. .card2 {
  51. border-radius: 20px;
  52. margin: 10px 50px 0 50px;
  53. background-color: #0000005c;
  54. border: none;
  55. font-size: 20px;
  56. }
  57. .card {
  58. background-color: #0000005c;
  59. }
  60. .btn-light {
  61. background-color: #00000000 !important;
  62. color: #FFF;
  63. border: 1px solid #FFF; /* Adiciona a borda branca */
  64. border-radius: 20px;
  65. outline: none;
  66. margin-top: 5px;
  67. }
  68. .btn-menu {
  69. background-color: #2b2b2b !important;
  70. color: #FFF;
  71. border: 1px solid #FFF; /* Adiciona a borda branca */
  72. border-radius: 20px;
  73. outline: none;
  74. margin: 5px;
  75. }
  76. .modal-content {
  77. background-color: #0000005c;
  78. }
  79. .input-group,
  80. .form-control,
  81. .input-group-text {
  82. background-color: #00000000 !important;
  83. color: #FFF;
  84. border: 1px solid #FFF; /* Adiciona a borda branca */
  85. border-radius: 20px;
  86. outline: none;
  87. }
  88. .input-group-noborder {
  89. background-color: #00000000 !important;
  90. color: #fff;
  91. position:relative;
  92. top:4px ;
  93. padding: 0;
  94. border: none; /* Adiciona a borda branca */
  95. outline: none;
  96. }
  97. .form-control::placeholder {
  98. color: #FFF;
  99. }
  100. .form-control:focus {
  101. color: #FFF;
  102. outline: none;
  103. box-shadow: none;
  104. }
  105. .custom-card {
  106. background-color: #2a2828;
  107. border-radius: 10px;
  108. color: whitesmoke;
  109. padding: 3px;
  110. margin-bottom: 4px;
  111. }
  112. .transparent-btn {
  113. background-color: transparent;
  114. color: white;
  115. border: 2px solid white;
  116. border-radius: 0;
  117. padding: 10px 15px;
  118. cursor: pointer;
  119. }
  120. </style>
  121. </head>
  122. <body>
  123. <div class="container">
  124. <div class="logo-container">
  125. <!--Link da logo-->
  126. <img src="https://i.imgur.com/u0YW2td.png" alt="Logo do App">
  127. </div>
  128. <div class="card border-0 p-2 shadow mb-3">
  129. <div class="mb-2 shadow" id="config-area">
  130. <button type="button" id="btnmodal" class="form-control" data-bs-toggle="modal" data-bs-target="#servers">
  131. <label>Selecione uma Conexão</label>
  132. </button>
  133. </div>
  134. <div class=" mb-2 form-control shadow">
  135. <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="currentColor"
  136. class="bi bi-person" viewBox="0 0 16 16">
  137. <path
  138. d="M8 8a3 3 0 1 0 0-6 3 3 0 0 0 0 6Zm2-3a2 2 0 1 1-4 0 2 2 0 0 1 4 0Zm4 8c0 1-1 1-1 1H3s-1 0-1-1 1-4 6-4 6 3 6 4Zm-1-.004c-.001-.246-.154-.986-.832-1.664C11.516 10.68 10.289 10 8 10c-2.29 0-3.516.68-4.168 1.332-.678.678-.83 1.418-.832 1.664h10Z" />
  139. </svg>
  140. <input class="input-group-noborder" type="text" placeholder="usuario" id="username"/>
  141. </div>
  142. <div class="mb-2 form-control shadow">
  143. <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="currentColor" class="bi bi-key"
  144. viewBox="0 0 16 16">
  145. <path
  146. d="M0 8a4 4 0 0 1 7.465-2H14a.5.5 0 0 1 .354.146l1.5 1.5a.5.5 0 0 1 0 .708l-1.5 1.5a.5.5 0 0 1-.708 0L13 9.207l-.646.647a.5.5 0 0 1-.708 0L11 9.207l-.646.647a.5.5 0 0 1-.708 0L9 9.207l-.646.647A.5.5 0 0 1 8 10h-.535A4 4 0 0 1 0 8zm4-3a3 3 0 1 0 2.712 4.285A.5.5 0 0 1 7.163 9h.63l.853-.854a.5.5 0 0 1 .708 0l.646.647.646-.647a.5.5 0 0 1 .708 0l.646.647.646-.647a.5.5 0 0 1 .708 0l.646.647.793-.793-1-1h-6.63a.5.5 0 0 1-.451-.285A3 3 0 0 0 4 5z" />
  147. <path d="M4 8a1 1 0 1 1-2 0 1 1 0 0 1 2 0z" />
  148. </svg>
  149. <input class="input-group-noborder"type="password" placeholder="senha" id="password" />
  150. </div>
  151. <div class="d-flex justify-content-between">
  152. <button class="btn btn-light w-100 shadow " onclick="Connect();" id="connect">INICIAR</button>
  153. <button class="btn btn-light shadow mr-3" id="sync" style="margin-left: 3px;" onclick="Update()" >
  154. <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-arrow-repeat" viewBox="0 0 16 16">
  155. <path d="M11.534 7h3.932a.25.25 0 0 1 .192.41l-1.966 2.36a.25.25 0 0 1-.384 0l-1.966-2.36a.25.25 0 0 1 .192-.41zm-11 2h3.932a.25.25 0 0 0 .192-.41L2.692 6.23a.25.25 0 0 0-.384 0L.342 8.59A.25.25 0 0 0 .534 9z"/>
  156. <path fill-rule="evenodd" d="M8 3c-1.552 0-2.94.707-3.857 1.818a.5.5 0 1 1-.771-.636A6.002 6.002 0 0 1 13.917 7H12.9A5.002 5.002 0 0 0 8 3zM3.1 9a5.002 5.002 0 0 0 8.757 2.182.5.5 0 1 1 .771.636A6.002 6.002 0 0 1 2.083 9H3.1z"/>
  157. </svg>
  158. </button>
  159. <button class="btn btn-light shadow mr-3" onclick="Android.logsstart();" id="logger" style="margin-left: 3px;">
  160. <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-file-earmark-text" viewBox="0 0 16 16">
  161. <path d="M5.5 7a.5.5 0 0 0 0 1h5a.5.5 0 0 0 0-1h-5zM5 9.5a.5.5 0 0 1 .5-.5h5a.5.5 0 0 1 0 1h-5a.5.5 0 0 1-.5-.5zm0 2a.5.5 0 0 1 .5-.5h2a.5.5 0 0 1 0 1h-2a.5.5 0 0 1-.5-.5z"/>
  162. <path d="M9.5 0H4a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h8a2 2 0 0 0 2-2V4.5L9.5 0zm0 1v2A1.5 1.5 0 0 0 11 4.5h2V14a1 1 0 0 1-1 1H4a1 1 0 0 1-1-1V2a1 1 0 0 1 1-1h5.5z"/>
  163. </svg>
  164. </button>
  165. </div>
  166. <button onclick="ToolsModal.show()" class="mt-2 form-control shadow">Mais</button>
  167. </div>
  168. <div class="card my-3 w-100 text-center border-0 p-2 shadow fs-5 text-uppercase fw-bold" id="info"></div>
  169. <div id="checkuserDiv" class="text centered-div">
  170. </div>
  171. </div>
  172. </div>
  173. <div class="tool webm modal fade" index="-1" id="ToolsModal">
  174. <div class="modal-dialog modal-dialog-centered" role="document">
  175. <div class="modal-content">
  176. <div class="tool modal-header">
  177. <h5 class="modal-title" style="color:#ffffff;">FERRAMENTAS</h5>
  178. </div>
  179. <button class="btn btn-menu shadow" onclick="Android.abrirapn()">Abrir Apn</button>
  180. <button class="btn btn-menu shadow" onclick="Android.forcarlte()"> forçar 3g/4g/5g</button>
  181. <button class="btn btn-menu shadow" onclick="Android.abrircom('https://t.me/ExemploBot')">Link de contato</button>
  182. <button class="btn btn-menu shadow" onclick="Android.otimizacaodebatery()">Desativar otimização de bateria</button>
  183. <div class="tool modal-footer">
  184. <button type="button" class="btn btn-primary" data-bs-dismiss="modal" style="background-color: var(--btn-modal);">FECHAR</button>
  185. </div>
  186. </div>
  187. </div>
  188. </div>
  189. <div class="modal fade" tabindex="-1" role="dialog" id="servers">
  190. <div class="modal-dialog modal-dialog-centered" role="document">
  191. <div class="modal-content rounded-3 shadow">
  192. <div class="modal-header border-bottom-0 pb-0">
  193. <h1 class="modal-title fs-5 text-white">CONFIGURAÇÕES</h1>
  194. <button type="button" class="btn-close btn-close-white" data-bs-dismiss="modal"
  195. aria-label="Close"></button>
  196. </div>
  197. <div class="modal-body">
  198. <div class="modal-body">
  199. <h5 class="text-white">Selecione uma conexão:</h5>
  200. <div class="card-columns" id="serverOptions"></div>
  201. </div>
  202. </div>
  203. </div>
  204. </div>
  205. <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/toastify-js"></script>
  206. <script>
  207. const logoImg = document.getElementById("logoImg");
  208. const configModalButton = document.getElementById("configModalButton");
  209. const user = document.getElementById("user");
  210. const pass = document.getElementById("password");
  211. const startOrStopButton = document.getElementById("startOrStopButton");
  212. const updateButton = document.getElementById("updateButton");
  213. const loggerButton = document.getElementById("loggerButton");
  214. const state = document.getElementById("state");
  215. const operadora = document.getElementById("Operadora");
  216. operadora.innerHTML = "Operadora: " + app.getOperadoraEmUso();
  217. // setTema();
  218. const version = document.getElementById("Version");
  219. version.innerHTML = "Versão da config: " + app.getVersion();
  220. function loadLogs() {
  221. var logList = document.getElementById("logList");
  222. var logs = JSON.parse(app.getlogs())
  223. var formattedLogs = '';
  224. logs.forEach(item => {
  225. 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);">';
  226. formattedLogs += item.TIME;
  227. formattedLogs += '</li>';
  228. });
  229. logList.innerHTML = '<ul class="list-group">' + formattedLogs + '</ul>';
  230. }
  231. var modal = new bootstrap.Modal(document.getElementById('configModal'));
  232. const serverOptions = document.getElementById('serverOptions');
  233. var servers = JSON.parse(app.getJsonServers());
  234. function createServerCard(server) {
  235. const card = document.createElement('div');
  236. card.classList.add('set-configs');
  237. card.style.backgroundColor = server.ConfigColor;
  238. var configImage = document.createElement('img');
  239. configImage.src = server.ConfigImage;
  240. const cardBody = document.createElement('div');
  241. cardBody.classList.add('card-body');
  242. const cardTitle = document.createElement('h5');
  243. cardTitle.classList.add('card-title');
  244. const configName = document.createElement('span');
  245. configName.textContent = server.ConfigName;
  246. cardTitle.appendChild(configImage);
  247. cardTitle.appendChild(configName);
  248. cardBody.appendChild(cardTitle);
  249. card.appendChild(cardBody);
  250. card.addEventListener('click', function () {
  251. selectServer(server);
  252. });
  253. return card;
  254. }
  255. function selectServer(server) {
  256. configModalButton.value = server.ConfigName;
  257. app.returnConfigId(server.ConfigId);
  258. localStorage.setItem('configSelecionada', JSON.stringify(server));
  259. modal.hide();
  260. }
  261. servers.forEach(function (server) {
  262. const card = createServerCard(server);
  263. serverOptions.appendChild(card);
  264. });
  265. function startOrStop() {
  266. if (user.value != "" && pass.value != "") {
  267. localStorage.setItem('usuario', user.value);
  268. localStorage.setItem('senha', pass.value);
  269. app.setUserAndPass(user.value, pass.value);
  270. }
  271. app.startOrStop();
  272. }
  273. var previousLogs = [];
  274. function checkAndLoadLogs() {
  275. var logs = JSON.parse(app.getlogs());
  276. if (!arraysAreEqual(logs, previousLogs)) {
  277. previousLogs = logs;
  278. loadLogs();
  279. }
  280. }
  281. function arraysAreEqual(arr1, arr2) {
  282. if (arr1.length !== arr2.length) {
  283. return false;
  284. }
  285. for (var i = 0; i < arr1.length; i++) {
  286. if (arr1[i].TIME !== arr2[i].TIME) {
  287. return false;
  288. }
  289. }
  290. return true;
  291. }
  292. async function startCheckuser() {
  293. try {
  294. const dataString = await app.getCheckuserDados();
  295. console.log("CHECKUSER: " + dataString);
  296. if (dataString !== "null") {
  297. const data = JSON.parse(dataString);
  298. var myModal = new bootstrap.Modal(document.getElementById('checkuserModal'));
  299. myModal.show();
  300. const strCheckValidade =
  301. `Usuario: <span style="color: green;">${data.username}</span><br/>
  302. Expira em: <span style="color: green;">${data.expiration_date}</span><br/>
  303. Dias Restantes: <span style="color: green;">${data.expiration_days}</span><br/>
  304. Conectados: <span style="color: green;">${data.count_connection} / ${data.limiter_user}</span>`;
  305. document.getElementById('checkuser').innerHTML = strCheckValidade;
  306. }
  307. } catch (error) {
  308. console.error("Erro ao buscar dados do usuário:", error);
  309. }
  310. }
  311. var previousState = null;
  312. function updateState() {
  313. var currentState = app.getState();
  314. if (currentState !== previousState) {
  315. if (currentState == "Conectado") {
  316. state.innerHTML = "<span style='color: green;'>"+ currentState +"</span>";
  317. startCheckuser();
  318. startOrStopButton.innerText = "Parar VPN"
  319. } else if (currentState == "Iniciando" || currentState == "Autenticando" || currentState == "Conectando") {
  320. state.innerHTML = "<span style='color: orange;'>" + currentState + "</span>";
  321. startOrStopButton.innerText = "Parar VPN"
  322. } else if (currentState == "Reconectando" || currentState == "Desconectado") {
  323. state.innerHTML = "<span style='color: red;'>" + currentState + "</span>";
  324. } else {
  325. state.innerHTML = "<span style='color: orange;'>" + currentState + "</span>";
  326. startOrStopButton.innerText = "Iniciar VPN"
  327. }
  328. previousState = currentState;
  329. }
  330. }
  331. setInterval(function() {
  332. updateState();
  333. checkAndLoadLogs();
  334. }, 0);
  335. logoImg.src = app.getLogoUrl();
  336. document.body.style.backgroundImage = `url('${app.getBackUrl()}')`;
  337. document.body.style.backgroundSize = 'cover';
  338. document.body.style.backgroundRepeat = 'no-repeat';
  339. document.body.style.backgroundPosition = 'center';
  340. document.addEventListener("DOMContentLoaded", function () {
  341. // Verificar se há usuário e senha salvos no localStorage
  342. const usuarioSalvo = localStorage.getItem('usuario');
  343. const senhaSalva = localStorage.getItem('senha');
  344. const configSalva = localStorage.getItem('configSelecionada');
  345. if (configSalva) {
  346. const configSelecionada = JSON.parse(configSalva);
  347. // Atualize a interface do usuário com a configuração salva
  348. configModalButton.value = configSelecionada.ConfigName;
  349. // Você pode fazer outras ações relacionadas à configuração aqui, se necessário
  350. }
  351. if (usuarioSalvo && senhaSalva) {
  352. // Preencher os campos de usuário e senha com os valores salvos
  353. user.value = usuarioSalvo;
  354. pass.value = senhaSalva;
  355. }
  356. });
  357. const ToolsModal = new bootstrap.Modal(document.querySelector('#ToolsModal'))
  358. function getBackgroundImage() {
  359. return Android.linkDaImagem();
  360. }
  361. function consultaValidade() {
  362. fetch(checkuserUrl)
  363. .then(response => response.json())
  364. .then(data => {
  365. setTimeout(() => {
  366. // Formatação da data
  367. const dataParts = data.expira_em.split('/');
  368. const dataFormatada = `${dataParts[0]}/${dataParts[1]}/${dataParts[2]}`;
  369. // Montagem da string para exibição
  370. const strCheckValidade =
  371. `Usuario: <span style="color: green;">${data.usuario}</span><br/>
  372. Expira em: <span style="color: green;">${dataFormatada}</span><br/>
  373. Dias Restantes: <span style="color: green;">${data.dias_restantes}</span><br/>
  374. Conectados: <span style="color: green;">${data.conectados} / ${data.limite}</span>`;
  375. // Injeção da string na div
  376. checkuserDiv.innerHTML = strCheckValidade;
  377. }, "2000");
  378. })
  379. .catch(err => {
  380. // Imprimindo o erro no console
  381. console.log(err);
  382. });
  383. }
  384. // Função para salvar a configuração selecionada
  385. function saveSelectedConfig(server) {
  386. localStorage.setItem('selectedConfig', JSON.stringify(server));
  387. }
  388. // Função para obter a configuração selecionada armazenada
  389. function getSelectedConfig() {
  390. var selectedConfig = localStorage.getItem('selectedConfig');
  391. if (selectedConfig) {
  392. return JSON.parse(selectedConfig);
  393. }
  394. return null;
  395. }
  396. // Função para configurar a configuração selecionada
  397. function setupSelectedConfig() {
  398. var selectedConfig = getSelectedConfig();
  399. if (selectedConfig) {
  400. // Configurar a configuração selecionada como desejado
  401. // Exemplo: selecionar o servidor correspondente na interface
  402. selectServer(selectedConfig);
  403. }
  404. }
  405. // Função para salvar o usuário e a senha
  406. function saveUserAndPass() {
  407. var user = document.getElementById('username');
  408. var pass = document.getElementById('password');
  409. var userData = {
  410. username: user.value,
  411. password: pass.value
  412. };
  413. localStorage.setItem('userData', JSON.stringify(userData));
  414. }
  415. // Função para recuperar o usuário e a senha salvos
  416. function getUserAndPass() {
  417. var userData = localStorage.getItem('userData');
  418. if (userData) {
  419. return JSON.parse(userData);
  420. }
  421. return null;
  422. }
  423. // Função para configurar o usuário e a senha nos campos de entrada
  424. function setupUserAndPass() {
  425. var user = document.getElementById('username');
  426. var pass = document.getElementById('password');
  427. var userData = getUserAndPass();
  428. if (userData) {
  429. user.value = userData.username;
  430. pass.value = userData.password;
  431. }
  432. }
  433. function createServerCard(server) {
  434. var card = document.createElement('div');
  435. card.classList.add('custom-card');
  436. var cardBody = document.createElement('div');
  437. cardBody.classList.add('card-body');
  438. var cardTitle = document.createElement('h5');
  439. cardTitle.classList.add('card-title');
  440. var configImage = document.createElement('img');
  441. configImage.src = Android.aestotext(server.FLAG); // Substitua 'URL_DA_IMAGEM' pelo URL correto da imagem
  442. configImage.alt = 'Config Image';
  443. configImage.classList.add('config-image');
  444. configImage.style.width = '50px'; // Defina o tamanho da largura desejada
  445. configImage.style.height = '50px'; // Defina o tamanho da altura desejada
  446. configImage.style.marginRight = '10px';
  447. cardTitle.appendChild(configImage);
  448. var configName = document.createElement('span');
  449. configName.textContent = Android.aestotext(server.Name);
  450. cardTitle.appendChild(configName);
  451. var cardText = document.createElement('p');
  452. cardText.classList.add('card-text');
  453. cardText.textContent = server.Description;
  454. cardBody.addEventListener('click', function() {
  455. selectServer(server);
  456. saveSelectedConfig(server);
  457. });
  458. cardBody.appendChild(cardTitle);
  459. cardBody.appendChild(cardText);
  460. card.appendChild(cardBody);
  461. serverOptions.appendChild(card);
  462. }
  463. function selectServer(server) {
  464. var serverData = {
  465. servername: Android.aestotext(server.Name),
  466. serverip: server.ServerIP,
  467. checkuser: server.URLCheckuser,
  468. serverport: server.ServerPort,
  469. sslport: server.SSLPort,
  470. proxyip: server.ProxyIP,
  471. proxyport: server.ProxyPort,
  472. payload: server.Payload,
  473. sni: server.SNI,
  474. dnso: server.DnsO,
  475. dnst: server.DnsT,
  476. udp: server.UdpPort,
  477. type: server.TunnelType
  478. };
  479. var btn = document.getElementById('btnmodal');
  480. btn.textContent = serverData.servername;
  481. modal.hide();
  482. checkuserUrl = Android.aestotext(serverData.checkuser) + user.value;
  483. Android.setconfig(serverData.serverip, serverData.serverport, serverData.payload, serverData.proxyip, serverData.proxyport, serverData.sslport, serverData.sni,serverData.dnso, serverData.dnst, serverData.udp, serverData.type);
  484. }
  485. servers.forEach(function(server) {
  486. createServerCard(server);
  487. });
  488. function Connect() {
  489. saveUserAndPass();
  490. Android.usernm(user.value);
  491. Android.passw(pass.value);
  492. Android.connect_vpn();
  493. }
  494. function Update() {
  495. Android.ConfigUpdate();
  496. }
  497. function updateButtonStatus() {
  498. var status = Android.connection_status();
  499. if (status == "CONECTADO") {
  500. consultaValidade();
  501. }
  502. var buttonConfig = {
  503. AUTENTICANDO: { color: "yellow", text: "PARAR" },
  504. CONECTADO: { color: "#00f000", text: "PARAR" },
  505. PARANDO: { color: "red", text: "PARANDO" },
  506. CONECTANDO: { color: "red", text: "PARAR" },
  507. RECONECTANDO: { color: "red", text: "PARAR" },
  508. DESCONECTADO: { color: "red", text: "CONECTAR" }
  509. };
  510. var config = buttonConfig[status] || { color: "", text: "" };
  511. button_connect.textContent = config.text;
  512. if(status == "CONECTADO"){
  513. consultaValidade();
  514. }
  515. info.style.color = config.color;
  516. info.textContent = status;
  517. }
  518. updateButtonStatus();
  519. // Função para configurar a configuração selecionada ao iniciar o app
  520. function setupApp() {
  521. setupUserAndPass();
  522. setupSelectedConfig();
  523. setInterval(updateButtonStatus, 1);
  524. }
  525. // Evento DOMContentLoaded para chamar a função setupApp() quando o corpo do documento é carregado
  526. document.addEventListener('DOMContentLoaded', function() {
  527. setupApp();
  528. });
  529. </script>
  530. </body>
  531. </html>

comments powered by Disqus