Userscripts : Issues Report [DEPRECATED]

By w35l3y Last update Dec 16, 2008 — Installed 186 times.

There are 11 previous versions of this script.

// ==UserScript==
// @name           Userscripts : Issues Report
// @namespace      http://gm.wesley.eti.br/userscripts
// @description    Displays all issues reported of your scripts
// @include        http://userscripts.org/scripts/*/*
// @include        http://userscripts.org/home/scripts*
// @require        http://www.wesley.eti.br/includes/js/php.js?v1
// @require        http://www.wesley.eti.br/includes/js/php2js.js?v1
// @require        http://gm.wesley.eti.br/gm_default.js?v1
// @language       en
// @author         w35l3y
// @email          w35l3y@brasnet.org
// @version        1.1.4
// @copyright      w35l3y 2008
// @license        GNU GPL
// @homepage       http://www.wesley.eti.br
// ==/UserScript==

/**************************************************************************

    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.

**************************************************************************/

checkForUpdate({
//	'file':'http://gm.wesley.eti.br/userscripts/IssuesReport/userscripts__issues_repo.user.js',
	'file':'http://userscripts.org/scripts/source/35589.user.js',
	'name':'Userscripts : Issues Report',
	'namespace':'http://gm.wesley.eti.br/userscripts',
	'version':'1.1.4'
});

(function()
{	// script scope

	var user = {
		'delay':GM_getValue('delay',	500),
		'access':GM_getValue('access',	60*60*1000)
	};

	var script = {
		'lastPage':GM_getValue('lastPage',0),
		'user':""+xpath("string(id('homeMenu')/li/a[contains(@href,'users')]/@href)").match(/\d+/)[0],
		'author':""+xpath("string(id('details')/span/a[contains(@href,'users')]/@href)").match(/\d+/),
		'issues':eval(GM_getValue('issues','({})')),
		'retrieve':GM_getValue('retrieve',-1),
		'lastAccess':parseInt(GM_getValue('lastAccess','0'))
	};

	var id = parseInt( ""+location.href.match(/\d+/), 10);
	if (/\/scripts\/\w+\//.test(location.href) && script.user == script.author)
	{
		var anchor = xpath("id('script-nav')/li[a[contains(text(),'hare')]]")[0];	// Share
		var retrieve = document.createElement('li');
		retrieve.innerHTML = '<a href="#issues">Issues <span>0%</span></a>';

		retrieve.childNodes[0].addEventListener( 'click', function(e)
		{
			var list = xpath("id('script-nav')/li");
			for ( var i = 0 , t = list.length ; i < t ; ++i )
			{
				if (!!~(""+list[i].getAttribute('class')).indexOf('current'))
				{
					list[i].removeAttribute('class');

					var link = document.createElement('a');

					link.innerHTML = list[i].innerHTML;
					link.setAttribute('href',location.href.replace(location.hash,''));

					list[i].innerHTML = '';
					list[i].appendChild(link);

					e.target.parentNode.setAttribute('class','current');
					e.target.parentNode.innerHTML = e.target.innerHTML;
					break;
				}
			}

			var next = list[0].parentNode.nextSibling;
			while (!!next)
			{
				var tmp = next.nextSibling;
				next.parentNode.removeChild(next);
				next = tmp;
			}

			var unm = xpath("string(id('homeBox')/a/text())");
			var content = list[0].parentNode.parentNode;

			function listReport(id)
			{
				var total = 0;
				for ( var prop in script.issues[id] )
				{
					++total;
					var i = script.issues[id][prop];

					var issue = document.createElement('div');
					issue.setAttribute('class','issue');

					var out = "<p>%TP% script: <a href='/scripts/show/%SID%'>%SNM%</a> written by <a href='/users/"+script.user+"'>"+unm+"</a></p><p style=\"clear: both\">Reporter: <a href='/users/%RID%'>%RNM%</a></p>";
					if (!!i[5].length)
						out += '<pre>%MSG%</pre>';
					issue.innerHTML = out.replace('%TP%',i[0]).replace('%SID%',i[1]).replace('%SNM%',i[2]).replace('%RID%',i[3]).replace('%RNM%',i[4]).replace('%MSG%',i[5]);

					content.appendChild(issue);
				}

				return total;
			}

			var total = 0;
			if (!!id)
				total = listReport(id);
			else
				for ( var prop in script.issues )
					total += listReport(prop);

			if (!total)
			{
				var msg = document.createElement('h2');
				msg.innerHTML = ( !!id ? "This script does not have any report." : "Your scripts does not have any report." );
				content.appendChild(msg);
			}

		}, false);

		anchor.parentNode.insertBefore(retrieve,anchor.nextSibling);

		if (/#issues$/.test(location.href))
		{
			var evt = document.createEvent('MouseEvents'); 
	 		evt.initMouseEvent('click', true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
 			retrieve.childNodes[0].dispatchEvent(evt);
			retrieve = retrieve.childNodes[2];
		}
		else 
			retrieve = retrieve.childNodes[0].childNodes[1];

		var current = parseInt(new Date().valueOf(),10);
		if (script.lastAccess+user.access <= current)
		{
			GM_setValue('lastAccess', ""+current);
			GM_setValue('retrieve', 0);

			var er_issue = new RegExp("<div><p>(\\w+) script: <a href='\/scripts\/show\/(\\d+)'>(.{1,256})<\/a>written by <a href='\/users\/"+script.user+"'>.{3,50}<\/a><\/p>(?:<p>.+?<\/p>)?<p>Reporter: <a href='\/users\/(\\d+)'>(.{3,50})<\/a><\/p>(?:<pre>(.+?)<\/pre>)?<\/div>","gi");
			var gc = 0;	// global counter
			var lastPage = 0;

			resourceText("http://userscripts.org/issues",function(e)
			{
				lastPage = parseInt(e.responseText.match(/(\d+)<\/a> <a href="\/issues\?page=\d+" class="next_page"/)[1],10) - script.lastPage;
				checkIssue(e);

				for ( var i = 2 ; i <= lastPage ; ++i )
				{
					setTimeout(resourceText, user.delay*i, "http://userscripts.org/issues?page="+i, checkIssue);
				}
			});

			function checkIssue(e)
			{
				var result = e.responseText.replace(/\s{2,}|(?: \w+="[ \w:;%-]+")+/g,'');
				for ( var m ; m = er_issue.exec(result) ; )
				{
					var l = m.toString().length;
					m.shift();
					if (!(m[1] in script.issues))
						script.issues[m[1]] = {};

					script.issues[m[1]][m[3]+l] = m;
				}

				var r = Math.floor(100*++gc/Math.max(lastPage,1));
				if (r == 100)
				{
					r = -1;
					GM_setValue('lastPage', lastPage+script.lastPage);
					GM_setValue('issues', uneval(script.issues));
					var x = 0;
					for ( var prop in script.issues[id])
						++x;

					retrieve.innerHTML = x;
				}
				else
					retrieve.innerHTML = r+'%';

				GM_setValue('retrieve', r);
				GM_setValue('lastAccess', ""+parseInt(new Date().valueOf(),10));
			}
		}
		else
			(int = setInterval(function()
			{
				var r = GM_getValue('retrieve', -1);

				if (r == -1)
				{
					clearInterval(int);

					var x = 0;
					for ( var prop in eval(GM_getValue('issues','({})'))[id])
						++x;

					retrieve.innerHTML = x;
				}
				else
					retrieve.innerHTML = r+'%';

			}, user.delay));
	}
	else if (/\/home\/scripts/.test(location.href))
	{
		var lastUpdate = xpath('//tr/th[a[not(contains(@href,"?"))]]')[0];
		var issues = document.createElement('th');
		issues.innerHTML = '<a href="?sort=issues">Issues</a>';
		lastUpdate.parentNode.insertBefore(issues, lastUpdate);
		
		var scripts = xpath('//tr[td/a[contains(@href,"/show/")]]');

		function totalIssues(tr)
		{
			var sum = 0;
			for ( var prop in script.issues[tr.id.match(/\d+/)[0]] )
				++sum;

			return sum;
		}

		if (/[?&]sort=issues/.test(location.href))
		{
			scripts.sort(function(a, b)
			{
				var ta = totalIssues(a) , tb = totalIssues(b);

				if ( ta == tb ) return 0;
				else if ( ta < tb )
					b.parentNode.insertBefore(b, a);
				return ( ta < tb ? 1 : -1 );
			});
		}

		var position = scripts[0].cells.length-1;
		for ( var i = 0 , t = scripts.length ; i < t ; ++i )
		{
			var cell = document.createElement('td');
			cell.setAttribute('class', 'inv lp');
			cell.textContent = totalIssues(scripts[i]);
			scripts[i].insertBefore(cell, scripts[i].cells[position]);
		}
	}
})();