Torn Crime Success Rates Logger - PDA Version

4/11/2025, 7:42:01 PM

// ==UserScript==
// @name        Torn Crime Success Rates Logger - PDA Version
// @namespace   Violentmonkey Scripts
// @match       https://www.torn.com/factions.php?step=your&type=1*
// @grant       GM_xmlhttpRequest
// @version     1.3
// @license     MIT
// @author      -
// @description 4/11/2025, 7:42:01 PM
// ==/UserScript==

const webAppUrl = 'URL_HERE';

(async () => {
  const getCurrentTornUser = () => {
    console.log("Searching For Logged In User");
    const user = JSON.parse(document.getElementById("torn-user").value);
    console.log(JSON.stringify(user));
    return user;
  };

  console.log("Getting Crime Success Rates");

  while (document.querySelectorAll('.waitingJoin___jq10k').length === 0) {
    await new Promise(resolve => setTimeout(resolve, 2000));
    console.log("No Joinable Crimes Present Yet");
  }

  const crimesSuccessOutputObject = {};
  const crimeWrappers = document.querySelectorAll('.wrapper___U2Ap7');

  crimeWrappers.forEach(crime => {
    const crimeTitle = crime.querySelector('.panelTitle___aoGuV').textContent.split(' ').join('_');
    const crimeTier = crime.querySelector('.levelValue___TE4qC').textContent;
    const roles = crime.querySelectorAll('.waitingJoin___jq10k');

    if (!crimesSuccessOutputObject[crimeTitle]) {
      crimesSuccessOutputObject[crimeTitle] = {
        tier: crimeTier,
        roles: {}
      };
    }

    roles.forEach(role => {
      const roleName = role.querySelector('.title___UqFNy').textContent;
      const roleSuccess = role.querySelector('.successChance___ddHsR').textContent;

      crimesSuccessOutputObject[crimeTitle].roles[roleName] = roleSuccess;
    });
  });

  console.log("crimesSuccessOutputObject");
  console.log(JSON.stringify(crimesSuccessOutputObject));

  const user = getCurrentTornUser();

  const obj = {
    user: {
      id: user.id,
      name: user.playername
    },
    rolesObject: crimesSuccessOutputObject
  };

  try {
    console.log("About to make POST request");
    const response = await window.flutter_inappwebview.callHandler(
      'PDA_httpPost',
      webAppUrl,
      {
        'Content-Type': 'application/json',
        'Accept': 'application/json',
        'Origin': 'https://torn.com',
        'Referer': 'https://torn.com',
        'X-Requested-With': 'XMLHttpRequest'
      },
      JSON.stringify(obj)
    );

    if (response && typeof response === "object") {
      console.log("POST Response:", response.status, response.statusText);
    } else {
      console.log("POST Response is bad", response);
    }
  } catch (error) {
    console.error("POST Error:", error ?? "no error object");
  }
})();