Greasy Fork

Upboats

Adds upvote and downvote buttons to 4chan threads

目前为 2016-03-02 提交的版本。查看 最新版本

// ==UserScript==
// @name Upboats
// @namespace upboats
// @version 2015.08.16
// @include *://boards.4chan.org/*
// @grant GM_xmlhttpRequest
// @description Adds upvote and downvote buttons to 4chan threads
// ==/UserScript==
'use strict';

function element(tag,parent,attributes,innerhtml){
	var newtag=document.createElement(tag)
	if(attributes){
		for(var i in attributes){
			newtag.setAttribute(i,attributes[i])
		}
	}
	if(innerhtml){
		newtag.innerHTML=innerhtml
	}
	if(parent){
		parent.appendChild(newtag)
	}
	return newtag
}

function giveboats(startfrom,query){
	var posts=[]
	for(var i=startfrom||0;i<query.length;i++){
		if(!query[i].getElementsByClassName('boatcontainer').length){
			var theid=query[i].id.match(/\d+/)[0]
			posts.push(theid)
			var cnt=element('div',0,{
				class:'boatcontainer',
				'data-boat':theid
			})
			element('div',cnt,{
				class:'upboat'
			}).onclick=function(event){
				boat(event,'+')
			}
			element('div',cnt,{
				class:'boatsnum'
			},'\u2022').onclick=function(event){
				boat(event,'*')
			}
			element('div',cnt,{
				class:'downboat'
			}).onclick=function(event){
				boat(event,'-')
			}
			if(query[i].classList.contains('opContainer')){
				var sidearrows=query[i].getElementsByClassName('postMessage')[0]
				sidearrows.parentNode.insertBefore(cnt,sidearrows)
			}else{
				var sidearrows=query[i].getElementsByClassName('sideArrows')[0]
				sidearrows.parentNode.replaceChild(cnt,sidearrows)
			}
		}
	}
	if(posts.length){
		getboats(posts)
	}
}

function boat(event,upordown){
	var postnumber=event.target.parentNode.getAttribute('data-boat')
	GM_xmlhttpRequest({
		method:'get',
		url:'http://kek.grn.cc/boat/?r='+upordown+'&brd='+currentboard+'&tid='+postnumber,
		onload:function(response){
			if(response.status==200){
				var boats=response.responseText.replace(/\n$/,'').split(' ')
				var post=event.target.parentNode
				if(upordown=='*'){
					boats=boats.splice(1)
				}
				boatready(boats,post)
			}
		}
	})
}

function getboats(posts){
	if(posts.length>101){
		posts.splice(1,posts.length-101)
	}
	posts=posts.join(',')
	GM_xmlhttpRequest({
		method:'post',
		headers:{
			'Content-type':'application/x-www-form-urlencoded'
		},
		url:'http://kek.grn.cc/boat/?r=*&brd='+currentboard,
		data:'tid='+posts,
		onload:function(response){
			if(response.status==200){
				var boatarray=response.responseText.replace(/\n$/,'').split('\n')
				for(var i=0;i<boatarray.length;i++){
					if(boatarray[i].length){
						var boats=boatarray[i].split(' ')
						var post=document.querySelector('[data-boat="'+boats[0]+'"]')
						boatready(boats.splice(1),post)
					}
				}
			}
		}
	})
}

function boatready(boats,post){
	var upboat=post.getElementsByClassName('upboat')[0]
	var downboat=post.getElementsByClassName('downboat')[0]
	var number=post.getElementsByClassName('boatsnum')[0]

	if(upboat&&downboat&&number){
		upboat.className='upboat'
		downboat.className='downboat'
		if(boats[0]=='+'){
			upboat.className='upboat highboat'
		}else if(boats[0]=='-'){
			downboat.className='downboat highboat'
		}
		number.innerHTML=boats[1]-boats[2]||'\u2022'
		number.title='Up: '+boats[1]+', Down: '+boats[2]
	}
}

function updateposts(){
	if(!waiting){
		waiting=1
		setTimeout(function(){
			var query=document.querySelectorAll('.replyContainer,.opContainer')
			if(cachr<query.length){
				giveboats(cachr,query)
				cachr=query.length
			}
			waiting=0
		},100)
	}
}

var currentboard=location.pathname.match(/^\/([^\/]+)\//)
if(currentboard){
	currentboard=currentboard[1]
}else{
	currentboard=''
}
var cachr=0
var waiting=0

if(currentboard){
	updateposts()
	document.addEventListener('4chanParsingDone',updateposts)
}

element('style',document.head,0,'\
.boatcontainer{\
	display:inline-block;\
	font-family:verdana;\
	float:left;\
	vertical-align:top;\
	margin-top:5px;\
	width:31px;\
}\
.opContainer .boatcontainer{\
	float:none;\
	margin-top:-20px;\
}\
.boatsnum{\
	width:30px;\
	height:16px;\
	font-size:13px;\
	color:#c6c6c6;\
	font-weight:bold;\
	text-align:center;\
	cursor:default;\
}\
.downboat{\
	background-position:-15px 0;\
}\
.highboat.upboat{\
	background-position:0 -14px;\
}\
.highboat.downboat{\
	background-position:-15px -14px;\
}\
.upboat,.downboat{\
	cursor:pointer;\
	margin:0 auto;\
	width:15px;\
	height:14px;\
	background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAcCAMAAABBJv+bAAAAkFBMVEX///+3t7e9vb2UlP/b29v/s5e0tP+4uLi+vr7/i2C8vLzU1NTOzs7/jGG2trb/k2uamv+np/+urv+hof//rI3/o4H/m3bCwsLc3NzT09P/mXPKysrNzc3/v6f/lW3Y2NjHx8fBwcG7u/+pqf//pob/uqGwsP//rY6bm/+env+Skv/Bwf/AwMDIyMi/v///il5tvt3qAAAAAXRSTlMAQObYZgAAAPtJREFUeF590QeOhTAMRVE79N75vdfp+9/dOAP8PBRpLhIIHWRCoDEmaOm67pIgjgNgN0lWLmgQsmLDh+02PYCemPnT+Op4/ErMZNFc/DU/XSxO6UvDPM/F83DyjYrjzTRZsTaWFBOHSmIOVCiHfT9/GqfZ78K1WCu1vwS/094H3CV7F3GP//8HNC9D/NDNtMiQfd//Rt1He/BzXddn0HUURWvjflVV/lzR703T3GHyX2b+pSzLy0x/RneeOscZr6K6LBuv4o70rk+iQ9eiKK40NDgqPfq+f9DkbxrlTFNe13UeoaPSrW3bGxl/wmRp53nejsBLUWAdQZP+As6xFYUbzgTbAAAAAElFTkSuQmCC")\
}'.replace(/\s+/g,' ').replace(/\/\*((?!\*\/).)*\*\//g,'').replace(/;? ?} ?/g,'}').replace(/ ?([{,;]) ?/g,'$1'))