מדיה ויקי: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);
}
if (distress)
delete div.style.display;
else
delete div.style.display = '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);