MouseHunt - Gifting Buttons

Adds buttons to easily ignore, accept, or return all free gifts

  1. // ==UserScript==
  2. // @name MouseHunt - Gifting Buttons
  3. // @author Tran Situ (tsitu)
  4. // @namespace https://greasyfork.org/en/users/232363-tsitu
  5. // @version 1.3
  6. // @description Adds buttons to easily ignore, accept, or return all free gifts
  7. // @match http://www.mousehuntgame.com/*
  8. // @match https://www.mousehuntgame.com/*
  9. // ==/UserScript==
  10.  
  11. (function() {
  12. const observerTarget = document.querySelector("#overlayPopup");
  13. if (observerTarget) {
  14. MutationObserver =
  15. window.MutationObserver ||
  16. window.WebKitMutationObserver ||
  17. window.MozMutationObserver;
  18.  
  19. const observer = new MutationObserver(function() {
  20. // Callback
  21. const claimableExists = document.querySelector(
  22. ".giftSelectorView-tabContent.selectClaimableGift"
  23. );
  24. if (claimableExists) {
  25. // Disconnect and reconnect later to prevent infinite mutation loop
  26. observer.disconnect();
  27.  
  28. // Render buttons if 'Claim Free Gifts' dialog is in DOM
  29. buildUI();
  30.  
  31. observer.observe(observerTarget, {
  32. childList: true,
  33. subtree: true
  34. });
  35. }
  36. });
  37.  
  38. // Observe mutations in <div id="overlayPopup">
  39. observer.observe(observerTarget, {
  40. childList: true,
  41. subtree: true
  42. });
  43. }
  44.  
  45. function buildUI() {
  46. // Remove existing buttonSpans
  47. document.querySelectorAll(".tsitu-gift-buttons").forEach(el => el.remove());
  48.  
  49. // Generate buttons for each unique item container
  50. const uniqueItems = document.querySelectorAll(
  51. ".giftSelectorView-claimableGift-title-itemName"
  52. );
  53. if (uniqueItems && uniqueItems.length > 0) {
  54. uniqueItems.forEach(el => {
  55. generateButtons(
  56. el.parentElement.parentElement,
  57. el.parentElement.parentElement,
  58. 15
  59. );
  60. });
  61. }
  62.  
  63. // Generate buttons for the entire container
  64. generateButtons(
  65. document
  66. .querySelector(".giftSelectorView-tabContent.selectClaimableGift")
  67. .querySelector(".giftSelectorView-actionContainer"),
  68. document,
  69. 0
  70. );
  71. }
  72.  
  73. /**
  74. * @param {Element} target Location to append generated buttons
  75. * @param {Element} rowContainer Location to query for friendRows
  76. * @param {Number} bottomMargin px margin to give bottom of buttonSpan
  77. */
  78. function generateButtons(target, rowContainer, bottomMargin) {
  79. const rows = rowContainer.querySelectorAll(
  80. ".giftSelectorView-friendRow-actionContainer"
  81. );
  82.  
  83. const ignoreAllButton = document.createElement("button");
  84. ignoreAllButton.innerText = "Ignore All";
  85. ignoreAllButton.addEventListener("click", function() {
  86. for (let row of rows) {
  87. const button = row.querySelector(
  88. ".giftSelectorView-friendRow-action.ignore:not(.selected):not(.disabled)"
  89. );
  90. if (button) button.click();
  91. }
  92. });
  93.  
  94. const unignoreAllButton = document.createElement("button");
  95. unignoreAllButton.innerText = "↩️";
  96. unignoreAllButton.addEventListener("click", function() {
  97. for (let row of rows) {
  98. const button = row.querySelector(
  99. ".giftSelectorView-friendRow-action.ignore.selected"
  100. );
  101. if (button) button.click();
  102. }
  103. });
  104.  
  105. const acceptAllButton = document.createElement("button");
  106. acceptAllButton.innerText = "Accept All";
  107. acceptAllButton.addEventListener("click", function() {
  108. for (let i = 0; i < rows.length; i++) {
  109. // Oldest first
  110. const row = rows[rows.length - i - 1];
  111. const button = row.querySelector(
  112. ".giftSelectorView-friendRow-action.claim:not(.selected):not(.disabled)"
  113. );
  114. if (button) button.click();
  115. }
  116. });
  117.  
  118. const unacceptAllButton = document.createElement("button");
  119. unacceptAllButton.innerText = "↩️";
  120. unacceptAllButton.addEventListener("click", function() {
  121. for (let row of rows) {
  122. const button = row.querySelector(
  123. ".giftSelectorView-friendRow-action.claim.selected"
  124. );
  125. if (button) button.click();
  126. }
  127. });
  128.  
  129. const returnAllButton = document.createElement("button");
  130. returnAllButton.innerText = "Return All";
  131. returnAllButton.addEventListener("click", function() {
  132. for (let i = 0; i < rows.length; i++) {
  133. // Oldest first
  134. const row = rows[rows.length - i - 1];
  135. const button = row.querySelector(
  136. ".giftSelectorView-friendRow-action.return:not(.selected):not(.disabled)"
  137. );
  138. if (button) button.click();
  139. }
  140. });
  141.  
  142. const unreturnAllButton = document.createElement("button");
  143. unreturnAllButton.innerText = "↩️";
  144. unreturnAllButton.addEventListener("click", function() {
  145. for (let row of rows) {
  146. const button = row.querySelector(
  147. ".giftSelectorView-friendRow-action.return.selected"
  148. );
  149. if (button) button.click();
  150. }
  151. });
  152.  
  153. const buttonSpan = document.createElement("span");
  154. buttonSpan.className = "tsitu-gift-buttons";
  155. buttonSpan.style.cssFloat = "left";
  156. buttonSpan.style.marginBottom = bottomMargin + "px";
  157.  
  158. buttonSpan.appendChild(ignoreAllButton);
  159. buttonSpan.appendChild(unignoreAllButton);
  160. buttonSpan.appendChild(document.createTextNode("\u00A0\u00A0"));
  161. buttonSpan.appendChild(acceptAllButton);
  162. buttonSpan.appendChild(unacceptAllButton);
  163. buttonSpan.appendChild(document.createTextNode("\u00A0\u00A0"));
  164. buttonSpan.appendChild(returnAllButton);
  165. buttonSpan.appendChild(unreturnAllButton);
  166. target.appendChild(buttonSpan);
  167. }
  168. })();