Greasy Fork

Greasy Fork is available in English.

MT论坛

MT论坛效果增强,如自动签到、自动展开帖子、滚动加载评论、显示uid、屏蔽用户、手机版小黑屋、今日签到之星、今日签到排名、帖外预览图片、搜索框清空按钮修复、个人空间正确进入、康哥图床-帖子内(20MB)、Hello图床-帖子内(20MB)、Z4A图床-帖子内(50MB)、康哥图床-聊天内(20MB)、Hello图床-聊天内(20MB)、Z4A图床-聊天内(50MB)、付费主题白嫖提醒等

当前为 2022-08-12 提交的版本,查看 最新版本

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// ==UserScript==
// @name         MT论坛
// @namespace    http://tampermonkey.net/
// @description  MT论坛效果增强,如自动签到、自动展开帖子、滚动加载评论、显示uid、屏蔽用户、手机版小黑屋、今日签到之星、今日签到排名、帖外预览图片、搜索框清空按钮修复、个人空间正确进入、康哥图床-帖子内(20MB)、Hello图床-帖子内(20MB)、Z4A图床-帖子内(50MB)、康哥图床-聊天内(20MB)、Hello图床-聊天内(20MB)、Z4A图床-聊天内(50MB)、付费主题白嫖提醒等
// @version      2.4.6.6
// @author       WhiteSevs
// @icon         https://bbs.binmt.cc/favicon.ico
// @match        *://bbs.binmt.cc/*
// @compatible   edge Beta/Dev/Candy 测试通过
// @compatible   火狐 测试通过
// @compatible   Yandex 测试通过
// @compatible   Kiwi 测试通过
// @license      GPL-3.0-only
// @grant        GM_addStyle
// @grant        GM_setValue
// @grant        GM_getValue
// @grant        GM_deleteValue
// @grant        GM_setClipboard
// @grant        GM_xmlhttpRequest
// @run-at       document-start
// @supportURL   https://github.com/893177236/Monkey_script
// @require	     https://lf26-cdn-tos.bytecdntp.com/cdn/expire-1-M/jquery/3.4.1/jquery.min.js
// @require	     https://lf26-cdn-tos.bytecdntp.com/cdn/expire-1-M/nanogallery2/3.0.5/jquery.nanogallery2.min.js
// @require      http://greasyfork.icu/scripts/441331-md5/code/md5.js?version=1026891
// ==/UserScript==

(function () {
    'use strict';
    const log = {
        success: (str) => {
            console.log("%c" + str, "color: #81b453");
        },
        error: (str) => {
            console.trace("%c" + str, "color: #f20000");
        }
    }
    function tryCatch(func, params, errorFunc) { // 捕获错误
        try {
            func(params);
        } catch (error) {
            console.log("%c" + (func.name + "出现错误"), "color: #f20000");
            console.log("%c" + ("错误原因:" + error), "color: #f20000");
            window.eval(errorFunc);
        }
    }
    let mt_config = {
        dom_obj: {
            beauty_select: function () { //下拉列表对象
                return document.getElementsByClassName("beauty-select")[0];
            },
            combobox_switch: function () { //复选框对象
                return document.getElementsByClassName("whitesevcheckbox")[0];
            },
            comiis_verify: function () { //帖子内各个人的信息节点【list】
                return document.getElementsByClassName("comiis_verify");
            },
            comiis_formlist: function () { //导航中最新、热门、精华、恢复、抢沙发的各个帖子【list】
                return document.getElementsByClassName("forumlist_li");
            },
            comiis_mmlist: function () {
                return document.getElementsByClassName("comiis_mmlist");
            },
            comiis_postli: function () { //帖子内评论,包括帖子内容主体,第一个就是主体【list】
                return document.getElementsByClassName("comiis_postli comiis_list_readimgs nfqsqi")
            },
            post_bottom_controls: function () { // 帖子底部一栏控件
                return document.getElementsByClassName("comiis_znalist_bottom b_t cl")

            },
            post_list_of_comments: function () { //帖子内评论列表
                return $(".comiis_postlist.kqide");
            },
            post_next_commect: function () { //帖子内评论下一页的按钮
                return document.querySelector("div.comiis_page.bg_f>a:nth-child(3)");
            }
        },
        rexp: {
            search_url: /bbs.binmt.cc\/search.php/g, //搜索页
            chat_url: /home.php\?mod=space&do=pm&subop=view/g, // 聊天页
            home_url: /home.php\?mod=spacecp&ac=profile&op=info/g, //个人空间页
            home_url_brief: /home.php\?mod=space/g, //个人空间页简略url
            home_kmisign_url: /bbs.binmt.cc\/(forum.php\?mod=guide&view=hot(|&mobile=2)|k_misign-sign.html)/g, //主页和签到页链接
            home_space_url: /bbs\.binmt\.cc\/home\.php\?mod=space/g, //【我的】 个人信息页链接
            home_space_pc_uid_url: /space-uid-(.*?).html/, //PC 个人空间链接uid
            reply_forum: /bbs.binmt.cc\/forum.php\?mod=post&action=reply/g, // 回复的界面url
            sign_url: "",
            navigation_url: "",
            community_url: /forum.php\?forumlist/, //社区
            forum_post: /(bbs.binmt.cc\/thread-|bbs.binmt.cc\/forum.php\?mod=viewthread)/g, //帖子链接
            forum_post_pc: /.*:\/\/bbs.binmt.cc\/thread.*/, //帖子链接-PC
            forum_guide_url: /bbs.binmt.cc\/forum.php\?mod=guide/g, // 导航链接
            forum_post_reply: /forum.php\?mod=post&action=reply/g, //帖子中回复的链接
            forum_post_page: '&page=(.*)', //帖子链接的当前所在页 page
            forum_post_pc_page: 'thread-(.*?)-', //PC帖子链接的当前所在页 page
            forum_plate_text: /休闲灌水|求助问答|逆向教程|资源共享|综合交流|编程开发|玩机教程|建议反馈/g, //各版块名称
            plate_url: /bbs.binmt.cc\/forum-[0-9]{1,2}-[0-9]{1,2}.html/g, // 板块链接
            formhash: /formhash=(.*)&/, //论坛账号的凭证
            font_special: /<br>|&nbsp;|<font.*?>|<\/font>|<strike>|<strong>|<i>|<u>|align=".*?"/g, //帖子内特殊字体格式
            forum_post_guide_url: /bbs.binmt.cc\/page-[1-5].html|bbs.binmt.cc\/forum.php\?mod=guide/g, //帖子链接和导航链接
            mt_uid: /uid=(\d+)/,
            nologin: /member.php\?mod=logging&action=login(|&mobile=2)/g, //未登录
            pc_useragent: 'Windows', //pc识别
            k_misign_sign: "bbs.binmt.cc\/k_misign-sign.html",
            post_forum: /forum.php\?mod=post&action=newthread/, // 发布帖子
            edit_forum: /forum.php\?mod=post&action=edit/, // 编辑帖子
        }
    }

    // mt全屏遮罩调用
    //      popup.open('<img src="https://bbs.binmt.cc/template/comiis_app/comiis/img/imageloading.gif" class="comiis_loading comiis_noloadimage">');
    // 关闭方式
    //      popup.close()

    let utils = {
        dateStringFormatToStamp(datastring) {
            let date = datastring;
            date = date.substring(0, 19);
            date = date.replace(/-/g, '/');
            let timestamp = new Date(date).getTime();
            // let newDate = new Date(timestamp);
            return timestamp;
        },
        timeStringFormatToStamp(timestring) {
            let today = new Date();
            let date = today.getFullYear() + "-" + (today.getMonth() + 1) + "-" + today.getDate() + " " + timestring;
            date = date.substring(0, 19);
            date = date.replace(/-/g, '/');
            let timestamp = new Date(date).getTime();
            // let newDate = new Date(timestamp);
            return timestamp
        },
        listCompareDescByValue(propertyName) { // json根据 字段(int)降序
            return function (object1, object2) {
                var value1 = object1[propertyName];
                var value2 = object2[propertyName];
                if (value2 < value1) {
                    return -1;
                } else if (value2 > value1) {
                    return 1;
                } else {
                    return 0;
                }
            }
        },
        listCompareAscByValue(propertyName) { // json根据 字段(int)升
            return function (object1, object2) {
                var value1 = object1[propertyName];
                var value2 = object2[propertyName];
                if (value2 > value1) { //-1表示前对象小,1表示后对象小,0表示相等
                    return -1;
                } else if (value2 < value1) {
                    return 1;
                } else {
                    return 0;
                }
            }
        },
        listToStringByValue(_list_, propertyName) { // json根据 字段(int)合并
            let content = "";
            Array.from(_list_).forEach((item) => {
                content = content + item[propertyName];
            })
            return content
        }
    }

    async function compatiblePartialFunction() { // 兼容部分函数 GM_xmlhttpRequest没有兼容,跨域,考虑fetch,还是算了
        if (typeof GM_getValue == "undefined") {
            window.GM_getValue = (key) => {
                window.localStorage.getItem(key);
            }
        }
        if (typeof GM_setValue == "undefined") {
            window.GM_setValue = (key, value) => {
                window.localStorage.setItem(key, value);
            }
        }
        if (typeof GM_deleteValue == "undefined") {
            window.GM_deleteValue = (key) => {
                window.localStorage.removeItem(key);
            }
        }
        if (typeof GM_addStyle == "undefined") {
            window.GM_addStyle = (styleText) => {
                let cssDOM = document.createElement("style");
                cssDOM.setAttribute("type", "text/css");
                cssDOM.innerHTML = styleText;
                document.head.appendChild(cssDOM);
            }
        }
        if (typeof GM_setClipboard == "undefined") {
            window.GM_setClipboard = (text) => {
                let clipBoardDOM = document.createElement("input");
                clipBoardDOM.type = "text";
                clipBoardDOM.setAttribute("style", "opacity:0;position:absolute;");
                clipBoardDOM.id = "whitesevClipBoardInput";
                document.body.append(clipBoardDOM);
                $("#whitesevClipBoardInput").val(text);
                $("#whitesevClipBoardInput").removeAttr("disabled").select();
                document.execCommand('copy');
                $('#whitesevClipBoardInput').remove();
            }
        }
        
        if(typeof $ == "undefined"){
            await loadNetworkResource("https://lf26-cdn-tos.bytecdntp.com/cdn/expire-1-M/jquery/3.4.1/jquery.min.js");
        }
        if(typeof $.nanogallery2 == "undefined"){
            await loadNetworkResource("https://lf26-cdn-tos.bytecdntp.com/cdn/expire-1-M/nanogallery2/3.0.5/jquery.nanogallery2.min.js");
        }
        if(typeof hex_md5 == "undefined"){   
            await loadNetworkResource("http://greasyfork.icu/scripts/441331-md5/code/md5.js?version=1026891");
        }
        var loadNetworkResource = [];
        window.GM_asyncLoadScript = (url)=>{ // 异步执行js资源
            if(loadNetworkResource.indexOf(url) != -1){
                console.log("已加载该js:",url);
                return
            }
            loadNetworkResource = loadNetworkResource.concat(url);
            return new Promise(res => {
                GM_xmlhttpRequest({
                    url: url,
                    method: "GET",
                    async: false,
                    timeout: 10000,
                    onload: (r) => {
                        let execStatus = false;
                        try {
                            eval(r.response);
                            execStatus = true;
                        } catch (error) {
                            log.error("执行JS失败",error);
                            execStatus = false;
                        }
                        try {
                            window.eval(r.response);
                            execStatus = true;
                        } catch (error) {
                            log.error("执行JS失败",error);
                            execStatus = false;
                        }
                        res(execStatus);
                    },
                    onerror: () => {
                        log.error("网络异常,加载JS失败",url);
                        popup.open("网络异常,加载JS失败");
                        res(false);
                    }
                })
            })
        }
        window.GM_asyncLoadStyleSheet = (url) =>{ // 异步添加css资源
            if(loadNetworkResource.indexOf(url) != -1){
                console.log("已加载该css:",url);
                return
            }
            loadNetworkResource = loadNetworkResource.concat(url);
            GM_xmlhttpRequest({
                url: url,
                method: "GET",
                async: false,
                timeout: 10000,
                onload: (r) => {
                    GM_addStyle(r.response);
                },
                onerror: () => {
                    popup.open("网络异常,加载CSS失败");
                }
            })
        }
    }

    

    async function loadCheckboxTipResource() { // 加载checkbox值变化的显示的提示的资源
        await GM_asyncLoadScript("https://whitesev.gitee.io/static_resource/ios_loading/js/iosOverlay.js");
        await GM_asyncLoadStyleSheet("https://whitesev.gitee.io/static_resource/ios_loading/css/iosOverlay.css");
    }

    function repairPCNoLoadResource() { // 修复电脑版未加载的js资源
        GM_asyncLoadScript("https://cdn2.bbs.binmt.cc/static/js/smilies.js?x6L");
        GM_asyncLoadScript("https://cdn2.bbs.binmt.cc/static/js/common.js?x6L");
    }


    function latestReleaseForumPost() { // 最新发表
        var ele = document.createElement('li');
        var url = window.location.href;
        ele.id = "latest_publication";
        ele.innerHTML = '<a href="https:\/\/bbs.binmt.cc\/forum.php?mod=guide&view=newthread" hidefocus="true" title="最新发表">最新发表<\/a>';
        document.getElementsByClassName("wp comiis_nvbox cl")[0].children[1].appendChild(ele);
        if (url == 'https:\/\/bbs.binmt.cc\/forum.php?mod=guide&view=newthread') {
            document.getElementById("mn_forum_10").children[0].style = "background: url(";
            ele.style.cssText = 'background: url("https:\/\/cdn2.bbs.binmt.cc\/template\/comiis_mi\/img\/nv_a.png") repeat-x 50% -50px;';

        }
    }

    function removeForumPostFontStyle() { // 移除帖子内的字体style
        if (GM_getValue("v1") && location.href.match(mt_config.rexp.forum_post)) {
            var rule = mt_config.rexp.font_special;
            var h_content = document.getElementsByClassName("comiis_a comiis_message_table cl");
            h_content[0].innerHTML = h_content[0].innerHTML.replace(rule, '');
        }

    }

    

    

    function autoSignIn() { //mt签到
        function getFormHash() { // 获取账号的formhash
            return document.querySelector("input[name=formhash]") ? document.querySelector("input[name=formhash]").value : document.querySelector("div[class=sidenv_exit]>a").href.match(mt_config.rexp.formhash)[1];
        }
        function getLocalTime() { // 获取当前时间
            let GM_myDate = new Date;
            let GM_year = GM_myDate.getFullYear(); //获取当前年
            let GM_mon = GM_myDate.getMonth() + 1; //获取当前月
            let GM_date = GM_myDate.getDate();
            let GM_alldate = GM_year.toString() + GM_mon.toString() + GM_date.toString();
            GM_alldate = parseInt(GM_alldate);
            return GM_alldate
        }
        if (!GM_getValue("v17")) {
            console.log("尚未开启每日签到");
            return;
        }
        if (GM_getValue("mt_sign") == getLocalTime()) {
            console.log("今日已签到");
            return;
        }
        if ((document.querySelector("div[class=comiis_dlq]>a") != null) || (document.getElementsByClassName("sidenv_user")[0].href.match(mt_config.rexp.nologin) != null)) {
            console.log("当前账号尚未登录");
            return;
        }
        let mtFormHash = getFormHash();
        if (mtFormHash == null) {
            console.log("获取账号formhash失败");
            return;
        }

        $.get("/k_misign-sign.html?operation=qiandao&format=button&formhash=" + mtFormHash + "&inajax=1&ajaxtarget=midaben_sign", function (data, status) {
            console.log(data.responseText);
            GM_setValue("mt_sign", getLocalTime());
            window.location.reload();
        });

    }

    function searchHistory() { // 搜索历史
        if (GM_getValue("v19") && location.href.match(mt_config.rexp.search_url)) {
            function search_event() { // 搜索历史事件
                //搜索界面增加关闭按钮事件,清空input内容
                //点击搜索保存搜索记录
                $("#scform_submit").click(function () {
                    let getsearchtext = $("#scform_srchtxt").val();
                    if ((getsearchtext != null) && (getsearchtext != "")) {
                        let search_history_array = new Array(getsearchtext);
                        let has_history = GM_getValue("search_history");
                        if (has_history != null) {
                            if ($.inArray(getsearchtext, has_history) != -1) {
                                console.log("已有该搜索历史记录")
                                search_history_array = has_history
                            } else {
                                console.log("无该记录,追加");
                                search_history_array = search_history_array.concat(has_history);
                            }
                        } else {
                            console.log("空记录,添加")
                        }
                        GM_setValue("search_history", search_history_array);
                    }
        
                })
            }
            function add_search_history() { //搜索界面添加搜索历史记录
                $("#scform_srchtxt").attr("list", "search_history");
                var search_history_list = GM_getValue("search_history");
                var dom_datalist = document.createElement("datalist");
                dom_datalist.id = "search_history";
                var option_text = "";
                if (search_history_list) {
                    for (var i = 0; i < search_history_list.length; i++) {
                        option_text = option_text + '<option value="' + search_history_list[i] + '">';
                    }
                    dom_datalist.innerHTML = option_text;
                    $(".comiis_flex").append(dom_datalist);
                }
        
            }
            function add_clear_history() { //搜索界面添加清理历史记录和历史记录个数
                let search_history_list = GM_getValue("search_history");
                let search_history_nums = 0;
                if (search_history_list != null) {
                    search_history_nums = search_history_list.length;
                }
                let clear_history_innerHTML =
                    `<div class="comiis_p12 f14 bg_f f_c b_b cl" style="padding-bottom:10px">搜索记录个数: ` +
                    search_history_nums +
                    `<button class="btn_clear_search_history" style="
                    border: none;
                    float: right;
                    background: red;
                    color: #fff;
                    border-radius: 3px;
                    font-weight: 600;
                    min-width: 20vw;
                    width: 20vw;
                ">清理记录</button></div>`;
                let insertdom = $(".comiis_p12.f14.bg_f.f_c.b_b.cl,.comiis_tagtit.b_b.f_c");
                insertdom.before(clear_history_innerHTML);
                $(".btn_clear_search_history").click(function () {
                    GM_deleteValue("search_history");
                    window.location.reload();
                })
            }

            search_event();
            add_search_history();
            add_clear_history();
        }
    }
    
    function showTodayStar() { // 显示今日之星,在签到页上
        if (GM_getValue("v33") && window.location.href.match(mt_config.rexp.k_misign_sign)) {
            let todayStarParent = $(".pg_k_misign .comiis_qdinfo");
            let todayStar = document.createElement("ul");
            GM_xmlhttpRequest({
                url: "/k_misign-sign.html",
                method: 'get',
                async: false,
                headers: {
                    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.64 Safari/537.36 Edg/101.0.1210.53"
                },
                onload: (r) => {
                    let html = $(r.response);
                    let todatastarele = html.find("#pt span.xg1");
                    let todaypeople = todatastarele[0].textContent.replace("今日签到之星:", '');
                    todayStar.innerHTML = '<li class="f_f" style="display: flex;flex-direction: column;width: 100%;"><span class="comiis_tm">今日签到之星</span>' + todaypeople + '</li>';
                    let comiis_space_box_height = getComputedStyle($(".comiis_space_box")[0], null)["height"].replace("px", "");
                    let comiis_space_box_padding_bottom = getComputedStyle($(".comiis_space_box")[0], null)["padding-bottom"].replace("px", "");
                    comiis_space_box_height = parseInt(comiis_space_box_height);
                    comiis_space_box_padding_bottom = parseInt(comiis_space_box_padding_bottom);
                    let total_height = comiis_space_box_height + comiis_space_box_padding_bottom + 50;
                    GM_addStyle(`
                    .comiis_space_box{
                        height: ${total_height}px;
                        background-size: 100% 100%;
                    }
                    .pg_k_misign .comiis_qdinfo{
                        height: 110px !important;
                    }`);
                    todayStarParent.append(todayStar);

                },
                onerror: (r) => {
                    console.log(r);
                    log.error("请求今日之星失败");
                }
            })
        }

    }

    function showSignInRanking() { // 显示签到的最先几个人,最多10个,和顶部的今日签到之星
        if (window.location.href.match(mt_config.rexp.k_misign_sign)) {

            let today_ranking_ele = document.querySelector(".comiis_topnv .comiis_flex .flex");
            today_ranking_ele.after($(`<li class="flex"><a href="javascript:;" id="k_misignlist_today_latest" onclick="ajaxlist('todayLatest');">今日最先</a></li>`)[0]);
            let getMaxPage = (urlextra) => {
                return new Promise(res => {
                    GM_xmlhttpRequest({
                        url: "https://bbs.binmt.cc/k_misign-sign.html?operation=" + urlextra,
                        async: false,
                        dataType: 'html',
                        headers: {
                            "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.64 Safari/537.36 Edg/101.0.1210.53"
                        },
                        onload: function (resp) {
                            let last_url = $(resp.response).find("#J_list_detail .pg .last")[0].href;
                            let last_page = last_url.match(/page=([0-9]*)/)[1];
                            res(last_page);

                            // console.log(data);
                            // $("#ranklist").html(data);
                            // $('#ranklist').attr('listtype', listtype);
                        },
                        onerror: function (resp) {
                            console.log(resp);
                            res(0);
                        }
                    })
                })
            }

            let getPagePeople = (page) => {
                return new Promise(res => {
                    GM_xmlhttpRequest({
                        url: "https://bbs.binmt.cc/k_misign-sign.html?operation=list&op=&page=" + page,
                        async: false,
                        dataType: 'html',
                        headers: {
                            "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.64 Safari/537.36 Edg/101.0.1210.53"
                        },
                        onload: function (resp) {
                            let peoples = $(resp.response).find("#J_list_detail tbody tr");
                            let ret_array = [];
                            if (peoples.length == 2 && peoples[0].textContent.indexOf("暂无内容") != -1) {
                                res(ret_array);
                                return;
                            }
                            for (let i = 1; i <= peoples.length - 2; i++) {
                                let people = peoples[i];
                                let ret_json = {};
                                let user_name = people.children[0].getElementsByTagName("a")[0].textContent;
                                let space_url = people.children[0].getElementsByTagName("a")[0].href;
                                let uid = space_url.match(/space-uid-([0-9]*)/)[1];
                                let sign_all_days = people.children[1].textContent;
                                let sign_month_days = people.children[2].textContent;
                                let sign_time = people.children[3].textContent;
                                let sign_reward = people.children[5].textContent;
                                ret_json["user"] = user_name;
                                ret_json["uid"] = uid;
                                ret_json["avatar"] = "https://avatar-bbs.mt2.cn/uc_server/avatar.php?uid=" + uid + "&size=small";
                                ret_json["days"] = sign_all_days;
                                ret_json["monthDays"] = sign_month_days;
                                ret_json["time"] = sign_time;
                                ret_json["reward"] = sign_reward;
                                ret_array = ret_array.concat(ret_json);
                            }
                            res(ret_array)
                        },
                        onerror: function (resp) {
                            console.log(resp);
                            res({});
                        }
                    })
                })
            }

            function changeRankList(data, listtype) {
                $("#ranklist").html(data);
                $('#ranklist').attr('listtype', listtype);
            }

            ajaxlist = async (listtype) => {
                listtype = listtype;
                if (listtype == 'today') {
                    loadingdelay = false;
                    urlextra = 'list&op=today';
                } else if (listtype == 'month') {
                    loadingdelay = false;
                    urlextra = 'list&op=month';
                } else if (listtype == 'zong') {
                    loadingdelay = false;
                    urlextra = 'list&op=zong';
                } else if (listtype == 'calendar') {
                    loadingdelay = true;
                    urlextra = 'calendar';
                } else {
                    loadingdelay = false;
                    urlextra = 'list';
                }
                //alert(loadingdelay);
                if (listtype == 'todayLatest') {
                    loadingdelay = false;
                    urlextra = 'list&op=&page=0';
                    let maxPage = await getMaxPage(urlextra);
                    let latestPeople = await getPagePeople(maxPage);

                    latestPeople.reverse();
                    if (latestPeople.length < 10) {
                        let latestPeople_2 = await getPagePeople(maxPage - 1);
                        latestPeople_2.reverse();
                        latestPeople = latestPeople.concat(latestPeople_2);
                        latestPeople.reverse();
                    }

                    let peopleHTML = '';
                    latestPeople.reverse();
                    console.log(latestPeople);
                    latestPeople.forEach(people => {
                        peopleHTML = peopleHTML + `
                        <tbody id="autolist_` + people["uid"] + `">
                            <tr>
                                <td class="k_misign_lu">
                                    <a href="home.php?mod=space&amp;uid=` + people["uid"] + `"><img
                                            src="` + people["avatar"] + `"></a>
                                </td>
                                <td class="k_misign_ll"><span></span></td>
                                <td class="k_misign_lc">
                                    <h4 class="f_c"><a href="home.php?mod=space&amp;uid=` + people["uid"] + `">` + people["user"] + `</a><span>` + people["time"] + `</span><span
                                            class="y">总天数 ` + people["days"] + `天</span></h4>
                                    <p class="f_0">月天数 ` + people["monthDays"] + ` 天
                                        ,
                                        上次奖励
                                        ` + people["reward"] + `</p>
                                </td>
                            </tr>
                        </tbody>
                        `
                    })
                    let latestHTML = `<li class="styli_h bg_e"></li>
                    <div class="comiis_topnv bg_f b_t b_b">
                        <ul class="comiis_flex">
                            <li class="flex"><a href="javascript:;" id="k_misignlist_today" onclick="ajaxlist('today');">今日排行</a></li>
                            <li class="flex f_0"><em class="bg_0"></em><a href="javascript:;" id="k_misignlist_today_latest" onclick="ajaxlist('todayLatest');">今日最先</a>
                            </li>
                            <li class="flex"><a href="javascript:;" id="k_misignlist_month" onclick="ajaxlist('month');" class="f_c">本月排行</a>
                            </li>
                            <li class="flex"><a href="javascript:;" id="k_misignlist_zong" onclick="ajaxlist('zong');" class="f_c">总排行</a></li>
                        </ul>
                    </div>
                    <div class="k_misign_wp">
                        <div class="k_misign_list bg_f">
                            <table id="misign_list">
                            ` + peopleHTML + `
                            </table>
                        </div>
                    </div>`
                    changeRankList(latestHTML, listtype)
                } else {
                    $.ajax({
                        type: 'GET',
                        url: "plugin.php?id=k_misign:sign&operation=" + urlextra,
                        async: false,
                        dataType: 'html',
                        success: function (data) {
                            // console.log(data);
                            data = data.replace(`今日排行</a></li>`, `今日排行</a></li><li class="flex"><a href="javascript:;" id="k_misignlist_today_latest" onclick="ajaxlist('todayLatest');">今日最先</a></li>`);
                            changeRankList(data, listtype);

                        },
                        complete: function (XHR, TS) {
                            XHR = null
                        }
                    });
                }

            }

        }

    }

    const blackHome = {
        showBlackHomeView: async () => { // 显示小黑屋界面
            $.NZ_MsgBox.alert({
                title: "小黑屋名单",
                content: "获取中",
                type: "",
                location: "center",
                buttons: {
                    confirm: {
                        text: "确定"
                    }
                }
            });
            let blacklistret = await blackHome.getBlackList('');
            let blacklist = window.eval('(' + blacklistret + ')');
            let blackContent = '';

            function sortByProperTyName(data, propertyname) {
                let _list_ = [];
                $.each(data, function (index, value) {
                    let date = value["dateline"].match(/([0-9]{4}-[0-9]{1,2}-[0-9]{1,2}[\s]*[0-9]{1,2}:[0-9]{1,2})/g)[0];
                    date = date.substring(0, 19);
                    date = date.replace(/-/g, '/');
                    let timestamp = new Date(date).getTime();
                    value["time"] = timestamp;
                    _list_ = _list_.concat(value);
                });

                function compareDesc(propertyName) {
                    return function (object1, object2) {
                        var value1 = object1[propertyName];
                        var value2 = object2[propertyName];
                        if (value2 < value1) {
                            return -1;
                        } else if (value2 > value1) {
                            return 1;
                        } else {
                            return 0;
                        }
                    }
                }
                _list_.sort(compareDesc("time"));
                return _list_;
            }
            let newBlacklist = sortByProperTyName(blacklist["data"], "time");
            $.each(newBlacklist, function (index, value) {
                let blackreson = (value["reason"] == "") ? "无" : value["reason"];
                blackContent = blackContent + `
                <tbody id="autolist">
                    <tr>
                        <td class="k_misign_lu" style="text-align: center;overflow-wrap: break-word;width: 76px;">
                            <a href="home.php?mod=space&uid=` + value["uid"] + `&do=profile">
                                <img src="https://avatar-bbs.mt2.cn/uc_server/avatar.php?uid=` + value["uid"] + `&amp;size=small">
                            </a>
                            <div class="f_c" style="display: flex;justify-content: center;margin-top: 5px;word-break: break-word;">
                                <h4>
                                    <a href="home.php?mod=space&uid=` + value["uid"] + `&do=profile">` + value["username"] + `</a>
                                </h4>
                            </div>
                        </td>
                        <td class="k_misign_ll" style="width: 10px;">
                            <span></span>
                        </td>
                        <td class="k_misign_lc" style="max-width: 200px;">
                            <div class="f_c" style="display: flex;justify-content: space-between;">
                                <h4>
                                    <div class="y">操作时间: ` + value["dateline"] + `</div>
                                </h4>
                            </div>
                            <div class="f_c" style="display: flex;justify-content: space-between;">
                                <p class="f_0">操作行为: ` + value["action"] + `</p>
                            </div>
                            <div class="f_c" style="display: flex;justify-content: space-between;">
                                <p class="f_0">过期时间: ` + value["groupexpiry"] + `</p>
                            </div>
                            <div class="f_c" style="display: flex;justify-content: space-between;">
                                <p class="f_0" style="color: #fc2a2a !important;">操作人员: ` + value["operator"] + `</p>
                            </div>
                            <div class="f_c" style="display: flex;justify-content: space-between;">操作理由: ` + blackreson + `</div>
                            
                        </td>
                    </tr>
                    <tr style="height:15px;"></tr>
                </tbody>
                `;
                // console.log(value);
            })
            let mainBlackContent = '<table id="misign_list" style="overflow: auto;height: inherit;margin: 15px 0px;">' + blackContent + "</table>";
            $(".msgcon").html(mainBlackContent);
            $(".NZ-MsgBox-alert.NZ-MsgBox--motion").css("top", "100px");
            $(".msgcon").css("height", "400px");

        },
        insertMobileBlackHomeButton: async function () { // 插入手机版查看小黑屋的按钮
            if ((window.location.href.match(mt_config.rexp.home_space_url) != null) && (GM_getValue("v30"))) {
                // @require      https://cdn.bootcdn.net/ajax/libs/SyntaxHighlighter/3.0.83/scripts/shCore.js
                // @require      https://cdn.bootcdn.net/ajax/libs/SyntaxHighlighter/3.0.83/scripts/shBrushJScript.js
                // gitee需要公开仓库,那我只能引用资源站的js和css了
                // 主页 https://www.jq22.com/jquery-info24191
                // https://gitee.com/whitesev/static_resource/raw/master/NZ_MsgBox/Js/NZ-Plugin/Js/NZ-MsgBox.min.js
                // https://gitee.com/whitesev/static_resource/raw/master/NZ_MsgBox/Js/NZ-Plugin/Js/NZ-Drag.min.js
                // https://gitee.com/whitesev/static_resource/raw/master/NZ_MsgBox/Js/NZ-Plugin/Css/NZ-MsgBox.min.css

                // 不需要加载的
                // https://gitee.com/whitesev/static_resource/raw/master/NZ_MsgBox/Js/spin/spin.js
                // https://gitee.com/whitesev/static_resource/raw/master/NZ_MsgBox/Js/spin/spin.css
                // https://cdn.bootcdn.net/ajax/libs/SyntaxHighlighter/3.0.83/styles/shCoreRDark.min.css
                // https://gitee.com/whitesev/static_resource/raw/master/NZ_MsgBox/Css/fontawesome-free-5.11.2-web/css/all.min.css
                // https://gitee.com/whitesev/static_resource/raw/master/NZ_MsgBox/Css/animate.min.css
                
                await GM_asyncLoadScript("https://www.jq22.com/demo/NZ-Plugin-MsgBox202201130154/Js/NZ-Plugin/Js/NZ-MsgBox.min.js");
                await GM_asyncLoadScript("https://www.jq22.com/demo/NZ-Plugin-MsgBox202201130154/Js/NZ-Plugin/Js/NZ-Drag.min.js");
                await GM_asyncLoadStyleSheet("https://www.jq22.com/demo/NZ-Plugin-MsgBox202201130154/Js/NZ-Plugin/Css/NZ-MsgBox.min.css")

                let black_home_ele = document.createElement("a");
                black_home_ele.setAttribute("href", "javascript:;");
                black_home_ele.className = "comiis_flex comiis_styli bg_f b_t cl blacklist";
                black_home_ele.innerHTML = `
                    <div class="styli_tit f_c">
                        <i class="comiis_font" style="color: #000;"></i>
                    </div>
                    <div class="flex">小黑屋</div>
                    <div class="styli_ico">
                        <i class="comiis_font f_e"></i>
                    </div>`;
                GM_addStyle(`
                .NZ-MsgBox-alert .msgcontainer .msgtitle {
                    text-align: center !important;
                }
                #autolist .k_misign_lu img {
                    width: 40px;
                    height: 40px;
                    -moz-border-radius: 20px;
                    -webkit-border-radius: 20px;
                    border-radius: 20px;
                }
                .k_misign_lc .f_c{
                    margin: 5px 0px;
                }`)
                black_home_ele.onclick = () => {
                    blackHome.showBlackHomeView();
                }
                Array.from(document.querySelectorAll(".comiis_myinfo_list.bg_f.cl")).forEach( (ele) => {
                    if(ele.innerText.match(/消息提醒|资料设置|我的积分|我的勋章|我的道具/)){
                        ele.append(black_home_ele);
                        return;
                    }
                })
                
            }
        },
        getBlackList: async (cid) => { // 获取黑名单列表
            return new Promise(res => {
                GM_xmlhttpRequest({
                    url: "https://bbs.binmt.cc/forum.php?mod=misc&action=showdarkroom&cid=" + cid + "&t=&ajaxdata=json",
                    timeout: 5000,
                    method: "GET",
                    async: false,
                    headers: {
                        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.64 Safari/537.36 Edg/101.0.1210.53"
                    },
                    onload: (r) => {
                        res(r.responseText);
                    },
                    onerror: (r) => {
                        console.log(r);
                        res({});
                    }
                })
            })
        }
    }

    const quickUBB = {
        code: {
            "rainbow1": {
                "key": "转普通彩虹",
                "value": "",
                "isFunc": true,
                "num": 1
            },
            "rainbow2": {
                "key": "转黑白彩虹",
                "value": "",
                "isFunc": true,
                "num": 2
            },
            "rainbow3": {
                "key": "转黑红彩虹",
                "value": "",
                "isFunc": true,
                "num": 3
            },
            "rainbow4": {
                "key": "转蓝绿彩虹",
                "value": "",
                "isFunc": true,
                "num": 4
            },
            "size": {
                "key": "size",
                "value": "[size=][/size]",
                "tagL": "=",
                "tagR": "]",
                "L": "[size=]",
                "R": "[/size]",
                "cursorL": "[size=",
                "cursorLength": 6
            },
            "color": {
                "key": "color",
                "value": "[color=][/color]",
                "tagL": "=",
                "tagR": "]",
                "L": "[color=]",
                "R": "[/color]",
                "cursorL": "[color=",
                "cursorLength": 7
            },
            "b": {
                "key": "加粗",
                "value": "[b][/b]",
                "tagL": "]",
                "tagR": "[",
                "L": "[b]",
                "R": "[/b]",
                "cursorR": "[/b]",
                "cursorLength": 4
            },
            "u": {
                "key": "下划线",
                "value": "[u][/u]",
                "tagL": "]",
                "tagR": "[",
                "L": "[u]",
                "R": "[/u]",
                "cursorR": "[/u]",
                "cursorLength": 4
            },
            "i": {
                "key": "倾斜",
                "value": "[i][/i]",
                "tagL": "]",
                "tagR": "[",
                "L": "[i]",
                "R": "[/i]",
                "cursorR": "[/i]",
                "cursorLength": 4
            },
            "s": {
                "key": "中划线",
                "value": "[s][/s]",
                "tagL": "]",
                "tagR": "[",
                "L": "[s]",
                "R": "[/s]",
                "cursorR": "[/s]",
                "cursorLength": 4
            },
            "lineFeed": {
                "key": "换行",
                "value": "[*]",
                "L": "",
                "R": "[*]",
                "cursorL": "[*]",
                "cursorLength": 3
            },
            "longHorizontalLine": {
                "key": "长横线",
                "value": "[hr]",
                "L": "",
                "R": "[hr]",
                "cursorL": "[hr]",
                "cursorLength": 4
            },
            "link": {
                "key": "链接",
                "value": "[url=][/url]",
                "tagL": "=",
                "tagR": "]",
                "L": "[url=]",
                "R": "[/url]",
                "cursorL": "[url=",
                "cursorLength": 5

            },
            "hide": {
                "key": "隐藏",
                "value": "[hide][/hide]",
                "tagL": "]",
                "tagR": "[",
                "L": "[hide]",
                "R": "[/hide]",
                "cursorR": "[/hide]",
                "cursorLength": 7

            },
            "quote": {
                "key": "引用",
                "value": "[quote][/quote]",
                "tagL": "]",
                "tagR": "[",
                "L": "[quote]",
                "R": "[/quote]",
                "cursorR": "[/quote]",
                "cursorLength": 8

            }
        },
        insertQuickReplyUBB: () => { // 快捷回复
            if (GM_getValue("v31") && (window.location.href.match(mt_config.rexp.forum_post) != null)) {
                quickUBB.jqueryExtraFunction();
                $(".comiis_post_ico .comiis_pictitle").after($(`<a href="javascript:;" class="commis_insert"><i class="comiis_font"><em>插入</em></i></a>`));
                $(".comiis_post_ico.comiis_minipost_icot.f_c.cl").on("click", "a", (e) => {
                    $("#comiis_post_tab div.bg_f").hide()
                    e.currentTarget.style.display = "";
                    if (e.currentTarget.className != "comiis_pictitle") {
                        e.currentTarget.style.display = "block";
                    }
                })
                let message_ele = $("#needmessage");
                let fastpostsubmitline_ele = $("#fastpostsubmitline");
                if (message_ele && fastpostsubmitline_ele) {
                    $("#comiis_post_tab").append($(`
                    <div class="bg_f b_b comiis_input_style cl" style="display: none;"><div class="comiis_post_urlico b_b"><ul></ul></div></div>
                    `));


                    $.each(quickUBB.code, function (index, value) {
                        let ubbs = $(`<li class="quickUBBs"><a href="javascript:;" class="comiis_xifont f_d"><i class="comiis_font"></i>${value["key"]}</a></li>`);
                        ubbs.on("click", (e) => {
                            $.each($("#comiis_post_tab div.comiis_post_urlico ul li.quickUBBs a.comiis_xifont"), (i, v) => {
                                v.className = "comiis_xifont f_d";
                                if (v == e.target) {
                                    v.className = "comiis_xifont f_0";
                                }
                            });
                            let userInput = prompt(`请输入需要${value["key"]}的文字`, value["value"]);

                            if ( value["isFunc"] ) {
                                userInput = quickUBB.set_rainbow(value["num"], userInput);
                            }
                            if (userInput != null && userInput.trim()) {
                                comiis_addsmilies(userInput);
                            }

                        })
                        $("#comiis_post_tab div.comiis_post_urlico ul").append(ubbs[0]);
                    })


                } else {
                    console.log("未找到快捷回复框");
                }
            }
        },
        insertReplayUBB: () => { // 具体回复
            if (!GM_getValue("v35")) {
                console.log("v35未开启");
                return;
            }
            if (window.location.href.match(mt_config.rexp.reply_forum) == null) {
                console.log("未在回复界面");
                return;
            }

            let insertDOM = $(".comiis_post_urlico");
            if (!insertDOM) {
                console.log("未找到插入元素");
                return;
            }

            let parentEle = $(".comiis_post_urlico > ul")[0];
            let contentEle = $("#comiis_post_qydiv > ul");
            quickUBB.jqueryExtraFunction();
            $.each(quickUBB.code, function (key, value) {
                let ubbs = $(`<li class="quickUBBs"><a href="javascript:;" class="comiis_xifont f_d"><i class="comiis_font"></i>${value["key"]}</a></li>`);
                ubbs.on("click", (e) => {
                    let bottomEle = $(`#comiis_post_qydiv li[data-key='${value.key}']`);
                    if (!bottomEle.length) {
                        console.log("未找到该元素");
                        return
                    }
                    let contentIndex = 7 + Object.keys(quickUBB.code).indexOf(key);
                    $("#comiis_post_qydiv ul li").hide().eq(contentIndex).fadeIn();
                    $.each($("#comiis_post_tab div.comiis_post_urlico ul li a.comiis_xifont"), (i, v) => {
                        v.className = "comiis_xifont f_d";
                        if (v == e.target) {
                            v.className = "comiis_xifont f_0";
                        }
                    });
                })
                parentEle.append(ubbs[0]);

                let ubbs_content = document.createElement("li");
                ubbs_content.setAttribute("style", "display: none;");
                ubbs_content.setAttribute("data-key", value["key"]);
                ubbs_content.innerHTML = `
                    <div class="comiis_styli_m f15" style="padding-top:12px;">
                        <div class="bg_e comiis_p5" style="border-radius:4px"><textarea class="comiis_pt kmshow f_c" id="comiis_input_${key}" style="font-size:15px" placeholder="请输入需要${value["key"]}的文字"></textarea></div>
                    </div>
                    <div class="comiis_styli_m f15 comiis_flex" style="padding-top:0;">
                        <div class="styli_tit"><button class="comiis_sendbtn bg_0 f_f" data-keyI="${key}" type="button">插入</button></div>
                        <div class="flex"></div>
                    </div>`;

                contentEle.append(ubbs_content);
                $(`.comiis_sendbtn[data-keyI="${key}"]`).on("click", () => {
                    let text = $(`#comiis_input_${key}`).val();
                    if (text == '') {
                        popup.open('请输入需要插入的内容', 'alert');
                        return;
                    }
                    if (quickUBB.code[key]["isFunc"]) {
                        text = quickUBB.set_rainbow(quickUBB.code[key]["num"], text);
                    }
                    if (quickUBB.code[key].hasOwnProperty("L")) {
                        text = quickUBB.code[key]['L'] + text + quickUBB.code[key]['R'];
                    }
                    $("#needmessage").insertAtCaret(text);
                    // if (quickUBB.code[key]["tagL"] != undefined || quickUBB.code[key]["tagR"] != undefined) {
                    //     $("#needmessage").moveCursorInCenterByText(quickUBB.code[key]["tagL"], quickUBB.code[key]["tagR"]);
                    // }
                    if (quickUBB.code[key].hasOwnProperty("cursorL")) {
                        $("#needmessage").moveCursorToCenterByTextWithLeft(quickUBB.code[key]["cursorL"], quickUBB.code[key]["cursorLength"]);
                    }
                    if (quickUBB.code[key].hasOwnProperty("cursorR")) {
                        $("#needmessage").moveCursorToCenterByTextWithRight(quickUBB.code[key]["cursorR"], quickUBB.code[key]["cursorLength"]);
                    }
                })
            });

        },
        set_rainbow: (num, text) => {
            if (text == "") {
                return '';
            }
            var wr_text = text;
            var wr_code, wr_rgb, r, g, b, i, j, istep
            var wr_rgb1, wr_rgb2, r1, g1, b1, r2, g2, b2

            r1 = g1 = b1 = r2 = g2 = b2 = 0;
            r = 0;
            g = 0;
            b = 0;
            istep = 0;
            wr_code = '';

            if (num == 1) {
                istep = 40;
                r = 255;
                i = 1;
                j = 0;
                do {
                    if (wr_text.charCodeAt(j) != 32) {
                        if (g + istep < 256) {
                            if (i == 1) g += istep;
                        } else if (i == 1) {
                            i = 2;
                            g = 255;
                        }
                        if (r - istep > -1) {
                            if (i == 2) r -= istep;
                        } else if (i == 2) {
                            i = 3;
                            r = 0;
                        }
                        if (b + istep < 256) {
                            if (i == 3) b += istep;
                        } else if (i == 3) {
                            i = 4;
                            b = 255;
                        }
                        if (g - istep > -1) {
                            if (i == 4) g -= istep;
                        } else if (i == 4) {
                            i = 5;
                            g = 0;
                        }
                        if (r + istep < 256) {
                            if (i == 5) r += istep;
                        } else if (i == 5) {
                            i = 6;
                            r = 255;
                        }
                        if (b - istep > -1) {
                            if (i == 6) b -= istep;
                        } else if (i == 6) {
                            i = 1;
                            b = 0;
                        }
                        wr_rgb = '';
                        wr_rgb += parseInt(r).toString(16).length == 1 ? 0 + parseInt(r).toString(16) : parseInt(r).toString(16);
                        wr_rgb += parseInt(g).toString(16).length == 1 ? 0 + parseInt(g).toString(16) : parseInt(g).toString(16);
                        wr_rgb += parseInt(b).toString(16).length == 1 ? 0 + parseInt(b).toString(16) : parseInt(b).toString(16);
                        wr_rgb = wr_rgb.toUpperCase();
                        wr_code += '[color=#' + wr_rgb + ']' + wr_text.charAt(j) + '[/color]';
                    } else {
                        wr_code += wr_text.charAt(j);
                    }
                    j++;
                } while (j < wr_text.length);
            } else if (num == 2) {
                istep = 255 / wr_text.length;
                for (i = 1; i < wr_text.length + 1; i++) {
                    if (wr_text.charCodeAt(i - 1) != 32) {
                        r += istep;
                        g += istep;
                        b += istep;
                        if (r > 255) r = 255;
                        if (g > 255) g = 255;
                        if (b > 255) b = 255;
                        wr_rgb = '';
                        wr_rgb += parseInt(r).toString(16).length == 1 ? 0 + parseInt(r).toString(16) : parseInt(r).toString(16);
                        wr_rgb += parseInt(g).toString(16).length == 1 ? 0 + parseInt(g).toString(16) : parseInt(g).toString(16);
                        wr_rgb += parseInt(b).toString(16).length == 1 ? 0 + parseInt(b).toString(16) : parseInt(b).toString(16);
                        wr_rgb = wr_rgb.toUpperCase();
                        wr_code += '[color=#' + wr_rgb + ']' + wr_text.charAt(i - 1) + '[/color]';
                    } else {
                        wr_code += wr_text.charAt(i - 1);
                    }
                }
            } else if (num == 3) {
                istep = 255 / wr_text.length;
                for (i = 1; i < wr_text.length + 1; i++) {
                    if (wr_text.charCodeAt(i - 1) != 32) {
                        r += istep;
                        g = 29;
                        b = 36;
                        if (r > 255) r = 255;
                        if (g > 255) g = 255;
                        if (b > 255) b = 255;
                        wr_rgb = '';
                        wr_rgb += parseInt(r).toString(16).length == 1 ? 0 + parseInt(r).toString(16) : parseInt(r).toString(16);
                        wr_rgb += parseInt(g).toString(16).length == 1 ? 0 + parseInt(g).toString(16) : parseInt(g).toString(16);
                        wr_rgb += parseInt(b).toString(16).length == 1 ? 0 + parseInt(b).toString(16) : parseInt(b).toString(16);
                        wr_rgb = wr_rgb.toUpperCase();
                        wr_code += '[color=#' + wr_rgb + ']' + wr_text.charAt(i - 1) + '[/color]';
                    } else {
                        wr_code += wr_text.charAt(i - 1);
                    }
                }
            } else if (num == 4) {
                istep = 255 / wr_text.length;
                for (i = 1; i < wr_text.length + 1; i++) {
                    if (wr_text.charCodeAt(i - 1) != 32) {
                        r = 0;
                        g = 174;
                        b += istep;
                        if (r > 255) r = 255;
                        if (g > 255) g = 255;
                        if (b > 255) b = 255;
                        wr_rgb = '';
                        wr_rgb += parseInt(r).toString(16).length == 1 ? 0 + parseInt(r).toString(16) : parseInt(r).toString(16);
                        wr_rgb += parseInt(g).toString(16).length == 1 ? 0 + parseInt(g).toString(16) : parseInt(g).toString(16);
                        wr_rgb += parseInt(255 - b).toString(16).length == 1 ? 0 + parseInt(255 - b).toString(16) : parseInt(255 - b).toString(16);
                        wr_rgb = wr_rgb.toUpperCase();
                        wr_code += '[color=#' + wr_rgb + ']' + wr_text.charAt(i - 1) + '[/color]';
                    } else {
                        wr_code += wr_text.charAt(i - 1);
                    }
                }
            }
            return wr_code;
        },
        jqueryExtraFunction: () => {
            $.fn.extend({
                insertAtCaret: function (myValue) {
                    var $t = $(this)[0];
                    if (document.selection) {
                        this.focus();
                        var sel = document.selection.createRange();
                        sel.text = myValue;
                        this.focus();
                    } else
                    if ($t.selectionStart || $t.selectionStart == '0') {
                        var startPos = $t.selectionStart;
                        var endPos = $t.selectionEnd;
                        var scrollTop = $t.scrollTop;
                        $t.value = $t.value.substring(0, startPos) + myValue + $t.value.substring(endPos, $t.value.length);
                        this.focus();
                        $t.selectionStart = startPos + myValue.length;
                        $t.selectionEnd = startPos + myValue.length;
                        $t.scrollTop = scrollTop;
                    } else {
                        this.value += myValue;
                        this.focus();
                    }
                },
                selectRange: function (start, end) {
                    if (end === undefined) {
                        end = start;
                    }
                    return this.each(function () {
                        if ('selectionStart' in this) {
                            this.selectionStart = start;
                            this.selectionEnd = end;
                        } else if (this.setSelectionRange) {
                            this.setSelectionRange(start, end);
                        } else if (this.createTextRange) {
                            var range = this.createTextRange();
                            range.collapse(true);
                            range.moveEnd('character', end);
                            range.moveStart('character', start);
                            range.select();
                        }
                    });
                },
                getCursorPosition: function () {
                    var el = $(this)[0];
                    var pos = 0;
                    if ('selectionStart' in el) {
                        pos = el.selectionStart;
                    } else if ('selection' in document) {
                        el.focus();
                        var Sel = document.selection.createRange();
                        var SelLength = document.selection.createRange().text.length;
                        Sel.moveStart('character', -el.value.length);
                        pos = Sel.text.length - SelLength;
                    }
                    return pos;
                },
                moveCursorInCenterByText: function (leftTextFlag, rightTextFlag) {
                    var el = $(this)[0];
                    var el_text = el.value;
                    for (let i = el.selectionStart - 1; i > 0; i--) {
                        let LText = el_text[i - 1];
                        let currentText = el_text[i];
                        if (LText == leftTextFlag && currentText == rightTextFlag) {
                            this.selectRange(i);
                            break;
                        }
                    }
                },
                moveCursorToCenterByTextWithLeft: function (leftMatchText, _length_) {
                    var el = $(this)[0];
                    var el_text = el.value;
                    for (let i = el.selectionStart - 1; i > 0; i--) {
                        let lTexts = el_text.substring(i - _length_, i);
                        if (lTexts == leftMatchText) {
                            this.selectRange(i);
                            break;
                        }
                    }
                },
                moveCursorToCenterByTextWithRight: function (rightMatchText, _length_) {
                    var el = $(this)[0];
                    var el_text = el.value;
                    for (let i = el.selectionStart - 1; i > 0; i--) {
                        let rTexts = el_text.substring(i, i + _length_);
                        if (rTexts == rightMatchText) {
                            this.selectRange(i + _length_);
                            break;
                        }
                    }
                }
            });
        }
    }



    function blacklistShieldUsersOrBlocks() { // 黑名单-屏蔽用户或板块
        if (location.href.match(mt_config.rexp.home_space_url) != null) {
            var white_space_ele = document.createElement("div");
            var black_list_ele = document.createElement("div");
            white_space_ele.className = "styli_h cl";
            black_list_ele.setAttribute("id", "blacklistallmain");
            black_list_ele.className = "comiis_myinfo_list bg_f cl";
            black_list_ele.innerHTML = `<li class="comiis_styli b_b cl">
                                            <textarea name="blacklistuid" id="blacklistuid" placeholder="输入想要屏蔽的用户的uid,多个uid用英文逗号分隔,如1234,5678,9231"></textarea>
                                            <textarea name="blacklistplate" id="blacklistplate" placeholder="输入想要屏蔽的板块,多个板块用顿号分隔,如求助问答、休闲灌水"></textarea>
                                            <a href="javascript:void(0)" id="blacklistsave" class="comiis_flex comiis_styli bg_f b_t cl">
                                                <div class="flex">保存</div>
                                            </a>
                                        </li>`;
            GM_addStyle(`
            #blacklistallmain{
                height: 232px;
            }
            #blacklistallmain li.comiis_styli{
                height: 180px;
            }
            #blacklistallmain #blacklistuid{
                width: 90%; 
                resize: none; 
                opacity: 0.7; 
                height: 70% !important; 
                line-height: inherit;
                -webkit-appearance: none;
                border: none !important;
                font-size: 14px;
                vertical-align: middle;
                background-color: transparent;
                border-bottom: 3px solid #efefef !important;
            }
            #blacklistallmain #blacklistplate{
                width: 90%; 
                resize: none; 
                opacity: 0.7; 
                height: 30% !important;
                line-height: inherit;
                -webkit-appearance: none;
                border: none !important;
                font-size: 14px;
                vertical-align: middle;
                background-color: transparent;
            }
            #blacklistsave{
                text-align: center;
                background: transparent !important;
                border-color: transparent !important;
            }
            `);
            let mt_commis_menu = document.getElementsByClassName("comiis_myinfo cl")[0];
            mt_commis_menu.appendChild(white_space_ele);
            mt_commis_menu.appendChild(black_list_ele);
            mt_commis_menu.appendChild(white_space_ele);
            document.getElementById("blacklistuid").textContent = GM_getValue("blacklistuid") ? GM_getValue("blacklistuid") : "";
            document.getElementById("blacklistplate").textContent = GM_getValue("blacklistuid") ? GM_getValue("blacklistuid") : "";
            document.getElementById("blacklistsave").onclick = () => {
                let blackListUIDValue = document.getElementById("blacklistuid").value;
                let blackListPlateValue = document.getElementById("blacklistplate").value;
                GM_setValue("blacklistuid", blackListUIDValue);
                GM_setValue("blacklistplate", blackListPlateValue);
                popup.open("保存成功","alert");
                // iosOverlay({
                //     text: "保存成功",
                //     duration: 2000,
                //     icon: "https://www.helloimg.com/images/2022/05/24/ZoDS05.png"
                // });
            }
        }
    }


    function identifyLinks() { // 识别链接
        if (GM_getValue("v2")) {
            /*TEXT link to Clickable Hyperlink From Via*/
            var clearLink, excludedTags, filter, linkMixInit, linkPack, linkify, observePage, observer, setLink, url_regexp, xpath;
            url_regexp = /((https?:\/\/|www\.)[\x21-\x7e]+[\w\/]|(\w[\w._-]+\.(com|cn|org|net|info|tv|cc))(\/[\x21-\x7e]*[\w\/])?|ed2k:\/\/[\x21-\x7e]+\|\/|thunder:\/\/[\x21-\x7e]+=)/gi;
            clearLink = function (a) {
                var b;
                a = null != (b = a.originalTarget) ? b : a.target;
                if (null != a && "a" === a.localName && -1 !== a.className.indexOf("texttolink") && (b = a.getAttribute("href"), 0 !== b.indexOf("http") && 0 !== b.indexOf("ed2k://") && 0 !== b.indexOf("thunder://"))) return a.setAttribute("href", "http://" + b)
            };
            document.addEventListener("mouseover", clearLink);
            setLink = function (a) {
                if (null != a && a.hasOwnProperty("className") && typeof (a.parentNode.className) === "string" && -1 === a.parentNode.className.indexOf("texttolink") && "#cdata-section" !== a.nodeName) {
                    var b = a.textContent.replace(url_regexp, '<a href="$1" target="_blank" class="texttolink" style="border: 1px solid #f00;">$1</a>');
                    if (a.textContent.length !== b.length) {
                        var c = document.createElement("span");
                        c.innerHTML = b;
                        return a.parentNode.replaceChild(c, a)
                    }
                }
            };
            excludedTags = "a svg canvas applet input button area pre embed frame frameset head iframe img option map meta noscript object script style textarea code".split(" ");
            xpath = "//text()[not(ancestor::" + excludedTags.join(") and not(ancestor::") + ")]";
            filter = new RegExp("^(" + excludedTags.join("|") + ")$", "i");
            linkPack = function (a, b) {
                var c, d;
                if (b + 1E4 < a.snapshotLength) {
                    var e = c = b;
                    for (d = b + 1E4; b <= d ? c <= d : c >= d; e = b <= d ? ++c : --c) setLink(a.snapshotItem(e));
                    setTimeout(function () {
                        return linkPack(a, b + 1E4)
                    }, 15)
                } else
                    for (e = c = b, d = a.snapshotLength; b <= d ? c <= d : c >= d; e = b <= d ? ++c : --c) setLink(a.snapshotItem(e))
            };
            linkify = function (a) {
                a = document.evaluate(xpath, a, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
                return linkPack(a, 0)
            };
            observePage = function (a) {
                for (a = document.createTreeWalker(a, NodeFilter.SHOW_TEXT, {
                        acceptNode: function (a) {
                            if (!filter.test(a.parentNode.localName)) return NodeFilter.FILTER_ACCEPT
                        }
                    }, !1); a.nextNode();) setLink(a.currentNode)
            };
            observer = new window.MutationObserver(function (a) {
                var b, c;
                var d = 0;
                for (b = a.length; d < b; d++) {
                    var e = a[d];
                    if ("childList" === e.type) {
                        var g = e.addedNodes;
                        var f = 0;
                        for (c = g.length; f < c; f++) e = g[f], observePage(e)
                    }
                }
            });
            linkMixInit = function () {
                if (window === window.top && "" !== window.document.title) return linkify(document.body), observer.observe(document.body, {
                    childList: !0,
                    subtree: !0
                })
            };
            var clearlinkF = function (a) {
                    var url = a.getAttribute("href");
                    if (0 !== url.indexOf("http") && 0 !== url.indexOf("ed2k://") && 0 !== url.indexOf("thunder://")) return a.setAttribute("href", "http://" + url)
                },
                clearlinkE = function () {
                    for (var a = document.getElementsByClassName("texttolink"), b = 0; b < a.length; b++) clearlinkF(a[b])
                };
            setTimeout(clearlinkE, 2500);
            setTimeout(linkMixInit, 1100);
        }
    }

    function detectUserOnlineStatus() { // 探测用户在线状态
        if (window.location.href.match(mt_config.rexp.forum_post_pc)) {
            var quanju = [];
            var cishu = 0;
            for (var sss = document.getElementsByClassName("pls favatar"), ll = 0; ll < sss.length; ll++) {
                var sendmessage = sss[ll].getElementsByClassName("comiis_o cl")
                if (sendmessage.length == 0) {} else {
                    var sendmessageurl = sendmessage[0].getElementsByTagName('a')[1].href;

                    let xhr = new XMLHttpRequest();
                    xhr.open("GET", sendmessageurl, false);
                    xhr.onreadystatechange = function () {
                        if (xhr.readyState == 4) {
                            let pattern = /正在.*]/g;
                            let str = xhr.responseText;
                            let newstr = str.match(pattern)[0];
                            quanju.push(newstr);
                        }
                    }
                    xhr.send();
                    if (quanju[cishu].match('离线')) {
                        cishu = cishu + 1;
                        var imi2 = document.createElement('img');
                        imi2.src = 'https:\/\/cdn2.bbs.binmt.cc\/static\/image\/smiley\/doge\/54.png';
                        imi2.smilied = '1353';
                        imi2.border = "0";
                        imi2.style = 'float:right';
                        sss[ll].insertAdjacentElement('afterbegin', imi2);
                    } else {
                        cishu = cishu + 1;
                        var imi = document.createElement('img');
                        imi.src = 'https:\/\/cdn2.bbs.binmt.cc\/static\/image/smiley\/doge\/35.png';
                        imi.smilied = '1384';
                        imi.border = "0";
                        imi.style = 'float:right';
                        sss[ll].insertAdjacentElement('afterbegin', imi);
                    }
                }
            }
        }
    }

    function commentsAddReviews() { // 评论区添加点评功能
        if (GM_getValue("v6") && location.href.match(mt_config.rexp.forum_post)) {
            var hongbao = document.getElementsByClassName("bottom_zhan y");
            if (hongbao.length == 0) {} else {
                var cishu2 = 0;
                var replyhref = hongbao[cishu2].getElementsByTagName('a')[0].href;
                var page = replyhref.match(mt_config.rexp.forum_post_page)[1];
                //console.log(page);
                for (cishu2 = 0; cishu2 < hongbao.length; cishu2++) {
                    if (hongbao[cishu2].children.length == 1) {
                        var rewardhref = hongbao[cishu2].getElementsByTagName('a')[0].href.replace('mod=post&', 'mod=misc&');
                        rewardhref = rewardhref.replace("action=reply&", "action=comment&");
                        var reviews_href = rewardhref + '&extra=page%3D1&page=' + page;
                        let reviews_pid = hongbao[cishu2].parentElement.parentElement.id.replace("pid", "&pid=");
                        reviews_href = reviews_href + reviews_pid;
                        //console.log(rewardhref)
                        var oa = document.createElement('a');
                        var ob = document.createElement('i');
                        var lm = document.getElementsByClassName("bottom_zhan y")[cishu2];
                        oa.href = reviews_href;
                        oa.className = "f_c dialog";
                        ob.style = "content: url(https://s1.ax1x.com/2020/04/26/Jcq8VU.png);height: 15px;";
                        ob.className = "comiis_font mt_review";
                        ob.innerHTML = "";
                        oa.appendChild(ob);
                        let review_username = hongbao[cishu2].parentElement.parentElement.getElementsByClassName("top_user f_b")[0].text;
                        oa.onclick = function () {
                            let click_time = Date.now();
                            var mt_interval = setInterval(function () {
                                let run_time = parseInt((Date.now() - click_time) / 1000);
                                if (run_time >= 5) {
                                    console.log("超时");
                                    clearInterval(mt_interval);
                                } else if (document.querySelector("div[id=ntcmsg_popmenu]>div>span.f_c") != null) {
                                    console.log("存在,清理定时器");
                                    console.log("点评用户:", review_username);
                                    console.log("该对象出现用时:", run_time);
                                    try {
                                        document.querySelector("div[id=ntcmsg_popmenu]>div>span.f_c").innerText = "点评 " + review_username;
                                    } catch (err) {
                                        console.log("修改点评失败", err);
                                    }
                                    clearInterval(mt_interval);
                                }
                            }, 100)
                        }
                        lm.insertAdjacentElement('afterBegin', oa);
                    } else {
                        console.log("已有点评按钮,无需再次添加");
                    }
                }
            }
        }
    }

    function modifyForumPostFontColor() { //字体颜色改为黑色
        if (GM_getValue("v3") && location.href.match(mt_config.rexp.forum_post)) {
            var hide = document.getElementsByTagName('font');
            var i = 0;
            for (i = 0; i < hide.length; i++) {
                hide[i].removeAttribute('color');
                hide[i].removeAttribute('style');
                hide[i].removeAttribute('size');
            }
            var content = document.getElementsByClassName("comiis_message bg_f view_all cl message");
            var rule = /<br>|&nbsp;|<font.*?>|<\/font>|<strike>|<strong>|<i>|<u>|align=".*?"/g;
            var j = 0,
                k = 1;
            for (j = 0; j < content.length; j++ & k++) {
                content[j].innerHTML = content[j].innerHTML.replace(rule, '');
            }
        }

    }

    function collectionForumPost() { // 悬浮按钮-添加收藏帖子功能
        var own_formhash = document.querySelector("#scform > input[type=hidden]:nth-child(1)").value;
        var collect_href_id = window.location.href.match(mt_config.rexp.forum_post_pc_page)[1];
        var collect_href = 'https:\/\/bbs.binmt.cc\/home.php?mod=spacecp&ac=favorite&type=thread&id=' + collect_href_id + '&formhash=' + own_formhash;
        var new_collect = document.createElement('span');
        var old_Suspended = document.getElementById("scrolltop");
        new_collect.innerHTML = '<a href="' + collect_href + '" id="k_favorite" onclick="showWindow(this.id, this.href, \'get\', 0);" onmouseover="this.title = $(\'favoritenumber\').innerHTML + \' 人收藏\'" ><img src="https:\/\/s1.ax1x.com\/2020\/04\/29\/JTk3lD.gif" height="26" width="26" style="position:absolute;top:10px;left:11px"><\/a>';
        old_Suspended.insertAdjacentElement('afterBegin', new_collect);
    }

    function quickReply() { //快捷回复
        document.querySelector("#scrolltop > span:nth-child(2) > a").onclick = function () {
            showWindow('reply', this.href);
            var a = document.querySelector("#postsubmit");
            setTimeout(
                'document.querySelector("#moreconf").innerHTML=document.querySelector("#moreconf").innerHTML+\'<button type="button" id = "insertspace2" style="float: left;">一键空格<\/button>\';document.querySelector("#insertspace2").onclick=function(){document.querySelector("#postmessage").value=document.querySelector("#postmessage").value+"           ";}', 200)
        }


    }

    function showUserLevel() { // 显示用户具体等级
        var a = document.getElementsByClassName("pls favatar");
        var i = 0;
        var e = "0级";
        for (i = 0; i < a.length; i++) {
            var b = a[i].getElementsByTagName("em")[1].outerText;
            var c = a[i].getElementsByTagName("tr")[0];
            var d = document.createElement("td");
            switch (b) {
                case "幼儿园":
                    e = "1级";
                    break;
                case "小学生":
                    e = "2级";
                    break;
                case "初中生":
                    e = "3级";
                    break;
                case "高中生":
                    e = "4级";
                    break;
                case "大学生":
                    e = "5级";
                    break;
                case "硕士生":
                    e = "6级";
                    break;
                case "博士生":
                case "实习版主":
                case "版主":
                case "审核员":
                    e = "7级";
                    break;
                case "博士后":
                case "超级版主":
                case "网站编辑":
                    e = "8级";
                    break;
                case "管理员":
                case "信息监察员":
                    e = "9级";
                    break;
            }
            d.innerHTML = '<p><a class="dj">' + e + '<\/a><\/p>Lv';
            c.appendChild(d);
        }

    }

    function showUserUID() { //显示用户的uid
        if (GM_getValue("v15") &&
            ((window.location.href.match(mt_config.rexp.forum_post_guide_url) ||
                (window.location.href.match(mt_config.rexp.forum_post)) ||
                (window.location.href.match(mt_config.rexp.plate_url)) ||
                (window.location.href.match(mt_config.rexp.search_url))
            ))) {
            window.findUserFormList = false;
            window.findUserFormListNums = 0;
            let findSetInval = setInterval(function () {
                let formList = mt_config.dom_obj.comiis_formlist() ? mt_config.dom_obj.comiis_formlist() : [];
                formList = formList.length == 0 ? mt_config.dom_obj.comiis_postli() : formList;
                formList = formList.length == 0 ? mt_config.dom_obj.comiis_mmlist() : formList;
                window.findUserFormList = formList.length ? true : false;
                if (findUserFormListNums >= 10) {
                    console.log("未出现,清理定时器");
                    clearInterval(findSetInval);
                }
                if (window.findUserFormList) {
                    GM_addStyle(`
                    .comiis_postli_top.bg_f.b_t h2{
                        height: auto;
                    }`);

                    function matchUIDByArray(data) {
                        for (let i = 0; i < data.length; i++) {
                            let url = data[i].href;
                            let uid = url.match(mt_config.rexp.mt_uid);
                            if (uid) {
                                return uid[1];
                            }
                        }
                        return null
                    }
                    $.each(formList, (index, value) => {
                        let mtUIDOM = value.getElementsByClassName("mt_uid_set");
                        if (!mtUIDOM.length) {
                            let childrenByATagetElement = value.getElementsByTagName("a");
                            let mt_uid = null;
                            mt_uid = matchUIDByArray(childrenByATagetElement);
                            if (mt_uid != null) {
                                let uid_control = document.createElement("a");
                                let mtUidDomInsertElement = value.getElementsByClassName("top_lev")[0];
                                let uid_control_height = getComputedStyle(mtUidDomInsertElement, null)["height"];
                                let uid_control_margin = getComputedStyle(mtUidDomInsertElement, null)["margin"];
                                let uid_control_padding = getComputedStyle(mtUidDomInsertElement, null)["padding"];
                                let uid_control_line_height = getComputedStyle(mtUidDomInsertElement, null)["line-height"];
                                let uid_control_font = getComputedStyle(mtUidDomInsertElement, null)["font"];
                                uid_control.className = "mt_uid_set";
                                uid_control.style = `
                                    font: ${uid_control_font};
                                    background: rgb(255, 118, 0);
                                    color: white;
                                    float: left;
                                    margin: ${uid_control_margin};
                                    padding: ${uid_control_padding};
                                    height: ${uid_control_height};
                                    line-height: ${uid_control_line_height};
                                    border-radius: 1.5px;`;
                                uid_control.innerHTML = "UID:" + mt_uid;
                                uid_control.onclick = function () {
                                    try {
                                        GM_setClipboard(mt_uid);
                                        popup.open(`${mt_uid}已复制`,"alert");
                                        // iosOverlay({
                                        //     text: mt_uid + "已复制",
                                        //     duration: 2000,
                                        //     icon: "https://www.helloimg.com/images/2022/05/24/ZoDS05.png"
                                        // });
                                        console.log("复制:", mt_uid)
                                    } catch (err) {
                                        popup.open(`${mt_uid}复制失败`,"alert");
                                        console.log("复制失败:"+mt_uid, err);
                                        // iosOverlay({
                                        //     text: mt_uid + "复制失败",
                                        //     duration: 2000,
                                        //     icon: "https://whitesev.gitee.io/static_resource/ios_loading/img/cross.png"
                                        // });
                                    }
                                }

                                mtUidDomInsertElement.parentElement.append(uid_control);
                            }
                        }
                    })
                    console.log("出现,清理定时器");
                    clearInterval(findSetInval);
                } else {
                    findUserFormListNums += 1;
                }

            }, 800)

        }
    }

    function shieldUser() { // 屏蔽用户
        if (window.location.href.match(mt_config.rexp.forum_guide_url) || window.location.href.match(mt_config.rexp.plate_url)) {
            console.log("屏蔽YH——1");
            let infos = document.querySelectorAll(".comiis_forumlist .forumlist_li");
            let black_list = GM_getValue("blacklistuid") ? GM_getValue("blacklistuid") : "";
            let black_list_array = black_list.split(",");
            Array.from(infos).forEach((info) => {
                let usr = info.getElementsByClassName("wblist_tximg")[0].href;
                let usr_uid = usr.match(mt_config.rexp.mt_uid)[1];
                if (black_list_array.indexOf(usr_uid) != -1) {
                    console.log("屏蔽用户:" + usr_uid);
                    info.setAttribute("style", "display:none !important;");
                }
            })
        }
        if (window.location.href.match(mt_config.rexp.forum_post)) {
            console.log("屏蔽YH——2");
            let comments = document.querySelectorAll(".comiis_postlist .comiis_postli");
            let black_list = GM_getValue("blacklistuid") ? GM_getValue("blacklistuid") : "";
            let black_list_array = black_list.split(",");
            Array.from(comments).forEach((comment) => {
                let usr = comment.getElementsByClassName("postli_top_tximg")[0].href;
                let usr_uid = usr.match(mt_config.rexp.mt_uid)[1];
                if (black_list_array.indexOf(usr_uid) != -1) {
                    console.log("屏蔽用户:" + usr_uid);
                    comment.setAttribute("style", "display:none !important;");
                }
            })
        }

    }

    function shieldPlate() { // 屏蔽板块
        if (window.location.href.match(mt_config.rexp.forum_guide_url)) {
            console.log("屏蔽BK");
            let infos = document.querySelectorAll(".comiis_forumlist .forumlist_li");
            let black_list = GM_getValue("blacklistplate") ? GM_getValue("blacklistplate") : "";
            let black_list_array = black_list.split("、");
            Array.from(infos).forEach((info) => {
                let from_plate = info.querySelector(".forumlist_li_time a.f_d").text;
                from_plate = from_plate.replace(/\s*/g, "");
                from_plate = from_plate.replace("来自", "");
                if (black_list_array.indexOf(from_plate) != -1) {
                    console.log("屏蔽板块:" + from_plate);
                    info.setAttribute("style", "display:none !important;");
                }
            })
        }
    }

    function autoExpendFullTextByForumPost() { //自动展开帖子内容
        if (GM_getValue("v18") && location.href.match(mt_config.rexp.forum_post)) {
            GM_addStyle(`
            div.comiis_message.bg_f.view_one.b_b.cl.message > div.comiis_messages.comiis_aimg_show.cl{
                max-height: inherit !important;
                overflow-y: inherit !important;
                position: inherit !important;
            }
            .comiis_lookfulltext_key,
            .comiis_lookfulltext_bg{
                display: none !important;
            }`)
        }

    }

    function recoveryIMGWidth() { // 修复图片宽度
        if (GM_getValue("v16") && location.href.match(mt_config.rexp.forum_post)) {
            GM_addStyle(`
            .comiis_messages img{
                max-width: 100% !important;
            }
            `)
        }
    }

    function needRepeatLoadingJSResource() { //帖子内需要重复执行的js

        tryCatch(shieldUser);
        tryCatch(commentsAddReviews);
        tryCatch(identifyLinks);
        tryCatch(showUserUID);
        tryCatch(previewPictures);
        tryCatch(modifyForumPostFontColor);
        popup.init();
    }

    

    
    function loadNextComments() { // 加载下一页的评论
        function autoLoadNextPageComments(post_comments_list) { //自动加载下一页的评论
            $("#loading-comment-tip")[0].parentElement.style.display = "";
            let next_page_url = post_comments_list.children[2].href
            let isloding_flag = false;
            console.log("获取下一页:", next_page_url);
            if (next_page_url.indexOf("javascript:;") != -1) {
                console.log(post_comments_list);
                console.log("无多页评论");
                $("#loading-comment-tip")[0].parentElement.style.display = "none";
                return;
            }
    
            function _loadNextComments_() {
                if (isloding_flag == false) {
                    isloding_flag = true;
                    $("#loading-comment-tip").text("正在加载评论中...");
                    $("#loading-comment-tip")[0].parentElement.style.display = "";
                    $.get(next_page_url, function (data, status, xhr) {
                        console.log("正在请求的下一页url", next_page_url);
                        let postlist = $(data);
                        let kqideSourceNode = $(".comiis_postlist.kqide");
                        let postDOM = postlist.find(".comiis_postlist.kqide").html();
                        let get_next_page_url = postlist.find(".nxt");
                        if (get_next_page_url.length != 0) {
                            console.log("成功获取到下一页-评论");
                            next_page_url = get_next_page_url.attr("href");
                            $("#loading-comment-tip")[0].parentElement.style.display = "none";
                        } else {
                            console.log("评论全部加载完毕,关闭监听事件");
                            $(".comiis_page.bg_f").remove();
                            $("#loading-comment-tip").text("已加载完所有评论")
                            $("#loading-comment-tip")[0].parentElement.style.display = "";
                            $("#loading-comment-tip").unbind("click", _loadNextComments_);
                            $(window).unbind("scroll");
    
                        }
                        isloding_flag = false;
                        kqideSourceNode.append(postDOM);
                        needRepeatLoadingJSResource();
                    })
    
                } else {
                    console.log("正在加载中请稍后");
                }
            }
            $(window).bind("scroll", function () {
                // scroll at bottom
                if (Math.ceil($(window).scrollTop() + $(window).height() + 150) >= $(document).height()) {
                    // load data
                    _loadNextComments_();
                }
            })
            $("#loading-comment-tip").text("请上下滑动或点击加载");
            $("#loading-comment-tip").bind("click", _loadNextComments_);
        }
        if (GM_getValue("v21") && window.location.href.match(mt_config.rexp.forum_post)) {
            let tip_html = `
            <div class="comiis_multi_box bg_f b_t">
                <label class="comiis_loadbtn bg_e f_d" id="loading-comment-tip">
                正在等待页面加载完毕
                </label>
            </div>`;
            $(".comiis_bodybox").append($(tip_html));
            let commentsEle = document.querySelector(".comiis_pltit span.f_d") || document.querySelector("#comiis_foot_memu .comiis_kmvnum");
            if (document.querySelector(".comiis_pltit h2") && document.querySelector(".comiis_pltit h2").textContent.indexOf("暂无评论") != -1) {
                console.log("暂无评论");
                $("#loading-comment-tip")[0].parentElement.style.display = "none";
                return;
            }
            let commentsNum = parseInt(commentsEle.textContent);
            if (commentsNum >= 10) {
                let setAutoLoadInterval = setInterval(function () {
                    let post_comments_list = document.querySelector(".comiis_page.bg_f"); //评论列表
                    if (post_comments_list) {
                        autoLoadNextPageComments(post_comments_list);
                        clearInterval(setAutoLoadInterval);
                    } else {
                        console.log("正在等待下一页列表元素出现");
                    }
                }, 500)
            } else {
                console.log("无多页评论");
                $("#loading-comment-tip")[0].parentElement.style.display = "none";
            }
        }
    }

    function loadPrevComments() { //加载上一页的评论
        function autoLoadPrevPageComments() { //自动加载上一页的评论
            let post_comments_list = document.querySelector(".comiis_page.bg_f");
            let prev_page_url = post_comments_list.children[0].href
            let isloding_flag = false;
            console.log("获取上一页:", prev_page_url);
            $("#loading-comment-tip-prev").text("请上下滑动或点击加载");
            $("#loading-comment-tip-prev").bind("click", loadPrevComments);
    
            function loadPrevComments() {
                if (isloding_flag) {
                    console.log("正在加载上一页中请稍后");
                } else {
                    isloding_flag = true;
                    $("#loading-comment-tip-prev").text("正在加载评论中...");
                    $("#loading-comment-tip-prev")[0].parentElement.style.display = "";
                    $.get(prev_page_url, function (data, status, xhr) {
                        console.log("正在请求的上一页评论:", prev_page_url);
                        let postlist = $(data);
                        let kqideSourceNode = $(".comiis_postlist.kqide");
                        let postDOM = postlist.find(".comiis_postlist.kqide").html();
                        let get_pregv_page_url = postlist.find(".prev");
                        if (get_pregv_page_url.length != 0) {
                            console.log("成功获取到上一页-评论");
                            prev_page_url = get_pregv_page_url.attr("href");
                            $("#loading-comment-tip-prev")[0].parentElement.style.display = "none";
                            isloding_flag = false;
                            kqideSourceNode.prepend(postDOM);
                            needRepeatLoadingJSResource();
                        } else {
                            isloding_flag = false;
                            kqideSourceNode.prepend(postDOM);
    
                            console.log("上一页评论全部加载完毕,关闭监听事件");
                            let page_title = postlist.find(".comiis_viewtit")[0].outerHTML;
                            console.log($(page_title));
                            kqideSourceNode.prepend($(page_title)[0]);
                            needRepeatLoadingJSResource();
                            // $(".comiis_page.bg_f").remove();
                            $("#loading-comment-tip-prev").remove();
                            $("#loading-comment-tip-prev").unbind("click", loadPrevComments);
                            $(window).unbind("scroll");
    
                        }
    
                    })
                }
                // $(window).unbind("scroll",loadPrevComments);
            }
            $(window).bind("scroll", function () {
                if ($(window).scrollTop() <= 50) {
                    loadPrevComments();
                }
            });
        }
    
        if (GM_getValue("v32") && window.location.href.match(mt_config.rexp.forum_post)) {
            if (!document.querySelector(".comiis_pltit span.f_d")) {
                console.log("当前不在第一页,加载上一页评论");
                let tip_html = `
                <div class="comiis_multi_box bg_f b_t">
                    <label class="comiis_loadbtn bg_e f_d" id="loading-comment-tip-prev">
                    正在等待页面加载完毕
                    </label>
                </div>`;
                $(".comiis_bodybox script")[0].after($(tip_html)[0]);
                if (document.querySelector(".comiis_pltit h2") && document.querySelector(".comiis_pltit h2").textContent.indexOf("暂无评论") != -1) {
                    console.log("暂无上一页评论");
                    $("#loading-comment-tip-prev")[0].parentElement.style.display = "none";
                    return;
                }
                autoLoadPrevPageComments();
            }
        }
    }

    function Hooks() { // hook?用不到
        return {
            initEnv: function () {
                Function.prototype.hook = function (realFunc, hookFunc, context) {
                    var _context = null; //函数上下文
                    var _funcName = null; //函数名

                    _context = context || window;
                    _funcName = getFuncName(this);
                    _context['realFunc_' + _funcName] = this;

                    console.log(window);

                    if (_context[_funcName].prototype && _context[_funcName].prototype.isHooked) {
                        console.log("Already has been hooked,unhook first");
                        return false;
                    }

                    function getFuncName(fn) {
                        // 获取函数名
                        var strFunc = fn.toString();
                        var _regex = /function\s+(\w+)\s*\(/;
                        var patten = strFunc.match(_regex);
                        if (patten) {
                            return patten[1];
                        };
                        return '';
                    }
                    try {
                        eval('_context[_funcName] = function ' + _funcName + '(){\n' +
                            'var args = Array.prototype.slice.call(arguments,0);\n' +
                            'var obj = this;\n' +
                            'hookFunc.apply(obj,args);\n' +
                            "return _context['realFunc_" + _funcName + "'].apply(obj,args);\n" +
                            '};');
                        _context[_funcName].prototype.isHooked = true;
                        return true;
                    } catch (e) {
                        console.log("Hook failed,check the params.");
                        return false;
                    }
                }
                Function.prototype.unhook = function (realFunc, funcName, context) {
                    var _context = null;
                    var _funcName = null;
                    _context = context || window;
                    _funcName = funcName;
                    if (!_context[_funcName].prototype.isHooked) {
                        console.log("No function is hooked on");
                        return false;
                    }
                    _context[_funcName] = _context['realFunc' + _funcName];
                    delete _context['realFunc_' + _funcName];
                    return true;
                }
            },
            cleanEnv: function () {
                if (Function.prototype.hasOwnProperty("hook")) {
                    delete Function.prototype.hook;
                }
                if (Function.prototype.hasOwnProperty("unhook")) {
                    delete Function.prototype.unhook;
                }
                return true;
            }
        };
    }

    function pageAfterDOMChangeRunFunction() { // 当页面内容元素添加时需要执行的函数
        if (window.location.href.match(/bbs.binmt.cc\/forum/)) {
            function beforeHookRun() {
                tryCatch(showUserUID);
                tryCatch(previewPictures);
                tryCatch(shieldUser);
                tryCatch(shieldPlate);
            }
            document.body.addEventListener("DOMNodeInserted", (event) => {
                let ele = event.target;
                if (ele.className != null && ele.className.indexOf("comiis_forumlist") != -1) {
                    beforeHookRun();
                }
            })

            


        }
    }

    function previewPictures() { // 贴外预览图片
        if (GM_getValue("v34") &&
            ((window.location.href.match(mt_config.rexp.forum_post_guide_url) ||
                (window.location.href.match(mt_config.rexp.forum_post)) ||
                (window.location.href.match(mt_config.rexp.plate_url)) ||
                (window.location.href.match(mt_config.rexp.search_url))
            ))) {
            function getFormList() {
                let formList = mt_config.dom_obj.comiis_formlist() ? mt_config.dom_obj.comiis_formlist() : [];
                formList = formList.length == 0 ? mt_config.dom_obj.comiis_postli() : formList;
                formList = formList.length == 0 ? mt_config.dom_obj.comiis_mmlist() : formList;
                return formList;
            }

            let formlist = null;
            let isFindFormList = false;
            let findFormListNums = 0;
            let waitFormListAppear = setInterval(function () {
                if (isFindFormList) {
                    formlist = getFormList();
                    main();
                    clearInterval(waitFormListAppear)
                } else {
                    if (findFormListNums >= 10) {
                        console.log("未出现帖子或寻找贴子超时,清理定时器");
                        clearInterval(waitFormListAppear);
                    }
                    isFindFormList = getFormList().length ? true : false;
                    findFormListNums += 1;
                }
            }, 800);

            function getPreviewPicturesEle(dom) {
                let pre_dom = document.createElement("li");
                pre_dom.className = "f_c";
                pre_dom.setAttribute("style", "width:25vw;");
                let imageDOM = dom.querySelectorAll(".comiis_pyqlist_img").length ? dom.querySelectorAll(".comiis_pyqlist_img") : dom.querySelectorAll(".comiis_pyqlist_imgs");
                if (imageDOM.length) {
                    pre_dom.innerHTML = '<a class="topreimg">预览图片</a>';
                    $.each(imageDOM, function (i, v) {
                        let imgs = v.querySelectorAll("img");
                        Array.from(imgs).forEach(_img_ => {
                            pre_dom.innerHTML = pre_dom.innerHTML + `<img data-src="${_img_.getAttribute("src")}">`;
                        })
                    })
                    pre_dom.onclick = function () {
                        let img_list = $(this)[0].querySelectorAll("img");
                        let img_items = [];
                        let now_picture_num = 1;
                        for (var k = 0; k < img_list.length; k++) {
                            let img_url = img_list[k].getAttribute("data-src");
                            let img_dict = {};
                            let full_picture = null;
                            if (img_url.match(/res-bbs.mt2.cn/) && img_url.match(/size=[\d]*x9999/)) {
                                console.log("gif图");
                                full_picture = img_url;
                            } else {
                                // full_picture = img_url.replace(/size=[\d]*x[\d]*/, "size=600x1000");
                                // full_picture = full_picture.replace(/_[\d]*_[\d]*.jpg/, "_600_1000.jpg");
                                full_picture = img_url;
                            }

                            img_dict["src"] = full_picture;
                            img_dict["srct"] = img_url;
                            img_dict["title"] = "图片" + now_picture_num.toString();
                            img_dict["ID"] = hex_md5(img_url);
                            img_items.push(img_dict);
                            now_picture_num = now_picture_num + 1;
                        }
                        $('#picture_review').nanogallery2('destroy');
                        jQuery("#picture_review").nanogallery2({
                            thumbnailWidth: 150,
                            thumbnailHeight: 150,
                            items: img_items,
                            thumbnailSelectable: false
                        });
                        window.location.hash = '#nanogallery/picture_review/0/' + img_items[0]["ID"];
                    }
                    return pre_dom;
                } else {
                    // pre_dom.innerHTML = '无';
                    return null;
                }

            }

            function main() {
                // blackHome.loadJS("https://lf26-cdn-tos.bytecdntp.com/cdn/expire-1-M/nanogallery2/3.0.5/jquery.nanogallery2.min.js");
                if (window.hasOwnProperty("loadPreviewPictureCSS")) {
                    console.log("已加载过预览图片");
                } else {
                    GM_asyncLoadStyleSheet("https://lf3-cdn-tos.bytecdntp.com/cdn/expire-1-M/nanogallery2/3.0.5/css/nanogallery2.min.css");
                    GM_asyncLoadStyleSheet("https://lf3-cdn-tos.bytecdntp.com/cdn/expire-1-M/nanogallery2/3.0.5/css/nanogallery2.woff.min.css");
                    window.loadPreviewPictureCSS = true;
                }
                let global_review = document.createElement("div");

                global_review.id = "picture_review";
                // $(".comiis_bodybox")[0].prepend(global_review);  // debug使用
                global_review.setAttribute("style", "display:none");
                document.body.append(global_review);
                $.each(formlist, function (index, value) {
                    let formBottomEle = value.querySelectorAll(".comiis_znalist_bottom.b_t.cl ul.cl li");
                    if (formBottomEle.length == 3) {
                        let clParentEle = formBottomEle[0].parentElement;
                        let previewPicturesEle = getPreviewPicturesEle(value);
                        if (previewPicturesEle != null) {
                            Array.from(formBottomEle).forEach(e => {
                                e.setAttribute("style", "width: 25vw");
                            });
                            clParentEle.append(previewPicturesEle);
                        }


                    } else if (formBottomEle.length == 4) {
                        console.log("已经插入过预览图片");
                    } else {
                        console.log("没有阅读、评论、赞");
                    }

                })
            }
        }
    }

    function repairClearSearchInput() { // 修复搜索的清空按钮
        if (GM_getValue("v36") && window.location.href.match(mt_config.rexp.search_url)) {
            let $search_input = $(".ssclose.bg_e.f_e");
            if ($search_input) {
                $search_input.click(function (e) {
                    e.preventDefault();
                    $("#scform_srchtxt").val("")
                })
            } else {
                log.error("搜索界面: 获取清空按钮失败");
            }
        }

    }

    function repairUnableToEnterOtherSpaceCorrectly() { // 修复无法正确进入别人的空间
        if (GM_getValue("v37") && window.location.href.match(mt_config.rexp.home_url_brief)) {
            let href_params = window.location.href.match(/home.php\?(.+)/gi);
            href_params = href_params[href_params.length - 1];
            let params_split = href_params.split("&");
            if (params_split.length == 2 && href_params.indexOf("uid=") != -1 && href_params.indexOf("mod=space") != -1) {
                window.location.href = window.location.href + "&do=profile";
            }
        }

    }

    function postForumKGChartBed() { // 发帖快捷图片上传 康哥图床
        if (!window.location.href.match(mt_config.rexp.post_forum) &&
            !window.location.href.match(mt_config.rexp.edit_forum) &&
            !window.location.href.match(mt_config.rexp.reply_forum) &&
            !window.location.href.match(mt_config.rexp.forum_post) ||
            !GM_getValue("v42")) {
            return
        };
        GM_addStyle(`
        .comiis_post_imglist li.up_btn_kggzs a{
            display: block;
            width: 50px;
            height: 50px;
            line-height: 50px;
            padding: 4px;
            border-radius: 2px;
            border-style: dashed;
        }
        .comiis_post_imglist li.up_btn_kggzs a i {
            position: absolute;
            top: 11px;
            left: 5px;
            z-index: 8;
            font-size: 26px;
            width: 50px;
            height: 50px;
            line-height: 50px;
            text-align: center;
        }
        .comiis_post_imglist li.up_btn_kggzs a input {
            position:absolute;
            top:11px;
            left:5px;
            height:50px;
            width:50px;
            z-index:10;
            opacity:0
        }
        .comiis_post_imglist li .delImg {
            position:absolute;
            top:-5px;
            left:-5px
        }
        .comiis_post_imglist li .delImg i {
            font-size:24px;
            background:#fff;
            border-radius:50%
        }
        #imglist_kggzs{
            overflow-y: auto;
            max-height: 200px;
        }
        #kggzsfiledata{
            display:none;
        }
        `);
        let imgListParent = $(".comiis_upbox.comiis_allowpostimg.bg_f.cl");
        if (!imgListParent.length) {
            imgListParent = $("#comiis_post_tab .comiis_upbox.bg_f.b_t.b_b.cl");
            if (!imgListParent.length) {
                console.log("未找到图片列表父元素");
                return;
            }
        };
        let imgUploadBtn = `
                <ul id="imglist_kggzs" class="comiis_post_imglist cl">
                    <li class="up_btn_kggzs">
                        <a href="javascript:;" class="bg_e b_ok f_d" id="kggzsChartBedBtnUpload">
                            <p style="position: relative;bottom: 20px;text-align: center;color: #000;">kggzs</p>
                            <i class="comiis_font"></i>
                            <input type="file" name="Filedata" id="kggzsfiledata" accept="image/*" multiple="multiple">
                            <p style="position: relative;bottom: 30px;text-align: center;">20MB</p>
                        </a>
                    </li>				
                </ul>
        `;
        imgListParent.append($(imgUploadBtn));
        let chartBedUrl = "https://img.kggzs.cn/api/v1";
        let chartBedUser = GM_getValue("KggzsChartBedUser");
        let chartBedPwd = GM_getValue("KggzsChartBedPwd");
        let chartBedToken = null;
        let loginStatus = false; // 登录状态
        let tokenStatus = false; //token状态
        let code = {
            401: "未登录或授权失败",
            403: "管理员关闭了接口功能",
            429: "超出请求配额,请求受限",
            500: "服务端出现异常"
        }

        function getToken() {
            return new Promise(res => {
                let formData = new FormData();
                formData.append("email", "[email protected]");
                formData.append("password", "893177236");
                GM_xmlhttpRequest({
                    url: `${chartBedUrl}/tokens`,
                    method: "POST",
                    data: formData,
                    headers: {
                        "Accept": "application/json"
                    },
                    onload: (r) => {
                        if (code[r.status] != null) {
                            popup.open(code[r.status], 'alert');
                            res(null);
                            return;
                        }
                        let json_data = JSON.parse(r.response);
                        if (json_data["status"]) {
                            popup.open("token成功获取", "alert");
                            res(json_data["data"]["token"]);
                        } else {
                            popup.open(json_data["message"], "alert");
                            res(null);
                        }
                    },
                    onerror: () => {
                        popup.open("网络异常");
                        res(null);
                    }
                })
            })
        }

        function uploadImage(imageFile) {
            let res_data = {
                "imageUri": null,
                "json_data": null
            };
            let form = new FormData();
            form.append("strategy_id", 3);
            form.append("file", imageFile);
            return new Promise(res => {
                GM_xmlhttpRequest({
                    url: `${chartBedUrl}/upload`,
                    method: "POST",
                    data: form,
                    async: false,
                    dataType: "json",
                    headers: {
                        "Accept": "application/json",
                        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.64 Safari/537.36 Edg/101.0.1210.53",
                        "Referer": `${chartBedUrl}/`,
                        "Authorization": `Bearer ${chartBedToken}`,
                        "Origin": chartBedUrl,
                    },
                    onload: (r) => {
                        if (code[r.status] != null) {
                            popup.open(code[r.status], 'alert');
                            res(res_data);
                            return;
                        }
                        let json_data = JSON.parse(r.response);
                        console.log(json_data);

                        if (json_data["status"]) {
                            popup.open('上传成功', 'alert');
                            let file_reader = new FileReader();
                            //FileReader主要用于将文件内容读入内存,通过一系列异步接口,可以在主线程中访问本地文件
                            file_reader.readAsDataURL(imageFile); //读取图片的内容生成的base64编码的图
                            //读取完成后,执行该回调函数,它会返回读取的结果result		
                            file_reader.onload = (function () {
                                let imageUri = this.result; // 此时的图片已经存储到了result中	
                                res_data["imageUri"] = imageUri;
                                res_data["json_data"] = json_data;
                                res(res_data);
                            });
                        } else {
                            console.log(json_data);
                            popup.open(json_data["message"], 'alert');
                            res(res_data);
                        }

                    },
                    onerror: (r) => {
                        popup.open("网络异常", 'alert');
                        res(res_data);
                    }
                })
            })
        }

        function deleteImage(imageKey) {
            return new Promise(res => {
                GM_xmlhttpRequest({
                    url: `${chartBedUrl}/images/:${imageKey}`,
                    method: "DELETE",
                    async: false,
                    data: JSON.stringify({
                        "key": ""
                    }),
                    dataType: "json",
                    headers: {
                        "Accept": "application/json",
                        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.64 Safari/537.36 Edg/101.0.1210.53",
                        "Referer": `${chartBedUrl}/`,
                        "Authorization": `Bearer ${chartBedToken}`,
                        "Origin": chartBedUrl,
                    },
                    onload: (r) => {
                        if (code[r.status] != null) {
                            popup.open(code[r.status], 'alert');
                            res(res_data);
                            return;
                        }
                        let json_data = JSON.parse(r.response);
                        console.log(json_data);
                    },
                    onerror: (r) => {
                        popup.open("网络异常", 'alert');
                        res(res_data);
                    }
                })
            })
        }

        function clearData() {
            chartBedUser = "";
            chartBedPwd = "";
            chartBedToken = null;
            loginStatus = false;
            tokenStatus = false;
            GM_deleteValue("KggzsChartBedUser");
            GM_deleteValue("KggzsChartBedPwd");
        }

        $("#kggzsChartBedBtnUpload i").on("click", async function () {
            if (tokenStatus) {
                popup.open('正在配置中...', 'alert');
                return;
            }
            if (!chartBedUser || !chartBedPwd) {
                let userInput = prompt('请输入康哥图床的用户和密码,使用空格分割');
                if (userInput) {
                    let userInputSplit = userInput.split(" ");
                    let user = userInputSplit[0];
                    let pwd = userInputSplit[1];
                    GM_setValue("KggzsChartBedUser", user);
                    GM_setValue("KggzsChartBedPwd", pwd);
                    chartBedUser = user;
                    chartBedPwd = pwd;
                    popup.open('设置完毕,请重新点击', 'alert');
                }
            } else if (chartBedToken == null || !loginStatus) {
                tokenStatus = true;
                popup.open('正在配置token', 'alert');
                chartBedToken = await getToken();
                console.log("token:" + chartBedToken);
                if (chartBedToken != null) {
                    $("#kggzsfiledata").click();
                } else {
                    clearData();
                }
                tokenStatus = false;

            } else {
                $("#kggzsfiledata").click();
            }
        });
        $("#kggzsfiledata").on("change", (e) => {
            let chooseImageFiles = e.currentTarget.files;
            if (chooseImageFiles.length == 0) {
                return
            };
            popup.open("上传图片中...请稍后", "alert");
            console.log(`图片数量:${chooseImageFiles.length}`);
            $.each(chooseImageFiles, async (i) => {
                let imageFile = chooseImageFiles[i];
                let uploadImageReturn = await uploadImage(imageFile);
                if (uploadImageReturn["json_data"] != null) {
                    console.log(uploadImageReturn);
                    let image_id_encoded = uploadImageReturn["json_data"]["data"]["key"];
                    let image_url = uploadImageReturn["json_data"]["data"]["links"]["url"];
                    let image_thumb_url = uploadImageReturn["json_data"]["data"]["links"]["thumbnail_url"];
                    let image_name = uploadImageReturn["json_data"]["data"]["origin_name"];
                    let image_uri = uploadImageReturn["imageUri"];
                    let uploadImageHTML = `<li>
                            <span class="delImg" id-encode="${image_id_encoded}">
                                <a href="javascript:;">
                                    <i class="comiis_font f_g"></i>
                                </a>
                            </span>
                            <span class="charu f_f">插入</span>
                            <span class="p_img">
                                <a href="javascript:;" onclick="comiis_addsmilies('[url=${image_url}][img]${image_url}[/img][/url]')">
                                    <img style="height:54px;width:54px;" title="${image_name}" src="${image_uri}" class="vm b_ok"></a>
                            </span>
                            <input type="hidden" name="">
                        </li>`;
                    $("#imglist_kggzs").append($(uploadImageHTML));
                    chartBed.storage.add("kggzs", image_id_encoded, image_url, image_thumb_url, image_name);
                }
            })
            $("#kggzsfiledata").val("");

        });
        $("#imglist_kggzs").on("click", ".delImg", async (e) => {
            e.preventDefault();
            e.currentTarget.parentElement.remove();
            // popup.open('删除中,请稍后', 'alert');
            // let id_encoded = e.currentTarget.getAttribute("id-encode");
            // if(!id_encoded){
            //     popup.open('获取id_encoded失败,请自行去Hello图床删除', 'alert');
            //     return;
            // }
            // let deleteStatus = await deleteImage(key);
            // if(deleteStatus){
            //     e.currentTarget.parentElement.remove();
            //     chartBed.storage.delete("kggzs",id_encoded);
            // }
        })

    }

    function postForumHelloChartBed() { // 发帖快捷图片上传Hello图床
        if (!window.location.href.match(mt_config.rexp.post_forum) &&
            !window.location.href.match(mt_config.rexp.edit_forum) &&
            !window.location.href.match(mt_config.rexp.reply_forum) &&
            !window.location.href.match(mt_config.rexp.forum_post) ||
            !GM_getValue("v38")) {
            return
        };

        GM_addStyle(`
        .comiis_post_imglist li.up_btn_hello a{
            display: block;
            width: 50px;
            height: 50px;
            line-height: 50px;
            padding: 4px;
            border-radius: 2px;
            border-style: dashed;
        }
        .comiis_post_imglist li.up_btn_hello a i {
            position: absolute;
            top: 11px;
            left: 5px;
            z-index: 8;
            font-size: 26px;
            width: 50px;
            height: 50px;
            line-height: 50px;
            text-align: center;
        }
        .comiis_post_imglist li.up_btn_hello a input {
            position:absolute;
            top:11px;
            left:5px;
            height:50px;
            width:50px;
            z-index:10;
            opacity:0
        }
        .comiis_post_imglist li .delImg {
            position:absolute;
            top:-5px;
            left:-5px
        }
        .comiis_post_imglist li .delImg i {
            font-size:24px;
            background:#fff;
            border-radius:50%
        }
        #imglist_hello{
            overflow-y: auto;
            max-height: 200px;
        }
        #hellofiledata{
            display:none;
        }
        `);

        let imgListParent = $(".comiis_upbox.comiis_allowpostimg.bg_f.cl");
        if (!imgListParent.length) {
            imgListParent = $("#comiis_post_tab .comiis_upbox.bg_f.b_t.b_b.cl");
            if (!imgListParent.length) {
                console.log("未找到图片列表父元素");
                return;
            }
        };
        let imgUploadBtn = `
                <ul id="imglist_hello" class="comiis_post_imglist cl">
                    <li class="up_btn_hello">
                        <a href="javascript:;" class="bg_e b_ok f_d" id="helloChartBedBtnUpload">
                            <p style="position: relative;bottom: 20px;text-align: center;color: #000;">Hello</p>
                            <i class="comiis_font"></i>
                            <input type="file" name="Filedata" id="hellofiledata" accept="image/*" multiple="multiple">
                            <p style="position: relative;bottom: 30px;text-align: center;">20MB</p>
                        </a>
                    </li>				
                </ul>
        `;
        imgListParent.append($(imgUploadBtn));
        let chartBedUrl = "https://www.helloimg.com";
        let chartBedUser = GM_getValue("HelloChartBedUser");
        let chartBedPwd = GM_getValue("HelloChartBedPwd");
        let chartBedAuthToken = null;
        let loginStatus = false; // 登录状态
        let authTokenStatus = false; //authToken状态

        let clearData = () => {
            GM_deleteValue("HelloChartBedUser");
            GM_deleteValue("HelloChartBedPwd");
            loginStatus = false;
            authTokenStatus = false;
            chartBedUser = "";
            chartBedPwd = "";
            chartBedAuthToken = null;
        }
        $("#helloChartBedBtnUpload i").on("click", async function () {
            if (authTokenStatus) {
                popup.open('正在配置中...', 'alert');
                return;
            }
            if (!chartBedUser || !chartBedPwd) {
                let userInput = prompt('请输入Hello图床的用户和密码,使用空格分割');
                if (userInput) {
                    let userInputSplit = userInput.split(" ");
                    let user = userInputSplit[0];
                    let pwd = userInputSplit[1];
                    GM_setValue("HelloChartBedUser", user);
                    GM_setValue("HelloChartBedPwd", pwd);
                    chartBedUser = user;
                    chartBedPwd = pwd;
                    popup.open('设置完毕,请重新点击', 'alert');
                }
            } else if (chartBedAuthToken == null || !loginStatus) {
                authTokenStatus = true;
                popup.open('正在配置auth_token', 'alert');
                chartBedAuthToken = await chartBed.getAuthToken(chartBedUrl);
                console.log("auth_token:" + chartBedAuthToken);
                if (chartBedAuthToken != null) {
                    popup.open('正在登录Hello图床', 'alert');
                    let retloginStatus = await chartBed.login(chartBedUrl, chartBedUser, chartBedPwd, chartBedAuthToken);
                    if (retloginStatus) {
                        loginStatus = true;
                        $("#hellofiledata").click();
                    } else if (retloginStatus == false) {
                        clearData();
                    }
                }
                authTokenStatus = false;

            } else {
                $("#hellofiledata").click();
            }
        })
        $("#hellofiledata").on("change", (e) => {
            let chooseImageFiles = e.currentTarget.files;
            if (chooseImageFiles.length == 0) {
                return
            };
            popup.open("上传图片中...请稍后", "alert");
            console.log(`图片数量:${chooseImageFiles.length}`);
            $.each(chooseImageFiles, async (i) => {
                let imageFile = chooseImageFiles[i];
                let uploadImageReturn = await chartBed.uploadImage(chartBedUrl, chartBedAuthToken, imageFile);
                if (uploadImageReturn["json_data"] != null) {
                    let image_id_encoded = uploadImageReturn["json_data"]["image"]["id_encoded"];
                    let image_url = uploadImageReturn["json_data"]["image"]["url"];
                    let image_thumb_url = uploadImageReturn["json_data"]["image"]["thumb"]["url"];
                    let image_name = uploadImageReturn["json_data"]["image"]["filename"];
                    let image_uri = uploadImageReturn["imageUri"];
                    let uploadImageHTML = `<li>
                            <span class="delImg" id-encode="${image_id_encoded}">
                                <a href="javascript:;">
                                    <i class="comiis_font f_g"></i>
                                </a>
                            </span>
                            <span class="charu f_f">插入</span>
                            <span class="p_img">
                                <a href="javascript:;" onclick="comiis_addsmilies('[url=${image_url}][img]${image_url}[/img][/url]')">
                                    <img style="height:54px;width:54px;" title="${image_name}" src="${image_uri}" class="vm b_ok"></a>
                            </span>
                            <input type="hidden" name="">
                        </li>`;
                    $("#imglist_hello").append($(uploadImageHTML));
                    chartBed.storage.add("hello", image_id_encoded, image_url, image_thumb_url, image_name);
                }
            })
            $("#hellofiledata").val("");

        })
        $("#imglist_hello").on("click", ".delImg", async (e) => {
            e.preventDefault();
            popup.open('删除中,请稍后', 'alert');
            let id_encoded = e.currentTarget.getAttribute("id-encode");
            if (!id_encoded) {
                popup.open('获取id_encoded失败,请自行去Hello图床删除', 'alert');
                return;
            }
            let deleteStatus = await chartBed.deleteImage(chartBedUrl, chartBedAuthToken, id_encoded);
            if (deleteStatus) {
                e.currentTarget.parentElement.remove();
                chartBed.storage.delete("hello", id_encoded);
            }
        })
    }


    async function postForumZ4aChartBed() { // 发帖快捷图片上传z4a图床
        if (!window.location.href.match(mt_config.rexp.post_forum) &&
            !window.location.href.match(mt_config.rexp.edit_forum) &&
            !window.location.href.match(mt_config.rexp.reply_forum) &&
            !window.location.href.match(mt_config.rexp.forum_post) ||
            !GM_getValue("v39")) {
            return
        };
        let imgListParent = $(".comiis_upbox.comiis_allowpostimg.bg_f.cl");
        if (!imgListParent.length) {
            imgListParent = $("#comiis_post_tab .comiis_upbox.bg_f.b_t.b_b.cl");
            if (!imgListParent.length) {
                console.log("未找到图片列表父元素");
                return;
            }
        };
        GM_addStyle(`
        .comiis_post_imglist li.up_btn_z4a a{
            display: block;
            width: 50px;
            height: 50px;
            line-height: 50px;
            padding: 4px;
            border-radius: 2px;
            border-style: dashed;
        }
        .comiis_post_imglist li.up_btn_z4a a i {
            position: absolute;
            top: 11px;
            left: 5px;
            z-index: 8;
            font-size: 26px;
            width: 50px;
            height: 50px;
            line-height: 50px;
            text-align: center;
        }
        .comiis_post_imglist li.up_btn_z4a a input {
            position:absolute;
            top:11px;
            left:5px;
            height:50px;
            width:50px;
            z-index:10;
            opacity:0
        }
        .comiis_post_imglist li .delImg {
            position:absolute;
            top:-5px;
            left:-5px
        }
        .comiis_post_imglist li .delImg i {
            font-size:24px;
            background:#fff;
            border-radius:50%
        }
        #imglist_z4a{
            overflow-y: auto;
            max-height: 200px;
        }
        #z4afiledata{
            display:none;
        }
        `);
        let imgUploadBtn = `
                <ul id="imglist_z4a" class="comiis_post_imglist cl">
                    <li class="up_btn_z4a">
                        <a href="javascript:;" class="bg_e b_ok f_d" id="z4aChartBedBtnUpload">
                            <p style="position: relative;bottom: 20px;text-align: center;color: #000;">Z4A</p>
                            <i class="comiis_font"></i>
                            <input type="file" name="Filedata" id="z4afiledata" accept="image/*" multiple="multiple">
                            <p style="position: relative;bottom: 30px;text-align: center;">50MB</p>
                        </a>
                    </li>				
                </ul>
        `;
        imgListParent.append($(imgUploadBtn));

        let chartBedUrl = "https://www.z4a.net";
        let chartBedUser = GM_getValue("Z4AChartBedUser");
        let chartBedPwd = GM_getValue("Z4AChartBedPwd");
        let chartBedAuthToken = null;
        let loginStatus = false; // 登录状态
        let authTokenStatus = false; //authToken状态

        let clearData = () => {
            GM_deleteValue("Z4AChartBedUser");
            GM_deleteValue("Z4AChartBedPwd");
            loginStatus = false;
            authTokenStatus = false;
            chartBedUser = "";
            chartBedPwd = "";
            chartBedAuthToken = null;
        }
        $("#z4aChartBedBtnUpload i").on("click", async function () {
            if (authTokenStatus) {
                popup.open('正在配置中...', 'alert');
                return;
            }
            if (!chartBedUser || !chartBedPwd) {
                let userInput = prompt('请输入Z4A图床的用户和密码,使用空格分割');
                if (userInput) {
                    let userInputSplit = userInput.split(" ");
                    let user = userInputSplit[0];
                    let pwd = userInputSplit[1];
                    GM_setValue("Z4AChartBedUser", user);
                    GM_setValue("Z4AChartBedPwd", pwd);
                    chartBedUser = user;
                    chartBedPwd = pwd;
                    popup.open('设置完毕,请重新点击', 'alert');
                }
            } else if (chartBedAuthToken == null || !loginStatus) {
                authTokenStatus = true;
                popup.open('正在配置auth_token', 'alert');
                chartBedAuthToken = await chartBed.getAuthToken(chartBedUrl);
                console.log("auth_token:" + chartBedAuthToken);
                if (chartBedAuthToken != null) {
                    popup.open('正在登录Z4A图床', 'alert');
                    let retloginStatus = await chartBed.login(chartBedUrl, chartBedUser, chartBedPwd, chartBedAuthToken);
                    if (retloginStatus) {
                        loginStatus = true;
                        $("#z4afiledata").click();
                    } else if (retloginStatus == false) {
                        clearData();
                    }
                }
                authTokenStatus = false;

            } else {
                $("#z4afiledata").click();
            }
        })
        $("#z4afiledata").on("change", (e) => {
            let chooseImageFiles = e.currentTarget.files;
            if (chooseImageFiles.length == 0) {
                return
            };
            popup.open("上传图片中...请稍后", "alert");
            console.log(`图片数量:${chooseImageFiles.length}`);
            $.each(chooseImageFiles, async (i) => {
                let imageFile = chooseImageFiles[i];
                let uploadImageReturn = await chartBed.uploadImage(chartBedUrl, chartBedAuthToken, imageFile);
                if (uploadImageReturn["json_data"] != null) {
                    let image_id_encoded = uploadImageReturn["json_data"]["image"]["id_encoded"];
                    let image_url = uploadImageReturn["json_data"]["image"]["url"];
                    let image_thumb_url = uploadImageReturn["json_data"]["image"]["thumb"]["url"];
                    let image_name = uploadImageReturn["json_data"]["image"]["filename"];
                    let image_uri = uploadImageReturn["imageUri"];
                    let uploadImageHTML = `<li>
                            <span class="delImg" id-encode="${image_id_encoded}">
                                <a href="javascript:;">
                                    <i class="comiis_font f_g"></i>
                                </a>
                            </span>
                            <span class="charu f_f">插入</span>
                            <span class="p_img">
                                <a href="javascript:;" onclick="comiis_addsmilies('[url=${image_url}][img]${image_url}[/img][/url]')">
                                    <img style="height:54px;width:54px;" title="${image_name}" src="${image_uri}" class="vm b_ok"></a>
                            </span>
                            <input type="hidden" name="">
                        </li>`;
                    $("#imglist_z4a").append($(uploadImageHTML));
                    chartBed.storage.add("z4a", image_id_encoded, image_url, image_thumb_url, image_name);
                }
            })
            $("#z4afiledata").val("");

        })
        $("#imglist_z4a").on("click", ".delImg", async (e) => {
            e.preventDefault();
            popup.open('删除中,请稍后', 'alert');
            let id_encoded = e.currentTarget.getAttribute("id-encode");
            if (!id_encoded) {
                popup.open('获取id_encoded失败,请自行去Z4A图床删除', 'alert');
                return;
            }
            let deleteStatus = await chartBed.deleteImage(chartBedUrl, chartBedAuthToken, id_encoded);
            if (deleteStatus) {
                e.currentTarget.parentElement.remove();
                chartBed.storage.delete("z4a", id_encoded);
            }
        })
    }

    const chartBed = {
        ret_code: {
            200: {
                200: "删除成功"
            },
            500: {
                101: "重复上传",
                400: "请求被拒绝,token错误",
                401: "请求被拒绝",
            },
            400: {
                100: "删除失败,图片已删除",
                101: "重复上传",
            }
        },
        storage: {
            add: function (web, id_encoded, url, thumb_url, name) {
                let localData = GM_getValue("chartBedsImagesHistory") ? GM_getValue("chartBedsImagesHistory") : [];
                let saveData = localData.concat({
                    "web": web,
                    "id_encoded": id_encoded,
                    "url": url,
                    "thumb_url": thumb_url,
                    "name": name
                });
                GM_setValue("chartBedsImagesHistory", saveData);
            },
            delete: function (_web_, id_encoded) {
                let localData = GM_getValue("chartBedsImagesHistory") ? GM_getValue("chartBedsImagesHistory") : [];
                Array.from(localData).forEach((item, index) => {
                    if (item["web"] == _web_ && item["id_encoded"] == id_encoded) {
                        localData.splice(index, 1);
                        GM_setValue("chartBedsImagesHistory", localData);
                        return;
                    }
                })
            },
            get: function () {
                return GM_getValue("chartBedsImagesHistory") ? GM_getValue("chartBedsImagesHistory") : [];
            }
        },
        getAuthToken(url) { // 获取图床的auth_token
            return new Promise(res => {
                GM_xmlhttpRequest({
                    url: url,
                    method: "GET",
                    headers: {
                        'user-agent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Mobile Safari/537.36 Edg/94.0.992.38'
                    },
                    onload: (r) => {
                        let token = r.response.match(/PF.obj.config.auth_token[\s]*=[\s]*"(.+)";/i);
                        if (token.length == 2) {
                            popup.open("auth_token成功获取", "alert");
                            res(token[1]);
                        } else {
                            console.log(r);
                            popup.open("auth_token获取失败", "alert");
                            res(null);
                        }
                    },
                    onerror: () => {
                        popup.open("网络异常", "alert");
                        res(null)
                    }
                })
            })
        },
        login(url, user, pwd, auth_token) { // 图床登录
            return new Promise(res => {
                GM_xmlhttpRequest({
                    url: `${url}/login`,
                    method: "POST",
                    data: `login-subject=${user}&password=${pwd}&auth_token=${auth_token}`,
                    headers: {
                        "Content-Type": "application/x-www-form-urlencoded"
                    },
                    onload: (e) => {
                        console.log(e);
                        if (e.status == 200 && e.response.match("注销")) {
                            popup.open('登陆成功', 'alert');
                            res(true);
                        } else {
                            popup.open('登录失败', 'alert');
                            res(false);
                        }
                    },
                    onerror: () => {
                        popup.open('网络异常', 'alert');
                        res(404);
                    }
                })
            });
        },
        uploadImage(url, auth_token, imageFile) { // 上传图片请求
            let res_data = {
                "imageUri": null,
                "json_data": null
            };
            let form = new FormData();
            form.append("type", "file");
            form.append("action", "upload");
            form.append("timestamp", new Date().getTime());
            form.append("auth_token", auth_token);
            form.append("nsfw", 0);
            form.append("source", imageFile);
            return new Promise(res => {
                GM_xmlhttpRequest({
                    url: `${url}/json`,
                    method: "POST",
                    data: form,
                    async: false,
                    dataType: "json",
                    headers: {
                        "Accept": "application/json",
                        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.64 Safari/537.36 Edg/101.0.1210.53",
                        "Referer": `${url}/`,
                        "Origin": url,
                    },
                    onload: (r) => {
                        let json_data = JSON.parse(r.response);
                        console.log(json_data);
                        let status_code = json_data["status_code"];

                        if (status_code == 200) {
                            popup.open('上传成功', 'alert');
                            let file_reader = new FileReader();
                            //FileReader主要用于将文件内容读入内存,通过一系列异步接口,可以在主线程中访问本地文件
                            file_reader.readAsDataURL(imageFile); //读取图片的内容生成的base64编码的图
                            //读取完成后,执行该回调函数,它会返回读取的结果result		
                            file_reader.onload = (function () {
                                let imageUri = this.result; // 此时的图片已经存储到了result中	
                                res_data["imageUri"] = imageUri;
                                res_data["json_data"] = json_data;
                                res(res_data);
                            });
                        } else if (chartBed.ret_code[status_code] != null && chartBed.ret_code[status_code][json_data["error"]["code"]] != null) {
                            popup.open(chartBed.ret_code[status_code][json_data["error"]["code"]], 'alert');
                            res(res_data);
                        } else {
                            console.log(json_data);
                            res(res_data);
                        }

                    },
                    onerror: (r) => {
                        console.log(r.response);
                        popup.open("网络异常", 'alert');
                        res(res_data);
                    }
                })
            })

        },
        deleteImage(url, auth_token, id_encoded) { // 删除图片请求
            return new Promise(res => {
                GM_xmlhttpRequest({
                    url: `${url}/json`,
                    method: "POST",
                    data: `auth_token=${auth_token}&action=delete&single=true&delete=image&deleting[id]=${id_encoded}`,
                    headers: {
                        "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8"
                    },
                    onload: (e) => {
                        let json_data = JSON.parse(e.response);
                        let status_code = json_data["status_code"];

                        if (status_code == 200 && json_data["success"]["code"] == 200) {
                            popup.open(chartBed.ret_code["200"]["200"], 'alert');
                            res(true);
                        } else if (status_code == 400 && json_data["error"]["code"] == 100) {
                            popup.open(chartBed.ret_code["400"]["100"], 'alert');
                            res(true);
                        } else if (chartBed.ret_code[status_code] != null && chartBed.ret_code[status_code][json_data["error"]["code"]] != null) {
                            popup.open(chartBed.ret_code[status_code][json_data["error"]["code"]], 'alert');
                            res(false);
                        } else {
                            console.log(json_data);
                            popup.open(json_data["error"]["message"], 'alert');
                            res(false);
                        }

                    },
                    onerror: () => {
                        popup.open('网络异常', 'alert');
                        res(false);
                    }
                })
            })
        },

    }



    function chatChartBed() { // 聊天快捷图片上传到图床(总)
        if (!window.location.href.match(mt_config.rexp.chat_url) ||
            !GM_getValue("v40") ||
            !GM_getValue("v41")
        ) {
            return
        };
        let imgBtn = `<a href="javascript:;" class="comiis_pictitle"><i class="comiis_font"></i></a>`;
        let menu = `<div class="comiis_minibq bg_f cl" style="display: none;"><div class="imgboxlist"></div><div class="bqbox_t bg_e cl"><ul id="comiis_img_chartbed_key"></ul></div></div>`;
        $(".styli_tit.comiis_post_ico.f_c.cl").append($(imgBtn));
        $("#comiis_post_tab").append($(menu));
        $(".comiis_pictitle").on("click", (e) => {
            let toShow = false;
            $("#comiis_post_tab .comiis_minibq").filter(function (i, v) {
                if (v.style.display != 'none') {
                    toShow = true;
                }
            });
            if (toShow) {
                $(".comiis_foot_height").removeClass("comiis_show_smiley");
            } else {
                $(".comiis_foot_height").addClass("comiis_show_smiley");
            }
        });
        GM_addStyle(`
        .comiis_post_imglist li.up_btn_kggzs a,
        .comiis_post_imglist li.up_btn_hello a,
        .comiis_post_imglist li.up_btn_z4a a{
            display: block;
            width: 50px;
            height: 50px;
            line-height: 50px;
            padding: 4px;
            border-radius: 2px;
            border-style: dashed;
        }
        .comiis_post_imglist li.up_btn_kggzs a i,
        .comiis_post_imglist li.up_btn_hello a i,
        .comiis_post_imglist li.up_btn_z4a a i  {
            position: absolute;
            top: 11px;
            left: 5px;
            z-index: 8;
            font-size: 26px;
            width: 50px;
            height: 50px;
            line-height: 50px;
            text-align: center;
        }
        .comiis_post_imglist li.up_btn_kggzs a input,
        .comiis_post_imglist li.up_btn_hello a input,
        .comiis_post_imglist li.up_btn_z4a a input {
            position:absolute;
            top:11px;
            left:5px;
            height:50px;
            width:50px;
            z-index:10;
            opacity:0
        }
        .comiis_post_imglist li .delImg {
            position:absolute;
            top:-5px;
            left:-5px
        }
        .comiis_post_imglist li .delImg i {
            font-size:24px;
            background:#fff;
            border-radius:50%
        }
        .imgboxlist{
            height: 170px;
            overflow-y: auto;
        }
        .menuclicked{
            background: #fff;
        }
        #kggzsfiledata,
        #hellofiledata,
        #z4afiledata{
            display: none;
        }
        `);
        if (GM_getValue("chartBedsImagesHistory") == undefined) {
            GM_setValue("chartBedsImagesHistory", []);
        }
        tryCatch(chatKGChartBed);
        tryCatch(chatHelloChartBed);
        tryCatch(chatZ4AChartBed);
        tryCatch(chatHistoryChartBedImages);
        $("#comiis_img_chartbed_key").children()[0].children[0].click();

    }

    function chatKGChartBed() { // 聊天快捷图片上传康哥图床
        if (!GM_getValue("v43")) {
            return
        };
        let imgUploadBtn = `
        <div class="comiis_upbox kggzschartbed" style="display:none;">
                <ul id="imglist_kggzs" class="comiis_post_imglist cl">
                    <li class="up_btn_kggzs">
                        <a href="javascript:;" class="bg_e b_ok f_d" id="kggzsChartBedBtnUpload">
                            <i class="comiis_font"></i>
                            <input type="file" name="Filedata" id="kggzsfiledata" accept="image/*" multiple="multiple">
                            <p style="padding-top: 21px;padding-left: 6px;">20MB</p>
                        </a>
                    </li>				
                </ul>
            </div>
        `;
        let imgMenu = `<li><a href="javascript:;" id="menu_kggzs" class="">康哥图床</a></li>`;
        $("#comiis_img_chartbed_key").append($(imgMenu));
        $(".comiis_minibq .imgboxlist").append($(imgUploadBtn));
        $("#menu_kggzs").on("click", (e) => {
            $("#menu_kggzs").addClass("menuclicked"); // 添加点击菜单背景白色
            $("#menu_hello").removeClass("menuclicked");
            $("#menu_z4a").removeClass("menuclicked");
            $("#menu_chartbed_history").removeClass("menuclicked");
            $(".comiis_upbox").hide();
            $(".comiis_upbox.kggzschartbed").show();

        });

        let chartBedUrl = "https://img.kggzs.cn/api/v1";
        let chartBedUser = GM_getValue("KggzsChartBedUser");
        let chartBedPwd = GM_getValue("KggzsChartBedPwd");
        let chartBedToken = null;
        let loginStatus = false; // 登录状态
        let tokenStatus = false; //token状态
        let code = {
            401: "未登录或授权失败",
            403: "管理员关闭了接口功能",
            429: "超出请求配额,请求受限",
            500: "服务端出现异常"
        }

        function getToken() {
            return new Promise(res => {
                let formData = new FormData();
                formData.append("email", "[email protected]");
                formData.append("password", "893177236");
                GM_xmlhttpRequest({
                    url: `${chartBedUrl}/tokens`,
                    method: "POST",
                    data: formData,
                    headers: {
                        "Accept": "application/json"
                    },
                    onload: (r) => {
                        if (code[r.status] != null) {
                            popup.open(code[r.status], 'alert');
                            res(null);
                            return;
                        }
                        let json_data = JSON.parse(r.response);
                        if (json_data["status"]) {
                            popup.open("token成功获取", "alert");
                            res(json_data["data"]["token"]);
                        } else {
                            popup.open(json_data["message"], "alert");
                            res(null);
                        }
                    },
                    onerror: () => {
                        popup.open("网络异常");
                        res(null);
                    }
                })
            })
        }

        function uploadImage(imageFile) {
            let res_data = {
                "imageUri": null,
                "json_data": null
            };
            let form = new FormData();
            form.append("strategy_id", 3);
            form.append("file", imageFile);
            return new Promise(res => {
                GM_xmlhttpRequest({
                    url: `${chartBedUrl}/upload`,
                    method: "POST",
                    data: form,
                    async: false,
                    dataType: "json",
                    headers: {
                        "Accept": "application/json",
                        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.64 Safari/537.36 Edg/101.0.1210.53",
                        "Referer": `${chartBedUrl}/`,
                        "Authorization": `Bearer ${chartBedToken}`,
                        "Origin": chartBedUrl,
                    },
                    onload: (r) => {
                        if (code[r.status] != null) {
                            popup.open(code[r.status], 'alert');
                            res(res_data);
                            return;
                        }
                        let json_data = JSON.parse(r.response);
                        console.log(json_data);

                        if (json_data["status"]) {
                            popup.open('上传成功', 'alert');
                            let file_reader = new FileReader();
                            //FileReader主要用于将文件内容读入内存,通过一系列异步接口,可以在主线程中访问本地文件
                            file_reader.readAsDataURL(imageFile); //读取图片的内容生成的base64编码的图
                            //读取完成后,执行该回调函数,它会返回读取的结果result		
                            file_reader.onload = (function () {
                                let imageUri = this.result; // 此时的图片已经存储到了result中	
                                res_data["imageUri"] = imageUri;
                                res_data["json_data"] = json_data;
                                res(res_data);
                            });
                        } else {
                            console.log(json_data);
                            popup.open(json_data["message"], 'alert');
                            res(res_data);
                        }

                    },
                    onerror: (r) => {
                        popup.open("网络异常", 'alert');
                        res(res_data);
                    }
                })
            })
        }

        function deleteImage(imageKey) {
            return new Promise(res => {
                GM_xmlhttpRequest({
                    url: `${chartBedUrl}/images/:${imageKey}`,
                    method: "DELETE",
                    async: false,
                    data: JSON.stringify({
                        "key": ""
                    }),
                    dataType: "json",
                    headers: {
                        "Accept": "application/json",
                        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.64 Safari/537.36 Edg/101.0.1210.53",
                        "Referer": `${chartBedUrl}/`,
                        "Authorization": `Bearer ${chartBedToken}`,
                        "Origin": chartBedUrl,
                    },
                    onload: (r) => {
                        if (code[r.status] != null) {
                            popup.open(code[r.status], 'alert');
                            res(res_data);
                            return;
                        }
                        let json_data = JSON.parse(r.response);
                        console.log(json_data);
                    },
                    onerror: (r) => {
                        popup.open("网络异常", 'alert');
                        res(res_data);
                    }
                })
            })
        }

        function clearData() {
            chartBedUser = "";
            chartBedPwd = "";
            chartBedToken = null;
            loginStatus = false;
            tokenStatus = false;
            GM_deleteValue("KggzsChartBedUser");
            GM_deleteValue("KggzsChartBedPwd");
        }

        $("#kggzsChartBedBtnUpload i").on("click", async function () {
            if (tokenStatus) {
                popup.open('正在配置中...', 'alert');
                return;
            }
            if (!chartBedUser || !chartBedPwd) {
                let userInput = prompt('请输入康哥图床的用户和密码,使用空格分割');
                if (userInput) {
                    let userInputSplit = userInput.split(" ");
                    let user = userInputSplit[0];
                    let pwd = userInputSplit[1];
                    GM_setValue("KggzsChartBedUser", user);
                    GM_setValue("KggzsChartBedPwd", pwd);
                    chartBedUser = user;
                    chartBedPwd = pwd;
                    popup.open('设置完毕,请重新点击', 'alert');
                }
            } else if (chartBedToken == null || !loginStatus) {
                tokenStatus = true;
                popup.open('正在配置token', 'alert');
                chartBedToken = await getToken();
                console.log("token:" + chartBedToken);
                if (chartBedToken != null) {
                    $("#kggzsfiledata").click();
                } else {
                    clearData();
                }
                tokenStatus = false;

            } else {
                $("#kggzsfiledata").click();
            }
        });
        $("#kggzsfiledata").on("change", (e) => {
            let chooseImageFiles = e.currentTarget.files;
            if (chooseImageFiles.length == 0) {
                return
            };
            popup.open("上传图片中...请稍后", "alert");
            console.log(`图片数量:${chooseImageFiles.length}`);
            $.each(chooseImageFiles, async (i) => {
                let imageFile = chooseImageFiles[i];
                let uploadImageReturn = await uploadImage(imageFile);
                if (uploadImageReturn["json_data"] != null) {
                    console.log(uploadImageReturn);
                    let image_id_encoded = uploadImageReturn["json_data"]["data"]["key"];
                    let image_url = uploadImageReturn["json_data"]["data"]["links"]["url"];
                    let image_thumb_url = uploadImageReturn["json_data"]["data"]["links"]["thumbnail_url"];
                    let image_name = uploadImageReturn["json_data"]["data"]["origin_name"];
                    let image_uri = uploadImageReturn["imageUri"];
                    let uploadImageHTML = `<li>
                            <span class="delImg" id-encode="${image_id_encoded}">
                                <a href="javascript:;">
                                    <i class="comiis_font f_g"></i>
                                </a>
                            </span>
                            <span class="charu f_f">插入</span>
                            <span class="p_img">
                                <a href="javascript:;" onclick="comiis_addsmilies('[url=${image_url}][img]${image_url}[/img][/url]')">
                                    <img style="height:54px;width:54px;" title="${image_name}" src="${image_uri}" class="vm b_ok"></a>
                            </span>
                            <input type="hidden" name="">
                        </li>`;
                    $("#imglist_kggzs").append($(uploadImageHTML));
                    chartBed.storage.add("kggzs", image_id_encoded, image_url, image_thumb_url, image_name);
                }
            })
            $("#kggzsfiledata").val("");

        });
        $("#imglist_kggzs").on("click", ".delImg", async (e) => {
            e.preventDefault();
            e.currentTarget.parentElement.remove();
            // popup.open('删除中,请稍后', 'alert');
            // let id_encoded = e.currentTarget.getAttribute("id-encode");
            // if(!id_encoded){
            //     popup.open('获取id_encoded失败,请自行去Hello图床删除', 'alert');
            //     return;
            // }
            // let deleteStatus = await deleteImage(key);
            // if(deleteStatus){
            //     e.currentTarget.parentElement.remove();
            //     chartBed.storage.delete("kggzs",id_encoded);
            // }
        })
    }

    function chatHelloChartBed() { // 聊天快捷图片上传Hello图床
        if (!GM_getValue("v40")) {
            return
        };

        let imgUploadBtn = `
        <div class="comiis_upbox hellochartbed" style="display:none;">
                <ul id="imglist_hello" class="comiis_post_imglist cl">
                    <li class="up_btn_hello">
                        <a href="javascript:;" class="bg_e b_ok f_d" id="helloChartBedBtnUpload">
                            <i class="comiis_font"></i>
                            <input type="file" name="Filedata" id="hellofiledata" accept="image/*" multiple="multiple">
                            <p style="padding-top: 21px;padding-left: 6px;">20MB</p>
                        </a>
                    </li>				
                </ul>
            </div>
        `;
        let imgMenu = `<li><a href="javascript:;" id="menu_hello" class="">hello图床</a></li>`;
        $("#comiis_img_chartbed_key").append($(imgMenu));
        $(".comiis_minibq .imgboxlist").append($(imgUploadBtn));
        $("#menu_hello").on("click", (e) => {
            $("#menu_hello").addClass("menuclicked"); // 添加点击菜单背景白色
            $("#menu_kggzs").removeClass("menuclicked");
            $("#menu_z4a").removeClass("menuclicked");
            $("#menu_chartbed_history").removeClass("menuclicked");
            $(".comiis_upbox").hide();
            $(".comiis_upbox.hellochartbed").show();

        });
        let chartBedUrl = "https://www.helloimg.com";
        let chartBedUser = GM_getValue("HelloChartBedUser");
        let chartBedPwd = GM_getValue("HelloChartBedPwd");
        let chartBedAuthToken = null;
        let loginStatus = false; // 登录状态
        let authTokenStatus = false; //authToken状态

        let clearData = () => {
            GM_deleteValue("HelloChartBedUser");
            GM_deleteValue("HelloChartBedPwd");
            loginStatus = false;
            authTokenStatus = false;
            chartBedUser = "";
            chartBedPwd = "";
            chartBedAuthToken = null;
        }
        $("#helloChartBedBtnUpload i").on("click", async function () {
            if (authTokenStatus) {
                popup.open('正在配置中...', 'alert');
                return;
            }
            if (!chartBedUser || !chartBedPwd) {
                let userInput = prompt('请输入Hello图床的用户和密码,使用空格分割');
                if (userInput) {
                    let userInputSplit = userInput.split(" ");
                    let user = userInputSplit[0];
                    let pwd = userInputSplit[1];
                    GM_setValue("HelloChartBedUser", user);
                    GM_setValue("HelloChartBedPwd", pwd);
                    chartBedUser = user;
                    chartBedPwd = pwd;
                    popup.open('设置完毕,请重新点击', 'alert');
                }
            } else if (chartBedAuthToken == null || !loginStatus) {
                authTokenStatus = true;
                popup.open('正在配置auth_token', 'alert');
                chartBedAuthToken = await chartBed.getAuthToken(chartBedUrl);
                console.log("auth_token:" + chartBedAuthToken);
                if (chartBedAuthToken != null) {
                    popup.open('正在登录Hello图床', 'alert');
                    let retloginStatus = await chartBed.login(chartBedUrl, chartBedUser, chartBedPwd, chartBedAuthToken);
                    if (retloginStatus) {
                        loginStatus = true;
                        $("#hellofiledata").click();
                    } else if (retloginStatus == false) {
                        clearData();
                    }
                }
                authTokenStatus = false;

            } else {
                $("#hellofiledata").click();
            }
        })
        $("#hellofiledata").on("change", (e) => {
            let chooseImageFiles = e.currentTarget.files;
            if (chooseImageFiles.length == 0) {
                return
            };
            popup.open("上传图片中...请稍后", "alert");
            $.each(chooseImageFiles, async (i) => {
                let imageFile = chooseImageFiles[i];
                let uploadImageReturn = await chartBed.uploadImage(chartBedUrl, chartBedAuthToken, imageFile);
                if (uploadImageReturn["json_data"] != null) {
                    let image_id_encoded = uploadImageReturn["json_data"]["image"]["id_encoded"];
                    let image_url = uploadImageReturn["json_data"]["image"]["url"];
                    let image_thumb_url = uploadImageReturn["json_data"]["image"]["thumb"]["url"];
                    let image_name = uploadImageReturn["json_data"]["image"]["filename"];
                    let image_uri = uploadImageReturn["imageUri"];
                    let uploadImageHTML = `<li>
                            <span class="delImg" id-encode="${image_id_encoded}">
                                <a href="javascript:;">
                                    <i class="comiis_font f_g"></i>
                                </a>
                            </span>
                            <span class="charu f_f">插入</span>
                            <span class="p_img">
                                <a href="javascript:;" onclick="comiis_addsmilies('[url=${image_url}][img]${image_url}[/img][/url]')">
                                    <img style="height:54px;width:54px;" title="${image_name}" src="${image_uri}" class="vm b_ok"></a>
                            </span>
                            <input type="hidden" name="">
                        </li>`;
                    $("#imglist_hello").append($(uploadImageHTML));
                    chartBed.storage.add("hello", image_id_encoded, image_url, image_thumb_url, image_name);
                }
            })
            $("#hellofiledata").val("");

        })
        $("#imglist_hello").on("click", ".delImg", async (e) => {
            e.preventDefault();
            popup.open('删除中,请稍后', 'alert');
            let id_encoded = e.currentTarget.getAttribute("id-encode");
            if (!id_encoded) {
                popup.open('获取id_encoded失败,请自行去Hello图床删除', 'alert');
                return;
            }
            let deleteStatus = await chartBed.deleteImage(chartBedUrl, chartBedAuthToken, id_encoded);
            if (deleteStatus) {
                e.currentTarget.parentElement.remove();
                chartBed.storage.delete("hello", id_encoded);
            }
        })
    }



    function chatZ4AChartBed() { // 聊天快捷图片上传Z4A图床
        if (!GM_getValue("v41")) {
            return
        };

        let imgUploadBtn = `
        <div class="comiis_upbox z4achartbed" style="display:none;">
                <ul id="imglist_z4a" class="comiis_post_imglist cl">
                    <li class="up_btn_z4a">
                        <a href="javascript:;" class="bg_e b_ok f_d" id="z4aChartBedBtnUpload">
                            <i class="comiis_font"></i>
                            <input type="file" name="Filedata" id="z4afiledata" accept="image/*" multiple="multiple">
                            <p style="padding-top: 21px;padding-left: 6px;">50MB</p>
                        </a>
                    </li>				
                </ul>
            </div>
        `;
        let imgMenu = `<li><a href="javascript:;" id="menu_z4a" class="">z4a图床</a></li>`;
        $("#comiis_img_chartbed_key").append($(imgMenu));
        $(".comiis_minibq .imgboxlist").append($(imgUploadBtn));
        $("#menu_z4a").on("click", (e) => {
            $("#menu_z4a").addClass("menuclicked"); // 添加点击菜单背景白色
            $("#menu_kggzs").removeClass("menuclicked");
            $("#menu_hello").removeClass("menuclicked");
            $("#menu_chartbed_history").removeClass("menuclicked");
            $(".comiis_upbox").hide();
            $(".comiis_upbox.z4achartbed").show();

        });

        let chartBedUrl = "https://www.z4a.net";
        let chartBedUser = GM_getValue("Z4AChartBedUser");
        let chartBedPwd = GM_getValue("Z4AChartBedPwd");
        let chartBedAuthToken = null;
        let loginStatus = false; // 登录状态
        let authTokenStatus = false; //authToken状态

        let clearData = () => {
            GM_deleteValue("Z4AChartBedUser");
            GM_deleteValue("Z4AChartBedPwd");
            loginStatus = false;
            authTokenStatus = false;
            chartBedUser = "";
            chartBedPwd = "";
            chartBedAuthToken = null;
        }
        $("#z4aChartBedBtnUpload i").on("click", async function () {
            if (authTokenStatus) {
                popup.open('正在配置中...', 'alert');
                return;
            }
            if (!chartBedUser || !chartBedPwd) {
                let userInput = prompt('请输入Z4A图床的用户和密码,使用空格分割');
                if (userInput) {
                    let userInputSplit = userInput.split(" ");
                    let user = userInputSplit[0];
                    let pwd = userInputSplit[1];
                    GM_setValue("Z4AChartBedUser", user);
                    GM_setValue("Z4AChartBedPwd", pwd);
                    chartBedUser = user;
                    chartBedPwd = pwd;
                    popup.open('设置完毕,请重新点击', 'alert');
                }
            } else if (chartBedAuthToken == null || !loginStatus) {
                authTokenStatus = true;
                popup.open('正在配置auth_token', 'alert');
                chartBedAuthToken = await chartBed.getAuthToken(chartBedUrl);
                console.log("auth_token:" + chartBedAuthToken);
                if (chartBedAuthToken != null) {
                    popup.open('正在登录Z4A图床', 'alert');
                    let retloginStatus = await chartBed.login(chartBedUrl, chartBedUser, chartBedPwd, chartBedAuthToken);
                    if (retloginStatus) {
                        loginStatus = true;
                        $("#z4afiledata").click();
                    } else if (retloginStatus == false) {
                        clearData();
                    }
                }
                authTokenStatus = false;

            } else {
                $("#z4afiledata").click();
            }
        })
        $("#z4afiledata").on("change", (e) => {
            let chooseImageFiles = e.currentTarget.files;
            if (chooseImageFiles.length == 0) {
                return
            };
            popup.open("上传图片中...请稍后", "alert");
            $.each(chooseImageFiles, async (i) => {
                let imageFile = chooseImageFiles[i];
                let uploadImageReturn = await chartBed.uploadImage(chartBedUrl, chartBedAuthToken, imageFile);
                if (uploadImageReturn["json_data"] != null) {
                    let image_id_encoded = uploadImageReturn["json_data"]["image"]["id_encoded"];
                    let image_url = uploadImageReturn["json_data"]["image"]["url"];
                    let image_thumb_url = uploadImageReturn["json_data"]["image"]["thumb"]["url"];
                    let image_name = uploadImageReturn["json_data"]["image"]["filename"];
                    let image_uri = uploadImageReturn["imageUri"];
                    let uploadImageHTML = `<li>
                            <span class="delImg" id-encode="${image_id_encoded}">
                                <a href="javascript:;">
                                    <i class="comiis_font f_g"></i>
                                </a>
                            </span>
                            <span class="charu f_f">插入</span>
                            <span class="p_img">
                                <a href="javascript:;" onclick="comiis_addsmilies('[url=${image_url}][img]${image_url}[/img][/url]')">
                                    <img style="height:54px;width:54px;" title="${image_name}" src="${image_uri}" class="vm b_ok"></a>
                            </span>
                            <input type="hidden" name="">
                        </li>`;
                    $("#imglist_z4a").append($(uploadImageHTML));
                    chartBed.storage.add("z4a", image_id_encoded, image_url, image_thumb_url, image_name);
                }
            })
            $("#z4afiledata").val("");

        })
        $("#imglist_z4a").on("click", ".delImg", async (e) => {
            e.preventDefault();
            popup.open('删除中,请稍后', 'alert');
            let id_encoded = e.currentTarget.getAttribute("id-encode");
            if (!id_encoded) {
                popup.open('获取id_encoded失败,请自行去Z4A图床删除', 'alert');
                return;
            }
            let deleteStatus = await chartBed.deleteImage(chartBedUrl, chartBedAuthToken, id_encoded);
            if (deleteStatus) {
                e.currentTarget.parentElement.remove();
                chartBed.storage.delete("z4a", id_encoded);
            }
        })
    }

    function chatHistoryChartBedImages() { // 聊天快捷图片上传中 所有图床历史上传过的图片
        let historyImages = chartBed.storage.get();
        let imageMenu = `<li><a href="javascript:;" id="menu_chartbed_history" class="">历史图片</a></li>`;
        $("#comiis_img_chartbed_key").append($(imageMenu));
        let imageArea = `
        <div class="comiis_upbox chartbedhistory" style="display:none;">
            <ul id="imglist_history" class="comiis_post_imglist cl">
            
            </ul>
        </div>
        `;

        $(".comiis_minibq .imgboxlist").append($(imageArea));
        $("#menu_chartbed_history").on("click", (e) => {
            $("#menu_chartbed_history").addClass("menuclicked"); // 添加点击菜单背景白色
            $("#menu_z4a").removeClass("menuclicked");
            $("#menu_hello").removeClass("menuclicked");
            $(".comiis_upbox").hide();
            $(".comiis_upbox.chartbedhistory").show();

        });

        $.each(historyImages, (i) => {
            let _web = historyImages[i]["web"];
            let _url = historyImages[i]["url"];
            let _thumb_url = historyImages[i]["thumb_url"];
            let _name = historyImages[i]["name"];

            let _imageHTML = `
            <li>
                <span class="delImg" t-index="${i}">
                    <a href="javascript:;">
                        <i class="comiis_font f_g"></i>
                    </a>
                </span>
                <span class="charu f_f">${_web}</span>
                <span class="p_img">
                    <a href="javascript:;" onclick="comiis_addsmilies('[url=${_url}][img]${_url}[/img][/url]')">
                        <img style="height:54px;width:54px;" title="${_name}" src="${_thumb_url}" class="vm b_ok"></a>
                </span>
                <input type="hidden" name="${_name}">
            </li>
            `;
            $("#imglist_history").append($(_imageHTML));

        })

        $("#imglist_history").on("click", ".delImg", async (e) => {
            e.preventDefault();
            let _t_index = e.currentTarget.getAttribute("t-index");
            let imageItem = historyImages[_t_index];
            let web = imageItem["web"];
            let id_encoded = imageItem["id_encoded"];
            e.currentTarget.parentElement.remove();
            chartBed.storage.delete(web, id_encoded);
        })
    }


    function paymentSubjectReminder() { // 付费主题白嫖提醒
        let urlForumPostMatchStatus = window.location.href.match(mt_config.rexp.forum_post);
        let urlHomeSpaceMatchStatus = window.location.href.match(mt_config.rexp.home_space_url);
        let urlGuideMatchStatus = window.location.href.match(mt_config.rexp.forum_guide_url);
        let urlCommunityMatchStatus = window.location.href.match(mt_config.rexp.community_url) || window.location.href.match(mt_config.rexp.plate_url);
        let urlBBSMatchStatus = window.location.href.match(/bbs.binmt.cc/);


        let storageMatchStatus = GM_getValue("v44") != null;
        let setTipForumPostList = GM_getValue("tipToFreeSubjectForumPost") == null ? [] : GM_getValue("tipToFreeSubjectForumPost");
        const paymentSubjectReminderHome = {
            getData() { // 获取数据
                return GM_getValue("tipToFreeSubjectForumPost") == null ? [] : GM_getValue("tipToFreeSubjectForumPost");
            },
            setData(data) { // 设置数据
                GM_setValue("tipToFreeSubjectForumPost", data);
            },
            async insertButtonView() { // 插入-底部导航-我的-付费主题白嫖列表(按钮)
                await GM_asyncLoadScript("https://www.jq22.com/demo/NZ-Plugin-MsgBox202201130154/Js/NZ-Plugin/Js/NZ-MsgBox.min.js");
                await GM_asyncLoadScript("https://www.jq22.com/demo/NZ-Plugin-MsgBox202201130154/Js/NZ-Plugin/Js/NZ-Drag.min.js");
                await GM_asyncLoadStyleSheet("https://www.jq22.com/demo/NZ-Plugin-MsgBox202201130154/Js/NZ-Plugin/Css/NZ-MsgBox.min.css");

                let paymentSubjectReminderHomeBtn = document.createElement("a");
                paymentSubjectReminderHomeBtn.setAttribute("href", "javascript:;");
                paymentSubjectReminderHomeBtn.className = "comiis_flex comiis_styli bg_f b_t cl paymentsubjectreminder";
                paymentSubjectReminderHomeBtn.innerHTML = `
                    <div class="styli_tit f_c">
                        <i class="comiis_font" style="color:#ec0000;"></i>
                    </div>
                    <div class="flex">付费主题白嫖列表</div>
                    <div class="styli_ico">
                        <i class="comiis_font f_e"></i>
                    </div>`;
                GM_addStyle(`
                .NZ-MsgBox-alert .msgcontainer .msgtitle {
                    text-align: center !important;
                }
                #autolist .k_misign_lu img {
                    width: 40px;
                    height: 40px;
                    -moz-border-radius: 20px;
                    -webkit-border-radius: 20px;
                    border-radius: 20px;
                }
                .k_misign_lc .f_c{
                    margin: 5px 0px;
                }
                `)
                paymentSubjectReminderHomeBtn.onclick = () => {
                    paymentSubjectReminderHome.showView();
                }
                Array.from(document.querySelectorAll(".comiis_myinfo_list.bg_f.cl")).forEach( (ele) => {
                    if(ele.innerText.match(/消息提醒|资料设置|我的积分|我的勋章|我的道具/)){
                        ele.append(paymentSubjectReminderHomeBtn);
                        return;
                    }
                })
            },
            showView() { // 显示-付费主题白嫖列表(dialog)
                let data = paymentSubjectReminderHome.getData();
                $.NZ_MsgBox.alert({
                    title: "付费主题白嫖列表",
                    content: "获取中",
                    type: "",
                    location: "center",
                    buttons: {
                        confirm: {
                            text: "确定"
                        }
                    }
                });

                let notVisitedTipContent = "" //可白嫖且未访问
                let notVisitedNums = 0; //可白嫖且未访问的数量
                let isFreeContent = ""; // 可白嫖帖子-未读的加左上边红点
                let isPaidContent = ""; // 需付费帖子
                let isFreeNotVisitedContentList = [];
                let isFreeContentList = [];
                let isPaidContentList = [];
                $.each(data, (i, v) => {
                    let timeColor = "#f91212";
                    let leftRedBtn = "";
                    if (new Date().getTime() > v["expirationTimeStamp"]) { // 可白嫖
                        timeColor = "#1e90ff";
                        if (v["isVisited"] == false) {
                            leftRedBtn = '<span class="icon_msgs bg_del" style="position: fixed;width: 10px;height: 10px;border-radius: 50%;margin: 10px 0px 0px -15px;"></span>'
                            notVisitedNums = notVisitedNums + 1;
                        }
                    }
                    let concatList = {
                        "content": `
                        <tbody id="autolist">
                            <tr>
                                <td style="width: 100%;">
                                    <div style="display: inline-flex;">
                                        ${leftRedBtn}
                                        <div style="width: 240px;">                 
                                            <a href="javascript:void(0);" t-href="${v["url"]}" t-index="${i}" style="color: #1e90ff;">${v["title"]}</a>
                                            <li style="margin: 5px 15px;color: ${timeColor};">${v["expirationTime"]}</li>
                                        </div>
                                        <div style="align-self: center;margin-left: 10px;" t-index="${i}" class="delsubjecttip">
                                            <i class="comiis_font" style="font-size: 24px;padding-left: 6px;"></i>
                                        </div>
                                    </div>
                                </td>
                            </tr>
                            <tr style="height:15px;"></tr>
                        </tbody>
                        `,
                        "timestamp": v["expirationTimeStamp"]
                    };

                    if (new Date().getTime() > v["expirationTimeStamp"]) { // 可白嫖
                        if (leftRedBtn != '') {
                            isFreeNotVisitedContentList = isFreeNotVisitedContentList.concat(concatList);
                        } else {
                            isFreeContentList = isFreeContentList.concat(concatList);
                        }

                    } else {
                        isPaidContentList = isPaidContentList.concat(concatList);
                    }
                });
                isFreeNotVisitedContentList.sort(utils.listCompareAscByValue("timestamp"));
                isFreeContentList.sort(utils.listCompareAscByValue("timestamp"));
                isFreeContent = utils.listToStringByValue(isFreeNotVisitedContentList, "content") + utils.listToStringByValue(isFreeContentList, "content");
                isPaidContent = utils.listToStringByValue(isPaidContentList, "content");
                if (notVisitedNums > 0) {
                    notVisitedTipContent = `<span class="icon_msgs bg_del f_f" style="
                            display: inline-block;
                            position: absolute;
                            width: 16px;
                            height: 16px;
                            line-height: 16px;
                            border-radius: 50%;
                            font-size: 14px;
                            text-align: center;
                            margin: 3px 0px 0px 10px;
                        ">${notVisitedNums}</span>`;
                }
                let dialogIsFreeContent = '<details class="subjectcanvisit" open=""><summary>可白嫖' + notVisitedTipContent + '</summary><table id="paymentSubjectReminderIsFreeList" style="overflow: auto;height: inherit;margin: 15px 0px;">' + isFreeContent + "</table></details>";
                let dialogIsPaidContent = '<details class="subjectnotvisit"><summary>需付费</summary><table id="paymentSubjectReminderIsPaidList" style="overflow: auto;height: inherit;margin: 15px 0px;">' + isPaidContent + "</table></details>";
                $(".msgcon").html("");
                $(".msgcon").append(dialogIsFreeContent);
                $(".msgcon").append(dialogIsPaidContent);
                $(".NZ-MsgBox-alert.NZ-MsgBox--motion").css("top", "100px");
                $(".msgcon").css("height", "400px");
                $(".delsubjecttip i.comiis_font").on("click", (e) => {
                    var confirmStatus = confirm("确定移出提醒?");
                    var t_index = e.target.parentElement.getAttribute("t-index");
                    if (confirmStatus) {
                        data.splice(t_index, 1);
                        console.log(data);
                        paymentSubjectReminderHome.setData(data);
                        e.target.parentElement.parentElement.parentElement.parentElement.parentElement.remove();
                    }
                });
                $("#paymentSubjectReminderIsFreeList").on("click", "a", (e) => {
                    var t_index = e.target.getAttribute("t-index");
                    var t_href = e.target.getAttribute("t-href");
                    console.log(t_index, t_href);
                    data[t_index]["isVisited"] = true;
                    paymentSubjectReminderHome.setData(data);
                    window.open(t_href, "_blank");
                    e.target.setAttribute("style", "color: #000000;");
                    if (e.target.parentElement.parentElement.children[0].className != "icon_msgs bg_del") {
                        return;
                    }
                    e.target.parentElement.parentElement.children[0].remove();
                    $("#paymentSubjectReminderIsFreeList").append(e.target.parentElement.parentElement.parentElement.parentElement.parentElement);
                    let notVisitedNums = $(".subjectcanvisit summary span.icon_msgs.bg_del.f_f").text();
                    notVisitedNums = parseInt(notVisitedNums) - 1;
                    if (notVisitedNums > 0) {
                        $(".subjectcanvisit summary span.icon_msgs.bg_del.f_f").html(notVisitedNums);
                    } else {
                        $(".subjectcanvisit summary span.icon_msgs.bg_del.f_f").remove();
                    }
                })
                $("#paymentSubjectReminderIsPaidList").on("click", "a", (e) => {
                    var t_index = e.target.getAttribute("t-index");
                    var t_href = e.target.getAttribute("t-href");
                    console.log(t_index, t_href);
                    window.open(t_href, "_blank");
                    e.target.setAttribute("style", "color: #000000;");
                })

            }
        }

        if (storageMatchStatus && urlForumPostMatchStatus) { // 帖子内部-添加进提醒的按钮或者已添加进提醒的按钮点击移出
            let paySubjectTip = $("span.kmren"); // 购买主题的元素

            if (paySubjectTip.length != 0) {
                log.success("当前帖子存在需要购买主题");
                let isAddTip = false;
                let tipBtnHTML = '';
                Array.from(setTipForumPostList).forEach((item, index) => {
                    if (window.location.href.match(item["url"])) {
                        isAddTip = true;
                        return;
                    }
                });
                if (isAddTip) {
                    log.success("已设置提醒");
                    tipBtnHTML = $(`<a href="javascript:;" class="styli_tit f_c"><i class="comiis_font" style="color: #ffffff;"></i></a>`);
                    tipBtnHTML.on("click", () => {
                        let confirmStatus = confirm("确定移出提醒?");
                        if (confirmStatus) {
                            Array.from(setTipForumPostList).forEach((item, index) => {
                                if (window.location.href.match(item["url"])) {
                                    setTipForumPostList.splice(index, 1);
                                    GM_setValue("tipToFreeSubjectForumPost", setTipForumPostList);
                                    popup.open("移出成功", "alert");
                                    setTimeout(function () {
                                        window.location.reload();
                                    }, 1500);
                                    return;
                                }
                            });
                        }
                    });
                } else {
                    log.success("未设置提醒");
                    tipBtnHTML = $(`<a href="javascript:;" class="styli_tit f_c"><i class="comiis_font" style="color: #FF9900;"></i></a>`);
                    tipBtnHTML.on("click", () => {
                        let expirationTimeMatch = $(".kmren").parent().text().replace(/\t|\n/g, "").match(/[0-9]{4}-[0-9]{1,2}-[0-9]{1,2}[\s]{1}[0-9]{1,2}:[0-9]{1,2}/);
                        if (expirationTimeMatch.length == 0) {
                            popup.open("获取付费主题到期时间失败", "alert");
                            return;
                        }
                        let expirationTime = expirationTimeMatch[0];
                        let expirationTimeStamp = utils.dateStringFormatToStamp(expirationTime);
                        setTipForumPostList = setTipForumPostList.concat({
                            "url": window.location.href,
                            "title": document.title.replace(" - MT论坛", ""),
                            "expirationTime": expirationTime,
                            "expirationTimeStamp": expirationTimeStamp,
                            "isVisited": false
                        });
                        GM_setValue("tipToFreeSubjectForumPost", setTipForumPostList);
                        popup.open("添加成功", "alert");
                        setTimeout(function () {
                            window.location.reload();
                        }, 1500);
                    });
                }

                $(".comiis_head.f_top .header_y").append(tipBtnHTML);
            };
        }




        if (storageMatchStatus && urlHomeSpaceMatchStatus) { // 底部导航-我的-提供类似小黑屋这种可查看设置提醒的帖子
            paymentSubjectReminderHome.insertButtonView();
        }

        if (storageMatchStatus) { // 设置提醒小红点
            function getTipNums() {
                let needTipNums = 0;
                Array.from(paymentSubjectReminderHome.getData()).forEach((item, index) => {
                    if (new Date().getTime() > item["expirationTimeStamp"] && item["isVisited"] == false) {
                        needTipNums += 1;
                    }
                });
                return needTipNums;
            }
            if (urlHomeSpaceMatchStatus || urlGuideMatchStatus || urlCommunityMatchStatus) { // 当前网页为,底部导航-我的
                let redBtn = $(".icon_msgs.bg_del.f_f"); // 底部导航-我的-右上角小红点
                let tipNums = 0;
                if (redBtn.length) {
                    tipNums = parseInt(redBtn.text());
                    $(".icon_msgs.bg_del.f_f").html(tipNums + getTipNums());
                    $(".comiis_head .header_z .kmuser em").append($(`<span class="icon_msgs bg_del"></span>`));
                } else {
                    let tipnums = getTipNums();
                    if (tipnums) {
                        $("ul.comiis_flex li.flex a[title='我的'] i.comiis_font").append($(`<span class="icon_msgs bg_del f_f">${tipnums}</span>`));
                        $(".comiis_head .header_z .kmuser em").append($(`<span class="icon_msgs bg_del"></span>`));
                    }
                }

            }
            if (urlHomeSpaceMatchStatus) { // 当前网页为,底部导航-我的-付费主题白嫖列表中最右边
                let tipnums = getTipNums();
                if (tipnums) {
                    $(".comiis_flex.comiis_styli.paymentsubjectreminder div.flex").after($(`<span class="myinfo_tip bg_del f_f">${tipnums}</span>`));
                }

            }
            if (urlBBSMatchStatus) { // 当前网页为,全部
                let redBtn = $(".sidenv_num.bg_del.f_f"); // 侧边栏-头像-右上角小红点
                let tipNums = 0;
                if (redBtn.length) {
                    tipNums = parseInt(redBtn.text());
                    $(".sidenv_num.bg_del.f_f").html(tipNums + getTipNums());
                } else {
                    let tipnums = getTipNums();
                    if (tipnums) {
                        $(".sidenv_user em").before($(`<span class="sidenv_num bg_del f_f">${tipnums}</span>`));
                    }

                }

            }
        }


    }




    function userCheckBoxSettings() { // 设置的html
        function checkboxNode(){
            return $(".whitesevcheckbox");
        }
        function selectedNodeText(){
            let selectedVal = selectNode().val();
            return $(`.beauty-select option[value='${selectedVal}']`).text();
        }
        function selectNode(){
            return $(".beauty-select");
        }
        function setCodeNodeCheckedStatus(status){ // 设置 开关的状态
            if(status){
                checkboxNode().removeClass("comiis_checkbox_close");
            }else{
                checkboxNode().addClass("comiis_checkbox_close");
            }
        }
        
        function setLastClickItem() { //初始化设置上次点击的select内容
            let selectNodeNormalVal = GM_getValue("last") == null ? "v2":GM_getValue("last");
            selectNode().val(selectNodeNormalVal);
            setCodeNodeCheckedStatus(GM_getValue(selectNodeNormalVal) != null ? true : false);

        }

        function setSelectNodeChangeEvent() { // 设置选项的change事件
            selectNode().change(function () {
                let selected_value = $('.beauty-select').val();
                GM_setValue("last", selected_value);
                let check_value = GM_getValue(selected_value) != null ? true:false;
                setCodeNodeCheckedStatus(check_value);
            });

        }
        function setCodeNodeClickEvent() { // 设置开关的click事件
            checkboxNode().on("click",(e)=>{
                let selected_value = selectNode().val();
                let check_value = GM_getValue(selected_value) != null ? false:true;
                if(check_value){
                    GM_setValue(selected_value,true);
                }else{
                    GM_deleteValue(selected_value);
                }
                // let showText = check_value ? `${selectedNodeText()}开启` : `${selectedNodeText()}关闭`;
                // iosOverlay({
                //     text: showText,
                //     duration: 1500,
                //     icon: "https://www.helloimg.com/images/2022/05/24/ZoDS05.png"
                // });
                let showText = check_value ? '设置-开启' : '设置-关闭';
                popup.open(showText,"alert");
                setCodeNodeCheckedStatus(check_value);
            })
        }

        function setSelectNodeCSS() {
            GM_addStyle(`
                .beauty-select{
                    background-color: #fff;
                    height:28px;
                    width:180px;
                    line-height:28px;
                    border: 1px solid #ececec;
                    background: url(w.png) no-repeat;
                    background-position: 95% 50%;
                    -webkit-appearance: none;  /*去掉样式 for chrome*/
                    appearance:none;/*去掉样式*/
                    -moz-appearance:none;/*去掉样式*/
            }`);
        }

        if (window.location.href.match(mt_config.rexp.home_space_url) != null) {
            var setting_content = document.createElement("li");
            setting_content.className = "f_b";
            setting_content.innerHTML = '<div class="styli_tit f_c"><i class="comiis_font" style="color: #a70bfe;font-size: 23px;"></i></div><div class="flex"><select style="vertical-align:top;border-color:transparent" class="beauty-select">' +
                '<option value="v2">识别链接<\/option>' +
                '<option value="v17">自动签到<\/option>' +
                '<option value="v18">自动展开帖子<\/option>' +
                '<option value="v16">自适应帖子内图片的宽度<\/option>' +
                '<option value="v15">显示用户的UID<\/option>' +
                '<option value="v19">显示搜索历史<\/option>' +
                '<option value="v1">移除帖子字体效果<\/option>' +
                '<option value="v3">移除评论区字体效果<\/option>' +
                '<option value="v6">评论区开启点评<\/option>' +
                '<option value="v32">自动加载上一页评论<\/option>' +
                '<option value="v21">自动加载下一页评论<\/option>' +
                '<option value="v30">小黑屋<\/option>' +
                '<option value="v31">快捷回复UBB代码<\/option>' +
                '<option value="v35">完整回复UBB代码<\/option>' +
                '<option value="v33">今日签到之星<\/option>' +
                '<option value="v34">帖外预览图片<\/option>' +
                '<option value="v36">修复搜索的清空按钮<\/option>' +
                '<option value="v37">修复无法正确进入别人的空间<\/option>' +
                '<option value="v42">康哥图床-帖子内(20MB)<\/option>' +
                '<option value="v38">Hello图床-帖子内(20MB)<\/option>' +
                '<option value="v39">Z4A图床-帖子内<\/option>' +
                '<option value="v43">康哥图床-聊天内(20MB)<\/option>' +
                '<option value="v40">Hello图床-聊天内(20MB)<\/option>' +
                '<option value="v41">Z4A图床-聊天内(50MB)<\/option>' +
                '<option value="v44">付费主题白嫖提醒<\/option>' +
                '<\/select>' +
            '<code class="bg_f b_ok comiis_checkbox comiis_checkbox_close whitesevcheckbox"></code>' +
            '<\/div>';
            setting_content.style = "margin: 0px 15px;display: flex;align-items: center;border-top: 1px solid rgb(239, 239, 239) !important;height: 47px;";
            Array.from(document.querySelectorAll(".comiis_myinfo_list.bg_f.cl")).forEach( (ele) => {
                if(ele.innerText.match(/风格配色|夜间模式|最近访客|改名申请|手机绑定设置/)){
                    ele.appendChild(setting_content);
                    return;
                }
            })
            tryCatch(setSelectNodeCSS);
            tryCatch(setLastClickItem);
  
            tryCatch(setCodeNodeClickEvent);
            tryCatch(setSelectNodeChangeEvent);
            // tryCatch(loadCheckboxTipResource);
        }
    }

    function mobileMainRunScript() {
        tryCatch(commentsAddReviews);
        tryCatch(recoveryIMGWidth);
        tryCatch(identifyLinks);
        tryCatch(showUserUID);
        tryCatch(previewPictures);
        tryCatch(removeForumPostFontStyle);
        tryCatch(modifyForumPostFontColor);
        tryCatch(autoSignIn);
        tryCatch(autoExpendFullTextByForumPost);
        tryCatch(searchHistory);
        tryCatch(loadNextComments, '', '$("#loading-comment-tip").text("加载评论失败")');
        tryCatch(loadPrevComments, '', '$("#loading-comment-tip-prev").text("加载评论失败")');
        tryCatch(repairClearSearchInput);
        tryCatch(repairUnableToEnterOtherSpaceCorrectly);
        tryCatch(postForumKGChartBed);
        tryCatch(postForumHelloChartBed);
        tryCatch(postForumZ4aChartBed);
        tryCatch(chatChartBed);
        tryCatch(paymentSubjectReminder);
    }



    function entrance() { //这是入口
        var usa = navigator.userAgent.match(mt_config.rexp.pc_useragent);
        if (usa != null) {
            tryCatch(repairPCNoLoadResource);
            $(document).ready(function () {
                tryCatch(latestReleaseForumPost);
                // tryCatch(detectUserOnlineStatus);
                tryCatch(identifyLinks);
                tryCatch(collectionForumPost);
                tryCatch(quickReply);
                tryCatch(showUserLevel);
                tryCatch(autoSignIn);

            });
        } else {
            $(document).ready(function () {
                tryCatch(compatiblePartialFunction);
                mobileMainRunScript();
                tryCatch(shieldUser);
                tryCatch(shieldPlate);

                tryCatch(userCheckBoxSettings); // 选项主要界面内容

                tryCatch(blackHome.insertMobileBlackHomeButton);
                tryCatch(quickUBB.insertQuickReplyUBB);
                tryCatch(quickUBB.insertReplayUBB);
                tryCatch(blacklistShieldUsersOrBlocks);
                tryCatch(showTodayStar);
                tryCatch(showSignInRanking);
                pageAfterDOMChangeRunFunction();
            })

        }
    } //function entrance()的结束处
    $(document).ready(function () {
        entrance()
    });

})();