Greasy Fork

Greasy Fork is available in English.

NGA Post Status Query

Check NGA post status.

当前为 2021-10-17 提交的版本,查看 最新版本

您需要先安装一个扩展,例如 篡改猴Greasemonkey暴力猴,之后才能安装此脚本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴Userscripts ,之后才能安装此脚本。

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

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

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

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

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

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

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

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

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

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

// ==UserScript==
// @name         NGA Post Status Query
// @namespace    http://greasyfork.icu/users/826221
// @version      1.0.1
// @description  Check NGA post status.
// @author       DSakura207
// @include      /^https?://(bbs\.ngacn\.cc|nga\.178\.com|bbs\.nga\.cn|ngabbs\.com)/.+/
// @require      http://greasyfork.icu/scripts/39014-nga-user-script-loader/code/NGA%20User%20Script%20Loader.js?version=809809
// @grant        none
// @license      GPL-3.0-or-later; https://www.gnu.org/licenses/gpl-3.0.txt
// ==/UserScript==

// This user script is inspired by http://greasyfork.icu/en/scripts/376589.
(function () {
  function init($) {
    let b = (commonui.PostQuery = {
      // Bit mask for post status
      statusFlag: {
        _POST_IF_COMMENT: { flag: 1, description: "此贴是评论" },
        _POST_IF_HIDDEN: { flag: 2, description: "此贴已隐藏" },
        _POST_IF_HAVE_COMMENT: { flag: 4, description: "此贴有评论" },
        _POST_UNKNOWN_BIT_4: { flag: 8, description: "未知状态4" },
        _POST_IF_EXTRA_USER_INFO: {
          flag: 16,
          description: "此贴在列表显示更多用户信息",
        },
        _POST_IF_REPORTED: { flag: 32, description: "此贴已被标记" },
        _POST_IF_NO_HINT: { flag: 64, description: "此贴不产生回复提示" },
        _POST_IF_FREE_EDIT: { flag: 128, description: "此贴无编辑期限" },
        _POST_MULTI_USE_1: {
          flag: 256,
          description: "此贴仅限自己回复/回复不受注册时间限制",
        },
        _POST_WAIT_FOR_AUDIT_1: { flag: 512, description: "此贴等待审核" },
        _POST_IF_LOCK: { flag: 1024, description: "此贴被锁定" },
        _POST_USER_PUNISHED_IN_POST: {
          flag: 2048,
          description: "此贴内有用户被处罚",
        },
        _POST_IF_HAS_AUTO_TRANSLATE: {
          flag: 4096,
          description: "此贴有版主翻译",
        },
        _POST_IF_HAS_ATTACHMENT: { flag: 8192, description: "此贴包含附件" },
        _POST_WAIT_FOR_AUDIT_2: { flag: 16384, description: "此贴等待审核" },
        _POST_IS_ST: { flag: 32768, description: "此贴是合集主题" },
        _POST_UNKNOWN_BIT_17: { flag: 65536, description: "未知状态17" },
        _POST_MULTI_USE_2: {
          flag: 131072,
          description: "不在联合版面中显示/锁定合集的全部主题",
        },
        _POST_MULTI_USE_3: {
          flag: 262144,
          description: "此贴是匿名发布/此主题新回复在前",
        },
        _POST_MULTI_USE_4: {
          flag: 524288,
          description: "此贴在主题列表中显示附件/合集子主题不上浮",
        },
        _POST_UNKNOWN_BIT_21: { flag: 1048576, description: "未知状态21" },
        _POST_MULTI_USE_5: {
          flag: 2097152,
          description: "版面镜像/此主题回复全部匿名",
        },
        _POST_UNKNOWN_BIT_23: { flag: 4194304, description: "未知状态23" },
        _POST_UNKNOWN_BIT_24: { flag: 8388608, description: "未知状态24" },
        _POST_MULTI_USE_6: {
          flag: 16777216,
          description: "此功能主题不上浮/此功能主题不显示子主题",
        },
        _POST_UNKNOWN_BIT_26: { flag: 33554432, description: "未知状态26" },
        _POST_MULTI_USE_7: {
          flag: 67108864,
          description: "此贴未通过审核/在主题列表中显示图片",
        },
        _POST_SHOW_RECENT_REPLY: {
          flag: 134217728,
          description: "在主题列表中显示最近回复",
        },
        _POST_UNKNOWN_BIT_29: { flag: 268435456, description: "未知状态29" },
        _POST_UNKNOWN_BIT_30: { flag: 536870912, description: "未知状态30" },
        _POST_ONLY_ONE_REPLY: {
          flag: 1073741824,
          description: "此贴只能回复一次",
        },
        _POST_UNKNOWN_BIT_32: { flag: 2147483648, description: "未知状态32" },
      },
      f: function (e) {
        const pidElement = $(e.currentTarget).parent().children("a[id]");
        console.debug(e.currentTarget);
        if (pidElement.length != 1) {
          console.error(
            "Expected 1 element, got " + pidElement.length + " elements"
          );
          return;
        }
        let pid = $(pidElement[0]).attr("id").match(/(\d+)/)[0];
        console.debug("PID from anchor: " + pid);
        if (pid == 0) {
          console.debug("Not a reply post, use TID!");
          let params = new URLSearchParams(
            document.location.search.substring(1)
          );
          let tid = params.get("tid");
          console.debug("TID is " + tid);
          $.get(`/read.php?tid=${tid}&lite=js`).done(function (data) {
            b.showData(data, tid, "thread");
          });
        } else {
          console.debug("PID is " + pid);
          $.get(`/read.php?pid=${pid}&lite=js`).done(function (data) {
            b.showData(data, pid, "post");
          });
        }
      },
      showData: function (data, pid, postType) {
        const typeName = postType.toUpperCase();
        // Convert from JSONP to JSON
        const index = data.indexOf("{");
        // Clean up NGA JSON.
        const rawData = data
          .substring(index)
          .replace(/[\u0000-\u001F\u007F-\u009F]/g, "");
        const postData = JSON.parse(rawData);
        // Post status
        const typeFlags = postData["data"]["__R"][0]["type"];
        // Thread status
        let typeFlags2 = postData["data"]["__T"]["type"];
        // POST status object
        let postStatusObj = {};
        // Thread status object
        let postStatusObj2 = {};
        // commonui.alert content array
        let postStatusArray = [];
        // Produce thread main or reply post status object.
        for (const [info, mask] of Object.entries(b.statusFlag)) {
          // Hack for JavaScript bitwise operation.
          // Thanks for https://stackoverflow.com/questions/6798111/bitwise-operations-on-32-bit-unsigned-ints
          let rc = (mask.flag & typeFlags) >>> 0;
          let rc2 = (mask.flag & typeFlags2) >>> 0;
          if (rc == mask.flag && postType === "post") {
            postStatusObj[info] = mask.description;
            postStatusArray.push(mask.description + ";");
          }
          if (rc2 == mask.flag && postType === "thread") {
            postStatusObj2[info] = mask.description;
            postStatusArray.push(mask.description + ";");
          }
        }
        // Output status object for reference
        console.debug(postStatusObj);
        console.debug(postStatusObj2);
        // Return when status is normal (0).
        if (postStatusArray.length == 0) {
          return;
        }
        commonui.alert(postStatusArray, `${typeName} ${pid}`);
      },
      r: function () {
        // Ensure only one handler is attached
        $("div.postInfo")
          .off("dblclick.PostQuery")
          .on("dblclick.PostQuery", b.f);
      },
      mo: new MutationObserver(function () {
        b.r();
      }),
    });

    b.r();

    b.mo.observe($("body")[0], {
      childList: true,
      subtree: true,
    });
  }

  (function check() {
    try {
      init(commonui.userScriptLoader.$);
    } catch (e) {
      setTimeout(check, 50);
    }
  })();
})();