Greasy Fork

Greasy Fork is available in English.

NGA优化摸鱼体验-拉黑增强

提供高级拉黑设置,可以针对匿名用户、负声望、负威望、回帖数、注册天数进行屏蔽,支持联合校验校验

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// ==UserScript==
// @name         NGA优化摸鱼体验-拉黑增强
// @namespace    https://github.com/kisshang1993/NGA-BBS-Script/tree/master/plugins/BlockEnhance
// @version      1.0.0
// @author       HLD
// @description  提供高级拉黑设置,可以针对匿名用户、负声望、负威望、回帖数、注册天数进行屏蔽,支持联合校验校验
// @license      MIT
// @match        *://bbs.nga.cn/*
// @match        *://ngabbs.com/*
// @match        *://nga.178.com/*
// @match        *://g.nga.cn/*
// @grant        unsafeWindow
// @run-at       document-start
// @inject-into  content
// ==/UserScript==

(function (registerPlugin) {
    'use strict';
    const BlockEnhance = {
        name: 'BlockEnhance',
        title: '拉黑增强',
        desc: '提供高级拉黑设置,可以针对匿名用户、负声望、负威望、回帖数、注册天数进行屏蔽,支持联合校验',
        requires: [
            '[email protected]',
            '[email protected]'
        ],
        settings: [{
            key: 'blockAnonymous',
            title: '屏蔽匿名用户',
            default: false
        }, {
            key: 'blockUnReputation',
            title: '屏蔽负声望用户',
            default: false
        }, {
            key: 'blockUnPrestige',
            title: '屏蔽负威望用户',
            default: false
        }, {
            key: 'blockByReplyCount',
            title: '屏蔽小于指定回帖数',
            desc: '≤0为无限制',
            default: 0
        }, {
            key: 'blockByRegDays',
            title: '屏蔽小于指定注册天数',
            desc: '≤0为无限制',
            default: 0
        }, {
            key: 'blockRule',
            title: '联合校验规则',
            desc: '对以下规则进行联合校验\n屏蔽负声望用户\n屏蔽负威望用户\n屏蔽小于指定回帖数\n屏蔽小于指定注册天数\n\n* 注意: [屏蔽匿名用户]不参与规则判断',
            default: 'OR',
            options: [{
                label: '其中一条满足(OR)',
                value: 'OR'
            }, {
                label: '所有规则同时满足(AND)',
                value: 'AND'
            }]
        }, {
            key: 'blockMode',
            title: '屏蔽方式',
            desc: '',
            default: 'HIDE',
            options: [{
                label: '隐藏并可手动查看',
                value: 'HIDE'
            }, {
                label: '直接删除楼层',
                value: 'DELETE'
            }]
        }],
        blockDict: {},
        renderThreadsFunc($el) {
            // 帖子列表隐藏匿名用户
            if (this.pluginSettings['blockAnonymous']) {
                const title = $el.find('.c2>a').text()
                const uid = ($el.find('.author').attr('href') && $el.find('.author').attr('href').indexOf('uid=') > -1) ? $el.find('.author').attr('href').split('uid=')[1] + '' : ''
                if (uid.startsWith('#anony')) {
                    this.mainScript.printLog(`${this.title}: 隐藏匿名用户:标题:${title}  连接:${$el.find('.c2>a').attr('href')}`)
                    $el.parents('tbody').remove()
                }
            }
        },
        renderFormsFunc($el) {
            const $ = this.mainScript.libs.$
            const currentUid = parseInt($el.find('[name=uid]').text())
            const userInfo = unsafeWindow.commonui.userInfo.users[currentUid]
            const author = $el.find('.c1 a.author.b').clone()
            author.find('.hld__post-author').remove()
            const currentUsername = author.text()
            // 匿名用户
            if (this.pluginSettings['blockAnonymous'] && currentUid <= 0) {
                this.blockDict[currentUsername] = '屏蔽匿名用户'
                this.blockContent($el, this.blockDict[currentUsername])
                return
            }
            // 常规用户
            if (currentUid > 0) {
                // 组合规则
                const rules = [
                    {
                        key: 'blockUnReputation',
                        label: '负声望',
                        active: this.pluginSettings['blockUnReputation'],
                        isHit: () => {
                            let reputation = ''
                            if (unsafeWindow.__CURRENT_FID) {
                                const currentReputations = unsafeWindow.commonui.userInfo.reputations
                                reputation = currentReputations?.[unsafeWindow.__CURRENT_FID]?.[currentUid] ?? ''
                            }
                            return reputation && parseInt(reputation) < 0
                        }
                    }, {
                        key: 'blockUnPrestige',
                        label: '负威望',
                        active: this.pluginSettings['blockUnPrestige'],
                        isHit: () => {
                            const prestige = unsafeWindow.commonui.userInfo.groups?.[userInfo.memberid]?.[0] ?? ''
                            return prestige.startsWith('警告')
                        }
                    }, {
                        key: 'blockByReplyCount',
                        label: `回帖数<${this.pluginSettings['blockByReplyCount']}`,
                        active: this.pluginSettings['blockByReplyCount'] > 0,
                        isHit: () => {
                            return userInfo.postnum < this.pluginSettings['blockByReplyCount']
                        }
                    }, {
                        key: 'blockByRegDays',
                        label: `注册天数<${this.pluginSettings['blockByRegDays']}`,
                        active: this.pluginSettings['blockByRegDays'] > 0,
                        isHit: () => {
                            return this.calcRegisterDays(userInfo.regdate).regDays < this.pluginSettings['blockByRegDays']
                        }
                    }
                ]
                // 规则命中判断
                if (this.pluginSettings['blockRule'] == 'OR') {
                    // OR
                    for (let rule of rules) {
                        if (rule.active && rule.isHit()) {
                            this.blockDict[currentUsername] = rule.label
                            this.blockContent($el, this.blockDict[currentUsername])
                            return
                        }
                    }
                }
                if (this.pluginSettings['blockRule'] == 'AND') {
                    // AND
                    const activeRules = rules.filter(r => r.active)
                    if (activeRules.every(r => r.isHit())) {
                        this.blockDict[currentUsername] = activeRules.map(r => r.label).join(', ')
                        this.blockContent($el, this.blockDict[currentUsername])
                    }
                }
            }
            // 处理引用的回复
            $el.find('.quote .userlink.b').each((_, quoteUser) => {
                const match = $(quoteUser).text().match(/\[([^[\]]*)\]/)
                if (match && match.length > 1) {
                    const quoteName = match[1]
                    if (this.blockDict[quoteName]) {
                        this.blockQuote($(quoteUser).parents('.quote'), this.blockDict[quoteName])
                    }
                }
            })
        },
        /**
         * 屏蔽正文
         */
        blockContent($el, reason) {
            const $ = this.mainScript.libs.$
            if (this.pluginSettings['blockMode'] == 'HIDE') {
                const $blocktips = $(`<div class="hld__banned hld__banned-block">此用户因被命中屏蔽规则而被隐藏言论,点击查看<br>* 命中规则: ${reason}</div>`)
                $el.find('.c2 .postcontent').hide()
                $el.find('.c2 .postcontent').after($blocktips)
            }
            if (this.pluginSettings['blockMode'] == 'DELETE') {
                $el.remove()
            }
        },
        /**
         * 屏蔽引用
         */
        blockQuote($el, reason) {
            if (this.pluginSettings['blockMode'] == 'HIDE') {
                if (!$el.is(':hidden')) {
                    $el.hide()
                    $el.after(`<div class="quote"><div class="hld__banned hld__banned-block">此用户因被命中屏蔽规则而被隐藏言论,点击查看<br>* 命中规则: ${reason}</div></div>`)
                }
            }
            if (this.pluginSettings['blockMode'] == 'DELETE') {
                $el.html(`<div class="hld__banned">此用户因被命中屏蔽规则已被删除言论<br>* 命中规则: ${reason}</div>`)
            }
        },
        /**
         * 计算注册天数
         */
        calcRegisterDays(regTimestamp) {
            const regSeconds = Math.ceil(new Date().getTime() / 1000) - regTimestamp
            return {
                regDays: Math.round(regSeconds / 3600 / 24),
                regYear: parseFloat((regSeconds / 3600 / 24 / 365).toFixed(1))
            }
        }
    }
    registerPlugin(BlockEnhance)

})(function(plugin) {
    plugin.meta = GM_info.script
    unsafeWindow.ngaScriptPlugins = unsafeWindow.ngaScriptPlugins || []
    unsafeWindow.ngaScriptPlugins.push(plugin)
});