SteamTools, List up duplicate card sets

Output markdown to trade for 1:1 card sets on steamtrades.com

目前為 2018-09-07 提交的版本,檢視 最新版本

// ==UserScript==
// @name         SteamTools, List up duplicate card sets
// @namespace    http://tampermonkey.net/
// @version      0.12
// @description  Output markdown to trade for 1:1 card sets on steamtrades.com
// @author       You
// @match        https://steam.tools/cards/*
// @require      http://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js
// @grant        GM.xmlHttpRequest
// @runat        document-end
// @nowrap
// ==/UserScript==

(function() {
    'use strict';

    $(function () {/*
    <div>
    <h3>Duplicate card sets</h3>
    <textarea id="haveOutput" readonly />
    <h3>Aready lvl 5 / Enough to create lvl 5 badge</h3>
    <textarea id="enoughOutput" readonly />
    <h3>Log</h3>
    <textarea style="max-height: 150px;" id="logOutput" readonly></textarea>
    <p>
    <button id="checkDuplicateButton">Check duplicate sets</button>
    <button id="outputLastButton">Output latest result</button>
    </p>
    </div>
    */}.toString().match(/[^]*\/\*([^]*)\*\/\}$/)[1]).appendTo("#container");

    var $haveOutput = $("#haveOutput");
    var $enoughOutput = $("#enoughOutput");
    var $logOutput = $("#logOutput");

    var $button = $("#checkDuplicateButton").click(main);

    $("#outputLastButton").click(function () {
        $haveOutput.text(localStorage["lastHaveOutput"]);
        $enoughOutput.text(localStorage["lastEnoughOutput"]);
    });

    function logging (log) {
        console.log("Logging: " + log);
        $logOutput.text($logOutput.text() + log + "\n");
    }

    function sleepAsyc (ms) {
        return new Promise((resolve, reject) => { setTimeout(resolve, ms); });
    }

    async function main () {
        $button.text("checking");
        $button[0].disabled = "true";

        var headerIndex = $("#set_table_wrapper .dataTables_scrollHead th").map(function () {
            return $(this).text();
        }).toArray();

        var sets = {};

        $("#set_table tbody tr").each(function () {
            var $td = $(this).find("td");
            var title = $($td[headerIndex.indexOf("Game")]).text();
            var links = {};
            $($td[headerIndex.indexOf("Links")]).find("a").each(function () {
                links[$(this).text().substr(1, 1)] = $(this).attr("href");
            });
            var owned = parseInt($($td[headerIndex.indexOf("# Owned")]).text());
            var cards = parseInt($($td[headerIndex.indexOf("# Cards")]).text());
            var unique = parseInt($($td[headerIndex.indexOf("# Unique")]).text());
            var level = parseInt($($td[headerIndex.indexOf("Badge Lvl")]).text());
            // var setPrice = parseInt($($td[headerIndex.indexOf("Set Price")]).text());
            sets[title] = {
                title: title,
                links: links,
                owned: owned,
                cards: cards,
                level: level,
                unique: unique,
                // setPrice: setPrice,
            };
        });

        console.log(sets);

        var enough = [];
        for (var title in sets) {
            var s = sets[title];

            if (s.level == 5) {
                s.enough = "lvl5";
                enough.push(s);
            } else if (s.level * s.cards + s.owned >= s.cards * 5) {
                s.enough = "enough";
                enough.push(s);
            }
        }
        console.log(enough);

        var have = [];

        var targets = [];
        for (var title in sets) {
            var s = sets[title];
            if (s.cards == s.unique &&
                ((s.level == 5 && s.owned / s.cards >= 2) || (s.level < 5 && s.owned - s.level * s.cards / s.cards >= 4))
               ) {
                targets.push(s);
            }
        }
        for (var i = 0; i < targets.length; i++) {
            var s = targets[i];
            await new Promise((resolve, reject) => {
                logging("Checking duplicates (" + i + "/" + targets.length + ") : " + s.title);
                GM.xmlHttpRequest({
                    method: "GET",
                    url: s.links.B,
                    onload: function (xhr) {
                        resolve(xhr);
                    },
                    onerror: function () {
                        reject();
                    }
                });
            })
                .then(xhr => {
                var min = Infinity;
                var $html = $(xhr.responseText);
                $html.find(".badge_card_set_card").each(function (i) {
                    var qty = 0;
                    var $qty = $(this).find(".badge_card_set_text_qty");
                    if ($qty[0]) {
                        min = Math.min(parseInt($qty.text().match(/\d+/)), min);
                    } else {
                        min = 0;
                    }
                });

                if (min > 0 && 5 - s.level > min) {
                    s.duplicates = min;
                    have.push(s);
                }

                logging(min + " duplicate");
            })
                .catch(()=> console.log("faild"));

            await sleepAsyc(3000);
        }
        console.log(have);

        var output = "## Blacklist\n";
        for (var i = 0; i < enough.length; i++) {
            var s = enough[i];
            output += "- [{title}]({url}) *{enough}*\n"
                .replace("{title}", s.title)
                .replace("{url}", s.links.B)
                .replace("{enough}", s.enough);
        }
        $enoughOutput.text(output);
        localStorage["lastEnoughOutput"] = output;

        output = "|Available card sets|Quantity|Cards in set|\n";
        output += "|:-|: |: |\n"
        for (var i = 0; i < have.length; i++) {
            var s = have[i];
            output += "|[{title}]({url})|x{duplicates}|{cards}|\n"
                .replace("{title}", s.title)
                .replace("{url}", s.links.B)
                .replace("{duplicates}", s.duplicates)
                .replace("{cards}", s.cards);
        }
        $haveOutput.text(output);
        localStorage["lastHaveOutput"] = output;

        $button.text("Check duplicate sets");
        $button[0].disabled = "";
    }

    // Your code here...
    // .toString().match(/[^]*\/\*([^]*)\*\/\}$/)[1];
})();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址