UET-Graduate-Course-List

Script for calculating courses related stuff

当前为 2022-06-29 提交的版本,查看 最新版本

// ==UserScript==
// @name         UET-Graduate-Course-List
// @namespace    https://github.com/duongoku/
// @version      1.4
// @description  Script for calculating courses related stuff
// @author       duongoku
// @license      GPL-3.0-or-later
// @match        https://daotao.uet.vnu.edu.vn/*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=uet.vnu.edu.vn
// ==/UserScript==

function get_log_element() {
    var log_element = document.getElementById("console-log");
    if (log_element == null) {
        log_element = document.createElement("span");
        log_element.style = "color: white; display: block; font-size: 0.75rem;";
        log_element.id = "console-log";
    }
    return log_element;
}

function clear_log() {
    var log_element = get_log_element();
    log_element.innerHTML = "";
}

function log(log_string) {
    var log_element = get_log_element();
    log_element.innerHTML += `${log_string}<br>`;
}

function parseScore(score) {
    score = parseFloat(String(score));
    if (score >= 9) {
        return `A+`;
    } else if (score >= 8.5) {
        return `A`;
    } else if (score >= 8) {
        return `B+`;
    } else if (score >= 7) {
        return `B`;
    } else if (score >= 6.5) {
        return `C+`;
    } else if (score >= 5.5) {
        return `C`;
    } else if (score >= 5) {
        return `D+`;
    } else if (score >= 4) {
        return `D`;
    }
    return "F";
}

function run() {
    if (
        !window.location
            .toString()
            .startsWith(`https://daotao.uet.vnu.edu.vn/graduates/`)
    ) {
        return;
    }

    if (
        document
            .querySelector(".text-muted")
            .innerText.toString()
            .trim()
            .toLowerCase() !=
        `các học phần sinh viên đã tích lũy trong ctđt đang xét`
    ) {
        return;
    }

    document.querySelector(`.container-fluid`).appendChild(get_log_element());
    clear_log();

    var excluded_courses = [
        `MAT1101`,
        `ELT2029`,
        `INT3102`,
        `INT3103`,
        `BSA2002`,
    ];

    var score_to_gpa = {
        "A+": 4.0,
        A: 3.7,
        "B+": 3.5,
        B: 3.0,
        "C+": 2.5,
        C: 2.0,
        "D+": 1.5,
        D: 1.0,
        F: 0.0,
    };

    var courses = Array.from(document.querySelector("tbody").children);
    var total_credits = courses.reduce(
        (acc, cur) => acc + parseFloat(cur.children[4].innerText),
        0
    );
    var cpa = courses.reduce(
        (acc, cur) =>
            acc +
            score_to_gpa(parseScore(cur.children[5].innerText)) *
                parseFloat(cur.children[4].innerText),
        0
    );
    cpa = cpa / total_credits;
    cpa = Math.round(cpa * 100) / 100;
    var optional_courses = courses.filter(
        (x) => x.children[3].innerText.trim().toLowerCase() == `tự chọn`
    );
    optional_courses = optional_courses.filter(
        (x) =>
            !excluded_courses.includes(
                x.children[1].innerText.trim().toUpperCase()
            )
    );

    log(`Total accumulated credits: ${total_credits}`);
    log(`CPA: ${cpa}`);
    log(`Optional course count: ${optional_courses.length}`);
    log(
        `Total optional courses credit: ${optional_courses.reduce(
            (acc, cur) => acc + parseFloat(cur.children[4].innerText),
            0
        )}/30 credits needed`
    );
    log(`Optional course list:`);
    optional_courses = optional_courses.sort(
        (x, y) =>
            parseFloat(x.children[5].innerText) -
            parseFloat(y.children[5].innerText)
    );
    optional_courses.forEach((x) => {
        log(
            `Score: ${x.children[5].innerText}(${parseScore(
                x.children[5].innerText
            )}) | Course ${x.children[1].innerText}: ${
                x.children[2].innerText
            } | ${x.children[4].innerText} credits`
        );
    });
}

// Rerun every 1.5 seconds before starting the script
setInterval(run, 1500);

QingJ © 2025

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