Add restore floors

This commit is contained in:
the1812 2020-05-09 14:48:07 +08:00
parent 9702d56eb2
commit 8e4df2b51f
14 changed files with 150 additions and 22 deletions

View File

@ -474,6 +474,7 @@ declare global {
extendFeedsLive: boolean,
userImages: UserImage[],
playerOnTop: boolean,
restoreFloors: boolean,
latestVersionLink: string,
currentVersion: string,
}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -25,7 +25,7 @@
"collapse-live-side-bar.min.css": "22348786547D2D8DB659A306AF2E9C1F2050D66488778C71545AAEF785FD57E6",
"collapse-live-side-bar.min.js": "BB1B1CF157099A70F1AEA3F154C84D9CA1A84A29B5F6E42357CA9F51FFC4965C",
"combo-like.min.js": "368DA34768E947628099D258ED23BC5FFFCFFD25A47346E086C7975C8A52F997",
"comment.min.css": "2F358407BA8CCBE0489077260CC8ADDB8E3020E38794CEA3A65428B27FD9D28C",
"comment.min.css": "992AC8DD1DE7D99D35979E97A66E619820D1A28611275712B6CCBFDE4D99980C",
"comment.min.js": "64F7B6951861C25799C48BB1ABCF2A73F79BCBBFC1E9D3BD45EC1F16F94F6451",
"comment-dark.min.css": "E980508E86203743C36FEE4F7149BFF53961ECBC4EC140E8C162D18D395B940A",
"compact-layout.min.css": "CAC8B0DBA8E90B38D31F0811B7B469709052204AC36D5D3F20FE5D0899FDDCCB",
@ -54,12 +54,11 @@
"custom-navbar-watchlater-list.min.js": "57EA2C62F7442750BB177B9898CF07BA61C45F0FD99737516ED609051699B054",
"danmaku-converter.min.js": "6C844406F060DCF2483F9CC4C7329911ED77BC77097F2BC5B925B6F12C990820",
"dark.min.css": "4D77F3F4DDE158F6A3720D1A022F4B414434D883F742A561008DAF2DA41BAB95",
"dark.user.css": "BA65A754127DD385948507F571FDAE1BE4DB36044404159EB8A1B0C12545CBBE",
"dark.user.css": "C929577C0F19B6543EB7A7267A53BBD485ECDA96DB073A4713A59F2E4D535292",
"dark-color-scheme.min.js": "6D353AC738180317ACF9D2E046BFFBA0ACC0FA7A8D22B8E16C51127CDE4FE96B",
"dark-important.min.css": "9381B563726BCA701DD77C7AD572793538A45CB839F56008A55EE46821EA1B05",
"dark-navbar.min.css": "7FAD547E326B768904B3739C978DF86FFDDD5E5064FB8F490710D197CCC3018B",
"dark-schedule.min.js": "853C446547603F4F0425F19F09F73335C9EC451A790C1C07E5E5B88A09E9B453",
"dark-slice-9.min.css": "2A352B72A29CEF390AAF28DA20A72030D307BA530B388AED972D61C7FDDF2BB4",
"dark-styles.min.js": "74E6D655F88E50A27D60F189554F6656CCD2A6EA2686FD9946CA9A89EABF7719",
"debounce.min.js": "54D33E1273C1F3FE19550BF1844339C3D54D6B01DF8A39C3162D95B93B079CFA",
"default-danmaku-settings.min.css": "D9942B184FEDA7B08CFA0C34920E97D7A83B81762DCBF757642EBB60F95FF25D",
@ -172,6 +171,7 @@
"remove-top-mask.min.js": "A15C1EC10D2E1A61845B1ADAE51860553F96427059E10443B1E53FAF48F45304",
"remove-watermark.min.js": "5A63C694BB9E68EA9FDA394D61D227FA31A504E31783C62BF42AACC3FC78C8C4",
"reorder.min.js": "C52DEC9C8962AEC9E824913788BDACFCAB1E43356056658F884EE707508629D2",
"restore-floors.min.js": "1C3BC2FBE17EBFA3D13001D250FC134E765DA894A24E2F69B0C8848B1E14F7AD",
"screenshot.min.css": "6310BD2E77013EAAB38675DCD00761C2B7132C79A529B4FE25C8E86EC7E2F967",
"screenshot.min.js": "7EE9BF54C2297BDF1496A890677EB85AD972A05C566436D41F3DB51C8CCA1C71",
"scrollbar.min.css": "E17BDD4F223F7992A1AF279D7EBA58D9FBB51217F45964C79E30DC2ACBC15B46",

Binary file not shown.

2
min/comment.min.css vendored

File diff suppressed because one or more lines are too long

1
min/restore-floors.min.js vendored Normal file
View File

@ -0,0 +1 @@
(()=>{return(e,t)=>{var o;(function(e){e[e["Default"]=1]="Default";e[e["ByTime"]=2]="ByTime";e[e["ByLikes"]=3]="ByLikes"})(o||(o={}));const r=(e,t,r=1)=>{if(t===o.ByTime){return Ajax.getJson(`https://api.bilibili.com/x/v2/reply/main?oid=${e}&type=1&mode=${t}`)}return Ajax.getJson(`https://api.bilibili.com/x/v2/reply/main?oid=${e}&type=1&mode=${t}&next=${r}`)};const i=async e=>{if(document.URL.match(/\/\/www\.bilibili\.com\/(video|bangumi)/)){return await SpinQuery.select(()=>unsafeWindow.aid)}console.error("No oid extract method for current context.",e)};const n=async e=>{const t=await i(e);if(t===undefined){return}const n=dq(e,".hot-sort.on")!==null?o.ByLikes:o.ByTime;const s=parseInt(dq(e,".paging-box .current").textContent);const a=await r(t,n,s);if(a.code!==0){console.error("Comment API failed: ",a.message);return}const l=_.flatMap(_.get(a,"data.replies",[]),e=>{const t=[{id:e.rpid_str,floor:e.floor}];if(e.replies!==null){t.push(...e.replies.map(e=>{return{id:e.rpid_str,floor:e.floor}}))}return t});console.log(l);const c=dqa(e,".reply-wrap[data-id]");const d=c.map(e=>dq(e,".reply-wrap > .con > .info, .reply-wrap > .info"));c.forEach((e,t)=>{const o=e.getAttribute("data-id");const r=l.find(e=>e.id===o);if(r!==undefined){const e=d[t];if(e.getAttribute("data-restore-floor")===null){e.insertAdjacentHTML("afterbegin",`<span class="floor">#${r.floor}</span>`);e.setAttribute("data-restore-floor",r.floor.toString())}}})};const s=e=>{const t="comment-loading";if(Array.prototype.some.call(e.children,e=>e.classList.contains(t))){const o=Observer.childList(e,r=>{if(r.some(e=>{Array.prototype.some.call(e.removedNodes,e=>{return e.nodeType===Node.ELEMENT_NODE&&e.classList.contains(t)})})){o.stop();s(e)}})}else{if(e.getAttribute("data-restore-floor")===null){e.setAttribute("data-restore-floor","true");const t=dq(e,".comment-list");Observer.childList(t,_.debounce(t=>{console.log(t);n(e)},100))}}};fullyLoaded(()=>{if(document.URL.match(/\/\/www\.bilibili\.com\/(video|bangumi)/)){const e=_.debounce(()=>dqa(".bb-comment").forEach(e=>s(e)),200);Observer.childListSubtree(document.body,e)}})}})();

View File

@ -879,5 +879,11 @@ Resource.manifest = {
darkColorScheme: '夜间模式跟随系统',
},
},
restoreFloors: {
path: 'restore-floors.min.js',
displayNames: {
restoreFloors: '评论楼层显示',
},
},
}
export const resourceManifest = Resource.manifest

View File

@ -225,6 +225,7 @@ export const settings = {
extendFeedsLive: true,
userImages: [],
playerOnTop: false,
restoreFloors: false,
cache: {},
}
const fixedSettings = {

View File

@ -1,6 +1,7 @@
@mixin orders {
display: flex;
.floor {
opacity: 0.7;
order: 1;
}
.reply {

View File

@ -132,6 +132,7 @@
<checkbox indent="0" key="seedsToCoins" dependencies=""></checkbox>
<checkbox indent="0" key="selectableColumnText" dependencies=""></checkbox>
<checkbox indent="0" key="urlParamsClean" dependencies=""></checkbox>
<!-- <checkbox indent="0" key="restoreFloors" dependencies=""></checkbox> -->
<category icon="touch">触摸</category>
<checkbox indent="0" key="touchNavBar" dependencies=""></checkbox>
<checkbox indent="0" key="comboLike" dependencies=""></checkbox>

View File

@ -0,0 +1,89 @@
enum CommentSortOrder {
Default = 1,
ByTime,
ByLikes,
}
const getComments = (oid: number | string, mode: CommentSortOrder, page = 1) => {
if (mode === CommentSortOrder.ByTime) {
return Ajax.getJson(`https://api.bilibili.com/x/v2/reply/main?oid=${oid}&type=1&mode=${mode}`)
}
return Ajax.getJson(`https://api.bilibili.com/x/v2/reply/main?oid=${oid}&type=1&mode=${mode}&next=${page}`)
}
const getOid = async (commentContainer: HTMLElement) => {
if (document.URL.match(/\/\/www\.bilibili\.com\/(video|bangumi)/)) {
return await SpinQuery.select(() => unsafeWindow.aid)
}
console.error('No oid extract method for current context.', commentContainer)
}
const restore = async (commentContainer: HTMLElement) => {
const oid = await getOid(commentContainer)
if (oid === undefined) {
return
}
const mode = dq(commentContainer, '.hot-sort.on') !== null ? CommentSortOrder.ByLikes : CommentSortOrder.ByTime
const page = parseInt((dq(commentContainer, '.paging-box .current') as HTMLElement).textContent!)
const json = await getComments(oid, mode, page)
if (json.code !== 0) {
console.error('Comment API failed: ', json.message)
return
}
const replies: { id: string; floor: number }[] = _.flatMap(_.get(json, 'data.replies', []), item => {
const result = [{
id: item.rpid_str,
floor: item.floor,
}]
if (item.replies !== null) {
result.push(...item.replies.map((it: any) => {
return {
id: it.rpid_str,
floor: it.floor,
}
}))
}
return result
})
console.log(replies)
const commentItems = dqa(commentContainer, '.reply-wrap[data-id]')
const commentInfos = commentItems.map(item => dq(item, '.reply-wrap > .con > .info, .reply-wrap > .info') as HTMLElement)
commentItems.forEach((item, index) => {
const id = item.getAttribute('data-id') as string
const reply = replies.find(r => r.id === id)
if (reply !== undefined) {
const info = commentInfos[index]
if (info.getAttribute('data-restore-floor') === null) {
info.insertAdjacentHTML('afterbegin', /*html*/`<span class="floor">#${reply.floor}</span>`)
info.setAttribute('data-restore-floor', reply.floor.toString())
}
}
})
}
const prepareRestore = (commentContainer: HTMLElement) => {
const commentLoading = 'comment-loading'
if (Array.prototype.some.call(commentContainer.children, (it: HTMLElement) => it.classList.contains(commentLoading))) {
const observer = Observer.childList(commentContainer, records => {
if (records.some(r => {
Array.prototype.some.call(r.removedNodes, (node: Node) => {
return node.nodeType === Node.ELEMENT_NODE && (node as HTMLElement).classList.contains(commentLoading)
})
})) {
observer.stop()
prepareRestore(commentContainer)
}
})
} else {
if (commentContainer.getAttribute('data-restore-floor') === null) {
commentContainer.setAttribute('data-restore-floor', 'true')
const list = dq(commentContainer, '.comment-list') as HTMLElement
Observer.childList(list, _.debounce(records => {
console.log(records)
restore(commentContainer)
}, 100))
}
}
}
fullyLoaded(() => {
if (document.URL.match(/\/\/www\.bilibili\.com\/(video|bangumi)/)) {
const callback = _.debounce(() => dqa('.bb-comment').forEach(it => prepareRestore(it as HTMLElement)), 200)
Observer.childListSubtree(document.body, callback)
}
})