לדלג לתוכן

מדיה ויקי:Gadget-patrolAlarm.js

מתוך צפונות ויקי

הערה: לאחר הפרסום, ייתכן שיהיה צורך לנקות את זיכרון המטמון (cache) של הדפדפן כדי להבחין בשינויים.

  • פיירפוקס / ספארי: להחזיק את המקש Shift בעת לחיצה על טעינה מחדש (Reload) או ללחוץ על צירוף המקשים Ctrl-F5 או Ctrl-R (במחשב מק: ⌘-R).
  • גוגל כרום: ללחוץ על צירוף המקשים Ctrl-Shift-R (במחשב מק: ⌘-Shift-R).
  • אדג': להחזיק את המקש Ctrl בעת לחיצה על רענן (Refresh) או ללחוץ על צירוף המקשים Ctrl-F5.
function sendNonPatrolledEditsQuery(patrols) {
	var aj = sajax_init_object();
	aj.patrols = patrols;
	aj.onreadystatechange = countNonPatrolledEdits;
	aj.open('GET', 'http://he.wikipedia.org/w/api.php?action=query&list=recentchanges&format=xml&rcshow=!patrolled&rclimit=100');
	aj.send(null);
}

function countNonPatrolledEdits() {
	if (this.readyState != 4) // this is some ajax incantation - ony "4" is good.
		return;
	xml = this.responseXML;
	var responses = xml.getElementsByTagName('rc');
	var edits = [];
	for (var i = 0; i < responses.length; i++) {
		var response = responses[i];
		edits.push({
			ts:response.getAttribute('timestamp'), 
			cur:response.getAttribute('revid')
		});
	}
	analyzeResults(this.patrols, edits);
}

function countPatrolledEdits() {
	if (this.readyState != 4) // this is some ajax incantation - ony "4" is good.
		return;
	xml = this.responseXML;
	var responses = xml.getElementsByTagName('item');
	var patrols = [];
	for (var i = 0; i < responses.length; i++) {
		var response = responses[i];
		if (response.getAttribute('auto') != 0)
			continue;
		patrols.push({
			ts:response.getAttribute('timestamp'), 
			patroller:response.getAttribute('user'),
			cur:response.getAttribute('cur')
		});
	}
	sendNonPatrolledEditsQuery(patrols);
}

function sendPatrolledEditsQuery() {
	var aj = sajax_init_object();
	aj.onreadystatechange = countPatrolledEdits;
	aj.open('GET', 'http://he.wikipedia.org/w/api.php?action=query&format=xml&list=logevents&leaction=patrol/patrol&lelimit=200');
	aj.send(null);
}

function simpleSerialize(obj) {
	var res = [];
	for (var key in obj) 
		res.push(key + "\t" + obj[key]);
	return res.join("\n");
}

function simpleDeserialize(str) {
	ar = str.split("\n");
	var res = {};
	for (var i in ar) {
		var keyval = ar[i].split("\t");
		if (keyval.length == 2)
			res[keyval[0]] = keyval[1];
	}
	return res;
}

function cookieContent() {
	var str = $.cookie('patroller_alarmclock2', { path: '/' }) || '';
	return simpleDeserialize(str);
}

function setCookieVal(key, val) {
	var attr = cookieContent();
	attr[key] = val;
	$.cookie('patroller_alarmclock2', simpleSerialize(attr), { path: '/', expires: 1 });
}

function getCookieVal(key) {
	var attr = cookieContent();
	return attr[key];
}

function clearCookie() {
	$.cookie('patroller_alarmclock2', null, {path: '/'});
}

function distressMessage(distress) {
	var div = document.getElementById('patrol-distress-div');
	if (!div && !distress)
		return;
	if (!div) {
		var sisterDiv = document.getElementById('mw-js-message');
		if (!sisterDiv) //sorry pal - no can do.
			return;
		div = document.createElement('div');
		div.className = 'usermessage';
		div.title = "מצוקת ניטור חמורה.\n.כל המצילים מתבקשים לחוף גורדון";
		$.extend(div, {className:'usermessage',id:'patrol-distress-div',title:'מצוקת ניטור חמורה.\n.כל המצילים מתבקשים לחוף גורדון',
			onclick:function(){
				window.location='http://he.wikipedia.org/w/index.php?title=מיוחד:שינויים_אחרונים&hidepatrolled=1';
			}
		});
		$.extend(div.style,{height:'0.5em',width:'40%',marginRight:'25%',backgroundColor:'#CCCCFF',borderColor:'#8888ff'});
		sisterDiv.parentNode.insertBefore(div, sisterDiv);
	}
	div.style.display = distress ? null : 'none';
}

function analyzeResults(patrols, edits) {
	setCookieVal('lastTestedPatrols', new Date().valueOf());
	if (edits && edits.length > 1) {
		var interval = stringToDate(edits[0].ts) - stringToDate(edits[edits.length - 1].ts);
		var limit = typeof wgPatrolDistressLimit == "undefined" ? 180 : wgPatrolDistressLimit;
		setDistress(interval < limit * 60 * 1000);
	}
}

function setDistress(distress) {
	setCookieVal("inDistress", distress ? "1" : "0");
	distressMessage(distress);
}

function getDistress() {
	return getCookieVal("inDistress") == "1";
}

function restPeriod() {
	
	return 1000 * numSecs;
}

function stringToDate(dstr) {
	dar = dstr.split(/[^\d]/)
	return new Date(dar[0],dar[1],dar[2],dar[3],dar[4],dar[5]);
}

function patrollersWakeUpPeriodic() {
	//if we've been in recent changes in last 5 minutes, or we tested patrolls in last 5 minutes, do nothing.
	var numSecs = typeof wgPatrolDistressRestSeconds == "undefined" ? 5 * 60 : wgPatrolDistressRestSeconds;
	try {
		var ts = parseInt(getCookieVal('lastVisitRC')  || "0");
		if (ts && ((new Date() - new Date(ts)) < numSecs * 1000)) {
			setDistress(false);
			return;
		}
	} catch(e) {
		clearCookie();
	}
	
	if (getDistress()) {
		distressMessage(true);
		return;
	}
	
	try {
		ts = parseInt(getCookieVal('lastTestedPatrols')  || "0");
		if (ts && ((new Date() - new Date(ts)) < numSecs * 1000))
			return;	
	} catch(e) {
		clearCookie();
	}

	sendNonPatrolledEditsQuery([]);
}

function patrollersWakeUp() {
	if (wgCanonicalSpecialPageName == 'Recentchanges') {  // mark cookie with last visit and exit.
		setCookieVal('lastVisitRC', new Date().valueOf());
		setDistress(false);
	}
	else 
		setInterval(patrollersWakeUpPeriodic, 1000); // it's ok to call every second - the function will quit if needed.
}

hookEvent("load", patrollersWakeUp);