您需要先安装一款用户样式管理器扩展(如 Stylus)后才能安装此样式。
您需要先安装一款用户样式管理器扩展(如 Stylus)后才能安装此样式。
您需要先安装一款用户样式管理器扩展(如 Stylus)后才能安装此样式。
您需要先安装一款用户样式管理器扩展后才能安装此样式。
您需要先安装一款用户样式管理器扩展后才能安装此样式。
您需要先安装一款用户样式管理器扩展后才能安装此样式。
(我已经安装了用户样式管理器,让我安装!)
// ==UserScript==
// @name 贵物班友会
// @namespace http://tampermonkey.net/
// @version 1.0
// @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 modalHtml='<div id="markModal" class="dialog">'
+' <div class="container">'
+' <div class="dialog_header">'
+' </div>'
+' <div class="dialog_center">'
+' 颜色:<input id="markColor" type="text" list="colors">'
+'<datalist id="colors">'
+'<option value="red">'
+'<option value="yellow">'
+'<option value="blue">'
+'<option value="green">'
+'</datalist>'
+'<br>'
+' 备注:<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>';
$('body').append(modalHtml);
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 tempHtml= '<span style="color:'+tempMonster.color+'">贵物:'+tempMonster.name+'</span>'+"<br>"
+'<span style="color:'+tempMonster.color+'">淳朴度:'+tempMonster.score+'</span><br>'
+'<span>简介:</span><br>'
+'<span style="white-space: pre;">'+(tempMonster.cont?tempMonster.cont:'无')+'</span>';
$("#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",function(e){
$('#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>');
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 });
$('#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];
}
// 本地标记初始化
$.each(userMark, function(index, value){
let $user=$("a[href='/user/"+index+"']:not(.avatar,.focus)");
let $$user=$("a[href='"+urls+"/user/"+index+"']:not(.avatar,.focus)");
if($user.length> 0){
$user.css({"color":value.color});
$user.after('<span style="color:'+value.color+'">['+value.mark+']</span>')
}
if($$user.length> 0){
$$user.css({"color":value.color});
$$user.after('<span style="color:'+value.color+'">['+value.mark+']</span>')
}
// 解决改bgmid的问题,但没有头像就失效了
let len=$("a.avatar").length;
for(let i=0;i<len;i++){
let ava=$("a.avatar").eq(i);
if(!ava.html()){
continue;
}
if(ava.html().indexOf("/"+index+".jpg")>-1){
let hrefVal=ava.attr("href");
if(hrefVal.indexOf("/user/")==-1){
continue;
}
let split=hrefVal.split("/")
let newIndex=split[split.length-1];
let $user2=$("a[href='/user/"+newIndex+"']:not(.avatar,.focus)");
let $$user2=$("a[href='"+urls+"/user/"+index+"']:not(.avatar,.focus)");
if($user2.length> 0){
$user2.css({"color":value.color});
$user2.after('<span style="color:'+value.color+'">['+value.mark+']</span>')
}
if($$user2.length> 0){
$$user2.css({"color":value.color});
$$user2.after('<span style="color:'+value.color+'">['+value.mark+']</span>')
}
break;
}
}
});
// 外部标记初始化
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,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);
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<-5){
color="red";
}else if(score<-2){
color="hotPink";
}else if(score<0){
color="lightPink";
}else if(score==0){
color="black";
}else if(score<=2){
color="lightGreen";
}else if(score<=5){
color="lawnGreen";
}else if(score<=10){
color="green";
}
return color;
}
let getMonsterHtml=function(monster){
if(monster){
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);
}
//(老悠 友好度:-10分,主号:xxx) 【牵手家族】高级成员、疑似【XX家族】中级成员
return '<span style="color:'+nameColor+'" class="monsterTipBtn" bgmId="'+monster.bgmId+'">('+monster.name+type+')</span>'+mcs+' ';
}else{
return "";
}
}
let monsterMap={};
let cliqueMap={};
let initMonster=function(bgmId,newBgmId){
if(!bgmId||!newBgmId){
return;
}
let monster=monsterMap[newBgmId];
if(!monster){
monsterMap[newBgmId]={data:null};
$.get('https://58.218.111.242:380/yodb/api/anon/vulgar/monster/vo/detailByBgmId/'+bgmId, function(res){
if(!res||!res.data){
if(newBgmId!=bgmId){
$.get('https://58.218.111.242:380/yodb/api/anon/vulgar/monster/vo/detailByBgmId/'+newBgmId, function(res){
monsterMap[newBgmId]=res;
setMonsterHtml(res.data,bgmId,newBgmId);
});
}
}else{
monsterMap[newBgmId]=res;
setMonsterHtml(res.data,bgmId,newBgmId);
}
});
}
}
async function executeAsyncTask() {
await initVulgar();
}
executeAsyncTask();
})();