USACO Enhancements

Adds some enhancements to USACO problems.

// ==UserScript==
// @name         USACO Enhancements
// @namespace    https://connorcode.com
// @version      0.3
// @description  Adds some enhancements to USACO problems.
// @author       Connor Slade
// @match        http://www.usaco.org/index.php?page=viewproblem*
// @grant        GM.getValue
// @grant        GM.setValue
// @grant        GM.setClipboard
// @license      GPLv3
// ==/UserScript==

(async () => {
    // == Problem year and date in page title ==
    let problemDate = document.querySelector('.panel h2').innerText;
    let problemName = document.querySelector('.panel h2:nth-child(2)').innerText.split('. ')[1];

    let date = problemDate.match(/USACO (\d{4}) (.*) Contest/);
    document.title = `USACO - ${problemName} (${date[2].substring(0, 3)} ${date[1]})`;

    // == Persistent language selector ==
    let selector = document.querySelector("select[name='language']");

    let lastLang = await GM.getValue('lastLang');
    if (lastLang != undefined) selector.value = lastLang;

    selector.addEventListener('change', async () => {
        console.log(selector.value);
        await GM.setValue("lastLang", selector.value);
    });

    // == Copy codeblocks to clipboard ==
    document.querySelectorAll('pre').forEach(block => {
        block.style.position = 'relative';

        let copy = document.createElement("button");
        copy.style.position = 'absolute';
        copy.style.top = 0;
        copy.style.right = 0;
        copy.innerText = 'Copy';
        block.appendChild(copy);
        copy.addEventListener('click', () => {
            let text = block.innerText;
            GM.setClipboard(text.substring(0, text.length - 4));
        });
    });
})();