mirror of
https://github.com/the1812/Bilibili-Evolved.git
synced 2025-11-04 21:22:45 +08:00
1 line
6.0 KiB
JavaScript
1 line
6.0 KiB
JavaScript
(()=>(e,t)=>{function i(e,t,i){if(t in e){Object.defineProperty(e,t,{value:i,enumerable:true,configurable:true,writable:true})}else{e[t]=i}return e}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:{medal_id:t,level:a,medal_name:s,wearing_status:r,is_lighted:n},anchor_info:{nick_name:c},room_info:{room_id:l}}=e;super(r===1,t);i(this,"level",void 0);i(this,"name",void 0);i(this,"upName",void 0);i(this,"roomID",void 0);i(this,"isLighted",void 0);this.level=a;this.name=s;this.upName=c;this.roomID=l;this.isLighted=n}static async getList(){return a.parseJson(await Ajax.getTextWithCredentials(`https://api.live.bilibili.com/xlive/app-ucenter/v1/fansMedal/panel?page=1&page_size=256&target_id=${getUID()}`),{successAction:e=>{var t,i;const a=((t=e.data.list)!==null&&t!==void 0?t:[]).concat((i=e.data.special_list)!==null&&i!==void 0?i:[]);return a.map((e=>new s(e)))},errorAction:()=>[],errorMessage:"无法获取勋章列表."})}static getContainer(){return document.querySelector("#medal-helper .medal-popup ul")}getItemTemplate(e){if(!e){e=this}const t={active:e.isActive,gray:!e.isLighted};const i=Object.entries(t).map((([e,t])=>t?e:"")).join(" ").trim();return`\n<li data-id='${e.id}' class='${i}'>\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.postTextWithCredentials(`https://api.live.bilibili.com/xlive/web-room/v1/fansMedal/wear`,formData({medal_id:this.id,csrf_token:getCsrf(),csrf: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/xlive/web-room/v1/fansMedal/take_off`,formData({csrf_token:getCsrf(),csrf:getCsrf()})),{successAction:()=>{this.isActive=false;return true},errorAction:()=>false,errorMessage:"卸下勋章失败."})}}class r extends a{constructor(e){const{id:t,cid:a,wear:s,css:n,name:c,source:l}=e;super(s,n);i(this,"tid",void 0);i(this,"cid",void 0);i(this,"name",void 0);i(this,"source",void 0);i(this,"imageUrl",void 0);this.tid=t;this.cid=a;this.name=c;this.source=l;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:()=>({}),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:"卸下头衔失败."})}}i(r,"imageMap",void 0);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()=>{t.applyImportantStyle("medalHelperStyle");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)}}}})(); |