Steamgifts One-Click Entry

This script adds "Enter" button on every giveaway, so you don't have to open a new page to enter it. I also adds vote all button, which votes for giveaways with more copies first.

  1. // ==UserScript==
  2. // @name Steamgifts One-Click Entry
  3. // @namespace com.Sergeeeek.Usability.Scripts
  4. // @version 0.10
  5. // @description This script adds "Enter" button on every giveaway, so you don't have to open a new page to enter it. I also adds vote all button, which votes for giveaways with more copies first.
  6. // @author Sergeeeek
  7. // @include https://www.steamgifts.com/
  8. // @include https://www.steamgifts.com/giveaways*
  9. // @grant none
  10. // ==/UserScript==
  11.  
  12. (function() {
  13. 'use strict';
  14.  
  15. var link_string = '<a href="#" onclick="return false;" class="short-enter-leave-link"><i class="fa"></i> <span></span></a>';
  16. var vote_all_string = '<a id="vote_all" href="#" onclick="return false;"><i class="fa fa-plus"></i> Vote all</a>';
  17.  
  18. var giveaways = $('.giveaway__row-inner-wrap');
  19. var vote_all_button = $(vote_all_string);
  20. $('.page__heading div').after(vote_all_button);
  21.  
  22. giveaways.each(function (idx, elem) {
  23. var j = $(elem);
  24. if(j.find('.giveaway__column--contributor-level').hasClass('giveaway__column--contributor-level--negative')) {
  25. return;
  26. }
  27. var href = $(j.find('.giveaway__heading__name')).attr('href');
  28. var details = j.find('.giveaway__heading__thin').text();
  29.  
  30. var detailsMatch = details.match(/(\(([0-9]*)\sCopies\))?\s?\(([0-9]*)P\)/);
  31. var copies = detailsMatch[2] === undefined ? 1 : detailsMatch[2];
  32. var cost = detailsMatch[3];
  33.  
  34. var l = $(link_string);
  35. l.attr('data-link', href);
  36. l.attr('data-cost', cost);
  37. l.attr('data-copies', copies);
  38. var faded = j.hasClass('is-faded');
  39. l.find('span').text(faded ? 'Leave' : 'Enter');
  40.  
  41. l.addClass(faded ? 'leave' : '');
  42. l.find('.fa').addClass(faded ? 'fa-minus' : 'fa-plus');
  43.  
  44. j.find('.giveaway__links').append(l);
  45. });
  46.  
  47. var links = $('.short-enter-leave-link');
  48. links.click(function (e) {
  49. var elem = $(this);
  50.  
  51. var url = elem.attr('data-link');
  52.  
  53. $.ajax(url, {
  54. complete: function (data, code) {
  55. var f = $(data.responseText).find('div[data-do="entry_insert"], div[data-do="entry_delete"]').closest('form').serializeArray();
  56.  
  57. var wasLeave = elem.hasClass('leave');
  58. f[1].value = wasLeave ? "entry_delete" : "entry_insert";
  59.  
  60. $.ajax('/ajax.php', {
  61. data: f,
  62. method: 'POST',
  63. complete: function (data1, code1) {
  64. if(data1.responseText === "") return;
  65. var d = JSON.parse(data1.responseText);
  66. if(d.type === "success")
  67. {
  68. elem.toggleClass('leave');
  69. elem.closest('.giveaway__row-inner-wrap').toggleClass("is-faded");
  70. elem.find('span').text(elem.hasClass('leave') ? 'Leave' : 'Enter');
  71. elem.find('.fa').removeClass('fa-plus fa-minus').addClass(elem.hasClass('leave') ? 'fa-minus' : 'fa-plus');
  72. $('.nav__points').text(d.points);
  73. }
  74. }
  75. });
  76. }
  77. });
  78. });
  79. $('#vote_all').click(function () {
  80. links.not('.leave')
  81. .toArray()
  82. .sort(function(a, b) {
  83. var ac = parseInt($(a).attr('data-copies'));
  84. var bc = parseInt($(b).attr('data-copies'));
  85.  
  86.  
  87. if(ac > bc) {
  88. return -1;
  89. }
  90. else if(ac === bc) {
  91. return 0;
  92. }
  93. else {
  94. return 1;
  95. }
  96. })
  97. .forEach(function(elem) {
  98. $(elem).click();
  99. });
  100. });
  101. })();