DartCounter OnlyCam

Filter matches in online lobby to show only cam matches.

目前為 2024-03-01 提交的版本,檢視 最新版本

// ==UserScript==
// @name         DartCounter OnlyCam
// @namespace    http://dartcounter.net/
// @version      1.1
// @license      MIT
// @description  Filter matches in online lobby to show only cam matches.
// @match        http*://dartcounter.net/*
// @icon         https://dartcounter.net/favicon-32x32.png
// @require      https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/js/all.min.js
// @grant        GM_getValue
// @grant        GM_setValue
// ==/UserScript==

(function() {
    'use strict';

    var ShowCamOnly = GM_getValue("ShowCamOnly", 1);

    function isCamNode(node) {
        let icon = node.getElementsByTagName("mat-icon")[0];
        if (icon) {
            let iconName = icon.getAttribute("data-mat-icon-name");
            if (iconName && iconName.toLowerCase() == "videocam-outline") {
                return true;
            }
        }
        return false;
    }

    function setNodeVisible(node, visible) {
        if (visible) {
            node.style.display = 'block';
        } else {
            node.style.display = 'none';
        }
    }

    var observer = new MutationObserver(function(mutations) {
        for (const mutation of mutations) {
            for (const node of mutation.addedNodes) {
                if (node.nodeName.toLowerCase() == "app-global-lobby-online-game") {
                    let mainHeader = node.getElementsByClassName("main-header")[0];
                    if (mainHeader) {
                        const svg = document.createElement('svg');
                        Object.assign(svg, {
                            className: "fa-2xs fa-regular fa-eye",
                        });

                        const icon = document.createElement('mat-icon');
                        Object.assign(icon, {
                            className: "mat-icon notranslate header-button-icon mat-icon-no-color",
                            role: "img",
                        });
                        if (!ShowCamOnly) {
                            icon.setAttribute("disabled", "disabled");
                        }
                        icon.append(svg);

                        var button = document.createElement("button");
                        button.addEventListener('click', function onClick(event) {
                            if (icon.getAttribute("disabled")) {
                                icon.removeAttribute("disabled");
                                ShowCamOnly = 1;
                            } else {
                                icon.setAttribute("disabled", "disabled");
                                ShowCamOnly = 0;
                            }

                            let nodes = document.getElementsByTagName("app-joinable-online-game");
                            for (const node of nodes) {
                                setNodeVisible(node, !ShowCamOnly || isCamNode(node));
                            }

                            GM_setValue('ShowCamOnly', ShowCamOnly);
                        });
                        button.append(icon);

                        mainHeader.lastElementChild.prepend(button);
                    }
                }

                if (node.nodeName.toLowerCase() == "app-joinable-online-game") {
                    setNodeVisible(node, !ShowCamOnly || isCamNode(node));
                }
            }
        }
    });
    observer.observe(document, {attributes: false, childList: true, characterData: false, subtree:true});

})();