// ==UserScript== // @name NGA Likes Support // @namespace https://greasyfork.org/users/263018 // @version 1.0.3 // @author snyssss // @description 显示被点赞和粉丝数量 // @match *://bbs.nga.cn/read.php?tid=* // @match *://ngabbs.com/read.php?tid=* // @match *://nga.178.com/read.php?tid=* // @noframes // @downloadURL none // ==/UserScript== ((ui) => { if (!ui) return; const hookFunction = (object, functionName, callback) => { ((originalFunction) => { object[functionName] = function () { const returnValue = originalFunction.apply(this, arguments); callback.apply(this, [returnValue, originalFunction, arguments]); return returnValue; }; })(object[functionName]); }; const queue = { waitingQueue: [], isRunning: false, execute: function (task) { task().finally(() => { if (this.waitingQueue.length) { const next = this.waitingQueue.shift(); this.execute(next); } else { this.isRunning = false; } }); }, enqueue: function (task) { if (this.isRunning) { this.waitingQueue.push(task); } else { this.isRunning = true; this.execute(task); } }, }; const cache = {}; const execute = (argid) => { queue.enqueue(async () => { const args = ui.postArg.data[argid]; if (args.comment) return; const uid = +args.pAid; if (uid > 0) { const anchor = ui.postArg.data[argid].uInfoC.querySelector("[name=uid]") .parentNode; const handleLikes = (res) => { const matches = res.match(/{"type":8,"data":(\d+)}/); const value = matches ? matches[1] : 0; const element = document.createElement("SPAN"); element.className = "small_colored_text_btn stxt block_txt_c2 vertmod"; element.innerHTML = ` ${value}`; anchor.append(element); }; const handleFollows = (res) => { const matches = res.match(/"follow_by_num":(\d+)/); const value = matches ? matches[1] : 0; if (value) { const element = document.createElement("SPAN"); element.className = "small_colored_text_btn stxt block_txt_c2 vertmod"; element.innerHTML = ` ${value}`; anchor.append(element); } }; if (cache[uid] === undefined) { cache[uid] = await fetch( `/nuke.php?__lib=ucp&__act=get&lite=js&uid=${uid}` ).then((res) => res.text()); } handleLikes(cache[uid]); handleFollows(cache[uid]); } }); }; hookFunction(ui, "postDisp", (returnValue, originalFunction, arguments) => execute(arguments[0]) ); Object.keys(ui.postArg.data).forEach((i) => execute(i)); })(commonui);