Bilibili-Evolved/min/medal-helper.min.js
2019-11-24 10:40:29 +08:00

1 line
5.0 KiB
JavaScript

(()=>{return(e,t)=>{class i{constructor(e=false,t=0){this.isActive=e;this.id=t}static parseJson(e,t){const i=JSON.parse(e);if(i.code!==0){logError(`${t.errorMessage} 错误码:${i.code} ${i.message||""}`);return t.errorAction(i)}return t.successAction(i)}}class a extends i{constructor(e){const{medal_id:t,status:i,level:a,medalName:s,uname:r,roomid:c}=e;super(i===1,t);this.level=a;this.name=s;this.upName=r;this.roomID=c}static async getList(){return i.parseJson(await Ajax.getTextWithCredentials("https://api.live.bilibili.com/i/api/medal?page=1&pageSize=256"),{successAction:e=>e.data.fansMedalList.map(e=>new a(e)),errorAction:()=>[],errorMessage:"无法获取勋章列表."})}static getContainer(){return document.querySelector("#medal-helper .medal-popup ul")}getItemTemplate(e){if(!e){e=this}return`\n<li data-id='${e.id}' ${e.isActive?"class='active'":""}>\n<label title='${e.upName}'>\n<input name='medal' type='radio' ${e.isActive?"checked":""}>\n<div class='fans-medal-item level-${e.level}'>\n<span class='label'>${e.name}</span>\n<span class='level'>${e.level}</span>\n</div>\n</label>\n</li>`}async activate(){if(this.isActive){return true}return i.parseJson(await Ajax.getTextWithCredentials(`https://api.live.bilibili.com/i/ajaxWearFansMedal?medal_id=${this.id}`),{successAction:()=>{this.isActive=true;if(!e.defaultMedalID){e.defaultMedalID=this.id}return true},errorAction:()=>false,errorMessage:"佩戴勋章失败."})}async deactivate(){if(!this.isActive){return true}return i.parseJson(await Ajax.getTextWithCredentials(`https://api.live.bilibili.com/i/ajaxCancelWear`),{successAction:()=>{this.isActive=false;return true},errorAction:()=>false,errorMessage:"卸下勋章失败."})}}class s extends i{constructor(e){const{id:t,cid:i,wear:a,css:r,name:c,source:n}=e;super(a,r);this.tid=t;this.cid=i;this.name=c;this.source=n;s.getImageMap().then(e=>{this.imageUrl=e[this.id]})}static async getImageMap(){if(s.imageMap===undefined){return i.parseJson(await Ajax.getTextWithCredentials("https://api.live.bilibili.com/rc/v1/Title/webTitles"),{successAction(e){s.imageMap={};e.data.forEach(e=>{s.imageMap[e.identification]=e.web_pic_url});return s.imageMap},errorAction:()=>{return{}},errorMessage:"获取头衔图片失败."})}else{return s.imageMap}}static async getList(){return i.parseJson(await Ajax.getTextWithCredentials("https://api.live.bilibili.com/i/api/ajaxTitleInfo?page=1&pageSize=256&had=1"),{successAction:e=>e.data.list.map(e=>new s(e)),errorAction:()=>[],errorMessage:"无法获取头衔列表."})}static getContainer(){return document.querySelector("#title-helper .medal-popup ul")}getItemTemplate(e){if(!e){e=this}return`\n<li data-id='${e.id}' ${e.isActive?"class='active'":""}>\n<label title='${e.name}'>\n<input name='medal' type='radio' ${e.isActive?"checked":""}>\n<img src='${e.imageUrl}' class="title-image">\n</label>\n</li>`}async activate(){if(this.isActive){return true}return i.parseJson(await Ajax.postTextWithCredentials(`https://api.live.bilibili.com/i/ajaxWearTitle`,`id=${this.tid}&cid=${this.cid}&csrf=${getCsrf()}&csrf_token=${getCsrf()}`),{successAction:()=>{this.isActive=true;return true},errorAction:()=>false,errorMessage:"佩戴头衔失败."})}async deactivate(){if(!this.isActive){return true}return i.parseJson(await Ajax.postTextWithCredentials(`https://api.live.bilibili.com/i/ajaxCancelWearTitle`,""),{successAction:()=>{this.isActive=false;return true},errorAction:()=>false,errorMessage:"卸下头衔失败."})}}async function r(e,t){const i=e();const a=await t();const s=async()=>{const e=await t();e.forEach(e=>{const t=i.querySelector(`li[data-id='${e.id}']`);if(e.isActive){t.classList.add("active")}else{t.classList.remove("active")}t.querySelector(`input`).checked=e.isActive})};a.forEach(e=>{const t=e.getItemTemplate();i.insertAdjacentHTML("beforeend",t);const r=i.querySelector(`li[data-id='${e.id}']`);const c=r.querySelector(`input`);r.addEventListener("click",t=>{if(t.target===c){return}if(e.isActive){e.deactivate().then(s)}else{const t=a.find(e=>e.isActive);if(t){t.isActive=false}e.activate().then(s)}})})}if(e.autoMatchMedal){(async()=>{const t=document.URL.match(/live\.bilibili\.com\/(\d+)/);if(!t){return}const i=parseInt(t[1]);if(isNaN(i)){console.warn(`roomID not found`);return}const s=await a.getList();if(!e.defaultMedalID){const t=s.find(e=>e.isActive);if(t){e.defaultMedalID=t.id;console.log(`set defaultMedalID to activeMedal (${t.id})`)}}const r=e.defaultMedalID?s.find(t=>t.id===e.defaultMedalID):s.find(e=>e.isActive);const c=s.find(e=>e.roomID===i);if(!c){if(r){await r.activate();console.log(`no matchMedal, fallback to defaultMedal (${r.id})`)}}else{await c.activate();console.log(`activated matchMedal (${c.id})`)}})()}return{export:{Badge:i,Medal:a,Title:s},widget:{condition:()=>document.domain==="live.bilibili.com",content:t.import("medalHelperHtml"),success:async()=>{document.querySelectorAll(".medal-helper").forEach(e=>{const t=e.querySelector(".medal-popup");e.addEventListener("click",e=>{if(!t.contains(e.target)){t.classList.toggle("opened")}})});r(a.getContainer,a.getList);await s.getImageMap();r(s.getContainer,s.getList)}}}}})();