您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
shows new posts while reading a thread
当前为
- // ==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();