NGA Auto Pagerize

简单的自动翻页

目前为 2021-07-27 提交的版本。查看 最新版本

// ==UserScript==
// @name        NGA Auto Pagerize
// @namespace   https://greasyfork.org/users/263018
// @version     1.1.4
// @author      snyssss
// @description 简单的自动翻页

// @match       *://bbs.nga.cn/*
// @match       *://ngabbs.com/*
// @match       *://nga.178.com/*

// @grant       GM_registerMenuCommand
// @grant       GM_setValue
// @grant       GM_getValue
// @noframes
// ==/UserScript==

((ui) => {
  if (!ui) return;
  
  // KEY
  const ATTACHMENT_STYLE_ENABLE_KEY = "ATTACHMENT_STYLE_ENABLE";
  
  // 附件样式
  const attachmentStyleEnable = GM_getValue(ATTACHMENT_STYLE_ENABLE_KEY) || false;
  
  // 钩子
  const hookFunction = (object, functionName, callback) => {
    ((originalFunction) => {
      object[functionName] = function () {
        const returnValue = originalFunction.apply(this, arguments);

        callback.apply(this, [returnValue, originalFunction, arguments]);

        return returnValue;
      };
    })(object[functionName]);
  };

  // 翻页
  if (ui.pageBtn) {
    const delay = (interval) =>
      new Promise((resolve) => setTimeout(resolve, interval));

    const retry = async (fn, retriesLeft = 10, interval = 160) => {
      try {
        return await fn();
      } catch (error) {
        await delay(interval);

        if (retriesLeft > 0) {
          return await retry(fn, retriesLeft - 1, interval);
        }
      }
    };

    const execute = (() => {
      const observer = new IntersectionObserver((entries) => {
        if (entries.find((item) => item.isIntersecting)) {
          retry(() => {
            if (ui.loadReadHidden.lock) {
              throw new Error();
            }

            ui.loadReadHidden(0, 2);
          });
        }
      });

      return () => {
        const anchor = document.querySelector('[title="加载下一页"]');

        if (anchor) {
          observer.observe(anchor);
        } else {
          observer.disconnect();
        }
      };
    })();

    hookFunction(ui, "pageBtn", execute);

    execute();
  }

  // 移除重复内容
  if (ui.topicArg)
  {
    const execute = () => {
      ui.topicArg.data = ui.topicArg.data.reduce((accumulator, currentValue) => {
        const index = accumulator.findIndex((item) => item[8] === currentValue[8]);

        if (index < 0) {
          return [...accumulator, currentValue];
        }

        currentValue[0].closest("TBODY").remove();

        return accumulator;
      }, []);
    };
    
    hookFunction(ui.topicArg, "loadAll", execute);

    execute();
  }
  
  // 附件样式
  if (ui.topicArg && attachmentStyleEnable)
  {
    const execute = () => {
      const elements = document.querySelectorAll('[title="主题中有附件"]');
      
      elements.forEach((element) => {
          element.className = "block_txt white nobr vertmod";
          element.style = "background-color: #BD7E6D";
          element.innerHTML = "附件";
      })
    };

    hookFunction(ui.topicArg, "loadAll", execute);

    execute();
  }
  
  if (attachmentStyleEnable) {
    GM_registerMenuCommand('附件样式:启用', () => {
      GM_setValue(ATTACHMENT_STYLE_ENABLE_KEY, false);
      location.reload();
    });
  } else {
    GM_registerMenuCommand('附件样式:禁用', () => {
      GM_setValue(ATTACHMENT_STYLE_ENABLE_KEY, true);
      location.reload();
    });
  }
})(commonui);