Torn Crime Success Rates Logger

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

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

const webAppUrl = 'URL_HERE';

(async () => {
  const getCurrentTornUser = () => {
    const user = JSON.parse(document.getElementById("torn-user").value)
    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').innerHTML.split(' ').join('_');
    const crimeTier = crime.querySelector('.levelValue___TE4qC').innerHTML;
    const roles = crime.querySelectorAll('.waitingJoin___jq10k');

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

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

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

  const user = getCurrentTornUser()

  const obj = {
    user : {
      id : user.id,
      name : user.playername
    },
    rolesObject : crimesSuccessOutputObject
  }
  console.log(JSON.stringify(obj))
  try {
    jsonResponse = await new Promise((resolve, reject) => {
      GM_xmlhttpRequest({
        method: 'POST',
        url: webAppUrl,
        data : JSON.stringify(obj),
        headers : { 'Content-Type' : 'application/json' },
        onload: function (response) {
          console.log("Response: ", response)
          if (response.status >= 200 && response.status < 300) {
            try {
              const responseData = JSON.parse(response.responseText);
              resolve(responseData);
            } catch (error) {
              reject(new Error("Failed to parse JSON"));
            }
          } else {
            reject(new Error(`API request failed with status: ${response.status}`));
          }
        },
        onerror: function (error) {
          reject(new Error(`API request failed with error: ${error}`));
        }
      });
    });

    console.log(jsonResponse);

    return jsonResponse;
  } catch (error) {
        console.error(`Attempt 1 failed: ${error.message}`);
  }

})()