Steam計算礼物额度

Steam計算礼物额度,支持中英文。支持中国,阿根廷,土耳其,俄罗斯,美国,中国香港,中国台湾等地区货币

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// ==UserScript==
// @name         Steam計算礼物额度
// @match        https://store.steampowered.com/account/history/*
// @grant        GM.xmlHttpRequest
// @author       LinkSpider
// @connect      wise.com
// @version      1.30
// @description  Steam計算礼物额度,支持中英文。支持中国,阿根廷,土耳其,俄罗斯,美国,中国香港,中国台湾等地区货币
// @license MIT
// @namespace https://greasyfork.org/users/305985
// ==/UserScript==

(function() {
    'use strict';

    async function loadAll(){


        function send(){
            return new Promise(function(resolve){
                $J('#load_more_button').hide();
                if ( g_historyCursor == null )
                    return;

                var request_data = {
                    cursor: g_historyCursor,
                    sessionid: g_sessionID
                };

                g_historyCursor = null;

                $J('#wallet_history_loading').show();
                $J.ajax({
                    type: "POST",
                    url: "https://store.steampowered.com/account/AjaxLoadMoreHistory/",
                    data: request_data
                }).done( function( data ) {
                    if ( data.html )
                    {
                        var elem_prev = $J('#more_history').prev();

                        $J('#more_history').before( data.html );

                        var new_elems = elem_prev.nextAll();
                        new_elems.hide();


                        new_elems.fadeIn( 500 );

                        WalletHistory_BindTooltips();
                    }

                    if ( data.cursor )
                    {
                        g_historyCursor = data.cursor;
                        $J('#load_more_button').fadeIn( 50 );
                        resolve("load");

                    }
                    else
                    {
                        $J('#load_more_button').hide();
                        resolve("done");
                    }
                }).always( function() {
                    $J('#wallet_history_loading').hide();
                } );

            });

        }

        var rst = await send();
        console.log(rst);
        if(rst == "load") return loadAll();
        else return Promise.resolve();
    }

    function getExchange(from, to){
        return new Promise(resolve => {
            if(from == to) {
                resolve(amount);
                return;
            };
            var temp = `https://wise.com/gb/currency-converter/`+from+`-to-`+to+`-rate?amount=1`
            GM.xmlHttpRequest({
                url: `https://wise.com/gb/currency-converter/`+from+`-to-`+to+`-rate?amount=1`,
                method: "GET",
                onload: function(response) {
                    if(response.readyState == XMLHttpRequest.DONE){
                        var amount = 0,Mydoc=null;
                        if(response.status == 200){
                            Mydoc = new DOMParser().parseFromString(response.responseText, "text/html");
                            amount = parseFloat(Mydoc.querySelector("body > main > section > div:nth-child(2) > section > div > div.text-xs-center.text-sm-left > div.cc-rate-graph__header.m-b-3 > h3.cc__source-to-target.hidden-xs > span.text-success").innerText.replace(/,/g, ""));
                        }
                        resolve({
                            from: from,
                            amount: amount
                        });
                    }
                }
            });
        });
    }


	var totalSpendAmount = 0;

    function readPage(){
        var wallet = [].slice.call(document.querySelectorAll(".wallet_table_row"));
        if(!wallet.length) return undefined;

        var text = document.querySelector("#responsive_page_template_content > div.page_header_ctn.account_management > div > div > div.blockbg > span.breadcrumb_current_page").innerText
        var language = (text =='Purchase History')?'en':'cn'
        var gift, spend
        if(language == 'cn'){
            //若wallet沒有任何交易,即返回
            //取得所有礼物购买交易
            gift = wallet.filter(e => /礼物购买/.test(e.querySelector(".wht_type").innerText))
            //去除退款的交易
            .filter(e => !e.querySelector(".wht_refunded"));


            spend = wallet
            //去除所有礼物
            .filter(e => !/礼物购买/.test(e.querySelector(".wht_type").innerText))
            //去除所有錢包增加資金的交易
            .filter(e => !/\+/.test(e.querySelector("td.wht_wallet_change").innerText))
            //去除所有购买钱包资金的交易
            .filter(e => !/购买.+钱包资金/.test(e.querySelector("td.wht_items").innerText))
            //去除所有社区市场的交易
            .filter(e => !/Steam 社区市场/.test(e.querySelector("td.wht_items").innerText))
            //去除所有退款的游戏购买
            .filter(e => !e.querySelector(".wht_refunded"))
            //去除钱包退款
            .filter(e => !/退款/.test(e.querySelector(".wht_type").innerText))
			//去除内购
            .filter(e => !/游戏内购买/.test(e.querySelector(".wht_type").innerText));

        }else{

            //取得所有礼物购买交易
            gift = wallet.filter(e => /Gift Purchase/.test(e.querySelector(".wht_type").innerText))
            //去除退款的交易
            .filter(e => !e.querySelector(".wht_refunded"));

            spend = wallet
            //去除購買禮物的交易
            .filter(e => !/Gift Purchase/.test(e.querySelector(".wht_type").innerText))
            //去除所有錢包增加資金的交易
            .filter(e => !/\+/.test(e.querySelector("td.wht_wallet_change").innerText))
            //去除所有钱包资金的交易
            .filter(e => !/Purchase.+Wallet/.test(e.querySelector("td.wht_items").innerText))
            //去除所有社区市场的交易
            .filter(e => !/Steam Community Market/.test(e.querySelector("td.wht_items").innerText))
            //去除所有退款的游戏购买
            .filter(e => !e.querySelector(".wht_refunded"))
            //去除钱包退款
            .filter(e => !/Refund/.test(e.querySelector(".wht_type").innerText))
			//去除内购
			.filter(e => !/In-Game Purchase/.test(e.querySelector(".wht_type").innerText));
        }


        var calculate = async function(list, targetCurrency, type){

				function insertNode(totalAmount){
					if(type == "spend") totalSpendAmount = totalAmount;
					var currencyStr = (amount) => {
						switch(targetCurrency){
							case "USD":
								return `\$ ${amount}`;
								break;
							case "CNY":
								return `¥ ${amount}`;
								break;
							case "TWD":
								return `NT\$ ${amount}`;
								break;
							case "ARS":
								return `ARS ${amount}`.replace(".", ",");
								break;
							case "RUB":
								return `${amount} pуб.`;
								break;
							case "HKD":
								return `HK$ ${amount}`;
								break;
							case "TRY":
								return `TL ${amount}`.replace(".", ",");
								break;
						}
					};


					if(type == "spend") document.querySelector("#totalSpendAmount").innerText = currencyStr(totalSpendAmount);
					if(type == "gift"){
						document.querySelector("#totalGiftAmount").innerText = currencyStr(totalAmount);
						document.querySelector("#totalAvailableAmount").innerText = currencyStr((totalSpendAmount-totalAmount).toFixed(2));
					}

				}

				var total = [], toExchange = [];
				for(let i of list){
					let currency,money;
                    money = i.querySelector(".wht_total").innerText.replace(/^\s+|\s+$/, "")
					if(money.length){
						if(/^\$/.test(money)){
                            currency = "USD";
                            money=money.replace(/,/g, "");
                        }else if(/¥/.test(money)){
                            currency = "CNY";
                            money=money.replace(/,/g, "");
                        }else if(/NT/.test(money)){
                            currency = "TWD";
                            money=money.replace(/,/g, "");
                        }else if(/ARS/.test(money)){
                            currency = "ARS";
                            money=money.replace(".", "").replace(",", ".")
                        }else if(/pуб./.test(money)){
                            currency = "RUB";
                            money=money.replace(".", "").replace(",", ".")
                        }else if(/HK/.test(money)){
                            currency = "HKD";
                            money=money.replace(/,/g, "");
                        }else if(/TL/.test(money)){
                            currency = "TRY";
                            money=money.replace(".", "").replace(",", ".")
                        }else continue;
                        let amount = parseFloat(money.match(/[0-9]+(\.[0-9]{1,})?/)[0]);
						total.push({
							currency: currency,
							amount: amount
						});

						if(targetCurrency != currency && toExchange.indexOf(currency) == -1) toExchange.push(currency);
					}
					else
						total.push({
							currency: targetCurrency,
							amount: 0
						});
				}

				var totalAmount = 0;


				if(toExchange.length){
					var getAllExchange = async function(idx, arr){
						if(idx == toExchange.length) return Promise.resolve(arr);
						arr.push(await getExchange(toExchange[idx], targetCurrency));
						return getAllExchange(idx+1, arr);
					}

					var allExchange = await getAllExchange(0, []);
					for(let i of total){
						if(i.currency == targetCurrency) {
                            totalAmount += i.amount;
                        }else{
							for(let j of allExchange){
								if(j.from == i.currency){
									totalAmount += (i.amount * j.amount);
									break;
								}
							}
						}
					}


					insertNode(totalAmount.toFixed(2));
					totalSpendAmount = totalAmount.toFixed(2);

				}
				else{
					for(let i of total){
						totalAmount += i.amount;
                    }
					insertNode(totalAmount.toFixed(2));
					return Promise.resolve();
				}

        }

        return {
            calculateSpend: (targetCurrency) => calculate(spend, targetCurrency, "spend"),
            calculateGift: (targetCurrency) => calculate(gift, targetCurrency, "gift")
        }
    }



	function calculateDiv(){
		var div = document.createElement("div");
		div.innerHTML = `
			<span style="padding: 0px 10px 0px 0px">选择货币
				<select id="targetCurrency" style="border: none;">
					<option value="s">请选择</option>
                    <option value="ARS">阿根廷比索</option>
					<option value="TRY">土耳其里拉</option>
					<option value="CNY">人民币</option>
                    <option value="RUB">卢布</option>
                    <option value="HKD">港币</option>
					<option value="USD">美元</option>
                    <option value="TWD">台币</option>
				</select>
			</span>
			<span style="padding: 0px 10px">一共花费: <span id="totalSpendAmount"></span></span>
			<span style="padding: 0px 10px">送出礼物: <span id="totalGiftAmount"></span></span>
			<span style="padding: 0px 10px">礼物额度(一共花费-送出礼物): <span id="totalAvailableAmount"></span></span>

		`;
		document.querySelector(".wallet_history_click_hint").appendChild(div);
		document.querySelector("#targetCurrency").onchange = async function(e){
			if(e.target.value != "s"){
				var calculater = readPage();
				if(typeof calculater != "undefined"){
					await calculater.calculateSpend(e.target.value);
					await calculater.calculateGift(e.target.value);
				}
			}
		}
	}


    if(document.querySelector("#load_more_button").style.display != "none")
        loadAll().then(calculateDiv);
    else{
		calculateDiv();
    }
})();