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.12
  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["lastEnoughOutput"]);
  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 unique = parseInt($($td[headerIndex.indexOf("# Unique")]).text());
  72. var level = parseInt($($td[headerIndex.indexOf("Badge Lvl")]).text());
  73. // var setPrice = parseInt($($td[headerIndex.indexOf("Set Price")]).text());
  74. sets[title] = {
  75. title: title,
  76. links: links,
  77. owned: owned,
  78. cards: cards,
  79. level: level,
  80. unique: unique,
  81. // setPrice: setPrice,
  82. };
  83. });
  84.  
  85. console.log(sets);
  86.  
  87. var enough = [];
  88. for (var title in sets) {
  89. var s = sets[title];
  90.  
  91. if (s.level == 5) {
  92. s.enough = "lvl5";
  93. enough.push(s);
  94. } else if (s.level * s.cards + s.owned >= s.cards * 5) {
  95. s.enough = "enough";
  96. enough.push(s);
  97. }
  98. }
  99. console.log(enough);
  100.  
  101. var have = [];
  102.  
  103. var targets = [];
  104. for (var title in sets) {
  105. var s = sets[title];
  106. if (s.cards == s.unique &&
  107. ((s.level == 5 && s.owned / s.cards >= 2) || (s.level < 5 && s.owned - s.level * s.cards / s.cards >= 4))
  108. ) {
  109. targets.push(s);
  110. }
  111. }
  112. for (var i = 0; i < targets.length; i++) {
  113. var s = targets[i];
  114. await new Promise((resolve, reject) => {
  115. logging("Checking duplicates (" + i + "/" + targets.length + ") : " + s.title);
  116. GM.xmlHttpRequest({
  117. method: "GET",
  118. url: s.links.B,
  119. onload: function (xhr) {
  120. resolve(xhr);
  121. },
  122. onerror: function () {
  123. reject();
  124. }
  125. });
  126. })
  127. .then(xhr => {
  128. var min = Infinity;
  129. var $html = $(xhr.responseText);
  130. $html.find(".badge_card_set_card").each(function (i) {
  131. var qty = 0;
  132. var $qty = $(this).find(".badge_card_set_text_qty");
  133. if ($qty[0]) {
  134. min = Math.min(parseInt($qty.text().match(/\d+/)), min);
  135. } else {
  136. min = 0;
  137. }
  138. });
  139.  
  140. if (min > 0 && 5 - s.level > min) {
  141. s.duplicates = min;
  142. have.push(s);
  143. }
  144.  
  145. logging(min + " duplicate");
  146. })
  147. .catch(()=> console.log("faild"));
  148.  
  149. await sleepAsyc(3000);
  150. }
  151. console.log(have);
  152.  
  153. var output = "## Blacklist\n";
  154. for (var i = 0; i < enough.length; i++) {
  155. var s = enough[i];
  156. output += "- [{title}]({url}) *{enough}*\n"
  157. .replace("{title}", s.title)
  158. .replace("{url}", s.links.B)
  159. .replace("{enough}", s.enough);
  160. }
  161. $enoughOutput.text(output);
  162. localStorage["lastEnoughOutput"] = output;
  163.  
  164. output = "|Available card sets|Quantity|Cards in set|\n";
  165. output += "|:-|: |: |\n"
  166. for (var i = 0; i < have.length; i++) {
  167. var s = have[i];
  168. output += "|[{title}]({url})|x{duplicates}|{cards}|\n"
  169. .replace("{title}", s.title)
  170. .replace("{url}", s.links.B)
  171. .replace("{duplicates}", s.duplicates)
  172. .replace("{cards}", s.cards);
  173. }
  174. $haveOutput.text(output);
  175. localStorage["lastHaveOutput"] = output;
  176.  
  177. $button.text("Check duplicate sets");
  178. $button[0].disabled = "";
  179. }
  180.  
  181. // Your code here...
  182. // .toString().match(/[^]*\/\*([^]*)\*\/\}$/)[1];
  183. })();