Last active
July 6, 2022 19:08
-
-
Save diego-mi/4e0318c60f96852a35565a3623b66664 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// ==UserScript== | |
// @name TurtRacing - Auto Run | |
// @namespace https://gist.github.com/diego-mi | |
// @version 0.16 | |
// @description TurtRacing - Auto Run | |
// @author DiegoMi | |
// @match https://play.turtleracing.io | |
// @grant none | |
// @run-at document-start | |
// ==/UserScript== | |
(function() { | |
'use strict'; | |
const showLogs = true; // coloque false caso nao queira ver logs no developer tools do navegador | |
const turtItemsElements = null; | |
let turtListItemsElements = null; | |
const QuerySelector_StartElement = `#myBox2 > div:nth-child(4) > div:nth-child(1)`; | |
const QuerySelector_TurtItem = `#myBox2 > div:nth-child(4) > div`; | |
const QuerySelector_TurtItemPlayBtn = `div.contentBx > a`; | |
const QuerySelector_StartBtn = `#btnPlay`; | |
const QuerySelector_RecoveryBtn = `#div_buttons > a.buttonClock`; | |
const QuerySelector_ClockBtn = `#btnClock`; | |
const QuerySelector_Card_Races = `#div_turtle > div:nth-child(1) > span:nth-child(23)`; | |
const waitTimeForAbortAnimationRace = 1000; // Alterar este valor em milisegundos para aumentar ou diminuir o tempo de espera para abortar a animacao da corrida | |
async function WaitForElement(selector) { | |
while (document.querySelector(selector) === null) { | |
await new Promise( resolve => requestAnimationFrame(resolve) ) | |
} | |
await new Promise(resolve => setTimeout(resolve, 100)); | |
return document.querySelector(selector); | |
} | |
async function delay(time) { | |
return new Promise(resolve => setTimeout(resolve, time)); | |
} | |
async function GetTurts () { | |
await WaitForElement(QuerySelector_TurtItem); | |
turtListItemsElements = document.querySelectorAll(QuerySelector_TurtItem); | |
if (turtListItemsElements.length === 0) return turtleLog("Turts Items not found"); | |
turtleLog(`Turts Items found: ${turtListItemsElements.length}`); | |
} | |
async function DoRaces() { | |
for(let turtIndex = 0; turtIndex < turtListItemsElements.length; turtIndex++) { | |
turtleLog(`Turt-${turtIndex + 1} verificando`); | |
if (canRun(turtIndex)) { | |
//turtleLog(`Turt-${turtIndex + 1} vai correr`); | |
await selectCarListItemByIndex(turtIndex); | |
await startRace(turtIndex); | |
//document.querySelector('#app-root > div > div > nav > ul > li:nth-child(2) > a').click(); | |
} else { | |
//turtleLog(`Turt-${turtIndex + 1} ja correu`); | |
} | |
//turtleLog(`Turt-${turtIndex + 1} verificado, verificando proxima...`); | |
} | |
} | |
async function selectCarListItemByIndex(turtIndex) { | |
document.querySelector(`#myBox2 > div:nth-child(4) > div:nth-child(${turtIndex + 1}) > div.contentBx > a`).click(); | |
await delay(1000); | |
} | |
function canRun(turtIndex) { | |
try { | |
return document.querySelector(`#myBox2 > div:nth-child(4) > div:nth-child(${turtIndex + 1}) > div:nth-child(1) > div:nth-child(2)`).textContent.indexOf('/') > -1; | |
} catch (e) { | |
return false | |
} | |
} | |
async function startRace() { | |
await doRecoveryIfNeeded(); | |
if (isFirstRun()) { | |
firstRace(); | |
} | |
await doRecoveryIfNeeded(); | |
if (isSecondRun()) { | |
secondRace(); | |
} | |
} | |
function isFirstRun() { | |
turtleLog(document.querySelector(QuerySelector_Card_Races).textContent); | |
return document.querySelector(QuerySelector_Card_Races).textContent.indexOf('2/2') > -1; | |
} | |
function isSecondRun() { | |
turtleLog(document.querySelector(QuerySelector_Card_Races).textContent); | |
return document.querySelector(QuerySelector_Card_Races).textContent.indexOf('1/2') > -1; | |
} | |
async function firstRace() { | |
try { | |
turtleLog('firstRace'); | |
document.querySelector(QuerySelector_StartBtn).click(); | |
delay(waitTimeForAbortAnimationRace); | |
window.location.reload(true); | |
} catch (error) { | |
} | |
} | |
async function secondRace() { | |
try { | |
await doRecoveryIfNeeded(); | |
turtleLog('secondRace'); | |
document.querySelector(QuerySelector_StartBtn).click(); | |
delay(waitTimeForAbortAnimationRace); | |
history.go(''); | |
} catch (error) { | |
} | |
} | |
async function doRecoveryIfNeeded() { | |
if (recoveryNeeded()) { | |
doRecovery(); | |
await delay(1000); | |
} | |
} | |
function recoveryNeeded() { | |
return document.querySelector(QuerySelector_RecoveryBtn) !== null; | |
} | |
function doRecovery() { | |
document.querySelector(QuerySelector_RecoveryBtn).click(); | |
} | |
function turtleLog(...message) { | |
if (showLogs) console.log(message); | |
} | |
async function initializationFromCollection() { | |
await GetTurts(); | |
await DoRaces(); | |
turtleLog("Finalizado"); | |
} | |
/** | |
* INICIALIZACAO | |
*/ | |
async function Init() { | |
turtleLog("TurtleBot"); | |
await WaitForElement(QuerySelector_StartElement); | |
await delay(1000); | |
await doRecoveryIfNeeded(); | |
if (document.querySelector(QuerySelector_StartBtn) == null && document.querySelector(QuerySelector_ClockBtn) == null) { | |
await initializationFromCollection(); | |
} else if (document.querySelector(QuerySelector_ClockBtn) !== null) { | |
document.querySelector('#app-root > div > div > nav > ul > li:nth-child(2) > a').click(); | |
history.go(''); | |
} else if (document.querySelector(QuerySelector_StartBtn) !== null) { | |
await doRecoveryIfNeeded(); | |
await firstRace(); | |
document.querySelector('#app-root > div > div > nav > ul > li:nth-child(2) > a').click(); | |
history.go(''); | |
await WaitForElement(QuerySelector_StartElement); | |
await initializationFromCollection(); | |
} | |
} | |
Init(); | |
})(); |
0.15 - fix crash when run second race and stop in clock button
0.16 - fix when need recovery on after first race
0.17 - fixado paradas repentinas do recovery
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
0.14 fix async/await nas chamadas de doRecoveryIfNeeded