Keyma.sh Average Tracker

Tracks your average score for keyma.sh competitions

// ==UserScript==
// @name           Keyma.sh Average Tracker
// @description    Tracks your average score for keyma.sh competitions
// @author         Octahedron
// @version        1.0.0
// @icon           http://tampermonkey.net/favicon.ico
// @match          https://keyma.sh/*
// @grant          none
// @run-at         document-idle
// @require        https://ajax.googleapis.com/ajax/libs/jquery/2.2.0/jquery.js
// @namespace https://gf.qytechs.cn/users/824280
// ==/UserScript==

/* jshint asi: true, esnext: true, -W097 */

(function($) {
  'use strict'
  // pro tip: ignore my bad code
  let checked = false;
  let tests = [];
  load();

  let html = "<div style='display:flex;color:white;margin-right:auto;margin-left:auto;width:fit-content;text-align:center'> <div style='margin-right:30px'> <p>AVG WPM</p> <p id='wpmao5'>ao5: ...</p> <p id='wpmao10'>ao10: ...</p> <p id='wpmao15'>ao15: ...</p> </div> <div style='margin-right:30px'> <p>AVG ACC</p> <p id='accao5'>ao5: ...</p> <p id='accao10'>ao10: ...</p> <p id='accao15'>ao15: ...</p> </div> <div style='margin-right:30px'> <p>AVG TIME</p> <p id='timeao5'>ao5: ...</p> <p id='timeao10'>ao10: ...</p> <p id='timeao15'>ao15: ...</p> </div> <div style='margin-right:30px'> <p>AVG MISTAKES</p> <p id='mistakeao5'>ao5: ...</p> <p id='mistakeao10'>ao10: ...</p> <p id='mistakeao15'>ao15: ...</p> </div> <div style='margin-right:30px'> <p>Tests</p> <p id='testCount'>...</p> </div></div>"

  function getWPM() {
      let wpmHolder = document.querySelector("#matchEnd > div.bg-black.bg-opacity-20.h-auto.md\\:min-h-128.p-4.sm\\:p-6.md\\:p-8 > div.text-white > div > div.col-span-full.md\\:col-span-1 > div > div:nth-child(1) > div.text-4xl.text-orange-400.font-bold > span:nth-child(1)");
      let accHolder = document.querySelector("#matchEnd > div.bg-black.bg-opacity-20.h-auto.md\\:min-h-128.p-4.sm\\:p-6.md\\:p-8 > div.text-white > div > div.col-span-full.md\\:col-span-1 > div > div:nth-child(2) > div.text-4xl.text-orange-400.font-bold > span:nth-child(1)");
      let timeHolder = document.querySelector("#matchEnd > div.bg-black.bg-opacity-20.h-auto.md\\:min-h-128.p-4.sm\\:p-6.md\\:p-8 > div.text-white > div > div.col-span-full.md\\:col-span-1 > div > div:nth-child(3) > div.text-4xl.text-orange-400.font-bold > span:nth-child(1)");
      let mistakeHolder = document.querySelector("#matchEnd > div.bg-black.bg-opacity-20.h-auto.md\\:min-h-128.p-4.sm\\:p-6.md\\:p-8 > div.text-white > div > div.col-span-full.md\\:col-span-1 > div > div:nth-child(4) > div.text-4xl.text-orange-400.font-bold > span:nth-child(1)");

      if(wpmHolder) {
          if(!checked) {
              checked = true;
              $("#matchEnd").append(html);
              setTimeout(function() {
                  let test = {};
                  test.wpm = parseFloat(wpmHolder.innerText);
                  test.acc = parseFloat(accHolder.innerText);
                  test.time = parseFloat(timeHolder.innerText);
                  test.mistakes = parseFloat(mistakeHolder.innerText);
                  console.log(test);

                  tests.push(test);
                  save();
                  console.log(tests);

                  getData();

              }, 2000);
          }
      } else {
          checked = false;
      }
  }
  setInterval(getWPM, 100);

  function getData() {
      getAvg(5);
      getAvg(10);
      getAvg(15);
      $("#testCount").text(tests.length);
  }

  function getAvg(num) {
      let wpmSum = 0;
      let accSum = 0;
      let timeSum = 0;
      let mistakesSum = 0;
      for(let i = tests.length - 1; i > tests.length - (num + 1) && i >= 0; i--) {
          wpmSum += tests[i].wpm;
          accSum += tests[i].acc;
          timeSum += tests[i].time;
          mistakesSum += tests[i].mistakes;
      }
      $(`#wpmao${num}`).text(`ao${num}: ${(wpmSum / Math.min(num, tests.length)).toFixed(2)}`);
      $(`#accao${num}`).text(`ao${num}: ${(accSum / Math.min(num, tests.length)).toFixed(2)}`);
      $(`#timeao${num}`).text(`ao${num}: ${(timeSum / Math.min(num, tests.length)).toFixed(2)}`);
      $(`#mistakeao${num}`).text(`ao${num}: ${(mistakesSum / Math.min(num, tests.length)).toFixed(2)}`);
  }

  function save() {
      localStorage.setItem('data', JSON.stringify(tests));
  }

  function load() {
      tests = JSON.parse(localStorage.getItem('data')) || tests;
  }

}).bind(this)(jQuery)

jQuery.noConflict()

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址