// ==UserScript==
// @name Steam市场 价格/比例/汇率 换算器
// @namespace http://pronax.wtf/
// @version 0.3.21
// @description try to take over the world!
// @author Pronax
// @include *://steamcommunity.com/market/*
// @require https://code.jquery.com/jquery-1.12.4.min.js
// @connect v6.exchangerate-api.com
// @grant GM_xmlhttpRequest
// @grant GM_addStyle
// @grant GM_getValue
// @grant GM_setValue
// @downloadURL none
// ==/UserScript==
(function () {
'use strict';
var ratesUpdateApi = "https://v6.exchangerate-api.com/v6/6c4647edadf8a30d48167bab/latest/CNY";
var ratesUpdateTimes = 0;
function getUrlParam(name, url) {
var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)"); //构造一个含有目标参数的正则表达式对象
var result
if (url) {
result = url.substr(34).match(reg); //匹配目标参数
} else {
result = window.location.search.substr(1).match(reg); //匹配目标参数
}
if (result != null) return unescape(result[2]); return null; //返回参数值
}
function updateRate() {
GM_xmlhttpRequest({
url: ratesUpdateApi,
method: "get",
onload: function (response) {
var data = JSON.parse(response.responseText);
if (data.result == "success") {
data.conversion_rates.time_next_update_unix = data.time_next_update_unix;
data.conversion_rates.time_update_unix = new Date().getTime();
exchangeRateList = data.conversion_rates;
GM_setValue("time_next_update_unix", data.time_next_update_unix);
GM_setValue("exchangeRateList", data.conversion_rates);
} else if (data["error-type"] == "quota-reached" && ratesUpdateTimes <= 1) {
ratesUpdateTimes++;
ratesUpdateApi = "https://v6.exchangerate-api.com/v6/f87873f2dcc5ba5c076737e1/latest/CNY";
updateRate();
} else {
console.log("更新汇率时出错:", data["error-type"]);
}
},
onerror: function (err) {
console.log("更新汇率时出错:", err);
}
});
}
function roundToTwo(num) {
return Math.round((num * 100)) / 100;
}
function formatPrice(originPrice, currencyData) {
if (!currencyData) {
currencyData = g_rgCurrencyData[$("#price_tool_rate_form")[0].currency_origin.value];
}
originPrice = originPrice.replace(/[^0-9,\.]/g, "");
if (originPrice.indexOf(",") >= 0 || originPrice.split(".").length > 2) {
originPrice = originPrice.replaceAll(currencyData.strThousandsSeparator, "");
if (currencyData.strDecimalSymbol == ",") {
originPrice = originPrice.replaceAll(currencyData.strDecimalSymbol, ".");
}
while (originPrice.split(".").length > 2) {
originPrice = originPrice.replace(".", "");
}
}
return originPrice;
}
var exchangeRateList = GM_getValue("exchangeRateList");
let timestamp = GM_getValue("time_next_update_unix");
if (exchangeRateList && timestamp) {
if (Math.round(new Date().getTime() / 1000) >= timestamp) {
updateRate();
}
} else {
updateRate();
}
console.log("已同步最新汇率,时间戳:" + exchangeRateList.time_update_unix);
GM_addStyle(
".price_tool_input{width:4.9rem;height:1rem;font-size:small!important;border:1px solid transparent!important}.price_tool_div{position:fixed;border-radius:.3rem;padding:.05rem .3rem .25rem;right:.6rem;top:35%;background-color:#53a3C399;text-align:center}.price_tool_input_div{margin:.2rem 0}.price_tool_rate_chose{height:1.4rem;border-radius:0;border:0;display:inline-block;background-color:#171a2185;cursor:pointer;color:#d2d2d2;text-align-last:center}.price_tool_rate_div{margin-top:1px}.price_tool_rate_input{height:.9rem;width:4.5rem;border:0!important}.price_tool_input_btn{display:inline-block;line-height:1.65rem;background-color:#eaeaea33;cursor:pointer;padding:0 12px;width:1.8rem;color:#d2d2d2}.price_tool_disabled{background-color:#0009}.price_tool_input_btn_toggle{display:inline-block;border:1px transparent;padding:0 .2rem;cursor:pointer;color:#d2e885;line-height:1.5rem}.price_tool_checkbox{display:none}.price_tool_pagebtn{padding:0 10px;color:#f9f9f9;background-color:#f5f5f53b;width:.8rem}"
);
GM_addStyle(
".market_listing_their_price{width:7rem;}.market_listing_their_price>span.market_table_value,.market_listing_my_price>span.market_table_value,.market_listing_num_listings>span.market_table_value{font-size:100%}.csgo_sticker>.stickers{margin-right:10px !important;}"
);
var demo_price_tool =
"
";
document.getElementById("BG_bottom").insertAdjacentHTML("beforeEnd", demo_price_tool);
var rateChose = GM_getValue("rate_chose");
if (rateChose) {
document.getElementsByClassName("price_tool_rate_chose")[0].value = rateChose;
}
$(".price_tool_rate_input").keyup(function () {
let form = $("#price_tool_rate_form")[0];
let targ = form.currency_origin;
// let currencyData = g_rgCurrencyData[$(this).siblings("select").val()];
// let currencyData = g_rgCurrencyData[targ.value];
this.value = formatPrice(this.value);
if (this.name == "rate_origin") {
form.rate_result.value = roundToTwo(this.value / exchangeRateList[targ.value]);
} else {
form.rate_origin.value = roundToTwo(this.value * exchangeRateList[targ.value]);
$("#real_price").val(form.rate_origin.value).trigger("keyup");
}
});
let buffPrice = getUrlParam("buffPrice");
if (buffPrice) {
let rmb = $(".price_tool_rate_input")[1];
$(rmb).val(buffPrice).trigger("keyup");
}
$(".price_tool_rate_chose").change(function () {
GM_setValue("rate_chose", this.value);
$(this.siblings()[0]).trigger("keyup");
});
var input_btn = document.getElementsByClassName("price_tool_input_btn");
var checkbox = document.getElementsByClassName("price_tool_checkbox");
for (let i = 0; i < input_btn.length - 2; i++) {
input_btn[i].onclick = function () {
let checkArr = [];
for (let j = 0; j < checkbox.length; j++) {
if (checkbox[j].checked) {
checkArr.push(1);
}
}
let checked = checkbox[i].checked;
if (checked) {
input_btn[i].style.backgroundColor = "#eaeaea33"
} else {
if (checkArr.length > 1) {
return;
}
input_btn[i].style.backgroundColor = "#00000099"
}
checkbox[i].checked = !checked;
}
}
var toggle_btn = document.getElementsByClassName("price_tool_input_btn_toggle")[0];
input_btn[3].onclick = function () {
let checkArr = [];
for (let j = 0; j < checkbox.length; j++) {
if (checkbox[j].checked) {
checkArr.push(1);
}
}
let checked = checkbox[2].checked;
if (checked) {
input_btn[3].style.backgroundColor = "#eaeaea33"
} else {
if (checkArr.length > 1) {
return;
}
input_btn[3].style.backgroundColor = "#00000099"
}
checkbox[2].checked = !checked;
if (toggle_btn.dataset.status == "false") {
input_btn[2].style.backgroundColor = input_btn[3].style.backgroundColor;
}
}
input_btn[2].onclick = function () {
input_btn[3].click();
}
var real_price = document.getElementById("real_price");
var scale = document.getElementById("scale");
// var saved_scale = GM_getValue("price_tool_scale");
// if (saved_scale != null) {
// scale.value = saved_scale;
// }
var money_receive = document.getElementById("money_receive");
var money_pays = document.getElementById("money_pays");
var toggle_div = document.getElementsByClassName("price_tool_input_div")[2];
var tool_targ = document.getElementsByClassName("price_tool_div")[0];
toggle_btn.onclick = function () {
if (toggle_btn.dataset.status == "false") {
this.style.color = "#65C3F7";
this.innerHTML = "切换为卖家";
toggle_btn.dataset.status = true;
money_receive.disabled = true;
tool_targ.style.backgroundColor = "#95b40699";
toggle_div.style.opacity = "0.3";
money_receive.value = "";
input_btn[2].style.backgroundColor = "#eaeaea33"
} else {
this.style.color = "#ACD032";
this.innerHTML = "切换为买家";
toggle_btn.dataset.status = false;
money_receive.disabled = false;
tool_targ.style.backgroundColor = "#53A3C399";
toggle_div.style.opacity = "1";
input_btn[2].style.backgroundColor = input_btn[3].style.backgroundColor;
}
}
real_price.onkeyup = function () {
let checkArr = [];
for (let j = 0; j < checkbox.length; j++) {
checkArr.push(checkbox[j].checked);
}
this.value = formatPrice(this.value);
if (toggle_btn.dataset.status == "false") {
if (checkArr[1]) {
if (checkArr[2]) {
money_receive.value = "";
money_pays.value = "";
scale.value = "";
return;
}
money_receive.value = Math.round(this.value / scale.value * 100) / 100;
money_pays.value = Math.round(money_receive.value * 115) / 100;
} else {
scale.value = Math.round(this.value / money_receive.value * 100) / 100;
}
} else {
if (checkArr[1]) {
if (checkArr[2]) {
scale.value = "";
money_pays.value = "";
return;
}
money_pays.value = Math.round(this.value / scale.value * 100) / 100;
} else {
scale.value = Math.round(this.value / money_pays.value * 100) / 100;
}
}
}
scale.onkeyup = function () {
// GM_setValue("price_tool_scale", this.value);
let checkArr = [];
for (let j = 0; j < checkbox.length; j++) {
checkArr.push(checkbox[j].checked);
}
if (toggle_btn.dataset.status == "false") {
if (checkArr[0]) {
if (checkArr[2]) {
money_receive.value = "";
money_pays.value = "";
real_price.value = "";
return;
}
money_receive.value = Math.round(real_price.value / this.value * 100) / 100;
money_pays.value = Math.round(money_receive.value * 115) / 100;
} else {
real_price.value = Math.round(money_receive.value * this.value * 100) / 100;
if (checkArr[2]) {
return;
}
real_price.value = "";
money_receive.value = "";
money_pays.value = "";
}
} else {
if (checkArr[0]) {
if (checkArr[2]) {
money_pays.value = "";
real_price.value = "";
return;
}
money_pays.value = Math.round(real_price.value / this.value * 100) / 100;
} else {
if (checkArr[2]) {
real_price.value = Math.round(money_pays.value * this.value * 100) / 100;
return;
}
real_price.value = "";
money_pays.value = "";
}
}
}
money_receive.onkeyup = function () {
let checkArr = [];
for (let j = 0; j < checkbox.length; j++) {
checkArr.push(checkbox[j].checked);
}
this.value = formatPrice(this.value);
if (toggle_btn.dataset.status == "false") {
money_pays.value = Math.round(this.value * 115) / 100;
if (checkArr[1]) {
if (checkArr[0]) {
real_price.value = "";
scale.value = "";
return;
}
real_price.value = Math.round(this.value * scale.value * 100) / 100;
} else {
if (checkArr[0]) {
scale.value = Math.round(real_price.value / this.value * 100) / 100;
return;
}
real_price.value = "";
scale.value = "";
}
}
}
money_pays.onkeyup = function () {
let checkArr = [];
for (let j = 0; j < checkbox.length; j++) {
checkArr.push(checkbox[j].checked);
}
this.value = formatPrice(this.value);
if (toggle_btn.dataset.status == "false") {
money_receive.value = (Math.round(this.value / 0.0115) + 1) / 100;
if (checkArr[1]) {
if (checkArr[0]) {
real_price.value = "";
scale.value = "";
return;
}
real_price.value = Math.round(money_receive.value * scale.value * 100) / 100;
} else {
if (checkArr[0]) {
scale.value = Math.round(real_price.value / money_receive.value * 100) / 100;
return;
}
real_price.value = "";
scale.value = "";
}
} else {
if (checkArr[1]) {
if (checkArr[0]) {
real_price.value = "";
scale.value = "";
return;
}
real_price.value = Math.round(this.value * scale.value * 100) / 100;
} else {
if (checkArr[0]) {
scale.value = Math.round(real_price.value / this.value * 100) / 100;
return;
}
real_price.value = "";
scale.value = "";
}
}
}
})();