Chromebot - nitro type bot

Nitro typer auto typer for chromebooks (works for windows and mac as well)

  1. // ==UserScript==
  2. // @license MIT
  3. // @description Nitro typer auto typer for chromebooks (works for windows and mac as well)
  4. // @name Chromebot - nitro type bot
  5. // @match https://www.nitrotype.com/race
  6. // @match https://www.nitrotype.com/race/*
  7. // @author Ginfio
  8. // @run-at document-start
  9. // @grant none
  10. // @version 1.2
  11. // @namespace https://ginfio.com/hacks/chromebot
  12. // ==/UserScript==
  13. // original author: RedHawk : https://github.com/RedHawk-1/Nitro-Type-Bot-2.0
  14.  
  15.  
  16. var wpm = 129;
  17. var accuracy = 97;
  18.  
  19.  
  20.  
  21.  
  22.  
  23.  
  24.  
  25.  
  26.  
  27.  
  28. const sockets = [];
  29. const nativeWebSocket = window.WebSocket;
  30. window.WebSocket = function(...args){
  31. const socket = new nativeWebSocket(...args);
  32. sockets.push(socket);
  33. return socket;
  34. };
  35.  
  36. function reload_page(){window.location.reload()}function checkForDisqualified(){setInterval(function(){document.querySelector(".modal--raceError")&&reload_page()},5e3)}function after_race(){let e=setInterval(function(){document.querySelector(".raceResults")&&(reload_page(),clearInterval(e))},0)}after_race(),checkForDisqualified();
  37.  
  38. function sleep(s) {
  39. var ms = s*1000;
  40. return new Promise(resolve => setTimeout(resolve, ms));
  41. }
  42. async function main(ws) {
  43. console.log('Message from server ', event.data);
  44. var message = event.data;
  45. function scan_for_text(message){ //Scanning messages to see if we can find the typing text.
  46. try {
  47. message = JSON.parse(message.slice(1,)).payload
  48. return message.l
  49. }
  50. catch {
  51. return null
  52. }
  53. return null
  54. }
  55. async function type(msg, speed, accuracy, nitros='true') {
  56. function len(x) {
  57. return x.length;
  58. }
  59. function str(x) {
  60. return x.toString()
  61. }
  62. function int(x) {
  63. return Number(x)
  64. }
  65. if ((len(msg) == 0) || (msg[0].startsWith("{'user"))) { //These are wrong messages
  66. return
  67. }
  68. function randrange(min, max) {
  69. return Math.floor(Math.random() * (max - min) ) + min;
  70. }
  71. var delay1 = randrange(7, 9) / 10 //If the delays are longer apart, they have more variety. Put in race function
  72. var delay2 = randrange(11, 14) / 10
  73. var words = msg.split(" ") //Turn into a list
  74. var wordString = words.join(' ') //Sounds nicer than "msg"
  75. function findLongestWord(str) {
  76. var longestWord = str.split(' ').sort(function(a, b) { return b.length - a.length; });
  77. return longestWord[0].length;
  78. }
  79. var biggestWord = findLongestWord(wordString);
  80. var list = [];
  81. for (var w in words.slice(0,words.length-1)) {
  82. list.push(w + ' ')
  83. }
  84. function round(x, p) {
  85. return Number.parseFloat(x).toPrecision(p);
  86. }
  87. words = list + words.slice(words.length-1)
  88. var numOfChars = wordString.length
  89. var numOfWords = numOfChars/5
  90. var numOfSecs = (numOfWords/speed) * 60
  91. var sleepTime = numOfSecs / numOfChars
  92. var sleep1 = round((sleepTime * delay1), 6) * 10000000
  93. var sleep2 = round((sleepTime * delay2), 6) * 10000000 //Get time to sleep after each char
  94. if(nitros == 'true'){
  95. var usedNitro = false
  96. } else if (nitros == 'random') { //Random check to see if we should use nitros
  97. var check = randrange(1,3)
  98. if(check == 1) {
  99. usedNitro = false
  100. }
  101. else {
  102. usedNitro = true
  103. }
  104. } else {
  105. usedNitro = true
  106. }
  107. await sleep(8);
  108. ws.send('4{"stream":"race","msg":"update","payload":{"t":1,"f":0}}') //First character has to have "f":0
  109. var t = 2
  110. var e = 1
  111. console.log(words);
  112. for (w in words) {
  113. if(int(len(w)) >= int(biggestWord) && usedNitro == false) {
  114. t += len(w)
  115. var payload = '4{"stream":"race","msg":"update","payload":{"n":1,"t":' + str(t) + ',"s":' + str(len(w)) + '}}' //Using nitro
  116. ws.send(payload)
  117. await sleep(0.2)
  118. payload = '4{"stream":"race","msg":"update","payload":{"t":' + str(t) + '}}' //sending another character
  119. ws.send(payload)
  120. t += 1
  121. usedNitro = true
  122. } else {
  123. for (var c in w) {
  124. var errorProbability = randrange(0,100) / 100
  125. var accuracyWrongPercentage = 1 - accuracy/100
  126. if(accuracyWrongPercentage >= errorProbability) {
  127. payload = '4{"stream":"race","msg":"update","payload":{"e":' + str(e) + '}}' //sending error
  128. ws.send(payload)
  129. e += 1
  130. }
  131. if ((t % 4 == 0) || (t >= (numOfChars - 4))) {
  132. payload = '4{"stream":"race","msg":"update","payload":{"t":' + str(t) + '}}' //sending character
  133. ws.send(payload)
  134. }
  135. t += 1
  136. var sleeptime = randrange(int(sleep1), int(sleep2)) / 10000000 //sleep between each character at a random interval according to the WPM
  137. await sleep(sleeptime)
  138. }
  139. }
  140. }
  141. ws.close()
  142. }
  143. var words = scan_for_text(message)
  144. if (words) {
  145. await type(words, wpm, accuracy)
  146. location.reload();
  147. }
  148. }
  149. setTimeout( function () {
  150. var ws = sockets[0];
  151. ws.addEventListener('message', async function(event) {await main(ws, event)});
  152. }, 5000)