Usuário(a):Stanglavine/countCUStats.js

Origem: Wikipédia, a enciclopédia livre.

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.
/**
 * Adaptado de [[m:User:Glaisher/countCUStats.js]] por [[m:User:Stanglavine]]
 *
 * Permite quantificar as verificações realizadas no mês anterior por cada verificador
 * Útil para atualizar [[Wikipédia:CheckUser/Estatísticas]]
 * NOTA: Lembre-se que verificações realizadas por outros usuários (stewards, staff) não são contabilizadas
 *
 * Para usar, inclua o código abaixo em seu .js pessoal ([[Special:Mypage/common.js]]) e acesse [[Special:Checkuserstats]]:
 *
 * //countCUStats.js
 * importScript( 'User:Stanglavine/countCUStats.js' );
 * 
 * 
 * Créditos originais:
 * 
 * Autor original
 * @author Glaisher <https://meta.wikimedia.org/wiki/User:Glaisher>
 * @link https://meta.wikimedia.org?oldid=15206551
 * 
 * Correções em julho de 2019
 * @author Kunal Mehta <https://meta.wikimedia.org/wiki/User:Legoktm>
 * @author Scott Bassett <https://meta.wikimedia.org/wiki/User:SBassett_(WMF)>
 * 
 */

var api = new mw.Api();

var config = mw.config.get(['wgNamespaceNumber', 'wgTitle', 'skin']);

var dateToday = new Date();

var month = dateToday.getMonth();

switch (month) {
	case 0:
		var previousMonth = 'December';
		var currentMonth = 'January';
		break;
	case 1:
		var previousMonth = 'January';
		var currentMonth = 'February';
		break;
	case 2:
		var previousMonth = 'February';
		var currentMonth = 'March';
		break;
	case 3:
		var previousMonth = 'March';
		var currentMonth = 'April';
		break;
	case 4:
		var previousMonth = 'April';
		var currentMonth = 'May';
		break;
	case 5:
		var previousMonth = 'May';
		var currentMonth = 'June';
		break;
	case 6:
		var previousMonth = 'June';
		var currentMonth = 'July';
		break;
	case 7:
		var previousMonth = 'July';
		var currentMonth = 'August';
		break;
	case 8:
		var previousMonth = 'August';
		var currentMonth = 'September';
		break;
	case 9:
		var previousMonth = 'September';
		var currentMonth = 'October';
		break;
	case 10:
		var previousMonth = 'October';
		var currentMonth = 'November';
		break;
	case 11:
		var previousMonth = 'November';
		var currentMonth = 'December';
		break;
	default:
		break;
}

var currentYear = dateToday.getFullYear();

if (previousMonth == "December") {
		var previousYear = currentYear-1;
	} else {
		var previousYear = currentYear;
	}

var fromDate = '1 '+previousMonth+' '+previousYear+' UTC';

var toDate = '1 '+currentMonth+' '+currentYear+' UTC';

function getCheckusers() {
	return api.get( {
		format: 'json',
		action: 'query',
		list: 'allusers',
		augroup: 'checkuser',
		agulimit: 15 // Nós provavelmente não teremos mais verificadores que isso
	} );
}

function queryCheckUserLog( username ) {
	return api.get( {
		format: 'json',
		list: 'checkuserlog',
		culuser: username,
		cullimit: 4000, // Espera-se que ninguém efetue mais que isso em um mês.
		culdir: 'newer',
		// Por favor não mude o formato a não ser que saiba o que está fazendo, ou o script irá quebrar
		culfrom: new Date( fromDate ).toISOString(), // Data de início
		culto: new Date( toDate ).toISOString() // Data de fim
	} );
}

function appendToPage( text ) {
	// Note: text must be trusted!
	$( '#mw-content-text' ).append( text + '<br/>' );
}

function getStatsTable( entries ) {
	var html =
        '<table class="wikitable sortable">\n'
        + '<tr>'
        + '<th> Usuário </th>'
        + '<th> Contagem </th>'
        + '</tr>\n';

    $.each( entries, function( i, entry ) {
    	var name = (typeof entry.name == "string") ? entry.name : JSON.stringify(entry.name);
        var count = (typeof entry.count == "string") ? parseInt(entry.count).toString() :
            (typeof entry.count == "number") ? entry.count.toString() : JSON.stringify(entry.count);
    	
        html += '<tr>'
            + '<td>' + mw.html.escape( name ) + '</td>'
            + '<td>' + mw.html.escape( count ) + '</td>'
            + '</tr>\n';
    } );

    html += '</table>';

    return html;
}

function init() {
	getCheckusers().done( function( data ) {
		var checkusers = data.query.allusers,
		    checkuserCount = checkusers.length,
		    totalCount = 0,
		    stats = [];
		    promises = []; // promise for all query api requests
		$( '#mw-content-text' ).empty();
		appendToPage( '<span id="cu-status">Consultando... Por favor aguarde.</span>' );
		var $status = $( '#cu-status' );

        $.each( checkusers, function( i, info ) {
            var username = info.name;
            var queryPromise = queryCheckUserLog( username );
            promises.push( queryPromise );
            queryPromise.done( function( data ) {
                if ( !data.query ) {
                    onError( data );
                }

                var cuCount = data.query.checkuserlog.entries.length;
                stats.push( {
                    name: username,
                    count: cuCount
                } );
                totalCount += cuCount;

            } ).fail( function( data ) {
                onError( data );
            } );

            function onError( data ) {
                $status.text( 'Erro ao consultar.' );
                throw 'Erro ao consultar ' + mw.html.escape( username ) + ' detalhes: ' + JSON.stringify( data );
            }

        } );

        $.when.apply( $, promises ).done( function() {
            // Mostrar tabela assim que houver todos os dados necessários
            $status.text('Estatísticas mensais sempre relativas ao mês anterior (nesse momento, '+previousMonth+' '+previousYear+'). Lembre-se que verificações realizadas por stewards ou staff não são contabilizadas nesta página e precisam ser aferidas manualmente. Total de verificações efetuadas: '+totalCount+'.');
            appendToPage( getStatsTable( stats ) );
            mw.loader.using( 'jquery.tablesorter', function() {
                $( 'table' ).tablesorter();
            } );
        });

	} );
}

    if (config.wgNamespaceNumber == -1 &&
        config.wgTitle.toLowerCase() == "checkuserstats"
    ) {
		var bodyContent = (config.skin == "cologneblue" ? "article" : "bodyContent");
        document.getElementsByTagName("h1")[0].textContent = "Checkuser log stats";
        document.title = "Checkuser log stats";
        init();
    }