SteamDB Price History Enhancer

优化SteamDB的价格页面,支持自定义显示部分地区的价格;手机端自动显示完整价格表格。Customize only want show regions on SteamDB price table.The full price table is automatically displayed on the mobile layout.

You will need to install an extension such as Tampermonkey, Greasemonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey or Userscripts to install this script.

You will need to install an extension such as Tampermonkey to install this script.

You will need to install a user script manager extension to install this script.

(I already have a user script manager, let me install it!)

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

(I already have a user style manager, let me install it!)

// ==UserScript==
// @name         SteamDB Price History Enhancer
// @name:zh      SteamDB价格页面加强模块
// @namespace    http://tampermonkey.net/
// @version      0.8
// @description  优化SteamDB的价格页面,支持自定义显示部分地区的价格;手机端自动显示完整价格表格。Customize only want show regions on SteamDB price table.The full price table is automatically displayed on the mobile layout.
// @description:en  Customize only want show regions on SteamDB price table.The full price table is automatically displayed on the mobile layout.
// @description:zh  优化SteamDB的价格页面,支持自定义显示部分地区的价格;手机端自动显示完整价格表格。
// @author       ZhuSun
// @license      AGPL-3.0
// @match        https://steamdb.info/app/*
// @match        https://steamdb.info/sub/*
// @match        https://steamdb.info/bundle/*
// @grant        GM_addStyle
// @grant        GM_listValues
// @grant        GM_setValue
// @grant        GM_getValue
// @grant        GM_deleteValue
// @grant        GM_removeValueChangeListener
// @grant        GM_addValueChangeListener
// ==/UserScript==

(function () {
    'use strict';

    GM_addStyle(`
    .region-selector {
        display: none;
        flex-wrap: wrap;
        margin-bottom: 20px
    }

    .region-selector.shown {
        display: flex
    }

    .region-selector .btn {
        flex: 0 0 20%;
        border: 0;
        justify-content: flex-start;
    }
    #js-region-selector {
        margin-right:10px;
    }
    .panel.region-selector > .panel-heading,
    .panel.currency-selector > .panel-heading{
        width: calc(100% + 30px);
    }
    @media (max-width: 980px) {
        #js-region-selector {
            width: 100%;
            margin-right:0;
        }

        .region-selector .btn {
            flex-basis: 50%;
            padding-left: 5px;
            padding-right: 5px
        }
    }
    @media (min-width: 981px) {
        .prices-header>div {
            align-self: center;
        }
    }
    `);

    const prices_header = document.querySelector("#prices > div.prices-header");
    const prices_div = document.querySelector("#prices");
    const price_table = document.querySelector('#prices > div.multiple-prices > div.table-responsive');

    // 添加自定义地区按钮
    let region_btn = document.createElement("div");
    region_btn.innerHTML = '<button class="btn btn-outline" id="js-region-selector">Set visible regions<svg width="16" height="16" viewBox="0 0 16 16" class="octicon octicon-chevron-down" aria-hidden="true"><path d="M12.78 5.22a.749.749 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.06 0L3.22 6.28a.749.749 0 1 1 1.06-1.06L8 8.939l3.72-3.719a.749.749 0 0 1 1.06 0Z"></path></svg></button>';
    prices_header?.insertBefore(region_btn, document.querySelector('h2').nextSibling);

    // 添加自定义地区panel
    let selector_div = document.createElement("div");
    selector_div.className = 'region-selector panel';
    selector_div.innerHTML = '<div class="panel-heading"><span>Set visible regions</span></div><button class="btn btn-outline" data-cc="us"><img src="/static/country/us.svg" class="flag" alt="" width="18" height="18"> U.S. Dollar</button><button class="btn btn-outline" data-cc="eu"><img src="/static/country/eu.svg" class="flag" alt="" width="18" height="18"> Euro</button><button class="btn btn-outline" data-cc="ar"><img src="/static/country/ar.svg" class="flag" alt="" width="18" height="18"> LATAM - U.S. Dollar</button><button class="btn btn-outline" data-cc="au"><img src="/static/country/au.svg" class="flag" alt="" width="18" height="18"> Australian Dollar</button><button class="btn btn-outline" data-cc="br"><img src="/static/country/br.svg" class="flag" alt="" width="18" height="18"> Brazilian Real</button><button class="btn btn-outline" data-cc="uk"><img src="/static/country/uk.svg" class="flag" alt="" width="18" height="18"> British Pound</button><button class="btn btn-outline" data-cc="ca"><img src="/static/country/ca.svg" class="flag" alt="" width="18" height="18"> Canadian Dollar</button><button class="btn btn-outline" data-cc="cl"><img src="/static/country/cl.svg" class="flag" alt="" width="18" height="18"> Chilean Peso</button><button class="btn btn-outline" data-cc="cn"><img src="/static/country/cn.svg" class="flag" alt="" width="18" height="18"> Chinese Yuan</button><button class="btn btn-outline" data-cc="az"><img src="/static/country/cis.svg" class="flag" alt="" width="18" height="18"> CIS - U.S. Dollar</button><button class="btn btn-outline" data-cc="co"><img src="/static/country/co.svg" class="flag" alt="" width="18" height="18"> Colombian Peso</button><button class="btn btn-outline" data-cc="cr"><img src="/static/country/cr.svg" class="flag" alt="" width="18" height="18"> Costa Rican Colon</button><button class="btn btn-outline" data-cc="hk"><img src="/static/country/hk.svg" class="flag" alt="" width="18" height="18"> Hong Kong Dollar</button><button class="btn btn-outline" data-cc="in"><img src="/static/country/in.svg" class="flag" alt="" width="18" height="18"> Indian Rupee</button><button class="btn btn-outline" data-cc="id"><img src="/static/country/id.svg" class="flag" alt="" width="18" height="18"> Indonesian Rupiah</button><button class="btn btn-outline" data-cc="il"><img src="/static/country/il.svg" class="flag" alt="" width="18" height="18"> Israeli New Shekel</button><button class="btn btn-outline" data-cc="jp"><img src="/static/country/jp.svg" class="flag" alt="" width="18" height="18"> Japanese Yen</button><button class="btn btn-outline" data-cc="kz"><img src="/static/country/kz.svg" class="flag" alt="" width="18" height="18"> Kazakhstani Tenge</button><button class="btn btn-outline" data-cc="kw"><img src="/static/country/kw.svg" class="flag" alt="" width="18" height="18"> Kuwaiti Dinar</button><button class="btn btn-outline" data-cc="my"><img src="/static/country/my.svg" class="flag" alt="" width="18" height="18"> Malaysian Ringgit</button><button class="btn btn-outline" data-cc="mx"><img src="/static/country/mx.svg" class="flag" alt="" width="18" height="18"> Mexican Peso</button><button class="btn btn-outline" data-cc="nz"><img src="/static/country/nz.svg" class="flag" alt="" width="18" height="18"> New Zealand Dollar</button><button class="btn btn-outline" data-cc="no"><img src="/static/country/no.svg" class="flag" alt="" width="18" height="18"> Norwegian Krone</button><button class="btn btn-outline" data-cc="pe"><img src="/static/country/pe.svg" class="flag" alt="" width="18" height="18"> Peruvian Sol</button><button class="btn btn-outline" data-cc="ph"><img src="/static/country/ph.svg" class="flag" alt="" width="18" height="18"> Philippine Peso</button><button class="btn btn-outline" data-cc="pl"><img src="/static/country/pl.svg" class="flag" alt="" width="18" height="18"> Polish Zloty</button><button class="btn btn-outline" data-cc="qa"><img src="/static/country/qa.svg" class="flag" alt="" width="18" height="18"> Qatari Riyal</button><button class="btn btn-outline" data-cc="ru"><img src="/static/country/ru.svg" class="flag" alt="" width="18" height="18"> Russian Ruble</button><button class="btn btn-outline" data-cc="sa"><img src="/static/country/sa.svg" class="flag" alt="" width="18" height="18"> Saudi Riyal</button><button class="btn btn-outline" data-cc="sg"><img src="/static/country/sg.svg" class="flag" alt="" width="18" height="18"> Singapore Dollar</button><button class="btn btn-outline" data-cc="za"><img src="/static/country/za.svg" class="flag" alt="" width="18" height="18"> South African Rand</button><button class="btn btn-outline" data-cc="pk"><img src="/static/country/pk.svg" class="flag" alt="" width="18" height="18"> South Asia - USD</button><button class="btn btn-outline" data-cc="kr"><img src="/static/country/kr.svg" class="flag" alt="" width="18" height="18"> South Korean Won</button><button class="btn btn-outline" data-cc="ch"><img src="/static/country/ch.svg" class="flag" alt="" width="18" height="18"> Swiss Franc</button><button class="btn btn-outline" data-cc="tw"><img src="/static/country/tw.svg" class="flag" alt="" width="18" height="18"> Taiwan Dollar</button><button class="btn btn-outline" data-cc="th"><img src="/static/country/th.svg" class="flag" alt="" width="18" height="18"> Thai Baht</button><button class="btn btn-outline" data-cc="tr"><img src="/static/country/tr.svg" class="flag" alt="" width="18" height="18"> MENA - U.S. Dollar</button><button class="btn btn-outline" data-cc="ae"><img src="/static/country/ae.svg" class="flag" alt="" width="18" height="18"> U.A.E. Dirham</button><button class="btn btn-outline" data-cc="ua"><img src="/static/country/ua.svg" class="flag" alt="" width="18" height="18"> Ukrainian Hryvnia</button><button class="btn btn-outline" data-cc="uy"><img src="/static/country/uy.svg" class="flag" alt="" width="18" height="18"> Uruguayan Peso</button><button class="btn btn-outline" data-cc="vn"><img src="/static/country/vn.svg" class="flag" alt="" width="18" height="18"> Vietnamese Dong</button>';
    prices_div?.insertBefore(selector_div, prices_header.nextSibling);

    // 为原切换地区添加panel属性
    const currency_div = document.querySelector('#js-currency-selector');
    const region_div = document.querySelector('.region-selector');
    currency_div.className = 'currency-selector panel';
    let currency_div_heading = document.createElement("div");
    currency_div_heading.className = 'panel-heading';
    currency_div_heading.innerHTML = '<span>Set your currency</span>';
    currency_div?.insertBefore(currency_div_heading, currency_div.firstChild);

    // 添加切换panel功能
    document.querySelector('#js-region-selector').addEventListener('click', function() {
        if (currency_div.classList.contains('shown')) {
            currency_div.classList.remove('shown');
        }
        region_div.classList.toggle('shown');
    });

    document.querySelector('#js-currency-selector').addEventListener('click', function() {
        if (region_div.classList.contains('shown')) {
            region_div.classList.remove('shown');
        }
    });

    // 为每个 button 添加点击事件监听器
    const cc_btn = document.querySelector('.region-selector').querySelectorAll('button');
    cc_btn.forEach(button => {
        button.addEventListener('click', function () {
            switchVisible(button.getAttribute('data-cc'));
        });
    });

    // 初始化每个地区可见性
    price_table.querySelectorAll('[data-cc]').forEach(element => {
        init(element.getAttribute('data-cc'));
    });

    // 自动显示手机版表格
    document.getElementsByClassName("single-price-mobile")[0].remove()

    function switchVisible(cc) {
        const tr = document.querySelector('#prices > div.multiple-prices > div.table-responsive').querySelector('td[data-cc="' + cc + '"]').closest('tr');
        const cc_btn = document.querySelector('.region-selector').querySelector('button[data-cc="' + cc + '"]');
        let is_show = GM_getValue(cc);
        if (is_show == true) {
            if (tr) {
                tr.style.display = 'none';
                cc_btn.classList.add('btn-outline');
                cc_btn.classList.remove('btn-primary');
            }
        }
        else {
            if (tr) {
                tr.style.display = 'table-row';
                cc_btn.classList.remove('btn-outline');
                cc_btn.classList.add('btn-primary');
            }
        }
        is_show = !is_show;
        GM_setValue(cc, is_show)
        console.log("[switchVisible]" + cc + " is show :" + is_show);
    }
    function init(cc) {
        const tr = document.querySelector('#prices > div.multiple-prices > div.table-responsive').querySelector('td[data-cc="' + cc + '"]').closest('tr');
        const cc_btn = document.querySelector('.region-selector').querySelector('button[data-cc="' + cc + '"]');
        let is_show = GM_getValue(cc);
        if (is_show == undefined) {
            GM_setValue(cc, true);
            is_show = true;
        }
        if (is_show == true) {
            if (tr) {
                tr.style.display = 'table-row';
                cc_btn.classList.remove('btn-outline');
                cc_btn.classList.add('btn-primary');
            }
        }
        else {
            if (tr) {
                tr.style.display = 'none';
                cc_btn.classList.add('btn-outline');
                cc_btn.classList.remove('btn-primary');
            }
        }
        console.log("[init]" + cc + " is show :" + is_show);
    }
})();