layoutdt


SUBMITTED BY: icnet

DATE: Oct. 29, 2023, 3:33 a.m.

UPDATED: Nov. 2, 2023, 10:58 a.m.

FORMAT: Text only

SIZE: 40.7 kB

HITS: 508

  1. <!DOCTYPE html>
  2. <html lang="pt-BR">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  6. <script src="https://kit.fontawesome.com/64d58efce2.js" crossorigin="anonymous"></script>
  7. <link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/npm/toastify-js/src/toastify.min.css">
  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://guardianofc.github.io/css/bootstrap.min.css">
  10. <script type="text/javascript"
  11. src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha3/dist/js/bootstrap.bundle.min.js"
  12. integrity="sha384-ENjdO4Dr2bkBIFxQpeoTz1HIcje39Wm4jDKdf19U8gI4ddQ3GYNS7NTKfAdVQSZe"
  13. crossorigin="anonymous"></script>
  14. <title>Guardian</title>
  15. <style>
  16. @import url("https://fonts.googleapis.com/css2?family=Poppins:wght@200;300;400;500;600;700;800&display=swap");
  17. :root {
  18. /*Editar background*/
  19. --bg: #fff;
  20. --bg-img: url(https://i.ibb.co/2qnXWZs/20230728-173338.png);
  21. /*Editar o modal*/
  22. --btn-modal: #0000003f;
  23. --btn-modal-border: 50px;
  24. --modal-shadow: #ffffff;
  25. --modal-bg: #431F65;
  26. --config-color: #0000003f;
  27. --category-color: #0000003f;
  28. --text-color: #ffffff;
  29. /*Editar os t铆tulos e container*/
  30. --title: #fff;
  31. --title-2: #fff;
  32. --container-linear: linear-gradient(-45deg, #4481eb 0%, #04befe 100%);
  33. /*Editar a box (user/password)*/
  34. --box-color: #fff;
  35. --box-text: #fff;
  36. --box-border: 55px;
  37. --box-icon: #fff;
  38. --box-typing: #fff;
  39. /*Editar os 铆cones*/
  40. --icon: #fff;
  41. --icon-border: 50px;
  42. --icon-border-color: 1px solid #fff;
  43. --icon-pressed: #aaa;
  44. /*Editar os bot茫o start*/
  45. --btn-color: #5995fd;
  46. --btn-border: 50px;
  47. --btn-text: #fff;
  48. --btn-pressed: #4d84e2;
  49. --btn-transparent: 2px solid #fff;
  50. }
  51. * {
  52. margin: 0;
  53. padding: 0;
  54. box-sizing: border-box;
  55. }
  56. body {
  57. height: 100vh;
  58. display: flex;
  59. flex-direction: column;
  60. align-items: center;
  61. justify-content: center;
  62. }
  63. body,
  64. input {
  65. font-family: "Poppins", sans-serif;
  66. }
  67. .container {
  68. height: 100%;
  69. display: flex;
  70. flex-direction: column;
  71. justify-content: center;
  72. align-items: center;
  73. width: 100vw;
  74. position: relative;
  75. /*background: var(--bg-img) center center / cover rgb(32, 32, 32);*/
  76. background: var(--bg-img) center center / cover rgb(32, 32, 32);
  77. overflow: hidden;
  78. }
  79. .forms-container {
  80. position: absolute;
  81. width: 100%;
  82. height: 100vh;
  83. top: -3%;
  84. left: 0;
  85. }
  86. .signin-signup {
  87. position: absolute;
  88. top: 50%;
  89. transform: translate(-50%, -50%);
  90. left: 75%;
  91. width: 50%;
  92. transition: 1s 0.7s ease-in-out;
  93. display: grid;
  94. grid-template-columns: 1fr;
  95. z-index: 5;
  96. }
  97. form {
  98. display: flex;
  99. align-items: center;
  100. justify-content: center;
  101. flex-direction: column;
  102. padding: 0rem 5rem;
  103. transition: all 0.2s 0.7s;
  104. overflow: hidden;
  105. grid-column: 1 / 2;
  106. grid-row: 1 / 2;
  107. }
  108. form.sign-up-form {
  109. opacity: 0;
  110. z-index: 1;
  111. }
  112. form.sign-in-form {
  113. z-index: 2;
  114. }
  115. .title {
  116. font-size: 1.5rem;
  117. color: var(--title);
  118. margin-bottom: 10px;
  119. }
  120. .bg-input {
  121. width: 100%;
  122. background-color: transparent;
  123. margin: 10px 0;
  124. height: 55px;
  125. border-radius: var(--box-border);
  126. border: 3px solid #fff;
  127. grid-template-columns: 15% 85%;
  128. padding: 0 0.4rem;
  129. }
  130. input {
  131. width: 100%;
  132. background: transparent;
  133. border: none;
  134. outline: none;
  135. color: var(--box-typing);
  136. line-height: 1;
  137. font-weight: 600;
  138. font-size: 1.1rem;
  139. }
  140. .bg-input i.icon {
  141. color: var(--box-icon);
  142. }
  143. .bg-input input::placeholder {
  144. color: #fff;
  145. font-weight: 500;
  146. }
  147. .social-text {
  148. color: #fff;
  149. padding: 0.7rem 0;
  150. font-size: 1rem;
  151. }
  152. .social-media {
  153. display: flex;
  154. justify-content: center;
  155. }
  156. .social-icon {
  157. height: 46px;
  158. width: 46px;
  159. display: flex;
  160. justify-content: center;
  161. align-items: center;
  162. margin: 0 0.45rem;
  163. color: var(--icon);
  164. border-radius: var(--icon-border);
  165. border: var(--icon-border-color);
  166. text-decoration: none;
  167. font-size: 1.1rem;
  168. transition: 0.3s;
  169. }
  170. .social-icon:hover {
  171. color: var(--icon-pressed);
  172. border-color: var(--icon-pressed);
  173. }
  174. .btn {
  175. width: 150px;
  176. border: none;
  177. outline: none;
  178. height: 49px;
  179. border-radius: var(--btn-border);
  180. color: var(--btn-text);
  181. text-transform: uppercase;
  182. font-weight: 600;
  183. margin: 20px 0;
  184. cursor: pointer;
  185. transition: 0.5s;
  186. }
  187. .btn:hover {
  188. background-color: var(--btn-pressed);
  189. }
  190. .panels-container {
  191. position: absolute;
  192. height: 100%;
  193. width: 100%;
  194. top: 0;
  195. left: 0;
  196. display: grid;
  197. grid-template-columns: repeat(2, 1fr);
  198. }
  199. .container:before {
  200. content: "";
  201. position: absolute;
  202. height: 2000px;
  203. width: 2000px;
  204. top: -10%;
  205. right: 48%;
  206. transform: translateY(-50%);
  207. background-image: var(--container-linear);
  208. /*background-color: var(container-color)*/
  209. transition: 1.8s ease-in-out;
  210. border-radius: 50%;
  211. z-index: 6;
  212. }
  213. .image {
  214. width: 100%;
  215. transition: transform 1.1s ease-in-out;
  216. transition-delay: 0.4s;
  217. }
  218. .panel {
  219. display: flex;
  220. flex-direction: column;
  221. align-items: flex-end;
  222. justify-content: space-around;
  223. text-align: center;
  224. z-index: 6;
  225. }
  226. .left-panel {
  227. pointer-events: all;
  228. padding: 3rem 17% 2rem 12%;
  229. }
  230. .right-panel {
  231. pointer-events: none;
  232. padding: 3rem 12% 2rem 17%;
  233. }
  234. .panel .content {
  235. color: var(--title-2);
  236. transition: transform 0.9s ease-in-out;
  237. transition-delay: 0.6s;
  238. }
  239. .panel h3 {
  240. font-weight: 600;
  241. line-height: 1;
  242. font-size: 1.5rem;
  243. }
  244. .panel p {
  245. font-size: 0.95rem;
  246. padding: 0.7rem 0;
  247. }
  248. .btn.transparent {
  249. margin: 0;
  250. background: none;
  251. border: var(--btn-transparent);
  252. width: 130px;
  253. height: 41px;
  254. font-weight: 600;
  255. font-size: 0.8rem;
  256. }
  257. .right-panel .image,
  258. .right-panel .content {
  259. transform: translateX(800px);
  260. }
  261. .container.sign-up-mode:before {
  262. transform: translate(100%, -50%);
  263. right: 52%;
  264. }
  265. .container.sign-up-mode .left-panel .image,
  266. .container.sign-up-mode .left-panel .content {
  267. transform: translateX(-800px);
  268. }
  269. .container.sign-up-mode .signin-signup {
  270. left: 25%;
  271. }
  272. .container.sign-up-mode form.sign-up-form {
  273. opacity: 1;
  274. z-index: 2;
  275. }
  276. .container.sign-up-mode form.sign-in-form {
  277. opacity: 0;
  278. z-index: 1;
  279. }
  280. .container.sign-up-mode .right-panel .image,
  281. .container.sign-up-mode .right-panel .content {
  282. transform: translateX(0%);
  283. }
  284. .container.sign-up-mode .left-panel {
  285. pointer-events: none;
  286. }
  287. .container.sign-up-mode .right-panel {
  288. pointer-events: all;
  289. }
  290. @media (max-width: 870px) {
  291. .container {
  292. min-height: 800px;
  293. height: 100vh;
  294. }
  295. .signin-signup {
  296. width: 100%;
  297. top: 95%;
  298. transform: translate(-50%, -100%);
  299. transition: 1s 0.8s ease-in-out;
  300. }
  301. .signin-signup,
  302. .container.sign-up-mode .signin-signup {
  303. left: 50%;
  304. }
  305. .panels-container {
  306. grid-template-columns: 1fr;
  307. grid-template-rows: 1fr 2fr 1fr;
  308. }
  309. .panel {
  310. flex-direction: row;
  311. justify-content: space-around;
  312. align-items: center;
  313. padding: 2.5rem 8%;
  314. grid-column: 1 / 2;
  315. }
  316. .right-panel {
  317. grid-row: 3 / 4;
  318. }
  319. .left-panel {
  320. grid-row: 1 / 2;
  321. }
  322. .image {
  323. width: 200px;
  324. transition: transform 0.9s ease-in-out;
  325. transition-delay: 0.6s;
  326. }
  327. .panel .content {
  328. padding-right: 15%;
  329. transition: transform 0.9s ease-in-out;
  330. transition-delay: 0.8s;
  331. }
  332. .panel h3 {
  333. font-size: 1.2rem;
  334. }
  335. .panel p {
  336. font-size: 0.7rem;
  337. padding: 0.5rem 0;
  338. }
  339. .btn.transparent {
  340. width: 110px;
  341. height: 35px;
  342. margin-top: 5px;
  343. margin-bottom: 15px;
  344. font-size: 0.7rem;
  345. }
  346. .container:before {
  347. width: 1500px;
  348. height: 1500px;
  349. transform: translateX(-50%);
  350. left: 30%;
  351. bottom: 68%;
  352. right: initial;
  353. top: initial;
  354. transition: 2s ease-in-out;
  355. }
  356. .container.sign-up-mode:before {
  357. transform: translate(-50%, 100%);
  358. bottom: 32%;
  359. right: initial;
  360. }
  361. .container.sign-up-mode .left-panel .image,
  362. .container.sign-up-mode .left-panel .content {
  363. transform: translateY(-300px);
  364. }
  365. .container.sign-up-mode .right-panel .image,
  366. .container.sign-up-mode .right-panel .content {
  367. transform: translateY(0px);
  368. }
  369. .right-panel .image,
  370. .right-panel .content {
  371. transform: translateY(300px);
  372. }
  373. .container.sign-up-mode .signin-signup {
  374. top: 5%;
  375. transform: translate(-50%, 0);
  376. }
  377. }
  378. @media (max-width: 570px) {
  379. form {
  380. padding: 0 1.5rem;
  381. }
  382. .image {
  383. display: none;
  384. }
  385. .panel .content {
  386. padding: 0.5rem 1rem;
  387. }
  388. .container {
  389. padding: 1.5rem;
  390. }
  391. .container:before {
  392. bottom: 72%;
  393. left: 50%;
  394. }
  395. .container.sign-up-mode:before {
  396. bottom: 28%;
  397. left: 50%;
  398. }
  399. }
  400. .modal {
  401. backdrop-filter: blur(5px);
  402. -webkit-backdrop-filter: blur(5px);
  403. }
  404. .modal-content {
  405. border: none;
  406. background: var(--modal-bg);
  407. box-shadow: 0 5px 10px var(--modal-shadow);
  408. color: var(--text-color);
  409. }
  410. .modal-dialog {
  411. padding: 0 0.5rem;
  412. }
  413. .bg-category {
  414. background: var(--category-color);
  415. }
  416. .bg-config {
  417. background: var(--config-color);
  418. }
  419. .bt {
  420. width: 150px;
  421. background-color: var(--btn-modal);
  422. border: none;
  423. outline: none;
  424. height: 49px;
  425. border-radius: var(--btn-modal-border);
  426. text-transform: uppercase;
  427. font-weight: 600;
  428. margin: 10px 0;
  429. cursor: pointer;
  430. transition: 0.5s;
  431. }
  432. .d-flex {
  433. margin: 10px 15px;
  434. justify-content: center;
  435. align-items: center;
  436. }
  437. .ms-2 {
  438. margin-left: 0.5rem;
  439. }
  440. .btn {
  441. background: linear-gradient(-45deg, #8D4ED1, #431F65);
  442. background-size: 400% 400%;
  443. animation: gradient 10s ease infinite;
  444. }
  445. @keyframes gradient {
  446. 0% {
  447. background-position: 0% 50%;
  448. }
  449. 50% {
  450. background-position: 100% 50%;
  451. }
  452. 100% {
  453. background-position: 0% 50%;
  454. }
  455. }
  456. .container:before {
  457. background: linear-gradient(70deg, #8D4ED1, #431F65);
  458. background-size: 100% 100%;
  459. }
  460. @keyframes gradient {
  461. 0% {
  462. background-position: 0% 50%;
  463. }
  464. 50% {
  465. background-position: 100% 50%;
  466. }
  467. 100% {
  468. background-position: 0% 50%;
  469. }
  470. }
  471. .titulo {
  472. margin-top: 10px;
  473. }
  474. h4 {
  475. font-size: 1rem;
  476. }
  477. .img {
  478. margin: -90px;
  479. }
  480. </style>
  481. </head>
  482. <body>
  483. <div class="container">
  484. <div class="forms-container">
  485. <div class="signin-signup">
  486. <form class="sign-in-form">
  487. <div class="img">
  488. <img src="https://i.ibb.co/MM1Pw2B/20230724-165647.png" alt=""
  489. style="width: 260px; height: 260px;">
  490. </div>
  491. <div class="d-flex gap-2 justify-content-center align-items-center bg-input" id="config-area">
  492. <i class="icon fa fa-cogs"></i>
  493. <input type="text" placeholder="CONFIG." disabled id="config">
  494. <i class="icon fa fa-angle-double-down"></i>
  495. </div>
  496. <div class="d-flex gap-2 justify-content-center align-items-center bg-input">
  497. <i class="icon fa fa-user"></i>
  498. <input type="text" placeholder="Nome de usuario" id="username">
  499. </div>
  500. <div class="d-flex gap-2 justify-content-center align-items-center bg-input">
  501. <i class="icon fa fa-lock"></i>
  502. <input type="text" placeholder="Senha" id="password">
  503. <i class="icon fa fa-eye"
  504. onclick="password.type==`text`?password.type = `password`:password.type = `text`"></i>
  505. </div>
  506. <div class="d-flex gap-2 justify-content-center align-items-center bg-input">
  507. <i class="icon fa fa-lock"></i>
  508. <input type="text" placeholder="V2ray UUID" id="uuid">
  509. <i class="icon fa fa-eye"
  510. onclick="uuid.type==`text`?uuid.type = `password`:uuid.type = `text`"></i>
  511. </div>
  512. <button type="button" class="btn solid" id="start-stop">INICIAR</button>
  513. <p class="social-text" id="state" style="color: #fff;"></p>
  514. <div class="social-media">
  515. <a class="social-icon" id="sync" onclick="DtStartAppUpdate.execute()">
  516. <i class="bi bi-arrow-repeat"></i>
  517. </a>
  518. <a class="social-icon" id="logger">
  519. <i class="bi bi-file-earmark-text"></i>
  520. </a>
  521. <a class="social-icon" id="checkUser" onclick="DtStartCheckUser.execute()">
  522. <i class="bi bi-calendar2-day"></i>
  523. </a>
  524. </div>
  525. </form>
  526. <form class="sign-up-form">
  527. <h2 class="title">DESFRUTE</h2>
  528. <p class="social-text">Aqui est茫o algumas ferramentas 煤teis</p>
  529. <div class="social-media">
  530. <a class="social-icon" data-bs-target="#speedTestModal" data-bs-toggle="modal">
  531. <i class="bi bi-speedometer"></i>
  532. </a>
  533. <a class="social-icon" onclick="DtIgnoreBatteryOptimizations.execute()">
  534. <i class="bi bi-battery-full"></i>
  535. </a>
  536. <a class="social-icon" onclick="toggleHotSpot()">
  537. <i id="hotspotIcon" class="bi bi-wifi"></i>
  538. </a>
  539. <a class="social-icon" onclick="DtStartWebViewActivity.execute('https://pshnet.online')">
  540. <i class="bi bi-globe"></i>
  541. </a>
  542. <a class="social-icon" onclick="DtCleanApp.execute()">
  543. <i class="bi bi-trash3"></i>
  544. </a>
  545. </div>
  546. </form>
  547. </div>
  548. </div>
  549. <div class="panels-container">
  550. <div class="panel left-panel">
  551. <div class="content">
  552. <span class="bi bi-wifi" id="name"> TIM:</span>
  553. <span id="ip">127.0.0.1</span>
  554. <h3 class="titulo">Mais Ferramentas</h3>
  555. <button class="btn transparent" id="sign-up-btn">
  556. <i class="bi bi-gear"></i>
  557. </button>
  558. <div class="d-flex">
  559. <h4 class="bi bi-person ms-2" id="total">00</h4>
  560. </div>
  561. </div>
  562. <img src="https://i.imgur.com/bqqPxCH.png" class="image" alt="" />
  563. </div>
  564. <div class="panel right-panel">
  565. <div class="content">
  566. <h3>VOLTE PARA HOME</h3>
  567. <p>
  568. <i class="bi bi-arrow-down-circle-fill"></i>
  569. </p>
  570. <button class="btn transparent bi bi-house" id="sign-in-btn">
  571. </button>
  572. </div>
  573. <img src="https://i.imgur.com/bqqPxCH.png" class="image" alt="" />
  574. </div>
  575. </div>
  576. </div>
  577. <div class="modal fade" id="checkUserModal">
  578. <div class="modal-dialog modal-dialog-centered" role="document">
  579. <div class="modal-content rounded-3 shadow">
  580. <div class="modal-header border-bottom-0 pb-0">
  581. <h1 class="modal-title fs-5 chk-title text-light"></h1>
  582. <button type="button" class="btn-close btn-close-white" data-bs-dismiss="modal"
  583. aria-label="Close"></button>
  584. </div>
  585. <div class="modal-body text-center">
  586. <p class="fs-5 mb-0 chk-message text-light"></p>
  587. </div>
  588. </div>
  589. </div>
  590. </div>
  591. <div class="modal fade" id="errorModal">
  592. <div class="modal-dialog modal-dialog-centered" role="document">
  593. <div class="modal-content rounded-3 shadow">
  594. <div class="modal-header border-bottom-0 pb-0">
  595. <h1 class="modal-title fs-5 err-title text-light"></h1>
  596. <button type="button" class="btn-close btn-close-white" data-bs-dismiss="modal"
  597. aria-label="Close"></button>
  598. </div>
  599. <div class="modal-body text-center">
  600. <p class="fs-5 mb-0 err-message text-light"></p>
  601. </div>
  602. </div>
  603. </div>
  604. </div>
  605. <div class="modal fade" id="loggerModal">
  606. <div class="modal-dialog modal-dialog-centered" role="document">
  607. <div class="modal-content rounded-3 shadow">
  608. <div class="modal-body p-1 text-center">
  609. <ul class="list-group bg-transparent overflow-y-auto logger-content" style="max-height: 600px;">
  610. </ul>
  611. </div>
  612. <div class="modal-footer flex-nowrap p-0">
  613. <button type="button" class="bt btn-lg btn-dark text-light w-100 clear-logger">LIMPAR</button>
  614. <button type="button" class="bt btn-lg btn-dark text-light w-100"
  615. data-bs-dismiss="modal">FECHAR</button>
  616. </div>
  617. </div>
  618. </div>
  619. </div>
  620. <div class="modal fade" id="configModal">
  621. <div class="modal-dialog modal-dialog-centered" role="document">
  622. <div class="modal-content rounded-3 shadow">
  623. <div class="modal-header border-bottom-0 pb-0">
  624. <h1 class="modal-title fs-5 text-white">CONFIGURA脟脮ES</h1>
  625. <button type="button" class="btn-close btn-close-white" data-bs-dismiss="modal"
  626. aria-label="Close"></button>
  627. </div>
  628. <div class="modal-body p-1 text-center">
  629. <ul class="list-group bg-transparent overflow-y-auto config-body" style="max-height: 600px;">
  630. <li class="list-group-item bg-transparent text-white border-0">
  631. <p>CATEGORIA</p>
  632. <ul class="list-group bg-transparent overflow-y-auto text-start">
  633. <li
  634. class="list-group-item d-flex bg-transparent text-white border-0 border-bottom rounded-0">
  635. <img src="https://cdn-icons-png.flaticon.com/512/3686/3686811.png" width="40"
  636. height="40">
  637. <div class="d-flex flex-column ms-2 w-100">
  638. <span>CONFIG 01</span>
  639. <span>DESC 01</span>
  640. </div>
  641. <div class="d-flex flex-column ms-2 w-100">
  642. <span class="text-end">CONFIG_MODE</span>
  643. </div>
  644. </li>
  645. </ul>
  646. </li>
  647. </ul>
  648. </div>
  649. </div>
  650. </div>
  651. </div>
  652. <div class="modal fade" id="speedTestModal">
  653. <div class="modal-dialog modal-dialog-centered" role="document">
  654. <div class="modal-content rounded-3 shadow">
  655. <div class="modal-header border-bottom-0 py-3">
  656. <button type="button" class="btn-close btn-close-white" data-bs-dismiss="modal"
  657. aria-label="Close"></button>
  658. </div>
  659. <div class="modal-body ratio rounded-bottom-3" style="height: 600px;">
  660. <div class="spinner d-flex w-100 h-100 align-items-center justify-content-center">
  661. <div class="spinner-border text-light p-5" role="status">
  662. <span class="visually-hidden">Loading...</span>
  663. </div>
  664. </div>
  665. <iframe class="rounded-bottom-3" id="speedFrame"></iframe>
  666. </div>
  667. </div>
  668. </div>
  669. </div>
  670. <script>
  671. const sign_in_btn = document.querySelector("#sign-in-btn");
  672. const sign_up_btn = document.querySelector("#sign-up-btn");
  673. const container = document.querySelector(".container");
  674. sign_up_btn.addEventListener("click", () => {
  675. container.classList.add("sign-up-mode");
  676. });
  677. sign_in_btn.addEventListener("click", () => {
  678. container.classList.remove("sign-up-mode");
  679. });
  680. </script>
  681. <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/toastify-js"></script>
  682. <script>
  683. const configArea = document.querySelector('#config-area')
  684. const config = document.querySelector('#config')
  685. const username = document.querySelector('#username')
  686. const password = document.querySelector('#password')
  687. const uuid = document.querySelector('#uuid')
  688. const logger = document.querySelector('#logger')
  689. const startStopVpn = document.querySelector('#start-stop')
  690. const stateStatus = document.querySelector('#state')
  691. const loggerModal = new bootstrap.Modal(document.querySelector('#loggerModal'))
  692. const checkUserModal = new bootstrap.Modal(document.querySelector('#checkUserModal'))
  693. const errorModal = new bootstrap.Modal(document.querySelector('#errorModal'))
  694. const configModal = new bootstrap.Modal(document.querySelector('#configModal'))
  695. const clearLogger = document.querySelector('.clear-logger')
  696. const speedTestModal = new bootstrap.Modal(document.querySelector('#speedTestModal'))
  697. const toggleHotSpot = () => {
  698. const hotSpotStatus = window?.DtGetStatusHotSpotService?.execute() ?? 'STOPPED';
  699. hotSpotStatus == 'RUNNING' ? stopHotSpot() : startHotSpot();
  700. }
  701. const startHotSpot = () => DtStartHotSpotService.execute();
  702. const stopHotSpot = () => DtStopHotSpotService.execute();
  703. configArea.addEventListener('click', e => showConfigsModal())
  704. username.addEventListener('input', e => DtUsername.set(e.target.value))
  705. password.addEventListener('input', e => DtPassword.set(e.target.value))
  706. uuid.addEventListener('input', e => DtUuid.set(e.target.value))
  707. logger.addEventListener('click', e => loggerModal.show())
  708. startStopVpn.addEventListener('click', (e) => {
  709. if (DtGetVpnState.execute() != 'DISCONNECTED') {
  710. DtExecuteVpnStop.execute()
  711. } else {
  712. DtExecuteVpnStart.execute()
  713. }
  714. })
  715. clearLogger.addEventListener('click', () => DtClearLogs.execute())
  716. speedTestModal._element.addEventListener('shown.bs.modal', () => {
  717. const iframe = document.querySelector('#speedFrame');
  718. if (!iframe.src) {
  719. iframe.src = 'https://fast.com'
  720. iframe.addEventListener('load', () => {
  721. mp3Modal._element.querySelector('.spinner').classList.add('d-none')
  722. })
  723. }
  724. })
  725. speedTestModal._element.addEventListener('hide.bs.modal', () => {
  726. const iframe = document.querySelector('#speedFrame');
  727. iframe.src = '';
  728. })
  729. Object.defineProperty(String.prototype, 't', {
  730. value: function t() {
  731. return window?.DtTranslateText?.execute('' + this) ?? '' + this
  732. },
  733. writable: true,
  734. configurable: true,
  735. })
  736. const dtConfigClickListener = () => {
  737. const data = JSON.parse(window?.DtGetDefaultConfig?.execute() || `{ "auth": {"username": ""} }`)
  738. const isV2ray = data?.mode?.toLowerCase()?.startsWith('v2ray');
  739. config.placeholder = data.name ?? 'Escolha um servidor';
  740. username.parentElement.style.setProperty('display', !data?.auth?.username && !isV2ray ? 'flex' : 'none', 'important')
  741. password.parentElement.style.setProperty('display', !data?.auth?.password && !isV2ray ? 'flex' : 'none', 'important')
  742. uuid.parentElement.style.setProperty('display', !data?.auth?.v2ray_uuid && isV2ray ? 'flex' : 'none', 'important')
  743. }
  744. const dtVpnStateListener = state => {
  745. const isRunning = state != 'DISCONNECTED';
  746. stateStatus.innerHTML = ('LBL_STATE_' + state).t()
  747. startStopVpn.innerHTML = isRunning ? 'LBL_BTN_STOP'.t() : 'LBL_BTN_START'.t()
  748. if (isRunning) {
  749. username.setAttribute('readonly', 'true')
  750. password.setAttribute('readonly', 'true')
  751. } else {
  752. username.removeAttribute('readonly')
  753. password.removeAttribute('readonly')
  754. }
  755. if (state == 'CONNECTING') dtShowSuccessToastListener('Conectado...')
  756. }
  757. const dtCheckUserStartedListener = () => {
  758. const data = JSON.parse(window?.DtGetDefaultConfig?.execute() || `{}`)
  759. const isV2ray = data?.mode?.toLowerCase()?.startsWith('v2ray');
  760. if (isV2ray) return;
  761. const html = `
  762. <div class="d-flex justify-content-center">
  763. <div class="spinner-border p-4" role="status">
  764. <span class="visually-hidden">Loading...</span>
  765. </div>
  766. </div>
  767. `
  768. checkUserModal._element.querySelector('.chk-title').textContent = 'CHECK USER'
  769. checkUserModal._element.querySelector('.chk-message').innerHTML = html;
  770. checkUserModal.show()
  771. }
  772. const dtCheckUserModelListener = model => {
  773. const data = JSON.parse(model ?? `{"username": "test"}`)
  774. const html = `
  775. <div class="d-flex flex-column text-white">
  776. <span>USU脕RIO:<br><font color="#00BFFFF"><u>${data.username}</u></font></span>
  777. <span>VALIDADE:<br><font color="#00BFFFF">${data.expiration_date}</font></span>
  778. <span>DIAS RESTANTES:<br><font color="#00BFFFF">${data.expiration_days}</font></span>
  779. <span>CONEX脮ES:<br><font color="#00BFFFF"> ${data.count_connections}</font></span><br>
  780. </div>
  781. `
  782. checkUserModal._element.querySelector('.chk-title').textContent = ''
  783. checkUserModal._element.querySelector('.chk-message').innerHTML = html;
  784. checkUserModal.show()
  785. }
  786. const dtMessageErrorListener = message => {
  787. const data = JSON.parse(message)
  788. errorModal._element.querySelector('.err-title').textContent = data.title;
  789. errorModal._element.querySelector('.err-message').innerHTML = data.content;
  790. errorModal.show()
  791. }
  792. const dtOnNewLogListener = () => {
  793. const mock = [];
  794. for (let i = 0; i < 30; i++) {
  795. mock.push({ 'TIME': 'MESSAGE ' + i })
  796. }
  797. const log = window?.DtGetLogs?.execute() || JSON.stringify(mock)
  798. const data = JSON.parse(log)
  799. let content = '';
  800. data.forEach(item => {
  801. 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);">';
  802. content += Object.keys(item)[0] + " " + item[Object.keys(item)]
  803. content += '</li>';
  804. })
  805. loggerModal._element.querySelector('.logger-content').innerHTML = content;
  806. const listGroup = loggerModal._element.querySelector('.list-group')
  807. listGroup.scrollTo(0, listGroup.scrollHeight)
  808. }
  809. const dtVpnStartedSuccessListener = () => dtShowSuccessToastListener('Conectado com sucesso')
  810. const dtVpnStoppedSuccessListener = () => dtShowSuccessToastListener('Desconectado com sucesso')
  811. const dtShowSuccessToastListener = text => {
  812. Toastify({
  813. text: text,
  814. close: true,
  815. style: {
  816. background: 'linear-gradient(to right, #00b09b, #96c93d)',
  817. marginTop: '35px',
  818. textAlign: 'center',
  819. alignItems: 'center',
  820. justifyContent: 'center',
  821. }
  822. }).showToast()
  823. }
  824. const dtShowErrorToastListener = text => {
  825. Toastify({
  826. text: text,
  827. close: true,
  828. style: {
  829. background: 'linear-gradient(to right, #ff5c33, #e69900)',
  830. marginTop: '35px',
  831. }
  832. }).showToast()
  833. }
  834. const showConfigsModal = () => {
  835. 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"}]}]'
  836. const data = JSON.parse(window?.DtGetConfigs?.execute() || mock)
  837. data.sort((a, b) => a.sorter - b.sorter)
  838. data.forEach(item => item.items.sort((a, b) => a.sorter - b.sorter))
  839. const body = configModal._element.querySelector('.config-body')
  840. body.innerHTML = ''
  841. data.forEach(category => {
  842. const categoryElement = document.createElement('li')
  843. categoryElement.className = 'list-group-item bg-transparent border-0 mb-1 rounded-1 px-1'
  844. categoryElement.style.color = 'var(--text-color)'
  845. categoryElement.innerHTML = `<span class="fw-bold w-100 d-block p-1 rounded-1 mb-1 bg-category">${category.name}</span>`
  846. const configUlElement = document.createElement('ul')
  847. configUlElement.className = 'list-group overflow-y-auto'
  848. category.items.forEach(item => {
  849. const configElement = document.createElement('li')
  850. configElement.className = 'list-group-item d-flex border-0 bg-config rounded-2 px-1 py-2 mb-1'
  851. configElement.style.color = 'var(--text-color)'
  852. configElement.innerHTML = `
  853. <img src="${item.icon}" width="40" height="40">
  854. <div class="text-start d-flex flex-column ms-2 w-100 text-truncate">
  855. <span class="fw-bold text-uppercase" style="font-size: 0.8rem;">${item.name}</span>
  856. <span class="fst-italic fw-bold text-uppercase" style="font-size: 0.7rem;">${item.description || ''}</span>
  857. </div>
  858. <div class="d-flex flex-column ms-2">
  859. </div>
  860. </li>
  861. `
  862. configElement.addEventListener('click', e => {
  863. window?.DtSetConfig?.execute(item.id)
  864. configModal.hide()
  865. })
  866. configUlElement.appendChild(configElement)
  867. })
  868. categoryElement.appendChild(configUlElement)
  869. body.appendChild(categoryElement)
  870. })
  871. configModal.show()
  872. }
  873. username.value = window?.DtUsername?.get() ?? ''
  874. password.value = window?.DtPassword?.get() ?? ''
  875. uuid.value = window?.DtUuid?.get() ?? ''
  876. username.placeholder = 'LBL_USERNAME'.t()
  877. password.placeholder = 'LBL_PASSWORD'.t()
  878. uuid.placeholder = 'LBL_UUID'.t()
  879. dtOnNewLogListener()
  880. dtVpnStateListener(window?.DtGetVpnState?.execute() ?? 'DISCONNECTED')
  881. dtConfigClickListener()
  882. console.log('DTunnel layout ready!馃殌')
  883. </script>
  884. <script>
  885. class AndroidMock {
  886. static getLocalIP() {
  887. return '192.168.0.1';
  888. }
  889. static getConfig() {
  890. return JSON.stringify({
  891. urlCheckUser: 'URLAQUI'
  892. });
  893. }
  894. static getNetworkName() {
  895. return 'REDE';
  896. }
  897. static openRadioInfo() {
  898. console.log('openRadioInfo');
  899. }
  900. }
  901. </script>
  902. <script>
  903. function showLocalIP(android) {
  904. console.log(android.getNetworkName());
  905. document.getElementById('name').innerHTML = ' ' + android.getNetworkName() + ':';
  906. document.getElementById('ip').innerHTML = android.getLocalIP();
  907. setInterval(() => {
  908. document.getElementById('name').innerHTML =
  909. ' ' + android.getNetworkName() + ':';
  910. document.getElementById('ip').innerHTML = android.getLocalIP();
  911. }, 2000)
  912. }
  913. function showCheckUser(android) {
  914. const config = JSON.parse(window?.DtGetDefaultConfig?.execute() ?? android.getConfig());
  915. const urlCheckUser = new URL(config.urlCheckUser);
  916. urlCheckUser.protocol = 'ws:';
  917. const socket = new WebSocket(urlCheckUser);
  918. socket.onopen = function (e) {
  919. socket.send(JSON.stringify({
  920. action: 'all',
  921. data: {}
  922. }));
  923. };
  924. socket.onmessage = function (event) {
  925. const data = JSON.parse(event.data);
  926. if (data.total === undefined)
  927. return;
  928. const total = data.total;
  929. document.getElementById('total').innerHTML = ' ' + String(total).padStart(2, '0');
  930. socket.close();
  931. };
  932. }
  933. window.onload = function () {
  934. const android = window.Android || AndroidMock;
  935. showLocalIP(android);
  936. showCheckUser(android);
  937. }
  938. </script>
  939. </body>
  940. </html>

comments powered by Disqus