Torn company stock order

Automatically calculate stock percent based on sale and enter the order amount to order up to max capasity.

您需要先安装一个扩展,例如 篡改猴Greasemonkey暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴Userscripts ,之后才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。

您需要先安装用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name         Torn company stock order
// @version      0.2.11
// @description  Automatically calculate stock percent based on sale and enter the order amount to order up to max capasity.
// @author       Nemithrell
// @match        https://www.torn.com/companies.php*
// @run-at       document-start
// @grant        none
// @namespace    Nemithrell
// ==/UserScript==

    window.onload = function() {

        //add CSS for API key entry
        var style_api = document.createElement("style");
        style_api.type = "text/css";
        style_api.innerHTML = `
         #apiKey {
        height: 18px;
        font-size: 1.5em;
        width: 400px;
        font-family: Verdana;
        letter-spacing: .05em;
        margin-left: 5px;
        margin-bottom: 5px;
        padding: 5px;
        }
.d .manage-company .stock .stock-list-title>li.name, .d .manage-company .stock .stock-list .name {
    width: 185px;
}
.d .manage-company .stock .stock-list-title>li.stock, .d .manage-company .stock .stock-list .stock {
    width: 96px;
}

.d .manage-company .stock .stock-list-title>li.sold-daily, .d .manage-company .stock .stock-list .sold-daily {
    width: 70px;
}
        `
        document.head.appendChild(style_api);
        if (document.getElementById("stock").getElementsByClassName("stock-list-wrap").length != 0) {
            if (addUI()){
                run();
            }
        }

        //Add observer to triger when the stock tab is selected
        var targetNode = document.getElementById("stock");
        var config = { attributes: true, childList: true, subtree: true };
        var callback = function(mutationsList) {
            for(var mutation of mutationsList) {
                if (mutation.type == 'childList') {
                    if (addUI()){
                        run();
                    }
                }
            }
        };
        // Create an observer instance linked to the callback function
        var observer = new MutationObserver(callback);

        // Start observing the target node for configured mutations
        observer.observe(targetNode, config);

}

function addUI (){
    if ( document.getElementsByClassName("StockAutoFill").length == 0 ){
        var div_api = document.createElement("div");
        div_api.className = "StockAutoFill";
        var apiKey = document.createElement("input");
        apiKey.type = "text";
        apiKey.id = "apiKey";
        apiKey.placeholder = "Enter API key here";
        apiKey.value = localStorage.getItem("_apiKey") ? localStorage.getItem("_apiKey") : "";
        div_api.appendChild(apiKey);

        var button_save = document.createElement("button");
        button_save.type = "button";
        button_save.innerText = "Save";
        button_save.id = "btn_save";
        div_api.appendChild(button_save);

        var cw = document.getElementById("stock").getElementsByClassName("stock-list-wrap");
        cw[0].parentNode.insertBefore(div_api, cw[0]);

//         var ms = document.getElementById("stock").querySelectorAll("div.info-wrap.left");
//         console.log(ms);
//         for(var i = 0; i < ms.length; ++i){
//             var div_maxStock = document.createElement("div");
//             div_maxStock.id = "maxStock";
//             div_maxStock.className = "delivery";
//             var span_maxStock = document.createElement("span");
//             span_maxStock.innerText = "";
//             div_maxStock.appendChild(span_maxStock);
//             ms[i].insertBefore(div_maxStock, ms[i].lastElementChild);
//         }

        document.getElementById("btn_save").addEventListener("click", function() {
            var key = document.getElementById("apiKey");
            if(localStorage.getItem("_apiKey") != key.value){
                localStorage.setItem("_apiKey", key.value);
                run();
            }
        });
        return true;
    }
    else{
        return false;
    }
}

function run(){
    var urlStock = 'https://api.torn.com/company/?selections=stock&key=';
    var urlStorage = 'https://api.torn.com/company/?selections=detailed&key=';
    urlStock += localStorage.getItem("_apiKey") ? localStorage.getItem("_apiKey") : '';
    urlStorage += localStorage.getItem("_apiKey") ? localStorage.getItem("_apiKey") : '';
    var storage

    fetch(urlStorage)
        .then(function(response) {
        if(response.ok) {
            return response.json();
        }
        throw new Error('Network response was not ok.');
    })
        .then(function(myJson) {
        if (myJson.error){
            throw new Error(myJson.error.error);
        }
        storage = myJson.company_detailed.upgrades.storage_space;
    });

    fetch(urlStock)
        .then(function(response) {
        if(response.ok) {
            return response.json();
        }
        throw new Error('Network response was not ok.');
    })
        .then(function(myJson) {
        if (myJson.error){
            throw new Error(myJson.error.error);
        }

        var totalSold = 0;
        var totalStock = 0;
        var availableStock = 0;
        var totalNeededStock = 0;
        var maxStock = 0;
        for (var key1 in myJson.company_stock) {
            totalSold += myJson.company_stock[key1].sold_amount;
            totalStock += myJson.company_stock[key1].in_stock;
            totalStock += myJson.company_stock[key1].on_order;
        }

        availableStock = storage - totalStock;
        for (var key2 in myJson.company_stock) {
            maxStock = 0;
            maxStock = storage * (myJson.company_stock[key2].sold_amount/totalSold);
            totalNeededStock += maxStock - (myJson.company_stock[key2].on_order + myJson.company_stock[key2].in_stock) > 0 ?  maxStock - (myJson.company_stock[key2].on_order + myJson.company_stock[key2].in_stock) : 0;
        }

        $( ".stock-list-title.bold.t-hide" ).find(".name")[0].firstChild.after(" (MaxStock)");
        $( ".stock-list-title.bold.t-hide" ).find(".stock")[0].firstChild.after(" (+order)");

        for (var key in myJson.company_stock) {
            if (myJson.company_stock.hasOwnProperty(key)) {
                var orderPercent = myJson.company_stock[key].sold_amount/totalSold
                var orderAmount = 0;
                maxStock = 0;
                maxStock = storage * (myJson.company_stock[key].sold_amount/totalSold);
                var neededStock = maxStock - (myJson.company_stock[key].on_order + myJson.company_stock[key].in_stock)
                var neededPercent = neededStock > 0 ? neededStock/totalNeededStock : 0;
                //var maxOrderAmount = Math.floor((storage * orderPercent) - myJson.company_stock[key].in_stock - myJson.company_stock[key].on_order);
                //var orderOfAvailable = Math.floor(availableStock * orderPercent);

                orderAmount = Math.floor(availableStock * neededPercent);
                //orderAmount = maxOrderAmount > 0 ? orderOfAvailable > 0 ? orderOfAvailable > maxOrderAmount ? maxOrderAmount : orderOfAvailable : 0 : 0;

//                 $( ".stock-list.fm-list.t-blue-cont.h" ).find("div:contains("+key+")").parent().find("#maxStock").find("span").text(Math.floor(maxStock));
                $( ".stock-list.fm-list.t-blue-cont.h" ).find("div:contains("+key+")").append(" (" + new Intl.NumberFormat('en-US').format(Math.floor(maxStock)) + ")");
                $( ".stock-list.fm-list.t-blue-cont.h" ).find("div:contains("+key+")").parent().find(".stock").append(" (" + new Intl.NumberFormat('en-US').format(myJson.company_stock[key].on_order + myJson.company_stock[key].in_stock) + ")");
//                $( ".stock-list.fm-list.t-blue-cont.h" ).find("div:contains("+key+")").parent().find(".cost").append(" (" + new Intl.NumberFormat('en-US').format(myJson.company_stock[key].sold_amount) + ")");
                if(orderAmount != 0)
                {
                    $( ".stock-list.fm-list.t-blue-cont.h" ).find("div:contains("+key+")").parent().find(".quantity").find("input").val(orderAmount);
                }
                $( ".stock-list.fm-list.t-blue-cont.h" ).find("div:contains("+key+")").parent().find(".quantity").find("input").trigger('keyup');
            }
        }
    }).catch(function(error) {
        console.log('There has been a problem with your fetch operation: ', error.message);
    });
}