Greasy Fork is available in English.
找挂刀,看比例,挑玄学
// ==UserScript== // @name 网易BUFF价格比例(找挂刀)插件 // @icon https://s1.ax1x.com/2022/03/25/qt3mcj.png // @description 找挂刀,看比例,挑玄学 // @version 2.4.41 // @note 更新于 2024-10-27 14:00:06.936 // @author Pronax // @homepageURL https://greasyfork.org/zh-CN/users/412840-newell-gabe-l // @license AGPL-3.0 // @copyright 2021, Pronax // @include /https:\/\/buff\.163\.com\/(market|goods)\/(csgo|dota2|rust|h1z1|tf2|pubg|pubg_recycle|\d+)/ // @run-at document-body // @grant GM_info // @grant GM_addStyle // @grant GM_setValue // @grant GM_getValue // @grant GM_xmlhttpRequest // @grant GM_registerMenuCommand // @require https://lf26-cdn-tos.bytecdntp.com/cdn/expire-1-M/jquery-toast-plugin/1.3.2/jquery.toast.min.js // @connect steamcommunity.com // @namespace https://greasyfork.org/zh-CN/users/412840-newell-gabe-l // ==/UserScript== (function () { 'use strict'; // 防止重复安装冲突 if ($(".logo").hasClass("buffHelperLoaded")) { return; } $(".logo").addClass("buffHelperLoaded"); // 全局(插件环境)异常捕获 window.onerror = function (e) { try { // e.returnValue = false; 值为false时不会触发console.error事件 if (!e.error) { return; } // 通常是浏览器内各种原因导致的报错 let scriptName = undefined; // let errorType = undefined; 也许可以用来区分scriptManager,但是现在用不上 let renderingEngine = window.navigator.userAgent.match(/(Chrome|Firefox)\/([^ ]*)/); let lineno = e.lineno; switch (renderingEngine && renderingEngine[1]) { case "Chrome": // chrome+TamperMonkey在这个脚本内报错的情况下会需要两次decode scriptName = decodeURIComponent(decodeURIComponent(e.filename.match(/([^\/=]*)\.user\.js/)[1])); lineno -= 534; // errorType = e.message.match(/^Uncaught ([a-zA-Z]*): /)[1]; break; case "Firefox": scriptName = decodeURIComponent(e.error.stack.match(/\/([^\/]*)\.user\.js/)[1]).trim(); lineno -= 1; // errorType = e.message.match(/^([a-zA-Z]*): /)[1]; break; default: return; } if (scriptName == "网易BUFF价格比例(找挂刀)插件") { let colno = e.colno; let errorMsg = e.error.message; let msgBody = `内核:${renderingEngine[0]}<br/>版本:${GM_info.script.version}<br/>区域:${helper_config.steamCurrency} ${steamConnection ? 200 : steamConnection == undefined ? "Unknow" : 404}<br/>位置:${lineno}:${colno}<br/>信息:${errorMsg}<br/>路径:${location.pathname}<br/>哈希:${location.hash}`; let msgHtml = `恭喜!你可能发现了一个bug<hr/>${msgBody}<hr/>点击下面的链接可以直接进行反馈<br/><a href='mailto:[email protected]?subject=【${GM_info.script.version}】${lineno}:${colno} ${errorMsg}&body=${encodeURIComponent(msgBody.replaceAll("<br/>", "\r\n"))}'>邮件反馈</a><a href="https://greasyfork.org/zh-CN/scripts/410137/feedback#post-discussion" target="_blank">反馈贴反馈</a>`; showMessage("出现了意料之外的错误", msgHtml, "error", false); } else { console.log(`插件名称:${scriptName}\n代码位置:${e.lineno}:${e.colno}\n错误信息:${e.message}`); } } catch { console.warn("unhandled 捕获了一个错误:", e); } } const STEAM_ORDER_SCALE_TEMPLATE = "<span class=\"f_12px f_Bold l_Right steam_temp steam_order_scale\"></span>"; const STEAM_SOLD_NUMBER_TEMPLATE = "<span class=\"f_12px c_Green f_Bold l_Right steam_temp steam_sold_number\"></span>"; const STEAM_ORDER_NUMBER_TEMPLATE = "<span class=\"f_12px c_Gray f_Bold l_Right steam_temp steam_order_number\"></span>"; const ERROR_TEMPLATE = "<span class=\"f_12px c_Error f_Bold l_Right steam_temp steam_order_number_error\"></span>"; const WARNING_TEMPLATE = "<span class=\"f_12px c_Orange f_Bold l_Right steam_temp steam_order_number_error\"></span>"; const INFO_TEMPLATE = "<span class=\"f_12px c_Blue f_Bold l_Right steam_temp steam_order_number_error\"></span>"; const HIGHLIGHT_TEMPLATE = "<span class=\"f_12px c_Highlight f_Bold l_Right steam_temp steam_order_number_error\"></span>"; const ENHANCEMENT_SUPPORT_LIST = Array("rifle", "knife", "pistol", "smg", "machinegun", "shotgun", "hands"); const DEFAULT_CONFIG = { maxRange: 1, minRange: 0.63, needSort: null, pageSize: 20, reverseSticker: false, orderFloatLeft: false, overrideSortRule: false, sortAfterAllDone: true, marketColorLow: "#ff1e1e", marketColorHigh: "#5027ff", steamCurrency: "CNY", currencyEffectCalculate: false, displaySoldNumber: false, buffSellThreshold: 0, }; const g_rgCurrencyData = { "AED": { "strCode": "AED", "eCurrencyCode": 32, "strSymbol": "AED", "bSymbolIsPrefix": false, "bWholeUnitsOnly": false, "strDecimalSymbol": ".", "strThousandsSeparator": ",", "strSymbolAndNumberSeparator": " " }, "ARS": { "strCode": "ARS", "eCurrencyCode": 34, "strSymbol": "ARS$", "bSymbolIsPrefix": true, "bWholeUnitsOnly": false, "strDecimalSymbol": ",", "strThousandsSeparator": ".", "strSymbolAndNumberSeparator": " " }, "AUD": { "strCode": "AUD", "eCurrencyCode": 21, "strSymbol": "A$", "bSymbolIsPrefix": true, "bWholeUnitsOnly": false, "strDecimalSymbol": ".", "strThousandsSeparator": ",", "strSymbolAndNumberSeparator": " " }, "BRL": { "strCode": "BRL", "eCurrencyCode": 7, "strSymbol": "R$", "bSymbolIsPrefix": true, "bWholeUnitsOnly": false, "strDecimalSymbol": ",", "strThousandsSeparator": ".", "strSymbolAndNumberSeparator": " " }, "CAD": { "strCode": "CAD", "eCurrencyCode": 20, "strSymbol": "CDN$", "bSymbolIsPrefix": true, "bWholeUnitsOnly": false, "strDecimalSymbol": ".", "strThousandsSeparator": ",", "strSymbolAndNumberSeparator": " " }, "CHF": { "strCode": "CHF", "eCurrencyCode": 4, "strSymbol": "CHF", "bSymbolIsPrefix": true, "bWholeUnitsOnly": false, "strDecimalSymbol": ".", "strThousandsSeparator": " ", "strSymbolAndNumberSeparator": " " }, "CLP": { "strCode": "CLP", "eCurrencyCode": 25, "strSymbol": "CLP$", "bSymbolIsPrefix": true, "bWholeUnitsOnly": true, "strDecimalSymbol": ",", "strThousandsSeparator": ".", "strSymbolAndNumberSeparator": " " }, "CNY": { "strCode": "CNY", "eCurrencyCode": 23, "strSymbol": "¥", "bSymbolIsPrefix": true, "bWholeUnitsOnly": true, "strDecimalSymbol": ".", "strThousandsSeparator": ",", "strSymbolAndNumberSeparator": " " }, "COP": { "strCode": "COP", "eCurrencyCode": 27, "strSymbol": "COL$", "bSymbolIsPrefix": true, "bWholeUnitsOnly": true, "strDecimalSymbol": ",", "strThousandsSeparator": ".", "strSymbolAndNumberSeparator": " " }, "CRC": { "strCode": "CRC", "eCurrencyCode": 40, "strSymbol": "₡", "bSymbolIsPrefix": true, "bWholeUnitsOnly": true, "strDecimalSymbol": ",", "strThousandsSeparator": ".", "strSymbolAndNumberSeparator": "" }, "CZK": { "strCode": "CZK", "eCurrencyCode": 44, "strSymbol": "Kč", "bSymbolIsPrefix": false, "bWholeUnitsOnly": false, "strDecimalSymbol": ".", "strThousandsSeparator": ",", "strSymbolAndNumberSeparator": " " }, "DKK": { "strCode": "DKK", "eCurrencyCode": 45, "strSymbol": "kr.", "bSymbolIsPrefix": false, "bWholeUnitsOnly": false, "strDecimalSymbol": ".", "strThousandsSeparator": ",", "strSymbolAndNumberSeparator": " " }, "EUR": { "strCode": "EUR", "eCurrencyCode": 3, "strSymbol": "€", "bSymbolIsPrefix": false, "bWholeUnitsOnly": false, "strDecimalSymbol": ",", "strThousandsSeparator": " ", "strSymbolAndNumberSeparator": "" }, "GBP": { "strCode": "GBP", "eCurrencyCode": 2, "strSymbol": "£", "bSymbolIsPrefix": true, "bWholeUnitsOnly": false, "strDecimalSymbol": ".", "strThousandsSeparator": ",", "strSymbolAndNumberSeparator": "" }, "HKD": { "strCode": "HKD", "eCurrencyCode": 29, "strSymbol": "HK$", "bSymbolIsPrefix": true, "bWholeUnitsOnly": false, "strDecimalSymbol": ".", "strThousandsSeparator": ",", "strSymbolAndNumberSeparator": " " }, "HRK": { "strCode": "HRK", "eCurrencyCode": 43, "strSymbol": "kn", "bSymbolIsPrefix": false, "bWholeUnitsOnly": false, "strDecimalSymbol": ".", "strThousandsSeparator": ",", "strSymbolAndNumberSeparator": " " }, "HUF": { "strCode": "HUF", "eCurrencyCode": 46, "strSymbol": "Ft", "bSymbolIsPrefix": false, "bWholeUnitsOnly": false, "strDecimalSymbol": ".", "strThousandsSeparator": ",", "strSymbolAndNumberSeparator": " " }, "IDR": { "strCode": "IDR", "eCurrencyCode": 10, "strSymbol": "Rp", "bSymbolIsPrefix": true, "bWholeUnitsOnly": true, "strDecimalSymbol": ".", "strThousandsSeparator": " ", "strSymbolAndNumberSeparator": " " }, "ILS": { "strCode": "ILS", "eCurrencyCode": 35, "strSymbol": "₪", "bSymbolIsPrefix": true, "bWholeUnitsOnly": false, "strDecimalSymbol": ".", "strThousandsSeparator": ",", "strSymbolAndNumberSeparator": "" }, "INR": { "strCode": "INR", "eCurrencyCode": 24, "strSymbol": "₹", "bSymbolIsPrefix": true, "bWholeUnitsOnly": true, "strDecimalSymbol": ".", "strThousandsSeparator": ",", "strSymbolAndNumberSeparator": " " }, "JPY": { "strCode": "JPY", "eCurrencyCode": 8, "strSymbol": "¥", "bSymbolIsPrefix": true, "bWholeUnitsOnly": true, "strDecimalSymbol": ".", "strThousandsSeparator": ",", "strSymbolAndNumberSeparator": " " }, "KRW": { "strCode": "KRW", "eCurrencyCode": 16, "strSymbol": "₩", "bSymbolIsPrefix": true, "bWholeUnitsOnly": true, "strDecimalSymbol": ".", "strThousandsSeparator": ",", "strSymbolAndNumberSeparator": " " }, "KWD": { "strCode": "KWD", "eCurrencyCode": 38, "strSymbol": "KD", "bSymbolIsPrefix": false, "bWholeUnitsOnly": false, "strDecimalSymbol": ".", "strThousandsSeparator": ",", "strSymbolAndNumberSeparator": " " }, "KZT": { "strCode": "KZT", "eCurrencyCode": 37, "strSymbol": "₸", "bSymbolIsPrefix": false, "bWholeUnitsOnly": true, "strDecimalSymbol": ",", "strThousandsSeparator": " ", "strSymbolAndNumberSeparator": "" }, "MXN": { "strCode": "MXN", "eCurrencyCode": 19, "strSymbol": "Mex$", "bSymbolIsPrefix": true, "bWholeUnitsOnly": false, "strDecimalSymbol": ".", "strThousandsSeparator": ",", "strSymbolAndNumberSeparator": " " }, "MYR": { "strCode": "MYR", "eCurrencyCode": 11, "strSymbol": "RM", "bSymbolIsPrefix": true, "bWholeUnitsOnly": false, "strDecimalSymbol": ".", "strThousandsSeparator": ",", "strSymbolAndNumberSeparator": "" }, "NOK": { "strCode": "NOK", "eCurrencyCode": 9, "strSymbol": "kr", "bSymbolIsPrefix": false, "bWholeUnitsOnly": false, "strDecimalSymbol": ",", "strThousandsSeparator": ".", "strSymbolAndNumberSeparator": " " }, "NZD": { "strCode": "NZD", "eCurrencyCode": 22, "strSymbol": "NZ$", "bSymbolIsPrefix": true, "bWholeUnitsOnly": false, "strDecimalSymbol": ".", "strThousandsSeparator": ",", "strSymbolAndNumberSeparator": " " }, "PEN": { "strCode": "PEN", "eCurrencyCode": 26, "strSymbol": "S/.", "bSymbolIsPrefix": true, "bWholeUnitsOnly": false, "strDecimalSymbol": ".", "strThousandsSeparator": ",", "strSymbolAndNumberSeparator": "" }, "PHP": { "strCode": "PHP", "eCurrencyCode": 12, "strSymbol": "P", "bSymbolIsPrefix": true, "bWholeUnitsOnly": false, "strDecimalSymbol": ".", "strThousandsSeparator": ",", "strSymbolAndNumberSeparator": "" }, "PLN": { "strCode": "PLN", "eCurrencyCode": 6, "strSymbol": "zł", "bSymbolIsPrefix": false, "bWholeUnitsOnly": false, "strDecimalSymbol": ",", "strThousandsSeparator": " ", "strSymbolAndNumberSeparator": "" }, "QAR": { "strCode": "QAR", "eCurrencyCode": 39, "strSymbol": "QR", "bSymbolIsPrefix": false, "bWholeUnitsOnly": false, "strDecimalSymbol": ".", "strThousandsSeparator": ",", "strSymbolAndNumberSeparator": " " }, "RMB": { "strCode": "RMB", "eCurrencyCode": 23, "strSymbol": "¥", "bSymbolIsPrefix": true, "bWholeUnitsOnly": true, "strDecimalSymbol": ".", "strThousandsSeparator": ",", "strSymbolAndNumberSeparator": " " }, "RON": { "strCode": "RON", "eCurrencyCode": 47, "strSymbol": "lei", "bSymbolIsPrefix": false, "bWholeUnitsOnly": false, "strDecimalSymbol": ".", "strThousandsSeparator": ",", "strSymbolAndNumberSeparator": " " }, "RUB": { "strCode": "RUB", "eCurrencyCode": 5, "strSymbol": "pуб.", "bSymbolIsPrefix": false, "bWholeUnitsOnly": true, "strDecimalSymbol": ",", "strThousandsSeparator": "", "strSymbolAndNumberSeparator": " " }, "SAR": { "strCode": "SAR", "eCurrencyCode": 31, "strSymbol": "SR", "bSymbolIsPrefix": false, "bWholeUnitsOnly": false, "strDecimalSymbol": ".", "strThousandsSeparator": ",", "strSymbolAndNumberSeparator": " " }, "SEK": { "strCode": "SEK", "eCurrencyCode": 33, "strSymbol": "kr", "bSymbolIsPrefix": false, "bWholeUnitsOnly": false, "strDecimalSymbol": ".", "strThousandsSeparator": ",", "strSymbolAndNumberSeparator": " " }, "SGD": { "strCode": "SGD", "eCurrencyCode": 13, "strSymbol": "S$", "bSymbolIsPrefix": true, "bWholeUnitsOnly": false, "strDecimalSymbol": ".", "strThousandsSeparator": ",", "strSymbolAndNumberSeparator": "" }, "THB": { "strCode": "THB", "eCurrencyCode": 14, "strSymbol": "฿", "bSymbolIsPrefix": true, "bWholeUnitsOnly": false, "strDecimalSymbol": ".", "strThousandsSeparator": ",", "strSymbolAndNumberSeparator": "" }, "TRY": { "strCode": "TRY", "eCurrencyCode": 17, "strSymbol": "TL", "bSymbolIsPrefix": false, "bWholeUnitsOnly": false, "strDecimalSymbol": ",", "strThousandsSeparator": ".", "strSymbolAndNumberSeparator": " " }, "TWD": { "strCode": "TWD", "eCurrencyCode": 30, "strSymbol": "NT$", "bSymbolIsPrefix": true, "bWholeUnitsOnly": true, "strDecimalSymbol": ".", "strThousandsSeparator": ",", "strSymbolAndNumberSeparator": " " }, "UAH": { "strCode": "UAH", "eCurrencyCode": 18, "strSymbol": "₴", "bSymbolIsPrefix": false, "bWholeUnitsOnly": true, "strDecimalSymbol": ",", "strThousandsSeparator": " ", "strSymbolAndNumberSeparator": "" }, "USD": { "strCode": "USD", "eCurrencyCode": 1, "strSymbol": "$", "bSymbolIsPrefix": true, "bWholeUnitsOnly": false, "strDecimalSymbol": ".", "strThousandsSeparator": ",", "strSymbolAndNumberSeparator": "" }, "UYU": { "strCode": "UYU", "eCurrencyCode": 41, "strSymbol": "$U", "bSymbolIsPrefix": true, "bWholeUnitsOnly": true, "strDecimalSymbol": ",", "strThousandsSeparator": ".", "strSymbolAndNumberSeparator": "" }, "VND": { "strCode": "VND", "eCurrencyCode": 15, "strSymbol": "₫", "bSymbolIsPrefix": false, "bWholeUnitsOnly": true, "strDecimalSymbol": ",", "strThousandsSeparator": ".", "strSymbolAndNumberSeparator": "" }, "ZAR": { "strCode": "ZAR", "eCurrencyCode": 28, "strSymbol": "R", "bSymbolIsPrefix": true, "bWholeUnitsOnly": false, "strDecimalSymbol": ".", "strThousandsSeparator": " ", "strSymbolAndNumberSeparator": " " } } const g_rgWalletInfo = { "wallet_currency": 23, "wallet_country": "CN", "wallet_state": "", "wallet_fee": "1", "wallet_fee_minimum": "1", "wallet_fee_percent": "0.05", "wallet_publisher_fee_percent_default": "0.10", "wallet_fee_base": "0", "wallet_balance": "20028", "wallet_delayed_balance": "0", "wallet_max_balance": "1300000", "wallet_trade_max_balance": "1170000" } var helper_config = loadConfig(); var steamCurrency; var exchangeRate = GM_getValue("exchangeRate") || { FtoC: 1, CtoF: 1, time_next_update_unix: 0, time_update_unix: 0 }; var ajaxTimeout = 20000; var steamConnection = undefined; var steamFailedTimes = 0; var market_color_high = []; var market_color_low = []; var itemCount = 0; var itemNum = 0; var needSort; // 翻页类的操作没有重新加载的必要,用var可以直接当缓存用,不过只适用某个具体商品详情页 var steam_lowest_sell_order = 0; // steam最低出售价 var steam_highest_buy_order = 0; // steam最高求购价 // toast CSS GM_addStyle(".jq-toast-wrap{display:block;position:fixed;width:250px;pointer-events:none!important;margin:0;padding:0;letter-spacing:normal;z-index:9000!important}.jq-toast-wrap *{margin:0;padding:0}.jq-toast-wrap.bottom-left{bottom:20px;left:20px}.jq-toast-wrap.bottom-right{bottom:20px;right:40px}.jq-toast-wrap.top-left{top:20px;left:20px}.jq-toast-wrap.top-right{top:20px;right:74px}.jq-toast-single{display:block;width:100%;padding:10px;margin:0 0 5px;border-radius:4px;font-size:15px;font-family:arial,sans-serif;line-height:18px;position:relative;pointer-events:all!important;background-color:#444;color:white;white-space:normal;word-break:break-all;overflow:hidden}.jq-toast-single hr{border:1px solid #fff;margin:4px 0}.jq-toast-single h2{font-family:arial,sans-serif;font-size:18px;font-weight:bold;margin:0 0 7px;background:0;color:inherit;line-height:inherit;letter-spacing:normal}.jq-toast-single a{color:#eee;text-decoration:none;font-weight:bold;border-bottom:1px solid white;margin-right:8px}.jq-toast-single ul{margin:0 0 0 15px;background:0;padding:0}.jq-toast-single ul li{list-style-type:disc!important;line-height:17px;background:0;margin:0;padding:0;letter-spacing:normal}.close-jq-toast-single{position:absolute;top:2px;right:5px;font-size:22px;cursor:pointer}.jq-toast-loader{display:block;position:absolute;bottom:0;height:4px;width:0;left:0;background:#000!important;opacity:.4}.jq-toast-loaded{width:100%}.jq-has-icon{padding:10px 10px 10px 43px;background-repeat:no-repeat;background-position:10px}.jq-icon-info{background-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAGwSURBVEhLtZa9SgNBEMc9sUxxRcoUKSzSWIhXpFMhhYWFhaBg4yPYiWCXZxBLERsLRS3EQkEfwCKdjWJAwSKCgoKCcudv4O5YLrt7EzgXhiU3/4+b2ckmwVjJSpKkQ6wAi4gwhT+z3wRBcEz0yjSseUTrcRyfsHsXmD0AmbHOC9Ii8VImnuXBPglHpQ5wwSVM7sNnTG7Za4JwDdCjxyAiH3nyA2mtaTJufiDZ5dCaqlItILh1NHatfN5skvjx9Z38m69CgzuXmZgVrPIGE763Jx9qKsRozWYw6xOHdER+nn2KkO+Bb+UV5CBN6WC6QtBgbRVozrahAbmm6HtUsgtPC19tFdxXZYBOfkbmFJ1VaHA1VAHjd0pp70oTZzvR+EVrx2Ygfdsq6eu55BHYR8hlcki+n+kERUFG8BrA0BwjeAv2M8WLQBtcy+SD6fNsmnB3AlBLrgTtVW1c2QN4bVWLATaIS60J2Du5y1TiJgjSBvFVZgTmwCU+dAZFoPxGEEs8nyHC9Bwe2GvEJv2WXZb0vjdyFT4Cxk3e/kIqlOGoVLwwPevpYHT+00T+hWwXDf4AJAOUqWcDhbwAAAAASUVORK5CYII=');background-color:#2878c1e6;color:#d9edf7;border-color:#bce8f1}.jq-icon-warning{background-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAGYSURBVEhL5ZSvTsNQFMbXZGICMYGYmJhAQIJAICYQPAACiSDB8AiICQQJT4CqQEwgJvYASAQCiZiYmJhAIBATCARJy+9rTsldd8sKu1M0+dLb057v6/lbq/2rK0mS/TRNj9cWNAKPYIJII7gIxCcQ51cvqID+GIEX8ASG4B1bK5gIZFeQfoJdEXOfgX4QAQg7kH2A65yQ87lyxb27sggkAzAuFhbbg1K2kgCkB1bVwyIR9m2L7PRPIhDUIXgGtyKw575yz3lTNs6X4JXnjV+LKM/m3MydnTbtOKIjtz6VhCBq4vSm3ncdrD2lk0VgUXSVKjVDJXJzijW1RQdsU7F77He8u68koNZTz8Oz5yGa6J3H3lZ0xYgXBK2QymlWWA+RWnYhskLBv2vmE+hBMCtbA7KX5drWyRT/2JsqZ2IvfB9Y4bWDNMFbJRFmC9E74SoS0CqulwjkC0+5bpcV1CZ8NMej4pjy0U+doDQsGyo1hzVJttIjhQ7GnBtRFN1UarUlH8F3xict+HY07rEzoUGPlWcjRFRr4/gChZgc3ZL2d8oAAAAASUVORK5CYII=');background-color:#F89406cc;color:#fcf8e3;border-color:#faebcc}.jq-icon-error{background-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAHOSURBVEhLrZa/SgNBEMZzh0WKCClSCKaIYOED+AAKeQQLG8HWztLCImBrYadgIdY+gIKNYkBFSwu7CAoqCgkkoGBI/E28PdbLZmeDLgzZzcx83/zZ2SSXC1j9fr+I1Hq93g2yxH4iwM1vkoBWAdxCmpzTxfkN2RcyZNaHFIkSo10+8kgxkXIURV5HGxTmFuc75B2RfQkpxHG8aAgaAFa0tAHqYFfQ7Iwe2yhODk8+J4C7yAoRTWI3w/4klGRgR4lO7Rpn9+gvMyWp+uxFh8+H+ARlgN1nJuJuQAYvNkEnwGFck18Er4q3egEc/oO+mhLdKgRyhdNFiacC0rlOCbhNVz4H9FnAYgDBvU3QIioZlJFLJtsoHYRDfiZoUyIxqCtRpVlANq0EU4dApjrtgezPFad5S19Wgjkc0hNVnuF4HjVA6C7QrSIbylB+oZe3aHgBsqlNqKYH48jXyJKMuAbiyVJ8KzaB3eRc0pg9VwQ4niFryI68qiOi3AbjwdsfnAtk0bCjTLJKr6mrD9g8iq/S/B81hguOMlQTnVyG40wAcjnmgsCNESDrjme7wfftP4P7SP4N3CJZdvzoNyGq2c/HWOXJGsvVg+RA/k2MC/wN6I2YA2Pt8GkAAAAASUVORK5CYII=');background-color:#d4372fcc;color:#f2dede;border-color:#ebccd1}.jq-icon-success{background-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAADsSURBVEhLY2AYBfQMgf///3P8+/evAIgvA/FsIF+BavYDDWMBGroaSMMBiE8VC7AZDrIFaMFnii3AZTjUgsUUWUDA8OdAH6iQbQEhw4HyGsPEcKBXBIC4ARhex4G4BsjmweU1soIFaGg/WtoFZRIZdEvIMhxkCCjXIVsATV6gFGACs4Rsw0EGgIIH3QJYJgHSARQZDrWAB+jawzgs+Q2UO49D7jnRSRGoEFRILcdmEMWGI0cm0JJ2QpYA1RDvcmzJEWhABhD/pqrL0S0CWuABKgnRki9lLseS7g2AlqwHWQSKH4oKLrILpRGhEQCw2LiRUIa4lwAAAABJRU5ErkJggg==');color:#dff0d8;background-color:#059850e6;border-color:#d6e9c6}.jq-icon-info:hover{background-color:#2878c1}.jq-icon-warning:hover{background-color:#e48b06}.jq-icon-error:hover{background-color:#c53d36}.jq-icon-success:hover{background-color:#059850}"); // 设置界面 GM_addStyle(".helper_importantA{font-size:22px;font-weight:bold;color:#ffa914 !important}.helper_importantA:hover{color:#ff2c2c !important}.helper-setting input[type=number]{max-width:70px}input[type=\"number\"]{-moz-appearance:textfield}.helper-setting-shadow{position:fixed;justify-content:center;align-items:center;display:none;z-index:100;top:0;right:0;bottom:0;left:0;margin:0;background:#00000066}.helper-setting{background:#fff;border-radius:5px;padding:30px 40px 10px;top:25%;opacity:0.95;}.w-Checkbox.helper-setting-option>span:first-child{margin:0!important;font-size:14px}.helper-setting-steamConnection i.icon{margin-left:0!important}.helper-setting .list_tb span,.helper-setting .list_tb i.icon{margin-left:12px}.helper-setting .icon_status_progressing{animation:rotate-L 1.5s linear infinite;-webkit-animation:rotate-L 1.5s linear infinite}.helper-setting>.list_tb tr:last-child>td{border-bottom:0}.helper-setting td.setting-title{height:0;border:0;padding:5px 0 0 0}"); $("body").append('<div class="cont_main helper-setting-shadow"><div class="helper-setting"><b>基础设定</b><span id="helper-version" style="float: right;">插件版本:</span><table class="list_tb"><tbody><tr><td class="t_Left c_Gray">STEAM连接性:</td><td class="t_Left helper-setting-steamConnection"><span class="c_Yellow"><i class="icon icon_status_waiting"></i>未知</span></td><td class="t_Right"><span class="c_DGrey steamConnectionCountdown" style="display: none;"></span><a href="javascript:void(0);" id="helper-setting-checkBtn" class="i_Btn i_Btn_small">检测</a></td></tr><tr><td class="t_Left c_Gray">Steam参考货币</td><td class="t_Left" colspan="2"><span><div id="helper-setting-currency" class="w-Select helper-setting-option" data-option-target="steamCurrency" style="width: 120px; visibility: visible;"><h3 style="margin:0;font-weight:normal;">默认</h3><i class="icon icon_drop"></i><ul style="width: 120px;height: 200px;overflow: auto;" class="steam-currency-selector"></ul></div></span><i class="icon icon_qa j_tips_handler helper-warning-currency" data-title="说明:" data-content="选择获取steam数据时使用什么货币,会影响税后价格、求购价格等\n默认为CNY(¥)" data-direction="right"></i><span><div id="helper-setting-currencyEffectCalculate" class="w-Checkbox helper-setting-option" data-option-target="currencyEffectCalculate" value=""><span value="true"><i class="icon icon_checkbox"></i>无视汇率</span></div></span><i class="icon icon_qa j_tips_handler helper-warning-currency" data-title="说明:" data-content="勾选后不会将外币转回人民币进行计算(无特殊需求不用开)" data-direction="right"></i></td></tr></tbody><tbody><tr><td class="t_Left setting-title" colspan="3"><b>市场页设定</b></td></tr><tr><td class="t_Left c_Gray">在售数量门槛</td><td class="t_Left"><span><input type="number" id="helper-setting-buffSellThreshold" data-option-target="buffSellThreshold" class="i_Text helper-setting-option" min="0" step="1"></span><i class="icon icon_qa j_tips_handler helper-warning-sell-threshold" data-title="说明:" data-content="在售量小于设定值的商品会被略过,可以减少对steam的请求" data-direction="right"></i></td><td class="t_Right"></td></tr><tr><td class="t_Left c_Gray" width="120">覆盖排序规则</td><td class="t_Left"><span><div id="helper-setting-stickerSort" class="w-Checkbox helper-setting-option" data-option-target="overrideSortRule" value=""><span value="true"><i class="icon icon_checkbox"></i>启用 </span></div></span><i class="icon icon_qa j_tips_handler" data-title="说明:" data-content="开启后使用buff排序时插件不进行排序(可以手动排,不影响设置)" data-direction="right"></i></td><td class="t_Right"></td></tr><tr><td class="t_Left c_Gray" width="120">完成后排序</td><td class="t_Left"><span><div id="helper-setting-sortAfterAllDone" class="w-Checkbox helper-setting-option" data-option-target="sortAfterAllDone" value=""><span value="true"><i class="icon icon_checkbox"></i>启用 </span></div></span><i class="icon icon_qa j_tips_handler" data-title="说明:" data-content="等待所有饰品比例都加载完成后再进行排序" data-direction="right"></i></td><td class="t_Right"></td></tr><tr><td class="t_Left c_Gray">默认排序规则</td><td class="t_Left"><span><div id="helper-setting-sortRule" class="w-Select helper-setting-option" data-option-target="needSort" style="visibility: visible;"><h3 style="margin:0;font-weight:normal;">不排序</h3><i class="icon icon_drop"></i><ul style="width: 130px;"><li value="null">不排序</li><li value="buff-sort_asc">按buff比例从低到高</li><li value="buff-sort_desc">按buff比例从高到低</li><li value="order-sort_asc">按求购比例从低到高</li><li value="order-sort_desc">按求购比例从高到低</li></ul></div></span></td><td class="t_Right"><i class="icon icon_qa j_tips_handler" data-title="说明:" data-content="只能排序当前加载的页面,全局排序请自行寻找其他插件" data-direction="right"></i></td></tr><tr><td class="t_Left c_Gray">每页显示数量</td><td class="t_Left"><span><input type="number" id="helper-setting-pageSize" data-option-target="pageSize" class="i_Text helper-setting-option" min="1" max="80" step="1"></span><i class="icon icon_qa j_tips_handler helper-warning-pageNum" data-title="修改每页显示数量" data-content="可能增加封号概率,小白勿用,默认值20,最大值80" data-direction="right"></i></td><td class="t_Right"></td></tr><tr><td class="t_Left c_Gray">渐变色</td><td class="t_Left" colspan="2"><span class="c_DGray">最小 <input type="color" id="helper-setting-marketColorLow" data-option-target="marketColorLow" class="helper-setting-option"></span><i class="icon icon_qa j_tips_handler" data-title="" data-content="渐变最小值:比例越接近最小值(默认是0.63)会越趋近这个颜色\n渐变最大值:比例越接近最大值(默认是1)会越趋近这个颜色" data-direction="bottom"></i><span class="c_DGray">最大 <input type="color" id="helper-setting-marketColorHigh" data-option-target="marketColorHigh" class="helper-setting-option"></span></td></tr><tr><td class="t_Left c_Gray">比例极值</td><td class="t_Left" colspan="2"><span class="c_DGray">最小 <input type="number" id="helper-setting-minRange" data-option-target="minRange" class="i_Text helper-setting-option" min="0" max="1" step="0.01"></span><i class="icon icon_qa j_tips_handler" data-title="" data-content="比例最小值:小于等于这个值的比例会直接渲染成最小值渐变色\n比例最大值:大于等于这个值的比例会直接渲染成最大值渐变色" data-direction="bottom"></i><span class="c_DGray">最大 <input type="number" id="helper-setting-maxRange" data-option-target="maxRange" class="i_Text helper-setting-option" min="1" max="100"></span></td></tr></tbody><tbody><tr><td class="t_Left setting-title" colspan="3"><b>商品页设定</b></td></tr><tr><td class="t_Left c_Gray">求购列表靠左显示</td><td class="t_Left"><span><div id="helper-setting-orderFloatLeft" class="w-Checkbox helper-setting-option" data-option-target="orderFloatLeft"><span value="true"><i class="icon icon_checkbox"></i>启用 </span></div></span><i class="icon icon_qa j_tips_handler" data-title="说明:" data-content="决定求购列表是否显示在左侧(饰品图片之后)" data-direction="right"></i></td><td class="t_Right"></td></tr><tr><td class="t_Left c_Gray">反向贴纸顺序</td><td class="t_Left"><span><div id="helper-setting-reverseSticker" class="w-Checkbox helper-setting-option" data-option-target="reverseSticker"><span value="true"><i class="icon icon_checkbox"></i>启用 </span></div></span><i class="icon icon_qa j_tips_handler" data-title="说明:" data-content="将饰品贴纸的顺序倒转,保持和检视时枪上的顺序一样" data-direction="right"></i></td><td class="t_Right"></td></tr><tr><td class="t_Center" colspan="3"><a href="https://greasyfork.org/zh-CN/scripts/410137" class="helper_importantA">插件免费 请勿上当 官网安装 防止盗号</a><br /></td></tr><tr><td class="t_Center" colspan="3"><a href="https://greasyfork.org/zh-CN/scripts/410137">插件官网</a><span><a href="https://greasyfork.org/zh-CN/scripts/410137#support">常见问题</a></span><span><a href="javascript:void(0);" id="helper-setting-resetAll" class="i_Btn i_Btn_small">恢复默认设置</a></span><span><a href="https://greasyfork.org/zh-CN/scripts/410137#additional-info">使用教程</a></span><span><a href="https://greasyfork.org/zh-CN/scripts/410137/feedback#post-discussion">问题反馈</a></span></td></tr></tbody></table></div></div>'); // 初始化货币 initCurrency(); // 添加翻页和设置按钮,初始化部分数据 initHelper(); if (location.pathname.startsWith("/goods/")) { // 自带css GM_addStyle(".market_commodity_orders_header_promote {color: whitesmoke;}#steam_sold{margin-top:5px}#steam_order{margin-top:5px}#steam_order_error{margin-top:5px;font-size: medium;font-weight: bold;color: #ff1e3e;}.market_listing_price_with_fee{color: #ffae3a;font-size: 12px;margin-left: 6px;}"); GM_addStyle(".steam-link{float:right;margin-top:3px}.detail-cont>.blank20{height:10px}"); // 组件css GM_addStyle(".paymentIcon{padding:1px 17px 0 !important;position:absolute}a.j_shoptip_handler{margin-right:10px}.user-thum{margin: 0;}.list_tb_csgo>tr>th:first-child{width:5px}.list_tb_csgo>tr>th:nth-child(2){padding-right:9px}.list_tb_csgo>tr>th:nth-child(4){min-width:185px !important}.list_tb_csgo .pic-cont{width:112px;height:84px}.list_tb_csgo .pic-cont img{height:100%;}.csgo_sticker.has_wear{position:absolute;display: inline-block;margin:10px 0 0 270px}.csgo_sticker.has_wear .stickers{width:62px;height:48px;margin:0;background: 0;}.stag{margin:0 0 0 2px !important;padding: 4px 6px;float:none !important}.float_rank{color: green;}.stickers:hover{opacity:1!important}"); GM_addStyle(".tooltip .tooltiptext{visibility:hidden;border: 1px solid #d0d0d0;width:128px;height:96px;background-color:#fbfbfbc7;position:absolute;z-index:60;bottom:100%;margin-left:-62px;border-radius:10px}.tooltip:hover .tooltiptext{visibility:visible}"); // 求购列表css GM_addStyle(".market_commodity_orders_table.order_float_left{margin: 0 10px 0 0;float: left;}.market_commodity_orders_table{margin: 0 0 0 10px;height:100%;float:right;border-collapse:separate;background-color:rgba(0,0,0,0.3);}.market_commodity_orders_table tr:nth-child(even){background-color:#242b33}.market_commodity_orders_table td{text-align:center;padding:4px}.market_commodity_orders_table th{padding:4px;margin:0;text-align:center;font-size:16px;font-weight:normal}"); // 求购警告css GM_addStyle('#steam_order .warning{ position: relative; margin: 0 0 0 4px; display: inline-flex; vertical-align: text-bottom; } #steam_order .warning .tips { visibility: hidden; position: absolute; width: 200px; top: 100%; left: 0; background: #111111; padding: 4px;} #steam_order:hover .warning .tips { visibility: visible; }'); (function initSteamLink() { if (!document.querySelector(".detail-cont")) { requestIdleCallback(initSteamLink, { timeout: 300 }); return; } $(".detail-pic").css("background-repeat", "round").children().width(250); if ($("#j_game-switcher").data("current") == "dota2") { $(".detail-cont>p").append($(".detail-summ>a").clone().addClass("steam-link")); } else { $(".detail-cont>div:first").append($(".detail-summ>a").clone().addClass("steam-link")); } // 适配 ”饰品比例计算脚本“ greasyfork.org/scripts/35597 // 防止排版冲突混乱 $(".detail-summ>a").hide(); $(".detail-cont").css("margin-left", 0); })(); $(document).ajaxSuccess(function (event, status, header, r###lt) { if (/^\/api\/market\/goods\/sell_order/.exec(header.url) && r###lt.data && r###lt.data.goods_infos[getGoodsId()] && r###lt.data.total_count) { steamFailedTimes = 0; buffHelperModule_inspestEnhancementCsgo(r###lt.data); buffHelperGoodsDetailScale(r###lt.data); } }); } else if (location.pathname.startsWith("/market/")) { // 主要样式 GM_addStyle(".steam_temp{margin-top: inherit;}#sort_scale{display:inline-block;padding:0 6px 0 16px;cursor:pointer;height:32px;margin-left:5px;line-height:32px;text-align:center;border-radius:4px;min-width:60px;border:1px solid #45536c;color:#63779b;vertical-align:middle}#sort_scale.enabled{background:#45536c;color:#fff}.list_card li{padding-bottom:0}.list_card li h3{margin: 4px 8px;}.list_card li p{margin: 6px 8px;}.list_card li>p>span.l_Left{margin-top:inherit}.list_card li>p>strong.f_Strong{display:block;font-size:20px;min-height:20px;}.price_scale{padding-top:2px}"); // 进度条样式 GM_addStyle(".helper-loading{position:absolute;margin:11px}.helper-progress-bar{height:20px;background:linear-gradient(130deg, rgb(33 86 183 / 61%) 20%, rgb(15 116 187 / 35%) 85%, transparent);width:0;z-index:1000}"); $(document).ajaxSend(function (event, xhr, header, r###lt) { if (/^\/api\/market\/goods/.exec(header.url)) { header.url += "&page_size=" + helper_config.pageSize; $(".helper-progress-bar").remove(); $(".helper-loading").remove(); steamFailedTimes = 0; } }); $(document).ajaxSuccess(function (event, xhr, header, r###lt) { if (/^\/api\/market\/goods/.exec(header.url) && r###lt.data && r###lt.data.total_count) { buffHelperMarkerListScale(r###lt.data.items); } else if (/\/api\/market\/sell_order\/top_bookmarked/.exec(header.url)) { let warningTimes = GM_getValue("top_bookmarked-warning") || 0; if (warningTimes < 3) { GM_setValue("top_bookmarked-warning", ++warningTimes); showMessage("插件不会在热门关注运行", "出售、求购板块都可以使用<br/>哪有人会关注溢价商品的比例呢?", "warning", 16000 - 4000 * warningTimes); } } }); if ($(".block-header>.l_Right").length == 0) { setTimeout(initSortBtn, 100); } else { initSortBtn(); } } // 商品详情 window.buffHelperGoodsDetailScale = function (data) { // 检测商品是否加载完成 if ($("#market-selling-list").length == 0) { setTimeout(buffHelperGoodsDetailScale, 100); return; } $(".detail-cont").append("<i class=\"icon icon_uploading helper-loading\" style='margin: 5px;'></i>"); goodsDetailLoadData(data); async function goodsDetailLoadData(data, secendTry) { let price_list = $(".f_Strong"); let isLogined = $("#navbar-cash-amount").length == 1; let isFirstTime = $(".good_scale").length == 0; let buff_item_id = getGoodsId(); let app_id = data.goods_infos[buff_item_id].appid; let hash_name = escape(data.goods_infos[buff_item_id].market_hash_name); let steamLink = $(".detail-summ>a").attr("href") || `https://steamcommunity.com/market/listings/${app_id}/${hash_name}`; let items = data.items; let steam_price_cny = data.goods_infos[buff_item_id].steam_price_cny * 100; if (isFirstTime) { getSteamSoldNumber(app_id, hash_name).then((soldNumber) => { if (soldNumber.success) { $(".detail-cont").append(`<div id="steam_sold">有 <span class="market_commodity_orders_header_promote">${soldNumber.volume || 0}</span> 份在 24 小时内售出</div>`); } else { $(".detail-cont").append(`<div id="steam_sold_error">获取steam销量失败,原因:${soldNumber.statusText.split(",")[0]}</div>`); } }); let orderList = await getSteamOrderList(buff_item_id, steamLink); if (orderList.success) { steam_highest_buy_order = orderList.highest_buy_order && { origin: orderList.highest_buy_order, cny: FtoC(orderList.highest_buy_order) }; steam_lowest_sell_order = orderList.lowest_sell_order && { origin: orderList.lowest_sell_order, cny: FtoC(orderList.lowest_sell_order) }; if (orderList.buy_order_table != "") { $(".detail-cont").append(`<div id='steam_order'>${orderList.buy_order_summary}</div>`); $(".detail-pic").after(orderList.buy_order_table); let buff_sell_price = data.items[0].price; $(".market_commodity_orders_header_promote:last").after(`<small class='market_listing_price_with_fee'>${getScale(buff_sell_price, steam_highest_buy_order.cny)}</small>`); // 求购表格 $(".market_commodity_orders_table th:first").after("<th>比例</th>"); let orderTableList = $(".market_commodity_orders_table tr"); let viableScale = 0 // steam订购单比例低于1的数量 for (let i = 1; i < orderTableList.length; i++) { let td = $(orderTableList[i]).find("td:first"); let td_count = $(orderTableList[i]).find("td:last"); let priceGroup = convertPrice(td.text()); let scale = getScale(buff_sell_price, FtoC(priceGroup[1] + (priceGroup[3] || "00"))) td.after(`<td>${scale}</td>`); // 检查steam订购单异常情况,若只有个别比例低于1,提醒用户,排除用于尾部统计的最后一行 if (scale < 1 && i < orderTableList.length - 1) { viableScale += parseInt(td_count.text()) } } // 当只有个别比例低于1时,添加提醒 switch (true) { case viableScale == 0: break; case viableScale < 3: $('#steam_order').append(`<div class="warning" style="color: red;"><i class="icon icon_warning_mid" style="filter: invert(1) hue-rotate(120deg)"></i><div class="tips">仅有个别Steam订购单比例低于1,小心卖家自设虚假订购单</div></div>`) break; case viableScale < 5: $('#steam_order').append(`<div class="warning" style="color: orange;"><i class="icon icon_warning_mid"></i><div class="tips">比例低于1的Steam订购单过少,请小心购买</div></div>`) break; } if (helper_config.orderFloatLeft) { $(".market_commodity_orders_table").addClass("order_float_left"); } } } else { if ((!secendTry) && orderList.status == "500") { setTimeout(() => { goodsDetailLoadData(data, true); }, 100); return; } $(".detail-cont").append(`<div id='steam_order_error'>${orderList.statusText}</div>`); } } $(".helper-loading").remove(); $(".detail-tab-cont th:last").before('<th style="width: 45px;" class="t_Left"><span>比例</span></th>'); if (steam_lowest_sell_order) { $(".f_Strong .hide-usd")[0].innerText = getWithoutFeePrice(steam_lowest_sell_order.origin, 1); } else { $(".f_Strong .hide-usd")[0].innerText = getWithoutFeePrice(steam_price_cny, 1, "CNY"); } for (let i = 0; i < items.length; i++) { let buff_sell_price = items[i].price; let scale = getScale(buff_sell_price, steam_lowest_sell_order ? steam_lowest_sell_order.cny : steam_price_cny); if (scale === Infinity) { scale = "∞"; } if (!i) { let color; switch (true) { case scale > 0.9: color = "#a0ffc5"; break; case scale > 0.8: color = "#b8ff8a"; break; case scale > 0.74: color = "#fff054"; break; case scale > 0.67: color = "#ff7e15"; break; default: color = "#ff0049"; break; } if (isFirstTime) { $(".steam-link").prop("href", $(".steam-link").prop("href") + "?buffPrice=" + buff_sell_price); $(price_list[isLogined ? 1 : 0]).append($(`<big class='good_scale' style='color:${color};margin-left: 6px'>${scale}</big>`)); } else { $(".steam-link").prop("href", $(".steam-link").prop("href").replace(/\d{0,6}[.]?\d{0,2}$/, buff_sell_price)); $(".good_scale").text(scale).css("color", color); } } $(price_list[i + (isLogined ? 2 : 1)]).parents("td").after(`<td class="t_Left"><div style="display:table-cell;text-align:center;"><b class="seller_scale">${scale}</b><p class="c_Gray f_12px">${steam_highest_buy_order ? getScale(buff_sell_price, steam_highest_buy_order.cny) : ''}</p></div></td>`); } daemonThread(); } } // 市场目录 window.buffHelperMarkerListScale = async function (items) { // 检测商品是否加载完成 if ($("#j_list_card>ul>li").length == 0) { setTimeout(buffHelperMarkerListScale, 100); return; } $(".list_card li>p>span.l_Right").removeClass("l_Right").addClass("l_Left"); let randomID = Math.round(Math.random() * 1000); let goods = $("#j_list_card>ul>li"); itemNum = items.length; // 添加进度条 $(".tab>li.on").append("<i id=helper-loading-" + randomID + " class=\"icon icon_uploading helper-loading\"></i>"); $(".market-list .blank20:last").prepend('<div id=helper-progress-bar-' + randomID + ' class="helper-progress-bar"></div>'); for (let i = 0; i < goods.length; i++) { $(goods[i]).attr("data-default-sort", i); if (items[i].sell_num == 0) { updateProgressBar(randomID); continue; } await marketListLoadData(items[i], goods[i], randomID); } async function marketListLoadData(item, good, randomID, secendTry) { let target = $(good).find("p>strong.f_Strong")[0]; let buff_item_id = item.id; // buff商品ID let buff_buy_num = item.buy_num; // buff求购数量 let buff_buy_max_price = item.buy_max_price; // buff求购最高价 let buff_sell_num = item.sell_num; // buff在售数量 let buff_sell_min_price = item.sell_min_price; // buff出售最低价 let steam_price_cny = item.goods_info.steam_price_cny * 100; // buff提供的steam国区售价 let steam_market_url = item.steam_market_url; // steam市场链接 let buff_sell_reference_price = item.sell_reference_price; // buff出售参考价(没卵用) let steam_highest_buy_order = undefined; // 不能使用全局变量,不然未成功加载的数据比例会错误 let steam_lowest_sell_order = undefined; // 不能使用全局变量,不然未成功加载的数据比例会错误 $(good).attr("data-order-sort", Infinity); $(good).attr("data-sold_number-sort", Infinity); if (helper_config.buffSellThreshold >= buff_sell_num) { $(good).attr("data-buff-sort", Infinity); $(target).after($(HIGHLIGHT_TEMPLATE).text("已忽略")); } else { let orderList = await getSteamOrderList(buff_item_id, steam_market_url); if (orderList.success) { steam_highest_buy_order = orderList.highest_buy_order && { origin: orderList.highest_buy_order, cny: FtoC(orderList.highest_buy_order) }; steam_lowest_sell_order = orderList.lowest_sell_order && { origin: orderList.lowest_sell_order, cny: FtoC(orderList.lowest_sell_order) }; // 没有有效的订购单 if (orderList.buy_order_table == "") { $(target).after($(INFO_TEMPLATE).text("没有有效订购单")); } else { let steamOrderScale = getScale(buff_sell_min_price, steam_highest_buy_order.cny); if (helper_config.displaySoldNumber) { let soldNumber = await getSteamSoldNumber(item.appid, item.market_hash_name); if (soldNumber.success) { soldNumber.volume = soldNumber.volume.replace(",", ""); $(good).attr("data-sold_number-sort", soldNumber.volume || 0); $(target).after($(STEAM_SOLD_NUMBER_TEMPLATE).text((soldNumber.volume || 0) + "┊")); } else { let text = soldNumber.statusTextShort; $(target).after($(STEAM_SOLD_NUMBER_TEMPLATE).text((text ? text : "错误") + "┊")); } } else { let orderNumber = $(orderList.buy_order_summary)[0].innerText; $(good).attr("data-order-sort", steamOrderScale); $(target).after($(STEAM_ORDER_NUMBER_TEMPLATE).text(orderNumber + "┊")); } paintingGradient(steamOrderScale, target, 4, STEAM_ORDER_SCALE_TEMPLATE); } } else { if ((!secendTry) && orderList.status == 500) { setTimeout(() => { marketListLoadData(item, good, randomID, true); }, 100); return; } $(target).after($(ERROR_TEMPLATE).text(orderList.statusText.split(",")[0])); } let withoutFeePrice = getWithoutFeePrice(steam_lowest_sell_order ? steam_lowest_sell_order.origin : steam_price_cny); let scale = getScale(buff_sell_min_price, steam_lowest_sell_order ? steam_lowest_sell_order.cny : steam_price_cny); $(good).attr("data-buff-sort", scale); $(target).prepend(`<span>${target.childNodes[0].textContent}</span>`); target.childNodes[1].remove(); $(target).append($("<span class=\"f_12px f_Bold c_Gray\"></span>").css("margin-left", "5px").text(withoutFeePrice)); paintingGradient(scale, target, 3); withoutFeePrice = target.children[target.children.length - 2]; scale = target.children[target.children.length - 1]; let strWidth = 5; for (let i = 0; i < target.children.length; i++) { strWidth += target.children[i].offsetWidth; } let displayPrice = $(target).text().match(/([€₽\$¥]\s)((\d+)(\.\d{1,2})?)/) || [""]; let tryMe = 0; while (strWidth >= 192) { switch (tryMe++) { // 超长以后显示的越少越好,所以不用toFixed以免出现小数是0的情况 case 0: // 0/1 withoutFeePrice.innerText = Math.round(withoutFeePrice.innerText * 10) / 10; break; case 1: // 0/2 withoutFeePrice.innerText = Math.round(withoutFeePrice.innerText); break; case 2: // 0/1 scale.innerText = Math.round(scale.innerText * 10) / 10; break; case 3: // 0/3 let text = displayPrice[1] + Math.ceil(displayPrice[2]); // 价格抹零 $(target).text(text); displayPrice = text.match(/([€₽\$¥]\s)((\d+)(\.\d{1,2})?)/); break; case 4: // 0/2 scale.innerText = Math.ceil(scale.innerText); break; case 5: // no one's gonna know // $(target).text((+displayPrice[3]).toString(16)); // withoutFeePrice.innerText = withoutFeePrice.innerText.toString(16); withoutFeePrice.innerText = ""; strWidth = 0; continue; } strWidth = 5; for (let i = 0; i < target.children.length; i++) { strWidth += target.children[i].offsetWidth; } } } if (needSort && (helper_config.sortAfterAllDone ? itemCount == itemNum - 1 : true)) { let arr = needSort.split("_"); sortGoods("data-" + arr[0], arr[1] == "asc"); } updateProgressBar(randomID); } } // 检视增强模组 window.buffHelperModule_inspestEnhancementCsgo = function (data) { // 检测商品是否加载完成 if ($("#market-selling-list").length == 0) { setTimeout(buffHelperModule_inspestEnhancementCsgo, 100); return; } if ($("#market-selling-list").hasClass("buffed")) { return; } $("#market-selling-list").addClass("buffed"); // 不支持微信时给个占位图标 let alipayIcon = $(".icon_payment_alipay"); for (let i = 0; i < alipayIcon.length; i++) { let element = alipayIcon[i]; if (!element.nextElementSibling) { $(element).after('<i class="icon icon_select_wx_small" style="opacity:0;" title="Support BUFF Balances-bank card"></i>'); } } // 支付图标移动到购买按钮下 let paymentIcon = $(".icon_payment_alipay,.icon_payment_others").parent(); paymentIcon.addClass("paymentIcon on"); $(".paymentIcon .icon_payment_alipay").addClass("icon_select_alipay_small").removeClass("icon_payment_alipay"); $(".paymentIcon .icon_payment_others").addClass("icon_select_wx_small").removeClass("icon_payment_others"); for (let i = 0; i < paymentIcon.length; i++) { const element = paymentIcon[i]; $(element).parent().next().append(element); } // 检测是否支持这个类型/游戏的饰品 let goods_id = getGoodsId(); if (data.goods_infos[goods_id].appid != 730 || ENHANCEMENT_SUPPORT_LIST.indexOf(data.goods_infos[goods_id].tags.category_group.internal_name) < 0) { return; } // 英文页面标志 let isEn = $("#j_lang-switcher").data("current") === "en"; // 整体CSS $(".list_tb_csgo>tr>th.t_Left")[0].style.width = "550px"; // 给检视按钮去掉点击属性,防止产生图片无法关闭的bug $(".csgo_inspect_img_btn").attr("disabled", true).css({ "pointer-events": "none" }); // 给饰品图片加入点击属性用于检视 $(".pic-cont.item-detail-img").click(function () { this.children[1].click(); }).mouseenter(function () { $(this).css("background", $(this.children[1]).css("background")); }).mouseleave(function () { $(this).css("background", ""); }).css({ "cursor": "pointer" }); // 拿到每个饰品对应的dom let skin_list = $(".list_tb_csgo").find("[id^='sell_order_']"); for (let i = 0; i < skin_list.length; i++) { let mom = skin_list[i]; // 贴纸移动到图片dom中(保证垂直居中) let sticker = $(mom).find(".csgo_sticker"); $(sticker).addClass("sticker_parent_div"); $(mom).find("td:nth-child(2)").prepend(sticker); getItemDetail(mom); } // 渐变/淬火等特殊皮肤的tag let stags = $(".stag"); for (let i = 0; i < stags.length; i++) { let stag = $(stags[i]); stag.prev().append(stag); } // 贴纸大图 let stickers = $(".stickers"); for (let i = 0; i < stickers.length; i++) { let element = stickers[i]; element.innerHTML += "<span class='tooltiptext'>" + element.innerHTML + "</span>"; } $("span.f_12px.c_Gray:contains('%')").css("margin-left", "6px"); stickers.addClass("tooltip"); // 贴纸遮盖 stickers = $(".stickers.masked"); let min = 0.3; for (let i = 0; i < stickers.length; i++) { let float = parseInt(stickers[i].nextElementSibling.innerText); $(stickers[i]).css("opacity", float * (1 - min) / 100 + min); } $(".stickers.masked").removeClass("masked"); // 贴纸顺序 if (helper_config.reverseSticker) { $(".sticker-cont").css("float", "right"); } // 英文页面3D检视 if (isEn) { $(".ctag.btn_3d").html($(".ctag.btn_3d").html().substr(0, 37)); } function getItemDetail(parent, secondTime) { if ($(parent).find(".textOne")[0]) { return; } // 拿到每个饰品的图片对象 let skin = $(parent).find(".item-detail-img")[0]; // 获取饰品对应的信息并加载进data let classid = $(skin).data("classid"); let instanceid = $(skin).data("instanceid"); let sell_order_id = $(skin).data("orderid"); let origin = $(skin).data("origin"); let assetid = $(skin).data("assetid"); let data = { appid: 730, game: "csgo", classid: classid, instanceid: instanceid, sell_order_id: sell_order_id, origin: origin, assetid: assetid }; // 发送异步请求获取饰品详情 $.ajax({ url: "/market/item_detail", method: "get", timeout: ajaxTimeout, data: data, success: function (data) { let r###lt = $(data)[0]; // 获取待添加种子的dom对象 let origin_float = $(parent).find(".wear-value")[0]; try { let seed = "<div class='wear-value'>图案模板(seed): <b style='color:crimson'>" + $(r###lt).find(".skin-info>p:first").text().match(/\d{1,}/)[0] + "</b></div>"; $(origin_float).before(seed); } catch (error) { if (secondTime) { $(origin_float).before("<div class='wear-value'><b style='color:crimson'>获取失败,请稍后再试</b></div>"); return; } else { setTimeout(getItemDetail(parent, true), 500); } } // 获取名称标签对象 let name = $(r###lt).find("p.name_tag")[0]; if (name) { // 设定名称标签的样式 $(name).css({ "background": "transparent", "padding": "0" }); // 获取待添加名称标签的对象并添加名称标签 let targ_name = $(parent).find(".csgo_value")[0]; $(targ_name).before(name); } // 截取皮肤磨损并加粗 origin_float.innerHTML = "磨损: <b>" + origin_float.innerText.match(/0[.]\d*/)[0] + "</b>"; // 获取排名对象 let rank = $(r###lt).find(".skin-info>.des")[0]; if (rank) { // 位置在种子后面 $(parent).find(".csgo_value>.wear-value:first").append("<span style='margin-left:10px'>磨损排名: <b class='float_rank'>" + rank.innerText.match(/\d{1,}/)[0] + "</b></span>"); // 位置在磨损后面 // $(origin_float).html(origin_float.innerHTML + "<i class='float_rank'>「#<b>" + rank.innerText.match(/\d{1,}/)[0] + "</b>」</i>"); } }, error: function (msg) { if (msg.status == 429) { msg.statusText = "请求太频繁"; } console.log("error:", msg); let origin_float = $(parent).find(".wear-value")[0]; $(origin_float).before("<div class='wear-value'><b style='color:crimson'>" + msg.statusText + "</b></div>"); } }); } }; function initHelper() { if ($(".floatbar>ul").length == 0) { setTimeout(() => { initHelper(); }, 100); return; } if ($("#buff_tool_nextpage").length != 0) { return; } if (!GM_getValue("helper_alert_first")) { $("body").append('<div id="j_w-Toast" class="w-Toast_warning" style="display: block; margin-left: -195px; margin-top: -35px;"><p><i class="icon icon_warning_mid"></i>你应该是第一次安装“网易BUFF价格比例(找挂刀)插件” 本插件完全免费,让你##购买的都是骗子。请熟知。</p> <div> <a href="javascript:void(0)" class="agreementsBtn i_Btn i_Btn_mid i_Btn_D_red" style="margin-top: 15px;">我已知晓<span class="agreementsCountDown" style="margin-left:10px">5</span></a></div></div>'); let count = 5; let countDown = setInterval(function () { if (--count == 0) { clearInterval(countDown); $(".agreementsCountDown").remove(); } else { $(".agreementsCountDown").text(count); } }, 1000); $(".agreementsBtn").click(function () { if (!count) { GM_setValue("helper_alert_first", true); $("#j_w-Toast").hide("normal", () => { $("#j_w-Toast").remove(); }); } else { alert("认真看一会,还有" + count + "秒就可以点了"); } }); } // 设置按钮 $(".floatbar>ul").prepend("<li><a id='buff_tool_setting'><i class='icon icon_menu_setting'></i><p>设置</p></a></li>"); $("#buff_tool_setting").click(function () { openSettingPanel(); }).parent().css("cursor", "pointer"); // 下一页按钮 $(".floatbar>ul").prepend("<li><a id='buff_tool_nextpage'><i class='icon icon_slide_right2' style='height: 40px;width: 39px;'></i><p>下一页</p></a></li>"); $("#buff_tool_nextpage").click(function () { $(".page-link.next").click(); $("#sort_scale").removeClass(); }).parent().css("cursor", "pointer"); // 初始化设置页面 $("#helper-version").text($("#helper-version").text() + GM_info.script.version); $("#helper-setting-checkBtn").click(() => { checkSteamConnection() }); $("#helper-setting-resetAll").click(() => { resetConfig(); }); $(".helper-setting-shadow").click(function (e) { if (e.target == this) { $(this).fadeOut(); } }); // 添加设置页面操作 $(".helper-setting").change(function (e) { let target = e.target; let optionTarget = target.dataset.optionTarget; let val = target.getAttribute("value") ? target.getAttribute("value") : target.value; helper_config[optionTarget] = val; if (optionTarget == "steamCurrency" && g_rgCurrencyData[val].eCurrencyCode != 23) { let toast = showMessage(`正在获取${val}的汇率`, "访问时间取决于steam访问速度,期间请不要关闭页面", "info", 20000); updateRate(1, toast); } else { GM_setValue("helper_config", helper_config); } init(); }); // 注册管理工具菜单 GM_registerMenuCommand('打开设置面板', () => { openSettingPanel(); }); GM_registerMenuCommand('插件官网', () => { window.open("https://greasyfork.org/zh-CN/scripts/410137"); }); // 初始化设置页面后填装面板 init(); } function openSettingPanel() { updateSteamStatus(); $(".helper-setting-shadow").css({ "opacity": 0, "display": "flex" }).animate({ opacity: '1' }, 300); } function loadConfig() { let config = GM_getValue("helper_config"); if (config && Object.keys(config).length) { // 旧版更新到新版导致无数据 config.pageSize = config.pageSize ? config.pageSize : 20; return config; } return clone(DEFAULT_CONFIG); } function resetConfig() { GM_setValue("helper_config", null); GM_setValue("exchangeRate", null); GM_setValue("top_bookmarked-warning", null); helper_config = clone(DEFAULT_CONFIG); init(); showMessage("重置成功", "插件已恢复初始设定", "info", 2000); } function initCurrency() { for (let key in g_rgCurrencyData) { $(".steam-currency-selector").append("<li value=" + g_rgCurrencyData[key].strCode + ">" + g_rgCurrencyData[key].strCode + "(" + g_rgCurrencyData[key].strSymbol + ")</li>"); } syncCurrency(); if (steamCurrency.eCurrencyCode != 23) { updateRate(); } } function init() { $(".helper-setting>.list_tb .on").removeClass("on"); if (helper_config.currencyEffectCalculate) { $("#helper-setting-currencyEffectCalculate").attr("value", helper_config.currencyEffectCalculate).children(":first").addClass("on"); } if (helper_config.overrideSortRule) { $("#helper-setting-stickerSort").attr("value", helper_config.overrideSortRule).children(":first").addClass("on"); } if (helper_config.sortAfterAllDone) { $("#helper-setting-sortAfterAllDone").attr("value", helper_config.sortAfterAllDone).children(":first").addClass("on"); } if (helper_config.orderFloatLeft) { $("#helper-setting-orderFloatLeft").attr("value", helper_config.orderFloatLeft).children(":first").addClass("on"); $(".market_commodity_orders_table").addClass("order_float_left"); } else { $(".market_commodity_orders_table").removeClass("order_float_left"); } if (helper_config.reverseSticker) { $("#helper-setting-reverseSticker").attr("value", helper_config.reverseSticker).children(":first").addClass("on"); } reverseStickers(helper_config.reverseSticker); syncSort(); $("#helper-setting-pageSize").val(helper_config.pageSize); $("#helper-setting-buffSellThreshold").val(helper_config.buffSellThreshold); $("#helper-setting-maxRange").val(helper_config.maxRange); $("#helper-setting-minRange").val(helper_config.minRange); $("#helper-setting-marketColorLow").val(helper_config.marketColorLow); $("#helper-setting-marketColorHigh").val(helper_config.marketColorHigh); updateSteamStatus(); syncCurrency(); parseColor(); } function initSortBtn() { $(".block-header>.l_Right").append($('<div class="w-Select-Multi w-Select-scroll buff-helper-sort" style="visibility: visible; width: 140px;"><h3 id="helper-sort-text">比例排序</h3><i class="icon icon_drop"></i><ul style="width: 140px;"><li data-value="null">默认</li><li data-value="buff-sort_asc"><span class="w-Order_asc">buff比例从低到高<i class="icon icon_order"></i></span></li><li data-value="buff-sort_desc"><span class="w-Order_des">buff比例从高到低<i class="icon icon_order"></i></span></li><li data-value="order-sort_asc"><span class="w-Order_asc">求购比例从低到高<i class="icon icon_order"></i></span></li><li data-value="order-sort_desc"><span class="w-Order_des">求购比例从高到低<i class="icon icon_order"></i></span></li></ul></div>')); var sortBtnTimeout; $(".buff-helper-sort").click(function () { $(this).addClass("on"); clearTimeout(sortBtnTimeout); }).mouseleave(function () { let t = $(this); if (t.hasClass("on")) { sortBtnTimeout = setTimeout(() => t.removeClass("on"), 300); } }); $(".buff-helper-sort li").click(function (e) { e.stopPropagation(); needSort = this.dataset.value; if (this.dataset.value == "null") { $("#helper-sort-text").text("比例排序"); sortGoods("data-default-sort", true); } else { $("#helper-sort-text").text(this.innerText); let arr = this.dataset.value.split("_"); sortGoods("data-" + arr[0], arr[1] == "asc"); } $(".buff-helper-sort").removeClass("on"); }); syncSort(); setTimeout(() => { // 修改buff排序时重置比例排序规则 $("div[name='sort_by']").change(function () { if (helper_config.overrideSortRule && this.getAttribute("value")) { needSort = this.dataset.value; $("#helper-sort-text").text("默认"); } }); }, 500); } function syncSort() { needSort = helper_config.needSort; $("#helper-setting-sortRule>h3").text($("#helper-setting-sortRule li[value=" + helper_config.needSort + "]").addClass("on").text()); $("#helper-sort-text").text($(".buff-helper-sort li[data-value=" + helper_config.needSort + "]").click().text()); } function reverseStickers(isLeft) { $(".sticker-cont").css("float", isLeft ? "right" : "left"); // 没写错 } function updateSteamStatus() { if (steamConnection === undefined) { } else if (steamConnection) { if (!$(".helper-setting-steamConnection>.c_Green").text()) { $(".helper-setting-steamConnection").html("<span class=\"c_Green\"><i class=\"icon icon_status_success\"></i>正常</span>"); } } else { $(".helper-setting-steamConnection").html("<span class=\"c_DRed\"><i class=\"icon icon_status_failed\"></i>无法连接</span>"); } } function syncCurrency() { steamCurrency = g_rgCurrencyData[helper_config.steamCurrency]; $("#helper-setting-currency").attr("value", steamCurrency.strCode); $("#helper-setting-currency>h3").text($("#helper-setting-currency li[value=" + steamCurrency.strCode + "]").addClass("on").text()); } function parseColor() { market_color_high = helper_config.marketColorHigh.match(/[0-9a-f]{2}/ig); market_color_low = helper_config.marketColorLow.match(/[0-9a-f]{2}/ig); for (let i = 2; i >= 0; i--) { market_color_high[i] = parseInt(market_color_high[i], 16); market_color_low[i] = parseInt(market_color_low[i], 16); } } function sortGoods(sortRule, isAsc) { $("#j_list_card>ul>li").sort(function (a, b) { let av = $(a).attr(sortRule) - 0; let bv = $(b).attr(sortRule) - 0; let r###lt = 0; if (isAsc) { r###lt = av - bv; } else { r###lt = bv - av; } return r###lt === NaN ? 0 : r###lt; }).appendTo("#j_list_card>ul"); } function checkSteamConnection() { let interval = 0; $(".helper-setting-steamConnection").html("<span class=\"c_Blue\"><i class=\"icon icon_status_progressing\"></i>检测中</span>"); $("#helper-setting-checkBtn").css("visibility", "hidden"); let startTime = new Date().getTime(); let endTime = 0; steamConnection = undefined; GM_xmlhttpRequest({ url: "https://steamcommunity.com/market/", timeout: ajaxTimeout, method: "get", onloadstart: function (event) { countdown(19); }, onload: function (res) { if (res && res.status == 200) { endTime = new Date().getTime(); changeSteamStatus(true); } else { console.log("检测steam连接性出错:状态错误", res); changeSteamStatus(false); } }, onerror: function (err) { console.log("检测steam连接性出错:连接错误", err); changeSteamStatus(false); }, ontimeout: function () { console.log("检测steam连接性出错:尝试超时"); changeSteamStatus(false); } }); function changeSteamStatus(status) { clearInterval(interval); $(".steamConnectionCountdown").hide(); steamConnection = status; if (status) { $(".helper-setting-steamConnection").html("<span class=\"c_Green\"><i class=\"icon icon_status_success\"></i>正常</span><span class=\"c_DGray f_12px\">" + (endTime - startTime) + "ms</span>"); } else { $(".helper-setting-steamConnection").html("<span class=\"c_DRed\"><i class=\"icon icon_status_failed\"></i>无法连接</span>"); } $("#helper-setting-checkBtn").css("visibility", "visible"); } function countdown(count) { $(".steamConnectionCountdown").text("20s").show(); interval = setInterval(() => { $(".steamConnectionCountdown").text(count-- + "s"); }, 1000); } } function failedSteamConnection() { if (++steamFailedTimes > (itemNum >> 2)) { steamConnection = false; } } function updateProgressBar(ID) { let bar = $("#helper-progress-bar-" + ID); bar.width(++itemCount / itemNum * 100 + "%") if (itemCount >= itemNum) { itemCount = 0; $("#helper-loading-" + ID).remove(); bar.fadeOut(500); } } function paintingGradient(scale, target, position, template = '<strong class="f_16px f_Strong price_scale l_Right"></strong>') { let red = gradient(market_color_high[0], market_color_low[0], scale); let green = gradient(market_color_high[1], market_color_low[1], scale); let blue = gradient(market_color_high[2], market_color_low[2], scale); switch (position) { case 1: $(target).before($(template).css("color", "rgb(" + red + "," + green + "," + blue + ")").text(scale)); break; case 2: $(target).prepend($(template).css("color", "rgb(" + red + "," + green + "," + blue + ")").text(scale)); break; case 3: $(target).append($(template).css("color", "rgb(" + red + "," + green + "," + blue + ")").text(scale)); break; case 4: $(target).after($(template).css("color", "rgb(" + red + "," + green + "," + blue + ")").text(scale)); break; default: $(target).append($(template).css("color", "rgb(" + red + "," + green + "," + blue + ")").text(scale)); } } // 用来检测是否安装了其他buff插件,安装了就对布局做出相应调整防止排版混乱 function daemonThread() { let count = 30 let daemonThreadInterval = setInterval(() => { if (count--) { if ($(".afkout").length || $("#infolist").length) { $("#steam_order").remove(); $(".detail-summ>a").show(); $(".steam-link").hide(); clearInterval(daemonThreadInterval); } } else { clearInterval(daemonThreadInterval); } }, 100); } // json only function clone(obj) { return JSON.parse(JSON.stringify(obj)); } // 小数: "167639.87", "167639", ".87", "87" // 整数: "186267", "186267" function convertPrice(str) { str = str.replace(steamCurrency.strThousandsSeparator, ""); if (steamCurrency.strDecimalSymbol !== ".") { str = str.replace(steamCurrency.strDecimalSymbol, "."); } return str.match(/(\d+)(\.(\d{1,2}))?/); } function addCurrencySymbol(origin, currencyCode) { let currencyData = g_rgCurrencyData[currencyCode]; if (currencyData.bSymbolIsPrefix) { return currencyData.strSymbol + currencyData.strSymbolAndNumberSeparator + origin; } else { return origin + currencyData.strSymbolAndNumberSeparator + currencyData.strSymbol; } } // Foreign exchange to Chinese Yuan function FtoC(valueInCents) { if (steamCurrency.eCurrencyCode != 23 && (!helper_config.currencyEffectCalculate)) { return valueInCents * exchangeRate.FtoC; } return valueInCents; } // Chinese Yuan to Foreign exchange function CtoF(valueInCents) { if (steamCurrency.eCurrencyCode != 23 && (!helper_config.currencyEffectCalculate)) { return valueInCents * exchangeRate.CtoF; } return valueInCents; } function getScale(sellerPrice, buyerPriceInCents) { let amount = calculateFeeAmount(buyerPriceInCents); return (sellerPrice / v_currencyformat(amount.amount - amount.fees)).toFixed(2); } // symbolType 0, 1, 2 // eg. originPrice = 4907856 (ARS, value in cents) // 0: 49078.56 convert to float // 1: ARS$ 49078.56 float with symbol // 2: ARS$ 49.078,56 locale string function getWithoutFeePrice(originPriceInCents, symbolType = 0, currencyCode = steamCurrency.strCode) { let amount = calculateFeeAmount(originPriceInCents); switch (symbolType) { case 0: return v_currencyformat(amount.amount - amount.fees); case 1: return addCurrencySymbol(v_currencyformat(amount.amount - amount.fees), currencyCode); case 2: return v_currencyformat(amount.amount - amount.fees, currencyCode); } } function showMessage(title, msg, type = "info", time = 5000, position = 'top-right') { return $.toast({ text: msg, heading: title, icon: type, showHideTransition: 'fade', // fade, slide or plain allowToastClose: true, hideAfter: time, // false to make it sticky or number representing the miliseconds as time after which toast needs to be hidden stack: 5, // false if there should be only one toast at a time or a number representing the maximum number of toasts to be shown at a time position: position, // bottom-left or bottom-right or bottom-center or top-left or top-right or top-center or mid-center or an object representing the left, right, top, bottom values textAlign: 'left', // Text alignment i.e. left, right or center // loader: false, // Whether to show loader or not. True by default 没看懂loader什么意思¯\(°_o)/¯ // loaderBg: '#9EC600', // Background color of the toast loader // beforeShow: function () {}, // will be triggered before the toast is shown // afterShown: function () {}, // will be triggered after the toat has been shown // beforeHide: function () {}, // will be triggered before the toast gets hidden // afterHidden: function () {} // will be triggered after the toast has been hidden }); } function gradient(max, min, f) { if (f == "∞") { return max; } if (f >= helper_config.maxRange || f <= helper_config.minRange) { f = f >= helper_config.maxRange ? 1 : 0; } else { f = (f - helper_config.minRange) / (helper_config.maxRange - helper_config.minRange); } return max >= min ? f * (max - min) + min : (1 - f) * (min - max) + max; } function getGoodsId() { let r###lt = location.pathname.match(/\/goods\/(\d+)/); if (r###lt) return r###lt[1]; return null; } function escape(englishName) { return encodeURIComponent(englishName).replaceAll("(", "%28").replaceAll(")", "%29"); } // --------------------- copy from steam ----------------------- // 售价算税 function calculateFeeAmount(amount) { if (!g_rgWalletInfo['wallet_fee']) return 0; var publisherFee = (typeof g_rgWalletInfo['wallet_publisher_fee_percent_default'] == 'undefined') ? 0 : g_rgWalletInfo['wallet_publisher_fee_percent_default']; // Since CalculateFeeAmount has a Math.floor, we could be off a cent or two. Let's check: var iterations = 0; // shouldn't be needed, but included to be sure nothing unforseen causes us to get stuck var nEstimatedAmountOfWalletFundsReceivedByOtherParty = parseInt((amount - parseInt(g_rgWalletInfo['wallet_fee_base'])) / (parseFloat(g_rgWalletInfo['wallet_fee_percent']) + parseFloat(publisherFee) + 1)); var bEverUndershot = false; var fees = CalculateAmountToSendForDesiredReceivedAmount(nEstimatedAmountOfWalletFundsReceivedByOtherParty, publisherFee); while (fees.amount != amount && iterations < 10) { if (fees.amount > amount) { if (bEverUndershot) { fees = CalculateAmountToSendForDesiredReceivedAmount(nEstimatedAmountOfWalletFundsReceivedByOtherParty - 1, publisherFee); fees.steam_fee += (amount - fees.amount); fees.fees += (amount - fees.amount); fees.amount = amount; break; } else { nEstimatedAmountOfWalletFundsReceivedByOtherParty--; } } else { bEverUndershot = true; nEstimatedAmountOfWalletFundsReceivedByOtherParty++; } fees = CalculateAmountToSendForDesiredReceivedAmount(nEstimatedAmountOfWalletFundsReceivedByOtherParty, publisherFee); iterations++; } // fees.amount should equal the passed in amount return fees; function CalculateAmountToSendForDesiredReceivedAmount(receivedAmount, publisherFee) { if (!g_rgWalletInfo['wallet_fee']) { return receivedAmount; } publisherFee = (typeof publisherFee == 'undefined') ? 0 : publisherFee; var nSteamFee = parseInt(Math.floor(Math.max(receivedAmount * parseFloat(g_rgWalletInfo['wallet_fee_percent']), g_rgWalletInfo['wallet_fee_minimum']) + parseInt(g_rgWalletInfo['wallet_fee_base']))); var nPublisherFee = parseInt(Math.floor(publisherFee > 0 ? Math.max(receivedAmount * publisherFee, 1) : 0)); var nAmountToSend = receivedAmount + nSteamFee + nPublisherFee; return { steam_fee: nSteamFee, publisher_fee: nPublisherFee, fees: nSteamFee + nPublisherFee, amount: parseInt(nAmountToSend) }; } } // 小数点左移两位,并且加货币符号(可选) function v_currencyformat(valueInCents, currencyCode) { var currencyFormat = `${parseInt(valueInCents = Math.abs(+valueInCents / 100 || 0).toFixed(2), 10)}`; if (g_rgCurrencyData[currencyCode]) { var currencyData = g_rgCurrencyData[currencyCode]; const j = (currencyFormat.length > 3 ? currencyFormat.length % 3 : 0); const thousand_formatted = `${j ? currencyFormat.substr(0, j) + currencyData.strThousandsSeparator : ''}${currencyFormat.substr(j).replace(/(\d{3})(?=\d)/g, `$1${currencyData.strThousandsSeparator}`)}`; const decimal_formatted = `${currencyData.strDecimalSymbol}${Math.abs(valueInCents - currencyFormat).toFixed(2).slice(2)}`; const formatted = `${thousand_formatted}${currencyData.bWholeUnitsOnly ? decimal_formatted.replace(`${currencyData.strDecimalSymbol}00`, '') : decimal_formatted}`; var currencyReturn = currencyData.bSymbolIsPrefix ? `${currencyData.strSymbol}${currencyData.strSymbolAndNumberSeparator}${formatted}` : `${formatted}${currencyData.strSymbolAndNumberSeparator}${currencyData.strSymbol}`; if (currencyCode == 'USD') { return currencyReturn + ' USD'; } else if (currencyCode == 'EUR') { return currencyReturn.replace(',00', ',--'); } else { return currencyReturn; } } else { return valueInCents; } } // ---------------------- end ------------------------ function errorTranslator(err) { const msg = { "0": "访问steam失败,请检查网络连接性", "200": "无法处理结果,结果集无法使用", "400": "请求参数错误,服务器无法理解参数", "404": "页面不存在,无法找到请求的资源", "408": "访问steam超时,请检查网络连接性", "429": "请求次数过多,饮个茶再来吧", "500": "服务器内部错误,请稍后重试" }; const shortMsg = { "0": "无网络", "200": "请重试", "400": "参数错误", "404": "无内容", "408": "超时", "429": "频繁", "500": "请重试" }; switch (err.status) { case 0: failedSteamConnection(); break; case 429: steamConnection = true; break; } err.statusText = msg[err.status]; err.statusTextShort = shortMsg[err.status]; return err; } function updateRate(force, toast) { if ((!force) && exchangeRate && exchangeRate.time_next_update_unix > Date.now()) { return; } if ((!steamConnection) && steamConnection != undefined) { toast && toast.reset(); showMessage("无网络时无法获取汇率", "没有设置被改变", 'warning'); return; } GM_xmlhttpRequest({ // 10000元锚点 url: `https://steamcommunity.com/market/listings/730/Souvenir%20Sawed-Off%20|%20Snake%20Camo%20(Well-Worn)/render/?query=&start=40&count=100¤cy=${g_rgCurrencyData[helper_config.steamCurrency].eCurrencyCode}`, // 热门锚点 // url: `https://steamcommunity.com/market/listings/730/AK-47%20%7C%20Asiimov%20%28Field-Tested%29/render/?start=0&count=50¤cy=${g_rgCurrencyData[helper_config.steamCurrency].eCurrencyCode}`, url: `https://steamcommunity.com/market/listings/730/AK-47%20%7C%20Redline%20%28Field-Tested%29/render/?start=0&count=50¤cy=${g_rgCurrencyData[helper_config.steamCurrency].eCurrencyCode}`, method: "get", timeout: ajaxTimeout, onload: function (response) { toast && toast.reset(); let data = response.status == 200 ? JSON.parse(response.responseText) : {}; // if (data.success && data.listinginfo["3296062994072312107"]) { // if (data.listinginfo["3296062994072312107"].converted_currencyid % 2000 != g_rgCurrencyData[helper_config.steamCurrency].eCurrencyCode) { // return; // 对结果返回前的多次操作进行屏蔽,只取最后一次的结果 // } // let timeUnix = Date.now(); // exchangeRate = { // FtoC: (data.listinginfo["3296062994072312107"].price / data.listinginfo["3296062994072312107"].converted_price).toFixed(6), // CtoF: (data.listinginfo["3296062994072312107"].converted_price / data.listinginfo["3296062994072312107"].price).toFixed(6), // currencyCode: g_rgCurrencyData[helper_config.steamCurrency].strCode, // time_next_update_unix: timeUnix + 10800000, // time_update_unix: timeUnix // } // GM_setValue("exchangeRate", exchangeRate); // GM_setValue("helper_config", helper_config); // showMessage("获取汇率成功", `已经同步${helper_config.steamCurrency}的最新汇率`, "success"); // return; // } // in case of emergency // 找到人民币上架的记录,直接通过原货币和目标货币获取汇率 if (data.success) { for (let key in data.listinginfo) { if (data.listinginfo[key].currencyid == 2023) { if (data.listinginfo[key].converted_currencyid % 2000 != g_rgCurrencyData[helper_config.steamCurrency].eCurrencyCode) {return;} let timeUnix = Date.now(); exchangeRate = { FtoC: (data.listinginfo[key].price / data.listinginfo[key].converted_price).toFixed(6), CtoF: (data.listinginfo[key].converted_price / data.listinginfo[key].price).toFixed(6), currencyCode: g_rgCurrencyData[helper_config.steamCurrency].strCode, time_next_update_unix: timeUnix + 10800000, time_update_unix: timeUnix } GM_setValue("exchangeRate", exchangeRate); GM_setValue("helper_config", helper_config); showMessage("获取汇率成功", `已经同步${helper_config.steamCurrency}的最新汇率`, "success"); return; } } } console.log("获取汇率时错误:", response); showMessage("获取汇率时错误", errorTranslator(response).statusText, 'error'); }, onerror: function (err) { console.log("获取汇率失败:", err); showMessage("获取汇率失败", errorTranslator(err).statusText, 'error'); }, ontimeout: function () { failedSteamConnection(); let err = { "status": 408, "statusText": "连接steam超时,请检查steam市场连接性" }; console.log("获取汇率超时:", err); showMessage("获取汇率超时", err.statusText, 'error'); } }); } function getItemId(buff_item_id, steamLink) { return new Promise(function (resolve, reject) { let steam_item_id = GM_getValue(buff_item_id); if (steam_item_id) { resolve(steam_item_id); return; } else if (steam_item_id === null) { reject({ status: 404, statusText: "物品不在货架上" }); } GM_xmlhttpRequest({ url: steamLink, timeout: ajaxTimeout, method: "get", onload: function (res) { if (res.status == 200) { let html = res.responseText; // 页面很大 try { steam_item_id = /Market_LoadOrderSpread\(\s?(\d+)\s?\)/.exec(html)[1]; } catch (error) { steamConnection = true; GM_setValue(buff_item_id, null); res.status = 404; res.statusText = "物品不在货架上"; console.log("获取itemID状态异常:", res); reject(res); return; } GM_setValue(buff_item_id, steam_item_id); resolve(steam_item_id); } else { console.log("获取itemID状态异常:", res); reject(errorTranslator(res)); } }, onerror: function (err) { console.log("获取itemID错误:", err); reject(errorTranslator(err)); }, ontimeout: function () { failedSteamConnection(); let err = { "status": 408, "statusText": "连接steam超时,请检查steam市场连接性" }; console.log("获取itemID超时:", err); reject(err); } }); }); } function getSteamOrderList(buff_item_id, steamLink) { return new Promise(function (resolve, reject) { if ((!steamConnection) && steamConnection != undefined) { let err = { "status": 408, "statusText": "无法访问steam" }; resolve(err); return; } getItemId(buff_item_id, steamLink).then(function onFulfilled(steam_item_id) { GM_xmlhttpRequest({ url: `https://steamcommunity.com/market/itemordershistogram?country=CN&language=schinese¤cy=${steamCurrency.eCurrencyCode}&item_nameid=${steam_item_id}&two_factor=0`, timeout: ajaxTimeout, headers: { "referer": steamLink, "X-Requested-With": "XMLHttpRequest", "Host": "steamcommunity.com", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36 Edg/107.0.1418.35" }, method: "get", onload: function (res) { if (res.status == 200) { steamConnection = true; resolve(JSON.parse(res.responseText)); return; } console.log("访问steamorder状态异常:", res); resolve(errorTranslator(res)); }, onerror: function (err) { console.log("访问steamorder列表出错:", err); resolve(errorTranslator(err)); }, ontimeout: function () { failedSteamConnection(); let err = { "status": 408, "statusText": "连接steam超时,请检查steam市场连接性" }; console.log("访问steamorder列表超时:", err); resolve(err); } }); }).catch(function onRejected(err) { resolve(err); }); }); } function getSteamSoldNumber(app_id, hash_name) { return new Promise(function (resolve) { if ((!steamConnection) && steamConnection != undefined) { let err = { "status": 408, "statusText": "无法访问steam" }; resolve(err); return; } GM_xmlhttpRequest({ url: `https://steamcommunity.com/market/priceoverview/?appid=${app_id}¤cy=${steamCurrency.eCurrencyCode}&market_hash_name=${hash_name}`, timeout: ajaxTimeout, headers: { "referer": `https://steamcommunity.com/market/listings/${app_id}/${hash_name}`, "X-Requested-With": "XMLHttpRequest", "Host": "steamcommunity.com", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36 Edg/107.0.1418.35" }, method: "get", onload: function (res) { if (res.status == 200) { steamConnection = true; let json = JSON.parse(res.responseText); if (json.success) { resolve(json); return; } } console.log("访问steam销售数量状态异常:", res); resolve(errorTranslator(res)); }, onerror: function (err) { console.log("访问steam销售数量出错:", err); resolve(errorTranslator(err)); }, ontimeout: function () { failedSteamConnection(); let err = { "status": 408, "statusText": "连接steam超时,请检查steam市场连接性" }; console.log("访问steam销售数量超时:", err); resolve(err); } }); }); } })();