// ==UserScript== // @name Young People in Yaohuo // @description 青少年模式 // @version 0.8 // @author Polygon // @match https://yaohuo.me/* // @icon https://yaohuo.me/css/favicon.png // @grant GM_addStyle // @grant GM_info // @run-at document-end // @namespace https://greasyfork.org/users/808618 // @downloadURL https://update.greasyfork.icu/scripts/454965/Young%20People%20in%20Yaohuo.user.js // @updateURL https://update.greasyfork.icu/scripts/454965/Young%20People%20in%20Yaohuo.meta.js // ==/UserScript== (function() { 'use strict'; // 添加一个style,PC端字体有点看不清 GM_addStyle(` body, html { font-family: Arial, SimHei !important; } `) let forbiddenLocal if (localStorage.getItem("forbidden") == null) { forbiddenLocal = {keywords: [], usernames: []} localStorage.setItem("forbidden", JSON.stringify(forbiddenLocal)) } forbiddenLocal = JSON.parse(localStorage.getItem("forbidden")) const keywords = forbiddenLocal.keywords const usernames = forbiddenLocal.usernames // 在record中读取k,读取过程中可能会初始化record[k] let getRecord = (itemid) => { if (localStorage.getItem("record-version") != GM_info.script.version) { localStorage.removeItem("record") alert("清空老版本record成功") localStorage.setItem("record-version", GM_info.script.version) } // 读取最新localStorage的record let record = localStorage.getItem("record") record = JSON.parse(record) if (record == null) { // 第一次初始化 record = {} } if (!Object.keys(record).includes(itemid)) { record[itemid] = { "latest_time": null, // 最近一次访问时间戳 "latest_comment": 0, // 上一次访问时的评论数量 "latest_read": 0, // 上一次访问时的阅读数量 "count": 0, // 访问次数 } } return record } // 指定k,添加一个时间戳 let recordAdd = (itemid, comment=null, read=null) => { let record record = getRecord(itemid) // 防止重复添加 if (comment != null && read != null) { // 这俩应该在帖子打开后解析更新 record[itemid]["latest_comment"] = comment record[itemid]["latest_read"] = read } else { // 没有这两个参数就只更新次数 if (record[itemid]["latest_time"] && (new Date()).valueOf() - record[itemid]["latest_time"] < 1e3) return record[itemid]["latest_time"] = (new Date()).valueOf() record[itemid]["count"] ++ } // 记录更新后record localStorage.setItem("record", JSON.stringify(record)) } function timestampToTime(timestamp) { // https://www.byteblogs.com/article/259 var date = new Date(timestamp) var Y = date.getFullYear() + '-' var M = (date.getMonth()+1 < 10 ? '0'+(date.getMonth()+1) : date.getMonth()+1) + '-' var D = date.getDate() + ' ' var h = date.getHours() + ':' var m = date.getMinutes() + ':' var s = date.getSeconds() return Y+M+D+h+m+s } let getTimeInfo = (t) => { let delta = ((new Date()).valueOf() - t) / 1000 if (delta < 60) { // 小于60秒 delta = `${parseInt(delta)}秒前` } else if (delta / (60 ** 2) < 1) { // 小于一小时 delta = `${parseInt(delta / 60)}分前` } else if (delta / (60 ** 3) < 24) { // 小于一天 delta = `${parseInt(delta / (60 ** 2))}时前` } else { // 直接显示日期 delta = timestampToTime(t) } return delta } let parseElement = (ele) => { let itemid = ele.querySelector("a").href.match(/bbs-(\d+)/)[1] let [text, info, _] = ele.innerText.split("\n") let [username, comment, read] = info.split("/") comment = parseInt(comment.replace("回", "")) read = parseInt(read.replace("阅", "")) return [itemid, text, username, comment, read] } let validate = (text) => { return keywords.filter((keyword) => { return text.match(new RegExp(keyword, "gi")) }).length } let setting = () => { // 当前搜索屏蔽词settingText let div = document.createElement("div") div.setAttribute("id", "setting") let maxWidth = parseInt(getComputedStyle(document.querySelector(".btBox")).width.replace("px", "")) div.innerHTML = `
` document.body.insertBefore(div, document.querySelector(".btbox")) setTimeout(() => { // 按钮展开 document.querySelector("#switch").addEventListener("click", function (e) { console.log(this) if (this.classList.contains("open")) { // 关闭 this.classList.remove("open") this.classList.add("close") this.querySelector("svg#close").style.display = "" this.querySelector("svg#open").style.display = "none" document.querySelector(".forbidden-selection").style.display = "none" } else if (this.classList.contains("close")){ // 打开 this.classList.remove("close") this.classList.add("open") this.querySelector("svg#close").style.display = "none" this.querySelector("svg#open").style.display = "" document.querySelector(".forbidden-selection").style.display = "flex" } }) // 数据选择 document.querySelector(".forbidden-selection input").addEventListener('click', (event) => { // 输入状态input-box边框变色 document.querySelector(".forbidden-selection .input-box").setAttribute('active', '') }) document.querySelector(".forbidden-selection input").addEventListener('blur', (event) => { // 失去焦点恢复 document.querySelector(".forbidden-selection .input-box").removeAttribute('active') }) let getSelectedForbiddenTags = () => { let forbiddenTags = [] let selectedNodes = document.querySelectorAll('.input-box .forbidden-tag') if (selectedNodes.length) { selectedNodes.forEach((ele) => { forbiddenTags.push(ele.getAttribute('value')) }) } return forbiddenTags } let isUseranme = (text) => { return text.search(/["'“].+["'”]/) != -1 } let removeForbiddenTag = (forbiddenTag) => { // 取消要从数据库删除 let forbiddenLocal = JSON.parse(localStorage.getItem("forbidden")) if (isUseranme(forbiddenTag)) { // 是用户 forbiddenLocal.usernames = forbiddenLocal.usernames.filter(tag=>{ return tag != forbiddenTag.slice(1, -1) }) } else { forbiddenLocal.keywords = forbiddenLocal.keywords.filter(tag=>{ return tag != forbiddenTag }) } localStorage.setItem("forbidden", JSON.stringify(forbiddenLocal)) } let saveForbiddenTag = (forbiddenTag) => { // 更新到本地 let forbiddenLocal = JSON.parse(localStorage.getItem("forbidden")) // 判断新增类型是否为用户 if (isUseranme(forbiddenTag)) { // 是用户 if (!forbiddenLocal.usernames.includes(forbiddenTag)) { forbiddenLocal.usernames.push(forbiddenTag.slice(1,-1)) } } else { if (!forbiddenLocal.keywords.includes(forbiddenTag)) { forbiddenLocal.keywords.push(forbiddenTag) } } // 储存 localStorage.setItem("forbidden", JSON.stringify(forbiddenLocal)) } let createForbiddenTag = (forbiddenTag) => { // 判断是否存在 if (getSelectedForbiddenTags().includes(forbiddenTag)) return let div = document.createElement('div') div.className = 'forbidden-tag' div.setAttribute('value', forbiddenTag) // 方便取变量 div.innerHTML = ` ${forbiddenTag}