Greasy Fork

Crafting Tab Organizer

Crafting tab organizer for SF

当前为 2022-02-21 提交的版本,查看 最新版本

// ==UserScript==
// @name         Crafting Tab Organizer
// @namespace    http://tampermonkey.net/
// @version      0.1
// @author       Alucardeck
// @description  Crafting tab organizer for SF
// @match        https://play.soulforged.net/
// @license MIT
// @grant        none
// ==/UserScript==
(function() {
    'use strict';

    var craftMap = {};
    craftMap["Crafting"] = "375c63,11b698,1bda06,0f664a,ce8de9,fcf7c9";
    craftMap["Crafting (Tools)"] = "fd63c7,3ca9dd,08639e,2affab,babb47,c30017,a0b77a,068720";
    craftMap["Crafting (Furniture)"] = "2078f7,e0f499";
    craftMap["Cooking"] = "7a1efc,5444b8,a6e350";
    craftMap["Leatherworking"] = "8090f2";
    craftMap["Tailoring"] = "";
    craftMap["Farming"] = "286daf,c01bcc";
    craftMap["Carpentry"] = "dcc180";
    craftMap["Doctoring"] = "a929f9";
    craftMap["Doctoring (Butcher)"] = "74c20f,a2636a,dc3986,dc4872,3c77c0";
    craftMap["Not Mapped"] = "";

    var categoryOrder = Object.keys(craftMap).sort();

    function organizeCrafts() {
        // check if tab is active
        if (!getCraftIconTab().classList.contains("active"))
            return;

        // header 
        var mainBlock = document.querySelector("#app > div.main-component > div > div.controls > div > div > div > div.tab-contents > div > div > div > div > div:nth-child(1)");
        var header = mainBlock.firstChild;
        mainBlock.removeChild(header);

        var craftNodeList = mainBlock.querySelectorAll("div > div.craft-list-item");

        var mappedItems = {};

        [].forEach.call(craftNodeList, craft => {
            var block = craft.parentElement;
            var code = getCode(craft);
            var category = getCategory(code);

            if (category == "Not Mapped") {
                appendCodeToButton(craft, code);
            }

            if (!mappedItems[category])
                mappedItems[category] = [];
            mappedItems[category].push(block);
            mainBlock.removeChild(block);

        });


        for (var category of categoryOrder) {
            if (mappedItems[category]) {
                var categoryHeader = header.cloneNode(true);
                categoryHeader.firstChild.firstChild.innerHTML = category;
                mainBlock.appendChild(categoryHeader);

                for (var item of mappedItems[category]) {
                    mainBlock.appendChild(item);
                }
            }
        }

    }

    function appendCodeToButton(craft, code) {
        var btn = craft.querySelector("div > div.buttons");
        var div = document.createElement('div');
        div.innerText = code;
        btn.appendChild(div);
    }

    function getCode(craft) {
        return craft.firstChild.firstChild.firstChild.firstChild.firstChild.style.backgroundImage.substr(14, 6);
    }

    function getCategory(code) {
        for (var category of categoryOrder) {
            if (craftMap[category].includes(code)) {
                return category;
            }
        }
        return "Not Mapped";
    }

    function getCraftIconTab() {
        return document.querySelector("#app > div.main-component > div > div.controls > div > div > div > div.tab-headers > div.tab-header:nth-child(4)");
    }

    document.addEventListener("click", () => organizeCrafts());

})();