Greasy Fork

Greasy Fork is available in English.

🐭️ MouseHunt - Gift Buttons

Add buttons to easily accept and return all daily gifts.

当前为 2023-04-01 提交的版本,查看 最新版本

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name         🐭️ MouseHunt - Gift Buttons
// @version      1.5.0
// @description  Add buttons to easily accept and return all daily gifts.
// @license      MIT
// @author       bradp
// @namespace    bradp
// @match        https://www.mousehuntgame.com/*
// @icon         https://i.mouse.rip/mouse.png
// @grant        none
// @run-at       document-end
// @require      https://cdn.jsdelivr.net/npm/[email protected]/mousehunt-utils.js
// ==/UserScript==

((function () {
  /**
   * Send the gifts.
   *
   * @param {string} buttonClass The class of the button to click.
   */
  const sendGifts = (buttonClass) => {
    if (hg && hg.views?.GiftSelectorView?.show) { // eslint-disable-line no-undef
      hg.views.GiftSelectorView.show(); // eslint-disable-line no-undef
    }

    const innerButtons = document.querySelectorAll('.giftSelectorView-friendRow-action.' + buttonClass + ':not(.disbled):not(.selected)');
    if (! innerButtons.length) {
      return;
    }

    innerButtons.forEach((button) => {
      button.click();
    });

    const confirm = document.querySelector('.mousehuntActionButton.giftSelectorView-action-confirm.small');
    if (confirm) {
      confirm.click();
    }
  };

  /**
   * Make a button.
   *
   * @param {string} text        The text to put in the button.
   * @param {string} buttonClass Class selector to use to grab the button.
   * @param {string} limitClass  Class selector to use to grab the limit.
   */
  const makeButton = (text, buttonClass, limitClass) => {
    const btn = document.createElement('a');
    btn.innerHTML = text;

    const limit = document.querySelector('.giftSelectorView-num' + limitClass + 'ActionsRemaining');
    if (limit && limit.innerText === '0') {
      btn.classList.add('disabled');
      btn.classList.add('disabled');
    } else {
      btn.addEventListener('click', () => {
        sendGifts(buttonClass);
      });
    }

    return btn;
  };

  /**
   * Make the buttons and add them to the page.
   */
  const makeButtons = () => {
    if (document.getElementById('bulk-gifting-gift-buttons')) {
      return;
    }

    const buttonContainer = document.createElement('div');
    buttonContainer.id = 'bulk-gifting-gift-buttons';

    const acceptButton = makeButton('Accept All', 'claim', 'Claim');
    buttonContainer.appendChild(acceptButton);

    const returnButton = makeButton('Accept & Return All', 'return', 'Send');
    buttonContainer.appendChild(returnButton);

    const giftFooter = document.querySelector('.giftSelectorView-inbox-footer');
    if (giftFooter && giftFooter.firstChild) {
      giftFooter.insertBefore(buttonContainer, giftFooter.firstChild);
    }
  };

  /**
   * On a sucessful send, close the modal.
   *
   * @param {Object} request The request.
   */
  const checkForSuccessfulGiftSend = (request) => {
    if (! request || 'undefined' === request.friends_sent_gifts || ! request.friends_sent_gifts.length > 1) {
      return;
    }

    const okayBtn = document.querySelector('.giftSelectorView-confirmPopup-submitConfirmButton');
    if (! okayBtn) {
      return;
    }

    setTimeout(() => {
      okayBtn.click();

      if ('undefined' === typeof activejsDialog || ! activejsDialog || ! activejsDialog.hide) { // eslint-disable-line no-undef
        return;
      }

      activejsDialog.hide(); // eslint-disable-line no-undef
    }, 2000);
  };

  const addReturnRaffleListener = () => {
    const inbox = document.getElementById('hgbar_messages');
    if (! inbox) {
      return;
    }

    inbox.addEventListener('click', addReturnRaffleTicketsButton);
  };

  const returnRaffleTickets = async () => {
    const draws = document.querySelectorAll('.message.daily_draw.notification.ballot');
    if (draws.length <= 0) {
      return;
    }

    let count = 0;
    const counter = document.querySelector('[data-tab="daily_draw"] .counter');
    if (counter) {
      count = parseInt(counter.innerText);
    }

    for (let i = 0; i <= 20; i++) {
      const draw = draws[ i ];

      const returnButton = draw.querySelector('input');
      if (! returnButton) {
        continue;
      }

      const previousSibling = draw.previousSibling;
      if (previousSibling) {
        const error = previousSibling.querySelector('.error');
        if (error) {
          break;
        }
      }
      returnButton.click();

      const tab = document.querySelector('[data-tab="daily_draw"]');
      if (! tab) {
        break;
      }

      if (counter && count > 0) {
        count = parseInt(counter.innerText);
        counter.innerText = count - 1;
      }

      await new Promise((resolve) => setTimeout(resolve, 1000));
    }
  };

  const addReturnRaffleTicketsButton = () => {
    const drawTab = document.querySelector('[data-tab="daily_draw"]');
    if (! drawTab) {
      return;
    }

    const exists = document.getElementById('return-raffle-tickets');
    if (exists) {
      return;
    }

    // Create a button and append it to the draw tab
    const btn = document.createElement('button');
    btn.innerText = 'Return';
    btn.id = 'return-raffle-tickets';

    btn.addEventListener('click', returnRaffleTickets);

    drawTab.insertBefore(btn, drawTab.firstChild.nextSibling);
  };

  addStyles(`#bulk-gifting-gift-buttons {
    text-align: right;
    margin: 0 0 10px;
  }

  #bulk-gifting-gift-buttons a {
    display: inline-block;
    background-color: #eee;
    box-shadow: 1px 1px 1px #eee;
    border: 1px solid #000;
    border-radius: 5px;
    font-size: 12px;
    text-align: center;
    line-height: 30px;
    text-decoration: none;
    color: black;
    padding: 0 10px;
  }

  #bulk-gifting-gift-buttons a:last-child:hover,
  #bulk-gifting-gift-buttons a:hover {
    background-color: #ffae00;
    box-shadow: 0 0 5px #fff inset, 1px 1px 1px #fff;
  }

  #bulk-gifting-gift-buttons a:last-child {
    background-color: #fff600;
    margin-left: 10px;
  }

  #bulk-gifting-gift-buttons a.disabled,
  #bulk-gifting-gift-buttons a:last-child.disabled {
    background-color: #eee;
  }


  #bulk-gifting-gift-buttons a.disabled:hover {
    cursor: default;
    box-shadow: 0 0 3px #ff0000;
  }

  #messengerUINotification .tabs a[data-tab="daily_draw"] .counter {
    right: -1px;
    z-index: 10;
    top: 3px;
  }

  #return-raffle-tickets {
    box-shadow: 1px 1px 1px #eee;
    font-size: 10px;
    text-align: center;
    text-decoration: none;
    margin-left: 10px;
    background-color: #f5f5f5;
    border: 1px solid #ccc;
    border-radius: 3px;
    padding: 3px 7px;
    font-weight: 600;
    color: #333;
    cursor: pointer;

    opacity: 0.5;
  }

  .active #return-raffle-tickets {
    opacity: 1;
    transition: 60s;
  }

  #return-raffle-tickets:hover {
    background-color: #ececec;
    box-shadow: inset 0px 1px 2px #cccccc;
  }

  .giftSelectorView-inbox-giftContainer {
    min-height: 300px;
    max-height: 75vh;
    height: auto;
  }

  .giftSelectorView-inbox-giftRow.complete {
    height: 25px;
    padding-top: 5px;
    padding-left: 15px;
    border: none;
    box-shadow: none;
  }

  .giftSelectorView-inbox-giftRow.complete .giftSelectorView-inbox-gift-thumb {
    display: inline;
  }

  .giftSelectorView-inbox-giftRow.complete .itemImage {
    width: 25px;
    height: 25px;
    display: inline-block;
  }

  .giftSelectorView-inbox-giftRow.complete .giftSelectorView-inbox-gift-details {
    width: 90%;
  }
  `);

  onAjaxRequest(makeButtons, '/managers/ajax/users/socialGift.php');
  onAjaxRequest(checkForSuccessfulGiftSend, '/managers/ajax/users/socialGift.php');

  onAjaxRequest(addReturnRaffleTicketsButton, '/managers/ajax/users/messages.php');
  addReturnRaffleListener();

  const buttonLink = document.querySelector('#hgbar_freegifts');
  if (buttonLink) {
    buttonLink.addEventListener('click', function () {
      makeButtons();
    });
  }
})());