// ==UserScript== // @name 8chan Upvote // @namespace erin // @description Up and downvote posts on 8chan :^) // @include *//8ch.net/*/res/* // @version 1 // @grant none // @run-at document-end // ==/UserScript== function chanUpvote(){ var d, db, h, namespace, $, $$, version; d = document; db = document.body; h = document.getElementsByTagName('head')[0]; namespace = "8chanUpvote"; version = 0.01; if(window.location.href.indexOf('8ch.net') > 0){ var $siteDomain = '8ch.net'; }else{ var $siteDomain = '8chan.co'; } $ = function(s, p){ if(!p || p == null){ p = db; } return p.querySelector(s); }; $$ = function(s, p){ if(!p || p == null){ p = db; } return p.querySelectorAll(s); }; $.getVal = function(k, v){ if(typeof(Storage) !=="undefined"){ if(v == null){ if(localStorage.getItem(namespace + "." + k) != null){ return localStorage.getItem(namespace + "." + k); }else{ return 'undefined'; } }else{ if(localStorage.getItem(namespace + "." + k) != null){ return localStorage.getItem(namespace + "." + k); }else{ return v; } } }else{ return 'storage unavailable'; } }; $.setVal = function(k, v){ if(typeof(Storage) !=="undefined"){ if(v == null){ return 'undefined'; }else{ return localStorage.setItem(namespace + "." + k, v); } }else{ return 'storage unavailable'; } }; $.delVal = function(k){ return localStorage.removeItem(namespace + "." + k); }; $.elm = function(t, a, s){ var e = d.createElement(t); if(a){ for (key in a){ e.setAttribute(key, a[key]); } } if(s){ s.appendChild(e); } return e; }; $.htm = function(s, v){ if(v == null){ return s.innerHTML; }else{ s.innerHTML = v; } return s; }; $.each = function(a, c, e){ for(var i = 0; i < a.length; i++){ c(a[i], i); if(i == (a.length)-1){ if(e && e != null){ return e(a[i], i); }else{ return a; } } } }; $.xhr = function(t, u, i, c, p){ if(i != null){ if(t == 'POST'){ var xd = new FormData(); for (key in i){ xd.append(key, i[key]); } }else{ xd = '?'; for (key in i){ xd += key + '=' + i[key] + '&'; } xd = xd.substring(0, (xd.length-1)); u += xd; } } var x = new XMLHttpRequest(); x.open(t, u); if(p != null){ for (key in p){ x.setRequestHeader(key, p[key]); } } x.onreadystatechange = function(){ if (x.readyState == 4) { return c(x); } } if(t == 'POST' && i != null){ x.send(xd); }else{ x.send(); } }; $.JSON = function(s){ if(typeof s == 'string'){ return JSON.parse(s); }else{ return JSON.stringify(s); } }; $.time = function(t, c, l){ if(c == false){ return clearInterval(t); }else{ if(l == true){ return setInterval(function(){ c(); },t); }else{ return setTimeout(function(){ c(); },t); } } }; $.val = function(s, v){ if(!v || v == null){ return s.value; }else{ s.value = v; } return s; }; $.event = function(t, i, s){ if (i == null) { i = {}; } if (s == null) { s = d; } return s.dispatchEvent(new CustomEvent(t, i)); }; $.att = function(s, a, v) { if (!v || v == null || v == false) { if (v == false) { return s.removeAttribute(a); } else { return s.getAttribute(a); } } else { s.setAttribute(a, v); return s; } }; $.destroy = function(s) { return s.parentNode.removeChild(s); }; $.css = function(s){ var e = d.createElement('style'); e.type = 'text/css'; if (e.styleSheet){ e.styleSheet.cssText = s; } else { e.appendChild(d.createTextNode(s)); } h.appendChild(e); return e; }; $.onCursor = function(myField, myValue){ if (document.selection) { myField.focus(); sel = document.selection.createRange(); sel.text = myValue; }else if(myField.selectionStart || myField.selectionStart == '0'){ var startPos = myField.selectionStart; var endPos = myField.selectionEnd; myField.value = myField.value.substring(0, startPos) + myValue + myField.value.substring(endPos, myField.value.length); }else{ myField.value += myValue; } }; $.after = function(e, s){ s.parentNode.insertBefore(e, s.nextSibling); return e; }; $.getSelected = function(){ var text = ""; if (window.getSelection) { text = window.getSelection().toString(); } else if (document.selection && document.selection.type != "Control") { text = document.selection.createRange().text; } return text; }; /*------------------------------------------*/ var k, w; var $siteDomain = '8ch.net'; w = window.location.href; k = {}; if($siteDomain == '8ch.net'){ k.end = w.split('.net')[1]; }else{ k.end = w.split('.co')[1]; } k.proto = window.location.protocol; if(k.end.indexOf('mod.php?') > 0){ if(k.end.length > 3 && w.split('mod.php?/')[1].indexOf('/') > 0 && w.indexOf('/src/') < 1){ k.board = w.split('mod.php?/')[1].split('/')[0]; }else{ k.board = null; } if(w.indexOf('/res/') > 1){ k.thread = w.split('/res/')[1].split('+')[0].split('.')[0]; }else if(w.indexOf('catalog') > 2){ k.thread = 'catalog'; }else{ k.thread = 'mod'; } }else{ if(k.end.length > 3 && w.split($siteDomain+'/')[1].indexOf('/') > 0 && w.indexOf('/src/') < 1){ k.board = w.split($siteDomain+'/')[1].split('/')[0]; }else{ k.board = null; } if(w.indexOf('/res/') > 1){ k.thread = w.split('/res/')[1].split('+')[0].split('.h')[0]; }else if(w.indexOf('catalog') > 2){ k.thread = 'catalog'; }else{ k.thread = 'index'; } } /*-------------------------------------------------------*/ function makeVoters(){ $.each($$('.reply'), function(post, pi){ if(!$('.voter', post)){ var $postId = $('.post_anchor', post).id; var $el = {}; $el['class'] = 'voter'; $el = $.elm('span', $el, $('label', post)); $el.innerHTML = ' ( / : 0 )'; $('#voteUp-' + $postId).addEventListener('click', function(){ sendVote($postId, 'up'); }, false); $('#voteDown-' + $postId).addEventListener('click', function(){ sendVote($postId, 'dwn'); }, false); } }, function(jk, kl){ getVotes(); }); } function getVotes(){ var xhr = new XMLHttpRequest(); xhr.open("GET", k.proto + '//erin.wtf/api/vote/vote.php?method=get&thread=' + k.thread + '&board=' + k.board); xhr.onreadystatechange = function(){ if(xhr.readyState == 4){ var $re = $.JSON(xhr.responseText); for(key in $re){ console.log($re[key]); if($('#votes-' + key)){ $('#votes-' + key).innerHTML = $re[key]; } } } } xhr.send(); } function sendVote(po, vo){ var xhr = new XMLHttpRequest(); xhr.open("GET", k.proto + '//erin.wtf/api/vote/vote.php?method=vote&thread=' + k.thread + '&board=' + k.board + '&post=' + po + '&vote=' + vo); xhr.onreadystatechange = function(){ if(xhr.readyState == 4){ getVotes(); } } xhr.send(); } function build(){ makeVoters(); getVotes(); } build(); $.time(3000, function(){ getVotes(); makeVoters(); }, true); d.addEventListener('8chan-Z.NewPosts', function(){ build(); }, false); d.addEventListener('threadUpdate', function(){ build(); }, false); d.addEventListener('new_post', function(){ build(); }, false); } chanUpvote();