// ==UserScript==
// @name 远景小助手
// @namespace http://tampermonkey.net/
// @version 5.0.0.4
// @description 远景论坛自定义小功能~:自定义常用语,屏蔽指定用户的发言,隐藏等级|徽章|表情显示等。
// @author lalaki
// @match https://*.pcbeta.com/*
// @icon https://i.pcbeta.com/favicon.ico
// @grant GM_setValue
// @grant GM_getValue
// @license MIT
// ==/UserScript==
(function () {
"use strict";
const FINAL_VERSION = 5.4;
//UI
let gui = document.createElement("div");
gui.innerHTML = `
<div style="font-size:144%" draggable="false">
<div style="background:#1985db;padding:4px 12px 4px 12px;border-top-right-radius:10px">
<img src="/favicon.ico" style="pointer-events:none;width:24px;position:absolute"><h1 style="margin:0 0 0 28px;color:#fff;">远景小助手</b>
<div style="float:right;color:red;font-size:24px;line-height:22px;cursor:pointer;transform: translateX(10px);" id="tool_gui_close">❎</div>
</div>
<div style="display:flex;padding:2px 8px 5px 8px;background:#f3f3f3">
<ul>
<li><input id="hide_exp" type="checkbox"><label for="hide_exp">不显示默认表情(黄色小老虎)</label></li>
<li><input id="hide_star" type="checkbox"><label for="hide_star">不显示用户等级</label></li>
<li><input id="hide_ava" type="checkbox"><label for="hide_ava">不展示用户徽章</label></li>
<li><input id="hide_user_sign" type="checkbox"><label for="hide_user_sign">不展示用户签名</label></li>
<li><input id="hide_ip_address" type="checkbox"><label for="hide_ip_address">不展示IP属地</label></li>
<li><input id="hide_details" type="checkbox"><label for="hide_details">不展示用户详细信息(仅显示头像与名字)</label></li>
<li><input id="show_all_ava" type="checkbox"><label for="show_all_ava">为自己佩戴全部徽章</label></li>
<li><input id="fast_send_msg_legacy" type="checkbox"><label for="fast_send_msg_legacy">兼容性(功能正常时无需启用)</label></li>
<li><input id="fast_send_msg" type="checkbox"><label for="fast_send_msg">快捷发言</label></li>
<li id="fast_send_msg_ct" style="display:none"><div>常用语(每行一句话):</div><textarea id="faster_msg_area" style="resize:both;width:382px;height:120px"></textarea></li>
<li><div>黑名单(每行一个用户名):</div><textarea id="deny_users_area" style="resize:both;width:382px;height:120px"></textarea></li>
<li><a id="up_pcbeta_tools" style="font-size:14px;color:green;display:none" target="_blank" href="https://lalaki.cn/pb/">有新版可用,点此获取</a><input type="button" id="tool_gui_save" value="存储配置" style="font-size:18px;float:right;margin:0 0 0 5px"><input type="button" id="tools_bug_report" value="反馈" style="font-size:18px;float:right"></li>
</ui>
</div>
</div>
`;
gui.style =
"font-family:Segoe UI;border-top-right-radius: 15px;display:none;user-select:none;position:fixed;left:0;top:-1000px;z-index:999999;background:#333;box-shadow:5px 5px 10px rgba(0,0,0,0.3);";
document.body.append(gui);
document.querySelector("#tool_gui_close").onclick = () => {
let top = 0;
let iv = setInterval(() => {
if (Math.abs(top) <= gui.offsetHeight + 100) {
gui.style.top = top + "px";
top -= 60;
} else {
gui.style.display = "none";
clearInterval(iv);
}
}, 15);
};
document.querySelector("#tools_bug_report").onclick = () => {
location.href = "https://bbs.pcbeta.com/viewthread-2019443-1-1.html";
};
//等级
let hideStar = document.querySelector("#hide_star");
hideStar.checked = GM_getValue("star", "false") == true;
hideStar.addEventListener("change", () => {
GM_setValue("star", hideStar.checked);
});
//徽章
let hideAva = document.querySelector("#hide_ava");
hideAva.checked = GM_getValue("ava", "false") == true;
hideAva.addEventListener("change", () => {
GM_setValue("ava", hideAva.checked);
});
//表情
let hideExp = document.querySelector("#hide_exp");
hideExp.checked = GM_getValue("exp", "false") == true;
hideExp.addEventListener("change", () => {
GM_setValue("exp", hideExp.checked);
});
//所有徽章体验
let showAllAva = document.querySelector("#show_all_ava");
showAllAva.checked = GM_getValue("avas", "false") == true;
showAllAva.addEventListener("change", () => {
GM_setValue("avas", showAllAva.checked);
});
//隐藏用户详细信息
let hideDetail = document.querySelector("#hide_details");
hideDetail.checked = GM_getValue("dts", "false") == true;
hideDetail.addEventListener("change", () => {
GM_setValue("dts", hideDetail.checked);
});
//不要地域黑
let hideIPAddr = document.querySelector("#hide_ip_address");
hideIPAddr.checked = GM_getValue("hip", "false") == true;
hideIPAddr.addEventListener("change", () => {
GM_setValue("hip", hideIPAddr.checked);
});
if (hideIPAddr.checked) {
document.querySelectorAll("span").forEach((aa) => {
if ((aa.innerHTML + "").trim().startsWith("IP属地")) {
aa.style = "display:none";
}
});
}
//快捷发言
let fastMsg = document.querySelector("#fast_send_msg");
fastMsg.checked = GM_getValue("fmg", "false") == true;
fastMsg.addEventListener("change", () => {
GM_setValue("fmg", fastMsg.checked);
document.querySelector("#fast_send_msg_ct").style =
"display:" + (fastMsg.checked ? "block" : "none");
});
//兼容性
let legacy = document.querySelector("#fast_send_msg_legacy");
legacy.checked = GM_getValue("lga", "false") == true;
legacy.addEventListener("change", () => {
GM_setValue("lga", legacy.checked);
});
//不显示签名
let hideUserSign = document.querySelector("#hide_user_sign");
hideUserSign.checked = GM_getValue("hsg", "false") == true;
hideUserSign.addEventListener("change", () => {
GM_setValue("hsg", hideUserSign.checked);
});
if (hideUserSign.checked) {
document.querySelectorAll(".sign")?.forEach((sg) => {
sg.style = "display:none";
});
}
fetch("https://lalaki.cn/up/")
.then(async (res) => ({
status: res.status,
body: await res.text(),
}))
.then(({ status, body }) => {
if (status == 200 && body != FINAL_VERSION) {
document.querySelector("#up_pcbeta_tools").style.display = "inline";
} else {
document.querySelector("#up_pcbeta_tools").innerHTML =
"版本号: V" + FINAL_VERSION;
document.querySelector("#up_pcbeta_tools").style.display = "inline";
document
.querySelector("#up_pcbeta_tools")
.removeAttribute("href", location.href + "#");
document.querySelector("#up_pcbeta_tools").setAttribute("target", "");
}
});
document.querySelector("#tool_gui_save").onclick = () => {
GM_setValue("denyUsers", document.querySelector("#deny_users_area").value);
GM_setValue("fastMsgs", document.querySelector("#faster_msg_area").value);
document.querySelector("#tool_gui_close").click();
// eslint-disable-next-line
showDialog("配置已存储", "notice", "提示", () => {
location.reload();
});
};
//UI---
//加载快捷发言
const fastMsgList = GM_getValue("fastMsgs", "UNSET");
if (fastMsgList != "UNSET") {
let tmp = ("" + fastMsgList).trim();
if (tmp != "") {
document.querySelector("#faster_msg_area").value = tmp;
}
}
let denyUsers = [];
const denyList = GM_getValue("denyUsers", "UNSET");
if (denyList != "UNSET") {
let tmp = ("" + denyList).trim();
if (tmp != "") {
denyUsers = tmp.split("\n").map((it) => it.trim());
document.querySelector("#deny_users_area").value = tmp;
}
}
let me = (document.querySelector(".vwmy a")?.innerHTML + "").trim();
document.querySelector("#postlist")?.childNodes.forEach((p) => {
//在用户名后面添加拉黑按钮
let pid = p.id;
if (("" + pid).startsWith("post_")) {
let user = document.querySelector("#" + pid + " .authi a");
let username = ("" + user.innerHTML).trim();
if (username != "" && denyUsers.indexOf(username) != -1) {
p.style = "display:none";
}
let parent = user.parentNode;
let block = document.createElement("a");
block.innerHTML = "拉黑Ta";
block.style = "float:right;cursor:pointer";
block.onclick = () => {
if (block.innerHTML == "已拉黑") {
return;
}
// eslint-disable-next-line
showDialog(
"确定要拉黑 <b>" + username + "</b> 吗?",
"confirm",
"询问",
() => {
document.querySelector("#deny_users_area").value =
document.querySelector("#deny_users_area").value +
"\n" +
username;
document.querySelector("#tool_gui_save").click();
block.innerHTML = "已拉黑";
}
);
};
if (me != username) {
parent.append(block);
}
}
});
//拉黑核心代码v5
if (denyUsers.length > 0) {
const h0 = "display:none";
document.querySelectorAll(".quote").forEach((q) => {
let qu = ("" + q.innerText).trim();
denyUsers.forEach((u) => {
if (qu != "" && qu.startsWith(u)) {
q.style = h0;
}
});
});
document.querySelectorAll("a").forEach((a) => {
let parent = a;
let patch = false;
while (parent != null) {
let username = ("" + a.innerHTML).trim();
if (username == "" || denyUsers.indexOf(username) == -1) {
break;
}
let pid = ("" + parent.id).trim();
if (
pid.startsWith("post_") ||
pid.startsWith("stickthread_") ||
pid.startsWith("normalthread_")
) {
parent.style = h0;
break;
}
let pClass = ("" + parent.className).trim();
let nd = parent.nodeName.toLowerCase();
if (
pClass == "pbw" ||
pClass == "bw0_all" ||
nd == "tr" ||
nd == "li"
) {
//处理特殊情况
parent.style = h0;
break;
}
if (
pClass == "nts" ||
nd == "body" ||
pClass == "p_pop" ||
pClass == "y"
) {
//保护节点
break;
}
let pc = 0;
parent.querySelectorAll("a").forEach((pa) => {
if (pa.href.indexOf(a.href) != -1) {
pc++;
}
});
if (pc > 1) {
parent.style = h0;
patch = true;
break;
}
parent = parent.parentNode;
}
if (patch) {
//修复回复部分~~
parent = a;
while (parent != null) {
let pid = ("" + parent.id).trim();
if (
pid.startsWith("post_") ||
pid.startsWith("stickthread_") ||
pid.startsWith("normalthread_")
) {
parent.style = h0;
break;
}
parent = parent.parentNode;
}
}
});
}
//拉黑结束标记
//屏蔽等级显示
if (hideStar.checked) {
document
.querySelectorAll(".avatar_p")
.forEach((a) => (a.style = "display:none"));
document.querySelectorAll("p").forEach((st) => {
if (("" + st.id).startsWith("g_up")) {
st.style = "display:none";
}
});
}
//屏蔽徽章显示
if (hideAva.checked) {
document
.querySelectorAll(".md_ctrl")
.forEach((a) => (a.style = "display:none"));
}
//屏蔽论坛小表情
if (hideExp.checked) {
document.querySelectorAll("img").forEach((i) => {
if (
("" + i.src).startsWith("https://bbs.pcbeta.com/static/image/smiley")
) {
i.style = "display:none";
}
});
}
//一键客套发言修复版本
let faster = document.createElement("span");
if (fastMsg.checked) {
document.querySelector("#fast_send_msg_ct").style = "display:block";
let append = document.querySelector("#append_parent");
if (legacy.checked) {
setInterval(() => {
let r1 = document.querySelector("#fwin_content_reply .fpd");
if (r1 == null) {
r1 = document.querySelector(".bar");
}
if (r1 != null) {
r1.append(faster);
}
}, 500);
}
if (append != null) {
const observer = new MutationObserver((mutationsList) => {
for (let mutation of mutationsList) {
if (
mutation.type == "childList" &&
document.querySelector(".area textarea") != null
) {
setTimeout(() => {
let r1 = document.querySelector("#fwin_content_reply .fpd");
if (r1 == null) {
r1 = document.querySelector(".bar");
}
if (r1 != null) {
r1.append(faster);
}
}, 500);
}
}
});
observer.observe(append, {
childList: true,
});
}
}
faster.innerHTML = " 常用语模板";
faster.style =
"position:absolute;cursor:pointer;user-select:none;z-index:200";
faster.onclick = () => {
let fasterUIGet = faster.parentNode.querySelector("ul");
if (fasterUIGet != null) {
if (fasterUIGet.style.display == "block") {
fasterUIGet.style.display = "none";
} else {
fasterUIGet.style.display = "block";
}
return;
}
let fasterListUI = document.createElement("ul");
fasterListUI.style =
"left:" +
faster.offsetLeft +
"px;border-radius:3px;z-index:99999;user-select:none;padding:4px;margin-top: 26px;position:absolute;background:#fff; box-shadow: -5px 5px 10px rgba(0, 0, 0, 0.2),5px 5px 10px rgba(0, 0, 0, 0.2),0 5px 10px rgba(0, 0, 0, 0.2);";
let fastMsgs1 = document.querySelector("#faster_msg_area").value.trim();
if (fastMsgs1 != "") {
fasterListUI.innerHTML = "<style>.my-hover:hover{color:red;}</style>";
fastMsgs1.split("\n").forEach((fm) => {
let fasterListItem = document.createElement("li");
fasterListItem.innerHTML = fm;
fasterListItem.className = "my-hover";
fasterListItem.style = "cursor:pointer";
fasterListItem.onclick = () => {
let editContent = document.querySelector(".area textarea");
let editNb = editContent.nextElementSibling;
if (
editContent == null ||
(editNb != null && editNb.nodeName.toLowerCase() == "iframe")
) {
// eslint-disable-next-line
showDialog("当前页面不支持常用语");
}
if (editContent != null) {
document.querySelector(".area textarea").value =
fasterListItem.innerHTML;
}
fasterListUI.style.display = "none";
};
fasterListUI.append(fasterListItem);
});
faster.after(fasterListUI);
}
};
//装逼模式
let avas = [
"https://i.pcbeta.com/static/image/common/medal_201209/zscj.png",
"https://i.pcbeta.com/static/image/common/medal_201209/yxbz.png",
"https://i.pcbeta.com/static/image/common/medal_201209/xcs.png",
"https://i.pcbeta.com/static/image/common/medal_201209/ycxf.png",
"https://i.pcbeta.com/static/image/common/medal_201209/rxhy.png",
"https://i.pcbeta.com/static/image/common/medal_201209/jdz.png",
"https://i.pcbeta.com/static/image/common/medal_201209/hdzz.png",
"https://i.pcbeta.com/static/image/common/medal_201209/cyxf.png",
"https://i.pcbeta.com/static/image/common/medal_201209/jydr.png",
"https://i.pcbeta.com/static/image/common/medal_201209/ryhy.png",
"https://i.pcbeta.com/static/image/common/medal_201209/yjsf.png",
"https://i.pcbeta.com/static/image/common/medal_201209/yxbs.png",
"https://i.pcbeta.com/static/image/common/medal_201209/nmxx.png",
"https://i.pcbeta.com/static/image/common/medal_201209/mhdr.png",
"https://i.pcbeta.com/static/image/common/medal_201209/kfdr.png",
"https://i.pcbeta.com/static/image/common/medal_201209/jsdr.png",
"https://i.pcbeta.com/static/image/common/medal_201209/jzt.png",
"https://i.pcbeta.com/static/image/common/medal_201209/byg.png",
"https://i.pcbeta.com/static/image/common/medal_201209/yxdr.png",
"https://i.pcbeta.com/static/image/common/medal_201209/xbs.png",
"https://i.pcbeta.com/static/image/common/medal_201209/xbs2.png",
"https://i.pcbeta.com/static/image/common/medal_201209/pcdr.png",
"https://i.pcbeta.com/static/image/common/medal_201209/tsgx.png",
"https://i.pcbeta.com/static/image/common/medal_201209/ss.png",
"https://i.pcbeta.com/static/image/common/medal_201209/rich.png",
"https://i.pcbeta.com/static/image/common/medal_201209/7.png",
"https://i.pcbeta.com/static/image/common/medal_iety.png",
"https://i.pcbeta.com/static/image/common/medal_surface1.png",
"https://i.pcbeta.com/static/image/common/medal_movies.png",
"https://i.pcbeta.com/static/image/common/medal_appx.png",
"https://i.pcbeta.com/static/image/common/medal_zdx.png",
"https://i.pcbeta.com/static/image/common/medal_book.png",
"https://i.pcbeta.com/static/image/common/medal_8th.png",
"https://i.pcbeta.com/static/image/common/medal_smdr.png",
"https://i.pcbeta.com/static/image/common/medal_dianzan.png",
"https://i.pcbeta.com/static/image/common/medal_windowsphone.png",
"https://i.pcbeta.com/static/image/common/medal_worldcup.png",
"https://i.pcbeta.com/static/image/common/medal_daxuesheng.png",
"https://i.pcbeta.com/static/image/common/medal_9a.png",
"https://i.pcbeta.com/static/image/common/Win_10_forerunner.png",
"https://i.pcbeta.com/static/image/common/10.png",
"https://i.pcbeta.com/static/image/common/medal_201209/medal_11th.png",
];
if (showAllAva.checked) {
let bava = document.createElement("p");
bava.className = "md_ctrl";
avas.forEach((au) => {
let avico = document.createElement("img");
avico.src = au;
bava.append(avico);
});
document.querySelectorAll(".pil.cl").forEach((ckme) => {
let ifMe = ckme.parentNode.querySelector(".authi a").innerHTML.trim();
if (ifMe == me && me != "") {
ckme.after(bava);
}
});
}
let shortcut = document.createElement("a");
shortcut.innerHTML = "远景小助手";
shortcut.style = "cursor:pointer;user-select:none";
shortcut.onclick = () => {
if (gui.style.display == "block") {
return;
}
gui.style.display = "block";
let top = -1000;
let iv = setInterval(() => {
if (top <= 0) {
gui.style.top = top + "px";
top += 100;
} else {
clearInterval(iv);
}
}, 15);
};
let alla = document.querySelectorAll("a");
for (let i = 0; i < alla.length; i++) {
if (["马甲", "快捷导航", "返回首页"].indexOf(alla[i]?.innerHTML) != -1) {
alla[i].before(shortcut);
break;
} else if (alla[i]?.innerHTML == "登录") {
let tmpli = document.createElement("li");
tmpli.style = "width:auto";
tmpli.append(shortcut);
alla[i].parentNode.before(tmpli);
tmpli.parentNode.style = "width:auto";
shortcut.style =
"width:auto;padding:0 0 0 5px;cursor:pointer;user-select:none";
break;
}
}
if (hideDetail.checked) {
document.querySelectorAll(".pil.cl")?.forEach((dt) => {
dt.style = "display:none";
});
}
})();