Usuário:Rjclaudio/Tools/EditStats.js
Nota: Depois de publicar, poderá ter de contornar a cache do seu navegador para ver as alterações.
- Firefox / Safari: Pressione Shift enquanto clica Recarregar, ou pressione Ctrl-F5 ou Ctrl-R (⌘-R no Mac)
- Google Chrome: Pressione Ctrl-Shift-R (⌘-Shift-R no Mac)
- Internet Explorer / Edge: Pressione Ctrl enquanto clica Recarregar, ou pressione Ctrl-F5
- Opera: Pressione Ctrl-F5.
// [[File:User:He7d3r/Tools/EditStats.js]] (workaround for [[phab:T35355]])
/*jslint browser: true, white: true, plusplus: true, todo: true */
/**
* Edit statistics
* @author: Helder (https://github.com/he7d3r)
* @license: CC BY-SA 3.0 <https://creativecommons.org/licenses/by-sa/3.0/>
* TODO:
* - Contar tanto reversões como edições normais
* - Gerar uma única tabela, com cada período em uma coluna
* - Incluir botões para preencher campos com listas obtidas da API
* - Facilitar a seleção de datas com o plugin "datepicker" do jQuery
*/
/*global jQuery, mediaWiki */
( function ( mw, $ ) {
'use strict';
$.extend( mw.Api.prototype, {
/**
* Get list of users in the given group
*/
getUsersInGroup: function( group ){
var apiDeferred = $.Deferred();
this.get( {
list: 'allusers',
augroup: group,
aulimit: 5000
} )
.done( function ( data ) {
apiDeferred.resolve(
$.map(data.query.allusers, function(user){
return user.name;
})
);
} )
.fail( apiDeferred.reject );
return apiDeferred.promise();
},
/**
* Get number of reverts made by a user in a given period of time
*/
getTotalRevertsByUser: function( userName, from, to ){
var apiDeferred = $.Deferred(),
mwAPI = this,
params = {
list: 'usercontribs',
ucstart: from,
ucend: to,
ucuser: userName,
ucdir: 'newer',
ucprop: 'comment',
uclimit: 5000
},
total = 0,
doRequest = function( ucstart ){
if( ucstart ){
params.ucstart = ucstart;
}
mwAPI.get( params )
.done( function ( data ) {
var i, l,
list = data.query.usercontribs;
for(i=0, l = list.length; i < l; i++ ){
if( /Rever(?:tendo|tidas|são)|Desf(?:eita|iz)/gi.test( list[i].comment ) ){
total += 1;
}
}
if( data['query-continue']){
doRequest( data['query-continue'].usercontribs.ucstart );
} else {
apiDeferred.resolve( total );
}
} )
.fail( apiDeferred.reject );
};
doRequest();
return apiDeferred.promise();
}
/**
* Get number of edits by a user in a given period of time
*/
getTotalEditsByUser: function( userName, from, to ){
var apiDeferred = $.Deferred(),
mwAPI = this,
params = {
list: 'usercontribs',
ucstart: from,
ucend: to,
ucuser: userName,
ucdir: 'newer',
ucprop: 'sizediff',
uclimit: 5000
},
total = 0,
doRequest = function( ucstart ){
if( ucstart ){
params.ucstart = ucstart;
}
mwAPI.get( params )
.done( function ( data ) {
//debugger;
total += data.query.usercontribs.length;
if( data['query-continue']){
doRequest( data['query-continue'].usercontribs.ucstart );
} else {
apiDeferred.resolve( total );
}
} )
.fail( apiDeferred.reject );
};
doRequest();
return apiDeferred.promise();
}
});
var api = new mw.Api(),
getEditStats = function( userList, from, to ){
var statsDeferred = $.Deferred(),
index = 0,
table = [],
wikitable = '{| class="wikitable sortable" style="float:left;"\n|+ De ' +
from + ' a ' + to + '\n|-\n! Editor || Total\n',
addUserEditsToTable = function( userName ){
jsMsg('Obtendo o número de edições feitas entre ' + from + ' e ' + to + ' por ' + userName + '...');
api.getTotalEditsByUser( userName, from, to )
.done( function( total ){
var i;
table[index] = [ userName, total ];
index++;
if ( index < userList.length ){
addUserEditsToTable( userList[ index ] );
} else {
for( i = 0; i < table.length; i++ ){
wikitable += '|-\n| ' + table[i][0] + ' || ' + table[i][1] + '\n';
}
wikitable += '|}\n';
statsDeferred.resolve( wikitable );
}
} )
.fail( statsDeferred.reject );
};
addUserEditsToTable( userList[ index ] );
return statsDeferred.promise();
},
getRevertStats = function( userList, from, to ){
var statsDeferred = $.Deferred(),
index = 0,
table = [],
wikitable = '{| class="wikitable sortable" style="float:left;"\n|+ De ' +
from + ' a ' + to + '\n|-\n! Editor || Total\n',
addUserRevertsToTable = function( userName ){
$('#stats-result').text('Estimando o número de reversões feitas entre ' + from + ' e ' + to + ' por ' + userName + '...');
api.getTotalRevertsByUser( userName, from, to )
.done( function( total ){
var i;
table[index] = [ userName, total ];
index++;
if ( index < userList.length ){
addUserRevertsToTable( userList[ index ] );
} else {
for( i = 0; i < table.length; i++ ){
wikitable += '|-\n| ' + table[i][0] + ' || ' + table[i][1] + '\n';
}
wikitable += '|}\n';
statsDeferred.resolve( wikitable );
}
} )
.fail( statsDeferred.reject );
};
addUserRevertsToTable( userList[ index ] );
return statsDeferred.promise();
},
getStatsForListOfUsers = function( users, periods ){
var listDeferred = $.Deferred(),
stats = '',
periodId = 0,
addStatsForPeriod = function( period ){
getEditStats( users, from, to )
.done(function( wikitable ){
stats += '\n' + wikitable;
periodId += 2;
if( periodId + 1 < periods.length){
addStatsForPeriod( periods[ periodId ], periods[ periodId + 1 ] );
} else{
listDeferred.resolve( stats );
}
})
.fail( listDeferred.reject );
};
addStatsForPeriod( periods[ periodId ], periods[ periodId + 1 ] );
return listDeferred.promise();
},
run = function( users, periods ){
getStatsForListOfUsers( users, periods )
.done(function( wikiCode ){
$('#stats-result')
.text( '== Resultado ==\n' + wikiCode )
.show();
$('#stats-button')
.prop('disabled', false);
});
},
load = function( e ){
var $config = $('<div id="stats-config"></div>'),
$result = $('<pre id="stats-result"></pre>').hide(),
$periodList = $('<textarea />', {
id: 'stats-period-list',
name: 'stats-period-list',
rows: 10,
tabindex: 1
}).text(
'2011-01-01T00:00:00Z\n2011-01-07T23:59:59Z\n' +
'2011-01-08T00:00:00Z\n2011-01-14T23:59:59Z'
),
$userList = $('<textarea />', {
id: 'stats-user-list',
name: 'stats-user-list',
rows: 10,
tabindex: 1
}).text( mw.config.get( 'wgUserName' ) + '\nFulano\nCiclano' ),
$button = $('<input />', {
id: 'stats-button',
name: 'stats-button',
type: 'submit',
tabindex: 2,
value: 'Obter estatísticas',
title: 'Obter as estatísticas referentes à lista de editores fornecida'
})
.click( function(){
$button.prop('disabled', true);
$('#stats-result').empty();
run(
$('#stats-user-list').val().split('\n'),
$('#stats-period-list').val().split('\n')
);
} );
e.preventDefault();
$config
.append('<p>Lista de editores (um item em cada linha):</p>')
.append( $userList )
.append('<p>Lista de períodos (um item em cada linha, alternando' +
' entre o início e o fim de cada período):</p>')
.append( $periodList )
.append( $button )
.append( $result );
$('#mw-content-text').prepend( $config );
},
addLink = function(){
$( mw.util.addPortletLink(
'p-cactions',
'#',
'Estatísticas de edição',
'ca-my-portlet',
'Obter estatísticas relativas às edições de um grupo de editores em determinado período'
) ).click( load );
};
if ( mw.config.get( 'wgPageName' ) === 'Wikipédia:Estatísticas' ) {
$( addLink );
}
}( mediaWiki, jQuery ) );