Steam計算礼物额度,支持中英文。支持##,阿根廷,土耳其,俄罗斯,美国,####,####等地区货币
// ==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(); } })();