Premium Exchange Sell If Stock Not Full

Automatically sell resources when the stock is not full.

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==UserScript==
// @name         Premium Exchange Sell If Stock Not Full
// @description  Automatically sell resources when the stock is not full.
// @author       FunnyPocketBook
// @version      2.1
// @include      https://*/game.php*screen=market*
// @namespace https://greasyfork.org/users/151096
// ==/UserScript==
createInput();
var buyOrSell = 6; // Change this to 5 to buy resources, 6 to sell resources
var merchAvail = document.getElementById("market_merchant_available_count").innerText; // Get number of available merchants
var userInputSellResCap = parseInt(localStorage.getItem("premium_sell_res_cap")); // Get the user set cap for resources
var userInputSellRateCap = parseInt(localStorage.getItem("premium_sell_rate_cap")); // Get the user set cap for rate


/* Run every 7 seconds */
setInterval(function() {
    merchAvail = document.getElementById("market_merchant_available_count").innerText;
    if (merchAvail > 0) {
        sellResource();
    }
}, 7000);

function isInteger(x) {
    "use strict";
    return (typeof x === 'number') && (x % 1 === 0);
}

function createInput() {
    "use strict";
    var userInputParent = document.getElementById("premium_exchange_form");
    var input = document.createElement("input");
    input.setAttribute("id", "premium_sell_res_cap");
    input.setAttribute("type", "text");
    input.setAttribute("placeholder", '"10000" to keep 10k');
    input.setAttribute("style", "width:180px;");
    if (!isInteger(parseInt(localStorage.getItem("premium_sell_res_cap")))) {
        input.setAttribute("value", "");
    } else {
        input.setAttribute("value", localStorage.getItem("premium_sell_res_cap"));
    }
    userInputParent.parentNode.insertBefore(input, userInputParent);

    var input2 = document.createElement("input");
    input2.setAttribute("id", "premium_sell_rate_cap");
    input2.setAttribute("type", "text");
    input2.setAttribute("placeholder", '"200" to sell when price < 200');
    input2.setAttribute("style", "width:180px;");
    if (!isInteger(parseInt(localStorage.getItem("premium_sell_rate_cap")))) {
        input2.setAttribute("value", "");
    } else {
        input2.setAttribute("value", localStorage.getItem("premium_sell_rate_cap"));
    }
    userInputParent.parentNode.insertBefore(input2, userInputParent);

    var okButton = document.createElement("button");
    okButton.innerHTML = "OK";
    okButton.setAttribute("id", "buttonSetCap");
    okButton.setAttribute("class", "btn");
    userInputParent.parentNode.insertBefore(okButton, userInputParent);
    
    var resCapInput = document.getElementById("premium_sell_res_cap");
    var rateCapInput = document.getElementById("premium_sell_rate_cap");
    /* If caps have been set, put it in the newly created input field */
    if (!isInteger(parseInt(localStorage.getItem("premium_sell_res_cap")))) {
        resCapInput.setAttribute("value", "");
    } else {
        resCapInput.setAttribute("value", localStorage.getItem("premium_sell_res_cap"));
    }
    if (!isInteger(parseInt(localStorage.getItem("premium_sell_rate_cap")))) {
        rateCapInput.setAttribute("value", "");
    } else {
        rateCapInput.setAttribute("value", localStorage.getItem("premium_sell_rate_cap"));
    }
}

/* OK button calls this function */
document.getElementById("buttonSetCap").addEventListener("click", function setCap() {
    localStorage.setItem("premium_sell_res_cap", document.getElementById("premium_sell_res_cap").value);
    localStorage.setItem("premium_sell_rate_cap", document.getElementById("premium_sell_rate_cap").value);
    userInputSellResCap = parseInt(localStorage.getItem("premium_sell_res_cap"));
    userInputSellRateCap = parseInt(localStorage.getItem("premium_sell_rate_cap"));
});

/* Call for every resource to get the info */
function resInfo(res) {
    var number;
    switch(res) {
        case "wood":
            number = 0;
            break;
        case "stone":
            number = 1;
            break;
        case "iron":
            number = 2;
            break;
    }
    var info = {
        num: number,
        name: res,
        price: parseInt(document.getElementById("premium_exchange_rate_" + res).children[0].innerText),
        max: parseInt(document.getElementById("premium_exchange_capacity_" + res).innerHTML), // Maximum amount of resources that can currently fit in the premium exchange
        stock: parseInt(document.getElementById("premium_exchange_stock_" + res).innerHTML),
        inVillage: parseInt(document.getElementById(res).innerText),
        init: function() {
            this.cap = this.inVillage - parseInt(localStorage.getItem("premium_sell_res_cap"));
            return this;
        }
     }.init();
    return info;
}

function sellResource() {
    "use strict";
    merchAvail = document.getElementById("market_merchant_available_count").textContent;
    var sellThis;
    var wood = resInfo("wood");
    var stone = resInfo("stone");
    var iron = resInfo("iron");
    var allRes = [wood, stone, iron];
    var i = 0;
    var interval = setInterval(function() {
        if(allRes[i].stock < allRes[i].max && allRes[i].inVillage > userInputSellResCap && allRes[i].price <= userInputSellRateCap) {
            /* Empty every input box */
            document.querySelectorAll("#premium_exchange_form > table > tbody > tr > td > div:nth-child(1) > input").forEach(function(el) {
                el.value = "";
            });
            sellThis = Math.min((allRes[i].max - allRes[i].stock), (allRes[i].inVillage - userInputSellResCap));
            if (Math.ceil(sellThis / 1000) > merchAvail) {
                sellThis = merchAvail * 1000 - allRes[i].price;
            }
            if (sellThis < 0) {
                sellThis = 0;
            }
            if (sellThis != 0) {
                document.querySelectorAll("#premium_exchange_form > table > tbody > tr:nth-child(" + buyOrSell + ") > td > div:nth-child(1) > input")[allRes[i].num].value = sellThis;
                document.getElementsByClassName("btn-premium-exchange-buy")[0].click();
                setTimeout(function() {
                    document.querySelector("#premium_exchange > div > div > div.confirmation-buttons > button.btn.evt-confirm-btn.btn-confirm-yes").click();
                }, 1000);
            }
            clearInterval(interval);
        }
        i++;
        if(i >= 3) {
            clearInterval(interval);
            i = 0;
        }
    }, 1500)
    if (merchAvail < 20) {
        $('.arrowRight').click();
        $('.groupRight').click();
    }
}