// ==UserScript== // @name HiNativeTool // @name:en HiNativeTool // @namespace http://tampermonkey.net/ // @version 1.2.96 // @description Handy Hinative tool!! // @description:en Handy Hinative tool!! // @author Collen Zhou // @match *://hinative.com/* // @grant unsafeWindow // @grant GM_getValue // @grant GM_setValue // @grant GM_listValues // @grant GM_xmlhttpRequest // @grant unsafeWindow // @require http://code.jquery.com/jquery-3.4.1.min.js // @downloadURL none // ==/UserScript== //The file is auto created with script, changes might get lost! (function() { 'use strict';/*this is generated code don't edit*/ console.log("Hinative tool is running!") window. gm_get = GM_getValue window. gm_set = GM_setValue function toggle_setting(){ let visible=$('#popup').is(':visible') var pop_up=$(window.popuphtml) if(visible) pop_up.hide() else{ pop_up.show() } $('#popup').replaceWith(pop_up) setup_popup() } let s=$("
  • ") let ts=$("⚙️") ts.click(toggle_setting) s.append(ts) $(".nav_activity").after(s) window. TMStorage = function () { } //添加TM支持 TMStorage.prototype = { get: function (keys, callback) { let count = 0;/*this is generated code don't edit*/ let sum = keys.length let obj = {} for (let key of keys) { let key1 = key window. result = gm_get(key1) if (result == "undefined") { continue } else { obj[key1] = gm_get(key1) } } callback(obj) }, set: function (obj1, callback) { let count = 0;/*this is generated code don't edit*/ let sum = Object.keys(obj1).length let obj = obj1 for (const key in obj) { if (obj.hasOwnProperty(key)) { const value = obj[key];/*this is generated code don't edit*/ gm_set(key, value) } } if (typeof callback === "undefined") return else { callback(obj) } } } TMStorage.prototype.constructor = TMStorage window. Mode = function () { } Mode.prototype = { Mode: null, Storage: null, OnInstalled: function (callback) { }, OnPageUpdate: function (callback) { }, ExecuteScript: function (script, callback) { }, unsafeWindow:window } Mode.prototype.constructor = Mode //添加TM支持 window. TMMode = function () { Mode.call(this) this.Mode = "TM" this.Storage = new TMStorage() this.unsafeWindow=unsafeWindow this.OnPageUpdated = function (callback) { callback.call(this) } this.ExecuteScript = function (obj, callback) { eval(obj.code) callback.call(this) } } TMMode.prototype = new Mode() TMMode.prototype.constructor = new TMMode() window. ExtensionMode = function () { Mode.call(this) this.Mode = "extension" this.Storage = chrome.storage.local this.OnPageUpdated = function (callback) { chrome.tabs.onUpdated.addListener(callback) } this.OnInstalled = function (callback) { chrome.runtime.onInstalled.addListener(callback) } this.ExecuteScript = function (script, callback) { chrome.tabs.executeScript(script, callback) } } ExtensionMode.prototype = new Mode() ExtensionMode.prototype.constructor = ExtensionMode window. mode = new TMMode() window. storage = mode.Storage function log(obj) { if (show_log) console.log(obj) } //执行一个字典里所有的脚本,并在所有脚本都执行完后调用resolve function preload(dict) { let len = Object.keys(dict).length let count = 0;/*this is generated code don't edit*/ return new Promise(resolve=>{ for (let key in dict) { if (dict.hasOwnProperty(key)) { let val = dict[key];/*this is generated code don't edit*/ let key1 = key add_script_value(key1, val).then(function () { if (++count == len) { resolve() } }) } } }) } //添加一个页面变量值,如果不存在则创建并设置默认值 function add_script_value(key1, dflt1) { let key = key1 let dflt = dflt1 return new Promise(resolve => { storage.get([key], function (result) { if (typeof result[key] === "undefined") { let obj = {} obj[key] = dflt result[key] = dflt log("undefined key:"+key) storage.set(obj) } set_variable(key,result[key]).then(function () { resolve() });/*this is generated code don't edit*/ });/*this is generated code don't edit*/ }) } function set_variable(key,value) { let code = "window."+key + ' = ' +JSON.stringify(value) return execute_script(code);/*this is generated code don't edit*/ } //执行一个脚本返回resolve function execute_script(script) { let script1=script return new Promise(resolve=>{ mode.ExecuteScript({ code: script1 },()=>{ let e=chrome.runtime.lastError resolve() }) }) } // Copyright 2018 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. 'use strict';/*this is generated code don't edit*/ mode.OnInstalled(function () { //添加popup chrome.declarativeContent.onPageChanged.removeRules(undefined, function () { chrome.declarativeContent.onPageChanged.addRules([{ conditions: [new chrome.declarativeContent.PageStateMatcher({ pageUrl: { hostEquals: 'hinative.com' }, }) ], actions: [new chrome.declarativeContent.ShowPageAction()] }]);/*this is generated code don't edit*/ });/*this is generated code don't edit*/ }) // execute_script("window.need_featured_answer=true") mode.OnPageUpdated(function (tabId, changeInfo, tab) { execute_script("window.data_loaded=false") //在这里初始化变量 let obj={ "show_log": false, "extension_enabled": true, "auto_block": false, "need_featured_answer": true, "cache_new_users": false, "block_rate_below": 0.3, "validity_duration": 7, "blocked_users": [], "result_buffer": {}, "white_list": [], "self_name":(()=>{})(), "self_url":(()=>{})(), "questions_info":{}, "request_interval":200, "fap_count":2, "old_question_age":7, "rearrange":true, "questions_info":{}, "languages":{}, "selected_languages":[], } //数据加载完后添加全局变量data_loaded preload(obj).then(function(){ // alert("preloaded") execute_script("window.data_loaded=true") }) $.ajaxSetup({ crossDomain: true, xhrFields: { withCredentials: true } });/*this is generated code don't edit*/ }) $(document).ready(function () { // https://hinative.com/en-US 只监听qeustions路径 if (!window.location.pathname.match(/^\/[^\/]*$/)) return;/*this is generated code don't edit*/ //缓存的结果,减少xhr次数 // result_buffer //数据是否加载完 // data_loaded = false //用来填充的个数 //被屏蔽的用户列表 // blocked_users = [] //现在是否正在blocking过程中 window.blocking = false;/*this is generated code don't edit*/ //新用户最大提问数 window.new_user_qustion_count = 3;/*this is generated code don't edit*/ //自动屏蔽的用户数组 window.auto_blocked_users = [];/*this is generated code don't edit*/ //已经被屏蔽的问题块 window.blocked_blocks = new Set();/*this is generated code don't edit*/ //已经用于填充的问题块数 window.filling_blocks_count = 0;/*this is generated code don't edit*/ //存放请求的队列 window.request_queue = [];/*this is generated code don't edit*/ window.appending = false;/*this is generated code don't edit*/ window.only_answered = $("input[data-questions-not-answered-only]").is( ":checked" );/*this is generated code don't edit*/ //请求最小间隔,以免给hinative服务器造成负担 // request_interval //开启请求循环 start_request_interval();/*this is generated code don't edit*/ get_info();/*this is generated code don't edit*/ window.first_loaded = true;/*this is generated code don't edit*/ //监听blocks变化 setInterval(() => { if ( !(typeof data_loaded === "undefined") && data_loaded && extension_enabled ) { process_multilanguage();/*this is generated code don't edit*/ process_blocking();/*this is generated code don't edit*/ process_scroll();/*this is generated code don't edit*/ let dqf = $(".body[data-questions-feed]");/*this is generated code don't edit*/ var sorted = dqf.find(".d_block").sort(function (a, b) { return ( new Date($(b).find(".timeago").attr("title")).getTime() - new Date($(a).find(".timeago").attr("title")).getTime() );/*this is generated code don't edit*/ });/*this is generated code don't edit*/ var arr = dqf.find(".d_block").toArray();/*this is generated code don't edit*/ var equal = true;/*this is generated code don't edit*/ for (let i = 0; i < sorted.length; i++) { const a = sorted[i];/*this is generated code don't edit*/ const b = arr[i];/*this is generated code don't edit*/ if (a !== b) { equal = false;/*this is generated code don't edit*/ break;/*this is generated code don't edit*/ } } if (!equal) { sorted.prependTo(dqf);/*this is generated code don't edit*/ $("#time_line").remove();/*this is generated code don't edit*/ for (const ele of sorted) { //七天前的消息线 if ( $("#time_line").length == 0 && $(".body[data-questions-feed]").has(ele) && new Date().getTime() - new Date(jq_must_find(ele, ".timeago").get(0).title).getTime() > 86400 * 1000 * validity_duration ) { window.time_line = $( "
    接下来是" + validity_duration + "天前的消息
    " );/*this is generated code don't edit*/ $(ele).before(time_line);/*this is generated code don't edit*/ } } } } }, 200);/*this is generated code don't edit*/ if (rearrange) { $("main").append( "
    如果需要新的提问,请下滑刷新~~
    scroll down to refresh
    " );/*this is generated code don't edit*/ $(".l_sidebar_container").remove();/*this is generated code don't edit*/ let q = $( "
  • " );/*this is generated code don't edit*/ let a = $( "
  • 💡
  • " );/*this is generated code don't edit*/ $(".nav_activity").after(q);/*this is generated code don't edit*/ $(".nav_activity").after(a);/*this is generated code don't edit*/ } //每三分钟不活动刷新一次 var timeout;/*this is generated code don't edit*/ document.onmousemove = function () { clearTimeout(timeout);/*this is generated code don't edit*/ timeout = setTimeout(function () { location.reload();/*this is generated code don't edit*/ }, 60 * 1000 * 3);/*this is generated code don't edit*/ };/*this is generated code don't edit*/ });/*this is generated code don't edit*/ function process_multilanguage() { if (first_loaded && $("li[data-next-page]>a").length > 0) { intercept();/*this is generated code don't edit*/ get_questions().remove();/*this is generated code don't edit*/ $("li[data-next-page]>a").attr( "href", $("li[data-next-page]>a") .get(0) .href.replace(/page=\d+/g, "page=1") );/*this is generated code don't edit*/ first_loaded = false;/*this is generated code don't edit*/ } } //拦截请求,并添加请求 function intercept() { let origin = XMLHttpRequest.prototype.open;/*this is generated code don't edit*/ XMLHttpRequest.prototype.open = function (...args) { let url = args[1];/*this is generated code don't edit*/ this.__url = url;/*this is generated code don't edit*/ return origin.apply(this, args);/*this is generated code don't edit*/ };/*this is generated code don't edit*/ var accessor = Object.getOwnPropertyDescriptor( XMLHttpRequest.prototype, "response" );/*this is generated code don't edit*/ Object.defineProperty(XMLHttpRequest.prototype, "response", { get: function () { let response = accessor.get.call(this);/*this is generated code don't edit*/ if ( typeof this.__auto === "undefined" && this.__url.indexOf("questions?") > 0 ) { window.appending = true;/*this is generated code don't edit*/ let url = this.__url.split("?")[0];/*this is generated code don't edit*/ let params = this.__url.split("?")[1];/*this is generated code don't edit*/ let page = params.match(/(?<=page=)\d+/)[0];/*this is generated code don't edit*/ let lang_id = params.match(/(?<=language_id=)\d+/)[0];/*this is generated code don't edit*/ let append = "";/*this is generated code don't edit*/ for (const lang of selected_languages) { if (lang == lang_id) continue;/*this is generated code don't edit*/ let url1 = url + "?language_id=" + lang + "&page=" + page;/*this is generated code don't edit*/ console.log("appended request:" + url1);/*this is generated code don't edit*/ let req = request_get(url1, null, false, true);/*this is generated code don't edit*/ append = append + req.responseText;/*this is generated code don't edit*/ } let apd = to_jq(append);/*this is generated code don't edit*/ apd.find(".hide").remove();/*this is generated code don't edit*/ $(response.body).append(apd);/*this is generated code don't edit*/ apd = $(response.body);/*this is generated code don't edit*/ //把已经回答的问题去掉 if (only_answered) { jq_must_find(apd, ".d_block").each(function () { let no_anser = $(this).find(".has_no_answer");/*this is generated code don't edit*/ if (no_anser.length == 0) { $(this).remove();/*this is generated code don't edit*/ } });/*this is generated code don't edit*/ } window.appending = false;/*this is generated code don't edit*/ } return response;/*this is generated code don't edit*/ }, set: function (str) { return accessor.set.call(this, str);/*this is generated code don't edit*/ }, configurable: true, });/*this is generated code don't edit*/ } //自动下拉以刷新提问 function process_scroll() { if (window.appending == true) return;/*this is generated code don't edit*/ if (typeof scroll_bar === "undefined") { window.scroll_bar = $( "
    " );/*this is generated code don't edit*/ $("body").append(scroll_bar);/*this is generated code don't edit*/ } let bh = scroll_bar.css("height").replace("px", "");/*this is generated code don't edit*/ var remain = window.innerHeight - ($("html").get(0).getClientRects()[0].height - bh);/*this is generated code don't edit*/ if (remain > 0) { let tmp = $("html").get(0).scrollTop;/*this is generated code don't edit*/ console.log("scroll");/*this is generated code don't edit*/ $("html").get(0).scrollTop = 0;/*this is generated code don't edit*/ $("html").get(0).scrollTop = $("html").get(0).scrollHeight;/*this is generated code don't edit*/ $("html").get(0).scrollTop = tmp;/*this is generated code don't edit*/ } scroll_bar.css("height", new Number(remain) + 100);/*this is generated code don't edit*/ } //获得所有问题块 function get_questions() { return $(".d_block");/*this is generated code don't edit*/ } function get_info() { //得到自身信息 (function get_self_username() { if (typeof self_name === "undefined") { let p_url = $(".spec_nav_profile>a").get(0).href;/*this is generated code don't edit*/ let req = request_get(p_url, null, false);/*this is generated code don't edit*/ let name = to_jq(req.responseText).find(".owner_name>span").text().trim();/*this is generated code don't edit*/ storage.set({ self_name: name, });/*this is generated code don't edit*/ storage.set({ self_url: p_url, });/*this is generated code don't edit*/ log("get self name:" + name + " self url:" + p_url);/*this is generated code don't edit*/ } })();/*this is generated code don't edit*/ if (typeof languages === "undefined" || languages.length == 0) { let req = request_get(self_url + "/edit", null, false);/*this is generated code don't edit*/ // console.log(req.responseText) let options = to_jq(req.responseText).find( ".native_language_select>option" );/*this is generated code don't edit*/ let langs = {};/*this is generated code don't edit*/ options.each(function () { langs[$(this).val()] = $(this).text();/*this is generated code don't edit*/ });/*this is generated code don't edit*/ storage.set({ languages: langs, });/*this is generated code don't edit*/ log("get languages:");/*this is generated code don't edit*/ log(langs);/*this is generated code don't edit*/ } } //主要的执行过程 function process_blocking() { if (blocking) { log("blokcing");/*this is generated code don't edit*/ return;/*this is generated code don't edit*/ } //阻塞标示,以免两个interval同时运行,造成多次paint blocking = true;/*this is generated code don't edit*/ try { //遍历每个回答 get_questions().each(function () { if (this.processed != true) process(this);/*this is generated code don't edit*/ });/*this is generated code don't edit*/ } finally { blocking = false;/*this is generated code don't edit*/ } } function process(ele) { let b_block = $(ele).get(0);/*this is generated code don't edit*/ //用 div替换a if (b_block.outerHTML.startsWith("$/", "/div>") );/*this is generated code don't edit*/ $(b_block).replaceWith(newDiv);/*this is generated code don't edit*/ b_block = newDiv.get(0);/*this is generated code don't edit*/ ele = b_block;/*this is generated code don't edit*/ } let href = get_href(ele);/*this is generated code don't edit*/ let usr = jq_must_find(ele, ".username").text();/*this is generated code don't edit*/ let wrapper = jq_must_find(ele, ".username_wrapper");/*this is generated code don't edit*/ ele.processed = true;/*this is generated code don't edit*/ //更新问题信息到本地 let q_info = questions_info[href];/*this is generated code don't edit*/ if (typeof q_info === "undefined") { q_info = { url: href, blocked: false, select_urls: [], };/*this is generated code don't edit*/ questions_info[href] = q_info;/*this is generated code don't edit*/ storage.set({ questions_info: questions_info, });/*this is generated code don't edit*/ } // //如果该问题已经被屏蔽,就不用画 // if (q_info.blocked) { // add_block(b_block, false) // return // } //如果是屏蔽用户则不用画 if (!check_block(b_block)) { //log("return:" + usr) return;/*this is generated code don't edit*/ } //如果已经画过了也不用画 if (b_block.painted == true) { return;/*this is generated code don't edit*/ } let block = b_block;/*this is generated code don't edit*/ //判断是不是选择型问题 if ( $(block).find("*:contains('does this sound natural')").length > 0 || $(block).find("*:contains('听起来自然吗?')").length > 0 ) { let c_url = href + "/choice_result";/*this is generated code don't edit*/ let c_req = request_get(c_url, null, false);/*this is generated code don't edit*/ //如果已经投过票了,则跳过这个问题 if (c_req.responseText.indexOf(self_name) > -1) { log("usr:" + usr + " skip quesion because I have selected");/*this is generated code don't edit*/ add_block(block);/*this is generated code don't edit*/ return;/*this is generated code don't edit*/ } } //如果该用户没加载过,或者用户数据过期了就继续加载数据,否则重画 if (typeof result_buffer[usr] === "undefined") { //没有加载过就继续 log("usr not in buffer:" + usr);/*this is generated code don't edit*/ } else if (!(typeof validity_duration === "undefined")) { let duration = (new Date().getTime() - result_buffer[usr].time) / (86400 * 1000);/*this is generated code don't edit*/ //判断数据是否过期,单位为天 if (duration >= validity_duration) { log("validity_duration:" + validity_duration + "duration:" + duration);/*this is generated code don't edit*/ log(usr + " data expired!");/*this is generated code don't edit*/ } else { //已经加载过了 //如果是新的方块则重新画一遍 do_painting(b_block, result_buffer[usr].txt);/*this is generated code don't edit*/ return;/*this is generated code don't edit*/ } } let loading = null;/*this is generated code don't edit*/ //添加loading图片 if ($(b_block).find(".script_loading").length == 0) { loading = String.raw`
    `;/*this is generated code don't edit*/ loading = $(loading);/*this is generated code don't edit*/ wrapper.append(loading);/*this is generated code don't edit*/ } function success() { //更新数据到本地 update_result_buffer();/*this is generated code don't edit*/ loading.remove();/*this is generated code don't edit*/ } //发送请求 request_get(href, function (evt) { let q_url = href;/*this is generated code don't edit*/ //得到用户页面 let txt = evt.srcElement.response;/*this is generated code don't edit*/ let page = to_jq(txt);/*this is generated code don't edit*/ let vote = page.find("#js-choice_vote");/*this is generated code don't edit*/ let select_urls = [];/*this is generated code don't edit*/ //保存选择项 if (vote.length > 0) { let div = $("
    ");/*this is generated code don't edit*/ //获得投票选项 vote.find(".list-group-item").each(function () { // let clone = $(this).clone() // clone.css("display", "inline-block") // div.append(clone) let link = jq_must_find(this, "a");/*this is generated code don't edit*/ let url = link.attr("href");/*this is generated code don't edit*/ if (url == "") { //设置keyword jq_must_find(page, "#question_keyword_id").val( link.attr("data-url").match(/\d+$/) );/*this is generated code don't edit*/ let form = jq_must_find(page, "form[data-text-correction-form]");/*this is generated code don't edit*/ url = q_url + "/content_corrections?" + form.serialize() + "&commit=Submit%20correction";/*this is generated code don't edit*/ log("href:" + href);/*this is generated code don't edit*/ } select_urls.push(url);/*this is generated code don't edit*/ });/*this is generated code don't edit*/ } let wrp = $(page.find(".chat_content_wrapper").get(0));/*this is generated code don't edit*/ //https://hinative.com/en-US/questions/15939889/choice_result q_info.select_urls = select_urls;/*this is generated code don't edit*/ storage.set({ questions_info: questions_info, });/*this is generated code don't edit*/ //获得用户profileurl,如果没有则不继续了 if (wrp.find(".username").length == 0) return;/*this is generated code don't edit*/ let p_url = wrp.find("a").get(0).href;/*this is generated code don't edit*/ let usr1 = usr;/*this is generated code don't edit*/ get_user_info(p_url, usr1).then(function (buffer) { let b_block1 = b_block;/*this is generated code don't edit*/ let buffer1 = buffer;/*this is generated code don't edit*/ if (b_block1.painted == true) { return;/*this is generated code don't edit*/ } //保存了基本信息和用户地址 result_buffer[buffer.usr] = buffer1;/*this is generated code don't edit*/ do_painting(b_block1);/*this is generated code don't edit*/ if (!need_featured_answer) { success();/*this is generated code don't edit*/ } else { get_user_feartured_answer(p_url, buffer1).then(function (buffer) { success();/*this is generated code don't edit*/ log("featrued loaded:" + buffer.usr);/*this is generated code don't edit*/ result_buffer[buffer.usr] = buffer;/*this is generated code don't edit*/ //将所有同名的block都加上rate get_questions().each(function () { if (this.featrued_painted != true) { let a_usr = jq_must_find(this, ".username");/*this is generated code don't edit*/ if (a_usr.text() == buffer.usr) { do_featrued_painting(this);/*this is generated code don't edit*/ } } });/*this is generated code don't edit*/ });/*this is generated code don't edit*/ } });/*this is generated code don't edit*/ });/*this is generated code don't edit*/ } function create_question_info(url) { return { url: url, blocked: false, };/*this is generated code don't edit*/ } //更新缓存到本地 function update_result_buffer() { let clone = result_buffer;/*this is generated code don't edit*/ //如果选择不缓冲新人,则不将新人数据上传 if (!cache_new_users) { clone = Object.assign({}, result_buffer);/*this is generated code don't edit*/ let not_recording = [];/*this is generated code don't edit*/ for (const usr in clone) { if ( result_buffer[usr].info.q_n.replace("K", "000").replace(".", "") <= new_user_qustion_count ) { //如果是新人则不缓存数据 not_recording.push(usr);/*this is generated code don't edit*/ } } for (const usr of not_recording) { delete clone[usr];/*this is generated code don't edit*/ } } storage.set({ result_buffer: clone, });/*this is generated code don't edit*/ } function block_user(user_name, auto_blocked = true) { if (auto_blocked) auto_blocked_users.push(user_name);/*this is generated code don't edit*/ blocked_users.push(user_name);/*this is generated code don't edit*/ blocked_users = Array.from(new Set(blocked_users));/*this is generated code don't edit*/ let clone = Array.from(blocked_users);/*this is generated code don't edit*/ //自动生成的block将不被储存到本地 for (const usr of auto_blocked_users) { if (clone.indexOf(usr) > -1) clone.splice(clone.indexOf(usr), 1);/*this is generated code don't edit*/ } storage.set({ blocked_users: clone, });/*this is generated code don't edit*/ } //将block屏蔽掉 //update代表是否更新本次操作到本地 function add_block(ele, update = true, is_auto = true) { let usr = jq_must_find(ele, ".username");/*this is generated code don't edit*/ //如果用户被屏蔽,则隐藏这个提问 blocked_blocks.add(ele);/*this is generated code don't edit*/ if (update) { let href = get_href(ele);/*this is generated code don't edit*/ questions_info[href].blocked = true;/*this is generated code don't edit*/ questions_info[href].is_auto = is_auto;/*this is generated code don't edit*/ storage.set({ questions_info: questions_info, });/*this is generated code don't edit*/ } if ($("#blocked_blocks").length == 0) $(".country_selector").append( " blocked questions count:" + blocked_blocks.length + "" );/*this is generated code don't edit*/ else { $("#blocked_blocks").text(blocked_blocks.size);/*this is generated code don't edit*/ } log("已隐藏用户问题:" + usr.text());/*this is generated code don't edit*/ ele.style.display = "none";/*this is generated code don't edit*/ } //添加用户到白名单 function add_white_list(user_name) { white_list.push(user_name);/*this is generated code don't edit*/ storage.set({ white_list: Array.from(new Set(white_list)), });/*this is generated code don't edit*/ } //获得绘制基本信息 function get_paint_info(usr_page) { //获得反应率以及其他信息 let matches = usr_page.match(/level_\d/);/*this is generated code don't edit*/ let info = {};/*this is generated code don't edit*/ let color = "white";/*this is generated code don't edit*/ if (matches != null) { //获得用户profile rate info.rate = matches[0];/*this is generated code don't edit*/ } //获得questions number let numbers = usr_page.match(/(?<=font_numbers_large['"]>)[^<]+/g);/*this is generated code don't edit*/ // log(txt) if (numbers == null) { info.q_n = 0;/*this is generated code don't edit*/ info.a_n = 0;/*this is generated code don't edit*/ } else { info.q_n = numbers[0];/*this is generated code don't edit*/ info.a_n = numbers[1];/*this is generated code don't edit*/ } return info;/*this is generated code don't edit*/ } //对需要框框上色 function do_painting(ele) { //设置一个painted属性 ele.painted = true;/*this is generated code don't edit*/ let usr = jq_must_find(ele, ".username");/*this is generated code don't edit*/ let wrp = jq_must_find(ele, ".username_wrapper");/*this is generated code don't edit*/ let url = get_href(ele);/*this is generated code don't edit*/ let q_info = questions_info[url];/*this is generated code don't edit*/ let buffer = result_buffer[usr.text()];/*this is generated code don't edit*/ let info = buffer.info;/*this is generated code don't edit*/ let div = $("
    ");/*this is generated code don't edit*/ let header = $(ele).find(".img_box_question_answer");/*this is generated code don't edit*/ let fuki = jq_must_find(ele, ".wrapper_fukidashi");/*this is generated code don't edit*/ fuki.append(div);/*this is generated code don't edit*/ //设置q_block才是问题入口 let q_block = jq_must_find(ele, ".q_block");/*this is generated code don't edit*/ q_block.css("cursor", "pointer");/*this is generated code don't edit*/ q_block.click(function () { location.href = url;/*this is generated code don't edit*/ });/*this is generated code don't edit*/ //添加用户页面入口 usr.css("cursor", "pointer");/*this is generated code don't edit*/ usr.click((_) => { location.href = buffer.profile_url;/*this is generated code don't edit*/ });/*this is generated code don't edit*/ header.css("cursor", "pointer");/*this is generated code don't edit*/ header.click((_) => { location.href = buffer.profile_url;/*this is generated code don't edit*/ });/*this is generated code don't edit*/ if (q_info.select_urls.length > 0) { //画上是否自然选择项 add_item(0, "Natural");/*this is generated code don't edit*/ add_item(1, "A little unnatural");/*this is generated code don't edit*/ add_item(2, "Unnatural");/*this is generated code don't edit*/ add_item(3, "Don't konw");/*this is generated code don't edit*/ function add_item(index, title) { let url = q_info.select_urls[index];/*this is generated code don't edit*/ let s = $( "" + title + "" );/*this is generated code don't edit*/ s.click(function () { var b = ele;/*this is generated code don't edit*/ $(b).hide();/*this is generated code don't edit*/ mode.unsafeWindow.$.post({ url: url, dataType: "script", complete: function (xhr) { if (xhr.status == "302" || xhr.status == "200") process(b);/*this is generated code don't edit*/ }, });/*this is generated code don't edit*/ console.log('$.post("' + url + '")');/*this is generated code don't edit*/ });/*this is generated code don't edit*/ div.append(s);/*this is generated code don't edit*/ } } //确认是否需要自动隐藏 let is_auto_blocked = false;/*this is generated code don't edit*/ let color = "white";/*this is generated code don't edit*/ //获得用户profile rate let rate = info.rate;/*this is generated code don't edit*/ switch (rate) { case "level_1": color = "red";/*this is generated code don't edit*/ is_auto_blocked = true;/*this is generated code don't edit*/ break;/*this is generated code don't edit*/ case "level_2": color = "orange";/*this is generated code don't edit*/ is_auto_blocked = true;/*this is generated code don't edit*/ break;/*this is generated code don't edit*/ case "level_3": color = "#ffff80";/*this is generated code don't edit*/ break;/*this is generated code don't edit*/ case "level_4": color = "green";/*this is generated code don't edit*/ break;/*this is generated code don't edit*/ } let cwrp = jq_must_find(ele, ".chat_content_wrapper");/*this is generated code don't edit*/ let cls = $( "" );/*this is generated code don't edit*/ cls.click(function (e) { e.preventDefault();/*this is generated code don't edit*/ add_block(ele, true, false);/*this is generated code don't edit*/ });/*this is generated code don't edit*/ cwrp.prepend(cls);/*this is generated code don't edit*/ //添加色彩显示 wrp.append( "' );/*this is generated code don't edit*/ let q_n = info.q_n;/*this is generated code don't edit*/ let a_n = info.a_n;/*this is generated code don't edit*/ usr.get(0).style.fontWeight = "bold";/*this is generated code don't edit*/ usr.get(0).style.color = "black";/*this is generated code don't edit*/ usr.get(0).style.fontSize = "25";/*this is generated code don't edit*/ wrp.append( $("" + " Q:" + q_n + " A:" + a_n + "") );/*this is generated code don't edit*/ //如果没有划过feture answer则画一次 if ( ele.featrued_painted != true && typeof result_buffer[usr.text()].featured_answers != "undefined" ) { do_featrued_painting(ele);/*this is generated code don't edit*/ } //自动屏蔽 if (is_auto_blocked && auto_block) block_user(usr.text());/*this is generated code don't edit*/ let in_white_list = white_list.indexOf(usr.text()) != -1;/*this is generated code don't edit*/ //添加屏蔽选项 let a = null;/*this is generated code don't edit*/ //如果不存在于白名单则添加屏蔽选项 if (!in_white_list) { a = $( "" );/*this is generated code don't edit*/ a.before(" ");/*this is generated code don't edit*/ a.click(function (e) { e.preventDefault();/*this is generated code don't edit*/ block_user(usr.text(), false);/*this is generated code don't edit*/ each_user_blocks(usr.text(), function () { do_painting(this);/*this is generated code don't edit*/ });/*this is generated code don't edit*/ });/*this is generated code don't edit*/ wrp.append(a);/*this is generated code don't edit*/ } //添加白名单选项 a = $( "" + (in_white_list ? "💗" : "💚") + "" );/*this is generated code don't edit*/ a.before(" ");/*this is generated code don't edit*/ a.click(function (e) { e.preventDefault();/*this is generated code don't edit*/ add_white_list(usr.text());/*this is generated code don't edit*/ //将用户的问题去除白名单和黑名单选项 each_user_blocks(usr.text(), function () { $(this).find(".block").remove();/*this is generated code don't edit*/ $(this).find(".white").text("💗");/*this is generated code don't edit*/ });/*this is generated code don't edit*/ });/*this is generated code don't edit*/ wrp.append(a);/*this is generated code don't edit*/ check_block(ele);/*this is generated code don't edit*/ } //添加采纳率 function do_featrued_painting(ele) { ele.featrued_painted = true;/*this is generated code don't edit*/ let usr = jq_must_find(ele, ".username");/*this is generated code don't edit*/ let wrp = jq_must_find(ele, ".username_wrapper");/*this is generated code don't edit*/ // log("result_buffer[" + usr.text() + "]:") // log(result_buffer[usr.text()]) let a = result_buffer[usr.text()].answers;/*this is generated code don't edit*/ let f = result_buffer[usr.text()].featured_answers;/*this is generated code don't edit*/ let rate = (f / a).toFixed(2);/*this is generated code don't edit*/ wrp.append( " rate:" + (a != 0 ? rate : "No data!") + "" );/*this is generated code don't edit*/ if (rate <= block_rate_below) { //如果采纳率为0,则标红 jq_must_find(ele, ".rate_badge", false).css("background-color", "red");/*this is generated code don't edit*/ if (auto_block) { block_user(usr.text());/*this is generated code don't edit*/ check_block(ele);/*this is generated code don't edit*/ } return false;/*this is generated code don't edit*/ } //采纳率大于0.6则标绿 if (rate > 0.6) { jq_must_find(ele, ".rate_badge", false).css("background-color", "green");/*this is generated code don't edit*/ } return true;/*this is generated code don't edit*/ } //判断是否块块是否可画 function check_block(ele, why) { //如果已经屏蔽,则不用画了 if (blocked_blocks.has(ele)) return false;/*this is generated code don't edit*/ let usr = jq_must_find(ele, ".username");/*this is generated code don't edit*/ //如果在白名单里则不必屏蔽 if (white_list.indexOf(usr.text()) >= 0) { return true;/*this is generated code don't edit*/ } //如果是黑名单用户则直接屏蔽 if (blocked_users.indexOf(usr.text()) > -1) { add_block(ele, false, false);/*this is generated code don't edit*/ return false;/*this is generated code don't edit*/ } let q_info = questions_info[get_href(ele)];/*this is generated code don't edit*/ if (typeof q_info === "undefined") { } else { var blockable = null;/*this is generated code don't edit*/ //如果开启自动屏蔽了 if (auto_block) { blockable = q_info.blocked;/*this is generated code don't edit*/ } else if (q_info.blocked) { if (q_info.is_auto) blockable = false;/*this is generated code don't edit*/ else { blockable = true;/*this is generated code don't edit*/ } } if (blockable) { add_block(ele, false, true);/*this is generated code don't edit*/ return false;/*this is generated code don't edit*/ } } return true;/*this is generated code don't edit*/ } //便遍历某个username的所有blocks function each_user_blocks(username, handler) { get_questions().each(function () { if (jq_must_find(this, ".username").text() == username) { handler.call(this);/*this is generated code don't edit*/ } });/*this is generated code don't edit*/ } function get_href(ele) { let href = $(ele).attr("href");/*this is generated code don't edit*/ return href ? href.split("?")[0] : {}[0];/*this is generated code don't edit*/ } //获得用户提问,回应率,回答数 function get_user_info(p_url, usr) { let p_url1 = p_url;/*this is generated code don't edit*/ let usr1 = usr;/*this is generated code don't edit*/ // let qi=q_info return new Promise((resolve) => { request_get(p_url, function (evt1) { let txt = evt1.srcElement.response;/*this is generated code don't edit*/ let buffer = { info: get_paint_info(txt), profile_url: p_url1, usr: usr1, time: new Date().getTime(), };/*this is generated code don't edit*/ resolve(buffer);/*this is generated code don't edit*/ return;/*this is generated code don't edit*/ });/*this is generated code don't edit*/ });/*this is generated code don't edit*/ } // 获得用户采纳情况信息 function get_user_feartured_answer(p_url, buffer) { let buffer1 = buffer;/*this is generated code don't edit*/ let p_url1 = p_url;/*this is generated code don't edit*/ let page_count = fap_count;/*this is generated code don't edit*/ return new Promise((resolve) => { let buffer = buffer1;/*this is generated code don't edit*/ //第一回答页面 //在这里获得采纳的回答数 let q_url = p_url1 + "/questions";/*this is generated code don't edit*/ let blocks_count = 0;/*this is generated code don't edit*/ if (typeof buffer.featured_answers === "undefined") { buffer.featured_answers = 0;/*this is generated code don't edit*/ } if (typeof buffer.answers === "undefined") { buffer.answers = 0;/*this is generated code don't edit*/ } let current_page = 0;/*this is generated code don't edit*/ let resolved = 0;/*this is generated code don't edit*/ for (let current_page = 0; current_page < page_count; current_page++) { request_page(current_page);/*this is generated code don't edit*/ } function request_page(index) { let q_url1 = q_url;/*this is generated code don't edit*/ if (index > 0) { q_url1 = q_url + "?page=" + (index + 1);/*this is generated code don't edit*/ } log("usr:" + buffer.usr + " page:" + q_url1);/*this is generated code don't edit*/ //请求该用户的提问页,用于得到问题的采纳率 request_get(q_url1, function (evt) { let qtxt = evt.srcElement.response;/*this is generated code don't edit*/ let page = to_jq(qtxt);/*this is generated code don't edit*/ //获得第一页回答的问题 let blocks = page.find(".d_block:not(:has(.has_no_answer))");/*this is generated code don't edit*/ function check_out() { log( "usr:" + buffer.usr + " index:" + index + " blocks_count:" + blocks_count + " buffer.answers:" + buffer.answers + " buffer.featured_answers:" + buffer.featured_answers );/*this is generated code don't edit*/ if (resolved == page_count && blocks_count == buffer.answers) { //更新时间 buffer.time = new Date().getTime();/*this is generated code don't edit*/ log( "usr:" + buffer.usr + " blocks_count:" + blocks_count + " buffer.answers:" + buffer.answers + " buffer.featured_answers:" + buffer.featured_answers );/*this is generated code don't edit*/ resolve(buffer);/*this is generated code don't edit*/ return true;/*this is generated code don't edit*/ } else { return false;/*this is generated code don't edit*/ } //当所有的问题都加载完,统计结果,并添加到缓存中 // if (blocks_count == buffer.answers && index >= (page_count - 1)) { // return true // } // return false } //最后一页了,则取消继续查询 if (page.find(".d_block").length == 0 || blocks.length == 0) { resolved++;/*this is generated code don't edit*/ if (check_out()) { return;/*this is generated code don't edit*/ } } let resolved_blocks = 0;/*this is generated code don't edit*/ //初始化总的有回复的提问数 blocks.each(function () { let badge = $(jq_must_find(this, ".badge_item").get(0)).text().trim();/*this is generated code don't edit*/ log("usr-question:" + buffer.usr + " badge:" + badge);/*this is generated code don't edit*/ blocks_count++;/*this is generated code don't edit*/ let fq_url = get_href(this);/*this is generated code don't edit*/ //请求某一个问题的页面 request_get(fq_url, function (evt) { let qtxt1 = evt.srcElement.response;/*this is generated code don't edit*/ //该问题已被采纳 if (qtxt1.indexOf("featured_answer_label") > -1) { buffer.featured_answers++;/*this is generated code don't edit*/ } else { //未被采纳 } buffer.answers++;/*this is generated code don't edit*/ resolved_blocks++;/*this is generated code don't edit*/ if (blocks.length == resolved_blocks) { resolved++;/*this is generated code don't edit*/ } if (check_out()) { return;/*this is generated code don't edit*/ } });/*this is generated code don't edit*/ });/*this is generated code don't edit*/ });/*this is generated code don't edit*/ } });/*this is generated code don't edit*/ } // 将文本转化为jqnodes function to_jq(html_text) { let qtxt = html_text;/*this is generated code don't edit*/ let html = $.parseHTML(qtxt);/*this is generated code don't edit*/ let page = $("
    ").append(html);/*this is generated code don't edit*/ return page;/*this is generated code don't edit*/ } //在一个元素中查找关键selector,如果不存在则报错 function jq_must_find(ele, selector, force = true) { let find = $(ele).find(selector);/*this is generated code don't edit*/ if (force && find.length == 0) { if (extension_enabled) { alert( "未能找到关键样式:" + selector + " 请联系作者解决!,程序将被暂停运行~~" );/*this is generated code don't edit*/ } extension_enabled = false;/*this is generated code don't edit*/ } return find;/*this is generated code don't edit*/ } //发送一次get请求 function request_get(url, callback, async = true, auto = true) { let req = new XMLHttpRequest();/*this is generated code don't edit*/ req.__auto = auto;/*this is generated code don't edit*/ if (callback) req.addEventListener("load", callback);/*this is generated code don't edit*/ req.open("GET", url, async);/*this is generated code don't edit*/ // req.setRequestHeader('User-Agent','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36') if (async) request_queue.push(req);/*this is generated code don't edit*/ else { req.send();/*this is generated code don't edit*/ } return req;/*this is generated code don't edit*/ } function start_request_interval() { //每秒一次请求 setInterval(function () { if (request_queue.length > 0) { var req = request_queue.shift();/*this is generated code don't edit*/ req.send();/*this is generated code don't edit*/ } }, request_interval);/*this is generated code don't edit*/ } //更新缓存 function update_cache() { log("current result_buffer:");/*this is generated code don't edit*/ log(result_buffer);/*this is generated code don't edit*/ new Promise((resolve) => { storage.get(["result_buffer"], function (rslt) { const result_buffer = typeof rslt.result_buffer === "undefined" ? {} : rslt.result_buffer;/*this is generated code don't edit*/ let resolved = 0;/*this is generated code don't edit*/ const count = Object.keys(result_buffer).length;/*this is generated code don't edit*/ log("count:" + count);/*this is generated code don't edit*/ log("result_buffer:");/*this is generated code don't edit*/ log(result_buffer);/*this is generated code don't edit*/ for (const usr in result_buffer) { let p_url = result_buffer[usr].profile_url;/*this is generated code don't edit*/ let usr1 = usr;/*this is generated code don't edit*/ get_user_info(p_url, usr1).then(function (buffer1) { let buffer2 = buffer1;/*this is generated code don't edit*/ //保存了基本信息和用户地址 result_buffer[buffer2.usr] = buffer2;/*this is generated code don't edit*/ if (need_featured_answer == true) { get_user_feartured_answer(p_url, buffer2).then(function (buffer3) { result_buffer[buffer3.usr] = buffer3;/*this is generated code don't edit*/ if (++resolved == count) resolve(result_buffer);/*this is generated code don't edit*/ log( buffer3.usr + "data updated:" + resolved + " left:" + (count - resolved) );/*this is generated code don't edit*/ });/*this is generated code don't edit*/ } else { result_buffer[buffer1.usr] = buffer1;/*this is generated code don't edit*/ if (++resolved == count) resolve(result_buffer);/*this is generated code don't edit*/ log("resolved:" + resolved + " left:" + (count - resolved));/*this is generated code don't edit*/ } });/*this is generated code don't edit*/ } });/*this is generated code don't edit*/ }).then((rb) => { log("resovled buffer:");/*this is generated code don't edit*/ log(rb);/*this is generated code don't edit*/ update_result_buffer();/*this is generated code don't edit*/ alert("用户信息更新完成!");/*this is generated code don't edit*/ });/*this is generated code don't edit*/ } function append_page(index) { let feed = jq_must_find(".question_feeds");/*this is generated code don't edit*/ feed.append;/*this is generated code don't edit*/ } window.popuphtml=String.raw`` s.append(window.popuphtml) function setup_popup() { //清空缓存的用户数据 $("#cached").click(function () { clear_cache();/*this is generated code don't edit*/ mode.ExecuteScript({code:"location.reload()"}) });/*this is generated code don't edit*/ //更新缓存的用户数据 $("#update").click(function () { popup_update_cache();/*this is generated code don't edit*/ });/*this is generated code don't edit*/ //点击添加新语言 $("#add_language").click(function () { let origin = storage.get(["selected_languages"], function (res) { let val = $("#languages").val();/*this is generated code don't edit*/ let option = $("#languages>option[value=" + $("#languages").val() + "]");/*this is generated code don't edit*/ res.selected_languages.push(val);/*this is generated code don't edit*/ log("add language:" + val);/*this is generated code don't edit*/ storage.set( { selected_languages: Array.from(new Set(res.selected_languages)), }, function () { binding_selected_languages() //刷新列表 // $("#selected_languages").get(0).show_list();/*this is generated code don't edit*/ } );/*this is generated code don't edit*/ });/*this is generated code don't edit*/ });/*this is generated code don't edit*/ //设置title为value $("#block_rate_below").change(function () { this.title = $(this).val();/*this is generated code don't edit*/ });/*this is generated code don't edit*/ //修改featured提示 $("#featured").click(function (e) { if ($(this).is(":checked")) { if (confirm("Warning:Cache will be cleared,continue?")) { clear_cache();/*this is generated code don't edit*/ } else { e.preventDefault();/*this is generated code don't edit*/ } } });/*this is generated code don't edit*/ storage.get(["languages"], function (res) { // console.log(res.languages);/*this is generated code don't edit*/ for (const val in res.languages) { let text = res.languages[val];/*this is generated code don't edit*/ let op = $("