User:Animum/watchlistUpdate.js
/*
- Lists updates to watchlisted pages in a box at the top of Special:Watchlist after clicking on the "auto-update" tab
- Only works on watchlists with fewer than 500 pages
- If you add a new page to your watchlist after the script has been initiated, you will have to reload your watchlist and
- re-initiate the script for it to detect the new page.
- Checks, by default, every 5 seconds
- This can be custom-set by adding this line to your JavaScript file (Special:MyPage/[skin-name].js) after the importScript
- declaration for this script (importScript("User:Animum/watchlistUpdate.js");) (e.g., setting timeout to 10 seconds):
importScript("User:Animum/watchlistUpdate.js");
var updateSeconds = 10;
- To disable alerts upon an update to a page, add this line to your monobook.js (or other skin.js) file:
var alertOnUpdate = false;
- /
if(typeof(updateSeconds) == "undefined") var updateSeconds = 5;
if(typeof(alertOnUpdate) == "undefined") var alertOnUpdate = true;
var isSysop = /sysop/.test(mw.config.get('wgUserGroups'));
var isRollbacker = /rollbacker/.test(mw.config.get('wgUserGroups'));
function watchlistUpdate() {}
watchlistUpdate.clearContainer = function() {
getElementsByClassName(document, "div", "mw-js-message-watchlistUpdateContainer")[0].getElementsByTagName("ul")[0].innerHTML = "";
}
watchlistUpdate.isIP = function(ip) { //From MediaWiki:Sysop.js
return /\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b/.test(ip);
}
watchlistUpdate.init = function() {
if(getElementsByClassName(document, "div", "mw-js-message-watchlistUpdateContainer")[0]) return; //User has already initiated the script once; abort.
jsMsg("Any updates to your watchlisted pages will appear below (clear list):\n
var req = sajax_init_object();
req.open("GET", mw.config.get('wgScriptPath') + "/api.php?action=query&format=json&list=watchlist&wllimit=500&wlprop=ids|title", false);
req.send(null);
var pagelist = eval("(" + req.responseText + ")").query.watchlist;
var pages = new Array();
var revids = new Array();
for(i=0; i var page = pagelist[i]; var addData = function() { pages.push(page.title); revids.push(page.revid); } if(typeof WatchlistConfig != "undefined") { if(typeof WatchlistConfig.ignorePages != "undefined") { if(WatchlistConfig.ignorePages.length > 0) { if(WatchlistConfig.ignorePages.indexOf(page.title) == -1) { //Remove pages that User:Gary King/hide pages in watchlist.js ignores addData(); //Populates the "pages" array with the links (exludes special pages) } } else { addData(); } } else { //User has hide_pages_in_watchlist.js installed but does not have a list of pages to ignore. addData(); } } else { //User doesn't use hide_pages_in_watchlist.js. addData(); } } window.setInterval(function() { watchlistUpdate.doUpdate(pages, revids); }, updateSeconds*1000); delete req; } watchlistUpdate.formatSummary = function(comment, title) { comment = comment.replace("<", "<").replace(">", ">"); //Preliminary replacement to prevent formatting errors if(comment.search(/\/\*.*\*\//) != -1) { //Section name var section = comment.split(/\/\* ?/)[1].split(/ ?\*\//)[0]; comment = comment.replace(/\/\*.*\*\//g, "→" + section + (comment.split(/ ?\*\//)[1].length > 0 ? ":" : "") + ""); } comment = comment.replace(/\[\[([^\|\]]+)\|?(.*?)\]\]/g, function (ignore, link, display) { return "" + (display || link) + ""}); //Stolen from amelvand.js (yes, I'm lazy) return comment; } watchlistUpdate.doUpdate = function(pages, revids) { var container = getElementsByClassName(document, "div", "mw-js-message-watchlistUpdateContainer")[0]; if(!container) { //If, for some reason, another jsMsg has overtaken ours... jsMsg("Any updates to your watchlisted pages will appear below (clear list):\n", "watchlistUpdateContainer");
container = getElementsByClassName(document, "div", "mw-js-message-watchlistUpdateContainer")[0]; //Error-catcher
}
var req = sajax_init_object();
req.open("GET", mw.config.get('wgScriptPath') + "/api.php?action=query&format=json&prop=revisions&rvtoken=rollback&titles=" + pages.join("|").toString(), false);
req.send(null);
var info_ = eval("(" + req.responseText + ")").query.pages;
for (var index in info_) {
var info = info_[index];
var revision = info.revisions[0];
if(revids[pages.indexOf(info.title)] != revision.revid) {
var title = info.title;
var user = revision.user;
var timestamp = revision.timestamp.split("T")[1].split("Z")[0].split(":");
var summary = revision.comment;
var encoded = {
"title": encodeURIComponent(title.replace(/ /g, "_")),
"user" : encodeURIComponent(user.replace(/ /g, "_")),
"token": encodeURIComponent(revision.rollbacktoken)
};
container.getElementsByTagName("ul")[0].innerHTML += "
+ (typeof(revision.minor) == "string" ? " m" + (typeof(revision.bot) == "string" ? "b" : "") : "") + " "
+ "" + title + " "
+ "(diff)"
+ " by " + user + ""
+ " (talk" + (this.isIP(user) ? (isSysop ? " | block)" : ")") : " | contribs" + (isSysop ? " | block)" : ")"))
+ (summary ? " (" + this.formatSummary(summary, title) + ")" : "")
+ (isSysop || isRollbacker ? " [rollback]" : "") + "
revids[pages.indexOf(info.title)] = revision.revid;
if(alertOnUpdate) alert("Updates encountered");
}
}
delete req;
}
$(function() {
if(mw.config.get('wgCanonicalSpecialPageName') == "Watchlist" && document.title == "My watchlist - Wikipedia, the free encyclopedia") { //document.title is included to catch things such as editing the raw watchlist.
mw.util.addPortletLink("p-cactions", "javascript:watchlistUpdate.init()", "auto-update", "ca-watchlistupdate", "Automatically reports changes to pages in your watchlist");
}
});