// ==UserScript==
// @name markList Script
// @namespace http://tampermonkey.net/
// @version 0.1.7
// @description special Follows!
// @author 行亦难
// @match https://*.summer-plus.net/*
// @match https://*.level-plus.net/*
// @match https://*.white-plus.net/*
// @match https://*.south-plus.net/*
// @match https://*.imoutolove.me/*
// @grant GM_setValue
// @grant GM_getValue
// ==/UserScript==
// 最大条数
var max_count = 100;
(function() {
'use strict';
//use tools
if(!jQuery){
console.log('没获取到jq');
return;
}
home_element();
home_event();
if(window.location.pathname.includes('index.php') || window.location.pathname == '/'){
console.log('首页')
}else if(window.location.pathname == '/u.php'){
console.log('用户信息')
}else if(window.location.pathname == '/read.php'){
console.log('帖子详情')
// if(jQuery('a[href$="fid-48.html"].gray3').length){
if(jQuery('.crumbs-item.gray3').text().includes('询问&求物')){
page_element();
}
}else{
console.log('其他页面')
}
//initTempDiv(`/read.php?tid-1020134.html`)
// Your code here...
})();
function home_event(){
// 获取元素和初始值
let oBox = document.querySelector('.div1'),
disX = 0, disY = 0;
let div2 = document.querySelector('.div2');
let close2 = document.querySelector('.c-close');
let open2 = document.querySelector('.c-open');
let refresh = document.querySelector('.refresh-btn');
let loader = document.querySelector('.c-loader');
// 容器鼠标按下事件
oBox.onmousedown = function (e) {
let ev = e || window.event;
disX = ev.clientX - this.offsetLeft;
disY = ev.clientY - this.offsetTop;
document.onmousemove = function (e) {
let ev = e || window.event;
oBox.style.left = (ev.clientX - disX) + 'px';
oBox.style.top = (ev.clientY - disY) + 'px';
};
document.onmouseup = function () {
document.onmousemove = null;
document.onmouseup = null;
};
return false;
};
// 事件不冒泡
div2.onmousedown = (event) => {
event.stopPropagation();
}
close2.onclick = () => {
oBox.style.display = 'none';
open2.style.display = 'block';
}
open2.onclick = (event) => {
oBox.style.display = 'block';
//event.target.style.display = 'none';
jQuery('.c-open').hide()
}
refresh.onclick = () => {
while (document.querySelector('.c-item')) {
document.querySelector('.c-item').remove();
}
loader.style.display = 'block';
refresh.style.display = 'none';
let mark_map = GM_getValue('mark_map') ? GM_getValue('mark_map') : new Object();
let arr_p = []
for(let item in mark_map){
arr_p.push(initTempDiv(`/read.php?tid=${item}`, item));
}
Promise.all(arr_p).then((res)=>{
console.log(res);
for(let i of res){
if(i.isAnswer){
mark_map[i.id].isAnswer = true;
}else{
mark_map[i.id].isAnswer = false;
}
}
GM_setValue('mark_map', mark_map);
loader.style.display = 'none';
refresh.style.display = 'block';
addHomeList();
})
console.log('循环结束')
return;
//GM_setValue('mark_map', mark_map);
setTimeout(() => {
loader.style.display = 'none';
refresh.style.display = 'block';
addHomeList();
}, 2000)
}
// 清空已读
let reset2 = document.querySelector('.c-reset');
reset2.onclick = () => {
let mark_map = GM_getValue('mark_map');
if(mark_map){
let arr_temp = []
for(let i in mark_map){
if(mark_map[i].rank == 2){
arr_temp.push(mark_map[i])
delete mark_map[i];
}
}
if(arr_temp.length > 0){
GM_setValue('mark_map', mark_map);
while (document.querySelector('.c-item')) {
document.querySelector('.c-item').remove();
}
addHomeList();
}
}
}
}
function home_element(){
// 初始化悬浮窗节点
let cssDiv = document.createElement('style');
cssDiv.innerHTML = initCss();
//let nTable = document.querySelector('#main .t table');
//nTable.appendChild(cssDiv);
let $ = jQuery;
$('#toptool').append($(cssDiv))
$('#toptool').append($(initHtml()))
// 12.12更新
$('#guide').prepend($('.c-open'));
// 缓存中读取列表
addHomeList()
}
function page_element(){
let $ = jQuery;
$('#toptool').append($(initMark()));
// 12.12更新
let tizName = $('strong [href^=read]').text();
let tizUrl = window.location.pathname + window.location.search;
let tizId = tizUrl.match(/[0-9]+/).toString();
// 加强匹配
//let isAnswer = Boolean($('.tpc_content:eq(3) .s3').length);
let isAnswer = false;
if($('.tpc_content:eq(3) .s3').length){
if($('.tpc_content:eq(3) .s3').text().includes('最佳答案奖励')){
isAnswer = true
}
}else{
isAnswer = false;
}
let map = GM_getValue('mark_map') ? GM_getValue('mark_map') : new Object();
$('.t3').prepend($('.c-mark'));
let flag = true
for(let key in map){
if(key === tizId){
flag = false;
$('.c-mark').addClass('unmark').text('已 Mark');
}
}
// 点击mark
$('.c-mark').click((event)=>{
console.log($(event.target));
console.log(flag);
flag=!flag;
//console.log(tizName, tizUrl, tizId, isAnswer)
map[tizId] = {tizName, tizUrl, tizId, isAnswer, rank: isAnswer?0:1}
if(flag){
$('.c-mark').removeClass('unmark').text('Mark');
delete map[tizId];
GM_setValue('mark_map', map);
}else{
$('.c-mark').addClass('unmark').text('已 Mark');
if(Object.keys(map).length > max_count){
return
}
GM_setValue('mark_map', map);
}
})
}
function addHomeList(){
// 缓存中读取列表
let $ = jQuery;
let mark_map = GM_getValue('mark_map') ? GM_getValue('mark_map') : new Object();
if(!Object.keys(mark_map).length){
$('.c-items').append($(`
<div class="c-item">
<a href="">
没有mark了~
</a>
</div>`))
}
let arr = [];
for (let key in mark_map) {
arr.push(mark_map[key]);
}
if (arr.length > 0) {
if (arr.length > 1) {
arr.sort(function (a, b) {
return a.rank - b.rank;
})
}
for(let item of arr){
let str = `<div class="c-item" data-id="${item.tizId}">
<span class="isRead">${item.rank == 2 ? '[已读]' : ''}</span>
<a href="${item.tizUrl}" class="c-item-text" data-id="${item.tizId}" target="_blank">
${item.tizName}
</a>
<b class="answer">${item.isAnswer ? '[有答案]' : ''}</b>
<strong><a href="javascript:void(0);" class="c-del">[删除]</a></strong>
</div>`
$('.c-items').append($(str))
}
}
$('.c-del').click(function(event){
//删除marke
let item = $(event.target).parent().parent();
console.log(item.data())
if(item.data().id){
item.remove()
//console.log(mark_map)
delete mark_map[item.data().id]
GM_setValue('mark_map', mark_map);
}
})
//点击有答案的,标记已读
$('.c-item-text').on('click', function(event){
console.log($(event.target).data())
let id = $(event.target).data().id
if(id && mark_map[id].isAnswer){
$('.c-items').append($(event.target).parent())
mark_map[id].rank = 2;
GM_setValue('mark_map', mark_map);
$(event.target).parent().find('.isRead').text('[已读]');
}
})
}
function delItem(id){
}
async function initTempDiv(url, id){
// 创建缓存节点,解析文本形式的html
let $ = jQuery;
let p1 = await getPageData(url);
let tempDiv = document.createElement('div');
tempDiv.innerHTML = p1;
let tic = $(tempDiv)
//let flag = tic.find('.tpc_content:eq(3) .s3').get(0)
let flag = false;
if(tic.find('.tpc_content:eq(3) .s3').length){
if(tic.find('.tpc_content:eq(3) .s3').text().includes('最佳答案奖励')){
flag = true
}
}else{
flag = false;
}
if(flag){
console.log(flag)
return {isAnswer:Boolean(flag), id};
}else{
console.log('无')
return {isAnswer: false, id};
}
}
// 获取求物区的帖子数据
function getPageData(url){
return new Promise(function(resolve, reject){
let xhr = new XMLHttpRequest();
xhr.open('GET', url, true);
xhr.onreadystatechange = function() {
if (xhr.readyState == 4 && xhr.status == 200 || xhr.status == 304) {
resolve(xhr.responseText)
}
}
xhr.send();
})
}
function initHtml(){
return `<div class="div1">
<span> 此处拖动</span><span> >>>> Mark列表</span>
<span class="btn c-close">缩小</span>
<span class="btn c-reset">清空已读</span>
<div class="div2">
<div class="c-items">
</div>
<div class="c-loader">
<div class="loader">Loading...</div>
</div>
</div>
<div class="refresh-btn">
<span class="btn">刷新</span>
</div>
</div>
<li class="c-open">
<a href="javascript:void(0);">Mark列表</a>
</li>`
}
function initMark(){
return `<div class="c-mark btn">Mark</div>`
}
function initCss() {
// 初始化样式
let textCss = `
.div1 {
width: 20vw;
min-height: 100px;
max-height: 75vh;
position: fixed;
right: 0;
top: 30%;
padding-top: 20px;
border-radius: 5px;
overflow-x: hidden;
overflow-y: scroll;
z-index: 999;
text-align: left;
cursor: pointer;
display:none;
background-color: white;
border: 1px solid black;
}
.c-open{
cursor: pointer;
float: left;
}
.refresh-btn{
height: 20px;
padding: 8px;
width: max-content;
}
.div2 {
margin-top: 20px;
min-height: 200px;
background-color: white;
border-bottom: 1px solid;
border-top: 1px solid;
}
.c-close, .c-reset {
cursor: pointer;
float: right;
margin-right: 5px;
padding: 2px 10px;
}
.c-item {
line-height: 24px;
border-bottom: 1px dashed;
padding: 0 0 0 3px;
}
.c-mark{
cursor: pointer;
float: right;
color: white;
width: 83px;
height: 25px;
line-height: 25px;
margin: 0 5px;
font-size: 18px;
border-radius: 3px;
text-align: center;
position: relative;
z-index: 1;
overflow: hidden;
box-shadow: 0rem 0.25rem 0.25rem rgb(45, 50, 58);
cursor: pointer;
transition: all 200ms ease;
}
.unmark{
filter: grayscale(100%);
}
.answer {
color:red;
}
.c-loader {
display: none;
}
.loader {
color: yellow;
font-size: 60px;
text-indent: -9999em;
overflow: hidden;
width: 1em;
height: 1em;
border-radius: 50%;
margin: 0px auto;
position: relative;
-webkit-transform: translateZ(0);
-ms-transform: translateZ(0);
transform: translateZ(0);
-webkit-animation: load6 1.7s infinite ease, round 1.7s infinite ease;
animation: load6 1.7s infinite ease, round 1.7s infinite ease;
}
@-webkit-keyframes load6 {
0% {
box-shadow: 0 -0.83em 0 -0.4em, 0 -0.83em 0 -0.42em, 0 -0.83em 0 -0.44em, 0 -0.83em 0 -0.46em, 0 -0.83em 0 -0.477em;
}
5%,
95% {
box-shadow: 0 -0.83em 0 -0.4em, 0 -0.83em 0 -0.42em, 0 -0.83em 0 -0.44em, 0 -0.83em 0 -0.46em, 0 -0.83em 0 -0.477em;
}
10%,
59% {
box-shadow: 0 -0.83em 0 -0.4em, -0.087em -0.825em 0 -0.42em, -0.173em -0.812em 0 -0.44em, -0.256em -0.789em 0 -0.46em, -0.297em -0.775em 0 -0.477em;
}
20% {
box-shadow: 0 -0.83em 0 -0.4em, -0.338em -0.758em 0 -0.42em, -0.555em -0.617em 0 -0.44em, -0.671em -0.488em 0 -0.46em, -0.749em -0.34em 0 -0.477em;
}
38% {
box-shadow: 0 -0.83em 0 -0.4em, -0.377em -0.74em 0 -0.42em, -0.645em -0.522em 0 -0.44em, -0.775em -0.297em 0 -0.46em, -0.82em -0.09em 0 -0.477em;
}
100% {
box-shadow: 0 -0.83em 0 -0.4em, 0 -0.83em 0 -0.42em, 0 -0.83em 0 -0.44em, 0 -0.83em 0 -0.46em, 0 -0.83em 0 -0.477em;
}
}
@keyframes load6 {
0% {
box-shadow: 0 -0.83em 0 -0.4em, 0 -0.83em 0 -0.42em, 0 -0.83em 0 -0.44em, 0 -0.83em 0 -0.46em, 0 -0.83em 0 -0.477em;
}
5%,
95% {
box-shadow: 0 -0.83em 0 -0.4em, 0 -0.83em 0 -0.42em, 0 -0.83em 0 -0.44em, 0 -0.83em 0 -0.46em, 0 -0.83em 0 -0.477em;
}
10%,
59% {
box-shadow: 0 -0.83em 0 -0.4em, -0.087em -0.825em 0 -0.42em, -0.173em -0.812em 0 -0.44em, -0.256em -0.789em 0 -0.46em, -0.297em -0.775em 0 -0.477em;
}
20% {
box-shadow: 0 -0.83em 0 -0.4em, -0.338em -0.758em 0 -0.42em, -0.555em -0.617em 0 -0.44em, -0.671em -0.488em 0 -0.46em, -0.749em -0.34em 0 -0.477em;
}
38% {
box-shadow: 0 -0.83em 0 -0.4em, -0.377em -0.74em 0 -0.42em, -0.645em -0.522em 0 -0.44em, -0.775em -0.297em 0 -0.46em, -0.82em -0.09em 0 -0.477em;
}
100% {
box-shadow: 0 -0.83em 0 -0.4em, 0 -0.83em 0 -0.42em, 0 -0.83em 0 -0.44em, 0 -0.83em 0 -0.46em, 0 -0.83em 0 -0.477em;
}
}
@-webkit-keyframes round {
0% {
-webkit-transform: rotate(0deg);
transform: rotate(0deg);
}
100% {
-webkit-transform: rotate(360deg);
transform: rotate(360deg);
}
}
@keyframes round {
0% {
-webkit-transform: rotate(0deg);
transform: rotate(0deg);
}
100% {
-webkit-transform: rotate(360deg);
transform: rotate(360deg);
}
}`;
return textCss;
}