MouseHunt - TEM Catch Stats

Adds catch/crown statistics next to mouse names on the TEM

目前为 2019-07-22 提交的版本。查看 最新版本

// ==UserScript==
// @name         MouseHunt - TEM Catch Stats
// @author       Tran Situ (tsitu)
// @namespace    https://gf.qytechs.cn/en/users/232363-tsitu
// @version      1.6
// @description  Adds catch/crown statistics next to mouse names on the TEM
// @match        http://www.mousehuntgame.com/*
// @match        https://www.mousehuntgame.com/*
// ==/UserScript==

(function() {
  // Observers are attached to a *specific* element (will DC if removed from DOM)
  const observerTarget = document.getElementById("tabbarContent_page");
  if (observerTarget) {
    MutationObserver =
      window.MutationObserver ||
      window.WebKitMutationObserver ||
      window.MozMutationObserver;

    const observer = new MutationObserver(function() {
      // Callback
      const labels = document.getElementsByClassName(
        "campPage-trap-trapEffectiveness-difficultyGroup-label"
      );

      // Render if difficulty labels are in DOM
      if (labels.length > 0) {
        // Disconnect and reconnect later to prevent infinite mutation loop
        observer.disconnect();

        // Clear out old elements
        // Uses static collection instead of live one from getElementsByClassName
        document
          .querySelectorAll(".tsitu-tem-catches")
          .forEach(el => el.remove());

        render();

        observer.observe(observerTarget, {
          childList: true,
          subtree: true
        });
      }
    });

    observer.observe(observerTarget, {
      childList: true,
      subtree: true
    });
  }

  function postReq(form) {
    return new Promise((resolve, reject) => {
      const xhr = new XMLHttpRequest();
      xhr.open(
        "POST",
        `https://www.mousehuntgame.com/managers/ajax/users/profiletabs.php?action=badges&snuid=${
          user.sn_user_id
        }`,
        true
      );
      xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
      xhr.onreadystatechange = function() {
        if (this.readyState === XMLHttpRequest.DONE && this.status === 200) {
          resolve(this);
        }
      };
      xhr.onerror = function() {
        reject(this);
      };
      xhr.send(form);
    });
  }

  function render() {
    // Render crown image and catch number next to mouse name
    const rawStore = localStorage.getItem("mh-catch-stats");
    if (rawStore) {
      const stored = JSON.parse(rawStore);

      // Clean up ' Mouse' affixes
      const newStored = {};
      const storedKeys = Object.keys(stored);
      storedKeys.forEach(key => {
        if (key.indexOf(" Mouse") >= 0) {
          const newKey = key.split(" Mouse")[0];
          newStored[newKey] = stored[key];
        } else {
          newStored[key] = stored[key];
        }
      });

      const rows = document.querySelectorAll(
        ".campPage-trap-trapEffectiveness-mouse-name"
      );

      if (rows) {
        // Adjust container height
        document
          .querySelectorAll(".campPage-trap-trapEffectiveness-mouse")
          .forEach(el => {
            el.style.height = "auto";
          });

        rows.forEach(row => {
          const name = row.textContent;
          const catches = newStored[name];

          const span = document.createElement("span");
          span.className = "tsitu-tem-catches";

          const outer = document.createElement("span");
          outer.className = "mousebox";
          outer.style.verticalAlign = "bottom";
          outer.style.width = "auto";
          outer.style.height = "auto";
          outer.style.margin = "0px";

          const inner = document.createElement("span");
          if (catches >= 10 && catches < 100) {
            inner.className = "numcatches bronze";
          } else if (catches >= 100 && catches < 500) {
            inner.className = "numcatches silver";
          } else if (catches >= 500 && catches < 1000) {
            inner.className = "numcatches gold";
          } else if (catches >= 1000 && catches < 2500) {
            inner.className = "numcatches";
            inner.style.backgroundImage = platinumCrown;
          } else if (catches >= 2500 && catches < 5000) {
            inner.className = "numcatches";
            inner.style.backgroundImage = diamondCrown;
          } else if (catches >= 5000) {
            inner.className = "numcatches";
            inner.style.backgroundImage = masterCrown;
          }
          inner.style.backgroundSize = "contain";
          inner.style.paddingRight = "18px";
          inner.innerText = catches || 0;

          outer.appendChild(inner);
          span.appendChild(document.createElement("br"));
          span.appendChild(outer);
          row.appendChild(span);
        });
      }
    }

    // Render 'Refresh Data' button
    const refreshButton = document.createElement("button");
    refreshButton.id = "tem-catches-refresh-button";
    refreshButton.innerText = "Refresh Crown Data";
    refreshButton.addEventListener("click", function() {
      postReq("sn=Hitgrab&hg_is_ajax=1").then(res => {
        parseData(res);
      });
    });

    const bottomDiv = document.createElement("div");
    bottomDiv.className = "tsitu-tem-catches";
    bottomDiv.style.textAlign = "center";
    bottomDiv.appendChild(refreshButton);

    const timeRaw = localStorage.getItem("mh-catch-stats-timestamp");
    if (timeRaw) {
      const timeSpan = document.createElement("span");
      timeSpan.style.fontSize = "14px";
      timeSpan.innerText = `(Last refreshed: ${new Date(
        parseInt(timeRaw)
      ).toLocaleString()})`;
      bottomDiv.appendChild(document.createElement("br"));
      bottomDiv.appendChild(document.createElement("br"));
      bottomDiv.appendChild(timeSpan);
    }

    const container = document.getElementsByClassName(
      "campPage-trap-trapEffectiveness-content"
    )[0];
    if (container) container.appendChild(bottomDiv);
  }

  /**
   * Parse badge endpoint response and write to localStorage
   * @param {string} res
   */
  function parseData(res) {
    let response = null;
    try {
      if (res) {
        response = JSON.parse(res.responseText);
        const badgeData = response["mouse_data"];
        const remainData = response["remaining_mice"];
        const catchData = {};

        for (let key of Object.keys(badgeData)) {
          catchData[badgeData[key]["name"]] = badgeData[key]["num_catches"];
        }

        for (let el of remainData) {
          const split = el["name"].split(" (");
          catchData[split[0]] = parseInt(split[1][0]);
        }

        localStorage.setItem("mh-catch-stats", JSON.stringify(catchData));
        localStorage.setItem("mh-catch-stats-timestamp", Date.now());

        // Close and reopen to update badges (prevents infinite render loop)
        app.pages.CampPage.closeBlueprintDrawer();
        app.pages.CampPage.toggleTrapEffectiveness(true);
      }
    } catch (error) {
      console.log("Error while processing POST response");
      console.error(error.stack);
    }
  }

  // Base64 image assets
  const platinumCrown =
    "url('data:image/png;base64,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')";
  const diamondCrown =
    "url('data:image/png;base64,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')";
  const masterCrown =
    "url('data:image/png;base64,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')";
})();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址