Jump to content

User:Technical 13/Scripts/Edit counter.js

From Wikipedia, the free encyclopedia
This is an old revision of this page, as edited by Technical 13 (talk | contribs) at 22:08, 11 October 2013 (Allow for stylizing table header.). The present address (URL) is a permanent link to this revision, which may differ significantly from the current revision.
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.
/************************************************************************************************/
/*  Edit counter script based on strategywiki.org/wiki/User:Najzere/edit_counter.js             */
/*    author:         [[User:Technical 13]]                                                     */
/*    source:         [[User:Technical 13/Scripts/edit counter.js]]                             */
/*    documentation:  [[User:Technical 13/Scripts/edit counter]]                                */
/*    contact:        [[User talk:Technical 13]]                                                */
/*    license:        CC-BY-SA 3.0 (https://creativecommons.org/licenses/by-sa/3.0/)            */
/*    version:        1.0.0                                                                     */
/************************************************************************************************/
 
// Only add edit count button on user pages
if (mw.config.get('wgTitle') == mw.config.get('wgUserName') && mw.config.get('wgNamespaceNumber') == 2) {
$(document).ready(function() {
 
// Add a new link after "User contributions" in the toolbox
	if ($('#t-contributions').length === 0) {
		alert('Missing "User contributions" link in the side menu! Contact script creator for assistance.');
		return;
	}
	var $editCountLink = $('<a>Edit counter</a>').attr( { id: 't-editcounter', href: '#', title: 'Run edit counter script' } );
	$('#t-contributions').after($('<li></li>').html($editCountLink));
 
// start process
	$('#t-editcounter').click( function() {
 
// Set up variables
	$(this).html('Initializing<br />variables...');
	if (document.location.href.match(/:\/\/en.wikipedia.org\/w/)) {
		var editSummary = 'Edited with [[User:Technical_13/Scripts/Edit_counter|edit counter]]';
		var tableTopLink = '[[User:Technical_13/Scripts/Edit_counter|Edit count]]';

	} else {
		var editSummary = 'Edited with [[en:User:Technical_13/Scripts/Edit_counter|edit counter]]';
		var tableTopLink = '[[en:User:Technical_13/Scripts/Edit_counter|Edit count]]';

	}
	if ( typeof(editPage) == 'undefined' || editPage === '' ) { editPage = "User:" + mw.config.get('wgUserName') + "/Edit count"; }
	else { editPage = "User:" + mw.config.get('wgUserName') + "/" + editPage; }
	if ( typeof(tableClass) == 'undefined' ) { tableClass = ''; }
	if ( typeof(tableStyle) == 'undefined' ) { tableStyle = ''; }
	if ( typeof(tableTopStyle) == 'undefined' ) { tableTopStyle = ''; }
	else { tableStyle = ' style="' + tableStyle + '"'; }
	var skipCAPTCHA = false;
	var oldPage = false;
	var mwEditCount = 0;
	var edits = 0;
	var editCount = 0;
	var nsnums = [];
	var nsnums2 = [];
	var namespaces = [];
	var movelog = [];
	var protectlog = [];
	var next;
	var editToken;
	var succeeded = false;
	var subst = '{SUBST:';
	var table = '';
	var projectLink = mw.config.get('wgServer') + mw.config.get('wgScriptPath');
	var apiLink = projectLink + '/api.php?';
	var tableTop = '{| class="wikitable ' + tableClass + '"' + tableStyle + '\n|- \n! colspan="4"' + tableTopStyle + '| ' + tableTopLink + ':';
	var tableBottom = '\n|- \n| colspan="4" align="center"| <small>Last run: {' + '{Plain link|url=' + projectLink.replace(/\s/g, "_") + "iki/" + editPage.replace(/\s/g, "_") + '?diff=curr|name=' + '{' + subst + '#time:F j, Y}}}}</small>\n|}';
 
// Check if the user is autoconfirmed
	$(this).html('CAPTCHA test...');
	for (var right in wgUserGroups)
		if (wgUserGroups[right] == 'confirmed' || wgUserGroups[right] == 'autoconfirmed') {
			skipCAPTCHA = true;
		}
 
// Get full edit count, as tracked by MW, add it to the tableTop
	$(this).html('Gathering total edits...');
	mwEditCount = mw.config.get( 'wgUserEditCount' );
	tableTop += ' {' + subst + 'formatnum:' + mwEditCount + "}}";

 
// Initialize namespace, move log and patrol log arrays
	$(this).html('Gathering<br />namespaces');
	$.ajax({
		url: apiLink + 'action=query&meta=siteinfo&siprop=namespaces&format=json',
		dataType: 'json',
		async: false,
		success: function(siResponse) {
			var i = 1;
			for (var ns in siResponse.query.namespaces) {
				if (siResponse.query.namespaces[ns].id > -1) {
					if (siResponse.query.namespaces[ns].id === 0) {
						namespaces[i] = 'Main';
					}
					else if (siResponse.query.namespaces[ns].id == 4) {
						namespaces[i] = mw.config.get('wgSiteName');
					}
					else if (siResponse.query.namespaces[ns].id == 5) {
						namespaces[i] = mw.config.get('wgSiteName') + ' talk';
					}
					else {
						namespaces[i] = siResponse.query.namespaces[ns].canonical;
					}
					nsnums[siResponse.query.namespaces[ns].id] = i;

					nsnums2[i] = siResponse.query.namespaces[ns].id;
					movelog[i] = 0;
					protectlog[i] = 0;
					i++;
				}
			}
		}
	});



 
// Fill move log array
	$(this).html('Counting page<br />move logs');
	next = '';
	while (next != 'stop') {
		$.ajax({
			url: apiLink + 'action=query&list=logevents&letype=move&leuser=' + mw.config.get( 'wgUserName' ) + '&lelimit=max&leprop=title&format=json' + next,
			dataType: 'json',
			async: false,
			success: function(moveResponse) {
				for (var event in moveResponse.query.logevents) {
					movelog[nsnums[moveResponse.query.logevents[event].ns]] += 1;
				}
				if (moveResponse["query-continue"]) {
					next = '&lestart='+moveResponse["query-continue"].logevents.lestart;
				} else {
					next = 'stop';
				}
			}
		});
	}

 
// Fill protect log array
	$(this).html('Counting page<br />protection logs');
	next = '';
	while (next != 'stop') {
		$.ajax({
			url: apiLink + 'action=query&list=logevents&letype=protect&leuser=' + mw.config.get('wgUserName') + '&lelimit=max&leprop=title&format=json' + next,
			dataType: 'json',
			async: false,
			success: function(protectResponse) {
				for (var event in protectResponse.query.logevents) {
					protectlog[nsnums[protectResponse.query.logevents[event].ns]] += 1;
				}
				if (protectResponse["query-continue"]) {
					next = '&lestart='+protectResponse["query-continue"].logevents.lestart;
				} else {
					next = 'stop';
				}
			}
		});
	}

 
// Loop through namespaces counting edits and subtracting page moves and patrols
	$(this).html('Counting<br />edits in<br />' + namespaces[1]);
	for (var i = 1; i < namespaces.length; i++) {
		next = '';
		edits = 0;


		while (next != 'stop') {
			$.ajax({
				url: apiLink + 'action=query&list=usercontribs&ucuser=' + mw.config.get('wgUserName') + '&uclimit=max&ucdir=newer&format=json&ucnamespace=' + nsnums2[i] + next,
				dataType: 'json',
				async: false,
				success: function(ucResponse) {
					edits += ucResponse.query.usercontribs.length;
					if (ucResponse["query-continue"]) {
						next = '&ucstart='+ucResponse["query-continue"].usercontribs.ucstart;
					} else {
						next = 'stop';
					}
				}
			});
		}

		edits = edits - movelog[i] - protectlog[i];

		editCount = editCount + edits;

		if (edits > 0) {
			table += '\n|- \n| style="border-right: 0px;"| '+namespaces[i]+' || style="border-left: 0px; text-align: center;"| NS:' + nsnums2[i] + ' || style="text-align: center;"| {' + subst + 'formatnum:' + edits + '}} || style="text-align: right;"| ' + ( Math.round( ( edits / mwEditCount ) * 100 ) ) + "%";
		}
		if (i+1 < namespaces.length){
			$(this).html('Counting<br />edits in<br />' + namespaces[i+1]);
		} else {
			$(this).html('Tallying all<br />edits from<br />the API...');
		}
	}
	tableTop += " (" + ( 100 - ( Math.round( ( editCount / mwEditCount ) * 100 ) ) ) + "%)";

	table = tableTop + table + tableBottom;
 
// Get edit token and check if we'll be creating a new page (in the case of non-autoconfirmed users)
	$.ajax({
		url: apiLink + 'action=query&prop=info|revisions&intoken=edit&format=json&titles=' + editPage,
		dataType: 'json',
		async: false,
		success: function(propResponse) {
			for (var page in propResponse.query.pages) {
				editToken = propResponse.query.pages[page].edittoken.replace(/\+\\$/g, '%2B%5C');
				if (propResponse.query.pages[page].revisions) {
					oldPage = true;
				}
			}
		}
	});
 
// If the user is not autoconfirmed and we're creating a new page, kick out of the script
	if (!skipCAPTCHA && !oldPage) {
		alert("Sorry, you're not autoconfirmed yet, so captcha is required to make new pages. Go create the page at: " + editPage + ", then try again.");
		$(this).html('Error!<br /> &nbsp; Error!<br />Error!');
		return;
	}
 
// Edit the target page with the table
	$.ajax({
		url: apiLink + 'action=edit&title=' + editPage + '&summary=' + editSummary + '&minor=1&recreate=1&bot=1&text=' + escape(table) + '&token=' + editToken,
		type: 'POST',
		async: false,
		success: function() {
            succeeded = true;
        }
	});
 
// change edit count link to reflect the status of the page save
	if (succeeded) {
		$(this).html('Done!');
	} else {
		$(this).html('Error!<br /> &nbsp; Error!<br />Error!');
	}
	});
});
}