Greasy Fork is available in English.

52pojie 吾爱破解功能增强

功能:1. 筛选最近的帖子 2. 回复数/点击数升降序显示 3. 点击过的帖子显隐 4. 默认排序(不排序)菜单项

// ==UserScript==
// @name         52pojie 吾爱破解功能增强
// @description  功能:1. 筛选最近的帖子 2. 回复数/点击数升降序显示 3. 点击过的帖子显隐 4. 默认排序(不排序)菜单项
// @author       cjcchester
// @namespace    cjcchester.com
// @match        https://www.52pojie.cn/*
// @version      1.0.0
// @require      https://cdn.staticfile.org/jquery/1.12.1/jquery.min.js
// @grant        GM_getValue
// @grant        GM_setValue
// @grant        GM_registerMenuCommand
// ==/UserScript==

(function () {
    // 设置信息对象
    const settings = {
        hoursCount: GM_getValue('hours_count', 24),
        clickHide: GM_getValue('click_hide', false),
        sortOrder: GM_getValue('sort_order', 'default'),
        layLoad: GM_getValue('lay_load', false),
    };

    // 获取当前时间
    const nowTime = new Date();
    // 计算时间范围(毫秒)
    const hideSpace = settings.hoursCount * 60 * 60 * 1000;

    // 使用jQuery的noConflict模式,以避免冲突
    const $ = jQuery.noConflict();

    // 处理链接点击事件
    function onLinkClick(event) {
        const id = event.currentTarget.id;
        localStorage.setItem(id, 1); // 标记链接被点击

        if (settings.clickHide) {
            $(event.currentTarget).hide();
        }
    }

    // 在排序后重新设置序号
    function renumberList() {
        let counter = 0;
        $('.bm_c table tbody:visible').each(function () {
            counter++;
            $(this).find('td:first').text(counter);
        });
    }

    // 处理公共样式
    function commonDeal() {
        // 添加自定义CSS样式
        const style = document.createElement('style');
        style.type = 'text/css';
        style.textContent = `
            .tl table { table-layout: auto }
        `;
        const head = document.querySelector('head');
        head.appendChild(style);

        // 隐藏部分页面元素 免责声明、版权声明
        $('.bm_c.cl.pbn, .res-footer-note, .wp.vw50_kfc_f, #ft').hide();
    }

    // 处理帖子详情页的元素
    function detailDeal() {
        // 移除每个回答中的吾爱提示、图片;发布回复的吾爱头像、吾爱提示
        $('.vw50_kfc_pb, .sign, .avatar.avtm, .ptm.pnpost span, .vw50_kfc_pt').remove();
        // 只保留类名为姓名和个人信息
        $('.pls.cl.favatar').children().not('.pi, .pil.cl.credit-list').remove();
        // 只保留个人信息中吾爱币这一项
        $('.pil.cl.credit-list').children().not('.cr-ext2').remove();
        $('.t_fsz').css('min-height', 'auto');
        $('.pct').css('padding-bottom','0');
        $('#p_btn').css('padding','0 0 0 0')
    }

    var sequenceElementAdded = false

    function getColorForValue(num) {
        if (num >= 10) return '#FFEBEB';
        if (num >= 50) return '#FFCDCD';
        if (num >= 200) return '#FFAAAA';
        if (num >= 500) return '#FF8888';
        if (num >= 1000) return '#FF6666';
    }


    // 处理悬赏帖子列表的主要逻辑
    function listDeal() {
        let counter = 0; // 初始化序号计数器

        $('.bm_c table tbody').each(function () {
            const dateText = $('em span', this).text(); // 获取日期文本
            const createTime = Date.parse(new Date(dateText));
            const num = $('.num a', this).text();

            // 检查帖子的创建时间是否在时间范围内
            if ((nowTime - createTime) < hideSpace) {
                counter++; // 帖子在时间范围内,增加计数器
                // 根据帖子回复数量设置背景颜色
                const bgColor = getColorForValue(num)
                $(this).css('background', bgColor);
            } else {
                $(this).hide();
            }

            const id = this.id;
            if (id) {
                if (localStorage.getItem(id) > 0) {
                    $(this).hide();
                } else {
                    $(this).click(onLinkClick);
                }
            }

            if (!sequenceElementAdded) {
                // 如果还没有添加序号元素,创建并添加
                const sequenceElement = document.createElement('td');
                sequenceElement.style.padding = '0 10px';
                $('td.icn', this).before(sequenceElement);
                sequenceElementAdded = true;
            }
        });
        if (counter === 0) {
            createAutoCloseModal("帖子太旧了,全部都不在时间范围内,您可以调整时间或看其他页", 3000);
        }
    }

    function guideListDeal() {
        let counter = 0; // 初始化序号计数器

        $('#threadlist tbody').each(function () {
            const dateText = $('em span', this).text(); // 获取日期文本
            const createTime = Date.parse(new Date(dateText));
            const num = $('.num a', this).text();

            // 检查帖子的创建时间是否在时间范围内
            if ((nowTime - createTime) < hideSpace) {
                counter++; // 帖子在时间范围内,增加计数器
                // 根据帖子回复数量设置背景颜色
                const bgColor = getColorForValue(num)
                $(this).css('background', bgColor);
            } else {
                $(this).hide();
            }

            const id = this.id;
            if (id) {
                if (localStorage.getItem(id) > 0) {
                    $(this).hide();
                } else {
                    $(this).click(onLinkClick);
                }
            }

            if (!sequenceElementAdded) {
                // 如果还没有添加序号元素,创建并添加
                const sequenceElement = document.createElement('td');
                sequenceElement.style.padding = '0 10px';
                $('td.icn', this).before(sequenceElement);
                sequenceElementAdded = true;
            }
        });
        if (counter === 0) {
            createAutoCloseModal("帖子太旧了,全部都不在时间范围内,您可以调整时间或看其他页", 3000);
        }
    }

    function reSort(){
        if (settings.sortOrder === 'reply_asc' || settings.sortOrder === 'reply_desc') {
            // 按回复数升序或降序排列
            $('.bm_c table tbody').sort(function (a, b) {
                const replyA = parseInt($('.num a', a).text());
                const replyB = parseInt($('.num a', b).text());
                return settings.sortOrder === 'reply_asc' ? replyA - replyB : replyB - replyA;
            }).appendTo('.bm_c table');
        } else if (settings.sortOrder === 'click_asc' || settings.sortOrder === 'click_desc') {
            // 按点击数升序或降序排列
            $('.bm_c table tbody').sort(function (a, b) {
                const clickA = parseInt($('.num em', a).text());
                const clickB = parseInt($('.num em', b).text());
                return settings.sortOrder === 'click_asc' ? clickA - clickB : clickB - clickA;
            }).appendTo('.bm_c table');
        } else if (settings.sortOrder === '52coin') {
            // 按吾爱币降序排列
            $('.bm_c table tbody').sort(function (a, b) {
                // 防止已解决的解析失败 同时已解决放最后
                const clickA = parseInt($('.xi1 .xw1', a).text()) || 0;
                const clickB = parseInt($('.xi1 .xw1', b).text()) || 0;
                return clickB - clickA;
            }).appendTo('.bm_c table');
        }
        // 在排序后重新设置序号
        //if (settings.sortOrder !== 'default') {
        renumberList();
        //}
    }

    // 处理特定列表页面的逻辑
    function otherDeal() {
        // 悬赏列表页
        if (currentLink.includes("forumdisplay") || currentLink.includes("forum-")) {
            createTimeIn = 'em span';
            listDeal();
            reSort(); // 重排序
        }
        // 新帖列表页
        if(currentLink.includes("guide")){
            // createTimeIn = 'em span';
            guideListDeal();
            reSort(); // 重排序
        }
    }


    // 注册菜单选项
    GM_registerMenuCommand(`查看后帖子隐藏:${settings.clickHide}`, function () {
        settings.clickHide = !settings.clickHide;
        const message = settings.clickHide ? "已开启查看后帖子隐藏" : "已关闭查看后帖子隐藏";
        createAutoCloseModal(message, 3000);
        GM_setValue('click_hide', settings.clickHide);
        location.reload();
    });
    GM_registerMenuCommand(`自动加载(默认5s,加载5页):${settings.layLoad}`, function () {
        settings.layLoad = !settings.layLoad;
        GM_setValue('lay_load', settings.layLoad);
        const message = settings.layLoad ? "已开启自动加载" : "已关闭自动加载";
        createAutoCloseModal(message, 3000);
        location.reload();
    });
    GM_registerMenuCommand(`设置帖子的时间范围:${settings.hoursCount}`, function () {
        const hours = prompt('请输入帖子的时间范围(小时)', settings.hoursCount);
        if (hours !== null) {
            settings.hoursCount = parseInt(hours);
            GM_setValue('hours_count', settings.hoursCount);
            let hideSpace = settings.hoursCount * 60 * 60 * 1000;
            createAutoCloseModal('已设置时间范围为' + settings.hoursCount + '小时内', 3000);
            location.reload();
        }
    });
    // 添加排序菜单选项
    GM_registerMenuCommand(`按回复数升序/降序排列`, function () {
        settings.sortOrder = settings.sortOrder === 'reply_asc' ? 'reply_desc' : 'reply_asc';
        GM_setValue('sort_order', settings.sortOrder);
        reSortAndFilterList()
        createAutoCloseModal("已切换 回复数 排序", 3000);
    });
    GM_registerMenuCommand(`按点击数升序/降序排列`, function () {
        settings.sortOrder = settings.sortOrder === 'click_asc' ? 'click_desc' : 'click_asc';
        GM_setValue('sort_order', settings.sortOrder);
        reSortAndFilterList()
        createAutoCloseModal("已切换 点击数 排序", 3000);
    });
    GM_registerMenuCommand(`按吾爱币降序排列`, function () {
        settings.sortOrder = '52coin';
        GM_setValue('sort_order', settings.sortOrder);
        reSortAndFilterList()
        createAutoCloseModal("已设为 吾爱币 降序", 3000);
    });
    GM_registerMenuCommand(`默认排序(不排序)`, function () {
        settings.sortOrder = 'default';
        GM_setValue('sort_order', settings.sortOrder);
        reSortAndFilterList()
        createAutoCloseModal("已设为 默认 排序", 3000);
    });


    let createTimeIn; // 创建时间定位元素地址
    const currentLink = window.location.href; // 当前页面地址

    // 自动加载
    function layLoad(){
        createAutoCloseModal("自动加载中,稍等……", 3000);
        // 记录开始时间
        const startTime = new Date().getTime();
        const intervalId = setInterval(function () {
            $('#autopbn').click();
            if (new Date().getTime() - startTime >= 3000) {
                clearInterval(intervalId); // 停止循环
            }
        }, 800);
        setTimeout(function () {
            otherDeal(); // 执行处理函数
            createAutoCloseModal("完成", 1000);
        }, 5000);
    }

    // 定义一个函数,用于重新排列和筛选列表
    function reSortAndFilterList() {
        // 重新排列列表
        reSort();
        // 筛选列表
        listDeal();
        // 重新设置序号
        renumberList();
    }


    // 主函数,调用所有处理逻辑
    function main() {
        // 通用样式处理
        commonDeal();
        // 帖子详情页
        if (currentLink.includes("viewthread") || currentLink.includes("thread-")) {
            detailDeal();
        }
        if (currentLink.includes("forumdisplay") || currentLink.includes("guide") || currentLink.includes("forum-")) {
            if (settings.layLoad) {
                layLoad();
            } else {
                otherDeal();
            }
        }
    }

    main(); // 调用主函数

    // 消息提示
    function createAutoCloseModal(message, timeout) {
        var modal = document.createElement("div");
        modal.style.position = "fixed";
        modal.style.top = "50%";
        modal.style.left = "50%";
        modal.style.transform = "translate(-50%, -50%)";
        modal.style.backgroundColor = "rgba(0, 0, 0, 0.7)";
        modal.style.color = "white";
        modal.style.padding = "20px";
        modal.style.borderRadius = "5px";
        modal.style.zIndex = "1000";
        modal.innerText = message;
        document.body.appendChild(modal);

        setTimeout(function () {
            document.body.removeChild(modal);
        }, timeout);
    }

    // 在地址栏变化时重新执行脚本
    /*window.addEventListener('popstate', function (event) {
        main();
        //otherDeal();
    });*/

})();