Torn Buy Filter

A script to highlight items in the item market when they are listed below a specified threshold.

目前为 2025-03-20 提交的版本。查看 最新版本

// ==UserScript==
// @name         Torn Buy Filter
// @version      0.3.8
// @description  A script to highlight items in the item market when they are listed below a specified threshold.
// @author       Galdyr
// @match        https://www.torn.com/page.php?sid=ItemMarket*
// @exclude      https://www.googletagmanager.com/*
// @exclude      https://td.doubleclick.net/*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=torn.com
// @grant        none
// @namespace    https://gf.qytechs.cn/users/1446982
// @license      MIT
// ==/UserScript==

(function() {
    'use strict';

    if (!window.location.href.startsWith("https://www.torn.com/page.php?sid=ItemMarket")) {
        return;
    }

    const buyFilters = JSON.parse(localStorage.getItem('buyFilters')) || {};

    function initializeBuyFilters() {
        const itemMarketRoot = document.querySelector('.sellerListWrapper___PN32N');
        if (!itemMarketRoot) {
            console.error('Item market root element not found.');
            return;
        }

        const itemElements = document.querySelectorAll('.rowWrapper___me3Ox');
        const filterOptionsBox = createFilterOptionsBox();
        const mainContent = itemMarketRoot.parentElement;

        mainContent.insertBefore(filterOptionsBox, mainContent.firstChild);

        itemElements.forEach((itemElement) => {
            const itemId = getItemId(itemElement);
            if (itemId) {
                if (!document.getElementById(`filter-item-${itemId}`)) {
                    addBuyFilter(itemElement, itemId, filterOptionsBox);
                    addWatchCheckbox(itemElement, itemId);
                }
            }
        });
        highlightItems();

        setInterval(highlightItems, 1000);
    }

    function getItemId(element) {
        if (element.classList.contains('rowWrapper___me3Ox')) {
            const imgElement = element.querySelector('.thumbnail___M_h9v img');
            if (imgElement && imgElement.src) {
                const src = imgElement.src;
                const match = src.match(/\/items\/(\d+)\//);
                return match ? parseInt(match[1], 10) : null;
            }
        } else if (element.classList.contains('itemTile___cbw7w')) {
            const imgElement = element.querySelector('.imageWrapper___RqvUg img');
            if (imgElement && imgElement.src) {
                const src = imgElement.src;
                const match = src.match(/\/items\/(\d+)\//);
                return match ? parseInt(match[1], 10) : null;
            }
        }
        return null;
    }

    function getItemPrice(element) {
        if (element.classList.contains('rowWrapper___me3Ox')) {
            const priceElement = element.querySelector('.price___Uwiv2');
            if (priceElement) {
                const priceText = priceElement.textContent.replace(/[^\d.]/g, '');
                return parseFloat(priceText);
            }
        } else if (element.classList.contains('itemTile___cbw7w')) {
            const priceElement = element.querySelector('.priceAndTotal___eEVS7 span');
            if (priceElement) {
                const priceText = priceElement.textContent.replace(/[^\d.]/g, '');
                return parseFloat(priceText);
            }
        }
        return null;
    }

    function getItemAveragePrice(element) {
        if (element.classList.contains('rowWrapper___me3Ox')) {
            const itemTile = document.querySelector(`.itemTile___cbw7w[data-item-id="${getItemId(element)}"]`);
            if (itemTile) {
                const averagePriceElement = itemTile.querySelector('.averagePrice___J77oQ');
                if (averagePriceElement) {
                    const averagePriceText = averagePriceElement.textContent.replace(/[^\d.]/g, '');
                    return parseFloat(averagePriceText);
                }
            }
        } else if (element.classList.contains('itemTile___cbw7w')){
            const averagePriceElement = element.querySelector('.averagePrice___J77oQ');
            if (averagePriceElement) {
                const averagePriceText = averagePriceElement.textContent.replace(/[^\d.]/g, '');
                return parseFloat(averagePriceText);
            }
        }
        return null;
    }

    function highlightItems() {
        const expandedItems = document.querySelectorAll('.rowWrapper___me3Ox');
        expandedItems.forEach(itemElement => {
            highlightItem(itemElement);
        });

        const itemTiles = document.querySelectorAll('.itemTile___cbw7w');
        itemTiles.forEach(itemTile => {
            highlightItem(itemTile);
        });
    }

    function highlightItem(element) {
        const itemId = getItemId(element);
        if (itemId && buyFilters[itemId] && buyFilters[itemId].selected) {
            const itemPrice = getItemPrice(element);

            if (itemPrice !== null) {
                const threshold = buyFilters[itemId].threshold;

                if (itemPrice <= threshold) {
                    element.style.backgroundColor = "#19166e"; // Threshold color
                } else {
                    element.style.backgroundColor = "";
                }
            } else {
                element.style.backgroundColor = "";
            }
        } else {
            element.style.backgroundColor = "";
        }
    }

    function createFilterOptionsBox() {
        const filterOptionsBox = document.createElement('div');
        filterOptionsBox.id = 'buy-filter-options';
        filterOptionsBox.style.cssText = `
            position: relative;
            z-index: 1000;
            background-color: #f0f0f0;
            padding: 10px;
            border: 1px solid #ccc;
            margin-bottom: 10px;
        `;
        return filterOptionsBox;
    }

    function addBuyFilter(itemElement, itemId, filterOptionsBox) {
        const itemName = getItemName(itemElement);
        const filterDiv = document.createElement('div');
        filterDiv.id = `filter-item-${itemId}`;

        const checkbox = document.createElement('input');
        checkbox.type = 'checkbox';
        checkbox.id = `filter-checkbox-${itemId}`;
        checkbox.checked = buyFilters[itemId] ? buyFilters[itemId].selected : false;

        const label = document.createElement('label');
        label.htmlFor = `filter-checkbox-${itemId}`;
        label.textContent = itemName;

        const thresholdInput = document.createElement('input');
        thresholdInput.type = 'number';
        thresholdInput.id = `threshold-input-${itemId}`;
        thresholdInput.value = buyFilters[itemId] ? buyFilters[itemId].threshold : '';
        thresholdInput.placeholder = 'Threshold';

        checkbox.addEventListener('change', () => {
            if (!buyFilters[itemId]) {
                buyFilters[itemId] = {};
            }
            buyFilters[itemId].selected = checkbox.checked;
            localStorage.setItem('buyFilters', JSON.stringify(buyFilters));
            highlightItems();
        });

        thresholdInput.addEventListener('change', () => {
            if (!buyFilters[itemId]) {
                buyFilters[itemId] = {};
            }
            buyFilters[itemId].threshold = parseFloat(thresholdInput.value);
            localStorage.setItem('buyFilters', JSON.stringify(buyFilters));
            highlightItems();
        });

        filterDiv.appendChild(checkbox);
        filterDiv.appendChild(label);
        filterDiv.appendChild(thresholdInput);
        filterOptionsBox.appendChild(filterDiv);
    }

    function addWatchCheckbox(itemElement, itemId) {
        const checkbox = document.createElement('input');
        checkbox.type = 'checkbox';
        checkbox.classList.add('watch-checkbox');
        checkbox.style.cssText = 'position: absolute; bottom: 5px; left: 5px;';
        itemElement.appendChild(checkbox);
    }

    initializeBuyFilters();
})();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址