Streamlined Upkeep Manager 1.5

Manage and pay upkeeps more efficiently

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

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

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

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

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

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

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

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

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

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

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

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

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

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

// ==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);