🐭️ MouseHunt - Better Gifts / Gift Buttons

Adds buttons to easily accept and return all daily gifts.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

var mhui = (() => {
  var __defProp = Object.defineProperty;
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
  var __getOwnPropNames = Object.getOwnPropertyNames;
  var __hasOwnProp = Object.prototype.hasOwnProperty;
  var __export = (target, all) => {
    for (var name in all)
      __defProp(target, name, { get: all[name], enumerable: true });
  };
  var __copyProps = (to, from, except, desc) => {
    if (from && typeof from === "object" || typeof from === "function") {
      for (let key of __getOwnPropNames(from))
        if (!__hasOwnProp.call(to, key) && key !== except)
          __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
    }
    return to;
  };
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
  var __async = (__this, __arguments, generator) => {
    return new Promise((resolve, reject) => {
      var fulfilled = (value) => {
        try {
          step(generator.next(value));
        } catch (e) {
          reject(e);
        }
      };
      var rejected = (value) => {
        try {
          step(generator.throw(value));
        } catch (e) {
          reject(e);
        }
      };
      var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
      step((generator = generator.apply(__this, __arguments)).next());
    });
  };

  // src/modules/better-gifts/index.js
  var better_gifts_exports = {};
  __export(better_gifts_exports, {
    default: () => better_gifts_default
  });

  // src/utils/event-registry.js
  var eventsAdded = {};
  var onEvent = (event, callback, remove = false) => {
    if (!eventRegistry) {
      return;
    }
    const id = `${event}-${remove.toString()}-${callback.toString()}`;
    if (eventsAdded[id]) {
      return;
    }
    eventsAdded[id] = true;
    eventRegistry.addEventListener(event, callback, null, remove);
  };

  // src/utils/styles.js
  var addModuleStyles = (styles, identifier = "mh-improved-styles", replace = false) => {
    const existingStyles = document.querySelector(`#${identifier}`);
    styles = Array.isArray(styles) ? styles.join("\n") : styles;
    if (existingStyles) {
      if (replace) {
        existingStyles.innerHTML = styles;
      } else {
        existingStyles.innerHTML += styles;
      }
      return existingStyles;
    }
    const style = document.createElement("style");
    style.id = identifier;
    style.innerHTML = styles;
    document.head.append(style);
    return style;
  };
  var addStyles = (styles, module = false, identifier = "mh-improved-styles") => {
    if (!module) {
      throw new Error("Module ID is required for adding module styles.", module);
    }
    const key = `${identifier}-${module}`;
    let stylesEl = addModuleStyles(styles, key, true);
    onEvent(`mh-improved-settings-changed-${module}`, (enabled) => {
      if (enabled) {
        stylesEl = addModuleStyles(styles, key, true);
      } else if (stylesEl) {
        stylesEl.remove();
      }
    });
  };

  // src/utils/settings.js
  var getSettingDirect = (key = null, defaultValue = null, identifier = "mousehunt-improved-settings") => {
    const settings = JSON.parse(localStorage.getItem(identifier)) || {};
    if (!key) {
      return settings;
    }
    if (!key.includes(".")) {
      if (settings[key] === void 0) {
        return defaultValue;
      }
      return settings[key];
    }
    const groupAndKey = getGroupAndKey(key);
    if (!groupAndKey.group) {
      if (settings[groupAndKey.key] === void 0) {
        return defaultValue;
      }
      return settings[groupAndKey.key];
    }
    const groupSettings = settings[groupAndKey.group] || {};
    if (groupSettings[groupAndKey.key] === void 0) {
      return defaultValue;
    }
    return groupSettings[groupAndKey.key];
  };
  var getGroupAndKey = (key) => {
    const split = key.split(".");
    if (split.length === 1) {
      return {
        group: null,
        key: split[0]
      };
    }
    if (split[0] === "location-huds-enabled") {
      return {
        group: "location-huds-enabled",
        key: split[1]
      };
    }
    return {
      group: `${split[0]}-settings`,
      key: split[1]
    };
  };
  var getSetting = (key, defaultValue = false) => {
    return getSettingDirect(key, defaultValue, "mousehunt-improved-settings");
  };

  // src/utils/elements.js
  var makeElement = (tag, classes = "", text = "", appendTo = null) => {
    const element = document.createElement(tag);
    if (Array.isArray(classes)) {
      classes = classes.join(" ");
    }
    if (classes && classes.length) {
      element.className = classes;
    }
    element.innerHTML = text;
    if (appendTo) {
      appendTo.append(element);
      return appendTo;
    }
    return element;
  };

  // src/utils/events.js
  var requestCallbacks = {};
  var onRequestHolder = null;
  var onRequest = (url = null, callback = null, skipSuccess = false, ignore = []) => {
    url = "*" === url ? "*" : `managers/ajax/${url}`;
    if (ignore.includes(url)) {
      return;
    }
    if (!callback) {
      return;
    }
    if (!requestCallbacks[url]) {
      requestCallbacks[url] = [];
    }
    requestCallbacks[url].push({
      callback,
      skipSuccess
    });
    if (onRequestHolder) {
      return;
    }
    const req = XMLHttpRequest.prototype.open;
    XMLHttpRequest.prototype.open = function() {
      this.addEventListener("load", function() {
        if (this.responseText) {
          let response = {};
          try {
            response = JSON.parse(this.responseText);
          } catch (e) {
            return;
          }
          Object.keys(requestCallbacks).forEach((key) => {
            if ("*" === key || this.responseURL.includes(key)) {
              requestCallbacks[key].forEach((item) => {
                if (item.callback && typeof item.callback === "function" && (item.skipSuccess || (response == null ? void 0 : response.success))) {
                  item.callback(response);
                }
              });
            }
          });
        }
      });
      Reflect.apply(req, this, arguments);
    };
    onRequestHolder = true;
  };
  var getDialogMapping = () => {
    return {
      treasureMapPopup: "map",
      itemViewPopup: "item",
      mouseViewPopup: "mouse",
      largerImage: "image",
      convertibleOpenViewPopup: "convertible",
      adventureBookPopup: "adventureBook",
      marketplaceViewPopup: "marketplace",
      giftSelectorViewPopup: "gifts",
      supportPageContactUsForm: "support",
      MHCheckout: "premiumShop"
    };
  };
  var onDialogShow = (overlay = null, callback = null, once = false) => {
    const identifier = callback.toString().replaceAll(/[^\w-]/gi, "");
    eventRegistry.addEventListener("js_dialog_show", () => {
      if (!activejsDialog) {
        return;
      }
      const tokens = activejsDialog.getAllTokens();
      if (!tokens || !tokens["{*content*}"] || !tokens["{*content*}"].value || tokens["{*content*}"].value === "" || tokens["{*content*}"].value.includes('data-item-type=""') || // Item view.
      tokens["{*content*}"].value.includes('data-mouse-id=""')) {
        return;
      }
      const atts = activejsDialog.getAttributes();
      let dialogType = atts.className.replace("jsDialogFixed", "").replace("wide", "").replace("default", "").replaceAll("  ", " ").replaceAll(" ", ".").trim();
      if (dialogType.endsWith(".")) {
        dialogType = dialogType.slice(0, -1);
      }
      if ((!overlay || "all" === overlay) && "function" === typeof callback) {
        return callback();
      }
      const dialogMapping = getDialogMapping();
      if ("function" === typeof callback && (overlay === dialogType || overlay === dialogMapping[dialogType])) {
        return callback();
      }
    }, null, once, 0, identifier);
  };
  var onDeactivation = (module, callback) => {
    onEvent("mh-improved-settings-changed", ({ key, value }) => {
      if (key === module && !value) {
        callback();
      }
    });
  };

  // src/utils/messages.js
  hadAddedErrorStyles = false;

  // src/utils/templates.js
  var replaceInTemplate = (templateId, replacements) => {
    let templateContent = hg.utils.TemplateUtil.getTemplate(templateId);
    replacements.forEach((replacement) => {
      templateContent = templateContent.replace(replacement[0], replacement[1]);
    });
    hg.utils.TemplateUtil.addTemplate(templateId, templateContent);
  };

  // src/modules/better-gifts/settings/index.js
  var settings_default = () => __async(void 0, null, function* () {
    const orderOptions = [
      {
        name: "Newest to Oldest",
        value: "default"
      },
      {
        name: "Oldest to Newest",
        value: "reverse"
      }
    ];
    const skipBadGiftOptions = [
      {
        name: "Skip all non-GOTD gifts",
        value: "skip"
      },
      {
        name: "Don't skip any gifts",
        value: "no-skip"
      },
      {
        name: "Skip Mozzarella Cheese only",
        value: "mozzarella"
      },
      {
        name: "Skip Stale Cheese only",
        value: "stale"
      },
      {
        name: "Skip Radioactive Sludge only",
        value: "sludge"
      },
      {
        name: "Skip Mozz. Cheese & Stale Cheese",
        value: "mozzarella-stale"
      },
      {
        name: "Skip Mozz. Cheese & Radioactive Sludge",
        value: "mozzarella-sludge"
      },
      {
        name: "Skip Stale Cheese & Radioactive Sludge",
        value: "stale-sludge"
      }
    ];
    return [
      {
        id: "better-gifts.send-order",
        title: "Order to accept/send",
        default: [orderOptions[0]],
        description: "",
        settings: {
          type: "multi-select",
          number: 1,
          options: orderOptions
        }
      },
      {
        id: "better-gifts.ignore-bad-gifts",
        title: "Ignore gifts",
        default: [skipBadGiftOptions[0]],
        description: "",
        settings: {
          type: "multi-select",
          number: 1,
          options: skipBadGiftOptions
        }
      }
    ];
  });

  // src/modules/better-gifts/styles.css
  var styles_default = '.giftSelectorView-giftContainer .giftSelectorView-gift.gift_of_the_day{width:20%}#bulk-gifting-gift-buttons{position:relative;display:flex;justify-content:flex-end;margin-bottom:10px}#bulk-gifting-gift-buttons .mh-gift-button{padding:0 15px;font-weight:400}#bulk-gifting-gift-buttons .mh-gift-buttons-accept{margin-right:5px}#bulk-gifting-gift-buttons .mh-gift-buttons-paid-gifts{margin-right:10px}.giftSelectorView-inbox-giftContainer{height:auto;min-height:300px;max-height:75vh}.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{display:inline-block;width:25px;height:25px}.giftSelectorView-inbox-giftRow.complete .giftSelectorView-inbox-gift-details{width:90%}.mh-gift-buttons-send-random,.mh-gift-buttons-send-faves{margin-top:-2px;margin-left:10px}.giftSelectorView-gift.sendable.gift.gift_of_the_day{flex:1}.giftSelectorView-gift .giftSelectorView-gift-padding{min-width:75px;border:1px solid #dcdcdc;box-shadow:none}.giftSelectorView-gift.gift_of_the_day .giftSelectorView-gift-padding{background-color:#a5e3ff}.giftSelectorView-scroller.giftSelectorView-giftContainer{display:flex;flex-wrap:wrap;justify-content:space-around}.giftSelectorView-gift.gift_of_the_day:hover .giftSelectorView-gift-padding{background-color:#0090ff}body #overlayPopup .giftSelectorView-scroller.giftSelectorView-giftContainer{min-height:unset}.giftSelectorView-friend.complete .giftSelectorView-friend-padding:before{bottom:9px;left:10px;z-index:1;filter:drop-shadow(0 0 3px #b9ff5d) drop-shadow(1px 1px 4px #b9ff5d) drop-shadow(-1px -1px 3px #b9ff5d)}.mh-gift-buttons-clone-wrapper{scrollbar-color:#938f83 #e9e1c6;max-height:calc(75vh - 175px);overflow-y:auto}.mh-gift-buttons-clone-wrapper .giftSelectorView-gift-description{display:flex;flex-direction:column-reverse;align-items:stretch}.mh-gift-buttons-clone-wrapper .giftSelectorView-gift-padding{min-width:unset;padding:0 2px;margin:0;border:none}.mh-gift-buttons-clone-wrapper .giftSelectorView-gift-name{height:unset}.mh-gift-buttons-clone-wrapper .giftSelectorView-gift-name span{padding:5px}.mh-gift-buttons-clone-wrapper .giftSelectorView-content-leftBar-highlightBlock{padding:5px;margin:0 5px 0 10px;background-color:transparent}.mh-gift-buttons-clone-wrapper .giftSelectorView-friendRow-returnCost{bottom:3px}.giftSelectorView-content-leftBar>.giftSelectorView-content-leftBar-highlightBlock:before{position:absolute;inset:0;z-index:1;content:"";border-radius:10px 0 0 10px;box-shadow:0 4px 4px -3px #000}.giftSelectorView-content-leftBar>.giftSelectorView-content-leftBar-highlightBlock{position:relative}.giftSelectorView-friend.complete .giftSelectorView-friend-padding:after,.mh-gift-buttons-clone-wrapper .giftSelectorView-gift.gift_of_the_day .giftSelectorView-gift-padding:after{display:none}.mh-gift-buttons-clone-wrapper .giftSelectorView-gift.gift_of_the_day .giftSelectorView-gift-padding{color:#000;background-color:#fff}.mh-gift-buttons-clone-wrapper .giftSelectorView-gift.gift_of_the_day:hover .giftSelectorView-gift-padding{background-color:#a5e3ff}.giftSelectorView-friend-group-title{padding:3px;font-size:11px}.giftSelectorView-friend-padding,.giftSelectorView-confirmPopup-block-actionItem .giftSelectorView-friend:hover .giftSelectorView-friend-padding{border-radius:0}.giftSelectorView-friend .giftSelectorView-friend-padding{height:35px}.mh-gift-buttons-clone-wrapper .giftSelectorView-gift .itemImage{width:50px;height:50px}.giftSelectorView-gift .itemImage{width:100%;height:80px}.giftSelectorView-friend-name{display:flex;flex-flow:column;align-items:flex-start;justify-content:flex-start;width:unset;height:unset;padding:0 3px;line-height:1.1}.giftSelectorView-friend-name span{display:block}#bulk-gifting-gift-buttons.mh-gift-buttons-send-popup{margin-bottom:0}.giftSelectorView-tabContentContainer .giftSelectorView-tabContent.active .giftSelectorView-actionContainer{display:flex;align-items:center;justify-content:flex-end}#bulk-gifting-gift-buttons.mh-gift-buttons-send-popup button{padding:6px;font-size:12px}a.mousehuntActionButton.giftSelectorView-action-confirm span{display:block;width:auto;min-width:80px}.giftSelectorView-friendRow-returnImage:hover{margin-top:-10px;margin-right:10px;margin-left:0;border:none}.giftSelectorView-claimableGift{min-height:100px}.giftSelectorView-claimableGift.accordion_disabled:after,.giftSelectorView-claimableGift.expanded:after{box-shadow:none}.giftSelectorView-claimableGift.accordion_disabled,.giftSelectorView-claimableGift.expanded{padding:5px;margin-bottom:11px;border:1px solid #ccc;border-radius:3px}.giftSelectorView-claimableGift-title-itemName{font-size:13px}.giftSelectorView-content-subtitle{border-bottom:none}.giftSelectorView-inboxGiftOfTheDay{padding:5px 0;border-color:#d1d0cf}.giftSelectorView-inbox-giftRow.paidgift{background-color:#fff08c;border:none}.giftSelectorView-inbox-gift-details .giftSelectorView-inbox-gift-sent{padding-top:3px}.giftSelectorView-inbox-giftRow{display:flex;align-items:center;justify-content:space-between;min-height:40px}.giftSelectorView-inbox-gift-details{flex:1;width:auto;margin:0 0 0 10px}.giftSelectorView-inbox-giftRow.paidgift .giftSelectorView-inbox-gift-actions{padding-bottom:0}.giftSelectorView-inboxGiftOfTheDay-label{margin-right:5px}.giftSelectorView-inboxGiftOfTheDay-gift{font-size:12px}.giftSelectorView-inboxGiftOfTheDay-gift abbr{text-decoration:none;vertical-align:middle}.paidgift a.giftSelectorView-friendRow-action.return{text-indent:-70px}.giftSelectorView-friendRow-returnQuantity{width:30px}.giftSelectorView-gift.paidgift .giftSelectorView-gift-padding{box-shadow:0 0 1px #000 inset}.giftSelectorView-tabContent.hasSidebar .giftSelectorView-content-rightBar{border-bottom-left-radius:10px}.giftSelectorView-friendRow-sender{position:relative}.giftSelectorView-friendRow:hover{padding-bottom:5px;margin-bottom:7px;border-top-left-radius:0;border-bottom-left-radius:0;outline:1px solid #dfdfdf;box-shadow:none}.giftSelectorView-friend-image{top:-7px;left:-7px;width:33px;height:33px;border:1px solid #bdbdbd}.giftSelectorView-friend-image.paidgift{top:-11px;width:31px;height:31px}#giftSelectorView-inbox{border:1px solid #d1d0cf;box-shadow:0 3px 6px -3px #000}.giftSelectorView-inbox-footer-viewMore a{position:relative;font-weight:400;line-height:24px;text-shadow:0 0 1px #fff;background:none;border:none;border-radius:3px;box-shadow:none}.giftSelectorView-inbox-footer-viewMore{position:absolute;right:10px;width:135px;padding:0;font-size:12px;font-weight:700;line-height:30px;color:#000!important;text-align:center;background:#b3edff;border:1px solid #50549c;border-radius:5px;box-shadow:1px 1px 1px #eee}.giftSelectorView-inbox-footer-viewMore:hover{background-color:#b3f4ff;border-color:#000;box-shadow:0 0 5px #fff inset,1px 1px 1px #fff}.giftSelectorView-inbox-footer-viewMore:before{position:absolute;inset:40% 0 0;content:"";background:#b2e2ff;border-radius:5px;box-shadow:0 0 10px #7bf inset}.giftSelectorView-inbox-footer-viewMore:before:hover{background-color:#a5e2ff;box-shadow:0 0 10px #f0f4f7 inset}.giftSelectorView-inbox-footer{padding-bottom:18px}.giftSelectorView-inbox-giftContainer .mousehuntActionButton.return.disabled,.giftSelectorView-inbox-giftContainer .mousehuntActionButton.claim.disabled{opacity:.5}.giftSelectorView-inbox-giftContainer .mousehuntActionButton.return.disabled:hover,.giftSelectorView-inbox-giftContainer .mousehuntActionButton.claim.disabled:hover{opacity:1}.giftSelectorView-friendRow-action.ignore{outline:1px solid #ededed;box-shadow:none}.giftSelectorView-friendRow-action.ignore:hover{background-color:#eee;outline-color:#c6c6c6}.giftSelectorView-friendRow-action.claim,.giftSelectorView-friendRow-action.return{box-sizing:border-box;outline:1px solid #e7e7e7}.giftSelectorView-friendRow-action.claim:hover,.giftSelectorView-friendRow-action.return:hover{box-shadow:0 0 1px #000 inset,0 -1px 1px #fff inset}.giftSelectorView-friendRow.new .giftSelectorView-friend-image:after{top:-4px;left:-4px;border-radius:4px;box-shadow:none}.mh-dark-mode #giftSelectorView-inbox,.mh-dark-mode .giftSelectorView-inboxGiftOfTheDay{border-color:#424242}.mh-dark-mode .pageFrameView #mousehuntContainer.PageCamp .campPage-trap-statsContainer:hover{background-color:#494949}.complete .giftSelectorView-inbox-gift-details{margin-right:150px;margin-left:0}\n';

  // src/modules/better-gifts/index.js
  var getIgnoredGifts = () => {
    const ignored = getSetting("better-gifts.ignore-bad-gifts-0", "skip");
    const skipOptions = {
      skip: ["mozzarella_cheese", "stale_cheese", "stale_cheese_craft_item"],
      "no-skip": [],
      mozzarella: ["mozzarella_cheese"],
      stale: ["stale_cheese_craft_item"],
      sludge: ["radioactive_sludge"],
      "mozzarella-stale": ["mozzarella_cheese", "stale_cheese_craft_item"],
      "mozzarella-sludge": ["mozzarella_cheese", "radioactive_sludge"],
      "stale-sludge": ["stale_cheese_craft_item", "radioactive_sludge"]
    };
    return skipOptions[ignored] || skipOptions.skip;
  };
  var claimGifts = (send = false, retries = 0) => __async(void 0, null, function* () {
    hg.views.GiftSelectorView.show();
    const isLoaded = document.querySelector(".giftSelectorView-tabContent.active .giftSelectorView-friendRow");
    if (!isLoaded) {
      if (retries <= 10) {
        setTimeout(() => {
          claimGifts(send, retries + 1);
        }, 250);
      }
      return;
    }
    let gifts = hg.views.GiftSelectorView.getClaimableGiftsSortedByTime();
    if (getSetting("better-gifts.send-order-0", "default") === "reverse") {
      gifts.reverse();
    }
    const ignoredGifts = getIgnoredGifts();
    let sendLimit = hg.views.GiftSelectorView.getNumSendableActionsRemaining();
    let claimLimit = hg.views.GiftSelectorView.getNumClaimableActionsRemaining();
    gifts = gifts.filter((gift) => {
      if (gift.channel !== "gift") {
        return false;
      }
      if (ignoredGifts.includes(gift.item_type)) {
        return false;
      }
      return true;
    });
    for (const gift of gifts) {
      let verb = send ? "return" : "claim";
      if (send && sendLimit > 0 && gift.is_returnable) {
        verb = "return";
      }
      const giftEl = document.querySelector(`.giftSelectorView-friendRow[data-gift-id="${gift.gift_id}"] .giftSelectorView-friendRow-action.${verb}`);
      if (!giftEl) {
        continue;
      }
      const event = { target: giftEl };
      if (send && "return" === verb && sendLimit > 0) {
        hg.views.GiftSelectorView.selectReturnableGift(event, giftEl);
        sendLimit--;
        claimLimit--;
      } else if (!send && "claim" === verb && claimLimit > 0) {
        hg.views.GiftSelectorView.selectClaimableGift(giftEl);
        claimLimit--;
      }
    }
    setTimeout(() => {
      const confirm = document.querySelector(".mousehuntActionButton.giftSelectorView-action-confirm.small");
      if (confirm) {
        setTimeout(() => {
          hg.views.GiftSelectorView.submitConfirm(confirm);
        }, 250);
      }
    }, 500);
  });
  var makeAcceptButton = (buttonContainer, isTiny = false) => {
    const acceptButton = makeElement("button", ["mh-gift-button", "mh-gift-buttons-accept", "mousehuntActionButton"]);
    makeElement("span", "mousehuntActionButton-text", "Accept All", acceptButton);
    if (isTiny) {
      acceptButton.classList.add("tiny");
    }
    const acceptLimit = document.querySelector(".giftSelectorView-numClaimActionsRemaining");
    if (acceptLimit && acceptLimit.innerText === "0") {
      acceptButton.classList.add("disabled");
    } else {
      acceptButton.addEventListener("click", () => {
        claimGifts();
      });
    }
    buttonContainer.append(acceptButton);
  };
  var makeReturnButton = (buttonContainer, isTiny = false) => {
    const returnWrapper = makeElement("div", "mh-gift-buttons-return-wrapper");
    const returnButton = makeElement("button", ["mh-gift-button", "mh-gift-buttons-return", "mousehuntActionButton"]);
    makeElement("span", "mousehuntActionButton-text", "Accept & Return All", returnButton);
    if (isTiny) {
      returnButton.classList.add("tiny");
    }
    const returnLimit = document.querySelector(".giftSelectorView-numSendActionsRemaining");
    if (returnLimit && returnLimit.innerText === "0") {
      returnButton.classList.add("disabled");
    } else {
      returnButton.addEventListener("click", () => {
        claimGifts(true);
      });
    }
    returnWrapper.append(returnButton);
    buttonContainer.append(returnWrapper);
  };
  var fixTypo = () => {
    replaceInTemplate("ViewGiftSelector", [
      [
        "You can send 1 free gifts",
        "You can send 1 free gift"
      ],
      [
        "<b>1</b> free gifts",
        "<b>1</b> free gift"
      ]
    ]);
  };
  var lineBreakGiftFooter = () => {
    replaceInTemplate("GiftSelectorView", [
      [
        "more free gifts today. You can",
        'more free gifts today. <p class="mh-ui-footer-gifts-second-line">You can'
      ],
      [
        'class="giftSelectorView-inboxHeader-closeButton" onclick="hg.views.GiftSelectorView.hideInbox(); return false;">Close</a>',
        'class="giftSelectorView-inboxHeader-closeButton" onclick="hg.views.GiftSelectorView.hideInbox(); return false;">\u2715</a>'
      ]
    ]);
  };
  var getButtons = (className = false, isTiny = false) => {
    const buttonContainer = document.createElement("div");
    buttonContainer.id = "bulk-gifting-gift-buttons";
    if (className) {
      buttonContainer.classList.add(className);
    }
    makeAcceptButton(buttonContainer, isTiny);
    makeReturnButton(buttonContainer, isTiny);
    return buttonContainer;
  };
  var makeButtons = () => {
    if (document.querySelector("#bulk-gifting-gift-buttons")) {
      return;
    }
    const buttonContainer = document.createElement("div");
    buttonContainer.id = "bulk-gifting-gift-buttons";
    makeAcceptButton(buttonContainer);
    makeReturnButton(buttonContainer);
    const giftFooter = document.querySelector(".giftSelectorView-inbox-footer");
    if (giftFooter && giftFooter.firstChild) {
      giftFooter.insertBefore(buttonContainer, giftFooter.firstChild);
    }
  };
  var getLimit = () => {
    const limitEl = document.querySelector(".giftSelectorView-tabContent.active .giftSelectorView-actionLimit.giftSelectorView-numSendActionsRemaining");
    limit = limitEl ? Number.parseInt(limitEl.innerText, 10) : 0;
    return limit;
  };
  var pickFriends = (friends, useRandom = true) => {
    const selected = [];
    let sent = 0;
    if (useRandom) {
      const bound = friends.length > 35 ? 35 : friends.length;
      const firstRandom = Math.floor(Math.random() * bound);
      selected.push(firstRandom);
      sent++;
    }
    let limit2 = getLimit();
    while (sent < limit2) {
      if (selected.length >= friends.length) {
        break;
      }
      if (useRandom) {
        const random = Math.floor(Math.random() * friends.length);
        if (selected.includes(random)) {
          continue;
        }
        selected.push(random);
      } else {
        selected.push(sent);
      }
      sent++;
      limit2 = getLimit();
    }
    selected.forEach((index) => {
      friends[index].click();
    });
    if (getLimit() < 1) {
      const buttons = document.querySelectorAll(".mh-gift-buttons");
      buttons.forEach((button) => {
        button.classList.add("disabled");
      });
    }
  };
  var addSendButton = (className, text, selector, buttonContainer) => {
    const existing = document.querySelector(`.mh-gift-buttons-send-${className}`);
    if (existing) {
      existing.remove();
    }
    const sendButton = makeElement("button", ["mousehuntActionButton", "tiny", "mh-gift-buttons", `mh-gift-buttons-send-${className}`]);
    makeElement("span", "mousehuntActionButton-text", text, sendButton);
    const limit2 = getLimit();
    if (limit2 && limit2 < 1) {
      sendButton.classList.add("disabled");
    }
    sendButton.addEventListener("click", () => {
      const friends = document.querySelectorAll(selector);
      if (!friends.length) {
        return;
      }
      if ("faves" === className) {
        pickFriends(friends, false);
      } else {
        pickFriends(friends);
      }
    });
    buttonContainer.append(sendButton);
  };
  var addRandomSendButton = () => {
    const _selectGift2 = hg.views.GiftSelectorView.selectGift;
    hg.views.GiftSelectorView.selectGift = (gift) => {
      _selectGift2(gift);
      const title = document.querySelector(".giftSelectorView-tabContent.active .selectFriends .giftSelectorView-content-title");
      if (!title) {
        return false;
      }
      addSendButton("random", "Select Random Friends", ".giftSelectorView-tabContent.active .giftSelectorView-friend:not(.disabled, .selected)", title);
      addSendButton("faves", "Select Frequent Gifters", ".giftSelectorView-tabContent.active .giftSelectorView-friend-group.favorite .giftSelectorView-friend:not(.disabled, .selected)", title);
    };
  };
  var _showTab;
  var _selectGift;
  var _updateGiftMultiplierQuantity;
  var addGiftSwitcher = () => {
    if (_showTab || _selectGift || _updateGiftMultiplierQuantity) {
      return;
    }
    _showTab = hg.views.GiftSelectorView.showTab;
    _selectGift = hg.views.GiftSelectorView.selectGift;
    _updateGiftMultiplierQuantity = hg.views.GiftSelectorView.updateGiftMultiplierQuantity;
    hg.views.GiftSelectorView.showTab = (tabType, viewState, preserveVariables, preserveActions) => {
      _showTab(tabType, viewState, preserveVariables, preserveActions);
      hg.views.GiftSelectorView.updateGiftMultiplierQuantity = (input) => {
        if (input && input.hasAttribute("maxlength")) {
          input.removeAttribute("maxlength");
        }
        return _updateGiftMultiplierQuantity(input);
      };
      hg.views.GiftSelectorView.selectGift = (gift) => {
        _selectGift(gift);
        const giftContainer = document.querySelector(".giftSelectorView-tabContent.active.selectFriends .giftSelectorView-content-leftBar");
        if (!giftContainer) {
          return false;
        }
        const existing = document.querySelector(".mh-gift-buttons-clone-wrapper");
        if (existing) {
          existing.remove();
        }
        const giftType = tabType === "send_free_gifts" ? "gift" : "paidgift";
        const gifts = document.querySelectorAll(`.active .selectGift .giftSelectorView-scroller.giftSelectorView-giftContainer .giftSelectorView-gift.sendable.${giftType}`);
        if (!gifts.length) {
          return;
        }
        const cloneWrapper = makeElement("div", "mh-gift-buttons-clone-wrapper");
        gifts.forEach((toClone) => {
          const clone = toClone.cloneNode(true);
          const giftWrap = makeElement("div", "giftSelectorView-content-leftBar-highlightBlock");
          giftWrap.append(clone);
          giftWrap.addEventListener("click", () => {
            const prevSelected = document.querySelectorAll(".mh-gift-buttons-clone-selected");
            prevSelected.forEach((el) => {
              el.classList.remove("mh-gift-buttons-clone-selected");
            });
            giftWrap.classList.add("mh-gift-buttons-clone-selected");
          });
          cloneWrapper.append(giftWrap);
        });
        giftContainer.append(cloneWrapper);
      };
    };
  };
  var addButtonsToDropdown = () => {
    const buttonLink = document.querySelector("#hgbar_freegifts");
    if (!buttonLink) {
      return;
    }
    buttonLink.addEventListener("click", () => {
      makeButtons();
    });
  };
  var addButtonsToPopup = () => {
    const actionRow = document.querySelector(".giftSelectorView-tabContentContainer .giftSelectorView-tabContent.active .giftSelectorView-actionContainer");
    if (!actionRow) {
      return;
    }
    const existing = document.querySelector(".mh-gift-buttons-send-popup");
    if (existing) {
      existing.remove();
    }
    const buttons = getButtons("mh-gift-buttons-send-popup", true);
    actionRow.insertBefore(buttons, actionRow.firstChild);
  };
  var main = () => {
    onRequest("users/socialGift.php", makeButtons);
    addButtonsToDropdown();
    onDialogShow("giftSelectorViewPopup", addButtonsToPopup);
    addRandomSendButton();
    addGiftSwitcher();
    fixTypo();
    lineBreakGiftFooter();
  };
  var init = () => __async(void 0, null, function* () {
    addStyles(styles_default, "better-gifts");
    main();
    onDeactivation("better-gifts", () => {
      const buttons = document.querySelectorAll(".mh-gift-buttons");
      buttons.forEach((button) => {
        button.remove();
      });
    });
  });
  var better_gifts_default = {
    id: "better-gifts",
    name: "Better Gifts",
    type: "better",
    default: true,
    description: "Quickly accept and return all your gifts as well as picking random friends to send to.",
    load: init,
    settings: settings_default
  };
  return __toCommonJS(better_gifts_exports);
})();
mhImprovedVersion = "0.0.0-userscript;"
mhImprovedPlatform = "userscript";
mhui.default.load();
migrateUserscript('Better Gifts / Gift Buttons', 'https://greasyfork.org/en/scripts/449489-mousehunt-gift-buttons');