您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
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);