IPB Thread Updater

shows new posts while reading a thread

Bu betiği kurabilmeniz için Tampermonkey, Greasemonkey ya da Violentmonkey gibi bir kullanıcı betiği eklentisini kurmanız gerekmektedir.

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

Bu betiği kurabilmeniz için Tampermonkey ya da Violentmonkey gibi bir kullanıcı betiği eklentisini kurmanız gerekmektedir.

Bu betiği kurabilmeniz için Tampermonkey ya da Userscripts gibi bir kullanıcı betiği eklentisini kurmanız gerekmektedir.

Bu betiği indirebilmeniz için ayrıca Tampermonkey gibi bir eklenti kurmanız gerekmektedir.

Bu komut dosyasını yüklemek için bir kullanıcı komut dosyası yöneticisi uzantısı yüklemeniz gerekecek.

(Zaten bir kullanıcı komut dosyası yöneticim var, kurmama izin verin!)

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

(Zateb bir user-style yöneticim var, yükleyeyim!)

// ==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();