Greasy Fork is available in English.

B站游戏wiki ——支线任务完成标记

对H3任务标题添加【任务标记】、【内容折叠】功能,以便于了解自己完成的任务。对树桩、宝箱添加标记功能,记录领取状态。

// ==UserScript==
// @name         B站游戏wiki ——支线任务完成标记
// @namespace      https://greasyfork.org/users/3128
// @version       0.3.6.1
// @description    对H3任务标题添加【任务标记】、【内容折叠】功能,以便于了解自己完成的任务。对树桩、宝箱添加标记功能,记录领取状态。
// @author       极品小猫
// @match        https://wiki.biligame.com/yanyu/*
// @match        https://wiki.biligame.com/sr/*
// @exclude      https://wiki.biligame.com/yanyu/%E6%B8%B8%E6%88%8F%E6%94%AF%E7%BA%BF
// @require         https://cdn.staticfile.org/jquery/2.1.4/jquery.min.js
// @grant        GM_setValue
// @grant        GM_getValue
// @grant        GM_deleteValue
// @grant        GM_addStyle
// @grant        GM_setClipboard
// @grant          GM_xmlhttpRequest
// @grant        unsafeWindow
// @grant        GM_notification
// @grant        GM_registerMenuCommand
// @license      MIT
// @run-at       document-idle
// ==/UserScript==

(function() {
    'use strict';

    let u=unsafeWindow,
        webHost=location.host.toLowerCase(),
        webPath=location.pathname;

    let wgConfig,
        wgGameName,
        wgPageName;
    let GM_Config, GM_Config_Task={},
        GMAPI={
            save(TableName, Data) {
                GM_setValue('update', new Date().getTime());
                if(arguments.length===0)
                    GM_setValue(wgGameName, GM_Config);
            }
        }

    switch(webHost) {
        case 'wiki.biligame.com':
            {
                wgConfig = u?.RLCONF || u?.mw?.config.get(),
                    wgGameName = wgConfig?.wgGameName, //游戏Wiki名
                    wgPageName = wgConfig?.wgPageName; //页面标题
                if(!wgPageName) alert(`加载基础数据失败,请刷新页面。`);

                GM_Config=GM_getValue(wgGameName, {});


                //转换 1.0 版本储存于 localStorage 的配置数据,使用 GM 存储 API 保存数据
                if(localStorage[wgPageName]) {
                    GM_Config_Task=JSON.parse(localStorage[wgPageName]);
                    GMAPI.save();
                    delete localStorage[wgPageName];
                }
                if(!GM_Config[wgPageName]) {
                    //转换 2.0 版本存储于 根节点 的配置数据,数据保存于 Wiki 对应的名称下,便于支持多 Wiki
                    GM_Config_Task=GM_getValue(wgPageName, {});
                    GM_Config[wgPageName]=GM_Config_Task;
                    GM_deleteValue(wgPageName);
                    GMAPI.save();
                } else {
                    GM_Config_Task=GM_Config[wgPageName];
                }

                GM_addStyle(`
                input[title="任务完成标记"]{width:80px;height80px}
                /*解决信息盒子没有新信息时塌陷的问题*/
                .oo-ui-popupWidget-body {min-height:300px;}
                `);
                let Bind={
                    InputClick(e) { // @Rank = 归类
                        //console.log(this, e);
                        if(e.data.Rank) {
                            if(!GM_Config_Task[e.data.Rank]) GM_Config_Task[e.data.Rank]={};
                            GM_Config_Task[e.data.Rank][e.data.key]=e.target.checked;
                        }
                        else GM_Config_Task[e.data.key]=e.target.checked;
                        GMAPI.save();
                    }
                }

                switch(wgGameName) {
                    case 'yanyu':
                        //首页
                        if(webPath.includes('%E9%A6%96%E9%A1%B5')) {
                            //隐藏轮播、答题辅助图片
                            $('#biliCarousel1, a[title="答题辅助"]').parentsUntil('.sy-box-css').parent().hide();
                        }

                        //答题辅助页面
                        if(webPath.includes('%E7%AD%94%E9%A2%98%E8%BE%85%E5%8A%A9')) {
                            let t=setInterval(function(e){
                                if($('.form-control.searcher-text').length>0) {
                                    $('.form-control.searcher-text').focus(function(){
                                        console.log($(this).select());
                                        $(this).select();
                                    });
                                    clearInterval(t);
                                }
                            }, 1000);
                        }

                        //树桩、宝箱添加标记框
                        $('#TbPn-shuzhuang .wikitable tr:not(:first-child), #TbPn-baoxiang .wikitable tr:not(:first-child), #TbPn-sousuo .wikitable tr:not(:first-child)').each(function(i, e){
                            let td=$('<td>'),
                                boxPosition = $(this).find('td:nth-child(-n+2):not([rowspan])').text().trim().replace(/,/,',').replace(/[^\d,]/g,''), //获取树桩、宝箱坐标信息
                                checkBox = $('<input type="checkBox" title="标记物品已领取">').attr({id:`checkBox_${boxPosition}`}).on('click', {key: boxPosition, Rank: '资源'}, Bind.InputClick);
                            checkBox.prop('checked', GM_Config_Task?.['资源']?.[boxPosition]);
                            $(this).append(td.append(checkBox));
                        });

                        break;
                }

                //遍历任务导航,添加任务标记框
                let toclevel;
                for(let i=2;i>0;i--) {
                    //console.log(i, `.toclevel-${i}`, document.querySelector(`.toclevel-${i}`));
                    if(document.querySelector(`.toclevel-${i}`)) {
                        toclevel=`.toclevel-${i}`;
                        break;
                    }
                }

                if(toclevel)
                    $(toclevel).each(function(i, e){ //遍历二级标题
                        let this_toc=this;

                        let taskTitleID=$(this).find('a[href^="#"]').attr('href').replace('#',''), //获得锚点作为ID
                            taskInputID=`checkTask_${taskTitleID}`, //使用任务锚点作为任务ID,避免出现同名任务
                            taskTitleID_Selector=taskTitleID.replace(/([:.])/g,'\\$1');

                        let checkTask=$('<input type="checkbox" title="任务完成标记">').attr({id:taskInputID}).click(function(e, aa){
                            GM_Config_Task[taskTitleID]=this.checked;
                            GMAPI.save();
                            if(this.checked) $(this_toc).append('<span>√</span>');
                            else $(this_toc).find(':last-child').remove();
                        });

                        //插入任务完成标记Input
                        $(`#${taskTitleID_Selector}`).before(checkTask);

                        let label=$('<label>').attr({for:taskInputID}).text(taskTitleID);
                        $(`#${taskTitleID_Selector}`).parent().find('.mw-headline').html(label); //在标题前插入复选框

                        let headLineBox=$(`#${taskTitleID_Selector}`).parent(); //任务标题获得父容器
                        let headLineBox_ContentBox=$(`<div data-taskTitle="${taskTitleID}">`);
                        headLineBox_ContentBox.append(headLineBox.nextUntil('h2, h3')); //遍历获得父容器间的内容,并填充

                        headLineBox.click(()=>{
                            headLineBox_ContentBox.toggle();
                        }); //为标题父容器添加折叠事件
                        label.click(()=>{
                            headLineBox_ContentBox.toggle();
                        });


                        headLineBox_ContentBox.insertAfter(headLineBox);
                        //读取任务状态
                        if(GM_Config_Task[taskTitleID]) {
                            checkTask.prop('checked', GM_Config_Task[taskTitleID]||false); //变更配置数据
                            $(this).append('√'); //添加任务状态
                            headLineBox_ContentBox.hide(); //隐藏掉任务内容
                        }
                    });
            }

        default :
    }

    // Your code here...
})();