Torn OC 2 Requirements

Torn Organised Crimes v2.0 requirements for roles

// ==UserScript==
// @name         Torn OC 2 Requirements
// @namespace    https://github.com/SOLiNARY
// @version      0.2
// @description  Torn Organised Crimes v2.0 requirements for roles
// @author       Silmaril [2665762]
// @license      MIT License
// @match        https://www.torn.com/factions.php?step=your
// @match        https://www.torn.com/factions.php?step=your*
// @match        https://torn.com/factions.php?step=your
// @match        https://torn.com/factions.php?step=your*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=torn.com
// @run-at       document-idle
// ==/UserScript==

(function() {
    'use strict';

    const CRIMES_TAB = '#/tab=crimes';
    const CRIMES_REQUIREMENTS = {'Blast from the Past': {'Bomber': 70, 'Engineer': 70, 'Hacker': 70, 'Muscle': 70, 'Picklock #1': 70, 'Picklock #2': 0},
                                'Break the Bank': {'Robber': 60, 'Thief #1': 60, 'Thief #2': 60, 'Muscle #1': 60, 'Muscle #2': 60, 'Muscle #3': 60},
                                'Stacking the Deck': {'Cat Burglar': 68, 'Driver': 50, 'Imitator': 68, 'Hacker': 68},
                                'Ace in the Hole': {'Hacker': 63, 'Driver': 53, 'Imitator': 63, 'Muscle #1': 63, 'Muscle #2': 63}};

    const observerTarget = document.querySelector("#faction-crimes");
    const observerConfig = { attributes: false, childList: true, characterData: false, subtree: true };
    const observer = new MutationObserver(function(mutations) {
        mutations.forEach(mutationRaw => {
            if (window.location.href.indexOf(CRIMES_TAB) > -1){
                let mutation = mutationRaw.target;
                if (String(mutation.className).indexOf('description___') > -1){
                    let crimeParentRow = mutation.parentNode.parentNode.parentNode;
                    let crimeTitle = crimeParentRow.querySelector('[class^=scenario] > [class^=wrapper___] > [class^=panel___] > [class^=panelTitle___]').textContent;
                    let crimeRequirements = CRIMES_REQUIREMENTS[crimeTitle];
                    if (crimeRequirements === undefined) return;
                    crimeParentRow.querySelectorAll('[class^=wrapper___] > [class^=wrapper___]').forEach(crime => {
                        let slotTitle = crime.querySelector('[class^=slotHeader___] > [class^=title___]').textContent;
                        let slotSkill = Number(crime.querySelector('[class^=slotHeader___] > [class^=successChance___]').textContent);
                        if (crime.className.indexOf('waitingJoin___') > -1){
                            let roleRequirement = crimeRequirements[slotTitle];
                            if (roleRequirement !== undefined){
                                if (slotSkill < roleRequirement){
                                    let roleJoinBtn = crime.querySelector('[class^=slotBody___] > [class^=joinContainer___] > [class^=joinButtonContainer___] > [class*=joinButton___]');
                                    roleJoinBtn.setAttribute('disabled', true);
                                    roleJoinBtn.textContent = `<${roleRequirement}`;
                                    roleJoinBtn.style.color = 'crimson';
                                }
                            }
                        }
                    });
                }
            }
        });
    });
    observer.observe(observerTarget, observerConfig);
})();