User:HectorHW/global.js

/** * ContributionsCalculator * @author Wildream * Данный скрипт позволит получить различные данные о вкладе, внесённом участником в википроект * Скрипт показывает количество: * * Совершённых правок без учёта архивированных версий * * Созданных статей (в основном пространстве) * * Загруженных файлов * * Правок, помеченных, как "малые" * * Объём внесённого в основное пространство, в байтах * * Объём внесённого вклада в википроект в целом, в байтах * Автор идеи скрипта - Idel sea Qatarhael *  * Использование: * * Добавь следующую строку на страницу http://community.wikia.com/wiki/Special:MyPage/global.js * * importScriptPage('User:Wildream/ContributionsCalculator.js', 'ru.community'); * * Обнови кэш * * Перейди на страницу вклада любого участника * * В списке ссылок над полем "Поиск вклада" найди и нажми на ссылку "ContributionsCalculator" * * В появившемся диалоговом окне нажми кнопку "Начать вычисление" */ var contribs = []; function obtainContribs(user, timestamp) { /**     * Данная функция рекурсивно получает список совершённых участником правок с помощью MediaWiki API и сохраняет их во внешней переменной. */    if (typeof timestamp === 'undefined') { userContribsData = { 'action': 'query', 'list': 'usercontribs', 'ucuser': user, 'uclimit': 'max', 'format': 'json' };    } else { userContribsData = { 'action': 'query', 'list': 'usercontribs', 'ucuser': user, 'uclimit': 'max', 'ucstart': timestamp, 'format': 'json' };    }     $.ajax({         url: mw.util.wikiScript('api'),         type: 'GET',         data: userContribsData     }).success(function (data) {         if (data && data.query.usercontribs) {             $.merge(contribs, data.query.usercontribs);         }         if (typeof data['query-continue'] !== 'undefined') {             obtainContribs(user, data['query-continue']['usercontribs']['ucstart']);         } else {             $('#ContribsCounterModal h1').text('Построение таблицы...');             processContribs;         }     }); } function processContribs { /**     * Эта функция обрабатывает полученный массив с данными о правках, подсчитывает количество * совершённых правок, созданных статей, файлов и малых правок, суммирует объём внесённого вклада для правок, которыми были созданы новые страницы. * Обработанные данные оформляются в таблицу, после чего запускается подсчёт объёма внесённого вклада для всех остальных правок. */    var contribsToGet = []; var threads = 20; // Число потоков для функции getContributionsSizeDiffs var doneCount = 0; function getContributionsSizeDiffs(thread, contribsCountOnStart) { /**         * Эта функция собирает данные об объёме внесённого вклада для правок, которыми не были созданы новые страницы. * Функция рекурсивно обращается к MediaWiki API, получая размеры статей до и после совершения каждой правки, и определяет разницу размеров * для каждой правки, после чего обновляет данные в таблице. Запросы на получение данных отправляются в несколько потоков. */        // console.log('Request in thread ' + thread + ', ' + contribsToGet.length + ' requests to go.'); if (contribsToGet.length) { var contrib = contribsToGet.shift; $.ajax({                url: mw.util.wikiScript('api'),                 type: 'GET',                 data: {                     'action': 'query',                     'prop': 'revisions',                     'rvlimit': '2',                     'rvprop': 'size',                     'titles': contrib.title,                     'rvstartid': contrib.revid,                     'format': 'json'                 }             }).complete(function (data) {                 data = JSON.parse(data.responseText);                 try {                     if (parseInt(data['query']['pages'][Object.keys(data['query']['pages'])[0]]['revisions'][0]['size'], 10) > parseInt(data['query']['pages'][Object.keys(data['query']['pages'])[0]]['revisions'][1]['size'], 10)) {                         $('#ContribsTotal').text(parseInt($('#ContribsTotal').text, 10) + (data['query']['pages'][Object.keys(data['query']['pages'])[0]]['revisions'][0]['size'] - data['query']['pages'][Object.keys(data['query']['pages'])[0]]['revisions'][1]['size']));                        if (contrib.ns === 0) {                             $('#ContribsMain').text(parseInt($('#ContribsMain').text, 10) + (data['query']['pages'][Object.keys(data['query']['pages'])[0]]['revisions'][0]['size'] - data['query']['pages'][Object.keys(data['query']['pages'])[0]]['revisions'][1]['size']));                        }                     }                 } catch (e) {                     console.log(e);                     console.log(contrib.title, contrib.title);                 }                 var progress = 100 - parseInt(contribsToGet.length * 100 / contribsCountOnStart, 10);                 if (!isNaN(progress)) {                     $('#ContribsCounterModal h1').text('Вычисление объёма вклада, ' + progress + '% завершено');                 }                 getContributionsSizeDiffs(thread, contribsCountOnStart);             }); } else { doneCount++; if (doneCount === threads) { $('#ContribsTotal').css('color', 'green'); }        }     }     if ($('#ContribsCounterModal').length) { $('#ContribsCounterModal h1').text('Распределение данных...'); var tableOfContribs = ' '; $('#CounterContent').empty.append(tableOfContribs); console.log('total contribs count: ' + contribs.length); $('#EditCount').text(contribs.length); for (var contribIndex = 0; contribIndex < contribs.length; contribIndex++) { if (contribs[contribIndex].hasOwnProperty('new') && !isNaN(parseInt(contribs[contribIndex]['size'], 10))) { $('#ContribsTotal').text(parseInt($('#ContribsTotal').text, 10) + parseInt(contribs[contribIndex]['size'], 10)); if (contribs[contribIndex].ns === 0) { $('#NewArticlesCount').text(parseInt($('#NewArticlesCount').text, 10) + 1); $('#ContribsMain').text(parseInt($('#ContribsMain').text, 10) + parseInt(contribs[contribIndex]['size'], 10)); }            } else { contribsToGet.push(contribs[contribIndex]); }            if (contribs[contribIndex].hasOwnProperty('new') && contribs[contribIndex].ns === 6) { $('#NewFilesCount').text(parseInt($('#NewFilesCount').text, 10) + 1); }            if (contribs[contribIndex].hasOwnProperty('minor')) { $('#MinorEditsCount').text(parseInt($('#MinorEditsCount').text, 10) + 1); }        }         // Вызов функции getContributionsSizeDiffs в несколько потоков for (var threadNumber = 0; threadNumber < threads; threadNumber++) { getContributionsSizeDiffs((threadNumber + 1), contribsToGet.length); }    } } function showContributionsModal { /**     * Создание окна ContributionsCalculator */    $.showCustomModal('Получение данных о вкладе участника ' + mw.config.get('wgPageName').replace(/^.*?\//, ''), ' Начать вычисление ', {         id: 'ContribsCounterModal',         width: 600,     }); $('#StartCounter').click(function {         $('#CounterContent').empty.text('Получение данных...');         obtainContribs(mw.config.get('wgPageName').replace(/^.*?\//, ''));     }); } $(function {     if (wgCanonicalSpecialPageName === "Contributions") {         $('#contentSub').append(' | ContributionsCalculator |');     } });