Joker0day

Steam AutoCraft

Dec 23rd, 2017
189
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 21.37 KB | None | 0 0
  1. // ==UserScript==
  2. // @name Steam-AutoCraft
  3. // @version 1.6.1
  4. // @description AutoCraft Steam Community Badges
  5. // @author 10101000
  6. // @include /^https?:\/\/steamcommunity\.com\/+(id\/+[A-Za-z0-9$-_.+!*'(),]+|profiles\/+[0-9]+)\/+(badges\/?|gamecards\/+[0-9]+\/?).*$/
  7. // @copyright 2016 10101000
  8. // @grant none
  9. // ==/UserScript==
  10.  
  11. // Vars
  12. var badgesPageURL = '/badges/';
  13. var badgeCraftLimit = '';
  14. var canCraftBadge = 0;
  15. var craftRefreshTimeoutmsDef = 2000;
  16. var craftRefreshTimeoutms = craftRefreshTimeoutmsDef;
  17. var gamecardHref = '';
  18. var gamecardHrefLinks = '';
  19. var gameIdBlackList = '';
  20. var isBadgesPage = 0;
  21. var isGameCardsPage = 0;
  22. var pageRefreshTimeoutmsDef = 10000;
  23. var pageRefreshTimeoutms = pageRefreshTimeoutmsDef;
  24. var redirect = 0;
  25. var skipCraft = 0;
  26. var steamAutoCraftVersion = '1.6.1';
  27.  
  28. // Badges
  29. var badgeLinks = jQuery('.badge_details_set_favorite');
  30. // Badges progress
  31. var badgeProgressTasks = jQuery('.badge_progress_tasks');
  32. // Gamecards
  33. var invLinks = jQuery('.gamecards_inventorylink');
  34. // Gamecard progress
  35. var badgeProgress = jQuery('.gamecard_badge_progress');
  36.  
  37. // Run
  38. jQuery(document).ready(function(){
  39. // Check settings
  40. checkSettings();
  41.  
  42. // Determine current page
  43. if (invLinks.length >= 1) {
  44. isGameCardsPage = 1;
  45. } else if ((badgeLinks.length >= 1) && (invLinks.length <= 0)) {
  46. isBadgesPage = 1;
  47. }
  48.  
  49. // Check for badges to craft
  50. if (jQuery('.badge_craft_button').length >= 1){
  51. if ((badgeProgressTasks.length >= 1) || (badgeProgress.length >= 1)){
  52. canCraftBadge = 1;
  53. }
  54. }
  55.  
  56. // Badge page logic
  57. if (isBadgesPage === 1) {
  58. window.sessionStorage.badgesPageURL = window.location.href;
  59. if (window.sessionStorage.craftRecursive) {
  60. if (canCraftBadge === 0) {
  61. delete window.sessionStorage.craftRecursive;
  62. }
  63. }
  64. }
  65.  
  66. // Gamecard page logic
  67. if (isGameCardsPage === 1) {
  68. if ((canCraftBadge === 0) && (window.sessionStorage.craftRecursive)) {
  69. delete window.sessionStorage.autoCraftState;
  70.  
  71. if(window.localStorage.badgeCraftLimit) {
  72. if(!window.sessionStorage.craftCount) { window.sessionStorage.craftCount = 0; }
  73. window.sessionStorage.craftCount = +window.sessionStorage.craftCount + 1;
  74. }
  75.  
  76. if(window.sessionStorage.badgesPageURL) {
  77. badgesPageURL = window.sessionStorage.badgesPageURL;
  78. }
  79. delete window.sessionStorage.badgesPageURL;
  80.  
  81. // If all badges have been crafted, load badges page
  82. window.location.href = badgesPageURL;
  83. }
  84. }
  85.  
  86. // Detect conflict with userscript
  87. if (jQuery('#autocraft').length >= 1) {
  88. var steamAutoCraftConflictError = 'Conflict detected, please remove or disable either the Steam-AutoCraft extension or the userscript.';
  89. alert(steamAutoCraftConflictError);
  90. throw new Error(steamAutoCraftConflictError);
  91. }
  92.  
  93. // Check blacklist and add button
  94. jQuery.when(checkBlacklist()).done( function() {
  95. addButton();
  96. });
  97.  
  98. // Disable reset button when applicable
  99. if ((pageRefreshTimeoutms === pageRefreshTimeoutmsDef) && (craftRefreshTimeoutms === craftRefreshTimeoutmsDef) && (!gameIdBlackList)) {
  100. jQuery('#autocraft_button_reset').addClass('btn_disabled');
  101. jQuery('#autocraft_button_reset').prop('disabled',true);
  102. } else {
  103. jQuery('#autocraft_button_reset').removeClass('btn_disabled');
  104. }
  105.  
  106. // Start autoCraft
  107. if ((canCraftBadge === 1) && ((window.sessionStorage.autoCraftState) || (window.sessionStorage.craftRecursive))) {
  108.  
  109. if ((window.localStorage.badgeCraftLimit) && (window.sessionStorage.craftCount)) {
  110. if (+window.sessionStorage.craftCount >= +window.localStorage.badgeCraftLimit) {
  111. delete window.sessionStorage.craftRecursive;
  112. delete window.sessionStorage.craftCount;
  113. redirect = 0;
  114. skipCraft = 1;
  115. }
  116. }
  117.  
  118. if (redirect === 1) {
  119. window.location.href = gamecardHref;
  120. }
  121. jQuery.when(checkBlacklist()).done( function() {
  122. if (skipCraft === 0) {
  123. craftBadge();
  124. }
  125. });
  126. }
  127. });
  128.  
  129. function addButton() {
  130. // Set HTML vars
  131. var settingsDiv = `
  132. <div id="autocraft_settings_div" class="newmodal" style="position: fixed; z-index: 1000; left: 50%; top: 15%; display: none; transform: translateX(-50%);">
  133. <div class="newmodal_header_border">
  134. <div class="newmodal_header">
  135. <span id="autocraft_settings_title">Steam-AutoCraft Settings</span>
  136. <div id="autocraft_settings_close" class="newmodal_close"/>
  137. </div>
  138. </div>
  139. <div class="newmodal_content_border">
  140. <div class="newmodal_content">
  141. <div class="market_dialog_content">
  142. <div class="market_dialog_iteminfo">
  143. <div id="autocraft_settings_list" class="market_content_block market_home_listing_table market_home_main_listing_table market_listing_table">
  144. <form id="autocraft_settings_form" align="left">
  145. <div class="market_listing_row market_recent_listing_row">
  146. <div class="market_listing_item_name_block">
  147. <span class="market_listing_item_name" style="display:inline-block; width:175px">Page Refresh Timeout (ms):</span>
  148. <span><input type="text" class="market_dialog_input" style="width: 50px" id="autocraft_setting_refresh_timeout" name="autocraft_setting_refresh_timeout" value="`+pageRefreshTimeoutms+`"></span>
  149. <span class="market_listing_game_name">The the longer refresh that happens after crafting each badge in milliseconds.</span>
  150. </div>
  151. <div style="clear: both"/>
  152. </div>
  153. <div class="market_listing_row market_recent_listing_row">
  154. <div class="market_listing_item_name_block">
  155. <span class="market_listing_item_name" style="display:inline-block; width:175px">Craft Refresh Timeout (ms):</span>
  156. <span><input type="text" class="market_dialog_input" style="width: 50px" id="autocraft_setting_craft_refresh_timeout" name="autocraft_setting_craft_refresh_timeout" value="`+craftRefreshTimeoutms+`"></span>
  157. <span class="market_listing_game_name">The short refresh that we set immediately after beginning a craft in milliseconds.</span>
  158. </div>
  159. <div style="clear: both"/>
  160. </div>
  161. <div class="market_listing_row market_recent_listing_row">
  162. <div class="market_listing_item_name_block">
  163. <span class="market_listing_item_name" style="display:inline-block; width:175px">Game ID Blacklist (id1,id2):</span>
  164. <span><input type="text" class="market_dialog_input" style="width: 50px" id="autocraft_setting_blacklist" name="autocraft_setting_blacklist" value="`+gameIdBlackList+`"></span>
  165. <span class="market_listing_game_name">Game ID blacklisting in the form of 12345,67890. We skip these games.</span>
  166. </div>
  167. <div style="clear: both"/>
  168. </div>
  169. <div class="market_listing_row market_recent_listing_row">
  170. <div class="market_listing_item_name_block">
  171. <span class="market_listing_item_name" style="display:inline-block; width:175px">Badge Crafting Limit:</span>
  172. <span><input type="text" class="market_dialog_input" style="width: 50px" id="autocraft_setting_badgelimit" name="autocraft_setting_badgelimit" value="`+badgeCraftLimit+`"></span>
  173. <span class="market_listing_game_name">Number of badges to craft. Stop once we hit this limit.</span>
  174. </div>
  175. <div style="clear: both"/>
  176. </div>
  177. <br>
  178. <div class="market_dialog_content_separator"></div>
  179. <div class="market_dialog_content market_dialog_content_dark">
  180. <div class="market_sell_dialog_input_area">
  181. <input id="autocraft_button_reset" type="button" class="btn_grey_grey btn_small_thin" name="Reset" value="Reset" align="center">
  182. <input id="autocraft_button_save" type="button" class="btn_grey_grey btn_small_thin" name="Save" value="Save" align="center">
  183. </div>
  184. </div>
  185. </form>
  186. </div>
  187. </div>
  188. </div>
  189. <p align="center" class="market_listing_game_name">Steam-AutoCraft Version: `+steamAutoCraftVersion+`</p>
  190. </div>
  191. </div>`;
  192.  
  193. jQuery('body').append('<div id="autocraft_settings_background_div" class="newmodal_background" style="opacity: 0.8; display: none;">');
  194.  
  195. // Load economy.css
  196. var economyCSS = '/public/css/skin_1/economy.css';
  197. if(jQuery("link[href*='"+economyCSS+"']").attr('rel') !== 'stylesheet'){
  198. jQuery('head').append('<link href="'+economyCSS+'" rel="stylesheet" type="text/css">');
  199. }
  200.  
  201. // Load economy.css
  202. var economyMarketCSS = '/public/css/skin_1/economy_market.css';
  203. if(jQuery("link[href*='"+economyMarketCSS+"']").attr('rel') !== 'stylesheet'){
  204. jQuery('head').append('<link href="'+economyMarketCSS+'" rel="stylesheet" type="text/css">');
  205. }
  206.  
  207. // Add button to badge details page
  208. if (isGameCardsPage === 1){
  209. // Add settings div
  210. jQuery(settingsDiv).insertAfter('.gamecards_inventorylink');
  211. jQuery('#autocraft_button_reset').click(function(){ resetSettings(); });
  212. jQuery('#autocraft_button_save').click(function(){ saveSettings(); });
  213.  
  214. // Buttons
  215. invLinks.append(`
  216. <a class="btn_grey_grey btn_small_thin btn_disabled" id="autocraft">
  217. <span>AutoCraft&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
  218. </a>
  219. <a class="btn_grey_grey btn_small_thin" id="autocraft_settings">
  220. <span>&#9881;</span>
  221. </a>`);
  222.  
  223. // Set initial position
  224. var position = jQuery('#autocraft').position();
  225. var x = position.left;
  226. var y = position.top;
  227. x -= (jQuery('#autocraft_settings').outerWidth() - jQuery('#autocraft').outerWidth());
  228. jQuery('#autocraft_settings').css({
  229. position: 'absolute',
  230. zIndex: 500,
  231. top: y,
  232. left: x
  233. });
  234.  
  235. // Transform to overlay
  236. jQuery('#autocraft_settings').css({
  237. position: 'element(#autocraft)',
  238. zIndex: 500,
  239. transform: 'translateX(-100%)',
  240. 'background-color': 'transparent',
  241. 'background-repeat': 'no-repeat',
  242. border: 'none',
  243. cursor: 'pointer',
  244. overflow: 'hidden',
  245. outline: 'none',
  246. top: '',
  247. left: ''
  248. });
  249.  
  250. jQuery('#autocraft_settings').click(function(){ toggleSettings(); });
  251. jQuery('#autocraft_settings_close').click(function(){ toggleSettings(); });
  252.  
  253. if (canCraftBadge == 1){
  254. jQuery('#autocraft').click(function(){ autoCraft(); });
  255. jQuery('#autocraft').removeClass('btn_disabled');
  256. jQuery('#autocraft').prop('disabled',false);
  257. }
  258.  
  259. return;
  260. }
  261.  
  262. // Add button to badges page
  263. if (isBadgesPage === 1){
  264. // Add settings div
  265. jQuery(settingsDiv).insertAfter('.badge_details_set_favorite');
  266. jQuery('#autocraft_button_reset').click(function(){ resetSettings(); });
  267. jQuery('#autocraft_button_save').click(function(){ saveSettings(); });
  268.  
  269. // Buttons
  270. var autoCraftButtonText = 'AutoCraft all badges';
  271.  
  272. if (window.localStorage.badgeCraftLimit) {
  273. if (+window.localStorage.badgeCraftLimit === 1) {
  274. autoCraftButtonText = 'AutoCraft 1 badge';
  275. } else {
  276. autoCraftButtonText = 'AutoCraft '+window.localStorage.badgeCraftLimit+' badges';
  277. }
  278. }
  279.  
  280. badgeLinks.append(`
  281. <a class="btn_grey_black btn_small_thin btn_disabled" id="autocraft">
  282. <span>`+autoCraftButtonText+`&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
  283. </a>
  284. <a class="btn_grey_black btn_small_thin" id="autocraft_settings">
  285. <span>&#9881;</span>
  286. </a>`);
  287.  
  288. // Set initial position
  289. var autocraft_position = jQuery('#autocraft').position();
  290. var autocraft_x = autocraft_position.left;
  291. var autocraft_y = autocraft_position.top;
  292. autocraft_x -= (jQuery('#autocraft_settings').outerWidth() - jQuery('#autocraft').outerWidth());
  293. jQuery('#autocraft_settings').css({
  294. position: 'absolute',
  295. zIndex: 500,
  296. top: autocraft_y,
  297. left: autocraft_x
  298. });
  299.  
  300. // Transform to overlay
  301. jQuery('#autocraft_settings').css({
  302. position: 'element(#autocraft)',
  303. zIndex: 500,
  304. transform: 'translateX(-100%)',
  305. 'background-color': 'transparent',
  306. 'background-repeat': 'no-repeat',
  307. border: 'none',
  308. cursor: 'pointer',
  309. overflow: 'hidden',
  310. outline: 'none',
  311. top: '',
  312. left: ''
  313. });
  314.  
  315. jQuery('#autocraft_settings').click(function(){ toggleSettings(); });
  316. jQuery('#autocraft_settings_close').click(function(){ toggleSettings(); });
  317.  
  318. if (canCraftBadge == 1){
  319. gamecardHrefLinks = jQuery('div').find('.badge_row .badge_craft_button');
  320. gamecardHref = gamecardHrefLinks[0];
  321. if (typeof gamecardHref !== 'undefined') {
  322. jQuery('#autocraft').removeClass('btn_disabled');
  323. jQuery('#autocraft').prop('disabled',false);
  324. jQuery('#autocraft').click(function(){ window.sessionStorage.craftRecursive = 1; window.location.href = gamecardHref; });
  325. } else {
  326. delete window.sessionStorage.autoCraftState;
  327. }
  328. }
  329.  
  330. return;
  331. }
  332. }
  333.  
  334. // Auto-craft
  335. function autoCraft() {
  336. craftBadge();
  337. setTimeout(function(){ window.location.reload(true); }, pageRefreshTimeoutms);
  338. window.sessionStorage.autoCraftState = 1;
  339. }
  340.  
  341. // Check settings
  342. function checkSettings() {
  343. // Use localStorage for persistence across browser sessions
  344. if (window.localStorage.pageRefreshTimeoutms) {
  345. pageRefreshTimeoutms = window.localStorage.pageRefreshTimeoutms;
  346. }
  347.  
  348. if (window.localStorage.craftRefreshTimeoutms) {
  349. craftRefreshTimeoutms = window.localStorage.craftRefreshTimeoutms;
  350. }
  351.  
  352. if (window.localStorage.gameIdBlackList) {
  353. gameIdBlackList = window.localStorage.gameIdBlackList;
  354. }
  355.  
  356. if (window.localStorage.badgeCraftLimit) {
  357. badgeCraftLimit = window.localStorage.badgeCraftLimit;
  358. }
  359. }
  360.  
  361. // Check blacklist
  362. function checkBlacklist() {
  363. if (isGameCardsPage === 1) { return; }
  364. // Join csv blacklist with pipe for use inside regex
  365. var blacklist = gameIdBlackList.replace(/[ \t]*,[ \t]*/g, '|');
  366. var regex = "^https?:\/\/steamcommunity\.com\/+(id\/+[A-Za-z0-9$-_.+!*'(),]+|profiles\/+[0-9]+)\/gamecards\/"+blacklist+"\/.*$";
  367. var re = new RegExp(regex);
  368.  
  369. // Get badge links
  370. gamecardHrefLinks = jQuery('div').find('.badge_row .badge_craft_button');
  371. gamecardHrefLinks.each(function() {
  372. gamecardHrefLink = jQuery(this).attr('href');
  373.  
  374. // Disable badge link
  375. if (blacklist.length > 0) {
  376. if (gamecardHrefLink.match(re)) {
  377. jQuery('a[href="'+gamecardHrefLink+'"]').filter('.badge_craft_button').replaceWith('5 of 5 cards collected');
  378. }
  379. }
  380. });
  381.  
  382. // Redirect or clean up
  383. if (jQuery('.badge_craft_button').length >= 1) {
  384. redirect = 1;
  385. } else {
  386. delete window.sessionStorage.craftRecursive;
  387. jQuery('#autocraft').addClass('btn_disabled');
  388. jQuery('#autocraft').prop('disabled',true);
  389. }
  390. }
  391.  
  392. // Craft badge and refresh page
  393. function craftBadge() {
  394. jQuery('.badge_craft_button').click();
  395. if (isGameCardsPage === 1) {
  396. setTimeout(function(){ window.location.reload(true); }, craftRefreshTimeoutms);
  397. }
  398. }
  399.  
  400. // Reset settings
  401. function resetSettings() {
  402. var resetConfirm = confirm("Reset all settings?");
  403. if (resetConfirm === true) {
  404. pageRefreshTimeoutms = pageRefreshTimeoutmsDef;
  405. delete window.localStorage.pageRefreshTimeoutms;
  406. jQuery('#autocraft_setting_refresh_timeout').val( pageRefreshTimeoutmsDef );
  407.  
  408. craftRefreshTimeoutms = craftRefreshTimeoutmsDef;
  409. delete window.localStorage.craftRefreshTimeoutms;
  410. jQuery('#autocraft_setting_craft_refresh_timeout').val( craftRefreshTimeoutmsDef );
  411.  
  412. gameIdBlackList = '';
  413. delete window.localStorage.gameIdBlackList;
  414. jQuery('#autocraft_setting_blacklist').val( gameIdBlackList );
  415.  
  416. badgeCraftLimit = '';
  417. delete window.localStorage.badgeCraftLimit;
  418. jQuery('#autocraft_setting_badgelimit').val( badgeCraftLimit );
  419.  
  420. toggleSettings();
  421. window.location.reload(true);
  422. }
  423. }
  424.  
  425. // Save settings
  426. function saveSettings() {
  427. var problemState = 0;
  428. var settingsArray = jQuery('#autocraft_settings_form').serializeArray();
  429.  
  430. jQuery.each(settingsArray, function (i, setting) {
  431. if (setting.name === 'autocraft_setting_refresh_timeout') {
  432. // Ensure that only integers are entered
  433. if (setting.value.match(/^[0-9]+$/)) {
  434. pageRefreshTimeoutms = setting.value;
  435. window.localStorage.pageRefreshTimeoutms = setting.value;
  436. } else {
  437. alert("Invalid input: "+setting.value+", 'Page Refresh Timeout (ms)' requires an integer!");
  438. problemState = 1;
  439. }
  440. }
  441.  
  442. if (setting.name === 'autocraft_setting_craft_refresh_timeout') {
  443. // Ensure that only integers are entered
  444. if (setting.value.match(/^[0-9]+$/)) {
  445. craftRefreshTimeoutms = setting.value;
  446. window.localStorage.craftRefreshTimeoutms = setting.value;
  447. } else {
  448. alert("Invalid input: "+setting.value+", 'Craft Refresh Timeout (ms)' requires an integer!");
  449. problemState = 1;
  450. }
  451. }
  452.  
  453. if (setting.name === 'autocraft_setting_blacklist') {
  454. // Allow only integers and commas
  455. if ((setting.value.match(/^([ \t]*,?[0-9]+,?[ \t]*)+$/)) || (setting.value === '')) {
  456. gameIdBlackList = setting.value;
  457. window.localStorage.gameIdBlackList = setting.value;
  458. } else {
  459. alert("Invalid input: "+setting.value+", 'Game ID Blacklist (id1,id2)' requires an integer with optional comma!");
  460. problemState = 1;
  461. }
  462. }
  463.  
  464. if (setting.name === 'autocraft_setting_badgelimit') {
  465. // Ensure that only integers are entered
  466. if (((! setting.value.match(/^0$/)) && (setting.value.match(/^[0-9]+$/))) || (setting.value === '')) {
  467. badgeCraftLimit = setting.value;
  468. window.localStorage.badgeCraftLimit = setting.value;
  469. } else {
  470. alert("Invalid input: "+setting.value+", 'Badge Limit requires an integer greater than 0!");
  471. problemState = 1;
  472. }
  473. }
  474.  
  475. });
  476.  
  477. if (problemState === 0) {
  478. toggleSettings();
  479. window.location.reload(true);
  480. }
  481. }
  482.  
  483. // Settings toggle
  484. function toggleSettings() {
  485. // Toggle the settings
  486. jQuery('#autocraft_settings_div').toggle();
  487. jQuery('#autocraft_settings_background_div').fadeToggle();
  488.  
  489. // Change look on view
  490. if (jQuery('#autocraft_settings_div').is(':visible')) {
  491. jQuery('#autocraft_settings').addClass('btn_disabled');
  492. } else {
  493. jQuery('#autocraft_settings').removeClass('btn_disabled');
  494. }
  495.  
  496. // Close on outside click
  497. var inside_autocraft_settings=false;
  498.  
  499. jQuery('#autocraft_settings_div').hover(function(){
  500. inside_autocraft_settings=true;
  501. }, function(){
  502. inside_autocraft_settings=false;
  503. });
  504.  
  505. jQuery('body').mouseup(function(){
  506. if((jQuery('#autocraft_settings_div').is(':visible')) && (!inside_autocraft_settings)) {
  507. jQuery('#autocraft_settings_div').hide();
  508. jQuery('#autocraft_settings_background_div').fadeOut();
  509. jQuery('#autocraft_settings').removeClass('btn_disabled');
  510. }
  511. });
  512. }
Add Comment
Please, Sign In to add comment