Greasy Fork is available in English.

McbbsReviewServerHelperForUser

MRSHFU - 你的服务器发帖好助手

// ==UserScript==
// @name         McbbsReviewServerHelperForUser
// @version      0.1.03
// @description  MRSHFU - 你的服务器发帖好助手
// @author       萌萌哒丶九灬书
// @namespace    https://space.bilibili.com/1501743
// @mainpage     https://greasyfork.org/zh-CN/scripts/420651-mcbbsreviewserverhelperForUser/
// @supportURL   https://greasyfork.org/zh-CN/scripts/420651-mcbbsreviewserverhelperForUser/feedback
// @home-url     https://greasyfork.org/zh-TW/scripts/420651-mcbbsreviewserverhelperForUser/
// @homepageURL  https://greasyfork.org/zh-TW/scripts/420651-mcbbsreviewserverhelperforuser
// @license      GNU General Public License v3.0
// @create       2021-01-25
// @lastmodified 2023-07-29
// @note         0.1.03 更新: 1.修复了部分细节错误;
// @note         0.1.02 更新: 1.新增了新版版本号判定;
// @note         0.1.01 更新: 1.移除了旧版版本号判定;
// @note         0.1.00 更新: 1.发布了针对用户的版本;
// @note         新增、更改、修复、移除、精简、*可能*
// @match        *://www.mcbbs.net/thread-*
// @match        *://www.mcbbs.net/forum.php?mod=viewthread*
// @match        *://www.mcbbs.net/forum-serverpending*
// @match        *://www.mcbbs.net/forum.php?mod=forumdisplay&fid=296*
// @match        *://www.mcbbs.net/forum-server*
// @match        *://www.mcbbs.net/forum.php?mod=forumdisplay&fid=179*
// @match        *://www.mcbbs.net/forum-362*
// @match        *://www.mcbbs.net/forum.php?mod=forumdisplay&fid=362*
// @grant        GM_xmlhttpRequest
// @grant        GM_getResourceText
// @grant        GM_getValue
// @grant        GM_setValue
// @require      https://cdn.staticfile.org/jquery/1.12.4/jquery.min.js
// ==/UserScript==

(function() {
    'use strict';

    var jq = jQuery.noConflict();
    //jq名称重定义,避免冲突

    function isThisTitleJudged(str){
        //是否有判定标识
        var ZZ1 = /(🍃|🍁|🍂|✅|❌|🔔)+/;
        if(ZZ1.test(str)){
            return true;
        }else{
            return false;
        }
    }
    function ThreeDifferentTips(ele,str,info1,info2,info3){
    //顾名思义,添加了三种不同的tips
        if(ele > 0){
            str.html(function(i,origText){
                return '🍃' + origText + '🍃' + green(info1);
            });
        }else if(ele < 0) {
            str.html(function(i,origText){
                return '🍁' + origText + '🍁' + red(info2);
            });
        }else {
            str.html(function(i,origText){
                return '🍂' + origText + '🍂' + orange(info3);
            });
        };
    }

    function TrueOrFalsOrNull(ele,str,info2,info3){
    //顾名思义,添加了通过、不通过、NULL三种不同的tips
        if(ele > 0){
            str.html(function(i,origText){
                return '✅' + origText;
            });
        }else if(ele < 0) {
            str.html(function(i,origText){
                return '❌' + origText + '❌' + red(info2);
            });
        }else {
            str.html(function(i,origText){
                return '🔔' + origText + '🔔' + orange(info3);
            });
        };
    }

    function TrueOrFalse(ele,str,info2){
    //顾名思义,添加了通过、不通过两种不同的tips
        if(ele){
            str.html(function(i,origText){
                return '✅' + origText;
            });
        }else {
            str.html(function(i,origText){
                return '❌' + origText + '❌' + red(info2);
            });
        };
    }

    function OnlyFalse(ele,str,info2){
    //顾名思义,只添加了不通过的tip
        if(!ele){
            str.html(function(i,origText){
                return '❌' + red(info2) + origText;
            });
        };
    }

    function green(str){
    //文本快捷变绿
        if(str != ''){
            return '<font color="green">' + str + '</font>';
        }else{
            return '';
        }
    }

    function red(str){
    //文本快捷变红
        if(str != ''){
            return '<font color="red">' + str + '</font>';
        }else{
            return '';
        }
    }

    function orange(str){
    //文本快捷变橘
        if(str != ''){
            return '<font color="#A63C00">' + str + '</font>';
        }else{
            return '';
        }
    }

    var flag_ReviewTitleZZ = true;
    function ReviewTitleZZ(str){
        //正则判断标题
        //var ZZ = /^\[(电信|联通|移动|双线|多线|教育|港澳|台湾|欧洲|美洲|亚太|内网)\]([\u4e00-\u9fa5]|\w|\s|[\u0800-\u4e00])*(\s|)——(\s|).[^\[]*\[(\d|\.|X|x|\-)+]$/;
        //var ZZ = /^\[(电信|联通|移动|双线|多线|教育|港澳|台湾|欧洲|美洲|亚太|内网)\]([0-9a-zA-Z\u2160-\u217f\u3040-\u30ff\u31f0-\u31ff\u4e00-\u9fa5]|\s)+——([^\u2014]|\s)+\[(\-?((1\.\d{1,2}(\.(\d{1,2}|X|x))?)|(\d{2}w\d{2}[a-z]))){1,2}\]$/;
        /**
         * 全角英文:\u2160-\u217f Ⅰ-ⅿ
         * 日语:\u3040-\u30ff\u31f0-\u31ff ぀-ヿㇰ-ㇿ
         * 中文:\u4e00-\u9fa5 一-龥
         * 破折号:\u2014 —
         * 黑块:\u2588\u2589\u3013 █▉〓
         * emoji:\uD83C\uDF00-\uDFFF\uD83D\uDC00-\uDE4F\uD83D\uDE80-\uDEFF\u2700-\u27BF\uFE0F 🌀-�🐀-�🚀-�✀-➿️
        **/
        var ZZ = /^\[(电信|联通|移动|双线|多线|教育|港澳|台湾|欧洲|美洲|亚太|内网)\]([0-9a-zA-Z\u2160-\u217f\u3040-\u30ff\u31f0-\u31ff\u4e00-\u9fa5]|\s)+——([^\u2014\u2588\u2589\u3013\uD83C\uDF00-\uDFFF\uD83D\uDC00-\uDE4F\uD83D\uDE80-\uDEFF\u2700-\u27BF\uFE0F]|(\s))+\[(\-?((1\.\d{1,2}(\.(\d{1,2}|X|x))?)|(\d{2}w\d{2}[a-z]))){1,2}\]$/;
        if (ZZ.test(str)){
            return true;
        }else{
            flag_ReviewTitleZZ = false;
            return false;
        }
    }

    function UserPointZZ(ele){
        //正则判断数值是否为正(绿宝石&贡献)
        var ZZ = /^[0-9]*\s/;
        return ZZ.test(ele);
    }

    function trim(str){
        //通过正则,清空字符串左右的空白
        return str.replace(/(^\s*)|(\s*$)/g, "");
    }

    function ServerTitleName(str,SvrName){
        var PoZheHao = str.indexOf("—");
        //从左寻找 “—” 的位置
        var YouKuoHao = str.indexOf("]");
        //从左寻找 “]” 的位置
        var subStr = String(str.substring(YouKuoHao + 1,PoZheHao));
        //通过 “]” 和 “—” 定位服务器名称
        subStr = trim(subStr);
        SvrName = trim(SvrName);
        //使用trim函数,清空字符串左右的空白
        //console.log("sbS:" + subStr);
        //console.log("SN:" + SvrName);
        //用于debug输出↑
        if (subStr == SvrName){
            return 3;
        }
        else if (subStr + "服务器" == SvrName){
            return 2;
        }
        else if (subStr == SvrName + "服务器"){
            return 1;
        }
        else{
            return 0;
        };
    }
    var VersionList = ['1.20.1','1.20',
                       '1.19.4','1.19.3','1.19.2','1.19.1','1.19',
                       '1.18.2','1.18.1','1.18',
                       '1.17.1','1.17',
                       '1.16.5','1.16.4','1.16.3','1.16.2','1.16.1','1.16',
                       '1.15.2', '1.15.1', '1.15',
                       '1.14.4', '1.14',
                       '1.13.2', '1.13.1', '1.13',
                       '1.12.2', '1.12',
                       '1.11.2', '1.11',
                       '1.10.X',
                       '1.9.4', '1.9',
                       '1.8.X',
                       '1.7.10', '1.7.2',
                       '1.6.4'];
    var VersionList_X = ['1.6.X', '1.7.X', '1.8.X', '1.9.X', '1.10.X', '1.11.X', '1.12.X', '1.13.X', '1.14.X', '1.15.X','1.16.X','1.17.X','1.18.X','1.19.X','1.20.X'];
    var VersionList_x = ['1.6.x', '1.7.x', '1.8.x', '1.9.x', '1.10.x', '1.11.x', '1.12.x', '1.13.x', '1.14.x', '1.15.x','1.16.x','1.17.x','1.18.x','1.19.x','1.20.x'];
    function ServerVersionXS(str){
        //从VersionList调取.x的最大值,如果不是.x,传回原str
        for(var i = 0; i < VersionList_X.length; i++){
            if((str == VersionList_X[i])||(str == VersionList_x[i])){
                break;
            };
        };
        switch(i){
            case 14:
                //1.20.1
                return VersionList[VersionList.length - 37];
            case 13:
                //1.19.4
                return VersionList[VersionList.length - 35];
            case 12:
                //1.18.2
                return VersionList[VersionList.length - 30];
            case 11:
                //1.17.1
                return VersionList[VersionList.length - 27];
            case 10:
                //1.16.5
                return VersionList[VersionList.length - 25];
            case 9:
                //1.15.2
                return VersionList[VersionList.length - 19];
            case 8:
                //1.14.4
                return VersionList[VersionList.length - 16];
            case 7:
                //1.13.2
                return VersionList[VersionList.length - 14];
            case 6:
                //1.12.2
                return VersionList[VersionList.length - 11];
            case 5:
                //1.11.2
                return VersionList[VersionList.length - 9];
            case 4:
                //1.10.x
                return VersionList[VersionList.length - 7];
            case 3:
                //1.9.4
                return VersionList[VersionList.length - 6];
            case 2:
                //1.8.x
                return VersionList[VersionList.length - 4];
            case 1:
                //1.7.10
                return VersionList[VersionList.length - 3];
            case 0:
                //1.6.4
                return VersionList[VersionList.length - 1];
            default:
                return str;
        };
    }
    function ServerVersionXE(str){
        //从VersionList调取.x的最小值,如果不是.x,传回原str
        for(var i = 0; i < VersionList_X.length; i++){
            if((str == VersionList_X[i])||(str == VersionList_x[i])){
                break;
            };
        };
        switch(i){
            case 14:
                //1.20
                return VersionList[VersionList.length - 36];
            case 13:
                //1.19
                return VersionList[VersionList.length - 31];
            case 12:
                //1.18
                return VersionList[VersionList.length - 28];
            case 11:
                //1.17
                return VersionList[VersionList.length - 26];
            case 10:
                //1.16
                return VersionList[VersionList.length - 20];
            case 9:
                //1.15
                return VersionList[VersionList.length - 17];
            case 8:
                //1.14
                return VersionList[VersionList.length - 15];
            case 7:
                //1.13
                return VersionList[VersionList.length - 12];
            case 6:
                //1.12
                return VersionList[VersionList.length - 10];
            case 5:
                //1.11
                return VersionList[VersionList.length - 8];
            case 4:
                //1.10.x
                return VersionList[VersionList.length - 7];
            case 3:
                //1.9
                return VersionList[VersionList.length - 5];
            case 2:
                //1.8.x
                return VersionList[VersionList.length - 4];
            case 1:
                //1.7.2
                return VersionList[VersionList.length - 2];
            case 0:
                //1.6.4
                return VersionList[VersionList.length - 1];
            default:
                return str;
        };
    }
    function SwitchLength(str1, str2){
        for(var i = 0; i < str2.length; i++){
            //在str2里遍历,直到找到str1位置
            if(str1 == str2[i]){
                return i;
            };
        };
    }
    function isServerVersionSelectTRUE(str1, str2, ServerVersion){
        //ServerVersion为模板选择的版本号
        var sv1_Diff = SwitchLength(ServerVersionXE(str1), VersionList) - SwitchLength(ServerVersionXS(str1), VersionList);
        //sv1在VersionList的.x区间长度
        var sv1_Diff2 = SwitchLength(ServerVersionXE(str1), ServerVersion) - SwitchLength(ServerVersionXS(str1), ServerVersion);
        //sv1在模板的.x区间长度
        if(str2 == null ){
            if (sv1_Diff == sv1_Diff2){
                return 1;
            }else{
                return -1;
            }
        }else{
            var sv2_Diff = SwitchLength(ServerVersionXE(str2), VersionList) - SwitchLength(ServerVersionXS(str2), VersionList);
            //sv2在VersionList的.x区间长度
            var sv2_Diff2 = SwitchLength(ServerVersionXE(str2), ServerVersion) - SwitchLength(ServerVersionXS(str2), ServerVersion);
            //sv2在模板的.x区间长度
            if ((sv1_Diff == sv1_Diff2) && (sv2_Diff == sv2_Diff2)){
                return 1;
            }else{
                return -1;
            }
        }
    }
    function ServerVersionTips(str1){
        var str2 = jq(".cgtl.mbm tbody tr td").eq(2).text();
        var ServerVersion = trim(str2)
        ServerVersion = ServerVersion.split(/\s+/);
        if (str1 > 0){
            if (ServerVersion.length > 5){
                ThreeDifferentTips(-1, jq(".cgtl.mbm tbody tr td").eq(2), "", "你确定有这么多核心?", "")
            }else{
                ThreeDifferentTips(1, jq(".cgtl.mbm tbody tr td").eq(2), "新版版规判定正确", "", "")
            }
        }else{
            OnlyFalse(-1, jq(".cgtl.mbm tbody tr td").eq(2), "模板版本号与标题不符")
        }
    }
    function getServerVersion(str1, str2){
        var strL = str1.lastIndexOf("[");
        var strR = str1.lastIndexOf("]");
        var subStr = String(str1.substring(strL + 1,strR));
        subStr = trim(subStr);
        var ServerVersion = trim(str2)
        ServerVersion = ServerVersion.split(/\s+/);
        //ServerVersion为模板选择的核心版本号
        var ZZ5 = /^1\.\d{1,2}(\.(\d{1,2}|X|x))?\-\d{2}w\d{2}[a-z]$/
        //1.7.x-20w05a
        var ZZ4 = /^\d{2}w\d{2}[a-z]$/;
        //20w05a
        var ZZ3 = /^1\.\d{1,2}(\.(\d{1,2}|X|x))?\-1\.\d{1,2}(\.(\d{1,2}|X|x))?$/;
        //1.7.x-1.12.x
        var ZZ2 = /^1\.\d{1,2}(\.\d{1,2})?$/;
        //1.7.10
        var ZZ1 = /^1\.\d{1,2}\.(X|x)$/;
        //1.7.x
    /*
        console.log("sbS:" + subStr);
        console.log("SvS:" + ServerVersion[0] + "; SvE:" + ServerVersion[ServerVersion.length - 1]);
        console.log("SvL:" + ServerVersion.length);
        console.log("VlS:" + VersionList[0] + "; VlE:" + VersionList[VersionList.length - 1]);
        console.log("VlL:" + VersionList.length);
        console.log(ZZ5.test(subStr));
        console.log(ZZ4.test(subStr));
        console.log(ZZ3.test(subStr));
        console.log(ZZ2.test(subStr));
        console.log(ZZ1.test(subStr));
        ↑调试用
    */
        if(ZZ5.test(subStr) && ServerVersion[ServerVersion.length - 1] == '其他版本'){
        /**
         * 标题为 1.7.2-20w05a 且勾选了 其他版本 的情况
         * 此为23年7月新版规规范
         */
            var TitleVersion5 = subStr.split('-');
            //TitleVersion为标题版本号
            trim(TitleVersion5[0]);
            trim(TitleVersion5[1]);
            //避免有人在-的左右加空格
            if(ZZ1.test(TitleVersion5[0])){
            //如果标题版本号1为.x
                if(isServerVersionSelectTRUE(TitleVersion5[0],null,ServerVersion)){
                //如果.x勾选正确
                    return 5;
                }else{
                    //标题中的版本号和模板不符 就直接return -3
                    return -3;
                };
            }else{
            //如果标题版本号1为.数字
                if(TitleVersion5[0] == ServerVersion[ServerVersion.length - 2]){
                    //判定标题中 左侧的版本号 是否和 模板倒数第二个(倒数第一为其他版本) 相符合
                    return 5;
                }else{
                    //标题中的版本号和模板不符 就直接return -3
                    return -3;
                };
            }
        }else if(ZZ4.test(subStr) && ServerVersion[ServerVersion.length - 1] == '其他版本'){
        /**
         * 标题为20w05a 且模板勾选了 其他版本 的情况
         */
            if (ServerVersion.length > 1 ){
                //模板选择多版本,标题选择单版本的情况 return -1
                return -1;
            }else{
                //模板有且仅有一个'其他版本'时 return 4
                return 4;
            }
        }else if(ZZ3.test(subStr)){
        /**
         * 标题为 1.7.x-1.12.x 多版本的情况
         * 23年7月新版规
         */
            var TitleVersion3 = subStr.split('-');
            //TitleVersion为标题版本号
            trim(TitleVersion3[0]);
            trim(TitleVersion3[1]);
            //避免有人在-的左右加空格
            //console.log("TV1:" + TitleVersion3[0] + "; TV2:" + TitleVersion3[1]);
            // ↑ 调试用 ↑ 
                if(ZZ1.test(TitleVersion3[0]) && ZZ1.test(TitleVersion3[1])){
                //如果标题版本号1和2均为.x
                //console.log("tv1");
                // ↑ 调试用 ↑ 
                    if(isServerVersionSelectTRUE(TitleVersion3[0], TitleVersion3[1], ServerVersion)){
                    //如果.x勾选正确
                        return 3;
                    }else{
                        //标题中的版本号和模板不符 就直接return -3
                        return -3;
                    };
                }else if(ZZ1.test(TitleVersion3[0])){
                //如果标题版本号1为.x,标题版本号2为.2
                //console.log("tv2");
                // ↑ 调试用 ↑ 
                    if(isServerVersionSelectTRUE(TitleVersion3[0], null, ServerVersion) && (TitleVersion3[1] == ServerVersion[0])){
                    //标题版本号1勾选正确,标题版本号2是否为模板版本号第一个
                        return 3;
                    }else{
                        //标题中的版本号和模板不符 就直接return -3
                        return -3;
                    };
                }else if(ZZ1.test(TitleVersion3[1])){
                //如果标题版本号1为.2,标题版本号2为.x
                //console.log("tv3");
                // ↑ 调试用 ↑ 
                    if((TitleVersion3[0] == ServerVersion[ServerVersion.length - 1]) && isServerVersionSelectTRUE(TitleVersion3[1], null, ServerVersion)){
                    //标题版本号1是否为模板版本号倒数第一个, 标题版本号2勾选正确
                        return 3;
                    }else{
                        //标题中的版本号和模板不符 就直接return -3
                        return -3;
                    };
                }else{
                //console.log("tv4");
                // ↑ 调试用 ↑ 
                //如果标题版本号1和2均为.2
                    if((TitleVersion3[0] == ServerVersion[ServerVersion.length - 1]) && (TitleVersion3[1] == ServerVersion[0])){
                    //标题版本号1是否为模板版本号倒数第一个,标题版本号2是否为模板版本号第一个
                        return 3;
                    }else{
                        //标题中的版本号和模板不符 就直接return -3
                        return -3;
                    };
                }
        }else if(ZZ2.test(subStr)){
        /** 
         * 标题为 1.7.2 单版本的情况
         */
            var TitleVersion2 = trim(subStr);
            if (ServerVersion.length > 1 ){
            //模板选择多版本,标题选择单版本的情况 return -1
                return -1;
            }
            if ((TitleVersion2 == ServerVersion[0]) || ((TitleVersion2 != ServerVersion[0]) && (ServerVersion[ServerVersion.length - 1] == '其他版本'))){
            //判定标题中的版本号是否和模板相符合 || 不符合的时候 是否选择了其他版本
                return 2;
            }else{
            //标题中的版本号和模板不符 就直接return -3
                return -3;
            };
        }else if(ZZ1.test(subStr)){
        /** 
         * 标题为 1.7.x 复合版本的情况, 23年7月新版规
         */
            var TitleVersion1 = trim(subStr);
            if(ZZ1.test(TitleVersion1)){
            //如果标题版本号1为.x
                if(isServerVersionSelectTRUE(TitleVersion1,null,ServerVersion)){
                //如果.x勾选正确
                    return 1;
                }else{
                    //标题中的版本号和模板不符 就直接return -3
                    return -3;
                };
            }else{
            //如果标题版本号1为.数字
                if(TitleVersion1 == ServerVersion[0]){
                    //判定标题中 左侧的版本号 是否和 模板第一个 相符合
                    return 1;
                }else{
                    //标题中的版本号和模板不符 就直接return -3
                    return -3;
                };
            }
        }else{
            //标题中的版本号和模板不符 就直接return -3
            return -3;
        };
    }

    function ServerIPAddress(str){
        var SvrIPAddress = trim(str);
        var ZZ3 = /((\w)+\.)+(\w)+(\:[0-9]+)?/;
        //正则匹配带端口或不带端口的域名地址
        var ZZ2 = /((2(5[0-5]|[0-4]\d))|[0-1]?\d{1,2})(\.((2(5[0-5]|[0-4]\d))|[0-1]?\d{1,2})){3}/;
        //正则匹配不带端口的IP地址
        var ZZ1 = /([\u4e00-\u9fa5]|\w|\s|[\u0800-\u4e00])+/;
        //正则匹配至少输入了点东西的
        if(ZZ3.test(SvrIPAddress)){
            return 3;
        }else if(ZZ2.test(SvrIPAddress)){
            return 2;
        }else if(ZZ1.test(SvrIPAddress)){
            return 1;
        }else{
            return 0;
        };
    }

    function ServerType(str){
        var strR = str.indexOf("»");
        //从左寻找 “»” 的位置
        var subStr = String(str.substring(0,strR));
        //从开头到 “»” 定位服务器类型
        subStr = trim(subStr);
        //console.log(subStr);
        if(subStr == "纯净服务器"){
            return 1;
        } else if(subStr == "Mod服务器"){
            return -1;
        } else if(subStr == "其他(下面注明)"){
            return 0;
        };
    }

    function ServerClientDownloadSet(str){
        var strL = str.indexOf("»");
        //从左寻找 “»” 的位置
        var strR = str.indexOf("下");
        //从左寻找 “下” 的位置
        var subStr = String(str.substring(strL + 1,strR));
        //通过 “»” 和 “下” 定位服务器是否需要下载专用客户端
        subStr = trim(subStr);
        if(subStr == "不需要"){
        //忽视内容,返回99
            return 99;
        } else if(subStr == "需要"){
            return -1;
        } else if(subStr == ""){
            return 0;
        };
    }

    function ServerClientDownload(str){
        var SvrCD = trim(str);
        var ZZ1 = /((\w)+\.)+(\w)+(\:[0-9]+)?/;
        var ZZ_1 = /^http(s)?\:\/\/(www.)?([\u4e00-\u9fa5]|\s|[\u0800-\u4e00]|)+(\w)*([0-9]+)*.com$/;
        var ZZ_2 = /jq\.qq\.com/;
        var ZZ_3 = /(群|君羊|裙)+/;
        var ZZ_4 = /mcbbs\.net/
        if(ZZ_4.test(SvrCD)){
            return -4;
        }else if(ZZ_3.test(SvrCD)){
            return -3;
        }else if(ZZ_2.test(SvrCD)){
            return -2;
        }else if(ZZ_1.test(SvrCD)){
            return -1;
        }else if(ZZ1.test(SvrCD)){
            return 1;
        }else {
            return 0;
        };
    }

    var flag_SeverBusinessConditionsWrite = false;
    //是否正确填写,正确填写为true,填写错误为false
    var flag_SeverBusinessConditionsValue = false;
    //是否为公益服,公益服为true,商业服为false
    function SeverBusinessConditions(str1,str2){
        var strR = str1.indexOf("服");
        //从左寻找 “服” 的位置
        var subStr = String(str1.substring(0,strR));
        //从头开始,通过 “服” 定位服务器是否公益
        var ZZ1 = /本服是公益服并且愿意承担虚假宣传的一切后果/;
        if(subStr == "公益"){
            if(ZZ1.test(str2)){
                //如果是公益服,且写明了标语,则返回中立
                flag_SeverBusinessConditionsValue = true;
                flag_SeverBusinessConditionsWrite = true;
                return 0;
            } else {
                //如果是公益服,没写明标语,则返回false
                flag_SeverBusinessConditionsValue = true;
                flag_SeverBusinessConditionsWrite = false;
                return -1;
            };
        } else if (subStr == "商业"){
            if(ZZ1.test(str2)){
                //如果是商业服,却写了标语,则返回false
                flag_SeverBusinessConditionsValue = false;
                flag_SeverBusinessConditionsWrite = false;
                return -1;
            } else {
                //如果是商业服,没写明标语,则返回true(unlimited)
                flag_SeverBusinessConditionsValue = false;
                flag_SeverBusinessConditionsWrite = true;
                return 99;
            };
        } else{
            //其他情况,返回false,提醒审核
            flag_SeverBusinessConditionsValue = false;
            flag_SeverBusinessConditionsWrite = false;
            return -1;
        };
    }

    function isAllEqual(array){
    //输入一个值,或是一个数组,判定其是否所有数值都相等;
        return array.every(function(value,i){
            return value == 1;
        });
    }

    function JudgeSameColor(str1,str2){
        //输入color1和color2,判定两个值是否在某个误差内
        var Dvalue = 15;
        var check = [];
        var str1L = str1.indexOf("(");
        var str1R = str1.indexOf(")");
        var subStr1 = String(str1.substring(str1L + 1,str1R));
        var Color1 = subStr1.split(', ');

        var str2L = str2.indexOf("(");
        var str2R = str2.indexOf(")");
        var subStr2 = String(str2.substring(str2L + 1,str2R));
        var Color2 = subStr2.split(', ');

        for(var i_1 = 0; i_1 < Color1.length; i_1++){
            if(Math.abs(Color1[i_1] - Color2[i_1]) <= Dvalue){
                check[i_1] = 1;
            }else{
                check[i_1] = 0;
            };
        };
        return isAllEqual(check);
    }

    var flag_BodyTextSize = true;
    var flag_BodyTextColor = true;
    var flag_BodyTextBGColor = true;
    var flag_BodyTextGGL = true;
    //设置全局变量 字体大小, 字体颜色, 背景颜色, 刮刮乐
    function BodyFont_Size_Color(str){
        var str_ZZ1 = /font\scolor/;
        var str_ZZ2 = /^<br>$/;
        var str_ZZ3 = /^\s+$/;
        var str_ZZ4 = /^\s$/;
        if (str_ZZ1.test(String(str.html()))){
            //如果内容中还包含‘font color’,跳出判断。
            //console.log('text: ' + str.text());
            //console.log('color: ' + cssFontColor);
            //console.log('flag_HTML: ' + String(str.html()));
            return true;
        }else if(str_ZZ2.test(str.html()) && trim(str.find("*").children().text()) == ''){
            //如果内容中只有‘<br>’且无其他内容时,跳出判断。
            //console.log('1_text: ' + str.text());
            //console.log('1_color: ' + cssFontColor);
            //console.log('1_flag_HTML: ' + String(str.html()));
            return true;
        }
        /* 旧版判断 if(trim(str.text()) == '' || trim(str.find("*").children().text()) != '' ) //如果内容为空,或依旧有内容时,直接返回true,即跳出判断; */
        var color = ['rgb(0, 255, 255)','rgb(255, 255, 0)','rgb(0, 255, 0)','rgb(36, 255, 36)','rgb(255, 0, 255)']
        var color_RGBA = ['rgba(0, 255, 255, 0)','rgba(255, 255, 0, 0)','rgba(0, 255, 0, 0)','rgba(36, 255, 36, 0)','rgba(255, 0, 255, 0)']
        //按顺序,分别为亮青色, 亮黄色, 亮绿色, 亮绿色, 亮粉色
        var flag_FontSize = true;
        var cssFontSize = str.css('font-size');
        //找到font-size的css,并提取
        var px = cssFontSize.indexOf('px');
        //找到px字符的位置
        var FontSize=cssFontSize.substring(0,px);
        //将px切割,保留数字字符
        if(parseInt(FontSize) > 24){
        //将string转换为int型,并判断
            flag_BodyTextSize = false;
            flag_FontSize = false;
        }
        var flag_FontColor = true;
        var cssFontColor = str.css('color');
        //var cssFontColor = str.getElementById('color').style.color;
        //找到color的css,并提取
        for (var i_color = 0; i_color < color.length; i_color++){
            if((JudgeSameColor(cssFontColor, color[i_color]) || JudgeSameColor(cssFontColor, color_RGBA[i_color])) && cssFontColor !='' && !str_ZZ3.test(str.text())){
                //判定RGB | RGBA | 是否为空 | 内容是否为多个空格
                console.log('2_text: ' + str.text());
                console.log('2_color: ' + cssFontColor);
                console.log('2_flag_HTML: ' + String(str.html()));
                console.log('2_color['+ i_color +']: ' + color[i_color] + 'RGBA['+ i_color +']: ' + color_RGBA[i_color]);
                console.log(str_ZZ3.test(str.text()));
            /*  调试用 暂时不删 ↑*/
                flag_BodyTextColor = false;
                flag_FontColor = false;
                break;
            }
        }
        var flag_FontBGColor = true;
        var cssFontBGColor = str.css("background-color");
        //var cssFontBGColor = str.getElementById('color').style.backgroundColor;
        //找到color的css,并提取
        for (var i_BGColor = 0; i_BGColor < color_RGBA.length; i_BGColor++){
            if((JudgeSameColor(cssFontBGColor, color[i_BGColor]) || JudgeSameColor(cssFontBGColor, color_RGBA[i_BGColor])) && cssFontBGColor !='' && !str_ZZ4.test(str.text())){
                console.log('3_text: ' + str.text());
                console.log('3_BGcolor: ' + cssFontBGColor);
                console.log('3_flag_HTML: ' + String(str.html()));
                console.log('3_BGcolor['+ i_BGColor +']: ' + color[i_BGColor] + 'RGBA['+ i_BGColor +']: ' + color_RGBA[i_BGColor]);
            /*  调试用 暂时不删 ↑*/
                flag_BodyTextBGColor = false;
                flag_FontBGColor = false;
                break;
            }
        }
        var flag_FontGGL = true;
        if (JudgeSameColor(cssFontBGColor, cssFontColor) && (cssFontBGColor != '' || cssFontColor != '') && !str_ZZ4.test(str.text())){
            console.log('4_text: ' + str.text());
            console.log('4_BGcolor: ' + cssFontBGColor);
            console.log('4_flag_HTML: ' + String(str.html()));
            console.log('4_BGcolor['+ i_BGColor +']: ' + color[i_BGColor] + 'RGBA['+ i_BGColor +']: ' + color_RGBA[i_BGColor]);
            /*  调试用 暂时不删 ↑*/
            flag_BodyTextGGL = false;
            flag_FontGGL = false;
        }

        return flag_FontSize && flag_FontColor && flag_FontBGColor && flag_FontGGL;
    }

    function BodyFontFlag(){
    //用于输出是否违规的tips
        var TipText = '';
        if(flag_BodyTextSize == false){
            TipText = TipText + red('❌字号大于5');
        }else{
            TipText = TipText + green('✅字号合规');
        };
        if(flag_BodyTextColor == false){
            TipText = TipText + '|' + red('❌亮色字体');
        }else{
            TipText = TipText + '|' + green('✅亮色字体');
        };
        if(flag_BodyTextBGColor == false){
            TipText = TipText + '|' + red('❌亮色背景');
        }else{
            TipText = TipText + '|' + green('✅亮色背景');
        };
        if(flag_BodyTextGGL == false){
            TipText = TipText + '|' + red('❌妨碍阅读的字体/背景');
        }else{
            TipText = TipText + '|' + green('✅其他颜色违规');
        };
        jq('.t_f').html(function(i,origText){
            return '<div align="center" class="FontSizeTipsDiv"><font size="4" class="FontSizeTips">' + TipText + '</font></div>' + origText;
        });
    }
    function CheckMultipleThread(){
    //一服多贴tips
        var UserHomeHref = jq('.avtm').attr("href");
        var ServerThreadHref = '&do=thread&from=space&fid=179';
        var TipText = '<a href="' + UserHomeHref + ServerThreadHref + '" class="CheckMultipleThread">' + orange('🔔检查一服多贴') + '</a>|'
        jq('.FontSizeTips').html(function(i,origText){
            return TipText + origText;
        });
    }

    function isNowInServerForum(str){
        var ZZ1 = />服务器</;
        var ZZ2 = />服务器审核区</;
        var ZZ3 = /服务器\/玩家评论<\/a>\s<em>›<\/em>/
        var ZZ4 = />人才市场<\/a>\s<em>›<\/em>/
        var ZZ5 = /服务器版块版规|公告/
        var ZZ10 = /gid=167/;
        //多人联机大区分区的固定URL
        if((ZZ1.test(str) || ZZ2.test(str)) && !ZZ3.test(str) && !ZZ4.test(str) && !ZZ5.test(str) && ZZ10.test(str)){
            return true;
        } else {
            return false;
        };
    }

    function isNull(str){
        str = trim(str);
        if(str == '' || str == '-' || str == '\\' || str == '/'){
            return 0;
        } else{
            return 1;
        }
    }
    function isNowPassOK(str){
    //判定是否能审核
        var ZZ1 = /待编辑|编辑中|讨论/;
        if(ZZ1.test(str)){
            return false;
        } else {
            return true;
        };
    }
    function checkServerTitleInForum(){
    //判定页面上的标题是否合格
        jq("th.common").each(function(){
            //用于判定标题是否合格
            //console.log(jq(".common").text());
            if(jq(this).parent().parent().find('a[title*="本版置顶主题"]').length <= 0 && jq(this).parent().parent().find('a[title*="分类置顶主题"]').length <= 0 && jq(this).parent().parent().find('a[title*="全局置顶主题"]').length <= 0){
                if(!isThisTitleJudged(jq(this).find(".s.xst").text())){
                    if(isNowPassOK(jq(this).text())){
                        //用于判定页面所有非编辑状态下的服务器帖的标题
                        TrueOrFalse(ReviewTitleZZ(jq(this).find(".s.xst").text()), jq(this).find(".s.xst"), '')
                    }else{
                        TrueOrFalsOrNull(0,jq(this).find(".s.xst"),'','');
                    };
                };
            };
            //console.log(jq(this).find(".s.xst").text());
        });
        jq("th.new").each(function(){
        //用于判定标题是否合格_new
            if(jq(this).parent().parent().find('a[title*="本版置顶主题"]').length <= 0 && jq(this).parent().parent().find('a[title*="分类置顶主题"]').length <= 0 && jq(this).parent().parent().find('a[title*="全局置顶主题"]').length <= 0){
                if(!isThisTitleJudged(jq(this).find(".s.xst").text())){
                    if(isNowPassOK(jq(this).text())){
                        TrueOrFalse(ReviewTitleZZ(jq(this).find(".s.xst").text()), jq(this).find(".s.xst"), '');
                    }else{
                        TrueOrFalsOrNull(0,jq(this).find(".s.xst"),'','');
                    };
                };
            };
        });
        ServerHighLightThreads();
    }
    function ServerHighLightThreads(){
        //感谢MCBBS Extender提供的思路
        jq("head").append(`<style id="ServerHighLightThreads">
                            .tl .icn.pass{
                                background-image: linear-gradient(90deg, rgba(022, 198, 012, 0.3), transparent);
                                border-left: 3px solid rgb(022, 198, 012);
                            }
                            .tl .icn.out{
                                background-image: linear-gradient(90deg, rgba(240, 058, 023, 0.3), transparent);
                                border-left: 3px solid rgb(240, 058, 023);
                            }
                            .tl .icn.wait{
                                background-image: linear-gradient(90deg, rgba(255, 200, 061, 0.3), transparent);
                                border-left: 3px solid rgb(255, 200, 061);
                            }
                            .tl .icn.closed{
                                background-image: linear-gradient(90deg, rgba(255, 129, 255, 0.3), transparent);
                                border-left: 3px solid rgb(255, 129, 255);
                            }
                            </style>`);
        jq('a[title*="关闭的主题"]').parent().addClass("closed");
        jq('th.common').find(".s.xst:contains('✅')").parent().parent().children(".icn").addClass("pass");
        jq('th.common').find(".s.xst:contains('❌')").parent().parent().children(".icn").addClass("out");
        jq('th.common').find(".s.xst:contains('🔔')").parent().parent().children(".icn").addClass("wait");
        jq('th.new').find(".s.xst:contains('✅')").parent().parent().children(".icn").addClass("pass");
        jq('th.new').find(".s.xst:contains('❌')").parent().parent().children(".icn").addClass("out");
        jq('th.new').find(".s.xst:contains('🔔')").parent().parent().children(".icn").addClass("wait");
    }
    function NextPageEventListener(_func){
        //用于监听下一页按钮,并重新审核标题
        if((jq('#autopbn').text() != '下一页 »') && (jq('#autopbn').css("display") !='none')){
            //console.log(1);
            setTimeout(function (){
                NextPageEventListener(_func);
            }, 250);
        }else{
            _func();
        }
    }
    function Old_point(){
        //积分还原
        var i = 0;
        jq(".pil.cl").each(function(){
            var str1 = jq(".pil.cl").eq(i).text();
            var str2 = jq(".i.y").children(".cl").eq(i).text();
            var jf = str2.match(/积分-?\d+/);
            var rq = str2.match(/人气-?\d+/);
            var gx = str2.match(/贡献-?\d+/);
            var ax = str2.match(/爱心-?\d+/);
            var jl = str1.match(/金粒-?\d+/);
            var bs = str1.match(/宝石-?\d+/);
            var zs = str2.match(/钻石-?\d+/);

            var jf_int = jf[0].match(/-?\d+/);
            var rq_int = rq[0].match(/-?\d+/);
            var gx_int = gx[0].match(/-?\d+/);
            var ax_int = ax[0].match(/-?\d+/);
            var jl_int = jl[0].match(/-?\d+/);
            var bs_int = bs[0].match(/-?\d+/);
            var zs_int = zs[0].match(/-?\d+/);

            var str3 = "<dt>积分</dt><dd>" + jf_int.toString() + "</dd>" +
                "<dt>人气</dt><dd>" + rq_int.toString() + " 点</dd>" +
                "<dt>贡献</dt><dd>" + gx_int.toString() + " 份</dd>" +
                "<dt>爱心</dt><dd>" + ax_int.toString() + " 心</dd>" +
                "<dt>金粒</dt><dd>" + jl_int.toString() + " 粒</dd>" +
                "<dt>绿宝石</dt><dd>" + bs_int.toString() + " 颗</dd>" +
                "<dt>钻石</dt><dd>" + zs_int.toString() + " 颗</dd>"
            jq(".pil.cl").eq(i).html(str3);
            i++;
        });
    }
    function Old_medal(){
        //勋章长度还原
        jq(".md_ctrl").css("max-height","5000px");
    }
    function CheckThreadIsFlashed(){
        //判定页面是否刷新
        jq('.t_f').eq(0).html(function(i,origText){
            return origText + '<div class="CheckThreadIsFlashed"></div>';
        });
    }
    /************************
     * 从这开始,为主函数
    **/
    var Flag_TitleTrue = true;
    var Flag_UserPoint_GX = true;
    var Flag_UserPoint_LBS = true;
    function js_main_thread_body(){
    //贴子内,内容检测
        Flag_UserPoint_GX = UserPointZZ(jq(".pil.cl dd").eq(2).text());
        TrueOrFalse(Flag_UserPoint_GX, jq(".pil.cl dd").eq(2), '');
        //eq(2)为贡献

        Flag_UserPoint_LBS = UserPointZZ(jq(".pil.cl dd").eq(5).text());
        TrueOrFalse(Flag_UserPoint_LBS, jq(".pil.cl dd").eq(5), '');
        //eq(5)为绿宝石

        TrueOrFalse(ServerTitleName(jq('#thread_subject').text(), jq(".cgtl.mbm tbody tr td").eq(0).text()) > 0 , jq(".cgtl.mbm tbody tr td").eq(0), '模板服务器名称与标题不符');
        //eq(0)为服务器名称
        //提取标题中的服务器名称后,和模板内服务器名称做对比

        ServerVersionTips(getServerVersion(jq('#thread_subject').text(), jq(".cgtl.mbm tbody tr td").eq(2).text()));
        //eq2为版本号
        //提取标题中的版本号后,和模板内版本号做对比

        jq('.t_f').find('font').each(function(){
            OnlyFalse(BodyFont_Size_Color(jq(this)), jq(this), '');
        });
        //console.log(flag_BodyTextSize);
        //用于debug输出是否有大于5号的字↑

        jq('.spoilerbody').each(function(){
            jq(this).css('display','block');
        })
        //展开所有的折叠页

        BodyFontFlag();
        //输出是否违规的tips

        CheckMultipleThread();
        //输出检查一服多贴的tips

        //console.log(jq(".cgtl.mbm tbody tr td").eq(14).text());
        //用于debug输出IP地址↑
        TrueOrFalse(ServerIPAddress(jq(".cgtl.mbm tbody tr td").eq(14).text()) >= 1 , jq(".cgtl.mbm tbody tr td").eq(14), '未在模板标注有效的IP地址/获取方式');
        //eq(14)为IP地址
        //使用正则来匹配IP地址

        TrueOrFalsOrNull(ServerClientDownload(jq(".cgtl.mbm tbody tr td").eq(11).text()) + ServerClientDownloadSet(jq(".cgtl.mbm tbody tr td").eq(9).text()), jq(".cgtl.mbm tbody tr td").eq(11), '未在模板标注有效的客户端下载地址', '记得测试一下是否有效');
        //eq(9)为服务器类型,eq(11)为客户端下载地址

        ThreeDifferentTips(ServerType(jq(".cgtl.mbm tbody tr td").eq(9).text()), jq(".cgtl.mbm tbody tr td").eq(9), '该服为“纯净”类型,注意Mod/插件', '', '只允许领域服选择“其他”类型');
        //eq(9)为服务器类型

        TrueOrFalsOrNull(SeverBusinessConditions(jq(".cgtl.mbm tbody tr td").eq(3).text(), jq('.t_f').text()), jq(".cgtl.mbm tbody tr td").eq(3), "公益服标语不合格", "需要注意其公益服标语");
        //eq(3)为服务器营利模式, jq('.t_f').text()为服务器内容

        /**
         * ↓↓最后执行↓↓
         */
        jq(".cgtl.mbm tbody tr td").each( function(){
            //用于判定模板是否有空
            OnlyFalse(isNull(jq(this).text()), jq(this), '该项为空');
        });
    };
    function js_main_thread_head(){
    //帖子内,标题部分
        Flag_TitleTrue = ReviewTitleZZ(jq('#thread_subject').text());
        TrueOrFalse(Flag_TitleTrue, jq('#thread_subject'), '');
        //通过正则表达式判断标题是否正确
    };

    function js_main_forum(){
    //在版块时运行的函数
        checkServerTitleInForum();
        //用于判定页面所有服务器帖的标题
        try{
            document.getElementById('autopbn').addEventListener('click', function(e){
            //监听下一页按钮触发click时,再次审核一遍
                NextPageEventListener(checkServerTitleInForum);
            }, false);
        }catch(err){
            "none";
        };
    };

    jq(document).ready(function(){
        if (isNowInServerForum(jq(".bm.cl").html())) {
        //判定在服务器版,执行以下操作;
            CheckThreadIsFlashed();
            //用于检测页面是否被刷新
            Old_point();
            //还原旧版积分
            Old_medal();
            //勋章长度还原
            js_main_forum();
            //在版块时运行的函数
            js_main_thread_head();
            js_main_thread_body();
            //在贴内的函数
            jq(".pl.bm").children("div").on('DOMNodeInserted',function(){
                //当内容被改变时,重新加载body部分函数
                if(jq(".CheckThreadIsFlashed").val() == undefined){
                    CheckThreadIsFlashed();
                    //用于检测页面是否被刷新
                    Old_point();
                    //还原旧版积分
                    Old_medal();
                    //勋章长度还原
                    js_main_thread_body();
                    //在贴内的函数
                }
            })
        }else{
        //判定不在服务器版,执行以下操作;
            CheckThreadIsFlashed();
            Old_point();
            //还原旧版积分
            Old_medal();
            //勋章长度还原
            jq(".pl.bm").children("div").on('DOMNodeInserted',function(){
                //当内容被改变时,重新加载body部分函数
                if(jq(".CheckThreadIsFlashed").val() == undefined){
                    CheckThreadIsFlashed();
                    //用于检测页面是否被刷新
                    Old_point();
                    //还原旧版积分
                    Old_medal();
                    //勋章长度还原
                }
            })
        };
    });
})();