NGA Auto Pager V2

NGA自动翻页插件

// ==UserScript==
// @name        NGA Auto Pager V2
// @version     2.40
// @description NGA自动翻页插件
// @match *://bbs.nga.cn/read.php*
// @match *://bbs.nga.cn/thread.php*
// @match *://bbs.nga.cn/wow*
// @match *://bbs.nga.cn/it*
// @match *://bbs.nga.cn/auto*
// @match *://bbs.nga.cn/ink*
// @match *://bbs.nga.cn/ng2*
// @match *://bbs.nga.cn/play*
// @match *://bbs.nga.cn/tvgame*
// @match *://bbs.nga.cn/wa2*
// @match *://bbs.nga.cn/ccq*
// @match *://bbs.nga.cn/gw2*
// @match *://bbs.nga.cn/bns*
// @match *://bbs.nga.cn/heroes*
// @match *://bbs.nga.cn/lol*
// @match *://bbs.nga.cn/hs*
// @match *://bbs.nga.cn/wot*
// @match *://bbs.nga.cn/jx3*
// @match *://bbs.nga.cn/coc*
// @match *://bbs.nga.cn/pad*
// @match *://bbs.nga.cn/d3*
// @match *://bbs.nga.cn/dota*
// @match *://bbs.nga.cn/wt*
// @match *://bbs.nga.cn/ff14*
// @match *://bbs.nga.cn/poi*
// @match *://bbs.nga.cn/gta*
// @match *://bbs.nga.cn/sc*
// @match *://bbs.nga.cn/fn*
// @match *://bbs.nga.cn/ow*
// @match *://bbs.nga.cn/cr*
// @match *://bbs.nga.cn/king*
// @match *://nga.178.com/read.php*
// @match *://nga.178.com/thread.php*
// @match *://nga.178.com/wow*
// @match *://nga.178.com/it*
// @match *://nga.178.com/auto*
// @match *://nga.178.com/ink*
// @match *://nga.178.com/ng2*
// @match *://nga.178.com/play*
// @match *://nga.178.com/tvgame*
// @match *://nga.178.com/wa2*
// @match *://nga.178.com/ccq*
// @match *://nga.178.com/gw2*
// @match *://nga.178.com/bns*
// @match *://nga.178.com/heroes*
// @match *://nga.178.com/lol*
// @match *://nga.178.com/hs*
// @match *://nga.178.com/wot*
// @match *://nga.178.com/jx3*
// @match *://nga.178.com/coc*
// @match *://nga.178.com/pad*
// @match *://nga.178.com/d3*
// @match *://nga.178.com/dota*
// @match *://nga.178.com/wt*
// @match *://nga.178.com/ff14*
// @match *://nga.178.com/poi*
// @match *://nga.178.com/gta*
// @match *://nga.178.com/sc*
// @match *://nga.178.com/fn*
// @match *://nga.178.com/ow*
// @match *://nga.178.com/cr*
// @match *://nga.178.com/king*
// @match *://ngabbs.com/read.php*
// @match *://ngabbs.com/thread.php*
// @match *://ngabbs.com/wow*
// @match *://ngabbs.com/it*
// @match *://ngabbs.com/auto*
// @match *://ngabbs.com/ink*
// @match *://ngabbs.com/ng2*
// @match *://ngabbs.com/play*
// @match *://ngabbs.com/tvgame*
// @match *://ngabbs.com/wa2*
// @match *://ngabbs.com/ccq*
// @match *://ngabbs.com/gw2*
// @match *://ngabbs.com/bns*
// @match *://ngabbs.com/heroes*
// @match *://ngabbs.com/lol*
// @match *://ngabbs.com/hs*
// @match *://ngabbs.com/wot*
// @match *://ngabbs.com/jx3*
// @match *://ngabbs.com/coc*
// @match *://ngabbs.com/pad*
// @match *://ngabbs.com/d3*
// @match *://ngabbs.com/dota*
// @match *://ngabbs.com/wt*
// @match *://ngabbs.com/ff14*
// @match *://ngabbs.com/poi*
// @match *://ngabbs.com/gta*
// @match *://ngabbs.com/sc*
// @match *://ngabbs.com/fn*
// @match *://ngabbs.com/ow*
// @match *://ngabbs.com/cr*
// @match *://ngabbs.com/king*
// @match *://bbs.ngacn.cc/read.php*
// @match *://bbs.ngacn.cc/thread.php*
// @match *://bbs.ngacn.cc/wow*
// @match *://bbs.ngacn.cc/it*
// @match *://bbs.ngacn.cc/auto*
// @match *://bbs.ngacn.cc/ink*
// @match *://bbs.ngacn.cc/ng2*
// @match *://bbs.ngacn.cc/play*
// @match *://bbs.ngacn.cc/tvgame*
// @match *://bbs.ngacn.cc/wa2*
// @match *://bbs.ngacn.cc/ccq*
// @match *://bbs.ngacn.cc/gw2*
// @match *://bbs.ngacn.cc/bns*
// @match *://bbs.ngacn.cc/heroes*
// @match *://bbs.ngacn.cc/lol*
// @match *://bbs.ngacn.cc/hs*
// @match *://bbs.ngacn.cc/wot*
// @match *://bbs.ngacn.cc/jx3*
// @match *://bbs.ngacn.cc/coc*
// @match *://bbs.ngacn.cc/pad*
// @match *://bbs.ngacn.cc/d3*
// @match *://bbs.ngacn.cc/dota*
// @match *://bbs.ngacn.cc/wt*
// @match *://bbs.ngacn.cc/ff14*
// @match *://bbs.ngacn.cc/poi*
// @match *://bbs.ngacn.cc/gta*
// @match *://bbs.ngacn.cc/sc*
// @match *://bbs.ngacn.cc/fn*
// @match *://bbs.ngacn.cc/ow*
// @match *://bbs.ngacn.cc/cr*
// @match *://bbs.ngacn.cc/king*
// @author      Sunness
// @namespace https://greasyfork.org/users/63731
// @license GPL-3.0-or-later
// ==/UserScript==

const snackbar_css=document.createElement("style");snackbar_css.innerHTML="#snackbar{visibility:hidden;padding:12px;right:50px;bottom:30px;background-color:#333;color:#fff;text-align:center;border-radius:6px;position:fixed}#snackbar.show{visibility:visible;-webkit-animation:fadein .5s,fadeout .5s 2.5s;animation:fadein .5s,fadeout .5s 2.5s}@-webkit-keyframes fadein{from{bottom:0;opacity:0}to{bottom:30px;opacity:1}}@keyframes fadein{from{bottom:0;opacity:0}to{bottom:30px;opacity:1}}@-webkit-keyframes fadeout{from{bottom:30px;opacity:1}to{bottom:0;opacity:0}}@keyframes fadeout{from{bottom:30px;opacity:1}to{bottom:0;opacity:0}}";const snackbar=document.createElement("div");snackbar.setAttribute("id","snackbar"),document.body.appendChild(snackbar_css),document.body.appendChild(snackbar);const backToTop=document.createElement("a");backToTop.setAttribute("id","btt"),backToTop.setAttribute("href","#");const reply=document.createElement("a");reply.setAttribute("id","quick_reply"),reply.setAttribute("href","#"),reply.innerText="回";const next=document.createElement("a");next.setAttribute("id","next_post"),next.setAttribute("href","#");const bar=document.createElement("div");bar.setAttribute("id","pager_bar");const bar_css=document.createElement("style");bar_css.innerHTML="#pager_bar{display:flex;position:fixed;right:32px;bottom:72px;justify-content:space-evenly}#pager_bar a{margin-left:1px;visibility:hidden;background-color:#333;color:#fff;text-align:center;border-radius:6px;padding:8px;width:16px;height:16px;text-decoration:none;user-select:none}#pager_bar a:hover{color:#FFF;opacity:0.8}#pager_bar .show{visibility:visible}#btt{background:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAOVBMVEUAAAD///////////////////////////////////////////////////////////////////////8KOjVvAAAAEnRSTlMACLXDHg3y7rc5MeTc2jP2zT4cRXegAAAAVklEQVQY052NSxKAIAxDA4h8FNTc/7CWjnZ0qdl03mszxe84792byadxmZJsJgbyMnbPbeFo2X4u0yojRGPgNn7wAYjRFnpiqoCaxtSB2pTV7EW/4FtO+dIEDwMelUIAAAAASUVORK5CYII=') center 50% no-repeat #333}#next_post{background:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAAAs0lEQVQ4jc3Ru2oCURSF4cH7c9hF3yFFMq15RS9DOiEREh9HsEmElOKg1ZfCC5PNDGoKcZVr//8+sE+S3E3QvoKtxeIZP3i6QH7AAumxSLGxz+Y0KJd7+D6wOdIEn/5mjccSuYtlYD8StDELgy0GBbmPVWBmaB2BFt4DsMNLhfx2kguvdDAPYI6v0M3RqTpSE1PVeUX93DfVkZXI2Vk5LJkU5PHFclgywvBqubCk8W/5ZvkFc4xr+hcT/FsAAAAASUVORK5CYII=') center 50% no-repeat #333}.fast_reply{position:fixed;left:33vw;top:25vh;background:#fff0cd;box-shadow:0 0 16px #403c33;border-radius:6px}",bar.appendChild(next),bar.appendChild(reply),bar.appendChild(backToTop),document.body.appendChild(bar_css),document.body.appendChild(bar);const toast=t=>{snackbar.innerHTML=t,snackbar.className="show",setTimeout(()=>{snackbar.className=""},3e3)},fast_post=$("fast_post_c"),old_post_btn=document.querySelector("#fast_post_c a.uitxt1"),subject=document.querySelector("#fast_post_c .row1 .c2 input"),content=document.querySelector("#fast_post_c .row1 .c2 textarea");if(null!=old_post_btn){const t=old_post_btn.cloneNode(!0);reply.addEventListener("click",e=>{e.preventDefault(),0===fast_post.className.length?(fast_post.className="fast_reply",old_post_btn.parentNode.replaceChild(t,old_post_btn)):(t.parentNode.replaceChild(old_post_btn,t),fast_post.className="")}),t.addEventListener("click",e=>{e.preventDefault(),commonui.newPost(t,postfunc.__REPLY_BLANK,window.__CURRENT_F_BIT,window.__CURRENT_FID,window.__CURRENT_TID,0,null,subject.value,content.value),reply.click(),toast("正在回复")})}else document.querySelector("a.rep.uitxt1")&&reply.setAttribute("href",document.querySelector("a.rep.uitxt1").href);const threshold=3e3,topPosition=Math.round(($("topicrows")||$("m_posts")).getBoundingClientRect().top+window.scrollY);let exist=!1,running=!1,opt=2,post=0,posts=document.querySelectorAll(".postbox"),ip=1,backing=!1,thread=!1,lastScrollTop=window.pageYOffset|window.document.scrollTop;for(const t of posts)document.documentElement.scrollTop>t.getBoundingClientRect().top+window.scrollY&&post++;"undefined"!=typeof __PAGE&&(ip=__PAGE[2],opt=0===__PAGE[0].indexOf("/read")?2:1026,exist=null!==document.querySelector("a.uitxt1[title=加载下一页]")),2===opt&&(thread=!0,next.className="show"),backToTop.addEventListener("click",t=>{t.preventDefault(),window.scrollTo({top:topPosition,left:0,behavior:"smooth"}),backing=!0}),next.addEventListener("click",t=>{t.preventDefault(),window.scrollTo({top:posts[post].getBoundingClientRect().top+window.scrollY,left:0,behavior:"smooth"}),posts.length>post+1&&post++});const fr=new FileReader,load=()=>{const data=pr(fr.result,opt),c=data[1].match(/\s*<tbody/)?_$("/table"):_$("/span"),pb=document.getElementsByName("pageball"),iPc=$("m_posts_c")||$("topicrows");eval(data[0]),c.innerHTML=data[1],c.childNodes.forEach(t=>{(1024&opt&&"TBODY"==t.nodeName||"forumbox postbox"==t.className)&&iPc.insertBefore(t,null)}),data[2].forEach(d=>eval(d)),__PAGE[2]++,commonui.pageBtn(pb[0],{0:__PAGE[0],1:__PAGE[1],2:ip,3:__PAGE[3]},20),commonui.pageBtn(pb[1],{0:__PAGE[0],1:__PAGE[1],2:__PAGE[2],3:__PAGE[3]},10),running=!1,posts=document.querySelectorAll(".postbox")};fr.addEventListener("loadend",load);const asyncFunc=t=>()=>{try{t()}catch(t){console.error("NGA Autopager V2",t)}},scroll=async()=>{const t=window.pageYOffset||window.document.scrollTop;if(thread&&(t>lastScrollTop?t>posts[post].getBoundingClientRect().top+window.scrollY&&posts.length>post+1&&post++:post>0&&t<posts[post-1].getBoundingClientRect().top+window.scrollY&&post>1&&post--,lastScrollTop=t),backing&&Math.abs(t-topPosition)<2&&(post=1,backing=!1),t<1e3?(backToTop.className="",thread&&(reply.className="",0!==fast_post.className.length&&reply.click())):(backToTop.className="show",thread&&(reply.className="show")),navigator.onLine&&exist&&!running&&document.documentElement.scrollHeight-t<threshold){if(running=!0,null!==document.querySelector("a.uitxt1[title=加载下一页]")){toast(`正在加载第${__PAGE[2]+1}页`);try{const t=await fetch(`${__PAGE[0]}&page=${__PAGE[2]+1}`);fr.readAsText(await t.blob(),"gbk")}catch(t){console.error("NGA Autopager V2",t),toast("加载错误")}}else exist=!1}};window.addEventListener("scroll",asyncFunc(scroll));