SteamTools, List up duplicate card sets

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

当前为 2018-09-07 提交的版本,查看 最新版本

  1. // ==UserScript==
  2. // @name SteamTools, List up duplicate card sets
  3. // @namespace http://tampermonkey.net/
  4. // @version 0.1
  5. // @description Output markdown to trade for 1:1 card sets on steamtrades.com
  6. // @author You
  7. // @match https://steam.tools/cards/*
  8. // @require http://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js
  9. // @grant GM.xmlHttpRequest
  10. // @runat document-end
  11. // @nowrap
  12. // ==/UserScript==
  13.  
  14. (function() {
  15. 'use strict';
  16.  
  17. $(function () {/*
  18. <div>
  19. <h3>Duplicate card sets</h3>
  20. <textarea id="haveOutput" readonly />
  21. <h3>Aready lvl 5 / Enough to create lvl 5 badge</h3>
  22. <textarea id="enoughOutput" readonly />
  23. <h3>Log</h3>
  24. <textarea style="max-height: 150px;" id="logOutput" readonly></textarea>
  25. <p>
  26. <button id="checkDuplicateButton">Check duplicate sets</button>
  27. <button id="outputLastButton">Output latest result</button>
  28. </p>
  29. </div>
  30. */}.toString().match(/[^]*\/\*([^]*)\*\/\}$/)[1]).appendTo("#container");
  31.  
  32. var $haveOutput = $("#haveOutput");
  33. var $enoughOutput = $("#enoughOutput");
  34. var $logOutput = $("#logOutput");
  35.  
  36. var $button = $("#checkDuplicateButton").click(main);
  37.  
  38. $("#outputLastButton").click(function () {
  39. $haveOutput.text(localStorage["lastHaveOutput"]);
  40. $enoughOutput.text(localStorage["lasEnoughOutput"]);
  41. });
  42.  
  43. function logging (log) {
  44. console.log("Logging: " + log);
  45. $logOutput.text($logOutput.text() + log + "\n");
  46. }
  47.  
  48. function sleepAsyc (ms) {
  49. return new Promise((resolve, reject) => { setTimeout(resolve, ms); });
  50. }
  51.  
  52. async function main () {
  53. $button.text("checking");
  54. $button[0].disabled = "true";
  55.  
  56. var headerIndex = $("#set_table_wrapper .dataTables_scrollHead th").map(function () {
  57. return $(this).text();
  58. }).toArray();
  59.  
  60. var sets = {};
  61.  
  62. $("#set_table tbody tr").each(function () {
  63. var $td = $(this).find("td");
  64. var title = $($td[headerIndex.indexOf("Game")]).text();
  65. var links = {};
  66. $($td[headerIndex.indexOf("Links")]).find("a").each(function () {
  67. links[$(this).text().substr(1, 1)] = $(this).attr("href");
  68. });
  69. var owned = parseInt($($td[headerIndex.indexOf("# Owned")]).text());
  70. var cards = parseInt($($td[headerIndex.indexOf("# Cards")]).text());
  71. var level = parseInt($($td[headerIndex.indexOf("Badge Lvl")]).text());
  72. // var setPrice = parseInt($($td[headerIndex.indexOf("Set Price")]).text());
  73. sets[title] = {
  74. title: title,
  75. links: links,
  76. owned: owned,
  77. cards: cards,
  78. level: level,
  79. // setPrice: setPrice,
  80. };
  81. });
  82.  
  83. console.log(sets);
  84.  
  85. var enough = [];
  86. for (var title in sets) {
  87. var s = sets[title];
  88.  
  89. if (s.level == 5) {
  90. s.enough = "lvl5";
  91. enough.push(s);
  92. } else if (s.level * s.cards + s.owned >= s.cards * 5) {
  93. s.enough = "enough";
  94. enough.push(s);
  95. }
  96. }
  97. console.log(enough);
  98.  
  99. var have = [];
  100.  
  101. var targets = [];
  102. for (var title in sets) {
  103. var s = sets[title];
  104. if ((s.level == 5 && s.owned / s.cards >= 2) || (s.level < 5 && s.owned - s.level * s.cards / s.cards >= 4)) {
  105. targets.push(s);
  106. }
  107. }
  108. for (var i = 0; i < targets.length; i++) {
  109. var s = targets[i];
  110. await new Promise((resolve, reject) => {
  111. logging("Checking duplicates (" + i + "/" + targets.length + ") : " + s.title);
  112. GM.xmlHttpRequest({
  113. method: "GET",
  114. url: s.links.B,
  115. onload: function (xhr) {
  116. resolve(xhr);
  117. },
  118. onerror: function () {
  119. reject();
  120. }
  121. });
  122. })
  123. .then(xhr => {
  124. var min = Infinity;
  125. var $html = $(xhr.responseText);
  126. $html.find(".badge_card_set_card").each(function (i) {
  127. var qty = 0;
  128. var $qty = $(this).find(".badge_card_set_text_qty");
  129. if ($qty[0]) {
  130. min = Math.min(parseInt($qty.text().match(/\d+/)), min);
  131. } else {
  132. min = 0;
  133. }
  134. });
  135.  
  136. if (min > 0) {
  137. s.duplicates = min;
  138. have.push(s);
  139. }
  140.  
  141. logging(min + " duplicate");
  142. })
  143. .catch(()=> console.log("faild"));
  144.  
  145. await sleepAsyc(3000);
  146. }
  147. console.log(have);
  148.  
  149. var output = "## Blacklist\n";
  150. for (var i = 0; i < enough.length; i++) {
  151. var s = enough[i];
  152. output += "- [{title}]({url}) *{enough}*\n"
  153. .replace("{title}", s.title)
  154. .replace("{url}", s.links.B)
  155. .replace("{enough}", s.enough);
  156. }
  157. $enoughOutput.text(output);
  158. localStorage["lastEnoughOutput"] = output;
  159.  
  160. output = "|Available card sets|Quantity|Cards in set|\n";
  161. output = "|:-|: |: |\n"
  162. for (var i = 0; i < have.length; i++) {
  163. var s = have[i];
  164. output += "|[{title}]({url})|x{duplicates}|{cards}|\n"
  165. .replace("{title}", s.title)
  166. .replace("{url}", s.links.B)
  167. .replace("{duplicates}", s.duplicates)
  168. .replace("{cards}", s.cards);
  169. }
  170. $haveOutput.text(output);
  171. localStorage["lastHaveOutput"] = output;
  172.  
  173. $button.text("Check duplicate sets");
  174. $button[0].disabled = "";
  175. }
  176.  
  177. // Your code here...
  178. // .toString().match(/[^]*\/\*([^]*)\*\/\}$/)[1];
  179. })();

QingJ © 2025

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