Access Browser Time

Blocking the browser after the time has expired

  1. // ==UserScript==
  2. // @name Access Browser Time
  3. // @namespace https://github.com/AlekPet/Access-Browser-Time/
  4. // @version 1.0
  5. // @description Blocking the browser after the time has expired
  6. // @author AlekPet
  7. // @copyright AlekPet
  8. // @license MIT; https://raw.githubusercontent.com/AlekPet/Access-Browser-Time/master/LICENSE
  9. // @icon https://raw.githubusercontent.com/AlekPet/Access-Browser-Time/master/Access-Browser-By-Time-userscript.png
  10. // @match http*://*/*
  11. // @run-at document-idle
  12. // @grant GM_setValue
  13. // @grant GM_getValue
  14. // @grant GM_addStyle
  15. // @grant GM_addValueChangeListener
  16. // @require https://code.jquery.com/jquery-3.1.0.min.js
  17. // ==/UserScript==
  18.  
  19. GM_addStyle(`
  20. .countDown_Panel {
  21. position: fixed;
  22. max-width: 400px;
  23. max-height: 450px;
  24. bottom: 45px;
  25. left: 5px;
  26. text-align: center;
  27. z-index: 99999999999999999999;
  28. }
  29. .info_time{
  30. font: bold 10pt monospace;
  31. text-align: left;
  32. margin: 5px 10%;
  33. }
  34. .cTime {
  35. color: #4d3ea2;
  36. }
  37. .upTime{
  38. color: #910808;
  39. }
  40. .countDown_Panel .cd_form_box{
  41. width: 400px;
  42. display: none;
  43. border: 1px solid silver;
  44. background: #fff;
  45. font-family: cursive;
  46. opacity:0.8;
  47. box-shadow: 0 3px 5px silver;
  48. }
  49.  
  50. .cd_title {
  51. background: linear-gradient(#250280,#0089ff);
  52. padding: 10px;
  53. color: #fff;
  54. }
  55. .cd_body {
  56. padding: 5px;
  57. }
  58.  
  59. .cd_title div {
  60. display: inline-block;
  61. float: right;
  62. cursor: pointer;
  63. transition: 1s font-size;
  64. }
  65.  
  66. .cd_title div:hover {
  67. font-size: 1.2em;
  68. transition: 1s font-size;
  69. }
  70.  
  71. .cD_Buttons {
  72. width: 100px;
  73. border: 1px solid silver;
  74. padding: 5px;
  75. background: linear-gradient(#b2b8bb,#88898c);
  76. color: white;
  77. user-select: none;
  78. cursor: pointer;
  79. transition: 1s font-size;
  80. }
  81.  
  82. .cD_Buttons:hover{
  83. font-size: 1.2em;
  84. transform: rotateZ(-360deg);
  85. transition: 1s font-size;
  86. }
  87.  
  88. .countDown_Setting {
  89. background: linear-gradient(#00a4ff,#0826ff);
  90. margin: 5px auto;
  91. display:none;
  92. }
  93. .controls {
  94. margin: 0 auto;
  95. }
  96. .box_timer_table{
  97. display: table;
  98. margin: 0px auto;
  99. width: 80%;
  100. }
  101. .box_timer_table > div {
  102. display:table-row;
  103. }
  104. .box_timer_table > div div{
  105. display:table-cell;
  106. }
  107. .box_timer_table .head_caption{
  108. font-weight: bold;
  109. }
  110. .box_timer_table input[type='number']{
  111. text-align:center;
  112. width: 60px;
  113. margin-left: 5px;
  114. }
  115. .buttons {
  116. color: white;
  117. border: 1px solid silver;
  118. border-radius: 3px;
  119. box-shadow: 0 3px 6px;
  120. margin: 0 auto;
  121. padding: 5px;
  122. cursor:pointer;
  123. font-famaly: monospace;
  124. }
  125. .button_start{
  126. background: linear-gradient(limegreen, green);
  127. width: 100px;
  128. }
  129. .button_start:hover{
  130. background: linear-gradient(limegreen, #00FF50);
  131. }
  132. .countDown_Time {
  133. margin: 0 20px;
  134. font-size: 8pt;
  135. min-height: 12px;
  136. }
  137. .controls .fieldset_all{
  138. margin: 5px auto;
  139. width: 90%;
  140. }
  141. .controls input#fon_, .controls #text_block {
  142. width: 100%;
  143. color: grey;
  144. }
  145. .controls #text_block{
  146. height: 70px;
  147. }
  148. .cont_blocks {
  149. display: table;
  150. width: 100%;
  151. border-spacing: 3px;
  152. }
  153. .table_row {
  154. display: table-row;
  155. }
  156. .table_cell {
  157. display: table-cell;
  158. vertical-align: top;
  159. text-align: left;
  160. }
  161. .blockContainer{
  162. margin-top: 10%;
  163. text-align: center;
  164. }
  165. .block_message{
  166. font: bold 3em monospace;
  167. }
  168.  
  169. .input_pass_box {
  170. position: absolute;
  171. top: 40%;
  172. left: 50%;
  173. width: 235px;
  174. transform: translate(-50%,-50%);
  175. background: silver;
  176. font: normal 12pt monospace;
  177. opacity: 0.9;
  178. box-shadow: 2px 2px 5px 3px #c0c0c082;
  179. text-align: center;
  180. display:none;
  181. }
  182. .input_pass_box > div {
  183. padding: 7px 6px;
  184. }
  185. .input_pass_box > div:first-child {
  186. background: darkcyan;
  187. color: white;
  188. }
  189. .input_pass_box > div span:last-child {
  190. float: right;
  191. cursor:pointer;
  192. }
  193. .input_pass_box > div span:last-child:hover {
  194. color: cyan;
  195. }
  196. .unblock{color: green;font:bold 12pt monospace;}
  197. .unblock:hover{color: cyan;}
  198. .info_pass_unblock{
  199. background: white;
  200. margin: 3px;
  201. font-style: italic;
  202. font-size: 9pt;
  203. }
  204. `);
  205.  
  206. (function() {
  207. 'use strict';
  208. const $ = window.jQuery,
  209. debug = false,
  210. defaultBlockImage = "data:image/png;base64,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"
  211.  
  212. var ObjTimer = null,
  213. mtint = null,
  214. curInterTimer = null
  215.  
  216. function loadStorage(){
  217. let ObjTimer_tmp = GM_getValue('ObjTimer');
  218.  
  219. ObjTimer = (ObjTimer_tmp) ? JSON.parse(GM_getValue('ObjTimer')) : {
  220. options: {
  221. enabled: false,
  222. date: null,
  223. block_data: {text:"", img: defaultBlockImage},
  224. password: null,
  225. settings_inputs: null
  226. }
  227. }
  228.  
  229. if(debug) console.log(ObjTimer)
  230. }
  231.  
  232. function saveToStorage(){
  233. try{
  234. var save_data = JSON.stringify(ObjTimer);
  235.  
  236. if(save_data.length>0 && save_data !== null && save_data !=="" && save_data !== undefined){
  237. GM_setValue('ObjTimer', save_data);
  238. if(debug) console.log("Сохраненно: ",ObjTimer);
  239. }
  240. }catch(e){
  241. console.log(e);
  242. }
  243. }
  244.  
  245. function getCurrentTime(set_time = null){
  246. let curTime = set_time ? new Date(set_time) : new Date(),
  247. year = curTime.getFullYear(),
  248. month = curTime.getMonth()+1,
  249. date = curTime.getDate(),
  250. h = curTime.getHours(),
  251. m = curTime.getMinutes(),
  252. s = curTime.getSeconds()
  253.  
  254. return `${(date<10?"0"+date:date)+"."+(month<10?"0"+month:month)+"."+year+" "+(h<10?"0"+h:h)+":"+(m<10?"0"+m:m)+":"+(s<10?"0"+s:s)}`
  255. }
  256.  
  257. $.fn.makeForm = function(){
  258. let DivForm = $(`
  259. <div class="countDown_Panel">
  260. <div class="cD_Buttons countDown_Setting">Настройки</div>
  261. <div class="countDown_Time">Timer: --д. --:--:--</div>
  262. </div>
  263. `);
  264. this.append(DivForm);
  265.  
  266. $(".countDown_Setting").click(checkParole); // showHide
  267.  
  268. $(".countDown_Time").on("click", function(){
  269. $(".countDown_Setting").fadeToggle('slow')
  270. })
  271.  
  272. };
  273.  
  274. function showHide(){
  275. let $cd_form_box = $(".cd_form_box")
  276.  
  277. clearInterval(curInterTimer)
  278. curInterTimer = setInterval(function(){
  279. let cTime = $(".cTime"),
  280. upTime = $(".upTime").text(getCurrentTime(returnNewDate())),
  281. curTime = getCurrentTime()
  282.  
  283. if(cTime.length) $(".cTime").text(curTime)
  284. },1000)
  285.  
  286.  
  287. if(!$cd_form_box.length){
  288. $cd_form_box = $(`<div class="cd_form_box">
  289. <div class="cd_title"><span>Timer Setting...</span><div>X</div></div>
  290. <div class="cd_body">
  291. <div class="controls">
  292. <fieldset class="fieldset_all">
  293. <legend>Установка времени</legend>
  294. <div class="box_timer_table">
  295. <div>
  296. <div class="head_caption">Дней</div>
  297. <div class="head_caption">Часов</div>
  298. <div class="head_caption">Минут</div>
  299. <div class="head_caption">Секунд</div>
  300. </div>
  301. <div>
  302. <div><input type="number" min="0" title="Дней" id="days_" value="0"></div>
  303. <div><input type="number" min="0" title="Часов" id="hours_" value="0"></div>
  304. <div><input type="number" min="0" title="Минут" id="mins_" value="0"></div>
  305. <div><input type="number" min="0" title="Секунд" id="secs_" value="0"></div>
  306. </div>
  307. </div>
  308. <div class="info_time">
  309. <div>Текущее время:</div>
  310. <div class="cTime">00.00.0000 00:00:00</div>
  311. <div>Время блокировки:</div>
  312. <div class="upTime">00.00.0000 00:00:00</div>
  313. </div>
  314. </fieldset>
  315. <fieldset class="fieldset_all">
  316. <legend>Фон при блокировке</legend>
  317. <div class="cont_blocks">
  318. <div class="table_row">
  319. <div class="cont_img_block table_cell">
  320. <div class="img_container"><img src="${ObjTimer.options.block_data.img}" id="image_block" width="128" title="Фон" /></div>
  321. </div>
  322. <div class="cont_block_setting table_cell">
  323. <div class="link_div">
  324. <div>Ссылка:</div>
  325. <input type="text" id="fon_" value="${ObjTimer.options.block_data.img}">
  326. </div>
  327. <div class="textarea_div">
  328. <div>Текст при блокировке:</div>
  329. <textarea id="text_block">Заблокировано ФБР!</textarea>
  330. </div>
  331. </div>
  332. </div>
  333. </div>
  334. </fieldset>
  335. <div class="buttons button_start">Start</div>
  336. </div>
  337. </div>
  338. </div>
  339. </div>`);
  340.  
  341.  
  342. $cd_form_box.find(".cd_title div").off().click(showHide);
  343. $cd_form_box.find("input").each(function(){
  344. $(this).on("input", function(){
  345. if(checkinputs()){
  346. let getTimeUp = getCurrentTime(returnNewDate())
  347. $(".upTime").text(getTimeUp)
  348. }
  349. })
  350. })
  351.  
  352. $cd_form_box.find(".button_start").click(startTimer)
  353.  
  354. $cd_form_box.find("input#fon_").on("input", imageURLCheck.bind("",$cd_form_box.find("img#image_block")))
  355.  
  356. $(".countDown_Panel").append($cd_form_box);
  357. }
  358.  
  359. $cd_form_box.animate({
  360. width: [ "toggle", "swing" ],
  361. height: [ "toggle", "swing" ],
  362. opacity: "toggle"
  363. }, 1500, "linear", function(){
  364. $(".countDown_Setting").animate({
  365. opacity: "hide",
  366. height: [ "hide", "swing" ]
  367. },'slow', function(){
  368. if(!$(".cd_form_box").is(":visible")){
  369. $(".countDown_Panel").find(".cd_form_box").remove();
  370. }
  371. });
  372. });
  373.  
  374. }
  375.  
  376. function imageURLCheck(img,event){
  377. let imgInput = event.target
  378.  
  379. img.one("load",function(){
  380. // loaded
  381. })
  382. .one("error", function(){
  383. this.src = "data:image/png;base64,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"
  384. })
  385. .attr("src",imgInput.value)
  386. }
  387.  
  388. function returnNewDate(saveS = false){
  389. let date = new Date(),
  390. days_ = parseInt($("#days_").val()),
  391. hours_ = parseInt($("#hours_").val()),
  392. mins_ = parseInt($("#mins_").val()),
  393. secs_ = parseInt($("#secs_").val()),
  394. totalms = days_*(1000*60*60*24)+hours_*(1000*60*60)+mins_*(1000*60)+secs_*1000,
  395.  
  396. newDate = new Date(date.getTime()+totalms)
  397.  
  398. if(saveS){
  399. ObjTimer.options.enabled = true
  400. ObjTimer.options.date = newDate.getTime()
  401. ObjTimer.options.settings_inputs = {days:days_, hours: hours_, mins: mins_, sec: secs_}
  402. ObjTimer.options.block_data.text = $("#text_block").val()
  403. ObjTimer.options.block_data.image = $("#fon_").val()
  404. }
  405.  
  406. return newDate.getTime()
  407. }
  408.  
  409. function startTimer(){
  410. if(checkinputs()){
  411.  
  412. if(mtint) clearInterval(mtint);
  413. $(".countDown_Time").empty();
  414. timer_run(returnNewDate(true))
  415. showHide()
  416. saveToStorage()
  417.  
  418. } else {
  419. alert("В полях были ошибки исправьте их!")
  420. }
  421. }
  422.  
  423. function checkinputs(){
  424. let input_ok = true
  425. $(".controls .box_timer_table input").each(function(indx, el){
  426.  
  427. let id = el.id,
  428. val = el.value,
  429. title = el.title
  430.  
  431. if(/^\s?$/.test(val)){
  432. alert("Поле '"+title+"' не может быть пустым!")
  433. el.value = 0
  434. input_ok = false
  435. }
  436.  
  437. if(!/^[0-9]+$/.test(val)){
  438. let searchspchar = val.match(/[^0-9]/g)
  439. alert("Поле '"+title+"' содержит не цифры!\n"+(searchspchar && searchspchar.length? "\nСимволы в поле: "+val.match(/[^0-9]/g).join(","):""))
  440. el.value = val = parseInt(val) || 0
  441. input_ok = false
  442. }
  443.  
  444. if(val < 0){
  445. alert("Поле '"+title+"' не может быть меньше 0!")
  446. el.value = 0
  447. input_ok = false
  448. }
  449.  
  450. /*if(id == "days_"){
  451. el.value = val > 365 ? 365 : val
  452. } else if(id == "hours_"){
  453. el.value = val > 23 ? 23 : val
  454. } else if(id == "mins_" || id == "secs_"){
  455. el.value = val > 59 ? 59 : val
  456. }*/
  457. })
  458. return input_ok
  459. }
  460.  
  461. function makeParol(){
  462. const p = prompt("Введите пароль, для защиты","")
  463. if(/^\s?$/.test(p)){
  464. alert("Пароль не может быть без символов, или состоять из одних пробелов!")
  465. if(confirm("Попробовать снова?")) makeParol(); else return;
  466. }
  467. ObjTimer.options.password = p
  468. saveToStorage()
  469. //checkParole()
  470. return p
  471. }
  472.  
  473. function checkParole(){
  474. let p_cor = ObjTimer.options.password
  475.  
  476. if(p_cor == null || /^\s?$/.test(p_cor)){
  477. p_cor = makeParol()
  478. } else {
  479. p_cor = ObjTimer.options.password.toString()
  480. }
  481.  
  482. if(p_cor.length){
  483. const p = prompt("Введите пароль:","")
  484. if(p !== p_cor){
  485. alert("Пароль неверный!")
  486. $(".countDown_Setting").hide()
  487. return;
  488. } else {
  489. alert("Пароль верный!")
  490. showHide()
  491. }
  492. }
  493. }
  494.  
  495. function timer_run(date){
  496. let d_t = document.title,
  497. yd = date,
  498. countText = $(".countDown_Time").get(0)
  499.  
  500. mtint = setInterval(function(){
  501. let nowDateMsec = new Date().getTime(),
  502. msec = yd-nowDateMsec,
  503. sec = Math.floor(msec/1000),
  504. min = Math.floor(sec/60),
  505. hour = Math.floor(min/60),
  506. day = Math.floor(hour/24)
  507.  
  508. sec %= 60
  509. min %= 60
  510. hour %= 24
  511.  
  512. if (min<10){
  513. min='0'+min
  514. }
  515. if (sec<10){
  516. sec='0'+sec
  517. }
  518. if (hour<10){
  519. hour='0'+hour
  520. }
  521. if(msec>0){
  522. let timeOut = "Timer: "+day+"д. "+hour+":"+min+":"+sec
  523. countText.innerHTML = ((sec % 2 === 0 && msec<60000)?"":msec>60000?timeOut:"<span style='color:red'>"+timeOut+"</span>")
  524. document.title = d_t+" - "+ countText.innerText.replace("Timer: ","")
  525. } else {
  526. countText.innerText ="Время истекло!"
  527. clearInterval(mtint)
  528. blockBrowser()
  529. }
  530. }, 1000);
  531. }
  532.  
  533. function blockBrowser(){
  534. let canvas = $("<canvas>").get(0),
  535. ctx = canvas.getContext("2d")
  536. let img = $("<img>").on("load", function(){
  537. let html = `<head><title>${ObjTimer.options.block_data.text}</title></head><body></body>`,
  538. containerCanvas = $("<div class='blockContainer'>"),
  539. messageBlock = $("<div class='block_message'>").text(ObjTimer.options.block_data.text),
  540. unBlock = $("<span class='unblock'>").text("Отключить блокировку").css("cursor","pointer").click(function(){
  541. $(".input_pass_box").fadeToggle('slow', function(){
  542. if(input_password.is(":visible")){
  543. input_password.focus()
  544. }
  545. })
  546. }),
  547. popUPEnterPaswword = $("<div class='input_pass_box'><div><span>Enter password</span><span title='Close' onclick='$(\".unblock\").trigger(\"click\")'>X</span></div><div class='input_pass_body'></div></div>"),
  548. input_password = $("<input>").attr({"type":"password","title":"Field password input...","id":"input_password"}),
  549. button_check = $("<button></button>").text("Enter").click(function(){
  550. const p_cor = ObjTimer.options.password.toString(),
  551. user_input = input_password.val()
  552.  
  553. if(p_cor === user_input){
  554. input_password.css('border-color','limegreen')
  555. info_bar.css('color','green').text("Пароль верный!")
  556.  
  557. let funct = function(time){
  558. var timelef = time+1
  559. return function(){
  560. timelef-= 1
  561. info_bar.text("Разблокировка через: " + timelef +' сек.')
  562. if(timelef <=0 ){
  563. ObjTimer.options.enabled = false;
  564. saveToStorage()
  565. location.reload()
  566. }
  567. }
  568. }
  569. setInterval(funct.call("",3), 1000)
  570.  
  571. } else {
  572. input_password.css('border-color','red')
  573. info_bar.text("Пароль не верный!")
  574. }
  575. }),
  576. info_bar = $("<div class='info_pass_unblock'>")
  577.  
  578. popUPEnterPaswword.find(".input_pass_body").append(input_password,button_check,info_bar)
  579.  
  580. canvas.width = this.naturalWidth
  581. canvas.height = this.naturalHeight
  582. ctx.drawImage(this, 0, 0)
  583.  
  584. containerCanvas.append(canvas,messageBlock,unBlock)
  585.  
  586. const tmStyles = $("style").filter(function(){
  587. if(/^[0-9a-f-]+$/.test(this.id)) return this
  588. }),
  589.  
  590. jquery = $("<script>")
  591. jquery.attr({"src":"https://code.jquery.com/jquery-3.1.0.min.js","type":"text/javascript"})
  592.  
  593. $(document).children("html").html(html)
  594. $("head").append(tmStyles,jquery)
  595. $("body").append(containerCanvas,popUPEnterPaswword)
  596.  
  597. }).on("error", function(){
  598. $("body").empty()
  599. }).attr("src", defaultBlockImage)
  600. }
  601.  
  602. function timerIsset(){
  603. if(ObjTimer.hasOwnProperty("options")){
  604. if(ObjTimer.options.hasOwnProperty("date") && ObjTimer.options.hasOwnProperty("enabled") && ObjTimer.options.enabled && ObjTimer.options.date){
  605. if((ObjTimer.options.date - new Date().getTime())>0){
  606. timer_run(ObjTimer.options.date)
  607. }
  608. else blockBrowser()
  609. }
  610. }
  611. }
  612.  
  613. function init(){
  614. loadStorage()
  615. $("body").makeForm()
  616. timerIsset()
  617. }
  618.  
  619. if (window.top === window.self) {
  620. init();
  621. }
  622. })();