Advertisement
Guest User

Untitled

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