mirror of
https://github.com/the1812/Bilibili-Evolved.git
synced 2025-11-04 21:22:45 +08:00
1 line
5.3 KiB
JavaScript
1 line
5.3 KiB
JavaScript
(()=>{return(e,t)=>{const i=()=>{const e=document.URL.match(/live\.bilibili\.com\/(blanc\/)?(\d+)/);if(!e){return}const t=parseInt(e[2]);if(isNaN(t)){console.warn(`roomID not found`);return}return t};class a{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 s extends a{constructor(e){const{medal_id:t,status:i,level:a,medalName:s,uname:r,roomid:n}=e;super(i===1,t);this.level=a;this.name=s;this.upName=r;this.roomID=n}static async getList(){return a.parseJson(await Ajax.getTextWithCredentials("https://api.live.bilibili.com/i/api/medal?page=1&pageSize=256"),{successAction:e=>e.data.fansMedalList.map(e=>new s(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 a.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(){if(!this.isActive){return true}return a.parseJson(await Ajax.getTextWithCredentials(`https://api.live.bilibili.com/i/ajaxCancelWear`),{successAction:()=>{this.isActive=false;return true},errorAction:()=>false,errorMessage:"卸下勋章失败."})}}class r extends a{constructor(e){const{id:t,cid:i,wear:a,css:s,name:n,source:c}=e;super(a,s);this.tid=t;this.cid=i;this.name=n;this.source=c;r.getImageMap().then(e=>{this.imageUrl=e[this.id]})}static async getImageMap(){if(r.imageMap===undefined){return a.parseJson(await Ajax.getTextWithCredentials("https://api.live.bilibili.com/rc/v1/Title/webTitles"),{successAction(e){r.imageMap={};e.data.forEach(e=>{r.imageMap[e.identification]=e.web_pic_url});return r.imageMap},errorAction:()=>{return{}},errorMessage:"获取头衔图片失败."})}else{return r.imageMap}}static async getList(){return a.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 r(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 a.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 a.parseJson(await Ajax.postTextWithCredentials(`https://api.live.bilibili.com/i/ajaxCancelWearTitle`,`csrf=${getCsrf()}&csrf_token=${getCsrf()}`),{successAction:()=>{this.isActive=false;return true},errorAction:()=>false,errorMessage:"卸下头衔失败."})}}async function n(t,i){const a=t();const r=await i();const n=async()=>{const e=await i();e.forEach(e=>{const t=a.querySelector(`li[data-id='${e.id}']`);if(e.isActive){t.classList.add("active")}else{t.classList.remove("active")}t.querySelector(`input`).checked=e.isActive})};r.forEach(t=>{const i=t.getItemTemplate();a.insertAdjacentHTML("beforeend",i);const c=a.querySelector(`li[data-id='${t.id}']`);const l=c.querySelector(`input`);c.addEventListener("click",i=>{if(i.target===l){return}if(t.isActive){t.deactivate().then(n)}else{const i=r.find(e=>e.isActive);if(i){i.isActive=false}t.activate().then(()=>{if(t instanceof s){e.defaultMedalID=t.id}}).then(n)}})})}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 a=await s.getList();if(!e.defaultMedalID){const t=a.find(e=>e.isActive);if(t){e.defaultMedalID=t.id;console.log(`set defaultMedalID to activeMedal (${t.id})`)}}const r=e.defaultMedalID?a.find(t=>t.id===e.defaultMedalID):a.find(e=>e.isActive);const n=a.find(e=>e.roomID===i);if(!n){if(r){await r.activate();console.log(`no matchMedal, fallback to defaultMedal (${r.id})`)}}else{await n.activate();console.log(`activated matchMedal (${n.id})`)}})()}return{export:{Badge:a,Medal:s,Title:r},widget:{condition:()=>document.URL.startsWith("https://live.bilibili.com")&&Boolean(getUID()),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")}})});n(s.getContainer,s.getList);await r.getImageMap();n(r.getContainer,r.getList)}}}}})(); |