Tema Dtunnel Mod 2


SUBMITTED BY: iTechNet4G

DATE: Nov. 8, 2023, 12:22 p.m.

UPDATED: March 18, 2024, 12:56 a.m.

FORMAT: Text only

SIZE: 27.0 kB

HITS: 640

  1. <!DOCTYPE html>
  2. <html lang="en">
  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>GUARDIAN</title>
  8. <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.10.5/font/bootstrap-icons.css">
  9. <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha3/dist/css/bootstrap.min.css">
  10. <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" />
  11. <script src="https://cdn.tailwindcss.com"></script>
  12. <style>
  13. @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');
  14. :root {
  15. /*Editar o modal*/
  16. --btn-modal: #0000003f;
  17. --btn-border: 1px solid #09beb586;
  18. --btn-modal-border: 50px;
  19. --modal-shadow: #ffffff;
  20. --modal-bg: #171e2e;
  21. --modal-icon: #fff;
  22. --config-color: #0000003f;
  23. --category-color: #0000003f;
  24. --text-color: #ffffff;
  25. /*Editar Layout*/
  26. --fundo: #ffffff;
  27. --topo: #09beb586;
  28. --icon: #4071FF;
  29. --icon-bg: #E5EAFC;
  30. --config: #F7F7FC;
  31. --box-border: 1px solid #C0C6DE;
  32. --box-bg: transparent;
  33. --box-icon: black;
  34. --info1: #C0C6DE;
  35. --info2: #4071FF;
  36. }
  37. body {
  38. font-family: 'Be Vietnam Pro', sans-serif;
  39. background: var(--fundo);
  40. height: 100vh;
  41. width: 100vw;
  42. justify-content: center;
  43. align-items: center;
  44. }
  45. .container {
  46. display: flex;
  47. flex-direction: row;
  48. justify-content: space-between;
  49. background: var(--topo);
  50. width: 100vw;
  51. padding: 0 auto;
  52. }
  53. button.power-icon {
  54. font-size: 2.5em;
  55. box-shadow: 0 20px 25px 0px #4071ff54, 0 2px 0px 0px #4071ff10;
  56. }
  57. .app-bg-gray-1 {
  58. background: var(--config);
  59. }
  60. .app-bg-gray-2 {
  61. background: var(--icon-bg);
  62. }
  63. .app-bg-gray-3 {
  64. background: #fff;
  65. }
  66. .app-bg-4 {
  67. background: linear-gradient(#13cf8e, #13cf8e, #0098ff, #5995fd);
  68. background-size: 400% 400%;
  69. animation: gradient 5s ease infinite;
  70. }
  71. @keyframes gradient {
  72. 0% {
  73. background-position: 0% 50%;
  74. }
  75. 50% {
  76. background-position: 100% 50%;
  77. }
  78. 100% {
  79. background-position: 0% 50%;
  80. }
  81. }
  82. .app-bg-blue {
  83. background: #4071FF;
  84. }
  85. .app-color-blue {
  86. color: #4071FF;
  87. }
  88. .app-color-gray-1 {
  89. color: #C0C6DE;
  90. }
  91. .app-rounded {
  92. border-bottom-left-radius: 50px;
  93. border-bottom-right-radius: 50px;
  94. }
  95. .status {
  96. font-size: 1em;
  97. }
  98. .put {
  99. border-radius: 60px;
  100. }
  101. .icon {
  102. font-size: 0.8em;
  103. color: var(--box-icon);
  104. }
  105. input {
  106. width: 100%;
  107. background: transparent;
  108. border: none;
  109. outline: none;
  110. color: var(--box-typing);
  111. line-height: 1;
  112. font-weight: 600;
  113. font-size: 1.1rem;
  114. }
  115. .box {
  116. border: var(--box-border);
  117. background: var(--box-bg);
  118. }
  119. .tool {
  120. align-items: center;
  121. justify-content: center;
  122. text-align: center;
  123. }
  124. .tool-bt {
  125. background: var(--btn-modal);
  126. height: 50px;
  127. width: 150px;
  128. border: var(--btn-border);
  129. }
  130. .info {
  131. color: var(--info2);
  132. }
  133. .info1 {
  134. color: var(--info1);
  135. }
  136. .info2 {
  137. color: var(--modal-icon);
  138. }
  139. .info3 {
  140. font-size: 1.2em;
  141. color: var(--icon);
  142. }
  143. .modal {
  144. backdrop-filter: blur(5px);
  145. -webkit-backdrop-filter: blur(5px);
  146. }
  147. .modal-content {
  148. border: none;
  149. background: var(--modal-bg);
  150. box-shadow: 0 5px 10px var(--modal-shadow);
  151. color: var(--text-color);
  152. }
  153. .modal-dialog {
  154. padding: 0 0.5rem;
  155. }
  156. .bg-category {
  157. background: var(--category-color);
  158. }
  159. .bg-config {
  160. background: var(--config-color);
  161. }
  162. .btn{
  163. width: 150px;
  164. background-color: #171e2e;
  165. outline: none;
  166. height: 49px;
  167. border-radius: var(--btn-modal-border);
  168. text-transform: uppercase;
  169. font-weight: 600;
  170. margin: 10px 0;
  171. cursor: pointer;
  172. transition: 0.5s;
  173. border: var(--btn-border);
  174. }
  175. </style>
  176. </head>
  177. <body class="h-screen">
  178. <div class="container px-6 pt-10 pb-44 app-rounded">
  179. <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>
  180. <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>
  181. <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>
  182. </div>
  183. <div class="flex flex-row items-center justify-center -top-32 relative">
  184. <div class="w-56 h-56 app-bg-gray-3 rounded-full items-center justify-center flex">
  185. <div class="w-44 h-44 app-bg-4 rounded-full flex justify-center items-center">
  186. <button class="fa-solid fa-power-off bg-white app-color-blue rounded-full p-10 power-icon" onclick="startStopVpn()"></button>
  187. </div>
  188. </div>
  189. </div>
  190. <div class="flex flex-col -top-36 relative">
  191. <div class="py-3 flex flex-row justify-center items-center">
  192. <span class="app-color-gray-1 mr-2">INSIRA SEU LOGIN</span>
  193. <i class="fa-solid fa-check app-color-gray-1"></i>
  194. </div>
  195. <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">
  196. <i class="icon fa fa-cogs"></i>
  197. <input type="text" placeholder="CONFIG." disabled id="config">
  198. <i class="icon fa fa-angle-double-down"></i>
  199. </div>
  200. <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">
  201. <i class="icon fa fa-user"></i>
  202. <input type="text" placeholder="Nome de usuario" id="username">
  203. </div>
  204. <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">
  205. <i class="icon fa fa-lock"></i>
  206. <input type="text" placeholder="Senha" id="password">
  207. <i class="icon fa fa-eye" onclick="password.type==`text`?password.type = `password`:password.type = `text`"></i>
  208. </div>
  209. <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">
  210. <i class="icon fa fa-lock"></i>
  211. <input type="text" placeholder="V2ray UUID" id="uuid">
  212. <i class="icon fa fa-eye" onclick="uuid.type==`text`?uuid.type = `password`:uuid.type = `text`"></i>
  213. </div>
  214. <div class="flex flex-row items-center justify-center mt-4">
  215. <span class="status app-color-blue font-semibold" id="state">DESCONECTADO</span>
  216. </div>
  217. <div class="flex flex-row items-center justify-center mt-2">
  218. <i class="info1 fa-solid fa-rss app-color-gray-1 mr-2"></i>
  219. <span class="info1 font-semibold text-xs mr-2" id="name">REDE</span>
  220. <span class="info font-semibold text-xs" id="ip">127.0.0.1</span>
  221. </div>
  222. <div class="flex flex-row items-center justify-center mt-1">
  223. <i class="info1 fa-solid fa-user app-color-gray-1 mr-2"></i>
  224. <span class="info font-semibold text-xs" id="total">00</span>
  225. </div>
  226. </div>
  227. </div>
  228. <div class="modal fade" id="configModal">
  229. <div class="modal-dialog modal-dialog-centered" role="document">
  230. <div class="modal-content rounded-3 shadow">
  231. <div class="modal-header border-bottom-0 pb-0">
  232. <h1 class="modal-title fs-5" style="color: var(--text-color);">CONFIGURAÇÕES</h1>
  233. <button class="btn-close btn-close-white" data-bs-dismiss="modal"></button>
  234. </div>
  235. <div class="modal-body p-1 text-center">
  236. <ul class="list-group bg-transparent overflow-y-auto config-body" style="max-height: 600px;"></ul>
  237. </div>
  238. </div>
  239. </div>
  240. </div>
  241. <div class="modal fade" id="loggerModal">
  242. <div class="modal-dialog modal-dialog-centered" role="document">
  243. <div class="modal-content rounded-3 shadow">
  244. <div class="modal-body p-1 text-center">
  245. <ul class="list-group bg-transparent overflow-y-auto logger-content" style="max-height: 600px;">
  246. </ul>
  247. </div>
  248. <div class="modal-footer flex-nowrap p-0">
  249. <button class="btn btn-primary w-100 clear-logger" style="background-color:var(--btn-modal);">LIMPAR</button>
  250. <button type="button" class="btn btn-primary w-100" data-bs-dismiss="modal" style="background-color: var(--btn-modal);">FECHAR</button>
  251. </div>
  252. </div>
  253. </div>
  254. </div>
  255. <div class="tool webm modal fade" index="-1" id="ToolsModal">
  256. <div class="modal-dialog modal-dialog-centered" role="document">
  257. <div class="modal-content">
  258. <div class="tool modal-header">
  259. <h5 class="modal-title" style="color:#ffffff;">FERRAMENTAS</h5>
  260. </div>
  261. <div class="modal-body">
  262. <button class="tool-bt rounded-2xl text-white" onclick="DtStartCheckUser.execute()"><i class="info2 bi bi-calendar-check mr-2"></i>VALIDADE</button>
  263. </div>
  264. <div class="modal-body">
  265. <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>
  266. <button class="tool-bt rounded-2xl text-white" onclick="DtStartWebViewActivity.execute('https://pluto.tv')"><i class="info2 bi bi-globe mr-2"></i>TV & FILMES</button>
  267. </div>
  268. <div class="modal-body">
  269. <button class="tool-bt rounded-2xl text-white" onclick="DtStartApnActivity.execute()"><i class="info2 bi bi-wifi mr-2"></i>APN</button>
  270. <button class="tool-bt rounded-2xl text-white" onclick="DtIgnoreBatteryOptimizations.execute()"><i class="info2 bi bi-battery-full mr-2"></i>BATERIA</button>
  271. </div>
  272. <div class="modal-body">
  273. <button class="tool-bt rounded-2xl text-white" onclick="DtCleanApp.execute()"><i class="info2 bi bi-trash3 mr-2"></i>LIMPAR</button>
  274. </div>
  275. <div class="tool modal-footer">
  276. <button type="button" class="btn btn-primary" data-bs-dismiss="modal" style="background-color: var(--btn-modal);">FECHAR</button>
  277. </div>
  278. </div>
  279. </div>
  280. </div>
  281. <div class="modal fade" id="checkUserModal" index="1">
  282. <div class="modal-dialog modal-dialog-centered" role="document">
  283. <div class="modal-content rounded-3 shadow">
  284. <div class="modal-header border-bottom-0 pb-0">
  285. <h1 class="modal-title fs-5 chk-title text-light"></h1>
  286. <button class="btn-close btn-close-white" data-bs-dismiss="modal"></button>
  287. </div>
  288. <div class="modal-body text-center">
  289. <p class="fs-5 mb-0 chk-message text-light"></p>
  290. </div>
  291. </div>
  292. </div>
  293. </div>
  294. <div class="md modal fade" id="speedTestModal">
  295. <div class="md modal-dialog modal-dialog-centered" role="document">
  296. <div class="md modal-content rounded-3 shadow">
  297. <div class="md modal-header border-bottom-0 py-3">
  298. <button class="btn-close btn-close-white" data-bs-dismiss="modal"
  299. aria-label="Close"></button>
  300. </div>
  301. <div class="modal-body ratio rounded-bottom-3" style="height: 600px;">
  302. <div class="spinner d-flex w-100 h-100 align-items-center justify-content-center">
  303. <div class="spinner-border text-light p-5" role="status">
  304. <span class="visually-hidden">Loading...</span>
  305. </div>
  306. </div>
  307. <iframe class="rounded-bottom-3" id="speedFrame"></iframe>
  308. </div>
  309. </div>
  310. </div>
  311. </div>
  312. <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha3/dist/js/bootstrap.min.js"></script>
  313. <script>
  314. Object.defineProperty(String.prototype, 't', {
  315. value: function t() {
  316. return window?.DtTranslateText?.execute('' + this) ?? '' + this
  317. },
  318. writable: true,
  319. configurable: true,
  320. })
  321. const config = document.querySelector('#config')
  322. config.parentElement.onclick = () => showConfigsModal();
  323. const username = document.querySelector('#username')
  324. username.oninput = e => DtUsername.set(e.target.value)
  325. const password = document.querySelector('#password')
  326. password.oninput = e => DtPassword.set(e.target.value)
  327. const uuid = document.querySelector('#uuid')
  328. uuid.oninput = e => DtUuid.set(e.target.value)
  329. const clearLogger = document.querySelector('.clear-logger')
  330. const checkUserModal = new bootstrap.Modal(document.querySelector('#checkUserModal'))
  331. const configModal = new bootstrap.Modal(document.querySelector('#configModal'))
  332. const loggerModal = new bootstrap.Modal(document.querySelector('#loggerModal'))
  333. const ToolsModal = new bootstrap.Modal(document.querySelector('#ToolsModal'))
  334. const speedTestModal = new bootstrap.Modal(document.querySelector('#speedTestModal'))
  335. const dtConfigClickListener = () => {
  336. const data = JSON.parse(window?.DtGetDefaultConfig?.execute() || `{ "auth": {"username": ""} }`)
  337. const isV2ray = data?.mode?.toLowerCase()?.startsWith('v2ray');
  338. config.placeholder = data.name ?? 'Escolha um servidor';
  339. username.parentElement.style.setProperty('display', !data?.auth?.username && !isV2ray ? 'flex' : 'none', 'important')
  340. password.parentElement.style.setProperty('display', !data?.auth?.password && !isV2ray ? 'flex' : 'none', 'important')
  341. uuid.parentElement.style.setProperty('display', !data?.auth?.v2ray_uuid && isV2ray ? 'flex' : 'none', 'important')
  342. }
  343. const startStopVpn = e => {
  344. if (DtGetVpnState.execute() != 'DISCONNECTED') {
  345. DtExecuteVpnStop.execute()
  346. } else {
  347. DtExecuteVpnStart.execute()
  348. }
  349. }
  350. clearLogger.addEventListener('click', () => DtClearLogs.execute())
  351. speedTestModal._element.addEventListener('shown.bs.modal', () => {
  352. const iframe = document.querySelector('#speedFrame');
  353. if (!iframe.src) {
  354. iframe.src = 'http://speedtest.sercomtel.com.br/'
  355. iframe.addEventListener('load', () => {
  356. mp3Modal._element.querySelector('.spinner').classList.add('d-none')
  357. })
  358. }
  359. })
  360. speedTestModal._element.addEventListener('hide.bs.modal', () => {
  361. const iframe = document.querySelector('#speedFrame');
  362. iframe.src = '';
  363. })
  364. const dtVpnStateListener = state => {
  365. const isRunning = state != 'DISCONNECTED';
  366. const status = document.querySelector('#state')
  367. status.innerHTML = ('LBL_STATE_' + state).t()
  368. if (isRunning) {
  369. username.setAttribute('readonly', 'true')
  370. password.setAttribute('readonly', 'true')
  371. status.style.color = '#00ff15'
  372. } else {
  373. username.removeAttribute('readonly')
  374. password.removeAttribute('readonly')
  375. status.style.color = 'RED'
  376. }
  377. }
  378. const dtCheckUserStartedListener = () => {
  379. const data = JSON.parse(window?.DtGetDefaultConfig?.execute() || `{}`)
  380. const isV2ray = data?.mode?.toLowerCase()?.startsWith('v2ray');
  381. if (isV2ray || !data.urlCheckUser) return;
  382. const html = `
  383. <div class="d-flex justify-content-center">
  384. <div class="spinner-border p-4" role="status">
  385. <span class="visually-hidden">Loading...</span>
  386. </div>
  387. </div>
  388. `
  389. checkUserModal._element.querySelector('.chk-title').textContent = 'CHECK USER'
  390. checkUserModal._element.querySelector('.chk-message').innerHTML = html;
  391. checkUserModal.show()
  392. }
  393. const dtCheckUserModelListener = model => {
  394. const data = JSON.parse(model ?? `{"username": "test"}`)
  395. const html = `
  396. <div class="d-flex flex-column text-white">
  397. <span>👤Nome de usuario: ${data.username}</span>
  398. <span>📆Expira em: ${data.expiration_date}</span>
  399. <span>📆Dias restantes: ${data.expiration_days}</span>
  400. <span>🚫Conexoes: ${data.count_connections}|${data.limit_connections}</span>
  401. </div>
  402. `
  403. checkUserModal._element.querySelector('.chk-title').textContent = ''
  404. checkUserModal._element.querySelector('.chk-message').innerHTML = html;
  405. checkUserModal.show()
  406. }
  407. const showConfigsModal = () => {
  408. const mock = '[{"sorter":6,"color":"#6D08041C","name":"CONFIG","id":1393,"items":[{"mode":"V2RAY - VLESS","sorter":4,"tlsVersion":"TLSv1.2","name":"CONFIG 01","icon":"https://cdn-icons-png.flaticon.com/512/8187/8187143.png","id":11803,"status":"ACTIVE"},{"mode":"SSH_DIRECT","sorter":2,"tlsVersion":"TLSv1.2","name":"CONFIG 02","icon":"https://cdn-icons-png.flaticon.com/512/8187/8187143.png","id":28627,"status":"ACTIVE"},{"mode":"OVPN_PROXY","sorter":23,"tlsVersion":"TLSv1.2","name":"CONFIG 03","icon":"https://cdn-icons-png.flaticon.com/512/8187/8187143.png","id":30001,"status":"ACTIVE"}]},{"sorter":2,"color":"#6D08041C","name":"CONFIG 2","id":1846,"items":[{"mode":"SSH_PROXY","sorter":1,"tlsVersion":"TLSv1.2","name":"CONFIG 01","icon":"https://cdn-icons-png.flaticon.com/512/8187/8187143.png","id":26295,"status":"ACTIVE"}]},{"sorter":4,"color":"#80000000","name":"CONFIG 3","id":3310,"items":[{"mode":"SSH_PROXY","sorter":1,"tlsVersion":"TLSv1.2","name":"CONFIG. TEST","icon":"https://cdn-icons-png.flaticon.com/512/8187/8187143.png","id":29997,"status":"ACTIVE"},{"mode":"OVPN_PROXY","sorter":1,"tlsVersion":"TLSv1.2","name":"CONFIG. TEST 2","icon":"https://cdn-icons-png.flaticon.com/512/8187/8187143.png","id":29998,"status":"ACTIVE"}]}]'
  409. const data = JSON.parse(window?.DtGetConfigs?.execute() || mock)
  410. data.sort((a, b) => a.sorter - b.sorter)
  411. data.forEach(item => item.items.sort((a, b) => a.sorter - b.sorter))
  412. const body = configModal._element.querySelector('.config-body')
  413. body.innerHTML = ''
  414. data.forEach(category => {
  415. const categoryElement = document.createElement('li')
  416. categoryElement.className = 'list-group-item bg-transparent border-0 mb-1 rounded-1 px-1'
  417. categoryElement.style.color = 'var(--text-color)'
  418. categoryElement.innerHTML = `<span class="fw-bold w-100 d-block p-1 rounded-1 mb-1 bg-category">${category.name}</span>`
  419. const configUlElement = document.createElement('ul')
  420. configUlElement.className = 'list-group overflow-y-auto'
  421. category.items.forEach(item => {
  422. const configElement = document.createElement('li')
  423. configElement.className = 'list-group-item d-flex border-0 bg-config rounded-2 px-1 py-2 mb-1'
  424. configElement.style.color = 'var(--text-color)'
  425. configElement.innerHTML = `
  426. <img src="${item.icon}" width="40" height="40">
  427. <div class="text-start d-flex flex-column ms-2 w-100 text-truncate">
  428. <span class="fw-bold text-uppercase" style="font-size: 0.8rem;">${item.name}</span>
  429. <span class="fst-italic fw-bold text-uppercase" style="font-size: 0.7rem;">${item.description || ''}</span>
  430. </div>
  431. <div class="d-flex flex-column ms-2">
  432. <span class="fst-italic fw-bold text-end text-uppercase text-nowrap" style="font-size: 0.8rem;">${item.mode}</span>
  433. </div>
  434. </li>
  435. `
  436. configElement.addEventListener('click', e => {
  437. window?.DtSetConfig?.execute(item.id)
  438. configModal.hide()
  439. })
  440. configUlElement.appendChild(configElement)
  441. })
  442. categoryElement.appendChild(configUlElement)
  443. body.appendChild(categoryElement)
  444. })
  445. configModal.show()
  446. }
  447. const dtOnNewLogListener = () => {
  448. const mock = [];
  449. for (let i = 0; i < 30; i++) {
  450. mock.push({ 'TIME': 'MESSAGE ' + i })
  451. }
  452. const log = window?.DtGetLogs?.execute() || JSON.stringify(mock)
  453. const data = JSON.parse(log)
  454. let content = '';
  455. data.forEach(item => {
  456. content += '<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);">';
  457. content += Object.keys(item)[0] + " " + item[Object.keys(item)]
  458. content += '</li>';
  459. })
  460. loggerModal._element.querySelector('.logger-content').innerHTML = content;
  461. const listGroup = loggerModal._element.querySelector('.list-group')
  462. listGroup.scrollTo(0, listGroup.scrollHeight)
  463. }
  464. username.value = window?.DtUsername?.get() ?? ''
  465. password.value = window?.DtPassword?.get() ?? ''
  466. uuid.value = window?.DtUuid?.get() ?? ''
  467. dtOnNewLogListener()
  468. dtConfigClickListener()
  469. dtVpnStateListener(window?.DtGetVpnState?.execute() ?? 'DISCONNECTED')
  470. </script>
  471. <script>
  472. const config = JSON.parse(DtGetAppConfig.execute());
  473. const urlCheckUser = new URL(config.urlCheckUser);
  474. urlCheckUser.protocol = 'http:';
  475. const createConnection = () => new WebSocket(urlCheckUser);
  476. const startActions = socket => {
  477. socket.send(JSON.stringify({
  478. action: 'all',
  479. data: {}
  480. }));
  481. }
  482. const parseResponseData = data => {
  483. data = JSON.parse(data);
  484. console.log(data)
  485. if (data.total != undefined) {
  486. const total = data.total;
  487. document.getElementById('total').innerHTML = String(total).padStart(2, '0');
  488. }
  489. }
  490. const startSocket = () => {
  491. const socket = createConnection();
  492. socket.onopen = e => startActions(socket);
  493. socket.onmessage = e => parseResponseData(e.data);
  494. }
  495. const setVpnState = state => {
  496. if (state == 'CONNECTED') startSocket();
  497. }
  498. startSocket();
  499. </script>
  500. <script>
  501. class AndroidMock {
  502. static getLocalIP() {
  503. return '192.168.0.1';
  504. }
  505. static getConfig() {
  506. return JSON.stringify({
  507. urlCheckUser: 'URLAQUI'
  508. });
  509. }
  510. static getNetworkName() {
  511. return 'REDE';
  512. }
  513. static openRadioInfo() {
  514. console.log('openRadioInfo');
  515. }
  516. }
  517. </script>
  518. <script>
  519. function showLocalIP(android) {
  520. console.log(android.getNetworkName());
  521. document.getElementById('name').innerHTML = ' ' + android.getNetworkName() + ':';
  522. document.getElementById('ip').innerHTML = android.getLocalIP();
  523. setInterval(() => {
  524. document.getElementById('name').innerHTML =
  525. ' ' + android.getNetworkName() + ':';
  526. document.getElementById('ip').innerHTML = android.getLocalIP();
  527. }, 2000)
  528. }
  529. function showCheckUser(android) {
  530. const config = JSON.parse(window?.DtGetDefaultConfig?.execute() ?? android.getConfig());
  531. const urlCheckUser = new URL(config.urlCheckUser);
  532. urlCheckUser.protocol = 'ws:';
  533. const socket = new WebSocket(urlCheckUser);
  534. socket.onopen = function (e) {
  535. socket.send(JSON.stringify({
  536. action: 'all',
  537. data: {}
  538. }));
  539. };
  540. socket.onmessage = function (event) {
  541. const data = JSON.parse(event.data);
  542. if (data.total === undefined)
  543. return;
  544. const total = data.total;
  545. document.getElementById('total').innerHTML = ' ' + String(total).padStart(2, '0');
  546. socket.close();
  547. };
  548. }
  549. window.onload = function () {
  550. const android = window.Android || AndroidMock;
  551. showLocalIP(android);
  552. showCheckUser(android);
  553. }
  554. </script>
  555. </body>
  556. </html>

comments powered by Disqus