User:Technical 13/Scripts/Edit counter.js

/************************************************************************************************/ /* 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 $editCountVLink = $('Edit counter').attr( { id: 't-editcounter', href: '#', title: 'Run edit counter script' } );	$('#t-contributions').after($('').html($editCountVLink)); // start process	$('#t-editcounter').click( function { // Set up variables $(this).html('Initializing variables...'); if (document.location.href.match(/:\/\/en.wikipedia.org\/w/)) { var editSummaryV = 'Edited with edit counter'; var tableVTopLink = 'Edit count';

} else { var editSummaryV = 'Edited with edit counter'; var tableVTopLink = 'Edit count';

}	if ( typeof(editPageV) == 'undefined' || editPageV === '' ) { editPageV = "User:" + mw.config.get('wgUserName') + "/Edit count"; } else { editPageV = "User:" + mw.config.get('wgUserName') + "/" + editPageV; } if ( typeof(tableVClass) == 'undefined' ) { tableVClass = ''; } if ( typeof(tableVStyle) == 'undefined' ) { tableVStyle = ''; } else { tableVStyle = ' style="' + tableVStyle + '"'; } if ( typeof(tableVTopStyle) == 'undefined' ) { tableVTopStyle = ''; } else { tableVTopStyle = ' style="' + tableVTopStyle + '"'; } var VskipCAPTCHA = false; var oldPageV = false; var mwEditCountV = 0; var editsV = 0; var editCountV = 0; var nsnumsV = []; var nsnumsV2 = []; var namespacesV = []; var movelogV = []; var protectlogV = []; var nextV; var editTokenV; var succeededV = false; var substV = '{SUBST:'; var tableV = ''; var projectLinkV = mw.config.get('wgServer') + mw.config.get('wgScriptPath'); var apiLinkV = projectLinkV + '/api.php?'; var tableVTop = '{| class="wikitable ' + tableVClass + '"' + tableVStyle + '\n|- \n! colspan="4"' + tableVTopStyle + '| ' + tableVTopLink + ':'; var tableVBottom = '\n|- \n| colspan="4" align="center"| Last run: {' + '{Plain link|url=' + projectLinkV.replace(/\s/g, "_") + "iki/" + editPageV.replace(/\s/g, "_") + '?diff=curr|name=' + '{' + substV + '#time:F j, Y}}}} \n|}'; // Check if the user is autoconfirmed $(this).html('CAPTCHA test...'); for (var right in mw.config.get('wgUserGroups')) if (mw.config.get('wgUserGroups')[right] == 'confirmed' || mw.config.get('wgUserGroups')[right] == 'autoconfirmed') { VskipCAPTCHA = true; } // Get full edit count, as tracked by MW, add it to the tableVTop $(this).html('Gathering total edits...'); mwEditCountV = mw.config.get( 'wgUserEditCount' ); tableVTop += ' {' + substV + 'formatnum:' + mwEditCountV + "}}";

// Initialize namespace, move log and patrol log arrays $(this).html('Gathering namespaces'); $.ajax({		url: apiLinkV + 'action=query&meta=siteinfo&siprop=namespaces&format=json',		dataType: 'json',		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) {						namespacesV[i] = 'Main';					}					else if (siResponse.query.namespaces[ns].id == 4) {						namespacesV[i] = mw.config.get('wgSiteName');					}					else if (siResponse.query.namespaces[ns].id == 5) {						namespacesV[i] = mw.config.get('wgSiteName') + ' talk';					}					else {						namespacesV[i] = siResponse.query.namespaces[ns].canonical;					}					nsnumsV[siResponse.query.namespaces[ns].id] = i;

nsnumsV2[i] = siResponse.query.namespaces[ns].id; movelogV[i] = 0; protectlogV[i] = 0; i++; }			}		}	});

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

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

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

while (nextV != 'stop') { $.ajax({				url: apiLinkV + 'action=query&list=usercontribs&ucuser=' + mw.config.get('wgUserName') + '&uclimit=max&ucdir=newer&rawcontinue=&format=json&ucnamespace=' + nsnumsV2[i] + nextV,				dataType: 'json',				success: function(ucResponse) {					editsV += ucResponse.query.usercontribs.length;					if (ucResponse["query-continue"]) {						nextV = '&uccontinue=' + ucResponse["query-continue"].usercontribs.uccontinue;					} else {						nextV = 'stop';					}				}			}); }

editsV = editsV - movelogV[i] - protectlogV[i];

editCountV = editCountV + editsV;

if (editsV > 0) { tableV += '\n|- \n| style="border-right: 0px;"| ' + namespacesV[i]+' || style="border-left: 0px; text-align: center;"| NS:' + nsnumsV2[i] + ' || style="text-align: center;"| {' + substV + 'formatnum:' + editsV + '}} || style="text-align: right;"| ' + ( Math.round( ( editsV / mwEditCountV ) * 100 ) ) + "%"; }		if (i+1 < namespacesV.length){ $(this).html('Counting edits in ' + namespacesV[i+1]); } else { $(this).html('Tallying all edits from the API...'); }	}	tableVTop += " (" + ( 100 - ( Math.round( ( editCountV / mwEditCountV ) * 100 ) ) ) + "%)";

tableV = tableVTop + tableV + tableVBottom; // Get edit token and check if we'll be creating a new page (in the case of non-autoconfirmed users) $.ajax({		url: apiLinkV + 'action=query&prop=info|revisions&intoken=edit&format=json&titles=' + editPageV,		dataType: 'json',		success: function(propResponse) {			for (var page in propResponse.query.pages) {				editTokenV = propResponse.query.pages[page].edittoken.replace(/\+\\$/g, '%2B%5C');				if (propResponse.query.pages[page].revisions) {					oldPageV = true;				}			}		}	}); // If the user is not autoconfirmed and we're creating a new page, kick out of the script if (!VskipCAPTCHA && !oldPageV) { alert("Sorry, you're not autoconfirmed yet, so captcha is required to make new pages. Go create the page at: " + editPageV + ", then try again."); $(this).html('Error! Error! Error!'); return; } // Edit the target page with the table $.ajax({		url: apiLinkV + 'action=edit&title=' + editPageV + '&summary=' + editSummaryV + '&minor=1&recreate=1&bot=1&text=' + escape(tableV) + '&token=' + editTokenV,		type: 'POST',		success: function {           succeededV = true;        }	}); // change edit count link to reflect the status of the page save if (succeededV) { $(this).html('Done!').attr('href', document.location.href); $('#t-editcounter').click(function{$(this).html('Reloading!')}); } else { $(this).html('Error! Error! Error!'); }	}); }); }