AJL Score

AtCoderの成績表にAJLのScoreを追加します。

// ==UserScript==
// @name         AJL Score
// @namespace    http://tampermonkey.net/
// @version      2.2
// @description  AtCoderの成績表にAJLのScoreを追加します。
// @author       You
// @match        https://atcoder.jp/users/*/history*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=atcoder.jp
// @license MIT
// @grant        none
// ==/UserScript==

(function() {
    'use strict';
    console.debug("Loading AJL Scores");
    const table = Array.from(document.querySelector("#history").rows);
    const tableTitleElem = document.createElement("th");
    tableTitleElem.style["text-align"] = "center";
    tableTitleElem.textContent = "AJL";
    tableTitleElem.classList.add("sorting");
    tableTitleElem.classList.add("ajl");
    let tableTitleState = 0;
    tableTitleElem.addEventListener("click", () => {
        document.querySelector("th:nth-child(4)").click();
    });
    table[0].insertBefore(tableTitleElem, table[0].childNodes[5]);
    const scores = [];
    table.slice(1).forEach((element) => {
        const perf = Number(element.childNodes[7].textContent);
        const ajlScore = Math.round(Math.pow(2, perf / 400) * 1000);
        const ajlScoreElem = document.createElement("td");
        ajlScoreElem.textContent = ajlScore;
        if(!isNaN(ajlScore)) {
            scores.push(ajlScore);
        }
        const ratingElem = element.childNodes[11];
        element.insertBefore(ajlScoreElem, ratingElem);
    });
    const labelEle = document.createElement("label");
    labelEle.textContent = "AJL Calculator (Please enter the latest number of doses you would like.) ->";
    labelEle.for = "ajl-cal";
    const numEle = document.createElement("input");
    numEle.type = "number";
    numEle.id = "ajl-cal";
    numEle.value = table.slice(1).length;
    const titleEle = document.querySelector("div.col-sm-12:has(h2) #user-nav-tabs");
    titleEle.parentNode.insertBefore(numEle, titleEle);
    numEle.parentNode.insertBefore(labelEle, numEle);

    const ansEle = document.createElement("p");
    titleEle.parentNode.insertBefore(ansEle, titleEle);

    function getScore(count) {
        const src = scores.slice(0, count).sort((a, b) => b - a);
        let sum = 0, cnt = 0;
        for(let i = 0; i < src.length; i++) {
            if(cnt == 10) break;
            if(src[i] == NaN) continue;
            sum += src[i];
            cnt++;
        }
        ansEle.textContent = "AJL Score: " + sum;
    }

    getScore(numEle.value);

    numEle.addEventListener("change", () => getScore(numEle.value));

})();