Behind PB Sound Script

plays a warning sound or restarts when you are behind your personal best (PB)

  1. // ==UserScript==
  2. // @name Behind PB Sound Script
  3. // @namespace http://tampermonkey.net/
  4. // @version 0.3
  5. // @description plays a warning sound or restarts when you are behind your personal best (PB)
  6. // @author Oki
  7. // @match https://*.jstris.jezevec10.com/*
  8. // @grant none
  9. // ==/UserScript==
  10.  
  11. /**************************
  12. Behind PB Sound Script
  13. **************************/
  14.  
  15. (function() {
  16. window.addEventListener('load', function(){
  17.  
  18. localStorage.pbSound = localStorage.pbSound || "0";
  19. localStorage.mapSound = localStorage.mapSound || "0"
  20. localStorage.soundOrRestart = localStorage.soundOrRestart || "0"
  21.  
  22. var pbText = "If enabled, the finesse fault sound will played when falling behind your personal best time in sprint, cheese or a map (page refresh required)"
  23. var mapText = "If enabled, the finesse fault sound will play when falling behind the global best time in a map (page refresh required)"
  24.  
  25. var pbOption = document.createElement("table");
  26. pbOption.innerHTML = '<tbody><tr><td><input onclick="localStorage.pbSound^=1" type="checkbox" id="pbToggle"></td><td><label for="pbToggle">Behind PB sound</label></td></tr><tr><td></td><td><span class="settingsDesc">'+pbText+'</span></td></tr></tbody>'
  27. tab_other.appendChild(pbOption)
  28.  
  29. var mapOption = document.createElement("table");
  30. mapOption.innerHTML = '<tbody><tr><td><input onclick="localStorage.mapSound^=1" type="checkbox" id="mapToggle"></td><td><label for="mapToggle">Behind map record sound</label></td></tr><tr><td></td><td><span class="settingsDesc">'+mapText+'</span></td></tr></tbody>'
  31. tab_other.appendChild(mapOption)
  32.  
  33. var sorOption = document.createElement("table");
  34. sorOption.innerHTML = '<tbody><tr><td><input onclick="localStorage.soundOrRestart^=1" type="checkbox" id="sorToggle"></td><td><label for="sorToggle">Restart instead of playing sound</label></td></tr><tr><td></td></tr></tbody>'
  35. tab_other.appendChild(sorOption)
  36.  
  37. pbToggle.checked = +localStorage.pbSound
  38. mapToggle.checked = +localStorage.mapSound
  39. sorToggle.checked = +localStorage.soundOrRestart
  40.  
  41.  
  42. Game['prototype']['isBannedStartSequence'] = function() {
  43. localStorage.k9 = this["Settings"]["controls"][8]
  44. return 2<=this.queue.length&&1===this.isPmode(!1)&&(5<=this.queue[0].id||1===this.queue[0].id&&5<=this.queue[1].id);
  45. };
  46.  
  47. if(+localStorage.pbSound || +localStorage.mapSound){
  48.  
  49. Game["doRestart"] = function() {
  50. document.dispatchEvent(new KeyboardEvent("keydown",{keyCode:localStorage.k9}))
  51. }
  52.  
  53. var globalBest;
  54. var personalBest;
  55. var oldTimerValue = 0.00;
  56. var currentTimerValue = 0.00;
  57. var username = document.getElementsByClassName("navbar-right")[0].children[0].children[0].innerText.slice(0,-1)
  58. var website = "https://jstris.jezevec10.com/"
  59. var snd = new Audio(website + "res/se0/fault.wav");
  60.  
  61. var url = window.location.href
  62. var parts = /.*\=(\d)&(.*)\=(\d+)/g.exec(url)
  63. var leaderboardUrl = website;
  64.  
  65.  
  66. if(parts[2] == "map") {
  67. leaderboardUrl += "map/" + parts[3]
  68. } else if(parts[2] == "mode") {
  69. if(parts[1] == 1) {
  70. leaderboardUrl += "sprint?display=4&lines="+[,40,20,100,1000][parts[3]]+"L"
  71. } else if(parts[1] == 3) {
  72. leaderboardUrl += "cheese?display=4&lines="+[,10,18,100][parts[3]]+"L"
  73. }
  74. }
  75.  
  76. if(leaderboardUrl != website) {
  77. var xhr = new XMLHttpRequest();
  78. xhr.onload = function() {
  79.  
  80. globalBest = Infinity
  81. personalBest = Infinity
  82.  
  83. var tableEntries = this.responseXML.getElementsByClassName("table")[0].children[1].children
  84.  
  85. for (var i = 0; i < tableEntries.length-1; i++) {
  86. var row = tableEntries[i].innerText.replace(/ /g,"").split("\n")
  87. if(i==0){globalBest = timeStringToMs(row[7])}
  88. if(row[4] == username){personalBest = timeStringToMs(row[7])}
  89. }
  90.  
  91. window.setInterval(()=>{
  92.  
  93. oldTimerValue = currentTimerValue
  94. currentTimerValue = timeStringToMs(clock.innerText);
  95.  
  96. var personalSurpassed = (oldTimerValue <= personalBest) && (currentTimerValue >= personalBest)
  97. var globalSurpassed = (oldTimerValue <= globalBest) && (currentTimerValue >= globalBest)
  98.  
  99. if(parts[2] == "map"){
  100. if(+localStorage.pbSound)
  101. personalSurpassed&&(+localStorage.soundOrRestart?Game["doRestart"]():snd.play())
  102. if(+localStorage.mapSound)
  103. globalSurpassed&&(+localStorage.soundOrRestart?Game["doRestart"]():snd.play())
  104. } else {
  105. if(+localStorage.pbSound)
  106. globalSurpassed&&(+localStorage.soundOrRestart?Game["doRestart"]():snd.play())
  107. }
  108.  
  109. }, 200);
  110.  
  111. }
  112. xhr.open("GET", leaderboardUrl);
  113. xhr.responseType = "document";
  114. xhr.send();
  115. }
  116. }
  117.  
  118.  
  119. function timeStringToMs(s) {
  120. var totalTime=0,parts;~s.indexOf(":")&&(parts=s.split(":"),totalTime+=6E4*parts[0],s=parts[1].slice(0));
  121. ~s.indexOf(".")&&(parts=s.split("."),totalTime+=+(parts[1]+"00").substr(0,3),s=parts[0].slice(0));
  122. return(totalTime+1E3*s);
  123. }
  124.  
  125. });
  126. })();