TTROCK-bot

Times Tables Rockstars bot.

  1. // ==UserScript==
  2. // @name TTROCK-bot
  3. // @namespace https://github.com/jibstack64/ttrockstars-bot
  4. // @version 4.25.0310.1650
  5. // @description Times Tables Rockstars bot.
  6. // @author jibstack64
  7. // @match https://play.ttrockstars.com/game/play/garage
  8. // @icon https://www.google.com/s2/favicons?sz=64&domain=mozilla.org
  9. // @grant GM_log
  10. // ==/UserScript==
  11.  
  12. (function() {
  13. 'use strict';
  14.  
  15. GM_log("Bot started.");
  16.  
  17. if(typeof(String.prototype.trim) === "undefined") {
  18. String.prototype.trim = function() {
  19. return String(this).replace(/^\s+|\s+$/g, '');
  20. };
  21. }
  22.  
  23. var running = false;
  24. setInterval(() => {
  25. var equation = document.getElementsByClassName("notranslate height-100 noselect current")[0];
  26. var input = document.getElementsByClassName("input-holder width-100")[0];
  27. if (input == undefined || input == null) {
  28. input = document.getElementsByClassName("input-holder width-100 hint")[0];
  29. }
  30. var enter = document.getElementsByClassName("key-ent ng-star-inserted")[0];
  31. var top = document.getElementsByClassName("next-game-question padding-5")[0];
  32. var keypad = document.getElementsByClassName("keyboard mat-white-color bg-2")[0];
  33.  
  34. if (equation != undefined && !running) {
  35. // start running
  36. running = true;
  37. // add "hacks enabled" message
  38. let el = document.createElement("a");
  39. el.setAttribute("href", "https://github.com/jibstack64/ttrockstars-bot");
  40. el.setAttribute("target", "_blank");
  41. if (top) {
  42. while (top.firstChild) {
  43. top.removeChild(top.firstChild);
  44. }
  45. el.style = "background-color: black; color: greenyellow; width: auto;align-items: center;margin-top: 10px;margin-bottom: 10px;padding: 5px;border: 2px solid red; font-size: 20px; font-style: bold; font-family: monospace;";
  46. el.innerHTML = "🤖 BOT ENABLED 🔥";
  47. top.appendChild(el);
  48. }
  49.  
  50. var id = setInterval(() => {
  51. if (!running) {
  52. clearInterval(id);
  53. return;
  54. }
  55.  
  56. if (equation && keypad && enter) {
  57. let raw = equation.innerHTML.replace("×", "*").replace("÷", "/");
  58. raw = raw.replace(/<!--.*?-->/g, "");
  59. raw = raw.replace(/<\s*span[^>]*>.*?<\s*\/\s*span\s*>/g, '');
  60. raw = raw.trim();
  61. try {
  62. let answer = String(eval(raw));
  63. GM_log("Question: " + raw + " = " + answer);
  64.  
  65. [...answer].forEach(char => {
  66. for (var row = 0; row < keypad.children.length; row++) {
  67. for (var key = 0; key < keypad.children[row].children.length; key++) {
  68. let elem = keypad.children[row].children[key]
  69. if (elem.innerHTML.trim() == char) {
  70. elem.click();
  71. return;
  72. }
  73. }
  74. }
  75. });
  76. enter.click();
  77. } catch (e) {
  78. GM_log("Error calculating answer: " + e);
  79. }
  80. }
  81. }, 500); // Changed to 500ms (0.5 seconds)
  82. } else if (equation == undefined) {
  83. running = false;
  84. var gameOver = document.getElementsByClassName("stamp center mat-white-color")[0];
  85. if (gameOver != undefined) {
  86. gameOver.innerHTML = "game won 😉"
  87. }
  88. }
  89.  
  90. }, 100);
  91. })();