(Steam 价格转换器)Steam Price Exchanger

Exchange price on steam and community

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==UserScript==
// @name         (Steam 价格转换器)Steam Price Exchanger
// @version      0.3.2.0
// @description  Exchange price on steam and community
// @author       lzt,coralfox
// @match        *://*.steampowered.com/*
// @match        *://*.steamcommunity.com/*
// @grant        GM_xmlhttpRequest
// @grant 		 GM_setValue
// @grant 		 GM_getValue
// @grant		 unsafeWindow
// @grant		 window
// @connect      api.augmentedsteam.com
// @namespace    steam_price_exchanger
// @license MIT
// ==/UserScript==

(function() {
    "use strict";

    // Your code here...

    var style = document.createElement("style");
	style.type = "text/css";
	var text = document.createTextNode(".tab_item_discount {width: 180px;}");
	style.appendChild(text);
	var head = document.getElementsByTagName("head")[0];
	head.appendChild(style);

	console.log(GM_getValue("timestamp"))
	if (GM_getValue("timestamp") == undefined) {GM_setValue("timestamp", 0);console.log("set timestamp to 0")};
    unsafeWindow.rub = {"rate": GM_getValue("rub"), "lock": 0};
    unsafeWindow.ars = {"rate": GM_getValue("ars"), "lock": 0};

    function initobserver (rate, unit) {
	    var MutationObserver = window.MutationObserver || window.WebKitMutationObserver || window.MozMutationObserver;
	    var target = document.body;
	    var observer = new MutationObserver(function(mutations) {
			mutations.forEach(function(mutation) {
				unsafeWindow.fillprice(rate, unit, 500)
				});
			});
	    var config = { attributes: true, childList: true, characterData: true, subtree: true}
	    observer.observe(target, config);
	}

    unsafeWindow.fillprice = function (rate, unit, delay){
    	if (rate["lock"] == 1) {return -1};
    	rate["lock"] = 1;
        var lists = document.evaluate("//*[contains(text(), '" + unit + "')]", document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
        var re = new RegExp(unit == "ARS"?"ARS\\$?\\s*[0-9.,]+":"[0-9.,]+\\s*pуб.?", "ig");
        for(let i = 0; i < lists.snapshotLength; i++) {
        	var item = lists.snapshotItem(i)
            if (item.firstChild.nodeValue == null) {continue};
            if (item.firstChild.nodeValue.search("¥") != -1) {continue};
            if (item.classList.contains("es-regprice") & item.classList.contains("es-flag")) {continue};
            if (item.parentNode.classList.contains("es-flag--cn")) {continue};

            var s = item.firstChild.nodeValue.match(re)
            if (s != null) {
                for(let j = 0; j < s.length; j++) {
                    var price = s[j].replace(".", "");
                    price = price.replace(",", ".");
                    price = "¥" + parseInt(parseFloat(price.match(/[0-9.]+/))*rate["rate"]).toString();
                    if ((item.classList.contains("col") & item.classList.contains("search_price")) |
                    	item.nodeName == "STRIKE") {
                    	item.firstChild.nodeValue = item.firstChild.nodeValue.replace(s[j], s[j].replace(" ", "") + "(" + price + ")").trim();
                    }else {
                    	item.firstChild.nodeValue = item.firstChild.nodeValue.replace(s[j], s[j] + "(" + price + ")").trim()
                    }
                }
            }
        }
        lists = document.getElementsByClassName("col search_price discounted");
        for (let i = 0; i < lists.length; i++) {
        	if (lists[i].childNodes[3].nodeValue == null) {continue};
            if (lists[i].childNodes[3].nodeValue.search("¥") != -1) {continue};
            if (lists[i].childNodes[3].nodeValue.search(unit) == -1) {continue};

        	var price = lists[i].childNodes[3].nodeValue.replace(".", "");
        	price = price.replace(",", ".");
        	price = "¥" + parseInt(parseFloat(price.match(/[0-9.]+/))*rate["rate"]).toString();
        	lists[i].childNodes[3].nodeValue = lists[i].childNodes[3].nodeValue.replace(" ", "").trim() + "(" + price + ")";
        }
        if (unit == "ARS") {setTimeout("window.ars['lock'] = 0", delay)}
        	else{setTimeout("window.rub['lock'] = 0", delay)}
    }


    if ((new Date().getTime() - GM_getValue("timestamp")) >= 3600000*6 |
    	typeof(unsafeWindow.rub) == undefined |
    	typeof(unsafeWindow.ars) == undefined) {
    	console.log("update rates")
    	GM_xmlhttpRequest({
	        method: "get",
            url: "https://api.augmentedsteam.com/v01/rates/?to=CNY",
	        responseType: "json",
	        onload: function(r) {
	            unsafeWindow.ars["rate"] = r.response["data"]["ARS"]["CNY"];
	            unsafeWindow.rub["rate"] =r.response["data"]["RUB"]["CNY"];

	            console.log(unsafeWindow.ars["rate"] + " ARS/CNY");
	            console.log(unsafeWindow.rub["rate"] + " RUB/CNY");
	            GM_setValue("rub", unsafeWindow.rub["rate"]);
	            GM_setValue("ars", unsafeWindow.ars["rate"]);
	            GM_setValue("timestamp", new Date().getTime());

            	unsafeWindow.fillprice(unsafeWindow.rub, "pуб", 0);
			    unsafeWindow.fillprice(unsafeWindow.ars, "ARS", 0);
			    initobserver(unsafeWindow.rub, "pуб");
			    initobserver(unsafeWindow.ars, "ARS");
	        }
    	});
    }else{
    	unsafeWindow.fillprice(unsafeWindow.rub, "pуб", 50);
	    unsafeWindow.fillprice(unsafeWindow.ars, "ARS", 50);
	    initobserver(unsafeWindow.rub, "pуб");
	    initobserver(unsafeWindow.ars, "ARS");
    }


})();