Chromebot - nitro type bot

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

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

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

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 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);