forked from andywang425/BLTH
-
Notifications
You must be signed in to change notification settings - Fork 0
/
B站直播间挂机助手.user.js
56 lines (56 loc) · 108 KB
/
B站直播间挂机助手.user.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
// ==UserScript==
// @name B站直播间挂机助手
// @name:zh B站直播间挂机助手
// @name:en Bilibili Live Helper
// @namespace https://github.com/andywang425
// @author andywang425
// @description 优化直播观看体验
// @description:en Improve live viewing experience
// @updateURL https://raw.githubusercontent.com/andywang425/BLTH/master/B%E7%AB%99%E7%9B%B4%E6%92%AD%E9%97%B4%E6%8C%82%E6%9C%BA%E5%8A%A9%E6%89%8B.user.js
// @downloadURL https://raw.githubusercontent.com/andywang425/BLTH/master/B%E7%AB%99%E7%9B%B4%E6%92%AD%E9%97%B4%E6%8C%82%E6%9C%BA%E5%8A%A9%E6%89%8B.user.js
// @homepageURL https://github.com/andywang425/BLTH
// @supportURL https://github.com/andywang425/BLTH/issues
// @icon https://z4a.net/images/2022/09/15/script-icon.png
// @copyright 2021, andywang425 (https://github.com/andywang425)
// @license MIT
// @compatible chrome 80 or later
// @compatible firefox 77 or later
// @compatible opera 69 or later
// @compatible safari 13.1 or later
// @version 6.0.2
// @match *://live.bilibili.com/*
// @exclude *://live.bilibili.com/?*
// @run-at document-start
// @connect passport.bilibili.com
// @connect api.live.bilibili.com
// @connect api.bilibili.com
// @connect api.vc.bilibili.com
// @connect live-trace.bilibili.com
// @connect sctapi.ftqq.com
// @connect pushplus.plus
// @connect andywang.top
// @connect gitee.com
// @require https://gcore.jsdelivr.net/gh/andywang425/BLTH@dac0d115a45450e6d3f3e17acd4328ab581d0514/assets/js/library/Ajax-hook.min.js
// @require https://gcore.jsdelivr.net/npm/[email protected]/dist/jquery.min.js
// @require https://gcore.jsdelivr.net/gh/andywang425/BLTH@4dbe95160c430bc64757580f07489bb11e766fcb/assets/js/library/bliveproxy.min.js
// @require https://gcore.jsdelivr.net/gh/andywang425/BLTH@d1f68400ee93db4490e5747113a93378667ea0bc/assets/js/library/BilibiliAPI_Mod.min.js
// @require https://gcore.jsdelivr.net/gh/andywang425/BLTH@4368883c643af57c07117e43785cd28adcb0cb3e/assets/js/library/layer.min.js
// @require https://gcore.jsdelivr.net/gh/andywang425/BLTH@f9fc6466ae78ead12ddcd2909e53fcdcc7528f78/assets/js/library/Emitter.min.js
// @require https://gcore.jsdelivr.net/npm/[email protected]/dist/hotkeys.min.js
// @require https://gcore.jsdelivr.net/npm/[email protected]/crypto-js.min.js
// @require https://gcore.jsdelivr.net/gh/andywang425/BLTH@c117d15784f92f478196de0129c8e5653a9cb32e/assets/js/library/BiliveHeart.min.js
// @resource layerCss https://gcore.jsdelivr.net/gh/andywang425/BLTH@d25aa353c8c5b2d73d2217b1b43433a80100c61e/assets/css/layer.css
// @resource myCss https://gcore.jsdelivr.net/gh/andywang425/BLTH@5bcc31da7fb98eeae8443ff7aec06e882b9391a8/assets/css/myCss.min.css
// @resource main https://gcore.jsdelivr.net/gh/andywang425/BLTH@bd2b26eddac514781fbbe2f6cd7eb58963a14aa5/assets/html/main.min.html
// @resource eula https://gcore.jsdelivr.net/gh/andywang425/BLTH@da3d8ce68cde57f3752fbf6cf071763c34341640/assets/html/eula.min.html
// @grant unsafeWindow
// @grant GM_xmlhttpRequest
// @grant GM_getResourceText
// @grant GM_notification
// @grant GM_openInTab
// @grant GM_getValue
// @grant GM_setValue
// @grant GM_deleteValue
// @grant GM_addStyle
// ==/UserScript==
(function(){localstorage2gm();const NAME="BLTH",W="undefined"==typeof unsafeWindow?window:unsafeWindow,eventListener=W.addEventListener,wfetch=W.fetch,_setTimeout=W.setTimeout,_setInterval=W.setInterval,ts_ms=()=>Date.now(),ts_s=()=>Math.round(ts_ms()/1e3),tz_offset=(new Date).getTimezoneOffset()+480,getCHSdate=()=>new Date(ts_ms()+6e4*tz_offset),delayCall=(e,t=12e4)=>{const i=$.Deferred();return setTimeout((()=>{const t=e();t&&t.then?t.then(((e,t,n,o,a,r)=>i.resolve(e,t,n,o,a,r))):i.resolve()}),t),i},MYDEBUG=(e,...t)=>{if(!SP_CONFIG.debugSwitch)return;if("object"==typeof t[0]&&t[0].netError)return MYERROR(e,...t);let i=new Date;if(i=`%c[${NAME}]%c[${i.getHours()}:${i.getMinutes()}:${i.getSeconds()}:${i.getMilliseconds()}]%c`,1===t.length)return console.log(i,"font-weight: bold;","color: #0920e6;","",`${e}:`,t[0]);console.log(i,"font-weight: bold;","color: #0920e6;","",`${e}:`,t)},MYERROR=(e,...t)=>{let i=new Date;if(i=`[${NAME}][${i.getHours()}:${i.getMinutes()}:${i.getSeconds()}:${i.getMilliseconds()}]`,1===t.length)return console.error(i,`${e}:`,t[0]);console.error(i,`${e}:`,t)},runMidnight=(e,t)=>{const i=new Date;let n=t||" ";i.setMinutes(i.getMinutes()+tz_offset),i.setDate(i.getDate()+1),i.setHours(0,1,0,0),i.setMinutes(i.getMinutes()-tz_offset),setTimeout(e,i-ts_ms()),MYDEBUG("runMidnight",n+" "+i.toString())},runExactMidnight=(e,t)=>{const i=new Date;let n=t||" ";i.setMinutes(i.getMinutes()+tz_offset),i.setDate(i.getDate()+1),i.setHours(0,0,0,0),i.setMinutes(i.getMinutes()-tz_offset),setTimeout(e,i-ts_ms()),MYDEBUG("runExactMidnight",n+" "+i.toString())},runTomorrow=(e,t,i,n)=>{const o=new Date;let a=n||" ";o.setMinutes(o.getMinutes()+tz_offset),o.setDate(o.getDate()+1),o.setHours(t,i,0,0),o.setMinutes(o.getMinutes()-tz_offset),setTimeout(e,o-ts_ms()),MYDEBUG("runTomorrow",a+" "+o.toString())},runToday=(e,t,i,n)=>{const o=new Date;let a=n||" ";o.setMinutes(o.getMinutes()+tz_offset),o.setHours(t,i,0,0),o.setMinutes(o.getMinutes()-tz_offset),setTimeout(e,o-ts_ms()),MYDEBUG("runToday",a+" "+o.toString())},newWindow={init:()=>newWindow.Toast.init(),Toast:{init:()=>{try{const e=[];return window.toast=(t,i="info",n=5e3)=>{switch(i){case"success":case"info":case"caution":case"error":break;default:i="info"}const o=$(`<div class="link-toast ${i} fixed" style="z-index:2001"><span class="toast-text">${t}</span></div>`)[0];document.body.appendChild(o),MYDEBUG("toast-"+i,t),o.style.top=document.body.scrollTop+40*e.length+10+"px",o.style.left=document.body.offsetWidth+document.body.scrollLeft-o.offsetWidth-5+"px",SP_CONFIG.windowToast||$(".link-toast").hide(),e.push(o),setTimeout((()=>{o.className+=" out",setTimeout((()=>{e.shift(),e.forEach((e=>{e.style.top=parseInt(e.style.top,10)-40+"px"})),$(o).remove()}),200)}),n)},window.singleToast=(e,t="info",i=5e3,n,o)=>{switch(t){case"success":case"info":case"caution":case"error":break;default:t="info"}const a=$(`<div class="link-toast ${t} fixed" style="z-index:2001"><span class="toast-text">${e}</span></div>`)[0];document.body.appendChild(a),MYDEBUG("singleToast-"+t,e),a.style.top=n,a.style.left=o,setTimeout((()=>{a.className+=" out",setTimeout((()=>{$(a).remove()}),200)}),i)},$.Deferred().resolve()}catch(e){return MYERROR("初始化浮动提示时出现异常",e),$.Deferred().reject()}}}},addStyle=()=>{const e=GM_getResourceText("layerCss"),t=GM_getResourceText("myCss");return GM_addStyle(e+t)},getScrollPosition=(e=window)=>({x:void 0!==e.pageXOffset?e.pageXOffset:e.scrollLeft,y:void 0!==e.pageYOffset?e.pageYOffset:e.scrollTop}),linkMsg=(e,t=e)=>'<a href="'+e+'"target="_blank" style="color:">'+t+"</a>",SP_CONFIG_DEFAULT={showEula:!0,storageLastFixVersion:"0",mainDisplay:"show",darkMode:!1,debugSwitch:!1,windowToast:!0,nosleep:!0,invisibleEnter:!1,banP2p:!1,lastShowUpdateMsgVersion:"0",DANMU_MODIFY:!1,AUTO_CHECK_DANMU:!1,blockLiveStream:!1,blockliveDataUpdate:!1,wear_medal_before_danmu:!1,wear_medal_type:"ONLY_FIRST",add_like_button:!0};let otherScriptsRunningCheck=$.Deferred(),otherScriptsRunning=!1,SP_CONFIG=GM_getValue("SP_CONFIG")||{},SEND_GIFT_NOW=!1,SEND_DANMU_NOW=!1,hideBtnClickable=!1,danmuTaskRunning=!1,medalDanmuRunning=!1,hasWornMedal=!1,danmuEmitter=new Emitter,Live_info={room_id:void 0,short_room_id:void 0,uid:void 0,ruid:void 0,gift_list:[{id:6,price:1e3},{id:1,price:100}],rnd:void 0,visit_id:void 0,bili_jct:void 0,tid:void 0,uname:void 0,user_level:void 0,level:void 0,danmu_length:void 0,medal:void 0,vipStatus:void 0},medal_info={status:$.Deferred(),medal_list:[]},mainIndex,logIndex,layerUiMain,layerLogWindow,logDiv,tabContent,JQmenuWindow,layerLogWindow_Height,layerLogWindow_ScrollHeight,layerLogWindow_ScrollTop,layerLogWindow_ScrollY,readConfigArray=[void 0],noticeJson=GM_getValue("noticeJson")||{};function init(){const MY_API={CONFIG_DEFAULT:{AUTO_DANMU:!1,AUTO_CHECK_DANMU_TIMEOUT:3e3,AUTO_GIFT:!1,AUTO_GIFT_ROOMID:["0"],AUTO_GROUP_SIGN:!0,COIN:!1,COIN_NUMBER:0,COIN_TYPE:"COIN_DYN",COIN_UID:["0"],COIN2SILVER:!1,COIN2SILVER_NUM:1,DANMU_CONTENT:["这是一条弹幕"],DANMU_ROOMID:["22474988"],DANMU_INTERVAL_TIME:["10m"],DANMU_MODIFY_REGEX:["/【/"],DANMU_MODIFY_UID:[0],DANMU_MODIFY_POOL:[4],DANMU_MODIFY_COLOR:["#f7335d"],DANMU_MODIFY_SIZE:[1.2],GIFT_LIMIT:1,GIFT_SEND_HOUR:23,GIFT_SEND_MINUTE:59,GIFT_INTERVAL:5,GIFT_METHOD:"GIFT_SEND_TIME",GIFT_SORT:"GIFT_SORT_HIGH",GIFT_ALLOW_TYPE:["1","6"],GIFT_SEND_METHOD:"GIFT_SEND_BLACK",GIFT_SEND_ROOM:["0"],GET_PRIVILEGE:!1,LIVE_SIGN:!0,LOGIN:!0,LIKE_LIVEROOM:!1,LIKE_LIVEROOM_INTERVAL:400,LIVE_TASKS_ROOM:["0"],LIVE_TASKS_METHOD:"BLACK",MEDAL_DANMU_INTERVAL:2,MEDAL_DANMU:!1,MEDAL_DANMU_CONTENT:["(⌒▽⌒)","( ̄▽ ̄)","(=・ω・=)","(`・ω・´)","(〜 ̄△ ̄)〜","(・∀・)","(°∀°)ノ","╮( ̄▽ ̄)╭","_(:3」∠)_","(^・ω・^ )","(● ̄(エ) ̄●)","ε=ε=(ノ≧∇≦)ノ","⁄(⁄ ⁄•⁄ω⁄•⁄ ⁄)⁄","←◡←"],REMOVE_ELEMENT_2233:!1,REMOVE_ELEMENT_pkBanner:!0,REMOVE_ELEMENT_rank:!0,REMOVE_ELEMENT_followSideBar:!1,REMOVE_ELEMENT_flipView:!0,REMOVE_ELEMENT_anchor:!1,REMOVE_ELEMENT_pk:!1,REMOVE_ELEMENT_playerIcon:!0,RND_DELAY_END:5,RND_DELAY_START:2,SEND_ALL_GIFT:!1,SHARE:!0,SILVER2COIN:!1,SPARE_GIFT_ROOM:"0",TIME_RELOAD:!1,TIME_RELOAD_MINUTE:120,UPDATE_TIP:!0,WATCH:!0,WatchLive:!1,WatchLiveInterval:400,WatchLiveTime:65},CACHE_DEFAULT:{AUTO_SEND_DANMU_TS:[],AUTO_GROUP_SIGH_TS:0,MainSite_login_TS:0,MainSite_watch_TS:0,MainSite_coin_TS:0,MainSite_share_TS:0,Live_sign_TS:0,Live_like_TS:0,Live_share_TS:0,Live_watch_TS:0,Live_medalDanmu_TS:0,Silver2Coin_TS:0,Coin2Sliver_TS:0,Gift_TS:0,GiftInterval_TS:0,NextVipPrivilege_TS:0},CONFIG:{},CACHE:{},init:()=>{addStyle(),SP_CONFIG.darkMode="dark"===$("html").attr("lab-style");const e=$(".tab-list.dp-flex"),t=$(".chat-history-panel").width(),i=$("#aside-area-vm").height(),n=$("#chat-control-panel-vm").height();tabContent=$(".tab-content"),logDiv=$('<li data-v-2fdbecb2="" data-v-d2be050a="" class="item dp-i-block live-skin-separate-border border-box t-center pointer live-skin-normal-text" style = \'font-weight:bold;color: #999;\' id = "logDiv"><span id="logDivText">日志</span><div class="blth_num" style="display: none;" id = \'logRedPoint\'>0</div></mli>');let o=0,a=0,r=0;([".chat-history-list",".attention-btn-ctnr",".live-player-mounter"].some((e=>0===e.length))||0===e.length||0===tabContent.length)&&window.toast("必要页面元素缺失,强制运行(可能会看不到控制面板,提示信息)","error"),e.append(logDiv),JQlogRedPoint=$("#logRedPoint");let l=[];for(let t=0;t<e.children("li").length;t++)l.push(e.children("li")[t]);logIndex=myopen({type:1,title:!1,offset:[String(a)+"px",String(r)+"px"],closeBtn:0,shade:0,zIndex:2e3,fixed:!1,area:[String(t)+"px",String(i-n)+"px"],anim:-1,isOutAnim:!1,resize:!1,content:'<div id = "menuWindow"></div>',success:()=>{layerLogWindow=$("#layui-layer1 .layui-layer-content"),JQmenuWindow=$("#menuWindow");let e=$("#logDivText");layerLogWindow.on("DOMNodeInserted",(function(){layerLogWindow_Height=$(this).height(),layerLogWindow_ScrollHeight=$(this)[0].scrollHeight,layerLogWindow_ScrollHeight>layerLogWindow_Height&&(layerLogWindow.scrollTop(layerLogWindow.prop("scrollHeight")),$(this).off("DOMNodeInserted"))})),layerLogWindow.scroll((function(){layerLogWindow_Height=$(this).height(),layerLogWindow_ScrollHeight=$(this)[0].scrollHeight,layerLogWindow_ScrollTop=$(this)[0].scrollTop,layerLogWindow_ScrollY=layerLogWindow_ScrollTop+layerLogWindow_Height+1,layerLogWindow_ScrollY<layerLogWindow_ScrollHeight?e.text("日志🚀"):e.text("日志")}))}}),layer.style(logIndex,{"box-shadow":"none",display:"none","background-color":SP_CONFIG.darkMode?"#1c1c1c":"#f2f3f5"});for(const e of l){let t=$(e);t.click((()=>{for(const i of l){let n=$(i);i!=e?("rgb(153, 153, 153)"!==n.css("color")&&n.css("color","#999"),n.hasClass("live-skin-main-text")&&n.removeClass("live-skin-main-text"),n.hasClass("active")&&n.removeClass("active"),n.hasClass("live-skin-normal-text")||n.addClass("live-skin-normal-text")):("rgb(51, 51, 51)"!==n.css("color")&&t.css("color","#333"),n.hasClass("live-skin-main-text")||t.addClass("live-skin-main-text"),n.hasClass("active")||t.addClass("active"),n.hasClass("live-skin-normal-text")&&t.removeClass("live-skin-normal-text"))}"logDiv"===t.attr("id")?(o||(o=$(".tab-content").offset(),a=o.top,r=o.left,layer.style(logIndex,{top:String(a)+"px",left:String(r)+"px"})),layer.style(logIndex,{display:"block"})):layer.style(logIndex,{display:"none"})}))}let s=$.Deferred(),_=$.Deferred(),d=$.Deferred();try{BAPI.setCommonArgs(Live_info.bili_jct),s.resolve()}catch(e){MYERROR("设置token错误",e),s.reject()}try{MY_API.loadConfig().then((()=>{MY_API.chatLog("脚本载入配置成功","success"),_.resolve()}))}catch(e){MYERROR("API初始化出错",e),MY_API.chatLog("API初始化出错","error"),_.reject()}try{MY_API.loadCache().then((()=>{window.toast("CACHE载入成功","success"),d.resolve()}))}catch(e){MYERROR("CACHE初始化出错",e),window.toast("CACHE初始化出错","error"),d.reject()}return $.when(s,_,d)},loadConfig:()=>{let e=$.Deferred();try{MY_API.CONFIG=GM_getValue("CONFIG")||{},mergeObject(MY_API.CONFIG,MY_API.CONFIG_DEFAULT),e.resolve()}catch(t){MYDEBUG("API载入配置失败,加载默认配置",t),MY_API.setDefaults(),e.reject()}return e},loadCache:()=>{let e=$.Deferred();try{MY_API.CACHE=GM_getValue("CACHE")||{},mergeObject(MY_API.CACHE,MY_API.CACHE_DEFAULT),e.resolve()}catch(t){MYDEBUG("CACHE载入配置失败,加载默认配置",t),MY_API.setDefaults(),e.reject()}return e},newMessage:e=>{try{if(-1===versionStringCompare(SP_CONFIG.lastShowUpdateMsgVersion||"0",e)){const t=["修复【检查弹幕是否发送成功】和【弹幕修改】不生效的 Bug。","【直播区任务】中的粉丝勋章相关任务(点赞直播间,连续观看直播,粉丝勋章打卡弹幕)统一采用黑白名单机制。","自动保存设置:在控制面板上的文本框中输入内容后脚本会自动保存设置。","减缓了【自动投币】的速度,降低被风控的可能。"];myopen({title:`${e}更新提示`,area:[String(.382*$(window).width())+"px",String(.618*$(window).height())+"px"],content:`\n <h2>更新内容</h2>\n <mol>${function(e){if(0===e.length)return"无";let t="";for(const i of e)t=t+"<mli>"+i+"</mli>";return t}(t)}</mol>\n <h2>通知</h2>\n <mol>经过慎重考虑,我决定将脚本中所有和抽奖有关的功能删除,请各位谅解。日后会将工作重心放到其他功能上。\n 在被封了两个QQ群后我决定建一个QQ频道${linkMsg("https://qun.qq.com/qqweb/qunpro/share?_wv=3&_wwv=128&appChannel=share&inviteCode=1W7eVLs&businessType=9&from=181074&biz=ka&shareSource=5","(点我加入)")},\n 也可以加入非官方电报群:${linkMsg("https://t.me/LaTiao01","LaTiao01")}。\n </mol>\n <hr><em style="color:grey;">\n 如果在使用过程中遇到问题,请到 ${linkMsg("https://github.com/andywang425/BLTH/issues","github")}反馈。\n 也欢迎加入${linkMsg("https://qun.qq.com/qqweb/qunpro/share?_wv=3&_wwv=128&appChannel=share&inviteCode=1W7eVLs&businessType=9&from=181074&biz=ka&shareSource=5","官方QQ频道")}(聊天、反馈问题、提出建议)和${linkMsg("https://t.me/LaTiao01","非官方电报群")}(纯聊天)。\n </em>\n `}),SP_CONFIG.lastShowUpdateMsgVersion=e,saveSpConfig()}}catch(e){MYDEBUG("提示信息CACHE载入失败",e)}},saveConfig:(e=!0)=>{try{return GM_setValue("CONFIG",MY_API.CONFIG),e&&window.toast("配置已保存,部分设置需刷新后才能生效","info"),MYDEBUG("MY_API.CONFIG",MY_API.CONFIG),!0}catch(e){return MYDEBUG("API保存出错",e),!1}},saveCache:(e=!0)=>{try{return GM_setValue("CACHE",MY_API.CACHE),e&&MYDEBUG("CACHE已保存",MY_API.CACHE),!0}catch(e){return MYDEBUG("CACHE保存出错",e),!1}},setDefaults:()=>{MY_API.CONFIG=MY_API.CONFIG_DEFAULT,MY_API.CACHE=MY_API.CACHE_DEFAULT,MY_API.saveConfig(),MY_API.saveCache(),mymsg("配置和缓存已重置为默认,请刷新页面使配置生效。",{icon:1})},resetCache:()=>{MY_API.CACHE=MY_API.CACHE_DEFAULT,MY_API.saveCache(),mymsg("缓存已重置为默认,请刷新页面使配置生效。",{icon:1})},resetMainSiteTasksCache:()=>{MY_API.CACHE.MainSite_login_TS=0,MY_API.CACHE.MainSite_watch_TS=0,MY_API.CACHE.MainSite_coin_TS=0,MY_API.CACHE.MainSite_share_TS=0,MY_API.saveCache(),mymsg("主站每日任务缓存已重置为默认,请刷新页面使配置生效。",{icon:1})},resetLiveTasksCache:()=>{MY_API.CACHE.Live_sign_TS=0,MY_API.CACHE.Live_like_TS=0,MY_API.CACHE.Live_share_TS=0,MY_API.CACHE.Live_watch_TS=0,MY_API.CACHE.Live_medalDanmu_TS=0,MY_API.saveCache(),mymsg("直播任务缓存已重置为默认,请刷新页面使配置生效。",{icon:1})},resetOtherTasksCache:()=>{MY_API.CACHE.Silver2Coin_TS=0,MY_API.CACHE.Coin2Sliver_TS=0,MY_API.CACHE.AUTO_GROUP_SIGH_TS=0,MY_API.saveCache(),mymsg("其它任务缓存已重置为默认,请刷新页面使配置生效。",{icon:1})},removeUnnecessary:()=>{const unnecessaryObj=[{settingName:"REMOVE_ELEMENT_2233",rmJQpath:["#my-dear-haruna-vm"]},{settingName:"REMOVE_ELEMENT_pkBanner",rmJQpath:[".chaos-pk-banner"]},{settingName:"REMOVE_ELEMENT_rank",rmJQpath:[".activity-gather-entry",".activity-rank",".rank-item"]},{settingName:"REMOVE_ELEMENT_followSideBar",rmJQpath:['div[data-upgrade-intro="Follow"]',".side-bar-popup-cntr.ts-dot-4"]},{settingName:"REMOVE_ELEMENT_flipView",rmJQpath:[".flip-view"]},{settingName:"REMOVE_ELEMENT_anchor",addCss:".anchor-lottery-entry * {display: none;} #anchor-guest-box-id * {display: none;}",eval:'setInterval(() => {$("iframe").contents().find("#app .close-btn").click()}, 200)'},{settingName:"REMOVE_ELEMENT_pk",addCss:".process-box * {display: none;} #chaos-pk-vm * {display:none;}",eval:'setInterval(() => {$("iframe").contents().find("#app .closeBtn").click()}, 200)'},{settingName:"REMOVE_ELEMENT_playerIcon",rmJQpath:[".web-player-icon-roomStatus"]}],removeElement=obj=>{if(MY_API.CONFIG[obj.settingName]){if(obj.hasOwnProperty("rmJQpath"))for(const e of obj.rmJQpath){let t=setInterval((()=>{const i=$(e);i.length>0&&(i.remove(),clearInterval(t))}),200)}obj.hasOwnProperty("addCss")&&GM_addStyle(obj.addCss),obj.hasOwnProperty("eval")&&eval(obj.eval)}};for(const e of unnecessaryObj)removeElement(e)},buyFanMedal:e=>BAPI.live_user.get_anchor_in_room(e).then((function(t){if(MYDEBUG("API.live_user.get_anchor_in_room response",t),0===t.code&&t.data.info){const i=String(t.data.info.uid),n=t.data.info.uname;return BAPI.xlive.getInfoByUser(e).then((function(o){return 0!==o.code?mymsg(`检查房间出错 ${t.message}`,{time:2500}):o.data.medal.up_medal?void myconfirm(`<div style = "text-align:center">是否消耗2B币购买UP主<br>${linkMsg("https://space.bilibili.com/"+i,n)}<br>的粉丝勋章?</div>`,{title:`购买勋章 房间号:${e}`,btn:["是","否"]},(function(){BAPI.x.elec_pay_quick(t.data.info.uid).then((e=>{MYDEBUG("API.x.elec_pay_quick re",e),0===e.code&&4===e.data.status?mymsg("购买成功",{time:2e3,icon:1}):mymsg(`购买失败 ${e.data.msg}`,{time:2500,icon:2})}))}),(function(){mymsg("已取消购买",{time:2e3})})):mymsg(`<div style = "text-align:center">UP主<br>${linkMsg("https://space.bilibili.com/"+i,n)}<br>没有粉丝勋章,无法购买</div>`,{time:2500,icon:2})}))}0===t.code&&void 0===t.data.info?mymsg("房间不存在",{time:2500}):mymsg(`检查房间出错 ${t.message}`,{time:2500})})),creatSetBox:async()=>{const e="hide"===SP_CONFIG.mainDisplay?"显示控制面板":"隐藏控制面板",t=$(`<button class="blth_btn" style="display: inline-block; float: left; margin-right: 7px;cursor: pointer;box-shadow: 1px 1px 2px #00000075;" id="hiderbtn">${e}<br></button>`),i=$("body"),n=$("html"),o=GM_getResourceText("main");const a=["AUTO_DANMU","AUTO_GIFT","AUTO_GROUP_SIGN","COIN","COIN2SILVER","GET_PRIVILEGE","WatchLive","LIVE_SIGN","LOGIN","MEDAL_DANMU","REMOVE_ELEMENT_2233","REMOVE_ELEMENT_anchor","REMOVE_ELEMENT_flipView","REMOVE_ELEMENT_followSideBar","REMOVE_ELEMENT_pk","REMOVE_ELEMENT_pkBanner","REMOVE_ELEMENT_playerIcon","REMOVE_ELEMENT_rank","SEND_ALL_GIFT","SHARE","SILVER2COIN","TIME_RELOAD","UPDATE_TIP","WATCH","LIKE_LIVEROOM"],r=[{name:"COIN_TYPE",toggle1:"COIN_DYN",toggle2:"COIN_UID"},{name:"GIFT_METHOD",toggle1:"GIFT_INTERVAL",toggle2:"GIFT_SEND_TIME"},{name:"GIFT_SORT",toggle1:"GIFT_SORT_HIGH",toggle2:"GIFT_SORT_LOW"},{name:"LIVE_TASKS_METHOD",toggle1:"LIVE_TASKS_WHITE",toggle2:"LIVE_TASKS_BLACK"},{name:"GIFT_SEND_METHOD",toggle1:"GIFT_SEND_WHITE",toggle2:"GIFT_SEND_BLACK"}],l={GIFT_SEND_METHOD:"自动送礼策略,有白名单和黑名单两种。后文中的<code>直播间</code>指拥有粉丝勋章的直播间。<mul><mli>白名单:仅给房间列表内的直播间送礼。</mli><mli>黑名单:给房间列表以外的直播间送礼。</mli><mli>如果要填写多个房间,每两个房间号之间需用半角逗号<code>,</code>隔开。</mli></mul>",MEDAL_DANMU:"在拥有粉丝勋章的直播间内,每天发送的首条弹幕将点亮对应勋章并给该勋章+100亲密度。<mh3>注意:</mh3><mul><mli>如果要填写多条弹幕,每条弹幕间请用半角逗号<code>,</code>隔开,发弹幕时将依次选取弹幕进行发送(若弹幕数量不足则循环选取)。</mli><mli>本功能运行时【自动发弹幕】和【自动送礼】将暂停运行。</mli></mul>",AUTO_DANMU:"发送直播间弹幕。<mh3>注意:</mh3><mul><mli>本功能运行时【粉丝勋章打卡弹幕】将暂停运行。</mli><mli><mp>弹幕内容,房间号,发送时间可填多个,数据之间用半角逗号<code>,</code>隔开(数组格式)。脚本会按顺序将这三个值一一对应,发送弹幕。</mp></mli><mli><mp>由于B站服务器限制,每秒最多只能发1条弹幕。若在某一时刻有多条弹幕需要发送,脚本会在每条弹幕间加上1.5秒间隔时间(对在特定时间点发送的弹幕无效)。</mp></mli><mli><mp>如果数据没对齐,缺失的数据会自动向前对齐。如填写<code>弹幕内容 lalala</code>,<code>房间号 3,4</code>,<code>发送时间 5m,10:30</code>,少填一个弹幕内容。那么在发送第二条弹幕时,第二条弹幕的弹幕内容会自动向前对齐(即第二条弹幕的弹幕内容是lalala)。</mp></mli><mli><mp>可以用默认值所填的房间号来测试本功能,但是请不要一直发。</mp></mli><mli><mp>发送时间有两种填写方法</mp><mp>1.【小时】h【分钟】m【秒】s</mp><mul><mli>每隔一段时间发送一条弹幕</mli><mli>例子:<code>1h2m3s</code>, <code>300m</code>, <code>30s</code>, <code>1h50s</code>, <code>2m6s</code>, <code>0.5h</code></mli><mli>可以填小数</mli><mli>可以只填写其中一项或两项</mli></mul><mp>脚本会根据输入数据计算出间隔时间,每隔一个间隔时间就会发送一条弹幕。如果不加单位,如填写<code>10</code>则默认单位是分钟(等同于<code>10m</code>)。</mp><mp><em>注意:必须按顺序填小时,分钟,秒,否则会出错(如<code>3s5h</code>就是错误的写法)</em></mp><mp>2.【小时】:【分钟】:【秒】</mp><mul><mli>在特定时间点(本地时间)发一条弹幕</mli><mli>例子: <code>10:30:10</code>, <code>0:40</code></mli><mli>只能填整数</mli><mli>小时分钟必须填写,秒数可以不填</mli></mul><mp>脚本会在该时间点发一条弹幕(如<code>13:30:10</code>就是在下午1点30分10秒的时候发弹幕)。</mp></mli></mul>",NOSLEEP:"屏蔽B站的挂机检测。不开启本功能时,标签页后台或长时间无操作就会触发B站的挂机检测。<mh3>原理:</mh3><mul><mli>劫持页面上的<code>addEventListener</code>绕过页面可见性检测,每5分钟触发一次鼠标移动事件规避鼠标移动检测。同时劫持页面上的setTimeout和setInterval避免暂停直播的函数被调用。</mli><mul>",INVISIBLE_ENTER:"开启后进任意直播间其他人都不会看到你进直播间的提示【xxx 进入直播间】(只有你自己能看到)。<mh3>缺点:</mh3><mul><mli>开启后无法获取自己是否是当前直播间房管的数据,关注按钮状态均为未关注。所以开启本功能后进任意直播间都会有【禁言】按钮(如果不是房管操作后会显示你没有权限),发弹幕时弹幕旁边会有房管标识(如果不是房管则只有你能看到此标识)。</mli><mli>无法打开页面下拉后出现的动态的评论区。</mli></mul>",BUY_MEDAL:"通过给UP充电,消耗2B币购买某位UP的粉丝勋章。<mul><mli>默认值为当前房间号。点击购买按钮后有确认界面,无需担心误触。</mli></mul>",btnArea:"缓存中存放的是各个任务上次运行的时间,脚本通过缓存来判断某些周期性执行的任务需不需要执行(比如每天一次的分享视频任务)。<mul><mli>重置所有为默认:指将设置和缓存重置为默认。</mli><mli>导出配置:导出一个包含当前脚本设置的json到浏览器的默认下载路径,文件名为<code>BLTH_CONFIG.json</code>。</mli><mli>导入配置:从一个json文件导入脚本配置,导入成功后脚本会自动刷新页面使配置生效。</mli></mul>",WatchLive:"通过模拟心跳完成连续观看直播的任务(无论目标房间是否开播都能完成任务)。<mul><mli>本任务运行时不会自动刷新页面。</mli><mli>如果你使用了带有广告拦截功能的浏览器拓展,可能会导致该功能无法使用。请自行将以下两个URL(或者合适的拦截规则)添加到拓展程序的白名单中:<br><code>https://live-trace.bilibili.com/xlive/data-interface/v1/x25Kn/E</code><br><code>https://live-trace.bilibili.com/xlive/data-interface/v1/x25Kn/X</code></mli><mli>如果主播没有设置直播分区,该任务无法完成。</mli></mul>",SEND_ALL_GIFT:"若不勾选该项,自动送礼只会送出在【允许被送出的礼物类型】中的礼物。",AUTO_GIFT_ROOMID:"送礼时优先给这些房间送礼,送到对应粉丝牌亲密度上限后再送其它的。<mul><mli>如果要填写多个房间,每两个房间号之间需用半角逗号<code>,</code>隔开。如<code>666,777,888</code>。</mli></mul>",GIFT_LIMIT:"将要在这个时间段里过期的礼物会被送出。<mh3>注意:</mh3><mul><mli>勾选【无视礼物类型和到期时间限制】时无论礼物是否将要过期都会被送出。</mli></mul>",AUTO_GIFT:"<mh3>说明:</mh3><mul><mli>送礼设置优先级:<br>不送礼房间 >优先送礼房间 >优先高/低等级粉丝牌。</mli><mli>送礼设置逻辑规则:<br>无论【优先高/低等级粉丝牌】如何设置,会根据【无视礼物类型和到期时间限制】(勾选则无视是否到期补满亲密度,否则只送到期的)条件去按优先送礼房间先后顺序送礼。之后根据【优先高/低等级粉丝牌】决定先送高级还是低级。 </mli><mli>送礼顺序:<br>高亲密度的礼物会被优先送出,在满足此条件的情况下先送快要过期的礼物。 </mli><mli>不会送出永久礼物。 </mli></mul>",SPARE_GIFT_ROOM:"【剩余礼物】指送满了所有粉丝牌,但仍有剩余的将在1天内过期的礼物。<mul><mli>该项填<code>0</code>则不送剩余礼物。</mli></mul>",COIN:"自动给视频投币,每天最多投5个。<mul><mli>脚本会根据今日你已获得的投币经验值判断你已经投了多少个币,然后自动投剩余没投的币。<blockquote>如今日已获得投币经验20,脚本投币数量设置为4,则会投2个币。</blockquote></mli></mul>",COIN_UID:"该项若填<code>0</code>则给动态中的视频依次投币(不存在UID为0的用户)。<mul><mli>可以填写多个uid,每两个uid间用半角逗号<code>,</code>隔开。</mli><mli>如果填了多个uid,则会依次检查这些UP是否有可投币的视频。</mli></mul>",LIVE_TASKS_METHOD:"执行以下三个任务(点赞直播间,连续观看直播,粉丝勋章打卡弹幕)的任务模式,有白名单和黑名单两种。后文中的<code>直播间</code>指拥有粉丝勋章的直播间。<mul><mli>白名单:仅在房间列表内的直播间执行任务。</mli><mli>黑名单:在房间列表以外的直播间执行任务。</mli><mli>若要填写多个直播间,每两个直播间号之间用半角逗号<code>,</code>隔开。</mli></mul>",debugSwitch:"开启或关闭控制台日志(Chrome可通过<code>ctrl + shift + i</code>,再点击<code>Console</code>打开控制台)。<mul><mli>平时建议关闭,减少资源占用。</mli><mli>该设置只会影响日志(<code>console.log</code>),不会影响报错(<code>console.error</code>)。</mli></mul>",UPDATE_TIP:"每次更新后第一次运行脚本时显示关于更新内容的弹窗。",MEDAL_DANMU_INTERVAL:"每两条弹幕间所等待的时间。<mh3>注意:</mh3><mul><mli>由于B站服务器限制,间隔时间必须大于等于1秒,否则弹幕发送会出错。</mli></mul>",SHARE:"并不会真的分享视频,通过调用特定api直接完成任务。",COIN2SILVER:"普通用户每天兑换上限<code>25</code>硬币,老爷或大会员每天兑换上限<code>50</code>硬币。<mul><mli><code>1</code>硬币 = <code>450</code>银瓜子(老爷或大会员<code>500</code>银瓜子)。</mli></mul>",SILVER2COIN:"每日直播用户都可以将部分银瓜子转化为硬币,每天仅一次机会。<mul><mli><code>700</code>银瓜子 = <code>1</code>硬币。</mul></mli>",windowToast:'右上角的提示信息。相对来说不是那么重要,所以不放在日志窗口里。<mul style = "line-height:1em;"><div class="link-toast info fixed"><span class="toast-text">普通消息</span></div><br><br><br><div class="link-toast success fixed"><span class="toast-text">成功</span></div><br><br><br><div class="link-toast error fixed"><span class="toast-text">发生错误</span></div></mul>',GIFT_ALLOW_TYPE:"可以填写礼物的id或者礼物名称。<mul><mli>如果要填写多个,每两项之间请用半角逗号<code>,</code>隔开。</mli><mli>如果填写礼物名称,请确保所填写的名称与官方名称完全一致,否则将无法识别。</mli><mli>在脚本中打开控制台日志后,在控制台(Chrome可通过<code>ctrl + shift + i</code>,再点击<code>Console</code>打开控制台)中搜索<code>InitData: API.gift.gift_config</code>可以找到一个包含礼物名称和 id 的json。将data下的几项全部展开,再搜索礼物名即可找到 id 。</mli><mli>常用 id :1: <code>辣条</code> 6: <code>亿圆</code></mli></mul>",REMOVE_ELEMENT_anchor:"屏蔽天选时刻弹窗和礼物栏左侧的图标。<mh3>注意:</mh3><mul><mli>开启这一功能后会消耗相对较多的资源。</mli><mli>弹窗出现后(不可见)0-200ms的时间内浏览器窗口会无法滚动。</mli></mul><mh3>原理:</mh3><mul>通过修改css样式使弹窗不显示。但弹窗出现时浏览器窗口会被限制滚动,脚本检测到之后会将其关闭来解除滚动限制。</mul>",REMOVE_ELEMENT_anchor:"屏蔽天选时刻弹窗和礼物栏左侧的图标。<mh3>注意:</mh3><mul><mli>开启这一功能后会消耗相对较多的资源。</mli><mli>弹窗出现后(不可见)0-200ms的时间内浏览器窗口会无法滚动。</mli></mul><mh3>原理:</mh3><mul>通过修改css样式使弹窗不显示。但弹窗出现时浏览器窗口会被限制滚动,脚本检测到之后会将其关闭来解除滚动限制。</mul>",REMOVE_ELEMENT_pk:"屏蔽大乱斗弹窗和进度条。<mh3>注意:</mh3><mul><mli>开启这一功能后会消耗相对较多的资源。</mli><mli>弹窗出现后(不可见)0-200ms的时间内浏览器窗口会无法滚动。</mli></mul><mh3>原理:</mh3><mul>通过修改css样式使弹窗不显示。但弹窗出现时浏览器窗口会被限制滚动,脚本检测到之后会将其关闭来解除滚动限制。</mul>",banP2p:"禁止p2p上传(下载),减少上行带宽的占用。<mh3>原理:</mh3><mul>删除window下部分WebRTC方法,如<code>RTCPeerConnection</code>,<code>RTCDataChannel</code>。</mul><h3>说明:</h3><mul><mli>B站的<a href = 'https://baike.baidu.com/item/%E5%AF%B9%E7%AD%89%E7%BD%91%E7%BB%9C/5482934' target = '_blank'>P2P</a>上传速率大概在600KB/s左右,目的是为了让其他用户能更加流畅地观看直播。如果你的上行带宽较小建议禁用。</mli><mli>开启后控制台可能会出现大量报错如<code style='color:red;'>unsupported bilibili p2p</code>,<code style='color:red;'>Error: launch bili_p2p failed</code>,此类报错均为b站js的报错,无视即可。</mli></mul>",DANMU_MODIFY:"修改匹配到的当前直播间弹幕,改变弹幕的显示方式。<mh3>注意:</mh3><mul><mli>匹配弹幕和修改弹幕中的所有设置项都支持填写多个数据。若要填写多个,请用半角逗号<code>,</code>隔开。例:正则表达式 <code>/团【/,/P【/</code>。 </mli><mli>若填写了多个数据,脚本会把这些数据一一匹配,创建不同的规则。缺失的数据会自动向前对齐。<br>例:脚本设置为 匹配弹幕:<code>/团【/,/P【/</code> 发送者UID:<code>0</code> 弹幕池:<code>4,5</code> 颜色:<code>#FF0000,#9932CC</code> 大小:<code>1.2</code><br>此时有这么一条弹幕:<code>P【这个塔的伤害好高啊</code>,满足了第二条匹配规则<code>/P【/</code>。但由于该规则中缺少【大小】数据,则自动向前对齐,即大小被设为<code>1.2</code>。</mli></mli></mul><mh3>匹配弹幕</mh3>有【正则表达式】和【发送者UID】两种匹配方式,任意一项匹配成功则对弹幕进行修改。<mul><mli>正则表达式:即<a href='https://www.runoob.com/js/js-regexp.html' target='_blank'>JavaScript正则表达式</a>。格式为<code>/【正则】/【修饰符】(可选)</code>,如<code>/cards/i</code>。<br>如果填写的正则表达式能匹配弹幕内容则对弹幕进行修改。 </mli><mli>发送者UID:如果填写的UID中包含弹幕发送者的UID则对弹幕进行修改。</mli></mul><mh3>修改弹幕</mh3><mul><mli>弹幕池:修改弹幕所在的弹幕池,可以改变弹幕的显示位置。<br>弹幕池编号:<code>1</code>滚动,<code>4</code>底部,<code>5</code>顶部。如果填写其他数字则不会显示。</mli><mli>颜色:修改弹幕的颜色。<br>需填写所要修改颜色的<a href='http://tools.jb51.net/color/rgb_hex_color' target='_blank'>十六进制颜色码</a>,如<code style='color:#FF0000;'>#FF0000</code>。</mli><mli>大小:缩放弹幕到指定大小。<br>填<code>1.5</code>就是放大到原来的1.5倍,填<code>0.5</code>则是缩小到一半。</mli></mul>",blockLiveStream:'拦截直播流。开启本功能后将无法观看直播。<mh3>原理:</mh3><mul>劫持页面上的fetch,通过判断url是否含有<code>bilivideo</code>拦截所有直播流请求。</mul><mh3>注意:</mh3><mul><mli>开启本功能后控制台中会出现大量报错,如<code style=\'color:red;\'>id 38: player core NetworkError, {"code":11001,"errInfo":{"url":"https://d1--cn-gotcha204.bilivideo.com/live-bvc/284219/live_50333369_2753084_4000/index.m3u8?expires=1618677399&len=0&oi=1700331273&pt=web&qn=0&trid=9cc4c8772c0543999b03360f513dd1fa&sigparams=cdn,expires,len,oi,pt,qn,trid&cdn=cn-gotcha04&sign=bd05d848ebf2c7a815e0242ac1477187&p2p_type=1&src=9&sl=4&sk=59b4112a8c653bb","info":"TypeError: Cannot read property \'then\' of undefined"}}</code>,此类报错均为b站js的报错,无视即可。</mli></mul>',blockliveDataUpdate:"拦截直播观看数据上报。<mh3>原理:</mh3><mul>劫持页面上的fetch和XMLHttpRequest,拦截所有url中含有<code>data.bilibili.com/gol/postweb</code>的fetch请求和url中含有<code>data.bilibili.com/log</code>的xhr请求。</mul><mh3>注意:</mh3><mul><mli>开启本功能后控制台中会出现大量警告,如<code style='color:rgb(255 131 0);'>jQuexry.Deferred exception: Cannot read property 'status' of undefined TypeError: Cannot read property 'status' of undefined</code>,此类报错均为b站js的报错,无视即可。 </mli></mul><mh3>说明:</mh3><mul><mli>根据观察,目前上报的数据有:p2p种类,直播画质,直播流编码方式,直播流地址,直播流名称,直播流协议,窗口大小,观看时长,请求花费时长, 请求成功/失败数量,通过p2p下载的有效直播流大小,通过p2p上传的直播流大小,当前直播间地址,当前时间戳等等。 </mli></mul>",WEAR_MEDAL_BEFORE_DANMU:"手动发送弹幕前自动佩戴当前房间的粉丝勋章再发弹幕。<mul><mli>如果没有当前直播间的粉丝勋章则不进行任何操作。</mli><mli>【一直自动佩戴】比较适合需要同时在多个直播间发弹幕的情况。如果只想在某一个直播间发弹幕勾选【仅在首次发弹幕时自动佩戴】即可。</mli><mli>佩戴成功后会把弹幕框左侧的粉丝牌替换为当前直播间的粉丝牌。</mli></mul>",REMOVE_ELEMENT_followSideBar:"开启本功能后会导致【实验室】按钮点击后无法出现弹窗。",REMOVE_ELEMENT_pkBanner:"移除位于直播画面上方的大乱斗入口。",REMOVE_ELEMENT_rank:"移除位于直播画面上方的排行榜(?)入口。<mul><mli>这个位置有时候会变成某个活动的入口。如果你不是主播也不是喜欢给主播送礼物的观众,那么这些活动通常和你没关系。</mli></mul>",GET_PRIVILEGE:"每个月领取一次大会员权益。<mul><mli>目前仅支持领取B币券和会员购优惠券。</mli></mul>",AUTO_CHECK_DANMU:"检查你在当前直播间发送的弹幕是否发送成功。脚本向其它直播间发送的弹幕不在检测范围内。<mul><mli>这里的发送成功指的是你发送的弹幕对其他人可见。有时候表面上弹幕发送成功了,但实际上只有你自己能看见那条弹幕。</mli><mli>若弹幕疑似发送失败,则在右上角显示一条提示信息。</mli></mul>",AUTO_CHECK_DANMU_TIMEOUT:"弹幕被发送出去后开始计时,如果没有在超时时间内从当前直播间的webSocket中接收到之前所发送的弹幕则认为发送失败。",LIKE_LIVEROOM:"完成点赞直播间1次的任务",LIKE_LIVEROOM_INTERVAL:"每两次点赞之间的间隔时间。<mul><mli>若间隔时间过短,部分点赞可能会无效,即不加亲密度。请自行调整到一个合适的间隔时间。</mli></mul>",WatchLiveInterval:"每两次心跳的间隔时间。<mul><mli>脚本会依次给每个粉丝勋章对应的直播间发心跳包,然后重复数次直到观看时间达标为止。</mli><mli>若间隔时间过短可能会出错。</mli></mul>",DailyTasksBtnArea:"缓存中存放的是各个任务上次运行的时间,脚本通过缓存来判断某些周期性执行的任务需不需要执行(比如每天一次的分享视频任务)。<mul><mli>重置缓存并刷新页面可以让脚本再次执行今天已经执行过的任务。</mli></mul>",add_like_button:"在直播画面上方,分享按钮左侧添加一个点赞按钮。<mul><mli>该按钮被按下后只会触发一次点赞事件(可用来完成点赞任务),不会发送点赞弹幕。如果想发送点赞弹幕请使用B站的原生功能。</mli></mul>",WatchLiveTime:`观看直播时长。单位分钟,必须填写整数。<mul><mli>每观看五分钟可获得100亲密度。如果完成了点赞和发弹幕任务,观看65分钟即可挂满亲密度。请根据自身情况调整观看时间。</mli><mli>具体规则请查阅B站官方公告${linkMsg("https://link.bilibili.com/p/eden/news#/newsdetail?id=2886")}。</mli></mul>`};(()=>{let e=$(".live-player-mounter").offset(),t=$(".live-player-mounter").height();mainIndex=myopen({type:1,title:!1,offset:[String(e.top-getScrollPosition().y)+"px",String(e.left-getScrollPosition().x)+"px"],closeBtn:0,shade:0,zIndex:1e3,fixed:!1,area:[,String(t)+"px"],resize:!1,content:o,success:()=>{let e=$("#allsettings");layerUiMain=e.parent().parent(),e.find('div[data-toggle="WatchLiveTime"] .num').val(MY_API.CONFIG.WatchLiveTime),e.find('div[data-toggle="WatchLiveInterval"] .num').val(MY_API.CONFIG.WatchLiveInterval),e.find('div[data-toggle="LIKE_LIVEROOM_INTERVAL"] .num').val(MY_API.CONFIG.LIKE_LIVEROOM_INTERVAL),e.find('div[data-toggle="AUTO_CHECK_DANMU_TIMEOUT"] .num').val(MY_API.CONFIG.AUTO_CHECK_DANMU_TIMEOUT),e.find('div[data-toggle="DANMU_MODIFY_SIZE"] .str').val(MY_API.CONFIG.DANMU_MODIFY_SIZE.toString()),e.find('div[data-toggle="DANMU_MODIFY_COLOR"] .str').val(MY_API.CONFIG.DANMU_MODIFY_COLOR.toString()),e.find('div[data-toggle="DANMU_MODIFY_POOL"] .str').val(MY_API.CONFIG.DANMU_MODIFY_POOL.toString()),e.find('div[data-toggle="DANMU_MODIFY_REGEX"] .str').val(MY_API.CONFIG.DANMU_MODIFY_REGEX.toString()),e.find('div[data-toggle="DANMU_MODIFY_UID"] .str').val(MY_API.CONFIG.DANMU_MODIFY_UID.toString()),e.find('div[data-toggle="GIFT_ALLOW_TYPE"] .str').val(MY_API.CONFIG.GIFT_ALLOW_TYPE.toString()),e.find('div[data-toggle="COIN2SILVER"] .coin_number').val(parseInt(MY_API.CONFIG.COIN2SILVER_NUM).toString()),e.find('div[data-toggle="MEDAL_DANMU_INTERVAL"] .num').val(parseFloat(MY_API.CONFIG.MEDAL_DANMU_INTERVAL).toString()),e.find('div[data-toggle="AUTO_DANMU_SETTINGS"] .Time').val(MY_API.CONFIG.DANMU_INTERVAL_TIME.toString()),e.find('div[data-toggle="AUTO_DANMU_SETTINGS"] .Roomid').val(MY_API.CONFIG.DANMU_ROOMID.toString()),e.find('div[data-toggle="AUTO_DANMU_SETTINGS"] .Danmu').val(MY_API.CONFIG.DANMU_CONTENT.toString()),e.find('div[data-toggle="GIFT_INTERVAL"] .num').val(parseInt(MY_API.CONFIG.GIFT_INTERVAL).toString()),e.find('div[data-toggle="SPARE_GIFT_ROOM"] .num').val(MY_API.CONFIG.SPARE_GIFT_ROOM.toString()),e.find('div[data-toggle="TIME_RELOAD"] .delay-seconds').val(parseInt(MY_API.CONFIG.TIME_RELOAD_MINUTE).toString()),e.find('div[data-toggle="COIN"] .coin_number').val(parseInt(MY_API.CONFIG.COIN_NUMBER).toString()),e.find('div[data-toggle="COIN_UID"] .num').val(MY_API.CONFIG.COIN_UID.toString()),e.find('div[data-toggle="AUTO_GIFT_ROOMID"] .num').val(MY_API.CONFIG.AUTO_GIFT_ROOMID.toString()),e.find('div[data-toggle="GIFT_SEND_TIME"] .Hour').val(MY_API.CONFIG.GIFT_SEND_HOUR.toString()),e.find('div[data-toggle="GIFT_SEND_TIME"] .Minute').val(MY_API.CONFIG.GIFT_SEND_MINUTE.toString()),e.find('div[data-toggle="GIFT_LIMIT"] .num').val(parseInt(MY_API.CONFIG.GIFT_LIMIT).toString()),e.find('div[data-toggle="BUY_MEDAL"] .num').val(Live_info.room_id);const t=$("#BLTH_config_file");t.on("change",importConfig),e[0].onselectstart=function(){return!1},e.find(".blth_input").bind("input",debounce((()=>(e=>{let t,i,n,o,a;if(t=parseInt(e.find('div[data-toggle="TIME_RELOAD"] .delay-seconds').val()),t<=0||t>1e4)return window.toast("[直播间重载时间]数据小于等于0或大于10000","caution");if(MY_API.CONFIG.TIME_RELOAD_MINUTE=t,t=parseInt(e.find('div[data-toggle="COIN"] .coin_number').val()),t<0||t>5)return window.toast("[自动投币]数据小于0或大于5","caution");MY_API.CONFIG.COIN_NUMBER=t,t=e.find('div[data-toggle="AUTO_GIFT_ROOMID"] .num').val(),i=t.split(",");for(let e=0;e<i.length;e++)""===i[e]&&(i[e]=22474988);if(MY_API.CONFIG.AUTO_GIFT_ROOMID=i,t=parseInt(e.find('div[data-toggle="GIFT_LIMIT"] .num').val()),MY_API.CONFIG.GIFT_LIMIT=t,t=parseInt(e.find('div[data-toggle="GIFT_INTERVAL"] .num').val()),MY_API.CONFIG.GIFT_INTERVAL=t,n=parseInt(e.find('div[data-toggle="GIFT_SEND_TIME"] .Hour').val()),o=parseInt(e.find('div[data-toggle="GIFT_SEND_TIME"] .Minute').val()),n<0||o<0||n>=24||o>=60)return window.toast("[送礼时间]时间错误","caution");MY_API.CONFIG.GIFT_SEND_HOUR=n,MY_API.CONFIG.GIFT_SEND_MINUTE=o,t=e.find('div[data-toggle="SPARE_GIFT_ROOM"] .num').val(),MY_API.CONFIG.SPARE_GIFT_ROOM=t,t=e.find('div[data-toggle="COIN_UID"] .num').val(),i=t.split(",");for(let e=0;e<i.length;e++)""===i[e]&&(i[e]=0);MY_API.CONFIG.COIN_UID=i,n=e.find('div[data-toggle="AUTO_DANMU_SETTINGS"] .Danmu').val(),i=n.split(",");for(let e=0;e<i.length;e++)""===i[e]&&(i[e]="这是一条弹幕");n=i,o=e.find('div[data-toggle="AUTO_DANMU_SETTINGS"] .Roomid').val(),i=o.split(",");for(let e=0;e<i.length;e++)""===i[e]&&(i[e]="22474988");o=i,a=e.find('div[data-toggle="AUTO_DANMU_SETTINGS"] .Time').val(),i=a.split(",");for(let e=0;e<i.length;e++)""===i[e]&&(i[e]="10m");if(a=i,MY_API.CONFIG.DANMU_CONTENT=n,MY_API.CONFIG.DANMU_ROOMID=o,MY_API.CONFIG.DANMU_INTERVAL_TIME=a,t=parseFloat(e.find('[data-toggle="MEDAL_DANMU_INTERVAL"] .num').val()),isNaN(t)||t<0)return window.toast("[打卡弹幕发送间隔] 错误输入","caution");if(MY_API.CONFIG.MEDAL_DANMU_INTERVAL=t,t=parseInt(e.find('[data-toggle="COIN2SILVER"] .coin_number').val()),isNaN(t)||t<0)return window.toast("[硬币换银瓜子] 错误输入","caution");MY_API.CONFIG.COIN2SILVER_NUM=t,t=e.find('[data-toggle="GIFT_ALLOW_TYPE"] .str').val(),i=t.split(",");for(let e=0;e<i.length;e++)""===i[e]&&(i[e]="0");MY_API.CONFIG.GIFT_ALLOW_TYPE=i,t=e.find('div[data-toggle="DANMU_MODIFY_REGEX"] .str').val(),i=t.split(",");for(let e=0;e<i.length;e++)""===i[e]?i[e]=1:i[e]=i[e];MY_API.CONFIG.DANMU_MODIFY_REGEX=i,t=e.find('div[data-toggle="DANMU_MODIFY_UID"] .str').val(),i=t.split(",");for(let e=0;e<i.length;e++)""===i[e]?i[e]=0:i[e]=parseInt(i[e]);MY_API.CONFIG.DANMU_MODIFY_UID=i,t=e.find('div[data-toggle="DANMU_MODIFY_POOL"] .str').val(),i=t.split(",");for(let e=0;e<i.length;e++)""===i[e]?i[e]=1:i[e]=parseInt(i[e]);MY_API.CONFIG.DANMU_MODIFY_POOL=i,t=e.find('div[data-toggle="DANMU_MODIFY_COLOR"] .str').val(),i=t.split(",");for(let e=0;e<i.length;e++)""===i[e]&&(i[e]="#FF000");MY_API.CONFIG.DANMU_MODIFY_COLOR=i,t=e.find('div[data-toggle="DANMU_MODIFY_SIZE"] .str').val(),i=t.split(",");for(let e=0;e<i.length;e++)""===i[e]?i[e]=1:i[e]=parseFloat(i[e]);return MY_API.CONFIG.DANMU_MODIFY_SIZE=i,t=parseInt(e.find('[data-toggle="AUTO_CHECK_DANMU_TIMEOUT"] .num').val()),isNaN(t)||t<=0?window.toast("[检查弹幕是否发送成功超时时间] 错误输入","caution"):(MY_API.CONFIG.AUTO_CHECK_DANMU_TIMEOUT=t,t=parseInt(e.find('[data-toggle="LIKE_LIVEROOM_INTERVAL"] .num').val()),isNaN(t)||t<0?window.toast("[直播点赞请求间隔] 错误输入","caution"):(MY_API.CONFIG.LIKE_LIVEROOM_INTERVAL=t,t=parseInt(e.find('[data-toggle="WatchLiveInterval"] .num').val()),isNaN(t)||t<0?window.toast("[观看直播心跳请求间隔] 错误输入","caution"):(MY_API.CONFIG.WatchLiveInterval=t,t=parseInt(e.find('[data-toggle="WatchLiveTime"] .num').val()),isNaN(t)||t<0?window.toast("[观看直播心跳请求间隔] 错误输入","caution"):(MY_API.CONFIG.WatchLiveTime=t,MY_API.saveConfig()))))})(e)),1e3)),e.find('button[data-action="exportConfig"]').click((()=>{exportConfig(MY_API.CONFIG,SP_CONFIG),mymsg("配置已导出",{time:2500})})),e.find('button[data-action="importConfig"]').click((()=>{readConfigArray[1]=$.Deferred(),t.click(),readConfigArray[1].then((()=>{let e=readConfigArray[0];MYDEBUG("readConfigArray 文件读取结果:",readConfigArray[0]),MY_API.CONFIG=e.MY_API_CONFIG,MY_API.saveConfig(!1),SP_CONFIG=e.SP_CONFIG,saveSpConfig(),mymsg("配置导入成功,3秒后将自动刷新页面",{time:3e3,icon:1}),setTimeout((()=>{W.location.reload()}),3e3)}))})),e.find('div[data-toggle="BUY_MEDAL"] [data-action="buy_medal"]').click((function(){const t=parseInt(e.find('div[data-toggle="BUY_MEDAL"] .num').val());MY_API.buyFanMedal(t)})),e.find('button[data-action="reset"]').click((()=>{const e=myconfirm('<div style = "text-align:center">是否重置所有设置及缓存为默认?</div>',{title:"重置所有为默认",btn:["是","否"]},(function(){layer.close(e),MY_API.setDefaults()}),(function(){mymsg("已取消",{time:2e3})}))})),e.find('button[data-action="resetCache"]').click((()=>{const e=myconfirm('<div style = "text-align:center">是否重置缓存为默认?</div>',{title:"重置缓存",btn:["是","否"]},(function(){layer.close(e),MY_API.resetCache()}),(function(){mymsg("已取消",{time:2e3})}))})),e.find('button[data-action="resetMainSiteTasksCache"]').click((()=>{const e=myconfirm('<div style = "text-align:center">是否重置主站每日任务缓存为默认?</div>',{title:"重置缓存",btn:["是","否"]},(function(){layer.close(e),MY_API.resetMainSiteTasksCache()}),(function(){mymsg("已取消",{time:2e3})}))})),e.find('button[data-action="resetLiveTasksCache"]').click((()=>{const e=myconfirm('<div style = "text-align:center">是否重置直播区任务缓存为默认?</div>',{title:"重置缓存",btn:["是","否"]},(function(){layer.close(e),MY_API.resetLiveTasksCache()}),(function(){mymsg("已取消",{time:2e3})}))})),e.find('button[data-action="resetOtherTasksCache"]').click((()=>{const e=myconfirm('<div style = "text-align:center">是否重置其它任务缓存为默认?</div>',{title:"重置缓存",btn:["是","否"]},(function(){layer.close(e),MY_API.resetOtherTasksCache()}),(function(){mymsg("已取消",{time:2e3})}))})),e.find('button[data-action="about"]').click((()=>{myopen({title:`版本${GM_info.script.version}`,content:`<h3 style="text-align:center">B站直播间挂机助手</h3>作者:${linkMsg("https://github.com/andywang425/","andywang425")}<br>许可证:${linkMsg("https://raw.githubusercontent.com/andywang425/BLTH/master/LICENSE","MIT")}<br>github项目地址:${linkMsg("https://github.com/andywang425/BLTH","BLTH")}<br>反馈:${linkMsg("https://github.com/andywang425/BLTH/issues","BLTH/issues")}<br>交流qq群:${linkMsg("https://jq.qq.com/?_wv=1027&k=9refOc8c","657763329")}<br>`})})),e.find('button[data-action="edit_liveTasksRoomList"]').click((()=>{myprompt({formType:2,value:String(MY_API.CONFIG.LIVE_TASKS_ROOM),maxlength:Number.MAX_SAFE_INTEGER,title:"请输入直播区任务房间列表",btn:["保存","取消"]},(function(e,t){let i=e.split(",");i=[...new Set(i)];for(let e=0;e<i.length;e++)i[e]||i.splice(e,1);MY_API.CONFIG.LIVE_TASKS_ROOM=[...i],MY_API.saveConfig(!1),mymsg("直播区任务房间列表保存成功",{time:2500,icon:1}),layer.close(t)}))})),e.find('button[data-action="edit_GIFT_SEND_ROOM"]').click((()=>{myprompt({formType:2,value:String(MY_API.CONFIG.GIFT_SEND_ROOM),maxlength:Number.MAX_SAFE_INTEGER,title:"请输入自动送礼房间列表",btn:["保存","取消"]},(function(e,t){let i=e.split(",");i=[...new Set(i)];for(let e=0;e<i.length;e++)i[e]||i.splice(e,1);MY_API.CONFIG.GIFT_SEND_ROOM=[...i],MY_API.saveConfig(!1),mymsg("自动送礼房间列表保存成功",{time:2500,icon:1}),layer.close(t)}))})),e.find('button[data-action="edit_medalDanmu"]').click((()=>{myprompt({formType:2,value:String(MY_API.CONFIG.MEDAL_DANMU_CONTENT),maxlength:Number.MAX_SAFE_INTEGER,title:"请输入粉丝勋章打卡弹幕",btn:["保存","取消"]},(function(e,t){let i=e.split(",");for(let e=0;e<i.length;e++)i[e]||i.splice(e,1);MY_API.CONFIG.MEDAL_DANMU_CONTENT=[...i],MY_API.saveConfig(!1),mymsg("粉丝勋章打卡弹幕保存成功",{time:2500,icon:1}),layer.close(t)}))})),e.find('button[data-action="sendGiftNow"]').click((()=>{MY_API.CONFIG.AUTO_GIFT?(SEND_GIFT_NOW=!0,MY_API.Gift.run()):window.toast("[ 立刻开始送礼 ] 请先勾选【自动送礼】再点击此按钮","info")})),e.find('button[data-action="sendDanmuNow"]').click((()=>{MY_API.CONFIG.AUTO_DANMU?(SEND_DANMU_NOW=!0,MY_API.AUTO_DANMU.run()):window.toast("[ 立刻发送弹幕 ] 请先勾选【自动发弹幕】再点击此按钮","info")})),e.find('button[data-action="clearDanmuCache"]').click((()=>{MY_API.CACHE.AUTO_SEND_DANMU_TS=[],MY_API.saveCache()&&MY_API.chatLog("清除弹幕缓存成功","success")}));for(const t of a){const i=e.find(`div[data-toggle="${t}"] input:checkbox`);MY_API.CONFIG[t]&&i.prop("checked",!0),i.change((function(){MY_API.CONFIG[t]=$(this).prop("checked"),i.each((function(){this.checked=MY_API.CONFIG[t]})),MY_API.saveConfig()}))}const i=[{jqPath1:'div[data-toggle="INVISIBLE_ENTER"] input:checkbox',gmItem:"invisibleEnter",toastMsg:["[隐身入场] 配置已保存","info"]},{jqPath1:'div[data-toggle="NOSLEEP"] input:checkbox',gmItem:"nosleep",toastMsg:["[屏蔽挂机检测] 配置已保存","info"]},{jqPath1:'div[data-toggle="banP2p"] input:checkbox',gmItem:"banP2p",toastMsg:["[禁止p2p上传] 配置已保存","info"]},{jqPath1:'div[data-toggle="debugSwitch"] input:checkbox',gmItem:"debugSwitch",toastMsg:["[控制台日志] 配置已保存","info"],changeFn:function(e){SP_CONFIG.debugSwitch=$(e).prop("checked")}},{jqPath1:'div[data-toggle="windowToast"] input:checkbox',gmItem:"windowToast",changeFn:function(e){SP_CONFIG.windowToast=$(e).prop("checked"),SP_CONFIG.windowToast?$(".link-toast").show():$(".link-toast").hide()}},{jqPath1:'div[data-toggle="DANMU_MODIFY"] input:checkbox',gmItem:"DANMU_MODIFY",toastMsg:["[弹幕修改] 配置已保存","info"]},{jqPath1:'div[data-toggle="blockLiveStream"] input:checkbox',gmItem:"blockLiveStream",toastMsg:["[拦截直播流] 配置已保存","info"]},{jqPath1:'div[data-toggle="blockliveDataUpdate"] input:checkbox',gmItem:"blockliveDataUpdate",toastMsg:["[拦截直播观看数据上报] 配置已保存","info"]},{jqPath1:'div[data-toggle="WEAR_MEDAL_BEFORE_DANMU"] input:checkbox',gmItem:"wear_medal_before_danmu",toastMsg:["[自动佩戴勋章] 配置已保存","info"]},{jqPath1:'div[data-toggle="ONLY_FIRST"] input:radio',jqPath2:'div[data-toggle="ALWAYS"] input:radio',changeFn:function(e,t){$(e).is(":checked")&&(SP_CONFIG[t]=$(e).parent().attr("data-toggle"))},name:"WEAR_MEDAL_BEFORE_DANMU",gmItem:"wear_medal_type",toastMsg:["[自动佩戴勋章] 配置已保存","info"]},{jqPath1:'div[data-toggle="AUTO_CHECK_DANMU"] input:checkbox',gmItem:"AUTO_CHECK_DANMU",toastMsg:["[检测弹幕是否发送成功] 配置已保存","info"]},{jqPath1:'div[data-toggle="add_like_button"] input:checkbox',gmItem:"add_like_button",toastMsg:["[添加点赞按钮] 配置已保存","info"]}];for(const t of i){let i,n=!!t.hasOwnProperty("name");for(let o=1;;o++){const a="jqPath"+String(o);if(!t.hasOwnProperty(a))break;i=e.find(t[a]);const r=SP_CONFIG[t.gmItem];if(n){if(r===t[a].match(/data\-toggle="(.*)"/)[1]){$(t[a]).attr("checked","");break}}else r&&i.attr("checked","")}n&&(i=$(`input:radio[name= ${t.name} ]`)),i.change((function(){let e=this;t.hasOwnProperty("changeFn")&&(n?t.changeFn(e,t.gmItem):t.changeFn(e)),n||(SP_CONFIG[t.gmItem]=$(e).prop("checked")),saveSpConfig(),t.hasOwnProperty("toastMsg")&&window.toast(t.toastMsg[0],t.toastMsg[1])}))}for(const e of r){for(let t=1;;t++){const i="toggle"+String(t);if(!e.hasOwnProperty(i))break;if(MY_API.CONFIG[e.name]===e[i]){$(`div[data-toggle= ${e[i]}] input:radio`).attr("checked","");break}}$(`input:radio[name= ${e.name} ]`).change((function(){for(let t=1;;t++){const i="toggle"+String(t);if(!e.hasOwnProperty(i))break;if($(`div[data-toggle= ${e[i]} ] input:radio`).is(":checked")){MY_API.CONFIG[e.name]=e[i],MY_API.saveConfig();break}}}))}$(".helpText").click((function(){const e=$(this).attr("helpdata");void 0!==e&&l.hasOwnProperty(e)&&myopen({title:`帮助信息 ${e}`,anim:5,area:[String(.382*$(window).width())+"px",String(.618*$(window).height())+"px"],content:l[e]})})),hideBtnClickable=!0},end:()=>{SP_CONFIG.mainDisplay="hide",saveSpConfig(),document.getElementById("hiderbtn").innerHTML="显示控制面板"}})})();let s=!1;"hide"===SP_CONFIG.mainDisplay&&(layerUiMain.hide(),s=!0),SP_CONFIG.darkMode?layer.style(mainIndex,{"background-color":"#1c1c1c",color:"#a2a7ae"}):layer.style(mainIndex,{"background-color":"white",color:"black"});let _=$(".follow-ctnr");function d(){hideBtnClickable&&(hideBtnClickable=!1,setTimeout((function(){hideBtnClickable=!0}),310),"show"===SP_CONFIG.mainDisplay?(SP_CONFIG.mainDisplay="hide",saveSpConfig(!1),animChange(layerUiMain,!0),document.getElementById("hiderbtn").innerHTML="显示控制面板",setTimeout((()=>layer.style(mainIndex,{zIndex:0})),300)):(SP_CONFIG.mainDisplay="show",layer.style(mainIndex,{zIndex:1e3}),saveSpConfig(!1),s?(layerUiMain.show(),s=!1):animChange(layerUiMain,!1),document.getElementById("hiderbtn").innerHTML="隐藏控制面板"))}_[0].insertBefore(t[0],_.children()[0]),t.click(d),hotkeys("alt+b",d),new MutationObserver((function(){let e=i.attr("class"),t=tabContent.offset(),n=t.top,o=t.left;/[player\-full\-win]|[fullscreen\-fix]/.test(e)&&"show"===SP_CONFIG.mainDisplay&&(SP_CONFIG.mainDisplay="hide",saveSpConfig(!1),animChange(layerUiMain,!0),document.getElementById("hiderbtn").innerHTML="显示控制面板",setTimeout((()=>layer.style(mainIndex,{zIndex:0})),300)),layer.style(logIndex,{top:String(n)+"px",left:String(o)+"px"})})).observe(i[0],{attributes:!0}),new MutationObserver((function(){"dark"===n.attr("lab-style")?(SP_CONFIG.darkMode=!0,layer.style(logIndex,{"background-color":"#1c1c1c"}),layer.style(mainIndex,{"background-color":"#1c1c1c",color:"#a2a7ae"})):(SP_CONFIG.darkMode=!1,layer.style(logIndex,{"background-color":"#f2f3f5"}),layer.style(mainIndex,{"background-color":"white",color:"black"}))})).observe(n[0],{attributes:!0}),MY_API.CACHE.MainSite_login_TS||(mytips("点我隐藏/显示控制面板","#hiderbtn",{tips:1}),setTimeout((()=>mytips("点我查看日志","#logDivText")),5e3))},chatLog:function(e,t="info"){let i=$("<div class='chatLogDiv'>"),n=$("<div class='chatLogMsg'>"),o=new Date;switch(n.html(e),i.text(o.toLocaleString()),i.append(n),t){case"warning":i.addClass("chatLogWarning");break;case"success":i.addClass("chatLogSuccess");break;case"error":i.addClass("chatLogError");break;case"prize":i.addClass("chatLogWinPrize");break;default:i.addClass("chatLogDefault")}JQmenuWindow.append(i),layerLogWindow_ScrollY>=layerLogWindow_ScrollHeight&&layerLogWindow.scrollTop(layerLogWindow.prop("scrollHeight"))},GroupSign:{fullLevalMedalUidList:[],getGroups:()=>BAPI.Group.my_groups().then((e=>(MYDEBUG("GroupSign.getGroups: API.Group.my_groups",e),0===e.code?$.Deferred().resolve(e.data.list):(window.toast(`[自动应援团签到]获取应援团列表失败 ${e.msg}`,"error"),delayCall((()=>MY_API.GroupSign.getGroups())))))),signInList:(e,t=0)=>{if(t>=e.length)return $.Deferred().resolve();const i=e[t];return i.owner_uid==Live_info.uid||MY_API.GroupSign.fullLevalMedalUidList==Live_info.uid?MY_API.GroupSign.signInList(e,t+1):BAPI.Group.sign_in(i.group_id,i.owner_uid).then((n=>{MYDEBUG("GroupSign.signInList: API.Group.sign_in",n);let o=$.Deferred();return 0!==n.code?(window.toast(`[自动应援团签到] 应援团(group_id=${i.group_id},owner_uid=${i.owner_uid})签到失败 ${n.msg}`,"caution"),o.reject(),delayCall((()=>MY_API.GroupSign.signInList(e,t)))):(n.data.add_num>0?(MYDEBUG(`[自动应援团签到] 应援团(group_id=${i.group_id},owner_uid=${i.owner_uid})签到成功,当前勋章亲密度+${n.data.add_num}`),o.resolve()):0==n.data.add_num?(window.toast(`[自动应援团签到]应援团(group_id=${i.group_id},owner_uid=${i.owner_uid})已签到`,"caution"),o.resolve()):o.reject(),$.when(MY_API.GroupSign.signInList(e,t+1),o))}))},run:()=>{try{return!MY_API.CONFIG.AUTO_GROUP_SIGN||otherScriptsRunning?$.Deferred().resolve():checkNewDay(MY_API.CACHE.AUTO_GROUP_SIGH_TS)?getCHSdate().getHours()<8&&0!==MY_API.CACHE.AUTO_GROUP_SIGH_TS?(runToday((()=>MY_API.GroupSign.run()),8,1,"应援团签到"),$.Deferred().resolve()):(window.toast("[应援团签到] 开始签到","info"),MY_API.GroupSign.getGroups().then((e=>{for(const e of medal_info.medal_list)20!==e.medal_level&&40!==e.medal_level||MY_API.GroupSign.fullLevalMedalUidList.push(e.target_id);return MY_API.GroupSign.signInList(e).then((()=>(window.toast("[应援团签到] 今日签到已完成","success"),MY_API.CACHE.AUTO_GROUP_SIGH_TS=ts_ms(),MY_API.saveCache(),runTomorrow((()=>MY_API.GroupSign.run()),8,1,"应援团签到"),$.Deferred().resolve())))}))):(runTomorrow((()=>MY_API.GroupSign.run()),8,1,"应援团签到"),$.Deferred().resolve())}catch(e){return window.toast("[自动应援团签到]运行时出现异常,已停止","error"),MYERROR("自动应援团签到出错",e),$.Deferred().reject()}}},DailyReward:{coin_exp:0,login:()=>MY_API.CONFIG.LOGIN?checkNewDay(MY_API.CACHE.MainSite_login_TS)?BAPI.DailyReward.login().then((e=>{if(MYDEBUG("DailyReward.login: API.DailyReward.login"),0!==e.code)return window.toast(`[自动每日奖励][每日登录]失败 ${e.message}`,"error"),delayCall((()=>MY_API.DailyReward.login()));window.toast("[自动每日奖励][每日登录]完成","success"),MY_API.CACHE.MainSite_login_TS=ts_ms(),MY_API.saveCache(),runMidnight((()=>MY_API.DailyReward.login()),"主站任务 - 登录")})):(runMidnight((()=>MY_API.DailyReward.login()),"主站任务 - 登录"),$.Deferred().resolve()):$.Deferred().resolve(),watch:(e,t)=>MY_API.CONFIG.WATCH&&checkNewDay(MY_API.CACHE.MainSite_watch_TS)?BAPI.DailyReward.watch(e,t,Live_info.uid,ts_s()).then((i=>{if(MYDEBUG("DailyReward.watch: API.DailyReward.watch",i),0!==i.code)return window.toast(`[自动每日奖励][每日观看]失败 aid=${e}, cid=${t} ${i.msg}`,"error"),delayCall((()=>MY_API.DailyReward.watch(e,t)));window.toast(`[自动每日奖励][每日观看]完成(av=${e})`,"success"),MY_API.CACHE.MainSite_watch_TS=ts_ms(),MY_API.saveCache()})):$.Deferred().resolve(),coin:(e,t,i=0,n=!1)=>{if(!MY_API.CONFIG.COIN)return $.Deferred().resolve();if(!checkNewDay(MY_API.CACHE.MainSite_coin_TS))return $.Deferred().resolve();if(MY_API.DailyReward.coin_exp>=10*MY_API.CONFIG.COIN_NUMBER)return window.toast("[自动每日奖励][每日投币]今日投币已完成","info"),MY_API.CACHE.MainSite_coin_TS=ts_ms(),MY_API.saveCache(),$.Deferred().resolve();if(i>=e.length)return window.toast("[自动每日奖励][每日投币]动态里可投币的视频不足","caution"),$.Deferred().resolve();const o=JSON.parse(e[i].card);let a=Math.min(2,t);return n&&(a=1),BAPI.x.getCoinInfo("","jsonp",o.aid,ts_ms()).then((async r=>0===r.code?(await sleep(500),2===r.data.multiply?(MYDEBUG("API.x.getCoinInfo",`已投币两个 aid = ${o.aid}`),MY_API.DailyReward.coin(vlist,t,i+1)):(1===r.data.multiply&&(a=1),BAPI.DailyReward.coin(o.aid,a).then((r=>(MYDEBUG("DailyReward.coin: API.DailyReward.coin",r),0===r.code?(MY_API.DailyReward.coin_exp+=10*a,window.toast(`[自动每日奖励][每日投币]投币成功(av=${o.aid},num=${a})`,"success"),MY_API.DailyReward.coin(e,t-a,i+1)):-110===r.code?(window.toast("[自动每日奖励][每日投币]未绑定手机,已停止","error"),$.Deferred().reject()):34003===r.code?n?MY_API.DailyReward.coin(e,t,i+1):MY_API.DailyReward.coin(e,t,i,!0):34005===r.code?MY_API.DailyReward.coin(e,t,i+1):-104===r.code?(window.toast("[自动每日奖励][每日投币]剩余硬币不足,已停止","warning"),$.Deferred().reject()):(window.toast(`[自动每日奖励][每日投币]出错 ${r.msg}`,"error"),delayCall((()=>MY_API.DailyReward.coin(e,t,i))))))))):(window.toast(`[自动每日奖励][每日投币]获取视频(aid=${o.aid})投币状态出错 ${response.msg}`,"error"),delayCall((()=>MY_API.DailyReward.coin(e,t,i))))))},coin_uid:(e,t,i,n,o=0,a=!1)=>{if(!MY_API.CONFIG.COIN)return $.Deferred().resolve();if(MY_API.DailyReward.coin_exp>=10*MY_API.CONFIG.COIN_NUMBER)return window.toast("[自动每日奖励][每日投币]今日投币已完成","info"),MY_API.CACHE.MainSite_coin_TS=ts_ms(),MY_API.saveCache(),$.Deferred().resolve();if(o>=e.length)return MY_API.DailyReward.UserSpace(n,30,0,i+1,"","pubdate","jsonp");const r=e[o],l=MY_API.CONFIG.COIN_UID[n];if(r.hasOwnProperty("is_union_video")&&1===r.is_union_video&&r.mid!=l)return MYDEBUG("DailyReward.coin_uid",`联合投稿且UP不是指定UID用户 aid = ${r.aid}`),MY_API.DailyReward.coin_uid(e,t,i,n,o+1);let s=Math.min(2,t);return a&&(s=1),BAPI.x.getCoinInfo("","jsonp",r.aid,ts_ms()).then((async l=>0===l.code?(await sleep(500),2===l.data.multiply?(MYDEBUG("API.x.getCoinInfo",`已投币两个 aid = ${r.aid}`),MY_API.DailyReward.coin_uid(e,t,i,n,o+1)):(1===l.data.multiply&&(s=1),BAPI.DailyReward.coin(r.aid,s).then((l=>(MYDEBUG("DailyReward.coin_uid: API.DailyReward.coin_uid",l),0===l.code?(MY_API.DailyReward.coin_exp+=10*s,window.toast(`[自动每日奖励][每日投币]投币成功(av=${r.aid},num=${s})`,"success"),MY_API.DailyReward.coin_uid(e,t-s,i,n,o+1)):-110===l.code?(window.toast("[自动每日奖励][每日投币]未绑定手机,已停止","error"),$.Deferred().reject()):34003===l.code?a?MY_API.DailyReward.coin_uid(e,t,i,n,o+1):MY_API.DailyReward.coin_uid(e,t,o,i,n,!0):34005===l.code?MY_API.DailyReward.coin_uid(e,t,i,n,o+1):-104===l.code?(window.toast("[自动每日奖励][每日投币]剩余硬币不足,已停止","warning"),$.Deferred().reject()):(window.toast(`[自动每日奖励][每日投币] 出错 ${l.msg}`,"caution"),delayCall((()=>MY_API.DailyReward.coin_uid(e,t,i,n,o))))))))):(window.toast(`[自动每日奖励][每日投币]获取视频(aid=${r.aid})投币状态出错 ${response.msg}`,"error"),delayCall((()=>MY_API.DailyReward.coin(cards,t,o))))))},share:e=>MY_API.CONFIG.SHARE&&checkNewDay(MY_API.CACHE.MainSite_share_TS)?BAPI.DailyReward.share(e).then((t=>{if(MYDEBUG("DailyReward.share: API.DailyReward.share",t),0===t.code)window.toast(`[自动每日奖励][每日分享]分享成功(av=${e})`,"success");else{if(71e3!==t.code)return window.toast(`[自动每日奖励][每日分享] 出错 ${t.msg}`,"caution"),delayCall((()=>MY_API.DailyReward.share(e)));window.toast("[自动每日奖励][每日分享]今日分享已完成","info")}MY_API.CACHE.MainSite_share_TS=ts_ms(),MY_API.saveCache()})):$.Deferred().resolve(),dynamic:async()=>{if(!MY_API.CONFIG.COIN&&!MY_API.CONFIG.WATCH&&!MY_API.CONFIG.SHARE)return $.Deferred().resolve();if((!MY_API.CONFIG.WATCH||MY_API.CONFIG.WATCH&&!checkNewDay(MY_API.CACHE.MainSite_watch_TS))&&(!MY_API.CONFIG.SHARE||MY_API.CONFIG.SHARE&&!checkNewDay(MY_API.CACHE.MainSite_share_TS))&&(!MY_API.CONFIG.COIN||MY_API.CONFIG.COIN&&!checkNewDay(MY_API.CACHE.MainSite_coin_TS)))return runMidnight((()=>MY_API.DailyReward.dynamic()),`主站任务 - ${MY_API.CONFIG.WATCH?"观看视频":""} ${MY_API.CONFIG.SHARE?"分享视频":""} ${MY_API.CONFIG.COIN?"投币":""}`);MY_API.DailyReward.coin_exp=await BAPI.DailyReward.exp().then((e=>(MYDEBUG("DailyReward.run: API.DailyReward.exp",e),0===e.code?e.number:(window.toast(`[自动每日奖励] 获取今日已获得的投币经验出错 ${e.message}`,"caution"),delayCall((()=>MY_API.DailyReward.run()))))));const e=MY_API.CONFIG.COIN_NUMBER-MY_API.DailyReward.coin_exp/10,t=await BAPI.getuserinfo().then((t=>{if(MYDEBUG("DailyReward.dynamic: API.getuserinfo",t),"REPONSE_OK"===t.code)return t.data.biliCoin<e?t.data.biliCoin:e;window.toast(`[自动每日奖励][每日投币] 获取用户信息失败 ${response.message}`,"error")}));return t<e&&window.toast(`[自动每日奖励][每日投币]剩余硬币不足,仅能投${t}个币`,"warning"),BAPI.dynamic_svr.dynamic_new(Live_info.uid,8).then((e=>{if(MYDEBUG("DailyReward.dynamic: API.dynamic_svr.dynamic_new",e),0!==e.code)return window.toast(`[自动每日奖励]获取"动态-投稿视频"失败 ${e.msg}`,"caution"),delayCall((()=>MY_API.DailyReward.dynamic()));if(e.data.cards){const i=JSON.parse(e.data.cards[0].card),n=MY_API.DailyReward.watch(i.aid,i.cid);let o;o=0==MY_API.CONFIG.COIN_UID||"COIN_DYN"==MY_API.CONFIG.COIN_TYPE?MY_API.DailyReward.coin(e.data.cards,Math.max(t,0)):MY_API.DailyReward.UserSpace(0,30,0,1,"","pubdate","jsonp");const a=MY_API.DailyReward.share(i.aid);return $.when(n,o,a).then((()=>runMidnight((()=>MY_API.DailyReward.dynamic()),`主站任务 - ${MY_API.CONFIG.WATCH?"观看视频":""} ${MY_API.CONFIG.SHARE?"分享视频":""} ${MY_API.CONFIG.COIN?"投币":""}`)))}window.toast('[自动每日奖励]"动态-投稿视频"中暂无动态',"info")}))},UserSpace:(e,t,i,n,o,a,r)=>checkNewDay(MY_API.CACHE.MainSite_coin_TS)?BAPI.x.getUserSpace(MY_API.CONFIG.COIN_UID[e],t,i,n,o,a,r).then((l=>{if(MYDEBUG("DailyReward.UserSpace: API.dynamic_svr.UserSpace",l),0!==l.code)return window.toast(`[自动每日奖励]获取UID = ${MY_API.CONFIG.COIN_UID[e]}的"空间-投稿视频"失败 ${l.msg}`,"caution"),delayCall((()=>MY_API.DailyReward.UserSpace(uid,t,i,n,o,a,r)));if(l.data.list.vlist){const t=MY_API.CONFIG.COIN_NUMBER-MY_API.DailyReward.coin_exp/10;return MY_API.DailyReward.coin_uid(l.data.list.vlist,Math.max(t,0),n,e)}if(e<MY_API.CONFIG.COIN_UID.length-1){const t=MY_API.CONFIG.COIN_NUMBER-MY_API.DailyReward.coin_exp/10;return MY_API.DailyReward.coin_uid(l.data.list.vlist,Math.max(t,0),n,e+1)}window.toast(`[自动每日奖励]"UID = ${String(MY_API.CONFIG.COIN_UID)}的空间-投稿视频"中暂无视频`,"info")})):$.Deferred().resolve(),run:()=>{if(!MY_API.CONFIG.LOGIN&&!MY_API.CONFIG.COIN&&!MY_API.CONFIG.WATCH&&!MY_API.CONFIG.SHARE||otherScriptsRunning)return $.Deferred().resolve();MY_API.DailyReward.login(),MY_API.DailyReward.dynamic()}},LiveReward:{dailySignIn:()=>MY_API.CONFIG.LIVE_SIGN?checkNewDay(MY_API.CACHE.Live_sign_TS)?BAPI.xlive.dosign().then((e=>{if(MYDEBUG("LiveReward.dailySignIn: API.xlive.dosign",e),0===e.code)window.toast("[自动直播签到]完成","success"),$(".hinter").remove(),$(".checkin-btn").remove();else{if(1011040!==e.code)return window.toast(`[自动直播签到]失败 ${e.message},尝试点击签到按钮`,"caution"),$(".checkin-btn").click(),delayCall((()=>MY_API.LiveReward.dailySignIn()));window.toast("[自动直播签到]今日直播签到已完成","info")}MY_API.CACHE.Live_sign_TS=ts_ms(),MY_API.saveCache(),runMidnight((()=>MY_API.LiveReward.dailySignIn()),"直播区 - 直播签到")})):runMidnight((()=>MY_API.LiveReward.dailySignIn()),"直播区 - 直播签到"):$.Deferred().resolve(),likeLiveRoom:async e=>{if(!MY_API.CONFIG.LIKE_LIVEROOM)return $.Deferred().resolve();if(!checkNewDay(MY_API.CACHE.Live_like_TS))return runMidnight((()=>MY_API.LiveReward.likeLiveRoom()),"直播区 - 点赞");window.toast("[点赞直播间] 开始点赞直播间","info");for(let t=0;t<1;t++)for(const t of e)await BAPI.xlive.likeInteract(t.real_roomid).then((e=>{MYDEBUG(`API.xlive.likeInteract(${t.real_roomid}) response`,e),0!==e.code&&window.toast(`[点赞直播间] 直播间${t.real_roomid}点赞失败 ${e.message}`,"caution")})),await sleep(MY_API.CONFIG.LIKE_LIVEROOM_INTERVAL);window.toast("[点赞直播间] 今日点赞完成","success"),MY_API.CACHE.Live_like_TS=ts_ms(),MY_API.saveCache(),runMidnight((()=>MY_API.LiveReward.likeLiveRoom()),"直播区 - 点赞")},WatchLive:async e=>{if(!MY_API.CONFIG.WatchLive)return $.Deferred().resolve();if(!checkNewDay(MY_API.CACHE.Live_watch_TS))return runMidnight((()=>MY_API.LiveReward.WatchLive()),"直播区 - 观看直播");window.toast("[观看直播] 开始模拟观看直播","info");let t=$.Deferred();for(let i=0;i<e.length;i++){const n=e[i];let o=new RoomHeart(n.real_roomid,MY_API.CONFIG.WatchLiveTime);await o.start(),i===e.length-1&&(o.doneFunc=()=>{window.toast("[观看直播] 今日观看任务已完成","success"),t.resolve()}),await sleep(MY_API.CONFIG.WatchLiveInterval)}await t,MY_API.CACHE.Live_watch_TS=ts_ms(),MY_API.saveCache(),runMidnight((()=>MY_API.LiveReward.WatchLive()),"直播区 - 观看直播")},run:()=>{if(!MY_API.CONFIG.LIVE_SIGN&&!MY_API.CONFIG.WatchLive&&!MY_API.CONFIG.LIKE_LIVEROOM||otherScriptsRunning)return $.Deferred().resolve();let e;if("resolved"!==medal_info.status.state())return window.toast("[观看直播] [点赞直播间] 粉丝勋章列表未被完全获取,暂停运行","error"),medal_info.status.then((()=>{MY_API.LiveReward.WatchLive(),MY_API.LiveReward.likeLiveRoom()}));e="LIVE_TASKS_WHITE"===MY_API.CONFIG.LIVE_TASKS_METHOD?medal_info.medal_list.filter((e=>MY_API.CONFIG.LIVE_TASKS_ROOM.findIndex((t=>t==e.roomid))>-1&&e.roomid&&e.level<20)):medal_info.medal_list.filter((e=>-1===MY_API.CONFIG.LIVE_TASKS_ROOM.findIndex((t=>t==e.roomid))&&e.roomid&&e.level<20)),MY_API.LiveReward.dailySignIn(),MY_API.LiveReward.WatchLive(e),MY_API.LiveReward.likeLiveRoom(e)}},Exchange:{coin2silver:e=>BAPI.xlive.revenue.coin2silver(e).then((t=>{if(MYDEBUG("Exchange.coin2silver: API.Exchange.coin2silver",t),0!==t.code)return window.toast(`[银瓜子换硬币] 失败 ${t.message}`,"caution"),delayCall((()=>MY_API.Exchange.coin2silver(e)));window.toast(`[硬币换银瓜子] ${t.message},获得${t.data.silver}银瓜子`,"success")})),silver2coin:()=>BAPI.xlive.revenue.silver2coin().then((e=>{if(MYDEBUG("Exchange.silver2coin: API.Exchange.silver2coin",e),0===e.code)window.toast(`[银瓜子换硬币] ${e.message}`,"success");else{if(403!==e.code)return window.toast(`[银瓜子换硬币] 失败 ${e.message}`,"caution"),delayCall((()=>MY_API.Exchange.silver2coin()));window.toast(`[银瓜子换硬币] ${e.message}`,"info")}})),runC2S:()=>!MY_API.CONFIG.COIN2SILVER||otherScriptsRunning?$.Deferred().resolve():checkNewDay(MY_API.CACHE.Coin2Sliver_TS)?MY_API.Exchange.coin2silver(MY_API.CONFIG.COIN2SILVER_NUM).then((()=>{MY_API.CACHE.Coin2Sliver_TS=ts_ms(),MY_API.saveCache(),runMidnight((()=>MY_API.Exchange.runC2S()),"硬币换瓜子")}),(()=>delayCall((()=>MY_API.Exchange.runC2S())))):(runMidnight((()=>MY_API.Exchange.runC2S()),"硬币换瓜子"),$.Deferred().resolve()),runS2C:()=>{try{return!MY_API.CONFIG.SILVER2COIN||otherScriptsRunning?$.Deferred().resolve():checkNewDay(MY_API.CACHE.Silver2Coin_TS)?MY_API.Exchange.silver2coin().then((()=>{MY_API.CACHE.Silver2Coin_TS=ts_ms(),MY_API.saveCache(),runMidnight((()=>MY_API.Exchange.runS2C()),"瓜子换硬币")}),(()=>delayCall((()=>MY_API.Exchange.runS2C())))):(runMidnight((()=>MY_API.Exchange.runS2C()),"瓜子换硬币"),$.Deferred().resolve())}catch(e){return window.toast("[银瓜子换硬币]运行时出现异常,已停止","error"),MYERROR("银瓜子换硬币出错",e),$.Deferred().reject()}}},Gift:{run_timer:void 0,ruid:void 0,room_id:void 0,medal_list:void 0,bag_list:void 0,giftFeed_list:{},remain_feed:void 0,over:void 0,allowGiftList:void 0,getBagList:async()=>BAPI.gift.bag_list().then((e=>{if(MYDEBUG("Gift.getBagList: API.gift.bag_list",e),0!==e.code)return window.toast(`[自动送礼]获取包裹列表失败,${e.message}`,"error"),delayCall((()=>MY_API.Gift.getBagList()));MY_API.Gift.bag_list=e.data.list})),getFeedByGiftID:e=>{for(let t=Live_info.gift_list.length-1;t>=0;--t)if(Live_info.gift_list[t].id===e)return Math.ceil(Live_info.gift_list[t].price/100);return 0},sort_medals:e=>{if("GIFT_SORT_HIGH"==MY_API.CONFIG.GIFT_SORT?e.sort(((e,t)=>t.level-e.level==0?t.intimacy-e.intimacy:t.level-e.level)):e.sort(((e,t)=>e.level-t.level==0?e.intimacy-t.intimacy:e.level-t.level)),MY_API.CONFIG.AUTO_GIFT_ROOMID){let t=[...MY_API.CONFIG.AUTO_GIFT_ROOMID];t.reverse();for(let i of t){let t=e.findIndex((e=>e.roomid==i));if(-1!=t){let i=e[t];e.splice(t,1),e.unshift(i)}}}return e},run:async(e=!1)=>{const t=()=>{if(window.toast("[自动送礼] 本次送礼结束","info"),SEND_GIFT_NOW=!1,"GIFT_SEND_TIME"==MY_API.CONFIG.GIFT_METHOD){let e=getIntervalTime(MY_API.CONFIG.GIFT_SEND_HOUR,MY_API.CONFIG.GIFT_SEND_MINUTE);MY_API.Gift.run_timer=setTimeout((()=>MY_API.Gift.run(!0)),e);let t=new Date(ts_ms()+e).toLocaleString();MYDEBUG("[自动送礼]",`将在${t}进行自动送礼`),MY_API.CACHE.Gift_TS=ts_ms(),MY_API.saveCache()}else{let e=60*MY_API.CONFIG.GIFT_INTERVAL*1e3;MY_API.Gift.run_timer=setTimeout((()=>MY_API.Gift.run(!0)),e),MYDEBUG("[自动送礼]",`将在${MY_API.CONFIG.GIFT_INTERVAL}分钟后进行自动送礼`),MY_API.CACHE.GiftInterval_TS=ts_ms(),MY_API.saveCache()}},i=(e=!0)=>{let t;if(!MY_API.CONFIG.SEND_ALL_GIFT&&e){if(t=MY_API.Gift.bag_list.filter((e=>MY_API.Gift.allowGiftList.includes(String(e.gift_id))&&e.gift_num>0&&Number(e.corner_mark.substring(0,e.corner_mark.indexOf("天")))<=MY_API.CONFIG.GIFT_LIMIT)),MYDEBUG("[自动送礼] if分支 过滤后的礼物",t),0===t.length)return void(MY_API.Gift.over=!0)}else if(t=MY_API.Gift.bag_list.filter((e=>e.gift_num>0&&"永久"!=e.corner_mark)),MYDEBUG("[自动送礼] else分支 过滤后的礼物",t),0===t.length)return void(MY_API.Gift.over=!0);for(const e of t)e.gift_feed=MY_API.Gift.giftFeed_list[e.gift_id];t.sort((function(e,t){return t.gift_feed-e.gift_feed})),t.sort((function(e,t){if(t.gift_feed===e.gift_feed)return e.expire_at-t.expire_at})),MY_API.Gift.bag_list=[...t],MYDEBUG("Gift.bag_list (sorted)",MY_API.Gift.bag_list)};try{if(!MY_API.CONFIG.AUTO_GIFT||otherScriptsRunning)return $.Deferred().resolve();if(medalDanmuRunning)return setTimeout((()=>MY_API.Gift.run()),3e3);if(MY_API.Gift.run_timer&&clearTimeout(MY_API.Gift.run_timer),!("GIFT_SEND_TIME"!=MY_API.CONFIG.GIFT_METHOD||isTime(MY_API.CONFIG.GIFT_SEND_HOUR,MY_API.CONFIG.GIFT_SEND_MINUTE)||SEND_GIFT_NOW||e)){let e=getIntervalTime(MY_API.CONFIG.GIFT_SEND_HOUR,MY_API.CONFIG.GIFT_SEND_MINUTE);MY_API.Gift.run_timer=setTimeout((()=>MY_API.Gift.run(!0)),e);let t=new Date(ts_ms()+e).toLocaleString();return MYDEBUG("[自动送礼]",`将在${t}进行自动送礼`),$.Deferred().resolve()}if("GIFT_INTERVAL"==MY_API.CONFIG.GIFT_METHOD&&!SEND_GIFT_NOW&&!e){let e=6e4*MY_API.CONFIG.GIFT_INTERVAL;if(MY_API.CACHE.GiftInterval_TS){const t=ts_ms()-MY_API.CACHE.GiftInterval_TS;if(t<e){let i=e-t;return MY_API.Gift.run_timer=setTimeout((()=>MY_API.Gift.run(!0)),i),MYDEBUG("[自动送礼]",`将在${i}毫秒后进行自动送礼`),$.Deferred().resolve()}}else MY_API.CACHE.GiftInterval_TS=ts_ms(),MY_API.saveCache()}if("resolved"!==medal_info.status.state())return window.toast("[自动送礼] 粉丝勋章列表未被完全获取,暂停运行","error"),medal_info.status.then((()=>MY_API.Gift.run()));if(MY_API.Gift.medal_list=[...medal_info.medal_list],MYDEBUG("Gift.run: Gift.getMedalList().then: Gift.medal_list",MY_API.Gift.medal_list),MY_API.Gift.over=!1,(()=>{MY_API.Gift.allowGiftList=[...MY_API.CONFIG.GIFT_ALLOW_TYPE],MYDEBUG("[自动送礼]",`处理前的礼物列表 ${MY_API.Gift.allowGiftList}`);for(let e=0;e<MY_API.Gift.allowGiftList.length;e++){const t=MY_API.Gift.allowGiftList[e];let i;isNaN(t)&&(i=Live_info.gift_list.find((e=>e.name===t)),i&&(MY_API.Gift.allowGiftList[e]=String(i.id)))}MYDEBUG("[自动送礼]",`处理后得到的礼物id列表 ${MY_API.Gift.allowGiftList}`)})(),await MY_API.Gift.getBagList(),await(async()=>{for(const e of MY_API.Gift.bag_list)MY_API.Gift.giftFeed_list.hasOwnProperty(e.gift_id)||(MY_API.Gift.giftFeed_list[e.gift_id]=await MY_API.Gift.getFeedByGiftID(e.gift_id))})(),i(!1),MY_API.Gift.over)return t();if(MY_API.Gift.medal_list.length>0){if(MY_API.Gift.medal_list=MY_API.Gift.medal_list.filter((e=>e.day_limit-e.today_feed>0&&e.level<20&&e.roomid)),MY_API.Gift.medal_list=MY_API.Gift.sort_medals(MY_API.Gift.medal_list),"GIFT_SEND_BLACK"===MY_API.CONFIG.GIFT_SEND_METHOD?MY_API.Gift.medal_list=MY_API.Gift.medal_list.filter((e=>-1==MY_API.CONFIG.GIFT_SEND_ROOM.findIndex((t=>t==e.roomid)))):MY_API.Gift.medal_list=MY_API.Gift.medal_list.filter((e=>MY_API.CONFIG.GIFT_SEND_ROOM.findIndex((t=>t==e.roomid))>-1)),i(),MY_API.Gift.over)return t();for(const e of MY_API.Gift.medal_list){if(!MY_API.Gift.bag_list.some((e=>e.gift_num>0))){MY_API.Gift.over=!0;break}const t=await BAPI.room.room_init(parseInt(e.roomid,10)).then((t=>{if(MYDEBUG(`[自动送礼] API.room.room_init(${e.roomid})`,t),0!==t.code)throw t.msg;return t}));MY_API.Gift.room_id=parseInt(t.data.room_id,10),MY_API.Gift.ruid=e.target_id,MY_API.Gift.remain_feed=e.day_limit-e.today_feed,MY_API.Gift.remain_feed>0?(window.toast(`[自动送礼]勋章[${e.medal_name}] 今日亲密度未满[${e.today_feed}/${e.day_limit}],预计需要[${MY_API.Gift.remain_feed}]送礼开始`,"info"),await MY_API.Gift.sendGift(e)):window.toast(`[自动送礼]勋章[${e.medal_name}] 今日亲密度已满`,"info")}}return MY_API.Gift.over||await MY_API.Gift.sendRemainGift(MY_API.CONFIG.SPARE_GIFT_ROOM),t()}catch(e){return window.toast("[自动送礼] 运行时出现异常,已停止","error"),MYERROR("自动送礼出错",e),delayCall((()=>MY_API.Gift.run()))}},sendGift:async e=>{for(const t of MY_API.Gift.bag_list){if(MY_API.Gift.remain_feed<=0)return window.toast(`[自动送礼]勋章[${e.medal_name}]送礼结束,今日亲密度已满[${e.today_feed}/${e.day_limit}]`,"info");if(0===t.gift_num)continue;const i=MY_API.Gift.giftFeed_list[t.gift_id];if(i>0){let n=Math.floor(MY_API.Gift.remain_feed/i);if(0===n)continue;n>t.gift_num&&(n=t.gift_num),MYDEBUG(`[自动送礼]送出礼物类型${t.gift_name},该项礼物数量${t.gift_num},送出礼物数量${n}`),await BAPI.gift.bag_send(Live_info.uid,t.gift_id,MY_API.Gift.ruid,n,t.bag_id,MY_API.Gift.room_id,Live_info.rnd).then((o=>{if(MYDEBUG("Gift.sendGift: API.gift.bag_send",o),0===o.code)t.gift_num-=n,e.today_feed+=n*i,MY_API.Gift.remain_feed-=n*i,window.toast(`[自动送礼]勋章[${e.medal_name}] 送礼成功,送出${n}个${t.gift_name},[${e.today_feed}/${e.day_limit}]距离今日亲密度上限还需[${MY_API.Gift.remain_feed}]`,"success");else{if(200028!==o.code)return window.toast(`[自动送礼]勋章[${e.medal_name}] 送礼异常:${o.msg}`,"caution"),delayCall((()=>MY_API.Gift.sendGift(e)));window.toast(`[自动送礼]勋章[${e.medal_name}] 送礼失败:${o.msg}`,"caution")}}))}}},sendRemainGift:async e=>{if(0==e)return $.Deferred().resolve();let t;await BAPI.room.room_init(e).then((i=>{if(MYDEBUG("API.room.room_init",i),0!==i.code)return window.toast(`[自动送礼]【剩余礼物】检查房间出错 ${i.message}`),delayCall((()=>BAPI.room.room_init(e)));t=i.data.uid}));let i=MY_API.Gift.bag_list.filter((e=>MY_API.Gift.allowGiftList.includes(String(e.gift_id))&&e.gift_num>0&&"1天"==e.corner_mark));if(0!==i.length){MYDEBUG("[自动送礼]【剩余礼物】bag_list",i);for(const n of i){if(n.gift_num<=0)continue;if(MY_API.Gift.giftFeed_list[n.gift_id]>0){let i=n.gift_num;await BAPI.gift.bag_send(Live_info.uid,n.gift_id,t,i,n.bag_id,e,Live_info.rnd).then((t=>{if(MYDEBUG("Gift.sendGift: API.gift.bag_send",t),0===t.code)n.gift_num-=i,window.toast(`[自动送礼]【剩余礼物】房间[${e}] 送礼成功,送出${i}个${n.gift_name}`,"success");else{if(200028!==t.code)return window.toast(`[自动送礼]【剩余礼物】房间[${e}] 送礼异常:${t.msg}`,"caution"),delayCall((()=>MY_API.Gift.sendGift(medal)));window.toast(`[自动送礼]勋章[${medal.medal_name}] 送礼失败:${t.msg}`,"caution")}}))}}}}},AUTO_DANMU:{setValue:(e,t)=>void 0===MY_API.CONFIG[e][t]&&t>0?MY_API.AUTO_DANMU.setValue(e,t-1):MY_API.CONFIG[e][t],sendDanmu:async(e,t)=>{let i=t;return Number(t)<=1e4&&(i=await BAPI.room.get_info(t).then((e=>(MYDEBUG(`API.room.get_info roomId=${t} res`,e),0===e.code?e.data.room_id:(window.toast(`[自动发弹幕]房间号【${t}】信息获取失败 ${e.message}`,"error"),t))))),BAPI.sendLiveDanmu(e,i).then((i=>{MYDEBUG(`[自动发弹幕]弹幕发送内容【${e}】,房间号【${t}】`,i),0===i.code?window.toast(`[自动发弹幕]弹幕【${e}】(房间号【${t}】)发送成功`,"success"):window.toast(`[自动发弹幕]弹幕【${e}】(房间号【${t}】)出错 ${i.msg}`,"caution")}))},getMaxLength:()=>{let e;const t=MY_API.CONFIG.DANMU_CONTENT.length,i=MY_API.CONFIG.DANMU_ROOMID.length,n=MY_API.CONFIG.DANMU_INTERVAL_TIME.length;return e=t>=i?t:i,e<n&&(e=n),e},run:async()=>{if(!MY_API.CONFIG.AUTO_DANMU||otherScriptsRunning)return $.Deferred().resolve();if(medalDanmuRunning)return setTimeout((()=>MY_API.AUTO_DANMU.run()),3e3);if(danmuTaskRunning=!0,SEND_DANMU_NOW){for(let e=0;e<MY_API.CONFIG.DANMU_CONTENT.length;e++){let t=MY_API.AUTO_DANMU.setValue("DANMU_CONTENT",e),i=parseInt(MY_API.AUTO_DANMU.setValue("DANMU_ROOMID",e));await MY_API.AUTO_DANMU.sendDanmu(t,i),await sleep(1e3)}SEND_DANMU_NOW=!1}else{let t=MY_API.AUTO_DANMU.getMaxLength();for(let i=0;i<t;i++){let t,n,o,a,r,l=MY_API.AUTO_DANMU.setValue("DANMU_CONTENT",i),s=parseInt(MY_API.AUTO_DANMU.setValue("DANMU_ROOMID",i)),_=MY_API.AUTO_DANMU.setValue("DANMU_INTERVAL_TIME",i),d=MY_API.CACHE.AUTO_SEND_DANMU_TS,c=0;function e(){for(let e=0;e<d.length;e++){const i=d[e];if(i.roomid==s&&i.content==l){t=i.sendTs,n=e;break}}}if(_.indexOf(":")>-1){o=!0;const e=_.split(":"),t=parseInt(e[0]),i=parseInt(e[1]),n=parseInt(e[2]);c=isTime(t,i,n)?864e5:getIntervalTime(t,i,n)}else if(o=!1,_=_.toLowerCase(),_.indexOf("h")>-1||_.indexOf("m")>-1||_.indexOf("s")>-1){const e=_.split("h"),t=void 0===e[1]?e[0].split("m"):e[1].split("m"),i=void 0===t[1]?t[0].split("s"):t[1].split("s"),n=e[0],o=t[0],a=i[0],l=isNaN(n)?0:n||0,s=isNaN(o)?0:o||0,d=isNaN(a)?0:a||0;r=36e5*l+6e4*s+1e3*d}else r=6e4*_;MYDEBUG("[自动发弹幕]MY_API.CACHE.AUTO_SEND_DANMU_TS => jsoncache",d),e(),o||(a=t?ts_ms()-t:ts_ms());const I=()=>{const t={roomid:s,content:l,sendTs:ts_ms()};return e(),void 0===n?d.push(t):d[n].sendTs=ts_ms(),MY_API.CACHE.AUTO_SEND_DANMU_TS=d,MY_API.saveCache(!1)},m=(e,t)=>(t||I(),setTimeout((async()=>(await MY_API.AUTO_DANMU.sendDanmu(l,s),t||I(),m(e,t))),e));!o&&a>=r?(await MY_API.AUTO_DANMU.sendDanmu(l,s),MYDEBUG(`[自动发弹幕]弹幕发送内容【${l}】,房间号【${s}】,距下次发送还有`,_),m(r,o)):o&&!c?(await MY_API.AUTO_DANMU.sendDanmu(l,s),MYDEBUG(`[自动发弹幕]弹幕发送内容【${l}】,房间号【${s}】,距下次发送还有`,"24小时"),m(c,o)):(MYDEBUG(`[自动发弹幕]弹幕发送内容【${l}】,房间号【${s}】,距下次发送还有`,(o?c/6e4:(r-a)/6e4)+"分钟"),setTimeout((async()=>{await MY_API.AUTO_DANMU.sendDanmu(l,s),m(o?864e5:r,o)}),o?c:r-a)),await sleep(1500)}}danmuTaskRunning=!1}},AUTO_CHECK_DANMU:{sendDanmu:{},initEmitter:()=>{danmuEmitter.on("danmu",(e=>{let t=setTimeout((()=>{window.toast(`弹幕【${e}】疑似发送失败`,"caution"),delete MY_API.AUTO_CHECK_DANMU.sendDanmu[t]}),MY_API.CONFIG.AUTO_CHECK_DANMU_TIMEOUT);MY_API.AUTO_CHECK_DANMU.sendDanmu[t]=e}))},run:()=>{SP_CONFIG.AUTO_CHECK_DANMU&&(MY_API.AUTO_CHECK_DANMU.initEmitter(),W.bliveproxy.addCommandHandler("DANMU_MSG",(e=>{if(MY_API.AUTO_CHECK_DANMU.sendDanmu==={})return;const t=e.info;if(t[2][0]===Live_info.uid)for(const e in MY_API.AUTO_CHECK_DANMU.sendDanmu)MY_API.AUTO_CHECK_DANMU.sendDanmu[e]===t[1]&&(MYDEBUG(`[检查弹幕是否发送成功] 已找到弹幕(timer = ${e})`,MY_API.AUTO_CHECK_DANMU.sendDanmu[e]),clearTimeout(e),delete MY_API.AUTO_CHECK_DANMU.sendDanmu[e])})))}},MEDAL_DANMU:{medal_list:[],sendDanmu:async(e,t,i)=>BAPI.sendLiveDanmu(e,t).then((n=>(MYDEBUG(`API.sendLiveDanmu(弹幕 = ${e}, roomid = ${t})`,n),0===n.code?MYDEBUG(`[粉丝牌打卡弹幕] 弹幕发送内容【${e}】,房间号【${t}】,真实房间号【${t}】,粉丝勋章【${i}】`,n):window.toast(`[粉丝牌打卡弹幕] 弹幕【${e}】(房间号【${t}】,粉丝勋章【${i}】)出错 ${n.message}`,"caution")))),run:async()=>{if(!MY_API.CONFIG.MEDAL_DANMU||otherScriptsRunning)return $.Deferred().resolve();if(!checkNewDay(MY_API.CACHE.Live_medalDanmu_TS))return runMidnight((()=>MY_API.MEDAL_DANMU.run()),"粉丝勋章打卡弹幕"),$.Deferred().resolve();if(danmuTaskRunning)return setTimeout((()=>MY_API.MEDAL_DANMU.run()),3e3);if("resolved"!==medal_info.status.state())return window.toast("[粉丝牌打卡] 粉丝勋章列表未被完全获取,暂停运行","error"),medal_info.status.then((()=>MY_API.MEDAL_DANMU.run()));let e;MY_API.MEDAL_DANMU.medal_list=[...medal_info.medal_list],medalDanmuRunning=!0,e="LIVE_TASKS_WHITE"===MY_API.CONFIG.LIVE_TASKS_METHOD?MY_API.MEDAL_DANMU.medal_list.filter((e=>MY_API.CONFIG.LIVE_TASKS_ROOM.findIndex((t=>t==e.roomid))>-1&&e.roomid)):MY_API.MEDAL_DANMU.medal_list.filter((e=>-1===MY_API.CONFIG.LIVE_TASKS_ROOM.findIndex((t=>t==e.roomid))&&e.roomid)),MYDEBUG("[粉丝牌打卡] 过滤后的粉丝勋章房间列表",e);let t=0;const i=MY_API.CONFIG.MEDAL_DANMU_CONTENT.length;for(const n of e){t>=i&&(t=0);const e=n.medal_name,o=n.real_roomid,a=MY_API.CONFIG.MEDAL_DANMU_CONTENT[t];await MY_API.MEDAL_DANMU.sendDanmu(a,o,e),t++,await sleep(1e3*MY_API.CONFIG.MEDAL_DANMU_INTERVAL)}return medalDanmuRunning=!1,window.toast("[粉丝牌打卡弹幕] 今日已完成","success"),MY_API.CACHE.Live_medalDanmu_TS=ts_ms(),MY_API.saveCache(),runTomorrow((()=>MY_API.MEDAL_DANMU.run()),0,2,"粉丝勋章打卡弹幕")}},DANMU_MODIFY:{maxLength:0,configJson:{DANMU_MODIFY_REGEX:[],DANMU_MODIFY_UID:[],DANMU_MODIFY_POOL:[],DANMU_MODIFY_SIZE:[],DANMU_MODIFY_COLOR:[]},handleConfig:()=>{for(const e in MY_API.DANMU_MODIFY.configJson)MY_API.DANMU_MODIFY.configJson[e]=MY_API.CONFIG[e];for(const e in MY_API.DANMU_MODIFY.configJson)MY_API.DANMU_MODIFY.configJson[e].length>MY_API.DANMU_MODIFY.maxLength&&(MY_API.DANMU_MODIFY.maxLength=MY_API.DANMU_MODIFY.configJson[e].length);for(const e in MY_API.DANMU_MODIFY.configJson)if(MY_API.DANMU_MODIFY.configJson[e].length<MY_API.DANMU_MODIFY.maxLength){let t=MY_API.DANMU_MODIFY.configJson[e].length-1;for(let i=t;i<MY_API.DANMU_MODIFY.maxLength-1;i++)MY_API.DANMU_MODIFY.configJson[e].push(MY_API.DANMU_MODIFY.configJson[e][t])}},check:info=>{for(let i=0;i<MY_API.DANMU_MODIFY.maxLength;i++){let regex,uid=info[2][0],danmu=info[1];try{regex=eval(MY_API.DANMU_MODIFY.configJson.DANMU_MODIFY_REGEX[i])}catch(e){MYDEBUG("bliveproxy",`正则表达式出错 ${MY_API.DANMU_MODIFY.configJson.DANMU_MODIFY_REGEX[i]}`),regex=/^【/}if(regex.test(danmu)||MY_API.DANMU_MODIFY.configJson.DANMU_MODIFY_UID[i]==uid)return i}return-1},run:()=>{if(!SP_CONFIG.DANMU_MODIFY)return $.Deferred().resolve();MY_API.DANMU_MODIFY.handleConfig(),W.bliveproxy.addCommandHandler("DANMU_MSG",(e=>{if(!SP_CONFIG.DANMU_MODIFY)return $.Deferred().resolve();let t=e.info;MYDEBUG("bliveproxy DANMU_MSG",t);let i=MY_API.DANMU_MODIFY.check(t);if(-1===i)return $.Deferred().resolve();t[0][1]=MY_API.DANMU_MODIFY.configJson.DANMU_MODIFY_POOL[i],t[0][2]*=MY_API.DANMU_MODIFY.configJson.DANMU_MODIFY_SIZE[i],t[0][3]=Number("0x"+MY_API.DANMU_MODIFY.configJson.DANMU_MODIFY_COLOR[i].replace("#",""))}))}},GET_PRIVILEGE:{check_cache:()=>ts_ms()>=MY_API.CACHE.NextVipPrivilege_TS,save_cache:e=>{const t=1e3*(e+2);if(t<MY_API.CACHE.NextVipPrivilege_TS||!MY_API.CACHE.NextVipPrivilege_TS)return MY_API.CACHE.NextVipPrivilege_TS=t,MY_API.saveCache(!1)},get_info:()=>BAPI.x.vip.privilege.my().then((e=>(MYDEBUG("API.x.vip.privilege.my response",e),0===e.code?e.data.list:(window.toast(`[大会员] 获取权益状态失败 ${e.message}`,"error"),!1)))),receive:e=>BAPI.x.vip.privilege.receive(e).then((t=>(MYDEBUG("API.x.vip.privilege.receive response",t),0===t.code||(window.toast(`[大会员] 领取权益失败(type=${e}) ${t.message}`,"warning"),!1)))),run:async()=>{if(!MY_API.CONFIG.GET_PRIVILEGE||otherScriptsRunning||0===Live_info.vipStatus||ts_ms()<MY_API.CACHE.NextVipPrivilege_TS)return $.Deferred().resolve();let e=await MY_API.GET_PRIVILEGE.get_info();if(!e)return $.Deferred().resolve();let t=!1;for(const i of e)0===i.state&&(t=await MY_API.GET_PRIVILEGE.receive(i.type,i.expire_time));if(t&&window.toast("[大会员] 权益已领取","success"),e.every((e=>1===e.state))){let t=e[0].expire_time;for(let i=1;i<e.length;i++)e[i].expire_time<t&&(t=e[i].expire_time);MY_API.GET_PRIVILEGE.save_cache(t)}return $.Deferred().resolve()}}};MY_API.init().then((()=>{try{let e=$.Deferred();if(SP_CONFIG.showEula){const t=GM_getResourceText("eula");myopen({title:`${GM_info.script.name}最终用户许可协议`,btn:["同意协议并继续","不同意"],closeBtn:0,area:[String(.618*$(window).width())+"px",String(.8*$(window).height())+"px"],content:t,yes:function(t){SP_CONFIG.showEula=!1,saveSpConfig(),layer.close(t),e.resolve()},btn2:function(){mymsg("脚本已停止运行",{time:3e3,icon:2}),window.toast("由于未同意最终用户许可协议,脚本已停止运行。","caution"),SP_CONFIG.showEula=!0,saveSpConfig(),e.reject()}})}else e.resolve();e.then((()=>{if(0===parseInt(Live_info.uid)||isNaN(parseInt(Live_info.uid)))return window.toast("未登录,请先登录再使用脚本","caution");MY_API.CONFIG.UPDATE_TIP&&MY_API.newMessage(GM_info.script.version),MYDEBUG("MY_API.CONFIG",MY_API.CONFIG),main(MY_API)}))}catch(e){MYERROR("初始化错误",e)}}))}async function main(e){checkUpdate(GM_info.script.version),fixVersionDifferences(e,GM_info.script.version),runExactMidnight((()=>clearStat()),"重置统计"),e.creatSetBox(),e.removeUnnecessary(),e.DANMU_MODIFY.run();const t=[e.MEDAL_DANMU.run,e.GroupSign.run,e.DailyReward.run,e.LiveReward.run,e.Exchange.runS2C,e.Exchange.runC2S,e.AUTO_DANMU.run,e.Gift.run,e.GET_PRIVILEGE.run,e.AUTO_CHECK_DANMU.run];otherScriptsRunningCheck.then((()=>runAllTasks(5e3,200,t))),e.CONFIG.TIME_RELOAD&&function t(i){let n=setTimeout((()=>{if(e.CONFIG.WatchLive&&checkNewDay(e.CACHE.LiveReward_TS))return MYDEBUG("[刷新直播间]","正在运行观看直播任务,10分钟后再次检查"),clearTimeout(n),t(6e5);const i=sleepCheck(e.CONFIG);if(i)return MYDEBUG("[刷新直播间]",`处于休眠时间段,将在${i}毫秒后刷新直播间`),clearTimeout(n),t(i);W.location.reload()}),i)}(6e4*e.CONFIG.TIME_RELOAD_MINUTE)}function checkUpdate(e){if(!checkNewDay(noticeJson.lastCheckUpdateTs))return;XHR({GM:!0,anonymous:!0,method:"GET",url:"https://andywang.top:3001/api/v1/notice",headers:{Accept:"text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9","Upgrade-Insecure-Requests":"1","Sec-Fetch-Site":"none","Sec-Fetch-Mode":"navigate","Sec-Fetch-User":"?1","Sec-Fetch-Dest":"document","Accept-Encoding":"gzip, deflate, br","Accept-Language":"en-US,en;q=0.9,zh-CN;q=0.8,zh;q=0.7"},responseType:"json"}).then((t=>{if(MYDEBUG("检查更新 checkUpdate",t),200!==t.response.status)return window.toast(`[检查更新] 获取notice.json出错 ${t.response.statusText}`,"caution");noticeJson=t.body.data,noticeJson.lastCheckUpdateTs=ts_ms(),GM_setValue("noticeJson",noticeJson);const i=noticeJson.version,n={active:!0,insert:!0,setParent:!0};if(-1===versionStringCompare(e,i)){let e,t;null===GM_info.script.updateURL?(e="Greasy Fork",t="https://greasyfork.org/scripts/406048-b%E7%AB%99%E7%9B%B4%E6%92%AD%E9%97%B4%E6%8C%82%E6%9C%BA%E5%8A%A9%E6%89%8B"):(e="BLTH-server",t="https://andywang.top:3001/api/v1/BLTH.user.js");let o=myconfirm(`检测到新版本 <strong>${i}</strong>。<br>是否从 ${e} 更新脚本?`,{title:"更新脚本",btn:["是","否"]},(function(){"Greasy Fork"===e?(layer.close(o),GM_openInTab(t,n)):(updateBLTH(t),mymsg("正在更新...",{time:2e3}))}),(function(){}))}}))}async function getMedalList(e=1){1===e&&(medal_info={status:$.Deferred(),medal_list:[]});let t=!1;for(;;){if(await BAPI.i.medal(e).then((i=>{if(MYDEBUG("before init() getMedalList: API.i.medal",i),0===i.code){for(let e=0;e<i.data.items.length;e++)i.data.items[e].roomid&&i.data.items[e].roomid<=1e5?BAPI.room.get_info(i.data.items[e].roomid).then((t=>{0===t.code?i.data.items[e].real_roomid=t.data.room_id:MYERROR(`获取直播间${i.data.items[e].roomid}的真实房间号出错`)})):i.data.items[e].real_roomid=i.data.items[e].roomid;medal_info.medal_list=medal_info.medal_list.concat(i.data.items),i.data.page_info.cur_page<i.data.page_info.total_page?e++:(medal_info.status.resolve(),t=!0)}else 1024===i.code?(window.toast(`获取粉丝勋章列表超时 ${i.message} 部分功能将无法正常运行`,"error"),delayCall((()=>getMedalList(e))),t=!0):(window.toast(`获取粉丝勋章列表失败 ${i.message} 部分功能将无法正常运行`,"error"),delayCall((()=>getMedalList(e))),t=!0)})),t){runTomorrow((()=>getMedalList()),0,1,"获取粉丝勋章列表");break}await sleep(200)}}function versionStringCompare(e="0",t="0"){function i(e){return e.match(/\d.*/)[0].split(".").reduce(((e,t,i)=>e+.01**i*Number(t)),0)}const n=i(e),o=i(t);return n>o?1:n<o?-1:0}function mouseMove(){MYDEBUG("屏蔽挂机检测","触发一次MouseEvent(mousemove)"),document.dispatchEvent(new MouseEvent("mousemove",{screenX:Math.floor(Math.random()*screen.availWidth),screenY:Math.floor(Math.random()*screen.availHeight),clientX:Math.floor(Math.random()*W.innerWidth),clientY:Math.floor(Math.random()*W.innerHeight),ctrlKey:Math.random()>.8,shiftKey:Math.random()>.8,altKey:Math.random()>.9,metaKey:!1,button:0,buttons:0,relatedTarget:null,region:null,detail:0,view:W,sourceCapabilities:W.InputDeviceCapabilities?new W.InputDeviceCapabilities({fireTouchEvents:!1}):null,bubbles:!0,cancelable:!0,composed:!0}))}function runAllTasks(e,t,i){let n=0;setTimeout((()=>{for(const e of i)setTimeout((()=>e()),t*n++)}),e)}function fixVersionDifferences(e,t){if(versionStringCompare(SP_CONFIG.storageLastFixVersion,"6.0.1")>=0)return;const i=["AUTO_GIFT_ROOMID","COIN_UID"];if(!i.every((t=>Array.isArray(e.CONFIG[t]))))for(const t of i)Array.isArray(e.CONFIG[t])||(e.CONFIG[t]=String(e.CONFIG[t]).split(","));"high"==e.CONFIG.GIFT_SORT?e.CONFIG.GIFT_SORT="GIFT_SORT_HIGH":"low"==e.CONFIG.GIFT_SORT&&(e.CONFIG.GIFT_SORT="GIFT_SORT_LOW"),e.CONFIG.MEDAL_DANMU_ROOM&&(e.CONFIG.LIVE_TASKS_ROOM=e.CONFIG.MEDAL_DANMU_ROOM),e.CONFIG.MEDAL_DANMU_METHOD&&(e.CONFIG.LIVE_TASKS_METHOD="LIVE_TASKS_"+e.CONFIG.MEDAL_DANMU_METHOD.split("_").pop()),localStorage.removeItem("im_deviceid_IGIFTMSG"),SP_CONFIG.storageLastFixVersion=t,e.saveConfig(!1),e.saveCache(),saveSpConfig()}function localstorage2gm(){if(localStorage.getItem("IGIFTMSG_CONFIG")){for(let e=0;e<localStorage.length;e++){const t=localStorage.key(e);if(/IGIFTMSG.*/.test(t)){let i=localStorage.getItem(t);try{i=JSON.parse(i);let e=0;for(const t in i)e++;i.hasOwnProperty("list")&&1===e&&(i=i.list)}catch(e){}-1===["AnchorRoomidList"].indexOf(t)&&GM_setValue(t.replace(/IGIFTMSG_|IGIFTMSG/,""),i),localStorage.removeItem(t),e--}}W.location.reload()}}function saveSpConfig(e=!0){return e&&MYDEBUG("SP_CONFIG已保存",SP_CONFIG),GM_setValue("SP_CONFIG",SP_CONFIG)}function animChange(e,t){t?(e.removeClass("layer-anim"),e.removeClass("layer-anim-00"),e.addClass("layer-anim"),e.addClass("layer-anim-close")):(e.removeClass("layer-anim"),e.removeClass("layer-anim-close"),e.addClass("layer-anim"),e.addClass("layer-anim-00"))}function mergeObject(e,t){!function e(t,i){for(let n in i)void 0===t[n]||null===t[n]?t[n]=i[n]:Array.isArray(t[n])||"object"!=typeof t[n]||e(t[n],i[n])}(e,t),function e(t,i){for(let n in t)void 0===i[n]||null===i[n]?delete t[n]:Array.isArray(t[n])||"object"!=typeof t[n]||e(t[n],i[n])}(e,t)}function checkBrowserVersion(){return void 0===Array.prototype.findIndex?["浏览器版本过低,挂机助手停止运行","error"]:void 0===String.prototype.replaceAll?["浏览器版本略低,挂机助手可以正常运行但建议升级浏览器到最新版","info"]:["ok","info"]}function downFile(e,t){let i=document.createElement("a");i.setAttribute("href","data:text/plain;charset=utf-8,"+encodeURIComponent(JSON.stringify(t))),i.setAttribute("download",e),i.style.display="none",document.body.appendChild(i),i.click(),document.body.removeChild(i)}function updateBLTH(e){let t=document.createElement("a");t.setAttribute("href",e),t.style.display="none",document.body.appendChild(t),t.click(),document.body.removeChild(t)}function exportConfig(e,t){return downFile("BLTH_CONFIG.json",{VERSION:GM_info.script.version,MY_API_CONFIG:e,SP_CONFIG:t})}function importConfig(){let e=document.getElementById("BLTH_config_file").files[0],t=new FileReader;function i(e="文件格式错误"){return mymsg(e,{time:2500,icon:2})}t.onload=function(){MYDEBUG("importConfig 文件读取结果:",this.result);try{if(readConfigArray[0]=JSON.parse(decodeURIComponent(this.result)),"object"==typeof readConfigArray[0]&&readConfigArray[0]){const e=["VERSION","MY_API_CONFIG","SP_CONFIG"];for(const t of e)if(!readConfigArray[0].hasOwnProperty(t))return i();return 1===versionStringCompare("5.6.6.3",readConfigArray[0].VERSION)?i("该配置文件版本过低"):readConfigArray[1].resolve()}return i()}catch(e){return MYDEBUG("importConfig error:",e),i()}},t.readAsText(e)}function getIntervalTime(e,t,i){const n=new Date,o=3600*e*1e3+60*t*1e3+(i?1e3*i:0)-(3600*n.getHours()*1e3+60*n.getMinutes()*1e3+1e3*n.getSeconds());return MYDEBUG("[getIntervalTime]获取间隔时间",`${o}毫秒`),o<0?864e5+o:o}function isTime(e,t,i){let n=new Date,o=n.getHours(),a=n.getMinutes(),r=n.getSeconds();return o==e&&a==t&&!i||o==e&&a==t&&r==i||(MYDEBUG("isTime 错误时间",`目标时间${e}时${t}分${i||0}秒,当前时间${o}时${a}分${r}秒`),!1)}function inTimeArea(e,t,i,n){if(e>23||t>24||e<0||t<1||i>59||i<0||n>59||n<0)return!1;const o=36e5,a=6e4,r=new Date,l=r.getHours()*o+r.getMinutes()*a,s=e*o+i*a,_=t*o+n*a;return s<_?l>=s&&l<_:l>=s||l<_}function sleep(e){return new Promise((t=>{setTimeout((()=>{t()}),e)}))}function checkNewDay(e,t="Beijing"){if(0==e)return!0;let i=new Date(e),n="Beijing"===t?getCHSdate():new Date,o=i.getDate(),a=n.getDate(),r=n.getTime();return a!==o||r-e>864e5}function onlyScriptCheck(){try{let e=localStorage.getItem("UNIQUE_CHECK_CACHE")||0;const t=ts_ms();if(t-e>=0&&t-e<=11e3)return window.toast("检测到其他直播间页面的挂机助手正在运行,无需重复运行的功能将停止运行","caution"),otherScriptsRunning=!0,otherScriptsRunningCheck.resolve();let i;const n=()=>{i=setTimeout((()=>n()),1e4),e=ts_ms(),localStorage.setItem("UNIQUE_CHECK_CACHE",e)};return W.addEventListener("unload",(()=>{clearTimeout(i),localStorage.setItem("UNIQUE_CHECK_CACHE",0)})),n(),otherScriptsRunningCheck.resolve()}catch(e){return MYDEBUG("重复运行检测出错",e),otherScriptsRunningCheck.reject()}}function debounce(e,t){var i;return function(){var n=this,o=arguments;clearTimeout(i),i=setTimeout((function(){e.apply(n,o)}),t)}}function XHR(e){return new Promise((t=>{const i=i=>{MYERROR("XHR出错",e,i),t(void 0)};if(e.GM)"POST"===e.method&&(void 0===e.headers&&(e.headers={}),void 0===e.headers["Content-Type"]&&(e.headers["Content-Type"]="application/x-www-form-urlencoded; charset=utf-8")),e.timeout=3e4,e.onload=e=>t({response:e,body:e.response}),e.onerror=i,e.ontimeout=i,GM_xmlhttpRequest(e);else{const n=new XMLHttpRequest;n.open(e.method,e.url),"POST"===e.method&&null===n.getResponseHeader("Content-Type")&&n.setRequestHeader("Content-Type","application/x-www-form-urlencoded; charset=utf-8"),e.cookie&&(n.withCredentials=!0),void 0!==e.responseType&&(n.responseType=e.responseType),n.timeout=3e4,n.onload=e=>{const i=e.target;t({response:i,body:i.response})},n.onerror=i,n.ontimeout=i,n.send(e.data)}}))}function myprompt(e,t){SP_CONFIG.darkMode&&e.title&&(e.title='<span style="color:#a2a7ae;">'+e.title+"</span>");let i=layer.prompt(e,t);return SP_CONFIG.darkMode&&layer.style(i,{"background-color":"#1c1c1c"}),i}function mymsg(e,t){let i=layer.msg(e,t);return SP_CONFIG.darkMode&&layer.style(i,{"background-color":"#1c1c1c",color:"#a2a7ae"}),i}function myopen(e){SP_CONFIG.darkMode&&e.title&&(e.title='<span style="color:#a2a7ae;">'+e.title+"</span>");let t=layer.open(e);return SP_CONFIG.darkMode&&layer.style(t,{"background-color":"#1c1c1c",color:"#a2a7ae"}),t}function myconfirm(e,t,...i){SP_CONFIG.darkMode&&t.title&&(t.title='<span style="color:#a2a7ae;">'+t.title+"</span>");let n=layer.confirm(e,t,...i);return SP_CONFIG.darkMode&&layer.style(n,{"background-color":"#1c1c1c",color:"#a2a7ae"}),n}function mytips(e,t,i={}){const n={"border-radius":"20px","background-color":"#00c4f8"},o={"border-right-color":"#00c4f8"};function a(e,t){const i=e.children(".layui-layer-content"),a=i.children(".layui-layer-TipsG.layui-layer-TipsT");i.css(n),a.css(o)}i.success?i.success=function(){i.success(),a()}:i.success=a,layer.tips(e,t,i)}String.prototype.replaceall=function(e,t){return this.replace(new RegExp(e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),"g"),(()=>t))},mergeObject(SP_CONFIG,SP_CONFIG_DEFAULT),(SP_CONFIG.blockLiveStream||SP_CONFIG.blockliveDataUpdate||SP_CONFIG.wear_medal_before_danmu||SP_CONFIG.AUTO_CHECK_DANMU)&&(W.fetch=(...e)=>{if(SP_CONFIG.blockLiveStream&&e[0].includes("bilivideo"))return new Promise(((e,t)=>{}));if(SP_CONFIG.blockliveDataUpdate&&e[0].includes("data.bilibili.com/gol/postweb"))return{};if(e[0].includes("//api.live.bilibili.com/msg/send")){if(SP_CONFIG.AUTO_CHECK_DANMU&&danmuEmitter.emit("danmu",e[1].data.msg),SP_CONFIG.wear_medal_before_danmu){if("resolved"!==medal_info.status.state()||null===Live_info.medal||"ONLY_FIRST"===SP_CONFIG.wear_medal_type&&hasWornMedal)return wfetch(...e);if(void 0===Live_info.medal)for(const e of medal_info.medal_list)if(e.roomid===Live_info.short_room_id){Live_info.medal=e;break}return void 0===Live_info.medal?(Live_info.medal=null,wfetch(...e)):BAPI.xlive.wearMedal(Live_info.medal.medal_id).then((t=>{if(MYDEBUG("API.xlive.wearMedal",t),0===t.code){hasWornMedal=!0;try{let e=$(".dp-i-block.medal-item-margin");if(null===e)return;let t=e.find(".v-middle.fans-medal-item");const i="#"+Live_info.medal.medal_color_start.toString(16),n=Live_info.medal.medal_level,o=Live_info.medal.medal_name;if(0!==t.length){let e=t.find(".fans-medal-label"),a=t.find(".fans-medal-level"),r=e.find(".fans-medal-content");t.css("border-color",i),e.css("background-image",`linear-gradient(45deg, ${i}, ${i})`),a.text(n),r.text(o)}else $(".action-item.medal.wear-medal").remove(),e.html(`<div data-v-2c4630d2="" data-v-34b5b0e1="" class="v-middle fans-medal-item" style="border-color: ${i}">\n <div data-v-2c4630d2="" class="fans-medal-label" style="background-image: linear-gradient(45deg, ${i}, ${i});">\n <span data-v-2c4630d2="" class="fans-medal-content">${o}</span>\n </div>\n <div data-v-2c4630d2="" class="fans-medal-level" style="color: ${i};">${n}</div>\n </div>`)}catch(e){MYERROR("修改弹幕框左侧粉丝牌样式出错",e)}}else window.toast(`自动佩戴粉丝勋章出错 ${t.message}`,"error");return wfetch(...e)}))}return wfetch(...e)}return wfetch(...e)}),$(document).ready((function e(){if(void 0===W.BilibiliLive)return;if(!W.BilibiliLive.UID)return setTimeout(e,100);newWindow.init();const t=checkBrowserVersion();if("ok"!==t[0]&&(window.toast(...t),"error"===t[1]))return;if(onlyScriptCheck(),(SP_CONFIG.DANMU_MODIFY||SP_CONFIG.AUTO_CHECK_DANMU)&&(W.bliveproxy.hook(),MYDEBUG("bliveproxy hook complete",bliveproxy)),SP_CONFIG.nosleep&&(setInterval((()=>mouseMove()),2e5),W.addEventListener=(...e)=>e[0].indexOf("visibilitychange")>-1?void 0:eventListener(...e),W.setTimeout=function(e,...t){return-1!==String(e).indexOf("triggerSleepCallback")?_setTimeout.call(this,(function(){}),...t):_setTimeout.call(this,e,...t)},W.setInterval=function(e,...t){return-1!==String(e).indexOf("triggerSleepCallback")?_setTimeout.call(this,(function(){}),...t):_setInterval.call(this,e,...t)}),SP_CONFIG.invisibleEnter||SP_CONFIG.blockliveDataUpdate)try{ah.proxy({onRequest:(e,t)=>{SP_CONFIG.invisibleEnter&&e.url.includes("//api.live.bilibili.com/xlive/web-room/v1/index/getInfoByUser")?(MYDEBUG("getInfoByUser request",e),e.url="//api.live.bilibili.com/xlive/web-room/v1/index/getInfoByUser?room_id=22474988&from=0",t.next(e)):SP_CONFIG.blockliveDataUpdate&&e.url.includes("//data.bilibili.com/log")?t.resolve("ok"):t.next(e)},onResponse:async(e,t)=>{if(e.config.url.includes("//api.live.bilibili.com/xlive/web-room/v1/index/getInfoByUser")){MYDEBUG("getInfoByUser response",e),e.response.includes('"code":0')||(MYDEBUG("隐身入场出错,取消隐身入场并以当前房间号再次获取用户数据"),e.response=await BAPI.xlive.getInfoByUser(W.BilibiliLive.ROOMID).then((e=>(MYDEBUG("API.xlive.getInfoByUser(W.BilibiliLive.ROOMID)",e),0===e.code?JSON.stringify(e):window.toast(`获取房间基础信息失败 ${e.message}`,"error"))))),e.response=e.response.replace('"is_room_admin":false','"is_room_admin":true');const t=JSON.parse(e.response);Live_info.danmu_length=t.data.property.danmu.length}t.next(e)}})}catch(e){MYDEBUG("ah.proxy Ajax-hook代理运行出错",e)}if(SP_CONFIG.banP2p){const e=["RTCPeerConnection","RTCDataChannel","mozRTCPeerConnection","webkitRTCPeerConnection","DataChannel"];for(const t of e)delete W[t]}if(SP_CONFIG.add_like_button){const e=$(".right-ctnr"),t=e.find(".v-middle.icon-font.icon-share").parent(),i=$('<div data-v-6d89404b="" data-v-42ea937d="" title="" class="icon-ctnr live-skin-normal-a-text pointer" id = "blth_like_button" style="line-height: 16px;margin-left: 15px;"><i data-v-6d89404b="" class="v-middle icon-font icon-good" style="font-size: 16px;"></i><span data-v-6d89404b="" class="action-text v-middle" style="font-size: 12px;margin-left: 5px;">点赞</span></div>');if(i.click((()=>{BAPI.xlive.likeInteract(Live_info.room_id).then((e=>{MYDEBUG(`点击点赞按钮 likeInteract(${Live_info.room_id}) response`,e);const t=i.offset(),n=i.width(),o=i.height(),a=parseInt(t.top+1.2*o)+"px",r=parseInt(t.left+1.2*n)+"px";0===e.code?window.singleToast("点赞成功","success",2e3,a,r):window.singleToast("点赞失败","caution",2e3,a,r)}))})),0==$(".right-ctnr").length)return MYERROR("[添加点赞按钮] 无法找到元素 .right-ctnr");e[0].insertBefore(i[0],t[0])}const i=(e=0)=>setTimeout((async()=>{if(0===parseInt(W.BilibiliLive.UID)||isNaN(parseInt(W.BilibiliLive.UID)))return i(500);window.toast("正在获取礼物 / 用户 / 账号 / 粉丝勋章数据...","info"),Live_info.room_id=W.BilibiliLive.ROOMID,Live_info.short_room_id=W.BilibiliLive.SHORT_ROOMID,Live_info.uid=W.BilibiliLive.UID,Live_info.tid=W.BilibiliLive.ANCHOR_UID,await BAPI.gift.gift_config().then((e=>(MYDEBUG("InitData: API.gift.gift_config",e),e.data&&Array.isArray(e.data)?Live_info.gift_list=e.data:e.data.list&&Array.isArray(e.data.list)?Live_info.gift_list=e.data.list:window.toast(`直播间礼物数据获取失败 ${e.message}\n使用默认数据`,"warning")))),await BAPI.getuserinfo().then((e=>{if(MYDEBUG("InitData: API.getuserinfo",e),"REPONSE_OK"!==e.code)return window.toast(`API.getuserinfo 获取用户信息失败 ${e.message}`,"error"),delayCall((()=>i()));Live_info.uname=e.data.uname,Live_info.user_level=e.data.user_level})),await BAPI.x.getAccInfo(Live_info.uid).then((e=>{if(MYDEBUG("InitData: API.x.getAccInfo",e),0!==e.code)return window.toast(`API.x.getAccInfo 获取账号信息失败 ${e.message}`,"error"),delayCall((()=>i()));Live_info.level=e.data.level,Live_info.vipStatus=e.data.vip.status})),Live_info.bili_jct=BAPI.getCookie("bili_jct"),Live_info.ruid=W.BilibiliLive.ANCHOR_UID,Live_info.rnd=W.BilibiliLive.RND,Live_info.visit_id=W.__statisObserver?W.__statisObserver.__visitId:"",MYDEBUG("Live_info",Live_info),await getMedalList(),MYDEBUG("medla_info",medal_info),init()}),e);return i()}))})();