stock-vault

stock vault for torn.com

You will need to install an extension such as Tampermonkey, Greasemonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey or Userscripts to install this script.

You will need to install an extension such as Tampermonkey to install this script.

You will need to install a user script manager extension to install this script.

(I already have a user script manager, let me install it!)

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

(I already have a user style manager, let me install it!)

// ==UserScript==
// @name         stock-vault
// @namespace    stock-vault.zero.nao
// @version      0.2
// @description  stock vault for torn.com
// @author       nao [2669774]
// @match        https://www.torn.com/page.php?sid=stocks*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=torn.com
// @grant        none

// ==/UserScript==

let stocks = {};
let stockId = {};

function insert() {
  let current = localStorage.stockVault;
  let symbols = [];
  if ($("ul[class^='stock_']").length == 0) {
    setTimeout(insert, 500);
    return;
  }
  $("ul[class^='stock_']").each(function() {
    let sym = $("img", $(this)).attr("src").split("logos/")[1].split(".svg")[0];
    symbols.push(sym);
    // console.log($(this));
    stockId[sym] = $(this).attr("id");
    stocks[sym] = $("div[class^='price_']", $(this));
  });
  symbols.sort();
  let container = `<div>
        <select name="stock" id="stockid"><option value=""></option>`;
  for (let sy of symbols) {
    if (current && current == sy) {
      container += `<option value="${sy}" selected="selected">${sy}</option>`;
    } else {
      container += `<option value="${sy}">${sy}</option>`;
    }
  }

  container += `</select>
        <button id="vaultall" class="torn-btn">Vault</button>
        <input type="try" placeholder="Amount" id="sellval">
        <button id="sellamt" class="torn-btn">Withdraw</button></div>
        <span id="responseStock"></span>`;

  $("#stockmarketroot").prepend(container);
  $("#stockid").change(updateStock);
  $("#vaultall").on("click", vault);
  $("#sellamt").on("click", withdraw);
  $("#sellval").on("keyup", updateKMB);
}

function updateStock() {
  // console.log(getPrice($("#stockid").attr("value")));
  localStorage.stockVault = $("#stockid").attr("value");
}

function getPrice(id) {
  return parseFloat($(stocks[id]).text());
}

function vault() {
  let symb = localStorage.stockVault;
  let money = parseInt(
    document.getElementById("user-money").getAttribute("data-money"),
  );
  let price = getPrice(symb);
  let amt = Math.floor(money / price);

  $.post(
    `https://www.torn.com/page.php?sid=StockMarket&step=buyShares&rfcv=${getRFC()}`,
    {
      stockId: stockId[symb],
      amount: amt,
    },
    function(response) {
      // response = JSON.parse(response);

      $("#responseStock").html(response.success ? "Vaulted" : "Failed");
      $("#responseStock").css("color", response.success ? "green" : "red");
    },
  );
}

function updateKMB() {
  try {
    let val = $("#sellval").attr("value");

    // Ensure val is a string and trim any whitespace
    if (typeof val !== "string") {
      throw new Error("Invalid input");
    }
    val = val.trim().toLowerCase();

    if (
      val.endsWith(".") &&
      val.length > 1 &&
      !val.slice(0, -1).includes(".")
    ) {
      return; // Allow user to continue typing
    }

    // Parse the value based on suffix
    if (val.endsWith("k")) {
      val = val.replace("k", "") * 1000;
    } else if (val.endsWith("m")) {
      val = val.replace("m", "") * 1000000;
    } else if (val.endsWith("b")) {
      val = val.replace("b", "") * 1000000000;
    } else if (!isNaN(val) && val.length > 0) {
      val = val; // Handle numeric values directly
    } else {
      throw new Error("Invalid input format");
    }
    // Update the attribute with the parsed value
    $("#sellval").attr("value", val);
  } catch (e) {
    // Handle errors by resetting the value
    $("#sellval").attr("value", "");
    console.error("Error in updateKMB:", e.message);
  }
}

function withdraw() {
  let symb = localStorage.stockVault;
  let val = parseFloat($("#sellval").attr("value")) / 0.999;
  let price = getPrice(symb);
  let amt = Math.ceil(val / price);
  console.log(`Value: ${val}, Price: ${price}, Amount: ${amt}`);
  $.post(
    `https://www.torn.com/page.php?sid=StockMarket&step=sellShares&rfcv=${getRFC()}`,
    {
      stockId: stockId[symb],
      amount: amt,
    },
    function(response) {
      // response = JSON.parse(response);

      $("#responseStock").html(response.success ? "Withdrawn" : "Failed");
      $("#responseStock").css("color", response.success ? "green" : "red");
    },
  );
}

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;
}

insert();

const style = `

#sellval{

  color: white;
  border: 2px solid #609b9b;
  border-radius: 10px;
  padding: 2px 25px;
  background: transparent;
  max-width: 190px;
}
#sellval:active {
  box-shadow: 2px 2px 15px #8707ff inset;
}

`;
const styleSheet = document.createElement("style");
styleSheet.textContent = style;
(document.head || document.documentElement).appendChild(styleSheet);