MarketToShops

Show NPC shop price compared to market value

// ==UserScript==
// @name         MarketToShops
// @namespace    http://tampermonkey.net/
// @version      0.6
// @description  Show NPC shop price compared to market value
// @author       Gravity(2131364)
// @match        https://www.torn.com/bigalgunshop.php*
// @match        https://www.torn.com/shops.php*
// @license      MIT
// ==/UserScript==

(function() {
    'use strict';

    function formatNumber(n) {
        return "$" + n.toLocaleString();
    }

    function addPlaceholder(desc) {
        let compareLine = desc.querySelector(".shop-market-compare");
        if (!compareLine) {
            compareLine = document.createElement("span");
            compareLine.className = "shop-market-compare t-gray-6";
            compareLine.style.display = "block";
            compareLine.textContent = "MvS(loading...)";
            desc.appendChild(compareLine);
        }
        return compareLine;
    }

    async function fetchValue(itemId, compareLine) {
        try {
            let resp = await fetch("https://www.torn.com/page.php?sid=inventory", {
                method: "POST",
                headers: { "Content-Type": "application/x-www-form-urlencoded" },
                body: `itemID=${itemId}`
            });

            let data = await resp.json();

            let rawValue = data.itemValue || "";
            let rawSell = data.itemSell || "";

            let marketValue = parseInt(rawValue.replace(/[$,]/g, ""));
            let sellValue = parseInt(rawSell.replace(/[$,]/g, ""));

            if (isNaN(marketValue) || isNaN(sellValue)) {
                compareLine.textContent = "MvS: (unavailable)";
                return;
            }

            // Profit = sellValue - marketValue
            let diff = sellValue - marketValue;

            compareLine.style.color = diff >= 0 ? "green" : "red";
            compareLine.textContent =
                `MarketDiff: ${formatNumber(diff)}`;

            console.log(`Item ${itemId}: Market=${marketValue}, Sell=${sellValue}, Diff=${diff}`);
        } catch (err) {
            console.error(`Error fetching value for ${itemId}:`, err);
            compareLine.textContent = "Market vs Sell: (error)";
        }
    }

    function init() {
        console.log("Running Torn Shop Sell vs Market script with staggered fetch...");

        const items = document.querySelectorAll(".items-list li");
        let delay = 0;

        items.forEach(li => {
            const desc = li.querySelector(".desc");
            const nameSpan = li.querySelector(".name");

            if (!desc || !nameSpan) return;

            const itemId = nameSpan.id.split("-")[0];
            if (!itemId) return;

            console.log(`Scheduled fetch for ${nameSpan.textContent.trim()} (ID ${itemId}) after ${delay}ms`);

            const compareLine = addPlaceholder(desc);

            // Stagger requests
            setTimeout(() => {
                fetchValue(itemId, compareLine);
            }, delay);

            delay += 250; // 250ms between each request
        });
    }

    init();
})();