xiaobaotong-monkey

自动记录和恢复小报童观看位置。

// ==UserScript==
// @name         xiaobaotong-monkey
// @namespace    npm/vite-plugin-monkey
// @version      0.0.1
// @author       Hn
// @description  自动记录和恢复小报童观看位置。
// @license      MIT
// @icon         https://vitejs.dev/logo.svg
// @match        https://xiaobot.net/*
// ==/UserScript==

(function () {
  'use strict';

  function getColumnName() {
    const titleElement = document.querySelector(".paper_title .name");
    return titleElement ? titleElement.innerText.trim() : null;
  }
  function restoreScrollPosition(columnName) {
    const scrollTop = localStorage.getItem(`scrollPosition_${columnName}`);
    if (scrollTop !== null) {
      const targetScrollTop = parseInt(scrollTop);
      const intervalId = setInterval(() => {
        const documentHeight = document.documentElement.scrollHeight;
        const currentScrollTop = window.scrollY;
        if (currentScrollTop >= targetScrollTop) {
          clearInterval(intervalId);
        } else if (targetScrollTop > documentHeight) {
          window.scrollTo(0, documentHeight);
        } else {
          window.scrollTo(0, targetScrollTop);
        }
      }, 1e3);
    }
  }
  let scrollHandler;
  function recordScrollPosition(columnName) {
    scrollHandler = () => {
      const scrollTop = window.scrollY;
      const screenHeight = window.innerHeight;
      const recordedScrollTop = localStorage.getItem(`scrollPosition_${columnName}`);
      const recordedScrollTopValue = recordedScrollTop ? parseInt(recordedScrollTop) : 0;
      if (scrollTop > screenHeight && scrollTop > recordedScrollTopValue) {
        localStorage.setItem(`scrollPosition_${columnName}`, scrollTop.toString());
      }
    };
    window.addEventListener("scroll", scrollHandler);
  }
  function isColumnPage() {
    return /https:\/\/xiaobot.net\/p\/.+/.test(window.location.href);
  }
  function handlePageLoad() {
    console.log("load");
    if (isColumnPage()) {
      const observer = new MutationObserver((mutations, observer2) => {
        const columnName = getColumnName();
        if (columnName) {
          console.log("isPage");
          console.log("name=", columnName);
          restoreScrollPosition(columnName);
          recordScrollPosition(columnName);
          observer2.disconnect();
        }
      });
      observer.observe(document.body, { childList: true, subtree: true });
    } else {
      if (scrollHandler) {
        window.removeEventListener("scroll", scrollHandler);
      }
    }
  }
  function checkPageLoadAndHandle() {
    if (isColumnPage()) {
      const columnName = getColumnName();
      if (columnName) {
        restoreScrollPosition(columnName);
        recordScrollPosition(columnName);
      } else {
        requestAnimationFrame(checkPageLoadAndHandle);
      }
    }
  }
  window.addEventListener("load", () => {
    handlePageLoad();
    checkPageLoadAndHandle();
  });
  window.addEventListener("popstate", handlePageLoad);
  window.addEventListener("pushstate", handlePageLoad);
  const originalPushState = history.pushState;
  history.pushState = function(...args) {
    const result = originalPushState.apply(this, args);
    window.dispatchEvent(new Event("pushstate"));
    return result;
  };
  const originalReplaceState = history.replaceState;
  history.replaceState = function(...args) {
    const result = originalReplaceState.apply(this, args);
    window.dispatchEvent(new Event("pushstate"));
    return result;
  };

})();