Bilibili-Evolved/min/medal-helper.min.js
2019-03-24 11:44:28 +08:00

1 line
4.4 KiB
JavaScript

(()=>{return(e,t)=>{class i{constructor(e,t){this.isActive=e;this.id=t}static parseJson(e,{successAction:t,errorMessage:i,errorAction:a}){const s=JSON.parse(e);if(s.code!==0){logError(`${i} 错误码:${s.code} ${s.message||""}`);return a(s)}return t(s)}}class a extends i{constructor({medal_id:e,status:t,level:i,medalName:a,uname:s}){super(t===1,e);this.level=i;this.name=a;this.upName=s}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")}static getItemTemplate(e){return`<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(){return i.parseJson(await Ajax.getTextWithCredentials(`https://api.live.bilibili.com/i/ajaxWearFansMedal?medal_id=${this.id}`),{successAction:()=>{this.isActive=true;return true},errorAction:()=>false,errorMessage:"佩戴勋章失败."})}async deactivate(){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({id:e,cid:t,wear:i,css:a,name:r,source:c}){super(i,a);this.tid=e;this.cid=t;this.name=r;this.source=c;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")}static getItemTemplate(e){return`<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(){return i.parseJson(await Ajax.postTextWithCredentials(`https://api.live.bilibili.com/i/ajaxWearTitle`,`id=${this.tid}&cid=${this.cid}`),{successAction:()=>{this.isActive=true;return true},errorAction:()=>false,errorMessage:"佩戴头衔失败."})}async deactivate(){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){const t=e.getContainer();const i=await e.getList();const a=async()=>{const i=await e.getList();i.forEach(e=>{const i=t.querySelector(`li[data-id='${e.id}']`);if(e.isActive){i.classList.add("active")}else{i.classList.remove("active")}i.querySelector(`input`).checked=e.isActive})};i.forEach(s=>{const r=e.getItemTemplate(s);t.insertAdjacentHTML("beforeend",r);const c=t.querySelector(`li[data-id='${s.id}']`);const n=c.querySelector(`input`);c.addEventListener("click",e=>{if(e.target===n){return}if(s.isActive){s.deactivate().then(a)}else{const e=i.find(e=>e.isActive);if(e){e.isActive=false}s.activate().then(a)}})})}return{export:{Badge:i,Medal:a,Title:s},widget:{condition:()=>document.domain==="live.bilibili.com",content:(t.data.medalHelperDom||t.data.medalHelperHtml).text,success:()=>{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);s.getImageMap().then(()=>r(s))}}}}})();