User:Mosrod/editcounter.js

/***********************************************************************************/ /*                                                                                */ /*                           MEDIAWIKI EDITCOUNTER  v111                           */ /*                                                                                */ /*     license:   CC-BY-SA 3.0  http://creativecommons.org/licenses/by-sa/3.0/     */ /*                                                                                */ /* Original credit:                                                                */ /*  author:        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                 */ /* Minecraft Wiki credit:                                                         */ /*  author:        Matt (Majr) @ minecraft.gamepedia.com                          */ /*  source:        http://minecraft.gamepedia.com/User:Majr/editcounter.js        */ /* Wikipedia version credit:                                                        */ /*  author:        Kanegasi @ minecraft.gamepedia.com/en.wikipedia.org            */ /*  source:        http://en.wikipedia.org/wiki/User:Kanegasi/editcounter.js      */ /*  documentation: http://en.wikipedia.org/wiki/User:Kanegasi/editcounter         */ /*  contacts:      http://minecraft.gamepedia.com/User_talk:Kanegasi  -OR-        */ /*                 http://en.wikipedia.org/wiki/User_talk:Kanegasi /* Current version credit:                                                        */ /*  author:        Mosrod @ en.wikipedia.org            */ /*  source:        http://en.wikipedia.org/wiki/User:Mosrod/editcounter.js      */ /*  documentation: http://en.wikipedia.org/wiki/User:Mosrod/editcounter         */ /*  contacts:      http://en.wikipedia.org/wiki/User_talk:Mosrod             */ /***********************************************************************************/ $(document).ready(function { // Add new link labeled "Edit counter" after "User contributions" in side menu if (!$('#t-contributions').length) { alert('Missing "User contributions" link in the side menu'); return; } var $editCountLink = $('Edit counter').attr({ id: 't-editcounter', href: '#', title: 'Run edit counter script' }); $('#t-contributions').after($('').html($editCountLink)); $('#t-editcounter').click(function { $('#t-editcounter').text('Processing…'); setTimeout(function { // Set up variables if (/wikipedia.org/.test(mw.config.get('wgServer'))) { interwikiLink = 'en'; } else { interwikiLink = 'wikipedia'; } if (typeof (pageName) == 'undefined') { pageName = 'EditCount'; } if (typeof (subPages) == 'undefined') { subPages = false; } if (typeof (datePageName) == 'undefined') { datePageName = 'date'; } if (typeof (totalPageName) == 'undefined') { totalPageName = 'total'; } if (typeof (summaryLink) == 'undefined') { summaryLink = interwikiLink + ':User:Mosrod/editcounter'; } if (typeof (tableCaption) == 'undefined') { tableCaption = ''; } if (typeof (tableHeaders) == 'undefined' || tableHeaders === true) { headerPipe = '! '; } else { headerPipe = '| '; } if (typeof (nameSpaces) == 'undefined') { nameSpaces = []; } if (typeof (mainTableAttrib) == 'undefined') { mainTableAttrib = 'class="wikitable" style="margin: ' + '0 auto 1em; text-align: center"'; } if (typeof (topRowAttrib) == 'undefined') { topRowAttrib = ''; } if (typeof (bottomRowAttrib) == 'undefined') { bottomRowAttrib = ''; } if (typeof (dateFormat) == 'undefined') { dateFormat = 'F j, Y'; } if (typeof (noInclude1) == 'undefined') { noInclude1 = ''; } else { noInclude1 = ' ' + noInclude1 + ' '; } if (typeof (noInclude2) == 'undefined') { noInclude2 = ''; } else { noInclude2 = ' ' + noInclude2 + ' '; } if (typeof (noInclude3) == 'undefined') { noInclude3 = ''; } else { noInclude3 = ' ' + noInclude3 + ' '; } if (typeof (noInclude) == 'undefined') { noInclude = ''; } else { noInclude1 = ' ' + noInclude + ' '; noInclude2 = ' ' + noInclude + ' '; noInclude3 = ' ' + noInclude + ' '; } if (!(/\|/.test(summaryLink))) { summaryLink += '|updated'; } if (/wikipedia:User:Mosrod\/editcounter/i.test(summaryLink) && interwikiLink == 'en') { summaryLink = summaryLink.replace(/wikipedia/i,'en'); } var userName = mw.config.get('wgUserName'), contribLink = '[' + mw.config.get('wgServer') + mw.config.get('wgScriptPath') + '/index.php?title=Special%3AContributions&target=' + encodeURIComponent(userName) + '&namespace=', bracesLeft = '', deletedEdits = 0, edits = [], editToken, fullPageName = 'User:' + userName + '/' + pageName, fullDatePageName = fullPageName + '/' + datePageName, fullTotalPageName = fullPageName + '/' + totalPageName, commonPage = 'User:' + userName + '/' + 'common.js', vectorPage = 'User:' + userName + '/' + 'vector.js', scriptPages = commonPage + '|' + vectorPage, next, noCaptcha = false, oldPage = false, oldPage1 = true, oldPage2 = true, oldPage3 = true, tableAll, timeStamp = bracesLeft + 'subst:#time:' + dateFormat + bracesRight, tablePart1 = '{| ' + mainTableAttrib + '\n', tablePart2 = '|+ style="caption-side: bottom; ' + 'font-size: x-small; font-weight: normal" | ', tablePart3 = '' + 'Last update: ' + timeStamp + '\n', tablePart5 = '|- ' + topRowAttrib + '\n', tablePart6 = '', tablePart7 = '|- class="plainlinks" ' + bottomRowAttrib + '\n', tablePart8 = '', totalCount, totalEdits = bracesLeft + 'subst:formatnum:', touchedDate, currentDate, coolDown, touchedDate2, currentDate2, coolDown2, ajaxvars; if (tableCaption !== '') { tablePart4 = '|-\n! colspan=99 style="align: center; ' + 'border-left: hidden; border-right: hidden; ' + 'border-top: hidden" | ' + tableCaption + '\n'; } else { tablePart4 = ''; } // Retrieve edit token and check for existing page(s) $.ajax({ type: "GET", url: mw.util.wikiScript('api'), data: { format: 'json', action: 'query', prop: 'info', intoken: 'edit', titles: fullPageName + '|' + fullDatePageName + '|' + fullTotalPageName + '|' + scriptPages }, dataType: 'json', async: false, success: function (propResponse) { for (var page in propResponse.query.pages) { editToken = propResponse.query.pages[page].edittoken; if (propResponse.query.pages[page].title == fullPageName) { if (propResponse.query.pages[page].missing) { oldPage1 = false; } else { oldPage = true; } if (propResponse.query.pages[page].touched) { touchedDate = propResponse.query.pages[page].touched; currentDate = propResponse.query.pages[page].starttimestamp; coolDown = new Date(currentDate.substr(0,10).replace(/-/ig,',')) - new Date(touchedDate.substr(0,10).replace(/-/ig,',')); } } if (propResponse.query.pages[page].title == vectorPage) { if (!propResponse.query.pages[page].missing) { if (propResponse.query.pages[page].touched) { touchedDate2 = propResponse.query.pages[page].touched; currentDate2 = propResponse.query.pages[page].starttimestamp; coolDown2 = new Date(currentDate2.substr(0,10).replace(/-/ig,',')) - new Date(touchedDate2.substr(0,10).replace(/-/ig,',')); } } } if (propResponse.query.pages[page].title == commonPage) { if (!propResponse.query.pages[page].missing && !coolDown2) { if (propResponse.query.pages[page].touched) { touchedDate2 = propResponse.query.pages[page].touched; currentDate2 = propResponse.query.pages[page].starttimestamp; coolDown2 = new Date(currentDate2.substr(0,10).replace(/-/ig,',')) - new Date(touchedDate2.substr(0,10).replace(/-/ig,',')); } } } if (propResponse.query.pages[page].title == fullDatePageName) { if (propResponse.query.pages[page].missing && subPages) { oldPage2 = false; } else { oldPage = true; } } if (propResponse.query.pages[page].title == fullTotalPageName) { if (propResponse.query.pages[page].missing && subPages) { oldPage3 = false; } else { oldPage = true; } } } }, error: function (xhr, textStatus, error){ $('#t-editcounter').text('Error!'); alert(xhr.statusText); alert(textStatus); alert(error); return; } }); // Check if user autoconfirmed and stop script if false and no page exists. // Also check for last count and stop if same day. if (/confirmed/i.test(mw.config.get('wgUserGroups'))) { noCaptcha = true; } if (!oldPage && !noCaptcha) { $('#t-editcounter').text('Error!'); if (!oldPage1) { oldPage1 = '\n\t' + fullPageName; } else { oldPage1 = ; } if (!oldPage2 && subPages) { oldPage2 = '\n\t' + fullDatePageName; } else { oldPage2 = ; } if (!oldPage3 && subPages) { oldPage3 = '\n\t' + fullTotalPageName; } else { oldPage3 = ''; } alert('Your account requires a captcha to make new pages.\n' + 'Make sure the following page(s) exist:\n' + oldPage1 + oldPage2 + oldPage3); return; } // Initialize namespace and edit arrays $.ajax({ type: "GET", url: mw.util.wikiScript('api'), data: { format: 'json', action: 'query', meta: 'siteinfo', siprop: 'namespaces' }, dataType: 'json', async: false, success: function (siResponse) { for (var ns in siResponse.query.namespaces) { if (siResponse.query.namespaces[ns].id > -1) { if (siResponse.query.namespaces[ns].id === 0 && typeof (nameSpaces[0]) == 'undefined') { nameSpaces[siResponse.query.namespaces[ns].id] = 'Main'; } else if (siResponse.query.namespaces[ns].id == 4 && typeof (nameSpaces[4]) == 'undefined') { nameSpaces[siResponse.query.namespaces[ns].id] = mw.config.get('wgSiteName'); } else if (siResponse.query.namespaces[ns].id == 5 && typeof (nameSpaces[5]) == 'undefined') { nameSpaces[siResponse.query.namespaces[ns].id] = mw.config.get('wgSiteName') + ' talk'; } else { if (typeof (nameSpaces[siResponse.query.namespaces[ns].id]) == 'undefined') { nameSpaces[siResponse.query.namespaces[ns].id] = siResponse.query.namespaces[ns].canonical; } } edits[siResponse.query.namespaces[ns].id] = 0; } } }, error: function (xhr, textStatus, error) { $('#t-editcounter').text('Error!'); alert(xhr.statusText); alert(textStatus); alert(error); return; } }); // Fill edit array with moves (negative numbers) next = '1'; while (next != 'stop') { ajaxvars = { type: "GET", url: mw.util.wikiScript('api'), data: { format: 'json', action: 'query', rawcontinue: , list: 'logevents', leuser: userName, letype: 'move', leprop: 'title', lelimit: 'max', ledir: 'newer' }, dataType: 'json', async: false, success: function (logResponse) { for (var event in logResponse.query.logevents) { edits[logResponse.query.logevents[event].ns] -= 1; deletedEdits -= 1; } if (logResponse['query-continue']) { next = logResponse['query-continue'].logevents.lecontinue; } else { next = 'stop'; } }, error: function (xhr, textStatus, error) { $('#t-editcounter').text('Error!'); alert(xhr.statusText); alert(textStatus); alert(error); return; } }; if (next != '1') { ajaxvars.data = { format: 'json', action: 'query', rawcontinue: , list: 'logevents', leuser: userName, letype: 'move', leprop: 'title', lelimit: 'max', ledir: 'newer', lecontinue: next }; } $.ajax(ajaxvars); } // Fill edit array with protects (negative numbers) next = '1'; while (next != 'stop') { ajaxvars = { type: "GET", url: mw.util.wikiScript('api'), data: { format: 'json', action: 'query', rawcontinue: '', list: 'logevents', leuser: userName, letype: 'protect', leprop: 'title', lelimit: 'max', ledir: 'newer' }, dataType: 'json', async: false, success: function (logResponse) { for (var event in logResponse.query.logevents) { edits[logResponse.query.logevents[event].ns] -= 1; deletedEdits -= 1; } if (logResponse['query-continue']) { next = logResponse['query-continue'].logevents.lecontinue; } else { next = 'stop'; } }, error: function (xhr, textStatus, error) { $('#t-editcounter').text('Error!'); alert(xhr.statusText); alert(textStatus); alert(error); return; } }; if (next != '1') { ajaxvars.data = { format: 'json', action: 'query', rawcontinue: '', list: 'logevents', leuser: userName, letype: 'protect', leprop: 'title', lelimit: 'max', ledir: 'newer', lecontinue: next }; } $.ajax(ajaxvars); } // Fill edit array with file overwrites (negative numbers) next = '1'; while (next != 'stop') { ajaxvars = { type: "GET", url: mw.util.wikiScript('api'), data: { format: 'json', action: 'query', rawcontinue: '', list: 'logevents', leuser: userName, leaction: 'upload/overwrite', leprop: 'title', lelimit: 'max', ledir: 'newer' }, dataType: 'json', async: false, success: function (logResponse) { for (var event in logResponse.query.logevents) { edits[logResponse.query.logevents[event].ns] -= 1; deletedEdits -= 1; } if (logResponse['query-continue']) { next = logResponse['query-continue'].logevents.lecontinue; } else { next = 'stop'; } }, error: function (xhr, textStatus, error) { $('#t-editcounter').text('Error!'); alert(xhr.statusText); alert(textStatus); alert(error); return; } }; if (next != '1') { ajaxvars.data = { format: 'json', action: 'query', list: 'logevents', rawcontinue: '', leuser: userName, leaction: 'upload/overwrite', leprop: 'title', lelimit: 'max', ledir: 'newer', lecontinue: next }; } $.ajax(ajaxvars); } // Fill edit array with normal edits (positive numbers) next = '1'; while (next != 'stop') { ajaxvars = { type: "GET", url: mw.util.wikiScript('api'), data: { format: 'json', action: 'query', rawcontinue: '', list: 'usercontribs', ucuser: userName, ucprop: 'title', uclimit: 'max', ucdir: 'newer' }, dataType: 'json', async: false, success: function (ucResponse) { for (var event in ucResponse.query.usercontribs) { edits[ucResponse.query.usercontribs[event].ns] += 1; deletedEdits += 1; } if (ucResponse['query-continue']) { next = ucResponse['query-continue'].usercontribs.uccontinue; } else { next = 'stop'; } }, error: function (xhr, textStatus, error) { $('#t-editcounter').text('Error!'); alert(xhr.statusText); alert(textStatus); alert(error); return; } }; if (next != '1') { ajaxvars.data = { format: 'json', action: 'query', rawcontinue: '', list: 'usercontribs', ucuser: userName, ucprop: 'title', uclimit: 'max', ucdir: 'newer', uccontinue: next }; } $.ajax(ajaxvars); } for (var i = 0; i < nameSpaces.length; i++) { if (edits[i] > 0) { if (i == 2) { if (subPages) { edits[i] += 3; } else { edits[i] += 1; } } tablePart6 += headerPipe + nameSpaces[i] + '\n'; tablePart8 += '| ' + contribLink + i + ' ' + bracesLeft + 'subst:formatnum:' + edits[i] + bracesRight + ']' + '\n'; } } tablePart6 += headerPipe + 'Total\n'; tablePart8 += '| <span title="Deleted edits: '; // Retrieve total edit count and calculate estimated deleted edits $.ajax({ type: "GET", url: mw.util.wikiScript('api'), data: { format: 'json', action: 'query', meta: 'userinfo', uiprop: 'editcount' }, dataType: 'json', async: false, success: function (totalResponse) { deletedEdits -= totalResponse.query.userinfo.editcount; if (subPages) { totalCount = totalResponse.query.userinfo.editcount + 3; } else { totalCount = totalResponse.query.userinfo.editcount + 1; } tablePart8 += Math.abs(deletedEdits) + '">' + totalEdits + totalCount + bracesRight + ' \n|}'; }, error: function (xhr, textStatus, error) { $('#t-editcounter').text('Error!'); alert(xhr.statusText); alert(textStatus); alert(error); return; } }); tableAll = tablePart1 + tablePart2 + tablePart3 + tablePart4 + tablePart5 + tablePart6 + tablePart7 + tablePart8; // Submit post request to main page $.ajax({ type: 'POST', url: mw.util.wikiScript('api'), data: { format: 'json', action: 'edit', title: fullPageName, text: tableAll + noInclude1, summary:  + summaryLink + , bot: '1', minor: '1', recreate: '1', token: editToken }, dataType: 'json', async: false, success: function { $('#t-editcounter').text('Success!'); }, error: function (xhr, textStatus, error) { $('#t-editcounter').text('Error!'); alert(xhr.statusText); alert(textStatus); alert(error); return; } }); // Submit post request to date page if (subPages) { $.ajax({ type: 'POST', url: mw.util.wikiScript('api'), data: { format: 'json', action: 'edit', title: fullDatePageName, text: timeStamp + noInclude2, summary:  + summaryLink + , bot: '1', minor: '1', recreate: '1', token: editToken }, dataType: 'json', async: false, success: function { $('#t-editcounter').text('Success!'); }, error: function (xhr, textStatus, error) { $('#t-editcounter').text('Error!'); alert(xhr.statusText); alert(textStatus); alert(error); return; } }); } // Submit post request to total page if (subPages) { $.ajax({ type: 'POST', url: mw.util.wikiScript('api'), data: { format: 'json', action: 'edit', title: fullTotalPageName, text: totalCount + noInclude3, summary:  + summaryLink + , bot: '1', minor: '1', recreate: '1', token: editToken }, dataType: 'json', async: false, success: function { $('#t-editcounter').text('Success!'); }, error: function (xhr, textStatus, error) { $('#t-editcounter').text('Error!'); alert(xhr.statusText); alert(textStatus); alert(error); return; } }); } },1000); }); });