Chromebot - nitro type bot

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

您需要先安装一个扩展,例如 篡改猴Greasemonkey暴力猴,之后才能安装此脚本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴Userscripts ,之后才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。

您需要先安装用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @license MIT      Scooby doo - .scoobed. on discord
// @description      Nitro typer auto typer for chromebooks (works for windows and mac as well)
// @name             Chromebot - nitro type bot
// @match            https://www.nitrotype.com/race
// @match            https://www.nitrotype.com/race/*
// @author           .scoobed. - on discord
// @run-at           document-start
// @grant            none
// @version          1.3
// @namespace https:www.nitrotype.com
// ==/UserScript==
// original author: Scooby Doo - .scoobed. on discord

const sockets = [];
const nativeWebSocket = window.WebSocket;
window.WebSocket = function(...args){
  const socket = new nativeWebSocket(...args);
  sockets.push(socket);
  return socket;
};

function reload_page() {
  window.location.reload();
}

function checkForDisqualified() {
  setInterval(function(){
    document.querySelector(".modal--raceError") && reload_page();
  }, 5000);
}

function after_race() {
  let e = setInterval(function() {
    document.querySelector(".raceResults") && (reload_page(), clearInterval(e));
  }, 0);
}

after_race();
checkForDisqualified();

function sleep(s) {
  var ms = s * 1000;
  return new Promise(resolve => setTimeout(resolve, ms));
}

async function main(ws, event) {
  console.log('Message from server ', event.data);
  var message = event.data;

  function randrange(min, max) {
    return Math.floor(Math.random() * (max - min + 1)) + min;
  }

  var accuracy = 97; // Adjust accuracy as needed

  function scan_for_text(message) {
    try {
      message = JSON.parse(message.slice(1,)).payload;
      return message.l;
    } catch {
      return null;
    }
    return null;
  }

  async function type(msg, speed, accuracy, nitros = 'true') {
    function len(x) {
      return x.length;
    }
    function str(x) {
      return x.toString();
    }
    function int(x) {
      return Number(x);
    }
    if ((len(msg) == 0) || (msg[0].startsWith("{'user"))) {
      return;
    }
    var delay1 = randrange(7, 9) / 10;
    var delay2 = randrange(11, 14) / 10;
    var words = msg.split(" ");
    var wordString = words.join(' ');

    function findLongestWord(str) {
      var longestWord = str.split(' ').sort(function(a, b) { return b.length - a.length; });
      return longestWord[0].length;
    }
    var biggestWord = findLongestWord(wordString);
    var list = [];
    for (var w in words.slice(0, words.length - 1)) {
      list.push(w + ' ');
    }
    function round(x, p) {
      return Number.parseFloat(x).toPrecision(p);
    }
    words = list + words.slice(words.length - 1);
    var numOfChars = wordString.length;
    var numOfWords = numOfChars / 5;
    var numOfSecs = (numOfWords / speed) * 60;
    var sleepTime = numOfSecs / numOfChars;
    var sleep1 = round((sleepTime * delay1), 6) * 10000000;
    var sleep2 = round((sleepTime * delay2), 6) * 10000000;

    if(nitros == 'true'){
      var usedNitro = false;
    } else if (nitros == 'random') {
      var check = randrange(1, 3);
      if(check == 1) {
        usedNitro = false;
      } else {
        usedNitro = true;
      }
    } else {
      usedNitro = true;
    }
    await sleep(8);
    ws.send('4{"stream":"race","msg":"update","payload":{"t":1,"f":0}}');
    var t = 2;
    var e = 1;

    console.log(words);

    for (w in words) {
      if(int(len(w)) >= int(biggestWord) && usedNitro == false) {
        t += len(w);
        var payload = '4{"stream":"race","msg":"update","payload":{"n":1,"t":' + str(t) + ',"s":' + str(len(w)) + '}}';
        ws.send(payload);
        await sleep(0.2);
        payload = '4{"stream":"race","msg":"update","payload":{"t":' + str(t) + '}}';
        ws.send(payload);
        t += 1;
        usedNitro = true;
      } else {
        for (var c in w) {
          var errorProbability = randrange(0, 100) / 100;
          var accuracyWrongPercentage = 1 - accuracy/100;

          if(accuracyWrongPercentage >= errorProbability) {
            payload = '4{"stream":"race","msg":"update","payload":{"e":' + str(e) + '}}';
            ws.send(payload);
            e += 1;
          }
          if ((t % 4 == 0) || (t >= (numOfChars - 4))) {
            payload = '4{"stream":"race","msg":"update","payload":{"t":' + str(t) + '}}';
            ws.send(payload);
          }
          t += 1;
          var sleeptime = randrange(int(sleep1), int(sleep2)) / 10000000;
          await sleep(sleeptime);
        }
      }
    }
    ws.close();
  }

  var words = scan_for_text(message);
  if (words) {
    var randomWPM = randrange(100, 150); // Adjust the range as needed
    await type(words, randomWPM, accuracy);
    location.reload();
  }
}

setTimeout(function() {
  var ws = sockets[0];
  ws.addEventListener('message', async function(event) {
    await main(ws, event);
  });
}, 5000);