WarRevive

To request a revive from multiple revive providers for others

// ==UserScript==
// @name         WarRevive
// @namespace    http://tampermonkey.net/
// @version      1.0.3
// @license MIT
// @description  To request a revive from multiple revive providers for others
// @author       Kindly[1651049]
// @match        https://www.torn.com/factions.php*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=torn.com
// @grant        GM_addStyle
// @grant        GM.xmlHttpRequest
// @connect      tornuhc.eu
// @connect      api.no1irishstig.co.uk
// ==/UserScript==


// swap between UHC & NITE
// and click save, then refresh your war page
let reviveProvider = 'UHC';

/* --------- DO NOT MODIFY BELOW --------- */

new MutationObserver((mutations) => {
  mutations.forEach((mutation) => {
    for (const node of mutation.addedNodes) {
      addReviveCol();
    }
  });
}).observe(document.body, { childList: true, subtree: true });


function addReviveCol() {

    var factionElement = document.querySelector(".your-faction");
    if (factionElement) {
        var membersListElement = factionElement.querySelector(".members-list");
        if (membersListElement) {
            let titleNode = membersListElement.parentNode.querySelector(".title, .c-pointer");
            let titleAttackNode = titleNode.querySelector(".attack");
            titleAttackNode.style.display = 'block';
            titleAttackNode.childNodes[0].nodeValue = "Revive"

            for (let i = 0; i < membersListElement.children.length; i++) {
                let rowAttackNode = membersListElement.children[i].querySelector(".attack");

                if (rowAttackNode && rowAttackNode.childNodes[0].textContent != reviveProvider) {
                    rowAttackNode.style.display = 'block';
                    rowAttackNode.childNodes[0].style.cssText = rowAttackNode.childNodes[0].style.cssText;

                    rowAttackNode.childNodes[0].textContent = reviveProvider;
                    rowAttackNode.childNodes[0].style.color = '#ff8787';
                    rowAttackNode.addEventListener("click", (event) => {requestRevive(event)});

                }

            };

        } else {
            console.log('couldnt find members list');
        }
    } else {
        console.log('couldnt find your-faction');
    }
}

function requestRevive(event) {
    const name = event.target.parentNode?.parentNode?.querySelector('.honor-text:not([class*=" "])')?.textContent;
    const href = event.target.parentNode?.parentNode?.querySelector('.honor-text-wrap')?.parentNode?.getAttribute('href');
    const url = new URL(href, window.location.origin);
    const xid = parseInt(url.searchParams.get('XID'));

    console.log(`requesting revive for ${name} ${xid} with ${reviveProvider}`)

    if (reviveProvider == "NITE") {
        NiteRevive(xid, name);
    }

    if (reviveProvider == "UHC") {
        UHCRevive(xid, name);
    }

}

const Nite = "Midnight X";
function NiteRevive(xid, name) {

    const source = "Midnight X Script";
    const API_URL = 'https://api.no1irishstig.co.uk/request';
    GM.xmlHttpRequest({
    method: 'POST',
    url: API_URL,
    headers: {
      'Content-Type': 'application/json',
    },
    data: JSON.stringify({
      'tornid': parseInt(xid),
      'username': name,
      "vendor": Nite,
      'source': `${source} 1.2.4`,
      'type': 'revive'
    }),
    onload: handleNiteResponse,
  })
}

function UHCRevive(xid, name) {
    let source = "UHC Script"
    let sidebarData = getSidebar();
    let faction = sidebarData.statusIcons.icons.faction.subtitle.split(' of ')[1];
    var obj = new Object();
    obj.userID = xid;
    obj.userName = name;
    obj.factionName = faction;
    obj.source = source;

    var jsonString= JSON.stringify(obj);

    let url = 'https://tornuhc.eu/api/request'

    console.log(obj);
    GM.xmlHttpRequest({
        method: 'POST',
        url: url,
        data: jsonString,
        headers:    {
                "Content-Type": "application/json"
        },
        onload: function (response) {
            if (response.status == '200') {
                alert('Sent to UHC! Please pay your reviver 1 xanax or $1m')
            } else {
                alert(response.responseText)
            }
        },
        onerror: function (error) {
            alert('Something went wrong, please let Natty_Boh know')
        }
    })

}

function getSidebar() {
    let key = Object.keys(sessionStorage).find(key => /sidebarData\d+/.test(key));
    let sidebarData = JSON.parse(sessionStorage.getItem(key))
    return sidebarData
}

function handleNiteResponse(response) {
  if (response?.status && response.status !== 200) {
    var responseText = response.responseText.replace(/^"|"$/g, '');
    alert(`Error Code: ${response.status}\nMessage: ${responseText}` || `An unknown error has occurred`);
    return;
  }

  let contract = false;
  try {
    contract = !!JSON.parse(response.responseText).contract;
  } catch (e) {
  }

  if (contract) {
    alert(`Contract request has been sent to ${Nite}. Thank you!`)
  } else {
    alert(`Request has been sent to ${Nite}. Please pay your reviver a Xanax or $1m. Thank you!`);
  }
}



GM_addStyle(`
    @media screen and (max-width: 1000px) {
        .rv {
            display: none;
        }
    }

    .your-faction .level {
        width: 27px !important;
    }

    .your-faction .attack {
        width: 25px !important;
    }


    .your-faction .status {
        width: 34px !important;
    }

`);