User:Ricordisamoa/DataLiveRC.js

Note: After publishing, you may have to bypass your browser's cache to see the changes.

  • Firefox / Safari: Hold Shift while clicking Reload, or press either Ctrl-F5 or Ctrl-R (⌘-R on a Mac)
  • Google Chrome: Press Ctrl-Shift-R (⌘-Shift-R on a Mac)
  • Internet Explorer / Edge: Hold Ctrl while clicking Refresh, or press Ctrl-F5
  • Opera: Press Ctrl-F5.
/* <nowiki>
 *
 * DataLiveRC by [[User:Ricordisamoa]]
 * inspired by the Original LiveRC
 * a live-AntiVandal tool, optimized for Wikidata (beta)
*/
$(document).ready(function(){
	$(".mw-tag-marker-new_editor_removing_sitelink").parent().parent().css("background-color", "orange");
	if(mw.config.get('wgPageName') !== "User:Ricordisamoa/DataLiveRC"){
		mw.util.addPortletLink("p-navigation", mw.util.getUrl("User:Ricordisamoa/DataLiveRC"), "DataLiveRC", "DataLiveRC-portlet", "Start DataLiveRC (experimental)");
		return;
	}
	document.title = "DataLiveRC - Wikidata";
	var getLabels = function(pages, callback){
		$.getJSON(
			mw.util.wikiScript("api"),
			$.extend(
				{
					action: "wbgetentities",
					languages: mw.config.get('wgUserLanguage'),
					format: "json",
					props: "labels"
				},
				pages.ids ? {ids: pages.ids.join("|")} : {sites: pages.sites, titles: pages.titles}
			)
		)
		.done(function(data){
			var labels = {};
			$.each(data.entities, function(k, v){
				if(k==-1) labels[k.toUpperCase()] = k;
				else labels[k.toUpperCase()] = (v && v.labels ? v.labels[mw.config.get('wgUserLanguage')].value + " " : "") + "<small>(" + k.toUpperCase() + ")</small>";
			});
			callback(labels, Object.keys(data.entities));
		});
	};
	var getRemovedLinks = function(entityId, revid, callback){
		$.getJSON(
			mw.util.wikiScript("api"),
			{
				action: "query",
				format: "json",
				prop: "revisions",
				titles: entityId,
				rvprop: "content",
				rvstartid: revid,
				rvlimit: 2
			},
			function(data){
				var pages = data.query.pages;
				pages = pages[Object.keys(pages)[0]].revisions;
				var currentLinks = Object.keys(JSON.parse(pages[0]["*"]).links);
				if(pages.length > 1 && typeof(JSON.parse(pages[1]["*"]).links) === "object"){
					var previousLinks = Object.keys(JSON.parse(pages[1]["*"]).links);
					var removedLinks = $(previousLinks).not(currentLinks).get();
					if(removedLinks.length === 1) callback(removedLinks[0].replace(/wiki$/, "") + ":" + JSON.parse(pages[1]["*"]).links[removedLinks[0]]);
					else callback(false);
				}
			}
		);
	};
	$("<table>")
	.append(
		$("<td>")
		.attr("colspan", 6)
		.append(
			$("<label>")
			.text("registered users")
			.prepend(
				$("<input>")
				.attr({
					type: "checkbox",
					id: "liverc-registered"
				})
			)
		)
		.append(
			$("<label>")
			.text("bots")
			.prepend(
				$("<input>")
				.attr({
					type: "checkbox",
					id: "liverc-bot"
				})
			)
		)
		.append(
			$("<label>")
			.text("own")
			.prepend(
				$("<input>")
				.attr({
					type: "checkbox",
					id: "liverc-own"
				})
			)
		)
		.append(
			$("<label>")
			.text("only latest revisions for page")
			.prepend(
				$("<input>")
				.attr({
					type: "checkbox",
					id: "liverc-latest"
				})
				.prop("checked", true)
			)
		)
		.append(
			$("<label>")
			.text("New editor removing a sitelink")
			.prepend(
				$("<input>")
				.attr({
					type: "radio",
					name: "liverc-tag",
					id: "liverc-ners",
				})
				.prop("checked", true)
			)
		)
		.append(
			$("<label>")
			.text("Language as description")
			.prepend(
				$("<input>")
				.attr({
					type: "radio",
					name: "liverc-tag",
					id: "liverc-lad",
					disabled: true
				})
			)
		)
		.append(
			$("<label>")
			.text("Unexpected value for gender")
			.prepend(
				$("<input>")
				.attr({
					type: "radio",
					name: "liverc-tag",
					id: "liverc-uvfg",
					disabled: true
				})
			)
		)
		.appendTo("<tr>").parent().appendTo("<thead>").parent()
	)
	.append(
		$("<tbody>")
		.attr("id", "liverc-recentchanges")
	)
	.replaceAll("#mw-content-text");
	var refresh = function(){
		var filters = [];
		if(!$("#liverc-bot").prop("checked")) filters.push("!bot");
		if(!$("#liverc-registered").prop("checked")) filters.push("anon");
		var tag = "";
		if($("#liverc-ners").prop("checked")) tag = "new editor removing sitelink";
		else if($("#liverc-lad").prop("checked")) tag = "adding language as description";
		else if($("#liverc-uvfg").prop("checked")) tag = "Unexpected value for gender";
		$.getJSON(
			mw.util.wikiScript("api"),
			$.extend(
				{
					action: "query",
					list: "recentchanges",
					format: "json",
					rcprop: "user|title|ids|comment|parsedcomment|sizes|tags|timestamp",
					rclimit: 20
				},
				$("#liverc-own").prop("checked") ? {} : {rcexcludeuser: mw.config.get("wgUserName")},
				filters.length > 0 ? {rcshow: filters.join("|")} : {},
				tag !== "" ? {rctag: tag} : {},
				$("#liverc-latest").prop("checked") ? {rctoponly: true} : {}
			)
		)
		.done(function(data){
			var ids = $.map(data.query.recentchanges, function(e, i){
				return e.title;
			});
			getLabels({ids: ids},function(labels){
				$("#liverc-recentchanges").empty();
				$.each(data.query.recentchanges, function(recentChangeIndex, recentChange){
					getRemovedLinks(recentChange.title, recentChange.revid, function(removedLinks){
						getLabels({sites: removedLinks.split(":")[0] + "wiki", titles : removedLinks.replace(/^[^:]+:/, "")}, function(removedLinksLabels, removedLinksIds){
							$("<tr>")
							.append(
								$("<td>")
								.append(new Date(recentChange.timestamp).toLocaleTimeString())
							)
							.append(
								$("<a>")
								.append(labels[recentChange.title.toUpperCase()])
								.attr("href", mw.util.getUrl(recentChange.title))
								.wrap("<td>").parent()
							)
							.append(
								$("<a>")
								.text(recentChange.user)
								.attr("href", mw.util.getUrl(recentChange.anon ? ("Special:Contributions/" + recentChange.user) : ("User:" + recentChange.user)))
								.wrap("<td>").parent()
							)
							.append(
								$("<a>")
								.text("diff")
								.attr("href", mw.util.wikiScript() + "?" + $.param({title: recentChange.title, oldid: recentChange.old_revid, diff: recentChange.revid}))
								.wrap("<td>").parent()
							)
							.append(
								$("<td>")
								.css("color", "gray")
								.append(recentChange.tags !== undefined ? recentChange.tags : "")
							)
							.append(
								$("<td>")
								.append(removedLinks !== false ?
									$("<a>")
									.text(removedLinks)
									.attr("href", mw.util.getUrl(removedLinks))
								: "")
								.append(removedLinksLabels[Object.keys(removedLinksLabels)[0]] != -1 ?
									(Object.keys(removedLinksLabels)[0] === recentChange.title ? " reverted" : " moved to ")
									: " now orphan"
								)
								.append(removedLinksLabels[Object.keys(removedLinksLabels)[0]] != -1 && Object.keys(removedLinksLabels)[0] !== recentChange.title ?
									$("<a>")
									.append(removedLinksLabels[Object.keys(removedLinksLabels)[0]])
									.attr("href", mw.util.getUrl(removedLinksIds[0]))
								: "")
							)
							.appendTo("#liverc-recentchanges");
						});
					});
				});
			});
		});
	};
	refresh();
	setInterval(refresh, 20000);
});
//</nowiki>