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