")
//获得投票选项
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")
let url = link.attr("href")
if (url == "") {
//设置keyword
jq_must_find(page,"#question_keyword_id").val(link.attr("data-url").match(/\d+$/))
let form=jq_must_find(page,"form[data-text-correction-form]")
url=q_url+"/content_corrections?"+form.serialize()+"unnatural&commit=Submit%20correction"
log("href:"+href)
}
select_urls.push(url)
})
// select_urls = div.get(0).outerHTML
}
let wrp = $(page.find(".chat_content_wrapper").get(0))
//https://hinative.com/en-US/questions/15939889/choice_result
//获得用户profileurl
let p_url = wrp.find("a").get(0).href
let usr1 = usr
q_info.select_urls = select_urls
storage.set({ questions_info: questions_info })
get_user_info(p_url, usr1).then(function (buffer) {
let b_block1 = b_block
let buffer1 = buffer
if (b_block1.painted == true) {
return
}
//保存了基本信息和用户地址
result_buffer[buffer.usr] = buffer1
if (!need_featured_answer)
success()
do_painting(b_block1)
if (need_featured_answer == true) {
get_user_feartured_answer(p_url, buffer1).then(function (buffer) {
log("featrued loaded:" + buffer.usr)
result_buffer[buffer.usr] = buffer
//将所有同名的block都加上rate
get_questions().each(function () {
if (this.featrued_painted != true) {
let a_usr = jq_must_find(this, ".username")
if (a_usr.text() == buffer.usr) {
do_featrued_painting(this)
}
}
})
success()
})
}
})
})
function success() {
//更新数据到本地
update_result_buffer()
loading.remove()
}
})
} finally {
blocking = false
}
}
function create_question_info(url) {
return { url: url, blocked: false }
}
//更新缓存到本地
function update_result_buffer() {
let clone = result_buffer
//如果选择不缓冲新人,则不将新人数据上传
if (!cache_new_users) {
clone = Object.assign({}, result_buffer)
let not_recording = []
for (const usr in clone) {
if (result_buffer[usr].info.q_n.replace("K", "000").replace(".", "") <= new_user_qustion_count) {
//如果是新人则不缓存数据
not_recording.push(usr)
}
}
for (const usr of not_recording) {
delete clone[usr]
}
}
storage.set({ "result_buffer": clone })
}
function block_user(user_name, auto_blocked = true) {
if (auto_blocked)
auto_blocked_users.push(user_name)
blocked_users.push(user_name)
blocked_users = Array.from(new Set(blocked_users))
let clone = Array.from(blocked_users)
//自动生成的block将不被储存到本地
for (const usr of auto_blocked_users) {
if (clone.indexOf(usr) > -1)
clone.splice(clone.indexOf(usr), 1)
}
storage.set({ "blocked_users": clone })
}
//将block屏蔽掉
//update代表是否更新本次操作到本地
function add_block(ele, update = true) {
let usr = jq_must_find(ele, ".username")
//如果用户被屏蔽,则隐藏这个提问
blocked_blocks.add(ele)
if (update) {
let href = $(ele).attr("href")
questions_info[href].blocked = true
storage.set({ "questions_info": questions_info })
}
if ($("#blocked_blocks").length == 0)
$(".country_selector").append("
")
else {
$("#blocked_blocks").text("blocked quesions count:" + blocked_blocks.size)
}
log("已隐藏用户问题:" + usr.text())
ele.style.display = "none"
}
//添加用户到白名单
function add_white_list(user_name) {
white_list.push(user_name)
storage.set({ "white_list": Array.from(new Set(white_list)) })
}
//获得绘制基本信息
function get_paint_info(usr_page) {
//获得反应率以及其他信息
let matches = usr_page.match(/level_\d/)
let info = {}
let color = "white"
if (matches != null) {
//获得用户profile rate
info.rate = matches[0]
}
//获得questions number
let numbers = usr_page.match(/(?<=font_numbers_large['"]>)[^<]+/g)
// log(txt)
info.q_n = numbers[0]
info.a_n = numbers[1]
return info
}
//对需要框框上色
function do_painting(ele) {
//设置一个painted属性
ele.painted = true
let usr = jq_must_find(ele, ".username")
let wrp = jq_must_find(ele, ".username_wrapper")
let url = $(ele).attr("href")
let q_info = questions_info[url]
let buffer = result_buffer[usr.text()]
let info = buffer.info
let div=$("
")
let fuki=jq_must_find(ele, ".wrapper_fukidashi")
fuki.append(div)
let q_block=jq_must_find(ele, ".q_block")
q_block.css("cursor","pointer")
q_block.click(function(){
location.href=url
})
if (q_info.select_urls.length > 0) {
//画上选择项
add_item(0, "Natural")
add_item(1, "A little unnatural")
add_item(2, "Unnatural")
add_item(3, "Don't konw")
function add_item(index, title) {
let url = q_info.select_urls[index]
let s = $("
" + title + "")
s.click(function () {
// console.log("post:" + url)
unsafeWindow.$.post({url:url,dataType:"script"})
console.log("$.post(\"" + url + "\")")
}
)
div.append(s)
}
}
//确认是否需要自动隐藏
let is_auto_blocked = false
let color = "white"
//获得用户profile rate
let rate = info.rate
switch (rate) {
case "level_1":
color = "red"
is_auto_blocked = true
break;
case "level_2":
color = "orange"
is_auto_blocked = true
break;
case "level_3":
color = "#ffff80"
break;
case "level_4":
color = "green"
break;
}
let cwrp = jq_must_find(ele, ".chat_content_wrapper")
let cls = $("
✕")
cls.click(function (e) {
e.preventDefault()
add_block(ele, true)
})
cwrp.prepend(cls)
//添加色彩显示
wrp.append("
")
let q_n = info.q_n
let a_n = info.a_n
usr.get(0).style.fontWeight = "bold"
usr.get(0).style.color = "black"
usr.get(0).style.fontSize = "25"
wrp.append($("
" + " Q:" + q_n + " A:" + a_n + ""))
//如果没有划过feture answer则画一次
if (ele.featrued_painted != true && typeof result_buffer[usr.text()].featured_answers != "undefined") {
do_featrued_painting(ele)
}
//自动屏蔽
if (is_auto_blocked && auto_block)
block_user(usr.text())
let in_white_list = white_list.indexOf(usr.text()) != -1
//添加屏蔽选项
let a = null
//如果不存在于白名单则添加屏蔽选项
if (!in_white_list) {
a = $("
❌")
a.before(" ")
a.click(function (e) {
e.preventDefault()
block_user(usr.text(), false)
each_user_blocks(usr.text(), function () {
do_painting(this)
})
})
wrp.append(a)
}
//添加白名单选项
a = $("
" + (in_white_list ? "💗" : "💚") + "")
a.before(" ")
a.click(function (e) {
e.preventDefault()
add_white_list(usr.text())
//将用户的问题去除白名单和黑名单选项
each_user_blocks(usr.text(), function () {
$(this).find(".block").remove()
$(this).find(".white").text("💗")
})
})
wrp.append(a)
check_block(ele)
}
//添加采纳率
function do_featrued_painting(ele) {
ele.featrued_painted = true
let usr = jq_must_find(ele, ".username")
let wrp = jq_must_find(ele, ".username_wrapper")
// log("result_buffer[" + usr.text() + "]:")
// log(result_buffer[usr.text()])
let a = result_buffer[usr.text()].answers
let f = result_buffer[usr.text()].featured_answers
let rate = (f / a).toFixed(2)
wrp.append("
rate:" + ((a != 0) ? rate : "No data!") + "")
if (rate <= block_rate_below) {
//如果采纳率为0,则标红
jq_must_find(ele, ".rate_badge", false).css("background-color", "red")
if (auto_block) {
block_user(usr.text())
check_block(ele)
}
return false
}
//采纳率大于0.6则标绿
if (rate > 0.6) {
jq_must_find(ele, ".rate_badge", false).css("background-color", "green")
}
return true
}
//判断是否块块是否好好的,需要被屏蔽
function check_block(ele, why) {
//如果已经屏蔽,则不用画了
if (blocked_blocks.has(ele))
return false
let usr = jq_must_find(ele, ".username")
//如果在白名单里则不必屏蔽
if (white_list.indexOf(usr.text()) >= 0) {
return true
}
if (blocked_users.indexOf(usr.text()) > -1) {
add_block(ele)
return false
}
return true
}
//便遍历某个username的所有blocks
function each_user_blocks(username, handler) {
get_questions().each(function () {
if (jq_must_find(this, ".username").text() == username) {
handler.call(this)
}
})
}
//获得用户提问,回应率,回答数
function get_user_info(p_url, usr) {
let p_url1 = p_url
let usr1 = usr
// let qi=q_info
return new Promise(resolve => {
request_get(p_url, function (evt1) {
let txt = evt1.srcElement.response
let buffer = { info: get_paint_info(txt), profile_url: p_url1, usr: usr1, time: new Date().getTime() }
resolve(buffer)
return
})
})
}
// 获得用户采纳情况信息
function get_user_feartured_answer(p_url, buffer) {
let buffer1 = buffer
let p_url1 = p_url
let page_count = fap_count
return new Promise(resolve => {
let buffer = buffer1
//第一回答页面
//在这里获得采纳的回答数
let q_url = p_url1 + "/questions"
let blocks_count = 0
if (typeof buffer.featured_answers === "undefined") {
buffer.featured_answers = 0
}
if (typeof buffer.answers === "undefined") {
buffer.answers = 0
}
let current_page = 0
let resolved = 0
for (let current_page = 0; current_page < page_count; current_page++) {
request_page(current_page)
}
function request_page(index) {
let q_url1 = q_url
if (index > 0) {
q_url1 = q_url + '?page=' + (index + 1)
}
log("usr:" + buffer.usr + " page:" + q_url1)
//请求该用户的提问页,用于得到问题的采纳率
request_get(q_url1, function (evt) {
let qtxt = evt.srcElement.response
let page = to_jq(qtxt)
//获得第一页回答的问题
let blocks = page.find(".d_block:not(:has(.has_no_answer))")
function check_out() {
log("usr:" + buffer.usr + " index:" + index + " blocks_count:" + blocks_count + " buffer.answers:" + buffer.answers + " buffer.featured_answers:" + buffer.featured_answers)
if (resolved == page_count && blocks_count == buffer.answers) {
//更新时间
buffer.time = new Date().getTime()
log("usr:" + buffer.usr + " blocks_count:" + blocks_count + " buffer.answers:" + buffer.answers + " buffer.featured_answers:" + buffer.featured_answers)
resolve(buffer)
return true
}
else {
return false
}
//当所有的问题都加载完,统计结果,并添加到缓存中
// if (blocks_count == buffer.answers && index >= (page_count - 1)) {
// return true
// }
// return false
}
//最后一页了,则取消继续查询
if (page.find(".d_block").length == 0 || blocks.length == 0) {
resolved++;
if (check_out()) {
return
}
}
let resolved_blocks = 0
//初始化总的有回复的提问数
blocks.each(function () {
let badge = $(jq_must_find(this, ".badge_item").get(0)).text().trim()
log("usr-question:" + buffer.usr + " badge:" + badge)
blocks_count++;
let fq_url = this.href
//请求某一个问题的页面
request_get(fq_url, function (evt) {
let qtxt1 = evt.srcElement.response
//该问题已被采纳
if (qtxt1.indexOf("featured_answer_label") > -1) {
buffer.featured_answers++
}
else {
//未被采纳
}
buffer.answers++
resolved_blocks++;
if (blocks.length == resolved_blocks) {
resolved++;
}
if (check_out()) {
return
}
})
})
})
}
})
}
// 将文本转化为jqnodes
function to_jq(html_text) {
let qtxt = html_text
let html = $.parseHTML(qtxt)
let page = $("
").append(html)
return page
}
//在一个元素中查找关键selector,如果不存在则报错
function jq_must_find(ele, selector, force = true) {
let find = $(ele).find(selector)
if (force && find.length == 0) {
if (extension_enabled) {
alert("未能找到关键样式:" + selector + " 请联系作者解决!,程序将被暂停运行~~")
}
extension_enabled = false
}
return find
}
//发送一次get请求
function request_get(url, callback, async = true) {
let req = new XMLHttpRequest()
if (callback)
req.addEventListener("load", callback)
req.open("GET", url, async)
// 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)
else {
req.send()
}
return req
}
function start_request_interval() {
//每秒一次请求
setInterval(function () {
if (request_queue.length > 0) {
var req = request_queue.shift()
req.send()
}
}, request_interval)
}
//更新缓存
function update_cache() {
log("current result_buffer:")
log(result_buffer)
new Promise(resolve => {
storage.get(["result_buffer"], function (rslt) {
const result_buffer = typeof rslt.result_buffer === "undefined" ? {} : rslt.result_buffer
let resolved = 0
const count = Object.keys(result_buffer).length
log("count:" + count)
log("result_buffer:")
log(result_buffer)
for (const usr in result_buffer) {
let p_url = result_buffer[usr].profile_url
let usr1 = usr
get_user_info(p_url, usr1).then(function (buffer1) {
let buffer2 = buffer1
//保存了基本信息和用户地址
result_buffer[buffer2.usr] = buffer2
if (need_featured_answer == true) {
get_user_feartured_answer(p_url, buffer2).then(function (buffer3) {
result_buffer[buffer3.usr] = buffer3
if (++resolved == count)
resolve(result_buffer)
log(buffer3.usr + "data updated:" + resolved + " left:" + (count - resolved))
})
} else {
result_buffer[buffer1.usr] = buffer1
if (++resolved == count)
resolve(result_buffer)
log("resolved:" + resolved + " left:" + (count - resolved))
}
})
}
})
}).then(rb => {
log("resovled buffer:")
log(rb)
update_result_buffer();
alert("用户信息更新完成!")
})
}
window.popuphtml=String.raw``
s.append(window.popuphtml)
function setup_popup(){
//清空缓存的用户数据
$("#cached").click(function () {
clear_cache()
})
//更新缓存的用户数据
$("#update").click(function () {
popup_update_cache()
})
//设置title为value
$("#block_rate_below").change(function () {
this.title = $(this).val()
})
$("#featured").click(function (e) {
if ($(this).is(":checked")) {
if (confirm("Warning:Cache will be cleared,continue?")) {
clear_cache()
}
else {
e.preventDefault()
}
}
})
set_binding("extension_enabled", $("#switch").get(0))
set_binding("auto_block", $("#auto").get(0))
set_binding("need_featured_answer", $("#featured").get(0))
set_binding("cache_new_users", $("#cache_new_users").get(0))
set_binding("block_rate_below", $("#block_rate_below").get(0))
set_binding("show_log", $("#show_log").get(0))
set_binding("rearrange", $("#rearrange").get(0))
set_binding("validity_duration", $("#validity_duration").get(0))
set_binding("self_name", $("#username").get(0))
set_binding("request_interval", $("#request_interval").get(0))
set_binding("fap_count", $("#fap_count").get(0))
binding_list("blocked_users", $("#blocked_users").get(0))
binding_list("white_list", $("#white_list").get(0))
}
function binding_list(key, tbody) {
((key, tbody) => {
let list = []
storage.get([key], function (rslt) {
list = typeof rslt[key] === "undefined" ? [] : rslt[key]
show_list()
function remove_block(username) {
while (list.indexOf(username) > -1) {
list.splice(list.indexOf(username), 1)
}
window. obj={ }
obj[key]=list
storage.set(obj)
}
function show_list() {
$(tbody).empty()
for (const u of list) {
let tr = $("
")
tr.append($("" + u + " | "))
let a = $("❌")
a.click(function () {
$(this).closest("tr").hide()
remove_block(u)
})
let db = $(" | ")
db.append(a)
tr.append(db)
$(tbody).append(tr)
}
}
})
})(key, tbody)
}
function set_binding(key1, check1) {
let key = key1
let check = check1
storage.get([key], function (result) {
switch (check.type) {
case "checkbox":
$(check).attr("checked", result[key])
break
default:
$(check).val(result[key])
}
$(check).change(function () {
set_status()
})
})
function set_status() {
let value = (function () {
switch (check.type) {
case "checkbox":
return $(check).is(":checked")
default:
return $(check).val()
}
})()
set_variable(key,value)
let obj = {}
obj[key] = value
storage.set(obj)
}
}
function clear_cache() {
storage.set({ "result_buffer": {} , "questions_info": {} }, function () {
log("cache cleared!")
})
}
function popup_update_cache() {
mode.ExecuteScript({
code: "update_cache()"
}, () => chrome.runtime.lastError);
}
$('#popup').hide()
})();