您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
try to take over the world!
当前为
// ==UserScript== // @name Steam, Card sets viewer // @namespace http://tampermonkey.net/ // @version 1.0.1 // @description try to take over the world! // @author You // @require http://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js // @match https://steamcommunity.com/tradeoffer/* // @grant GM.xmlHttpRequest // @runat document-end // @nowrap // ==/UserScript== (function() { 'use strict'; var $ = jQuery.noConflict(); var getBadgeInfoUrl = "https://www.steamcardexchange.net/api/request.php?GetBadgePrices_Member"; var CacheKey = "BadgeInformatinCache"; var MaxBadgeLevel = 5; function getSteamInventory () { var inv = g_ActiveInventory; if (!inv) throw "Error: Not found inventory"; if (!inv.initialized) throw "Error: Inventory is unloaded"; if (inv.appid != "753") throw "Error: Inventory isn't Steam Inventory"; if (!inv.rgInventory) throw "Error: Inventory is unloaded"; console.log("Inventory loaded"); return inv; } function main(inventory) { var sets = {}; var isSelfInventory = $("#inventory_select_your_inventory").hasClass("active"); var isExtraOnly = $("#DisplayExtraOnlyCheckbox")[0].checked; var rgInventory = inventory.rgInventory; function onLoadBadgeInformation(xhr, cache) { var badges = cache || JSON.parse(xhr.responseText); if (!cache) { localStorage[CacheKey] = xhr.responseText; } console.log(badges); var fee, set; var data = badges.data; for (var i = 0; i < data.length; i++) { set = sets[data[i][0][0]]; if (!set) continue; set.title = data[i][0][1]; set.cardsInSet = data[i][1]; set.yourLevel = parseInt(data[i][3]); set.fullSetQuantity = 0; set.hasFullSet = false; } for (fee in sets) { set = sets[fee]; var totalCards = 0; var cardsCount = 0; var minQty = Number.MAX_VALUE; for (var hash in set.items) { var item = set.items[hash]; minQty = Math.min(minQty, item.quantity); cardsCount++; totalCards += item.quantity; } set.totalCards = totalCards; if (set.cardsInSet > 0 && set.cardsInSet == cardsCount) { set.hasFullSet = true; set.fullSetQuantity = minQty; if (isSelfInventory) { var extraQuantity = set.fullSetQuantity - (MaxBadgeLevel - set.yourLevel); set.extraQuantity = extraQuantity > 0 ? extraQuantity : 0; set.necessaryQuantity = 0; } else { set.necessaryQuantity = Math.min(MaxBadgeLevel - set.yourLevel, set.fullSetQuantity); set.extraQuantity = 0; } } else { set.hasFullSet = false; set.fullSetQuantity = 0; set.extraQuantity = 0; set.necessaryQuantity = 0; } } console.log(sets); var textBuilder = ""; var markdownBuilder = ""; var htmlBuilder = ""; for (fee in sets) { set = sets[fee]; if (!set.hasFullSet) continue; if (isSelfInventory && isExtraOnly && set.extraQuantity <= 0) continue; if (!isSelfInventory && isExtraOnly && set.necessaryQuantity <= 0) continue; var qty = set.fullSetQuantity; if (isExtraOnly) { qty = isSelfInventory ? set.extraQuantity : set.necessaryQuantity; } var setUrl = inventory.owner.strProfileURL + "/gamecards/" + set.appId + "/"; textBuilder += qty + "x " + set.title + "\n"; markdownBuilder += "{qty}x [{title}]({url}) ({cards})\n" .replace("{qty}", qty) .replace("{title}", set.title) .replace("{url}", setUrl) .replace("{cards}", set.cardsInSet); htmlBuilder += "<div>{qty}x <a href='{url}' target='_blank'>{title}</a> <button data-fee='{fee}' class='AddSetToTradeButton'>Add to trade</button></div>" .replace("{qty}", qty) .replace("{title}", set.title) .replace("{url}", setUrl) .replace("{fee}", fee); } $("<div />") .append("<div><a class='SwitchSetList'>Text</a><a class='SwitchSetList'>Markdown</a><a class='SwitchSetList'>Html</a><a class='CloseSetList'>Close</a></div>") .append($("<pre />").addClass("SetListText").text(textBuilder)) .append($("<pre />").addClass("SetListMarkdown").text(markdownBuilder)) .append($("<div />").addClass("SetListHtml").append(htmlBuilder)) .attr("id", "SetListContainer") .addClass("VisibleText") .appendTo("body"); $(".SwitchSetList").click(function (ev) { ev.preventDefault(); ev.stopPropagation(); $("#SetListContainer") .removeClass("VisibleText") .removeClass("VisibleMarkdown") .removeClass("VisibleHtml") .addClass("Visible" + $(this).text()); }); $(".CloseSetList").click(function (ev){ ev.preventDefault(); ev.stopPropagation(); $("#SetListContainer").remove(); }); $(".AddSetToTradeButton").click(function (ev) { ev.preventDefault(); ev.stopPropagation(); var fee = $(this).attr("data-fee"); var set = sets[fee]; var targets = []; for (var hash in set.items) { var cards = set.items[hash].instances; for (var i = 0; i < cards.length; i++) { var $c = $((isSelfInventory ? "#your_slots" : "#their_slots") + " #item753_6_" + cards[i]); if ($c.length == 0) { targets.push(cards[i]); break; } } if (i == cards.length) { alert("Cards is not enough to add complete set"); return; } } for (var n = 0; n < targets.length; n++) { MoveItemToTrade($("#item753_6_" + targets[n])[0]); } }); } function onErrorBadgeInformation(xhr) { console.log("Couldn't get badge infomation. You need to log in to steamcardexchange.com"); } for (var instanceid in rgInventory) { var item = rgInventory[instanceid]; if (!sets[item.market_fee_app]) { sets[item.market_fee_app] = { appId: item.market_fee_app, cardsInSet: -1, items: {} }; } if (!sets[item.market_fee_app].items[item.market_hash_name]) { sets[item.market_fee_app].items[item.market_hash_name] = { hash: item.market_hash_name, quantity: 1, instances: [instanceid], }; } else { sets[item.market_fee_app].items[item.market_hash_name].quantity++; sets[item.market_fee_app].items[item.market_hash_name].instances.push(instanceid); } } console.log(sets); try { var cache = JSON.parse(localStorage[CacheKey]); } catch (error) { cache = null; } if (cache) { onLoadBadgeInformation(null, cache); } else { GM.xmlHttpRequest({ url: getBadgeInfoUrl, method: "GET", onerror: onErrorBadgeInformation, onload: onLoadBadgeInformation }); } } var $controllerContainer = $("<div />").appendTo("#inventory_box");; var $fireButton = $("<button />") .append("<span>List card sets</span>") .addClass("btn_darkblue_white_innerfade btn_small new_trade_offer_btn") .css({ margin: "10px 12px" }) .click(function () { try { var inv = getSteamInventory(); main(inv); } catch (error) { alert(error); } }) .appendTo($controllerContainer); var $clearCacheButton = $("<button />") .append("<span>Clear badge cache</span>") .addClass("btn_darkblue_white_innerfade btn_small new_trade_offer_btn") .css({ margin: "10px 12px" }) .click(function () { delete localStorage[CacheKey]; }) .appendTo($controllerContainer); var $checkboxExtra = $("<input />").attr({ type: "checkbox", id: "DisplayExtraOnlyCheckbox" }).appendTo($controllerContainer); $("<label />").attr({ for: "DisplayExtraOnlyCheckbox" }).text("Extra/Necessary only").appendTo($controllerContainer); $("<style />").text(function () {/* #SetListContainer .SetListText, #SetListContainer .SetListMarkdown, #SetListContainer .SetListHtml { display: none; } #SetListContainer.VisibleText .SetListText, #SetListContainer.VisibleMarkdown .SetListMarkdown, #SetListContainer.VisibleHtml .SetListHtml { display: block; } #SetListContainer { position: fixed; z-index: 10000; top: 0; right: 0; bottom: 0; left: 0; background: #000000dd; overflow-y: scroll; padding: 20px; } .SwitchSetList { margin-right: 5px; } */}.toString().match(/[^]*\/\*([^]*)\*\/\}$/)[1]).appendTo("head"); // Your code here... // .toString().match(/[^]*\/\*([^]*)\*\/\}$/)[1]; })();