Ahab / Faction Gym Perks

// ==UserScript==
// @name         Faction Gym Perks
// @namespace    torn.com
// @version      0.1
// @author       Ahab [1735214]
// @include      */www.torn.com/gym.php
// @updateURL    https://openuserjs.org/meta/Ahab/Faction_Gym_Perks.meta.js
// @downloadURL  https://openuserjs.org/install/Ahab/Faction_Gym_Perks.user.js
// @license      MIT
// ==/UserScript==


if(!localStorage.gymAPI || localStorage.gymAPI === "null"){
    localStorage.gymAPI = prompt('Enter API Key')
}

let plusGains = [];

function fetchGymData() {
    if(!localStorage.gymAPI || $(window)[0].location.href.includes('recaptcha')) return;

    getAction({
        type: "GET",
        action: `https://api.torn.com/user/?selections=perks&key=${localStorage.gymAPI}`,
    }).then(apiData => {
        if(apiData.error){
            alert(`Error code - ${apiData.error.code} | ${apiData.error.error}`);
            setInterval(() => console.log('Key unblocked'), 120000);
        }else{
            plusGains = apiData.faction_perks.filter(v => v.includes("gym gains")).map(v => [v.split(" ")[2], parseFloat(v.split(" ")[1])]).sort((a, b) => b[1] - a[1]);
            applyGymHighlight();
        }
    });
}

function applyGymHighlight() {
    const $descFirst = $("li div[class*='propertyContent'] div[class*='description']").first();
    if($descFirst.length === 0) return;

    const primaryColor = getComputedStyle($descFirst[0]).getPropertyValue("--gym-description-primary-color").trim().toLowerCase();
    const secondaryColor = getComputedStyle($descFirst[0]).getPropertyValue("--gym-description-secondary-color").trim().toLowerCase();
    const lightColors = ["#fff", "#ffffff", "#ddd", "#dddddd"];

    if (plusGains.length === 0) return;

    const values = plusGains.map(x => x[1]);
    const maxVal = Math.max(...values);
    const minVal = Math.min(...values);

    plusGains.forEach(([stat, value]) => {
        const $el = $(`li:has(h3.title___rZiDb:contains(${stat.charAt(0).toUpperCase() + stat.slice(1)}))`);
        if ($el.length === 0) return;

        if(value === maxVal){
            $el[0].style.setProperty("background-color", "lightgreen", "important");
        }else if(value === minVal){
            $el[0].style.setProperty("background-color", "lightcoral", "important");
        }else{
            $el[0].style.setProperty("background-color", "khaki", "important");
        }

        if(lightColors.includes(primaryColor) || lightColors.includes(secondaryColor)){
            $el.find("div[class*='description'] p").css("color", "black");
        }

        const $title = $el.find("h3.title___rZiDb");
        if($title.length > 0){
            $title.attr("title", `Fac perk: ${value}%`);
        }
    });
}

var gymCheck = setInterval(() => {
    if($('div[class*="description"]').length >= 1){
        clearInterval(gymCheck);
        fetchGymData();
    }
}, 100);