IPB Thread Updater

shows new posts while reading a thread

Dovrai installare un'estensione come Tampermonkey, Greasemonkey o Violentmonkey per installare questo script.

You will need to install an extension such as Tampermonkey to install this script.

Dovrai installare un'estensione come Tampermonkey o Violentmonkey per installare questo script.

Dovrai installare un'estensione come Tampermonkey o Userscripts per installare questo script.

Dovrai installare un'estensione come ad esempio Tampermonkey per installare questo script.

Dovrai installare un gestore di script utente per installare questo script.

(Ho già un gestore di script utente, lasciamelo installare!)

Dovrai installare un'estensione come ad esempio Stylus per installare questo stile.

Dovrai installare un'estensione come ad esempio Stylus per installare questo stile.

Dovrai installare un'estensione come ad esempio Stylus per installare questo stile.

Dovrai installare un'estensione per la gestione degli stili utente per installare questo stile.

Dovrai installare un'estensione per la gestione degli stili utente per installare questo stile.

Dovrai installare un'estensione per la gestione degli stili utente per installare questo stile.

(Ho già un gestore di stile utente, lasciamelo installare!)

// ==UserScript==
// @name           IPB Thread Updater
// @author         ameboide
// @version        2011.07.05
// @namespace      http://userscripts.org/scripts/show/105667
// @description    shows new posts while reading a thread
// @include        http://*/index.php?showtopic=*
// ==/UserScript==

//configuraciones
	try{
		//fix para usar data persistente sin pseudogreasemonkey
		if (!GM_getValue || GM_getValue.toString().indexOf("not supported")>-1) {
			GM_getValue=function (key,def) {
				if(!localStorage || !localStorage.hasOwnProperty(key)) return def;
				var val = localStorage[key];
				return val !== undefined ? val : def;
			};
			GM_setValue=function (key,value) {
				if(!localStorage) return null;
				return localStorage[key]=value;
			};
		}
	}catch(e){}

	var conf = {
		notifAlert: GM_getValue('notifAlert', false),
		notifTip: GM_getValue('notifTip', true),
		activo: GM_getValue('activo', false),
		segs: GM_getValue('segs', 23),
		pregSegs: GM_getValue('pregSegs', false)
	};

//constantes
	var url = document.location.href.match(/^.+\?/)[0];
	var id = document.location.href.match(/showtopic=(\d+)/)[1];
	var st = document.location.href.match(/st=(\d+)/);
	st = st ? Number(st[1]) : 0;

	var subforo = document.querySelector('#navstrip a:last-of-type').href;

	var reNum = new RegExp('who_posted\\('+id+'\\);">(\\d+)');

	var selPosts = '.ipbtable[cellspacing="1"]';
	var contPosts = document.querySelector(selPosts).parentNode;

	var textoBotonActivo = 'Stop watching this thread for updates';
	var textoBotonInactivo = 'Watch this thread for updates';

	var activo = conf.activo;

//interfaz conf
	var divConf = document.createElement('div');
	var br = document.querySelector('#ipbwrapper>br');
	br.parentNode.insertBefore(divConf, br);

	var boton = document.createElement('button');
	boton.style.width = '400px';
	textoBoton();
	divConf.appendChild(boton);
	boton.addEventListener('click', function(){
		if(activo){
			activo = false;
			textoBoton();
		}
		else{
			var val = conf.pregSegs ? prompt('Interval between checks (in seconds)', conf.segs) : conf.segs;
			if(val === null) return;
			if(val>0) conf.segs = val;
			GM_setValue('segs', conf.segs);
			document.getElementById('TU_lbl_pregSegs').lastChild.textContent =
				'Change checking interval ('+conf.segs+' seconds)';

			activo = true;
			textoBoton();
			revisar();
		}
	}, true);

	checkbox('activo', 'Start turned on by default');
	checkbox('notifAlert', 'Alert on new posts');
	checkbox('notifTip', 'Show notification on new posts');
	checkbox('pregSegs', 'Change checking interval ('+conf.segs+' seconds)');

	function checkbox(nombre, texto){
		var cb = document.createElement('input');
		cb.type = 'checkbox';
		cb.checked = conf[nombre];
		var lbl = document.createElement('label');
		lbl.id = 'TU_lbl_'+nombre;
		lbl.appendChild(cb);
		lbl.appendChild(document.createTextNode(texto));
		cb.addEventListener('click', function(evt){
			var val = evt.target.checked == true;
			conf[nombre] = val;
			GM_setValue(nombre, val);
		}, true);

		divConf.appendChild(lbl);
	}

	function textoBoton(extra){
		boton.innerHTML = (activo ? textoBotonActivo : textoBotonInactivo) + (extra ? ' ' + extra : '');
	}

//inicializar notificador
	var divNotif = document.createElement('div');
	var spanNotif = document.createElement('span');
	var txtNotif = document.createElement('a');
	var xNotif = document.createElement('span');

	divNotif.style.display = 'none';
	divNotif.style.position = 'fixed';
	divNotif.style.textAlign = 'center';
	divNotif.style.top = '0px';
	divNotif.style.width = '100%';
	divNotif.style.padding = '23px';
	divNotif.style.fontSize = '23px';

	spanNotif.style.padding = '23px';

	xNotif.innerHTML = '[X]';
	xNotif.style.cursor = 'pointer';
	xNotif.addEventListener('click', function(evt){
		divNotif.style.display = 'none';
		evt.stopPropagation();
		return false;
	}, true);

	document.body.appendChild(divNotif);
	divNotif.appendChild(spanNotif);
	spanNotif.appendChild(txtNotif);
	spanNotif.appendChild(document.createTextNode(' '));
	spanNotif.appendChild(xNotif);
	var nots = 0;

	function notificar(num, id){
		if(conf.notifAlert) alert(num + ' new posts in ' + document.title);

		if(conf.notifTip){
			txtNotif.innerHTML = num + ' new posts';
			txtNotif.href = '#'+id;
			spanNotif.style.backgroundColor = '#ff0';
			divNotif.style.display = '';
			nots++;

			setTimeout(function(){
				spanNotif.style.backgroundColor = '#ffb';
			}, 500);
			setTimeout(function(){
				if(!--nots) divNotif.style.display = 'none';
			}, 6000);
		}
	}

//aca empieza el script de verdad...
	function revisar(){
		if(!activo) return;

		var xhr = new XMLHttpRequest();
		xhr.onreadystatechange = function(){
			if (xhr.readyState == 4){
				try{
					if(xhr.status == 200){
						var ultimo = document.querySelectorAll(selPosts).length + st;
						var num = xhr.responseText.match(reNum);
						num = num ? Number(num[1])+1 : 0;
						if(num > ultimo) agregarNuevos(ultimo);
					}
					else{ //wtf?
					}
				}catch(e){}

				textoBoton();
				if(activo) setTimeout(revisar, conf.segs*1000);
			}
		}

		xhr.open('GET', subforo, true);
		xhr.send(null);

		textoBoton('(checking)');
	}

	function agregarNuevos(inicio){
		var xhr = new XMLHttpRequest();
		xhr.onreadystatechange = function(){
			if (xhr.readyState == 4){
				if(xhr.status == 200){
					var div = document.createElement('div');
					div.innerHTML = xhr.responseText;
					var posts = div.querySelectorAll(selPosts);
					for(var i=0; i<posts.length; i++) contPosts.appendChild(posts[i]);
					notificar(posts.length, posts[0].querySelector('a[name^=entry]').getAttribute('name'));
				}
				else{ //wtf?
				}
				textoBoton();
			}
		}

		xhr.open('GET', url + 'showtopic=' + id + '&st=' + inicio, true);
		xhr.send(null);

		textoBoton('(updating)');
	}

if(activo) revisar();