Greasy Fork

Greasy Fork is available in English.

贵物班友会

贵物班友会(bgm.tv、bangumi.tv、chii.in)

当前为 2024-07-30 提交的版本,查看 最新版本

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// ==UserScript==
// @name         贵物班友会
// @namespace    http://tampermonkey.net/
// @version      2.0.3
// @description  贵物班友会(bgm.tv、bangumi.tv、chii.in)
// @author       老悠
// @include      https://bgm.tv/*
// @include      https://bangumi.tv/*
// @match        https://chii.in/*
// @grant        GM_addStyle
// @grant        GM_getResourceText
// @license      MIT
// ==/UserScript==
(function() {
    'use strict';
    GM_addStyle('.dialog { width: 100%; height: 100vh; background-color: rgba(0, 0, 0, 0.5); position: absolute; top: 0; left: 0;line-height: 30px; display: none; } .dialog .container {width: 220px;height: 100px; background-color: #fff;margin: calc((100vh - 100px)/2) auto; position: relative;} .dialog .container .dialog_footer { position: absolute; bottom: 0; } .dialog .container .dialog_footer button {position: relative;left: 50px;display: inline-block;width: 50px;bottom: 10px;} .monster-tooltip {display: none;position: absolute;background-color: #f9f9f9;border: 1px solid #ccc;padding: 5px 10px;border-radius: 5px;font-size: 14px;}')

    let yodbUrl="https://ly.syaro.io:380/yodb/api/";
    //let yodbUrl="http://192.168.224.134:8080/yodb/";
    let myBgmId;
    let myBgmId2;
    let protocol = window.location.protocol;
    let host = window.location.host;
    let baseUrl = protocol + '//' + host;
    $.get(baseUrl+"/home",function(html,status){
        let $html=$(html);
        let $avatar=$html.find("#headerProfile .avatar:first");
        let tempHtml=$avatar.html();
        if(tempHtml){
            let bgImgSplit=$avatar.html().split(".jpg")[0].split("/");
            let split=$avatar.prop("href").split("/");
            myBgmId=split[split.length-1];
            myBgmId2=bgImgSplit[bgImgSplit.length-1];
        }


        let modalHtml='<div id="markModal" class="dialog">'
        +' <div class="container">'
        +'  <div class="dialog_header">'
        +'  </div>'
        +'  <div class="dialog_center">'
        +'     &nbsp;&nbsp;&nbsp;&nbsp;颜色:<input id="markColor" type="text" list="colors">'
        +'<datalist id="colors">'
        +'<option value="red">'
        +'<option value="yellow">'
        +'<option value="blue">'
        +'<option value="green">'
        +'</datalist>'
        +'<br>'
        +'     &nbsp;&nbsp;&nbsp;&nbsp;备注:<input id="markMark" type="text" ><br>'
        +'  </div>'
        +'   <div style="justify-content: center;display: flex;margin-top:10px;">'
        +'     <button class="cancel">取消</button>'
        +'     <button class="submit">确定</button>'
        +'    </div>'
        +'   </div>'
        +' </div>';
        let modalHtml2='<div id="markModal" class="dialog">'
        +' <div class="container" style="height:220px">'
        +'  <div class="dialog_header">'
        +'  </div>'
        +'  <div class="dialog_center">'
        +'     &nbsp;&nbsp;&nbsp;&nbsp;bgmId:<input id="markBgmId" type="text" style="width:140px" disabled>'
        +'<br>'
        +'     &nbsp;&nbsp;&nbsp;&nbsp;名称:<input id="markName" type="text" style="width:150px">'
        +'<br>'
        +'     &nbsp;&nbsp;&nbsp;&nbsp;淳朴度:<input id="markScore" max="5" min="-5" type="number" style="width:138px">'
        +'<br>'
        +'     &nbsp;&nbsp;&nbsp;&nbsp;简介:<textarea id="markCont" type="text"  style="width:150px;white-space:pre-wrap" rows="5"></textarea><br>'
        +'  </div>'
        +'   <div style="justify-content: center;display: flex;margin-top:10px;">'
        +'     <button class="cancel">取消</button>'
        +'     <button class="submit">确定</button>'
        +'    </div>'
        +'   </div>'
        +' </div>';
        $('body').append(modalHtml2);

        let initModalVal=function(){
            let ava=$("#headerProfile a.avatar");
            if(!ava){
                return;
            }
            let hrefVal=ava.attr("href");
            if(!hrefVal){
                return;
            }
            let newBgmId;
            let oldBgmId;
            if(hrefVal.indexOf("/user/")>-1){
                let split=hrefVal.split("/");
                newBgmId=split[split.length-1];
                let imgUrl=ava.find("span").css("background-image");
                if(imgUrl){
                    let oldSplit=imgUrl.split("/");
                    let oldTempSplit=oldSplit[oldSplit.length-1].split(".");
                    oldBgmId=oldTempSplit[0];
                    //没有头像无法获得原始bgmId
                    if(oldBgmId=='icon'){
                        oldBgmId=newBgmId;
                    }
                }
            }
            $("#markBgmId").val(newBgmId);

            $.get(yodbUrl+'anon/vulgar/monsterScore/detailByBgmId/'+newBgmId+"?newMyBgmId="+myBgmId+"&oldMyBgmId="+myBgmId2, function(res){
                if(!res||!res.data){
                    if(newBgmId!=oldBgmId){
                        $.get(yodbUrl+'anon/vulgar/monsterScore/detailByBgmId/'+oldBgmId+"?newMyBgmId="+myBgmId+"&oldMyBgmId="+myBgmId2, function(res){
                            setModalVal(res.data);
                        });
                    }
                }else{
                    setModalVal(res.data);
                }
            });
        }

        let setModalVal=function(modalData){
            $("#markBgmId").val(modalData.monster.bgmId);
            $("#markName").val(modalData.name);
            $("#markScore").val(modalData.score);
            $("#markCont").text(modalData.cont);
        }
        initModalVal();

        let marksModalHtml='<div id="marksModal" class="dialog">'
        +' <div class="container" style="height: 500px;width: 500px;margin: calc((100vh - 500px)/2) auto;">'
        +'  <div class="dialog_header">'
        +'  </div>'
        +'  <div class="dialog_center">'
        +'  <div style="justify-content: center;display: flex;">'
        +'  全量傻逼备注JSON:<br>'
        +'  </div>'
        +'  <div style="justify-content: center;display: flex;">'
        +'     <textarea id="userMark" type="text" style="width:90%;height:420px;"/><br>'
        +'  </div>'
        +'  </div>'
        +'   <div style="justify-content: center;display: flex;margin-top:10px;">'
        +'     <button class="cancel">取消</button>'
        +'     <button class="submit">确定</button>'
        +'    </div>'
        +'   </div>'
        +' </div>';
        // $('body').append(marksModalHtml);

        let tooltipHtml='<div class="monster-tooltip" id="monsterTooltip">无信息</div>';
        $('body').append(tooltipHtml);
        $(document).on("mouseenter",".monsterTipBtn",function(e){
            var tooltip = $('#monsterTooltip');
            let tempBgmId=$(this).attr("bgmId");
            let tempMonster=monsterMap[tempBgmId].data;
            let tempMyMonster=myMonsterMap[tempBgmId].data;
            let tempHtml='';
            if(tempMyMonster){
                tempMyMonster.color=getColor(tempMyMonster.score);
                tempHtml+= '私有标记:<br><span style="color:'+tempMyMonster.color+'">贵物:'+tempMyMonster.name+'</span>'+"<br>"
                    +'<span style="color:'+tempMyMonster.color+'">淳朴度:'+tempMyMonster.score+'</span><br>'
                    +'<span style="color:'+tempMyMonster.color+'">简介:</span><br>'
                    +'<span style="white-space: pre;color:'+tempMyMonster.color+'">'+(tempMyMonster.cont?tempMyMonster.cont:'无')+'</span>';
            }


            if(tempMonster&&tempMonster.name){
                if(tempHtml.length>0){
                    tempHtml+='<br><br>';
                }
                tempHtml+=  '公共标记:<br><span style="color:'+tempMonster.color+'">贵物:'+tempMonster.name+'</span>'+"<br>"
                    +'<span style="color:'+tempMonster.color+'">淳朴度:'+tempMonster.score+'</span><br>'
                    +'<span style="color:'+tempMonster.color+'">简介:</span><br>'
                    +'<span style="white-space: pre;color:'+tempMonster.color+'">'+(tempMonster.cont?tempMonster.cont:'无')+'</span>';
            }
            if(tempHtml.length>0){
                $("#monsterTooltip").html(tempHtml);
            }
            tooltip.css({
                top: e.pageY + 'px',
                left: e.pageX + 'px',
                display: 'block'
            });
        });
        $(document).on("mouseenter",".cliqueTipBtn",function(e){
            var tooltip = $('#monsterTooltip');
            let tempCliqueId=$(this).attr("cliqueId");
            let tempClique=cliqueMap[tempCliqueId];

            let color=getColor(tempClique.score);
            let tempHtml= '<span style="color:'+color+'">小圈子:'+tempClique.name+'</span>'+"<br>"
            +'<span style="color:'+color+'">淳朴度:'+tempClique.score+'</span><br>'
            +'<span>简介:</span><br>'
            +'<span  style="white-space: pre;">'+(tempClique.cont?tempClique.cont:'无')+'</span>';
            $("#monsterTooltip").html(tempHtml);

            tooltip.css({
                top: e.pageY + 'px',
                left: e.pageX + 'px',
                display: 'block'
            });
        });
        $(document).on("mouseleave",".monsterTipBtn,.cliqueTipBtn,#monsterTooltip",function(e){
            if(!$(e.relatedTarget).is('#monsterTooltip')){
                $('#monsterTooltip').hide();
            }
        });

        //$("#headerProfile").find("div.actions").append('<a id="addMark" href="javascript:void(0)" class="chiiBtn"  data-toggle="modal" data-target="#markModal"><span>添加/修改备注</span></a>'
        //                                              +'<a id="addMarks" href="javascript:void(0)" class="chiiBtn"  data-toggle="modal" data-target="#marksModal"><span>批量添加/修改备注</span></a>');
        $("#headerProfile").find("div.actions").append('<a id="addMark" href="javascript:void(0)" class="chiiBtn"  data-toggle="modal" data-target="#markModal"><span>添加/修改备注</span></a>');
        let id1=$("#headerProfile").find("div.name small.grey").text().replace("@","");

        let userMark=localStorage.getItem('userMark');

        if(!userMark){
            userMark={};
        }else{
            try{
                userMark=JSON.parse(userMark);
            } catch(e){
                userMark={};
            }
        }
        $("#addMark").click(function(){
            $('#markModal').show(1000);
        });

        $("#addMarks").click(function(){
            $("#userMark").val(JSON.stringify(userMark));
            $('#marksModal').show(1000);
        });

        // 确定按钮的操作
        $('#markModal .submit').click(function () {
            //userMark[id1]={"color":$("#markColor").val(),"mark":$("#markMark").val()};
            //let json=JSON.stringify(userMark);
            //localStorage.setItem('userMark', json, { expires: 999999999 });
            //{"newMyBgmId":myBgmId,"oldMyBgmId":myBgmId2,"name":$("#markName").val(),"score":$("#markScore").val(),"cont":$("#markCont").text()}
            //$.post(yodbUrl+'anon/vulgar/monsterScore/save/'+$("#markBgmId").val()+"?newMyBgmId="+myBgmId+"&oldMyBgmId="+myBgmId2+"&name="+$("#markName").val()+"&score="+$("#markScore").val()+"&cont="+$("#markCont").val(),
            //    function(res){
            $.post(yodbUrl+'anon/vulgar/monsterScore/save/'+$("#markBgmId").val(),
                   {"newMyBgmId":myBgmId,"oldMyBgmId":myBgmId2,"name":$("#markName").val(),"score":$("#markScore").val(),"cont":$("#markCont").val()}, function(res){
                if(!res.success){
                    alert(res.message+"\n"+"未在https://ly.syaro.io:380/注册并绑定bgmId无法使用私有标记功能");
                }else{
                    $('#markModal').fadeToggle(1000);
                    location.reload();
                }
            });
        });
        // 取消按钮的操作
        $('#markModal .cancel').click(function () {
            $('#markModal').hide(1000)
        });

        // 批量模态框确定按钮的操作
        $('#marksModal .submit').click(function () {
            let json=$("#userMark").val();
            localStorage.setItem('userMark', json, { expires: 999999999 });
            $('#marksModal').fadeToggle(1000);
            location.reload();
        });
        // 批量模态框取消按钮的操作
        $('#marksModal .cancel').click(function () {
            $('#marksModal').hide(1000)
        });

        var url = window.location.href;
        var urlstr = url.split("/");
        var urls = '';
        if (urlstr[2]) {
            urls = urlstr[0]+'//'+urlstr[2];
        }

        // 外部标记初始化
        let initVulgar=function(){
            let len=$("a.avatar").length;
            for(let i=0;i<len;i++){
                let ava=$("a.avatar").eq(i);
                let hrefVal=ava.attr("href");
                if(hrefVal.indexOf("/user/")==-1){
                    continue;
                }
                let split=hrefVal.split("/");
                let newIndex=split[split.length-1];

                let imgUrl=ava.find("span").css("background-image");
                if(!imgUrl){
                    continue;
                }
                let oldSplit=imgUrl.split("/");
                let oldTempSplit=oldSplit[oldSplit.length-1].split(".");
                let index=oldTempSplit[0];
                //没有头像无法获得原始bgmId
                if(index=='icon'){
                    index=newIndex;
                }

                initMonster(index,newIndex);

            }
        }

        let setMonsterHtml=function(monster,myMonster,bgmId,newBgmId){
            let $user2=$("a[href='/user/"+newBgmId+"']:not(.avatar,.focus,.monster)");
            let $$user2=$("a[href='"+urls+"/user/"+bgmId+"']:not(.avatar,.focus,.monster)");
            if(monster){
                let monsterHtml=getMonsterHtml(monster,myMonster,newBgmId);
                if($user2.length> 0){
                    if(monster.color){
                        $user2.css({"color":monster.color});
                    }
                    $user2.addClass("monster");
                    $user2.after(monsterHtml);
                }
                if($$user2.length> 0){
                    if(monster.color){
                        $$user2.css({"color":monster.color});
                    }
                    $user2.addClass("monster");
                    $$user2.after(monsterHtml);
                }
            }
        }

        let getColor=function(score){
            let color="black";
            if(score==-4||score==-5){
                color="red";
            }else if(score==-3||score==-2){
                color="hotPink";
            }else if(score==-1){
                color="lightPink";
            }else if(score==0){
                color="black";
            }else if(score==1){
                color="lightGreen";
            }else if(score==2||score==3){
                color="lawnGreen";
            }else if(score==4||score==5){
                color="green";
            }
            return color;
        }

        let getMonsterHtml=function(monster,myMonster,newBgmId){
            if(monster){
                if(!monster.score){
                    monster.score=0;
                }
                let nameColor=getColor(monster.score);
                monster.color=nameColor;
                let type="";
                if(monster.type.field=="SLAVE"){
                    type=",主号:";
                    if(monster.masterId){
                        type+='<a href="/user/'+monster.master.bgmId+'">'+monster.master.name+'</a>';
                    }else{
                        type+="未知";
                    }
                }
                let mcs="";
                if(monster.mcs&&monster.mcs.length>0){
                    mcs=' ';
                    let high='';
                    let middle='';
                    let low='';
                    let unknown='';
                    for(let i=0;i<monster.mcs.length;i++){
                        let mc=monster.mcs[i];
                        cliqueMap[mc.clique.id]=mc.clique;
                        let mCStatus='';
                        if(mc.mCStatus.field=="JOIN"){
                        }else if(mc.mCStatus.field=='SUS_JOIN'){
                            mCStatus='疑似';
                        }else{
                            continue;
                        }
                        if(mc.level.field=='HIGH'){
                            high+='<span style="color:red" class="cliqueTipBtn" cliqueId="'+mc.clique.id+'">'+mCStatus+'【'+mc.clique.name+'】高级成员</span>,';
                        }else if(mc.level.field=='MIDDLE'){
                            middle+='<span style="color:hotPink" class="cliqueTipBtn" cliqueId="'+mc.clique.id+'">'+mCStatus+'【'+mc.clique.name+'】中级成员</span>,';
                        }else if(mc.level.field=='LOW'){
                            low+='<span style="color:lightPink" class="cliqueTipBtn" cliqueId="'+mc.clique.id+'">'+mCStatus+'【'+mc.clique.name+'】低级成员</span>,';
                        }else if(mc.level.field=='UNKNOWN'){
                            unknown+='<span style="color:black" class="cliqueTipBtn" cliqueId="'+mc.clique.id+'">'+mCStatus+'【'+mc.clique.name+'】成员</span>,';
                        }
                    }
                    mcs+=high+middle+low+unknown;
                    mcs=mcs.substring(0, mcs.length - 1);
                }
                let name=monster.name;
                if(!name){
                    if(!myMonster||!myMonster.name){
                        return '';
                    }
                    name=myMonster.name+'[暂无公共标记]';
                }
                return '<span style="color:'+nameColor+'" class="monsterTipBtn" bgmId="'+monster.bgmId+'">('+name+type+')</span>'+mcs+'  ';
            }else{
                return "";
            }
        }

        let monsterMap={};
        let myMonsterMap={};
        let cliqueMap={};


        let initMonster=function(bgmId,newBgmId){
            if(!bgmId||!newBgmId){
                return;
            }
            let monster=monsterMap[newBgmId];
            if(!monster){
                monsterMap[newBgmId]={data:null};
                $.get(yodbUrl+'anon/vulgar/monster/vo/detailByBgmId/'+bgmId, function(res){
                    if(!res||!res.data){
                        if(newBgmId!=bgmId){
                            $.get(yodbUrl+'anon/vulgar/monster/vo/detailByBgmId/'+newBgmId, function(res){
                                monsterMap[newBgmId]=res;
                                initMyMonster(res.data,bgmId,newBgmId);
                            });
                        }
                    }else{
                        monsterMap[newBgmId]=res;
                        initMyMonster(res.data,bgmId,newBgmId);
                    }
                });
            }
        }

        let initMyMonster=function(monsterData,bgmId,newBgmId){
            let myMonster=myMonsterMap[newBgmId];
            if(!myMonster){
                myMonsterMap[newBgmId]={data:null};
                $.get(yodbUrl+'anon/vulgar/monsterScore/detailByBgmId/'+bgmId+"?newMyBgmId="+myBgmId+"&oldMyBgmId="+myBgmId2, function(res){
                    if(!res||!res.data){
                        if(newBgmId!=bgmId){
                            $.get(yodbUrl+'anon/vulgar/monsterScore/detailByBgmId/'+newBgmId+"?newMyBgmId="+myBgmId+"&oldMyBgmId="+myBgmId2, function(res){
                                myMonsterMap[newBgmId]=res;
                                setMonsterHtml(monsterData,res.data,bgmId,newBgmId);
                            });
                        }else{
                            setMonsterHtml(monsterData,res.data,bgmId,newBgmId);
                        }
                    }else{
                        myMonsterMap[newBgmId]=res;
                        setMonsterHtml(monsterData,res.data,bgmId,newBgmId);
                    }
                });
            }
        }

        async function executeAsyncTask() {
            await initVulgar();
        }

        executeAsyncTask();
    });


})();