Torn Faction Inventory Sum

Fetch and sum item quantities from the Torn API for a faction

目前为 2025-01-31 提交的版本。查看 最新版本

// ==UserScript==
// @name         Torn Faction Inventory Sum
// @namespace    http://tornfactioninventorybyak.net/
// @version      1.1
// @description  Fetch and sum item quantities from the Torn API for a faction
// @author       -A-K-[3455584]
// @license      MIT
// @match        https://www.torn.com/index.php
// @grant        none
// ==/UserScript==



(function() {
    'use strict';

    const categories = ["armor", "boosters", "caches", "drugs", "medical", "temporary", "weapons"];

    async function fetchCategoryInventory(apiKey, category) {
        const url = `https://api.torn.com/faction/?selections=${category}&key=${apiKey}`;
        console.log(`🔄 Fetching data for category: ${category} from ${url}`);

        try {
            const response = await fetch(url);
            if (!response.ok) {
                console.error(`❌ Error: HTTP ${response.status} - ${response.statusText}`);
                return 0;
            }

            const data = await response.json();
            if (data.error) {
                console.error(`⚠️ API Error: ${data.error.error}`);
                return 0;
            }

            let totalQuantity = 0;

            if (data[category] && Array.isArray(data[category])) {
                data[category].forEach(item => {
                    totalQuantity += parseInt(item.quantity) || 0;
                    console.log(`   ➕ ${item.name}: ${item.quantity}`);
                });
            }

            console.log(`✅ Total for ${category}: ${totalQuantity}`);
            return totalQuantity;

        } catch (error) {
            console.error("❌ Error fetching data:", error);
            return 0;
        }
    }

    async function fetchAndSumInventory(apiKey) {
        let totalSum = 0;
        let categorySums = {};

        for (const category of categories) {
            const categoryTotal = await fetchCategoryInventory(apiKey, category);
            categorySums[category] = categoryTotal;
            totalSum += categoryTotal;
            await new Promise(resolve => setTimeout(resolve, 1000)); // Delay to prevent rate limiting
        }

        displayResult(categorySums, totalSum);
    }

    function displayResult(categorySums, totalQuantity) {
        let resultDiv = document.getElementById("inventoryTotal");
        if (!resultDiv) {
            resultDiv = document.createElement("div");
            resultDiv.id = "inventoryTotal";
            resultDiv.style.padding = "10px";
            resultDiv.style.marginTop = "10px";
            resultDiv.style.background = "#1e1e1e";
            resultDiv.style.color = "#fff";
            resultDiv.style.borderRadius = "5px";
            document.getElementById("column1").appendChild(resultDiv);
        }

        let resultHTML = "<strong>Inventory Summary:</strong><br><ul style='padding-left: 15px;'>";
        for (const [category, sum] of Object.entries(categorySums)) {
            resultHTML += `<li><strong>${category}:</strong> ${sum}</li>`;
        }
        resultHTML += `</ul><strong>Total Quantity of Items:</strong> ${totalQuantity}`;

        resultDiv.innerHTML = resultHTML;
    }

    function createFetchButton() {
        const container = document.getElementById("column1");
        if (!container) {
            console.warn("⚠️ Column1 div not found!");
            return;
        }

        const button = document.createElement("button");
        button.innerText = "Fetch Inventory Sum";
        button.style.padding = "8px 12px";
        button.style.marginTop = "10px";
        button.style.background = "#0078D7";
        button.style.color = "#fff";
        button.style.border = "none";
        button.style.borderRadius = "5px";
        button.style.cursor = "pointer";
        button.style.fontSize = "14px";
        button.style.display = "block";
        button.style.width = "100%";

        button.onclick = function() {
            const apiKey = prompt("🔑 Enter your Torn API key:");
            if (apiKey) {
                fetchAndSumInventory(apiKey);
            }
        };

        container.appendChild(button);
    }

    setTimeout(createFetchButton, 2000);
})();