מדיה ויקי:Gadget-patrolAlarm.js
מראה
הערה: לאחר הפרסום, ייתכן שיהיה צורך לנקות את זיכרון המטמון (cache) של הדפדפן כדי להבחין בשינויים.
- פיירפוקס / ספארי: להחזיק את המקש Shift בעת לחיצה על טעינה מחדש (Reload) או ללחוץ על צירוף המקשים Ctrl-F5 או Ctrl-R (במחשב מק: ⌘-R).
- גוגל כרום: ללחוץ על צירוף המקשים Ctrl-Shift-R (במחשב מק: ⌘-Shift-R).
- אדג': להחזיק את המקש Ctrl בעת לחיצה על רענן (Refresh) או ללחוץ על צירוף המקשים Ctrl-F5.
// Patrollers alarm clock
(function() {
var cookiename = 'patrollers_alarmclock',
distressLimit = window.wgPatrolDistressLimit || 75,
frequency = window.wgPatrolDistressRestSeconds || 120,
keys = {distress: 'inDistress', lastTest: 'lastTestedPatrols', lastVisitRC: 'lastVisitRC'};
function tsToDate(rc) {
// timestamp looks like so: "2011-05-05T18:56:27Z"
var dar = rc.timestamp.split(/[^\d]/)
.map(function(s) {
return parseInt(s, 10);
});
var month = dar[1] - 1; // "Date" expexts months in the range of 0..11, timestamp is more conventional.
return new Date(dar[0],month,dar[2],dar[3],dar[4],dar[5]);
}
function sendNonPatrolledEditsQuery() {
var params = {action: 'query', list: 'recentchanges', rcshow: '!patrolled', rclimit: 100, rcnamespace: 0, format: 'json'}
$.getJSON(mw.util.wikiScript('api'), params, function(data) {
cookieVal(keys.lastTest, new Date().valueOf());
if (data && data.query && data.query.recentchanges) {
var ar = data.query.recentchanges;
var interval = tsToDate(ar[0]) - tsToDate(ar[99]);
if (interval < distressLimit * 60 * 1000)
distress(true);
}
});
}
function cookieVal(key, val) {
var ar = ($.cookie(cookiename) || '').split("\n"),
cookieContent = {};
for (var i in ar) {
var keyval = ar[i].split("\t");
if (keyval.length == 2)
cookieContent[keyval[0]] = keyval[1];
}
if (typeof val == "undefined") // getting
return cookieContent[key]; // might be undefined
else { // setting
cookieContent[key] = val;
var res = [];
for (var key in cookieContent)
res.push(key + "\t" + cookieContent[key]);
$.cookie(cookiename, res.join("\n"), {path: '/', expires: 1});
}
}
function clearCookie() {$.cookie(cookiename, null, {path: '/'});}
function distressMessage() {
var li = $('#n-recentchanges'),
inDistress = distress();
if (li.attr('distress') == inDistress)
return;
li.attr('distress', inDistress)
if (inDistress) {
li
.css({backgroundColor:'#F9C557', cursor:'pointer'})
.attr({title: "מצוקת ניטור חמורה.\n.כל המצילים מתבקשים לחוף גורדון"})
.click(function(e){
if (e.button == 0)
window.location = mw.util.wikiScript() + '?title=מיוחד:שינויים_אחרונים&hidepatrolled=1&namespace=0';
});
}
else
li
.css({background: '', cursor: ''})
.attr({title: ''})
.undelegate('click');
}
function distress(val) {
if (typeof val === "boolean") {
cookieVal(keys.distress, val.toString());
distressMessage();
} else
return cookieVal(keys.distress) === "true"
}
function patrollersWakeUpPeriodic() {
//if we've been in recent changes in last 5 minutes, or we tested patrolls in last 5 minutes, do nothing.
try {
var ts = parseInt(cookieVal(keys.lastVisitRC) || "0");
if (ts && ((new Date() - new Date(ts)) < frequency * 1000)) {
distress(false);
return;
}
} catch(e) {
clearCookie();
}
if (distress()) {
distressMessage(true);
return;
}
try {
ts = parseInt(cookieVal(keys.lastTest) || "0");
if (ts && ((new Date() - new Date(ts)) < frequency * 1000))
return;
} catch(e) {
clearCookie();
}
sendNonPatrolledEditsQuery();
}
if ( mw.config.get( 'wgCanonicalSpecialPageName' ) == 'Recentchanges') { // mark cookie with last visit and exit.
cookieVal(keys.lastVisitRC, new Date().valueOf());
distress(false);
}
else
setInterval(patrollersWakeUpPeriodic, 1000); // it's ok to call every second - the function will quit if needed.
})();