User:Writ Keeper/Scripts/peerReviewCloser.js

Note: After saving, you have to bypass your browser's cache to see the changes. Google Chrome, Firefox, Microsoft Edge and Safari: Hold down the ⇧ Shift key and click the Reload toolbar button. For details and instructions about other browsers, see Wikipedia:Bypass your cache.
function closePeerReview()
{
	mw.loader.using("mediawiki.api").done( function () 
	{
		$("#ca-closepeer>a").text("Closing...");
		$("#ca-closepeer").off("click");
		var talkPage = $("a:contains('Article talk')").attr("href");
		var talkPageName = "";
		if(talkPage != null)
		{
			talkPage = talkPage.match(/\/wiki\/(\w+:.+)/);
			if(talkPage != null)
			{
				talkPageName = talkPage[1];
			}
		}
		var api = new mw.Api();
		
		api.edit(mw.config.get("wgPageName"), function(revision)
		{
			var regexResult = revision.content.match(/\{\{ *[pP]eer review page *\| *topic *= *\w+ *\}\}/);
			if(regexResult != null)
			{
				return {
					text: revision.content.replace(regexResult[0], "{{Closed peer review page}}"),
					summary: "Closing peer review due to inactivity (via [[User:Writ Keeper/Scripts/peerReviewCloser|peerReviewCloser.js]])"
				};
			}
			else
			{
				mw.notify( 'Error updating the Peer Review page; article talk page might  also require cleanup.', { title: 'Peer review closing error' } );
				$("#ca-closepeer>a").text("error!");
				return null;
			}
		}).done(function() 
		{
			api.edit(talkPageName, function(revision) 
			{ 
				var regexResult = revision.content.match(/\{\{ *[pP]eer review *(\| *archive *= *\d+) *\}\}/);
				if(regexResult != null && typeof regexResult[1] != "undefined")
				{
					return {
						text: revision.content.replace(regexResult[0], "{{subst:Close peer review" + regexResult[1] + "}}"),
						summary: "Closing peer review due to inactivity (via [[User:Writ Keeper/Scripts/peerReviewCloser|peerReviewCloser.js]])"
					};
				}
				else
				{
					if(typeof window.sessionStorage != "undefined")
					{
						window.sessionStorage.setItem("peerReviewCloserError","talkPageError");
						location.reload();
						return null;
					}
					else
					{
						mw.notify( 'Peer review page updated, but error updating the article talk page; it may require manual intervention.', { title: 'Peer review closing error' } );
						$("#ca-closepeer>a").text("error!");
						return null;
					}
				}
			})
			.done(function()
			{
				location.reload();
			});
		});
	});
}


$(document).ready(function() 
{
	if(typeof window.sessionStorage != "undefined")
	{
		if(window.sessionStorage.getItem("peerReviewCloserError") == "talkPageError")
		{
			mw.notify( 'Peer review page updated, but error updating the article talk page; it may require manual intervention.', { title: 'Peer review closing error' } );
			window.sessionStorage.removeItem("peerReviewCloserError");
		}
	}
	if(mw.config.get("wgCategories",[]).indexOf("Current peer reviews") >= 0)
	{
		mw.loader.using("mediawiki.util").done( function ()
		{
			mw.util.addPortletLink('p-cactions', '#', "Close peer review", "ca-closepeer", "close this peer review");
			$("#ca-closepeer").click( function(event)
			{
				event.preventDefault();
				mw.loader.load( [ 'mediawiki.api.edit' ] ); //start loading, while the user is in the prompt
				return closePeerReview();
			});
		});
	}
});