Greasy Fork 支持简体中文。

Streamlined Upkeep Manager 1.5

Manage and pay upkeeps more efficiently

// ==UserScript==
// @name         Streamlined Upkeep Manager 1.5
// @namespace    upkeep,zero.torn
// @version      1.5
// @description  Manage and pay upkeeps more efficiently
// @author       Combined by Aria and Jeff Bezas
// @match        https://www.torn.com/index.php
// @icon         https://www.google.com/s2/favicons?sz=64&domain=torn.com
// @grant        none
// @license MIT
// ==/UserScript==

(function($) {
    'use strict';

    // API token management
    function manageApiToken() {
        let apiToken = localStorage.getItem('tornApiToken');
        if (!apiToken) {
            apiToken = prompt("Please enter your Torn API token key:");
            if (apiToken) {
                localStorage.setItem('tornApiToken', apiToken);
            }
        }
        return apiToken;
    }
    function getRFC() {
        var rfc = $.cookie('rfc_v');
        if (!rfc) {
            var cookies = document.cookie.split('; ');
            for (var i in cookies) {
                var cookie = cookies[i].split('=');
                if (cookie[0] == 'rfc_v') {
                    return cookie[1];
                }
            }
        }
        return rfc;
    }

    function addUpkeepButtons(apiToken, button) {
        console.log("Adding Buttons");
        if (button == 0) {
            const upkeepButton = $('<button id="Upkeep" style="color: var(--default-blue-color); cursor: pointer; margin-right: 10px;">Pay Upkeep</button>');
            $('div.content-title > h4').append(upkeepButton);
            upkeepButton.on('click', async () => {
                //alert("2 aler");
                let flag = localStorage.getItem('Flag');
                if (flag == 0){
                    alert("Unable to do that while traveling abroad.");
                    return;
                }
                const enteredAmount = Number($('#amountInput').val());
                if (enteredAmount > 0) {
                    const propertyId = await fetchPropertyId(apiToken);
                    pay(enteredAmount, propertyId);
                    let currentAmt = localStorage.getItem('FeesAmount');
                    let newVal = currentAmt - enteredAmount;
                    //alert(newVal);
                    localStorage.setItem('FeesAmount', newVal);
                    alert("Payment successful");
                    $('#Upkeep').text(`Pay Upkeep | Total: $${newVal}`);
                } else {
                    alert("Please enter a valid amount.");
                }
            });
            return upkeepButton;
        }
        if (button == 1) {
            const upkeepButton2 = $('<button id="Upkeep2" style="color: var(--default-blue-color); cursor: pointer; margin-right: 10px;">Check Balance</button>');
            $('div.content-title > h4').append(upkeepButton2);
            upkeepButton2.on('click', () => {
                let balance = localStorage.getItem('Balance') || 0;
                let balance2 = balance.toString().replace(/,/g, ''); // Remove commas

                let feesAmt2 = localStorage.getItem('FeesAmount'); //Attemot to get last fee amount before going over seas
            let number2 = feesAmt2.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
            //Testing

            balance = Number(balance);
            feesAmt2 = Number(feesAmt2);
            //alert(`Fees: ${feesAmt2} and Bal: ${number3}`);
            let dif = feesAmt2-balance; //Number4 = Upkeep Total - Balance, if this is less than 0, should equal to Upkeep Total
                if (dif < 0){
                    balance2 = feesAmt2;
                }
                alert(balance2); // Check if upkeep-bal is less than 0, if so, pay upkeep instead

                //let formattedAmount = balance.replace(/^.|.$/g, '').trim();

                //alert(balance2);
                $('#amountInput').val(balance2);
                let feesAmt = localStorage.getItem('FeesAmount');
                let formattedNumber = feesAmt.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
                $('#Upkeep').text(`Pay Upkeep | Total: $${formattedNumber}`);

                //alert(`Current Balance: $${balance}`);
            });
            return upkeepButton2;
        }
        if (button == 2) {
            const resultSpan = $('<span id="Result" style="font-size: 12px; font-weight: 100;"></span>');
            $('div.content-title > h4').append(resultSpan);
            return resultSpan;
        }
        if (button == 3) {
            const resetButton = $('<button id="ResetKey" style="color: var(--default-red-color); cursor: pointer;">Reset API Key</button>');
            resetButton.on('click', () => {
                const newApiToken = prompt("Please enter your new Torn API token key:");
                if (newApiToken) {
                    localStorage.setItem('tornApiToken', newApiToken);
                    $('#Result').text('API token updated.').css('color', 'green');
                } else {
                    $('#Result').text('No API token provided.').css('color', 'red');
                }
            });
            $('div.content-title > h4').append(resetButton);
        }
    }
    // Fetch Property ID
    async function fetchPropertyId(apiToken) {
        console.log("Fetching Property ID...");
        const apiURL = `https://api.torn.com/user/?key=${apiToken}&comment=StreamlinedUpkeepManager&selections=properties`;
        try {
            const response = await fetch(apiURL);
            const data = await response.json();
            const propertyIds = Object.keys(data.properties);
            //console.log("Fetched Property IDs:", propertyIds);
            return propertyIds.length > 0 ? propertyIds[0] : null;
        } catch (error) {
            console.error('Error fetching property ID:', error);
            return null;
        }
    }

    // Pay upkeep function
    function pay(toPay, propertyID) {
        console.log(`Attempting to pay upkeep of: $${toPay} for Property ID: ${propertyID}`);
        $("#Upkeep").text("Processing...").prop("disabled", true);

        $.post(`https://www.torn.com/properties.php?rfcv=${getRFC()}`, {
            step: "upkeepProperty",
            pay: toPay,
            ID: propertyID
        })
            .done(function(response) {
            response = JSON.parse(response);
            if (response.success) {
                console.log("Payment successful");
                //$("#Upkeep").text("Paid");
            } else {
                console.error("Payment failed:", response.error);
                alert("Payment failed:", response.error);
                //$("#U").text("Payment Failed");
            }
        })
            .fail(function() {
            console.error("Network error during payment");
            $("#Upkeep").text("Payment Failed");
        })
            .always(function() {
            $("#Upkeep").prop("disabled", false);
        });
    }

    // Function to fetch and format amount
    function fetchAndFormatAmountFromFeesSpan(feesSpan) {
        const textContent = feesSpan.textContent;
        const amountMatch = textContent.match(/\$([\d,]+)/); // Updated regex to match dollar sign

        if (amountMatch && amountMatch[1]) {
            const amount = amountMatch[1].replace(/,/g, ''); // Remove commas
            console.log("Extracted Amount: ", amount); // Log the number without commas
            localStorage.setItem('FeesAmount', amount); // Save to local storage
            return Number(amount);
        } else {
            console.log("Amount not found in text content.", amountMatch);
            return 0; // Return 0 if not found
        }
    }

    // Main function to run the script
    async function main() {
        console.log("Starting...");
        const apiToken = manageApiToken();
        if (!apiToken) {
            //apiToken = 0;
            addUpkeepButtons(0, 2);
            $('#Result').text('No API token provided.').css('color', 'red');
            return;
        }

        const bodyElement = document.querySelector("#body");
        if (bodyElement && bodyElement.getAttribute("data-traveling") === 'true' || (document.querySelector("#mainContainer > div.content-wrapper.autumn.travelling"))) { // Travel check
            //$('#Result').text("You can't do that while Traveling.").css('color', 'red');
            let feesAmt2 = localStorage.getItem('FeesAmount'); //Attemot to get last fee amount before going over seas
            let number2 = feesAmt2.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
            //Testing
            let balance = localStorage.getItem("Balance");
            balance = balance.toString().replace(/,/g, '');
            balance = Number(balance);
            feesAmt2 = Number(feesAmt2);
            //alert(`Fees: ${feesAmt2} and Bal: ${number3}`);
            let dif = feesAmt2-balance; //Number4 = Upkeep Total - Balance, if this is less than 0, should equal to Upkeep Total
            //number4 = number4.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
            //alert(dif);

            const flag = 0;
            localStorage.setItem('Flag', flag);
            addUpkeepButtons(apiToken, 0);
            $('#Upkeep').text(`Current Upkeep: $${number2}\nYou can pay when you get back`);
            return; // Exit the function if traveling
        }
        const resultSpan = addUpkeepButtons(apiToken, 2); // Create result span


        const feesSpan = document.querySelector("#item20230685 > div.bottom-round > div > ul > li.last > span.desc");
        if (feesSpan) {
            const toPay = fetchAndFormatAmountFromFeesSpan(feesSpan); // Get the amount from feesSpan

            console.log("To Pay: ", toPay); // Log the amount to pay


            // Create input field and buttons
            const upkeepButton = addUpkeepButtons(apiToken, 0); // Add the first upkeep button
            const upkeepButton2 = addUpkeepButtons(apiToken, 1); // Add the second upkeep button
            const inputField = $('<input type="number" id="amountInput" placeholder="Enter amount" />');
            $('div.content-title > h4').append(inputField);
            //addUpkeepButtons(apiToken, 0);

            // Append input field and button to the result area
            //$('#Result').append(inputField);

            // Event listener for Enter key press
            inputField.on('keypress', function(event) {
                if (event.which === 13) { // Enter key
                    const enteredAmount = Number($(this).val());
                    if (enteredAmount > 0) {
                        pay(enteredAmount, propertyId); // Call pay function with entered amount

                        let newVal = toPay - enteredAmount;
                        localStorage.setItem('FeesAmount', newVal);
                        let formattedNumber = newVal.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
                        alert("Payment successful");
                        $('#Upkeep').text(`Pay Upkeep | Total: $${formattedNumber}`);
                    } else {
                        alert("Please enter a valid amount.");
                    }
                }
            });

            // Initialize the Pay Upkeep button
            upkeepButton.on('click', function() {
                alert("1 aler");
                const enteredAmount = Number(inputField.val());
                if (enteredAmount > 0) {
                    pay(enteredAmount, propertyId); // Call pay function with entered amount
                } else {
                    alert("Please enter a valid amount.");
                }
            });
        } else {
            console.log("Fees span element not found.");
        }

        const balSpan = document.querySelector("#user-money");
        if (balSpan) {
            let balance = balSpan.textContent;
            balance = balance.match(/\$([\d,]+)/);
            console.log("User Balance: ", balance[1]); //Remember to set value without commas, or always set with commas, only when need int, replace commas, then Number()
            localStorage.setItem('Balance', balance[1]);
            //addUpkeepButtons(apiToken, 1);

        } else {
            console.log("Balance span element not found.");
        }

        const propertyId = await fetchPropertyId(apiToken);
        if (!propertyId) {
            $('#Result').text('Failed to retrieve property ID.').css('color', 'red');
            return;
        }
    }

    // Call main function to start the script
    main();
})(jQuery);