// ==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 // @downloadURL https://update.greasyfork.icu/scripts/489633/NGA%E4%BC%98%E5%8C%96%E6%91%B8%E9%B1%BC%E4%BD%93%E9%AA%8C-%E6%8B%89%E9%BB%91%E5%A2%9E%E5%BC%BA.user.js // @updateURL https://update.greasyfork.icu/scripts/489633/NGA%E4%BC%98%E5%8C%96%E6%91%B8%E9%B1%BC%E4%BD%93%E9%AA%8C-%E6%8B%89%E9%BB%91%E5%A2%9E%E5%BC%BA.meta.js // ==/UserScript== (function (registerPlugin) { 'use strict'; const BlockEnhance = { name: 'BlockEnhance', title: '拉黑增强', desc: '提供高级拉黑设置,可以针对匿名用户、负声望、负威望、回帖数、注册天数进行屏蔽,支持联合校验', requires: [ 'mainScript@4.5.0', 'PostReadingRecord@1.0.0' ], 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 = $(`
此用户因被命中屏蔽规则而被隐藏言论,点击查看
* 命中规则: ${reason}
`) $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(`
此用户因被命中屏蔽规则而被隐藏言论,点击查看
* 命中规则: ${reason}
`) } } if (this.pluginSettings['blockMode'] == 'DELETE') { $el.html(`
此用户因被命中屏蔽规则已被删除言论
* 命中规则: ${reason}
`) } }, /** * 计算注册天数 */ 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) });