User:Majr/editcounter.js

/***********************************************************************************/ /* Edit counter script                                                            */ /*  author:        User:Najzere @ strategywiki.org                                */ /*  source:        http://strategywiki.org/wiki/User:Najzere/edit_counter.js      */ /*  documentation: http://strategywiki.org/wiki/User_talk:Najzere/edit_counter.js */ /*  contact:       http://strategywiki.org/wiki/User_talk:Najzere                 */ /*  license:       CC-BY-SA 3.0 (http://creativecommons.org/licenses/by-sa/3.0/)  */ /***********************************************************************************/

// Only add edit count button on user pages if (wgTitle == wgUserName && wgNamespaceNumber == 2) { addOnloadHook(makeEditCountButton); }

// Add a new link after "User contributions" in the toolbox function makeEditCountButton { if (!document.getElementById('t-contributions')) { alert('Expected element not found. Please see http://strategywiki.org/wiki/User_talk:Najzere to have your wiki added.'); return; }; var newlist = document.createElement('li'); newlist.id = "t-editcounter"; var newlink = document.createElement('a'); newlink.href = 'javascript:countEdits'; var linkname = document.createTextNode('Edit counter'); newlink.appendChild(linkname); newlist.appendChild(newlink); document.getElementById('t-contributions').parentNode.insertBefore(newlist, document.getElementById('t-contributions').nextSibling); }

function countEdits { // Change edit counter link to let the user know it's thinking document.getElementById('t-editcounter').getElementsByTagName('a')[0].innerHTML = 'Calculating...';

// Set up variables if (wgServer == 'http://strategywiki.org') { var editSummary = 'Edited with edit counter.js'; var tableTop = 'Edit count'; } else { var editSummary = 'Edited with http://strategywiki.org/wiki/User_talk:Najzere/edit_counter.js'; var tableTop = 'edit counter.js'; }; if (typeof editPage == 'undefined') {editPage = 'Edit count'}; if (typeof tableClass == 'undefined') {tableClass = ''}; if (typeof tableStyle == 'undefined') {tableStyle = ''}; if (editPage == '') {editPage = 'Edit count'}; var skipcaptcha = false; var oldpage = false; var edits; var namespaces = new Array; var movelog = new Array; var protectlog = new Array; var next; var edittoken; var brace = '{'; var table = ' Edit count \n{| class="wikitable '+tableClass+'" style="'+tableStyle+'"\n|-\n! ';

// Check if the user is autoconfirmed for (var right in wgUserGroups) if (wgUserGroups[right] == 'autoconfirmed') {skipcaptcha = true};

// Initialize namespace, move log and patrol log arrays queryApi('action=query&meta=siteinfo&siprop=namespaces', function(siResponse) {   for (var ns in siResponse.query.namespaces) {      if (siResponse.query.namespaces[ns].id > -1) {        if(siResponse.query.namespaces[ns].id != namespaces.length)          break;        if (siResponse.query.namespaces[ns].id == 0) {          namespaces[siResponse.query.namespaces[ns].id] = 'Main';        } else if (siResponse.query.namespaces[ns].id == 5) {          namespaces[siResponse.query.namespaces[ns].id] = 'Minecraft Wiki';        } else if (siResponse.query.namespaces[ns].id == 6) {          namespaces[siResponse.query.namespaces[ns].id] = 'Minecraft Wiki talk';        } else {          namespaces[siResponse.query.namespaces[ns].id] = siResponse.query.namespaces[ns].canonical;        };        movelog[siResponse.query.namespaces[ns].id] = 0;        protectlog[siResponse.query.namespaces[ns].id] = 0; };   };  });

// Fill move log array next = ''; while (next != 'stop') { queryApi('action=query&list=logevents&letype=move&leuser='+wgUserName+'&lelimit=max&leprop=title'+next, function(moveResponse) {     for (var event in moveResponse.query.logevents) {        movelog[moveResponse.query.logevents[event].ns] += 1;      }      if (moveResponse["query-continue"]) {        next = '&lestart='+moveResponse["query-continue"].logevents.lestart;      } else {        next = 'stop';      };    }); }

// Fill patrol log array next = ''; while (next != 'stop') { queryApi('action=query&list=logevents&letype=protect&leuser='+wgUserName+'&lelimit=max&leprop=title'+next, function(protectResponse) {     for (var event in protectResponse.query.logevents) {        protectlog[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 for (var i = 0; i < namespaces.length; i++) { next = ''; edits = 0; while (next != 'stop') { queryApi('action=query&list=usercontribs&ucuser='+wgUserName+'&uclimit=max&ucdir=newer&ucnamespace='+i+next, 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]; if (edits > 0) { table += namespaces[i]+' !! ';   };  };  table += 'Total\n|-\n| '; // Loop through namespaces counting edits and subtracting page moves and patrols for (var i = 0; i < namespaces.length; i++) { next = ''; edits = 0; while (next != 'stop') { queryApi('action=query&list=usercontribs&ucuser='+wgUserName+'&uclimit=max&ucdir=newer&ucnamespace='+i+next, 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]; if (edits > 0) { table += brace+brace+'subst:formatnum:'+edits+'}} || '; }; };  // Get full edit count, as tracked by MW, add it to table queryApi('action=query&meta=userinfo&uiprop=editcount', function(uiResponse) {   table += brace+brace+'subst:formatnum:'+uiResponse.query.userinfo.editcount+'}}\n|}';  }); table += ' Last updated: '+brace+brace+'subst:#time:F j, Y}}. Generated with '+tableTop+' \n ';

// Get edit token and check if we'll be creating a new page (in the case of non-autoconfirmed users) queryApi('action=query&prop=info|revisions&intoken=edit&titles=User:'+wgUserName+'/'+editPage, 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: User:"+wgUserName+"/"+editPage+", then try again."); document.getElementById('t-editcounter').getElementsByTagName('a')[0].innerHTML = 'Error!'; return; };

// Edit the target page with the table, change edit count link to reflect the status of the page save queryApi('action=edit&title=User:'+wgUserName+'/'+editPage+'&summary='+editSummary+'&minor=1&recreate=1&bot=1&text='+table+'&token='+edittoken, function(actionResponse) {   if (actionResponse.edit.result == "Success") {      document.getElementById('t-editcounter').getElementsByTagName('a')[0].innerHTML = 'Done!';    } else {      document.getElementById('t-editcounter').getElementsByTagName('a')[0].innerHTML = 'Error!';    };  }); }

// Accepts an API query and callback function for handling queries from the main function function queryApi(query, callback) { try { var xmlRequest = new XMLHttpRequest; } catch(e) { try { var xmlRequest = new ActiveXObject("Msxml2.XMLHTTP"); } catch(e) { try { var xmlRequest = new ActiveXObject("Microsoft.XMLHTTP"); } catch(e) { throw "Could not create an XmlHttpRequest"; }     }    }

xmlRequest.open('POST', wgScriptPath+'/api.php', false); xmlRequest.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); xmlRequest.send(query+'&format=json'); var xmlResponse = new Function("return "+xmlRequest.responseText); if (!xmlResponse) { alert('Problem retrieving information'); } else { callback(xmlResponse); }; }