Fragment Fixer

GUI to filter through Fragment auctions

// ==UserScript==
// @name         Fragment Fixer
// @namespace    http://tampermonkey.net/
// @version      2.5
// @description  GUI to filter through Fragment auctions
// @match        *://fragment.com/*
// @grant        none
// @license MIT
// ==/UserScript==

(function() {
    'use strict';

    let hiddenSubdomains = JSON.parse(localStorage.getItem('hiddenSubdomains') || '[]');
    let hiddenShitSubdomains = JSON.parse(localStorage.getItem('hiddenShitSubdomains') || '[]');

    // Function to create the GUI
    function createGUI() {
        const gui = document.createElement('div');
        gui.style.position = 'fixed';
        gui.style.top = '10px';
        gui.style.right = '10px';
        gui.style.backgroundColor = '#1a2026'; // Dark background color
        gui.style.color = '#ffffff'; // White font color
        gui.style.padding = '10px';
        gui.style.zIndex = '10000';
        gui.style.cursor = 'move';
        gui.style.width = '180px'; // Compact width
        gui.style.fontSize = '12px';
        gui.style.boxShadow = '0px 0px 10px rgba(0, 0, 0, 0.1)';
        gui.style.border = 'none'; // Remove borders
        gui.id = 'draggableGui';

        const resaleCheckbox = createCheckbox('hideResale', 'Hide Resales');
        const commaCheckbox = createCheckbox('hideComma', 'Hide $1,000+');
        const shitCheckbox = createCheckbox('hideShit', 'Hide Shit');

        const credit = document.createElement('a'); // Changed to anchor element
        credit.href = 'https://t.me/poseidon'; // URL to redirect
        credit.innerText = 't.me/poseidon';
        credit.style.fontSize = '10px';
        credit.style.marginTop = '10px';
        credit.style.textAlign = 'center';
        credit.style.display = 'block'; // Make the anchor element block-level for easier clicking

        gui.appendChild(resaleCheckbox);
        gui.appendChild(commaCheckbox);
        gui.appendChild(shitCheckbox);
        gui.appendChild(credit); // Append anchor element to GUI

        document.body.appendChild(gui);

        makeDraggable(gui);
    }

    // Helper function to create checkbox with label
    function createCheckbox(id, label) {
        const checkbox = document.createElement('input');
        checkbox.type = 'checkbox';
        checkbox.id = id;
        checkbox.style.marginRight = '5px'; // Add space between checkbox and text
        checkbox.addEventListener('change', hideRows);

        const checkboxLabel = document.createElement('label');
        checkboxLabel.htmlFor = id;
        checkboxLabel.innerText = label;

        const checkboxContainer = document.createElement('div');
        checkboxContainer.style.marginBottom = '5px'; // Add margin bottom for separation
        checkboxContainer.appendChild(checkbox);
        checkboxContainer.appendChild(checkboxLabel);

        return checkboxContainer;
    }

    // Function to hide rows based on criteria
    function hideRows() {
        const hideResale = document.getElementById('hideResale')?.checked;
        const hideComma = document.getElementById('hideComma')?.checked;
        const hideShit = document.getElementById('hideShit')?.checked;

        let rows = document.querySelectorAll('tr.tm-row-selectable');
        rows.forEach(row => {
            let subdomain = row.querySelector('.subdomain') ? row.querySelector('.subdomain').innerText : '';
            let hide = false;

            if (hiddenSubdomains.includes(subdomain)) {
                hide = true;
            } else {
                if (hideResale && row.innerText.includes('Resale')) {
                    hide = true;
                }
                if (hideComma && row.innerText.includes(',')) {
                    hide = true;
                }
                if (hideShit && (subdomain.includes('_') || /\d/.test(subdomain))) {
                    hide = true;
                }
            }

            if (hide) {
                row.style.display = 'none';
            } else {
                row.style.display = ''; // Reset the display style if criteria do not match
                addHideButton(row); // Add hide button if not already hidden
            }
        });
    }

    // Function to add "Hide" button to a row
    function addHideButton(row) {
        const subdomainElement = row.querySelector('.subdomain');
        if (subdomainElement && !row.querySelector('.hide-button')) {
            const hideButton = document.createElement('button');
            hideButton.innerText = 'Hide';
            hideButton.className = 'hide-button';
            hideButton.style.marginLeft = '10px';
            hideButton.style.backgroundColor = '#1a2026';
            hideButton.style.color = '#ffffff';
            hideButton.style.border = '1px solid #1a2026';
            hideButton.style.cursor = 'pointer';
            hideButton.addEventListener('click', (event) => {
                event.preventDefault(); // Prevent default action
                event.stopPropagation(); // Stop the event from propagating
                const subdomain = subdomainElement.innerText;
                hiddenSubdomains.push(subdomain);
                localStorage.setItem('hiddenSubdomains', JSON.stringify(hiddenSubdomains));
                hideRows();
            });
            const descElement = row.querySelector('.table-cell-desc');
            if (descElement) {
                descElement.appendChild(hideButton);
            }
        }
    }

    // Function to make the GUI draggable
    function makeDraggable(element) {
        let pos1 = 0, pos2 = 0, pos3 = 0, pos4 = 0;

        element.onmousedown = dragMouseDown;

        function dragMouseDown(e) {
            e = e || window.event;
            e.preventDefault();
            pos3 = e.clientX;
            pos4 = e.clientY;
            document.onmouseup = closeDragElement;
            document.onmousemove = elementDrag;
        }

        function elementDrag(e) {
            e = e || window.event;
            e.preventDefault();
            pos1 = pos3 - e.clientX;
            pos2 = pos4 - e.clientY;
            pos3 = e.clientX;
            pos4 = e.clientY;
            element.style.top = (element.offsetTop - pos2) + "px";
            element.style.left = (element.offsetLeft - pos1) + "px";
        }

        function closeDragElement() {
            document.onmouseup = null;
            document.onmousemove = null;
        }
    }

    // Initialize the GUI on page load
    window.addEventListener('load', () => {
        createGUI();
        hideRows();
    });

    // Re-apply hiding on DOM changes (e.g., AJAX content load)
    let observer = new MutationObserver(() => {
        hideRows();
    });
    observer.observe(document.body, { childList: true, subtree: true });
})();