NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript== // @name NT Bot Detector // @description detects possible cheaters on nitrotype // @match *://www.nitrotype.com/race // @match *://www.nitrotype.com/race/* // @grant GM_getValue // @grant GM_setValue // @author dangerbobbad // @run-at document-start // @version 1.0 // @license MIT // ==/UserScript== console.info('[NT Bot Detector] Running!'); const clientUserID = JSON.parse(JSON.parse(localStorage.getItem('persist:nt')).user).userID; var currentRacers; var longestWordLength; const originalSend = WebSocket.prototype.send; window.sockets = []; WebSocket.prototype.send = function(...args) { if (window.sockets.indexOf(this) === -1) { currentRacers = {}; sockets.push(this); var ws = sockets[0]; ws.addEventListener('message', function (event) { if (event.data.startsWith('4')) { var message = JSON.parse(event.data.substring(1)); switch (message.msg) { case 'setup': message.payload.racers.forEach((racer) => { if (!racer.robot) { saveEncounter(racer.userID, racer.profile.username); console.info(`[NT Bot Detector] Tracking racer: ${racer.profile.username} (${racer.userID})`); } }); break; case 'joined': if (!message.payload.robot && message.payload.userID != clientUserID) { saveEncounter(message.payload.userID, message.payload.profile.username); console.info(`[NT Bot Detector] Tracking racer: ${message.payload.profile.username} (${message.payload.userID})`); } break; case 'status': if (message.payload.status == 'countdown') { longestWordLength = message.payload.l.split(' ').sort(function(a, b) { return b.length - a.length; })[0].length; } break; case 'update': message.payload.racers.forEach((racer) => { if (racer.hasOwnProperty('s') && racer.u != clientUserID) { if (racer.s == longestWordLength + 1) { console.info(`[NT Bot Detector] Racer ${racer.u} used nitro on the longest word`); saveNitroUsage(racer.u, true); } else { console.info(`[NT Bot Detector] Racer ${racer.u} used nitro, but not on longest word`); saveNitroUsage(racer.u, false); } } }); } } }); console.info('[NT Bot Detector] Socket connected'); } return originalSend.call(this, ...args); }; function saveEncounter(userID, username) { let savedData = GM_getValue(userID, `{ \"username\":"${username}", \"totalEncounters\":0, \"racesNitroUsed\":0, \"racesPerfectNitro\":0 }`); let parsedData = JSON.parse(savedData); parsedData.totalEncounters++; GM_setValue(userID, JSON.stringify(parsedData)); } function saveNitroUsage(userID, perfectNitro) { let savedData = GM_getValue(userID); let parsedData = JSON.parse(savedData); parsedData.racesNitroUsed++; if (perfectNitro) { parsedData.racesPerfectNitro++; } GM_setValue(userID, JSON.stringify(parsedData)); }