Easy rebuy for Politics and War

Makes it easier to rebuy troops

// ==UserScript==
// @name         Easy rebuy for Politics and War
// @namespace    http://tampermonkey.net/
// @version      1.2
// @description  Makes it easier to rebuy troops
// @author       RandomNoobster
// @match        https://politicsandwar.com/nation/military/
// @icon         https://politicsandwar.com/favicon.ico
// @license      MIT
// @grant        none
// @require      http://code.jquery.com/jquery-3.6.0.min.js
// ==/UserScript==


(async function() {
    'use strict';

    function setCookie(cname, cvalue) {
        const d = new Date();
        d.setTime(d.getTime() + (365 * 24 * 60 * 60 * 1000));
        let expires = "expires=" + d.toUTCString();
        document.cookie = cname + "=" + cvalue + ";" + expires + ";path=/";
    }

    function getCookie(cname) {
        let name = cname + "=";
        let ca = document.cookie.split(';');
        for(let i = 0; i < ca.length; i++) {
            let c = ca[i];
            while (c.charAt(0) == ' ') {
                c = c.substring(1);
            }
            if (c.indexOf(name) == 0) {
                return c.substring(name.length, c.length);
            }
        }
        return "";
    }

    function refresh() {
        return new Promise(resolve => setTimeout(resolve, 10));
    }

    function checkCookie() {
        let checkboxes = document.querySelectorAll('input[type=checkbox]')
        checkboxes.forEach(box => {
            if (box.checked) {
                setCookie(box.id, true)
            }
            else {
                setCookie(box.id, false)
            }
        })
    }

    function httpGet(theUrl) {
        while(true) {
            var xmlHttp = new XMLHttpRequest();
            xmlHttp.open( "GET", theUrl, false ); // false for synchronous request
            xmlHttp.send( null );
            console.log(xmlHttp) // for debugging
            if (xmlHttp.responseURL != "https://politicsandwar.com/human/") break;
            window.open("https://politicsandwar.com/human/", '_blank');
            alert("I encountered a captcha! Please complete it before continuing!");
        }
        var doc = new DOMParser().parseFromString(xmlHttp.responseText, "text/html");
        return doc;
    }

    function httpPost(theUrl, data) {
        console.log(theUrl, data)
        while(true) {
            var xmlHttp = new XMLHttpRequest();
            xmlHttp.open( "POST", theUrl, false ); // false for synchronous request
            xmlHttp.setRequestHeader("Accept", "application/json");
            xmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
            xmlHttp.send(data);
            console.log(xmlHttp) // for debugging
            if (xmlHttp.responseURL != "https://politicsandwar.com/human/") break;
            window.open("https://politicsandwar.com/human/", '_blank');
            alert("I encountered a captcha! Please complete it before continuing!");
        }
        var doc = new DOMParser().parseFromString(xmlHttp.responseText, "text/html");
        return doc;
    }

    let form = document.createElement("form")
    let options = [
        {name: "Soldiers", url: "https://politicsandwar.com/nation/military/soldiers/", id: "soldiers", buyname: "soldiers", uniqueparam: "buysoldiers=Enlist%2FDischarge+Soldiers"},
        {name: "Tanks", url: "https://politicsandwar.com/nation/military/tanks/", id: "tanks", buyname: "tanks", uniqueparam: "buytanks=Manufacture%2FDecommission+Tanks"},
        {name: "Aircraft", url: "https://politicsandwar.com/nation/military/aircraft/", id: "aircraft", buyname: "aircraft", uniqueparam: "buyaircraft=Manufacture%2FDecommission+Aircraft"},
        {name: "Ships", url: "https://politicsandwar.com/nation/military/navy/", id: "ships", buyname: "ships", uniqueparam: "buyships=Manufacture%2FDecommission+Ships"},
        {name: "Spies", url: "https://politicsandwar.com/nation/military/spies/", id: "aircraftinput", buyname: "spies", uniqueparam: "train_spies=Enlist%2FDischarge+Spies"}, //spies=3&train_spies=Enlist%2FDischarge+Spies&token=cd028b0fae925fbe7
        {name: "Missiles", url: "https://politicsandwar.com/nation/military/missiles/", id: "aircraftinput", buyname: "missile_purchase_input_amount", uniqueparam: "missile_purchase_form_submit=Manufacture%2FDecommission+Missiles"}, //missile_purchase_input_amount=1&missile_purchase_form_submit=Manufacture%2FDecommission+Missiles&token=cd028b0fae925fbe7
        {name: "Nukes", url: "https://politicsandwar.com/nation/military/nukes/", id: "aircraftinput", buyname: "ships", uniqueparam: "buyships=Manufacture%2FDecommission+Nuclear+Weapons"} //ships=1&buyships=Manufacture%2FDecommission+Nuclear+Weapons&token=cd028b0fae925fbe7
    ]

    options.forEach(option => {
        // Creating the checkboxes
        let newLabel = document.createElement("label")
        newLabel.innerHTML = option.name
        newLabel.style.margin = "4px"
        newLabel.style.marginTop = "40px"
        let newInput = document.createElement("input")
        newInput.id = option.name
        newInput.dataset.url = option.url
        newInput.type = "checkbox"
        newInput.style.margin = "4px"
        newInput.style.width = "16px"
        newInput.style.height = "16px"
        newInput.onclick = checkCookie
        let cookie = getCookie(option.name)
        if (cookie == "true") {
            newInput.checked = true
        }
        newLabel.appendChild(newInput)
        form.appendChild(newLabel)
    })

    // Creating the rebuy button
    let submit = document.createElement("input")
    submit.type = "button"
    submit.value = "Rebuy selected"
    submit.style.display = "block"
    submit.style.margin = "auto"
    submit.className = "btn btn-primary"
    submit.onclick = rebuy
    form.appendChild(submit)

    // Inserting the elements
    let table2 = document.querySelector('a.btn[href="https://politicsandwar.com/nation/military/customize/"]')
    let p = document.createElement('p')
    table2.after(p)
    table2.after(form)

    let mainRssBar = document.querySelector(".informationbar")

    async function rebuy() {
        p.innerHTML = ""
        submit.value = "Working...."
        submit.disabled = true

        // Iterate through the unit types
        for (const option of options) {
            await refresh()
            let checkbox = document.querySelector("#" + option.name)
            if (checkbox.checked) {
                // Creating the result div
                let purchaseResult
                let error = false
                let errorMessage = document.createElement("p")
                errorMessage.innerHTML = `No purchase of ${option.name.toLowerCase()} was made for an unknown reason.`
                let div = document.createElement("div")
                div.className = "alert alert-danger"
                let title = document.createElement("p")
                title.className = "bold"
                title.innerHTML = "Error:"

                try {
                    let page = httpGet(option.url)

                    // Getting the token etc
                    let token = page.querySelector('[name=token]').value
                    let toBuy = page.querySelector("#" + option.id).value
                    if (toBuy == 0) {
                        toBuy = 1
                    }

                    // Actually performing the purchase
                    let data = `${option.buyname}=${toBuy}&${option.uniqueparam}&token=${token}`
                    let response = httpPost(option.url, data)
                    let rssBar = response.querySelector(".informationbar")
                    mainRssBar.innerHTML = rssBar.innerHTML
                    purchaseResult = response.querySelector(".alert-success, .alert-danger")
                    if (!purchaseResult.innerText.includes("Error") && !purchaseResult.innerText.includes("successfully") && !purchaseResult.innerText.includes("tomorrow to build")) {
                        error = true
                    }
                }
                catch {
                    error = true
                }

                // Printing out the results
                if (error) {
                    div.appendChild(title)
                    div.appendChild(errorMessage)
                    purchaseResult = div
                }

                console.log(purchaseResult)
                p.after(purchaseResult)
            }
        }
        submit.value = "Rebuy selected"
        submit.disabled = false

    }


})();