MediaWiki

Gadget-statistics.js

From Dogcraft Wiki

No edit summary
m (Replacing {{!!}} with {{!}}{{!}})
 
(21 intermediate revisions by 2 users not shown)
Line 1: Line 1:
/*
This gadget uses bits of code from https://www.mediawiki.org/wiki/API:Allusers
and https://www.mediawiki.org/wiki/API:Edit.
*/
$(document).ready(function() {
$(document).ready(function() {
/*function uecGetEditCount() {
var params2 = {
        action: 'query',
        format: 'json',
        list: 'allusers',
        aulimit: 10,
        auprop: 'editcount'
},
uecData = "";
//var api2 = new mw.Api();
    uecData += "ab";
   
    api.get( params2 ).done( function uecCallAPI ( data )
{
var users2 = data.query.allusers,
        u2;
       
    //if (uecMode == "table")
    //{
    for ( u2 in users2 ) {
        uecData += '{{!}}-\n{{!}}' + users2[u2].name + '{{!!}}' + users2[u2].editcount + '\n{{!}}-\n';
    }
    //}
    //else if (uecMode == "single")
    //{
    // for ( u in users ) {
    //    uecData += '|users[u].name = users[u].editcount \n';
    // }
    //}
    //else if (uecMode == "raw")
    //{
    // for ( u in users ) {
    //    uecData += 'users[u].name  users[u].editcount\n';
    // }
    //}
   
});
return uecData;
/*  Creates the mediawiki api object  */
}*/
var api = new mw.Api();
 
function testAPIEdit() {
api = new mw.Api();
/*
* Sends an API request to get the usernames and editcounts of the first 200 accounts, and then
* and then combines these into forms usable by wiki templates. Then it takes all the different formats, and
* creates one template (using #switch) out of them.
*
* wec = wiki edit count
*/
function wecGetUserEditCounts() {
var params2 = {
/* Creates parameters for the api call */
var queryParams = {
         action: 'query',
         action: 'query',
         format: 'json',
         format: 'json',
         list: 'allusers',
         list: 'allusers', /* https://www.mediawiki.org/wiki/API:Allusers */
         aulimit: 200,
         aulimit: 5000,  
         auprop: 'editcount'
         auprop: 'editcount',
        auwitheditsonly: true
},
},
uecTableData = "",
/* Variablse to fill with the data from the api call */
uecSingleData = "",
wecTableData = ""/*,  
uecRawData = "";
wecSingleData = "",
wecRawData = ""*/;
api.get( params2 ).done( function ( uecdata )  
/* This is the actual api call */
api.get( queryParams ).done( function ( wecdata ) /* This is the function that uses the data from the api call */
{
{
var users = uecdata.query.allusers,
var users = wecdata.query.allusers,
         u;
         u;
       
       
        /* Fills the wecTableData variable with the usernames and editcounts, formated like the body of a wikitable */
         for ( u in users ) {
         for ( u in users ) {
         uecTableData += '{{!}}-\n{{!}}' + users[u].name + '{{!!}}' + users[u].editcount + '\n{{!}}-\n';
         wecTableData += '{{!}}-\n{{!}}' + users[u].name + '{{!}}{{!}}' + users[u].editcount + '\n{{!}}-\n';
     }
     }
    
    
     for ( u in users ) {
     /* Fills the wecSingleData variable with the usernames and editcounts, formated like the body of a #switch parser function */
         uecSingleData += '|' + users[u].name + ' = ' + users[u].editcount + '\n';
    /*for ( u in users ) {
     }
         wecSingleData += '|' + users[u].name + ' = ' + users[u].editcount + '\n';
     }*/
    
    
     for ( u in users ) {
     /* Fills the wecTableData variable with the usernames and editcounts, formated like plain wikitext, with the option to add
         uecRawData += '{{{rawRowFront}}}' + users[u].name + '{{{rawRowMid}}}' + users[u].editcount + '{{{rawRowBack}}}';
    * text (this can also be HTML tags like <li>) at the front, middle and end using template variables.
     }
    */
    /*for ( u in users ) {
         wecRawData += '{{{rawRowFront}}}' + users[u].name + '{{{rawRowMid}}}' + users[u].editcount + '{{{rawRowBack}}}';
     }*/
    
    
     var templateNoInclude = '<noinclude>{{Notice|title=Automated edit warning|message=This template is edited by an automated process via the EditCount gadget, manual edits may get overwritten. To modify the template code please head to [[MediaWiki:Gadget-sandbox.js]]. To modify the documentation appearing here, please head to [[Template:EditCountMain/doc]].}}{{' + 'EditCountMain/doc}}</noinclude>\n',
    /* Creates the variables that when combined, create the template page, and fills them up.
templateSection1 = '<includeonly>{{#switch: {{{mode|}}}\n|table = <div class=\"phonefullscreen uecTable2\">\n{{{!}} class=\"wikitable sortable\"\n!Username\n!Edit count\n',
    *  var: templateNoInclude    - Contains the template documentation, and a notice letting editors know that the template page should not be edited.
templateSection1data = uecTableData,
    *  var: templateSection1    - Contains the start of the #switch parser function, and the start of the "table" option with the head section of the table.
templateSection2 = '{{!}}}</div>\n|single = \n{{#switch: {{{username}}} \n',
    *  var: templateSection1data - Contains the "wecTableData" variable
templateSection2data = uecSingleData,
    *  var: templateSection2    - Contains the end of the table, and the start of the "single" option, with the start of its own #switch parser function.
templateSection3 = '|There is no data on this user\n}}\n|raw =\n',
    *  var: templateSection2data - Contains the "wecSingleData" variable
templateSection3data = uecRawData,
    *  var: templateSection3    - Contains the end of the "single" option and its #switch parser, and the start of the "raw" option.
templateSectionEnd = '|That mode does not exist\n}}\n',
    *  var: templateSection3data - Contains the "wecRawData" variable
pagecontent = templateNoInclude + templateSection1 + templateSection1data + templateSection2 + templateSection2data + templateSection3 + templateSection3data + templateSectionEnd;
    *  var: templateSectionEnd  - Contains the fallback value for the inital #switch parser function, and then closes it.
    *  var: pagecontent          - Combines the above variables to create the text of a template page
    */
     var templateNoInclude = '<noinclude>{{Notice|title=Automated edit warning|message=This template is edited by an automated process via the EditCount gadget, manual edits may get overwritten. To modify the template code please head to [[MediaWiki:Gadget-sandbox.js]]. To modify the documentation appearing here, please head to [[Template:EditCountMain/doc]].}}{{' + 'documentation}}</noinclude>\n',
templateSection1 = '<onlyinclude>' + /*{{#switch: {{{mode|}}}\n|table = */ '<div class={{{tableBoxClass}}} style={{{tableBoxStyle}}}>\n{{{!}} class=\"wikitable sortable\"\n!Username\n!Edit count\n',
templateSection1data = wecTableData,
templateSection2 = '{{!}}}</div>}}</onlyinclude>'/*\n|single = \n{{#switch: {{{username}}} \n',
templateSection2data = wecSingleData,
templateSection3 = '|There is no editcount found for this user\n}}\n|raw =\n',
templateSection3data = wecRawData,
templateSectionEnd = '|That mode does not exist\n}}\n'*/,
pagecontent = templateNoInclude + templateSection1 + templateSection1data + templateSection2 /*+ templateSection2data + templateSection3 + templateSection3data + templateSectionEnd*/;
/* Calls the "wecUpdateTemplatePage" function with the "pagecontet" variable that was assembled above.
* This is what adds the content to a Template page.
*/
wecUpdateTemplatePage(pagecontent, 'Template:EditCountMain', false);
wecGetWikiStatistics();
var params = {
       
});
}
 
/*
* Takes a variable as an input, and replaces the content of a specified page with it.
*/
function wecUpdateTemplatePage(content, title, appendtext) {
/* Creates paramters for the edit api call.
* The edit api call edits the template page, replacing the previous page content with the "content" variable.
* The edit will appear in page history as performed by the account that calls the function.
*/
var editParams = {};
if (appendtext === true)
{
editParams = {
action: 'edit',
action: 'edit',
format: 'json',
format: 'json',
title: 'Template:EditCountMain',
title: title, /* Title of the template page that gets replaced with new content */
text: pagecontent,
appendtext: content,
summary: 'Edit added with the API',
summary: 'Edit added with the API' /* Description of the edit that appears in the page history */
bot : 1,
//bot : true /* Tags the edit as a bot edit, which should hide it from the default Recent Changes page (does not work) */
};
}
else
{
editParams = {
action: 'edit',
format: 'json',
title: title, /* Title of the template page that gets replaced with new content */
text: content,  
summary: 'Edit added with the API' /* Description of the edit that appears in the page history */
//bot : true /* Tags the edit as a bot edit, which should hide it from the default Recent Changes page (does not work) */
};
};
}
api.postWithToken( 'csrf', params );
/* This is the api call that edits the page specified with "title" */
       
api.postWithToken( 'csrf', editParams );
});
}
function wecGetWikiStatistics() {
/* Creates paramters for the query api call.*/
var statsParams = {
action: 'query',
meta: 'siteinfo',
siprop: 'statistics',
format: 'json',
};
/* This is the api call that gets the statistics about the wiki */
api.get( statsParams ).done( function ( wikidata )
{
var usernumber = wikidata.query.statistics.users,
pagenumber = wikidata.query.statistics.pages,
articlenumber = wikidata.query.statistics.articles,
editnumber = wikidata.query.statistics.edits,
imagenumber = wikidata.query.statistics.images,
statdate = new Date();
statdate = statdate.toUTCString(),
statcontent = 'Users: ' + usernumber + ' Pages: ' + pagenumber + ' Articles: ' + articlenumber + ' Edits: ' + editnumber + ' Images: ' + imagenumber + ' Date: ' + statdate + '<br />';
wecUpdateTemplatePage(statcontent, 'Dogcraft_Wiki:Statistics/History', true);
});
}  
}
 


document.getElementById('gadgetSandboxButton').innerHTML = "<div id='gadgetSandboxButtoninner'><button type='button' style='background:blue;'>Press this to get editcounts</button></div>";
/*if (mw.config.get("wgPageName") === "Dogcraft_Wiki:Statistics")
document.getElementById('gadgetSandboxButton').onclick = function() {testAPIEdit()};
{
wecGetUserEditCounts();
}*/
/* Creates the updat button. (Button is only visable to people with this gadget enabled, aka admins.)
* Line 1: Creates the button (the wiki by defualt does not allow the <button> html tag, so it has to be created from here)
* Line 2: Adds the function "wecGetUserEditCounts()" to be executed when the button is clicked
*/
var wecUpdateButton = document.getElementById("wecUpdateButton");
if (wecUpdateButton !== null) {
wecUpdateButton.innerHTML = "<div id='wecUpdateButtonBox'><button type='button' class='wecUpdateButton' style='background:blue;'>Press this to update the data on the Template:EditCountMain page</button></div>";
wecUpdateButton.onclick = function() {wecGetUserEditCounts()};
}
});
});

Latest revision as of 00:24, 4 December 2023

/*
	This gadget uses bits of code from https://www.mediawiki.org/wiki/API:Allusers 
	and https://www.mediawiki.org/wiki/API:Edit.
*/


$(document).ready(function() {
	
	/*  Creates the mediawiki api object  */
	var api = new mw.Api();
	
/*
 * Sends an API request to get the usernames and editcounts of the first 200 accounts, and then
 * and then combines these into forms usable by wiki templates. Then it takes all the different formats, and
 * creates one template (using #switch) out of them.
 * 
 * wec = wiki edit count
 */
function wecGetUserEditCounts() {
	
	/* Creates parameters for the api call */
	var queryParams = {
        action: 'query',
        format: 'json',
        list: 'allusers', /* https://www.mediawiki.org/wiki/API:Allusers */
        aulimit: 5000, 
        auprop: 'editcount',
        auwitheditsonly: true
	},
	/* Variablse to fill with the data from the api call */
	wecTableData = ""/*, 
	wecSingleData = "",
	wecRawData = ""*/;
	
	/* This is the actual api call */
	api.get( queryParams ).done( function ( wecdata ) /* This is the function that uses the data from the api call */
	{
		var users = wecdata.query.allusers,
        	u;
        
        /* Fills the wecTableData variable with the usernames and editcounts, formated like the body of a wikitable */	
        for ( u in users ) {
        	wecTableData += '{{!}}-\n{{!}}' + users[u].name + '{{!}}{{!}}' + users[u].editcount + '\n{{!}}-\n';
    	}
    	
    	/* Fills the wecSingleData variable with the usernames and editcounts, formated like the body of a #switch parser function */
    	/*for ( u in users ) {
        	wecSingleData += '|' + users[u].name + ' = ' + users[u].editcount + '\n';
    	}*/
    	
    	/* Fills the wecTableData variable with the usernames and editcounts, formated like plain wikitext, with the option to add
    	 * text (this can also be HTML tags like <li>) at the front, middle and end using template variables. 
    	 */
    	/*for ( u in users ) {
        	wecRawData += '{{{rawRowFront}}}' + users[u].name + '{{{rawRowMid}}}' + users[u].editcount + '{{{rawRowBack}}}';
    	}*/
    	
    	/* Creates the variables that when combined, create the template page, and fills them up. 
    	 *  var: templateNoInclude    - Contains the template documentation, and a notice letting editors know that the template page should not be edited.
    	 *  var: templateSection1     - Contains the start of the #switch parser function, and the start of the "table" option with the head section of the table.
    	 *  var: templateSection1data - Contains the "wecTableData" variable
    	 *  var: templateSection2     - Contains the end of the table, and the start of the "single" option, with the start of its own #switch parser function.
    	 *  var: templateSection2data - Contains the "wecSingleData" variable
    	 *  var: templateSection3     - Contains the end of the "single" option and its #switch parser, and the start of the "raw" option.
    	 *  var: templateSection3data - Contains the "wecRawData" variable
    	 *  var: templateSectionEnd   - Contains the fallback value for the inital #switch parser function, and then closes it.
    	 *  var: pagecontent          - Combines the above variables to create the text of a template page
    	 */
    	var templateNoInclude = '<noinclude>{{Notice|title=Automated edit warning|message=This template is edited by an automated process via the EditCount gadget, manual edits may get overwritten. To modify the template code please head to [[MediaWiki:Gadget-sandbox.js]]. To modify the documentation appearing here, please head to [[Template:EditCountMain/doc]].}}{{' + 'documentation}}</noinclude>\n',
			templateSection1 = '<onlyinclude>' + /*{{#switch: {{{mode|}}}\n|table = */ '<div class={{{tableBoxClass}}} style={{{tableBoxStyle}}}>\n{{{!}} class=\"wikitable sortable\"\n!Username\n!Edit count\n',
			templateSection1data = wecTableData,
			templateSection2 = '{{!}}}</div>}}</onlyinclude>'/*\n|single = \n{{#switch: {{{username}}} \n',
			templateSection2data = wecSingleData,
			templateSection3 = '|There is no editcount found for this user\n}}\n|raw =\n',
			templateSection3data = wecRawData,
			templateSectionEnd = '|That mode does not exist\n}}\n'*/,
			pagecontent = templateNoInclude + templateSection1 + templateSection1data + templateSection2 /*+ templateSection2data + templateSection3 + templateSection3data + templateSectionEnd*/;
		
		/* Calls the "wecUpdateTemplatePage" function with the "pagecontet" variable that was assembled above.
		 * This is what adds the content to a Template page.
		 */
		wecUpdateTemplatePage(pagecontent, 'Template:EditCountMain', false);
		wecGetWikiStatistics();
		
        	
	});
}

/* 
 * Takes a variable as an input, and replaces the content of a specified page with it.
 */
function wecUpdateTemplatePage(content, title, appendtext) {
	
	/* Creates paramters for the edit api call.
	 * The edit api call edits the template page, replacing the previous page content with the "content" variable.
	 * The edit will appear in page history as performed by the account that calls the function.
	 */
	var editParams = {};
	if (appendtext === true) 
	{
		editParams = {
			action: 'edit',
			format: 'json',
			title: title, /* Title of the template page that gets replaced with new content */
			appendtext: content, 
			summary: 'Edit added with the API' /* Description of the edit that appears in the page history */ 
			//bot : true /* Tags the edit as a bot edit, which should hide it from the default Recent Changes page (does not work) */
		};	
	}
	else 
	{
		editParams = {
			action: 'edit',
			format: 'json',
			title: title, /* Title of the template page that gets replaced with new content */
			text: content, 
			summary: 'Edit added with the API' /* Description of the edit that appears in the page history */ 
			//bot : true /* Tags the edit as a bot edit, which should hide it from the default Recent Changes page (does not work) */
		};
	}
	
	/* This is the api call that edits the page specified with "title" */
	api.postWithToken( 'csrf', editParams );
	
}

function wecGetWikiStatistics() {
	
	/* Creates paramters for the query api call.*/
	var statsParams = {
		action: 'query',
		meta: 'siteinfo',
		siprop: 'statistics',
		format: 'json',
	};
	
	/* This is the api call that gets the statistics about the wiki */
	api.get( statsParams ).done( function ( wikidata ) 
	{
		var usernumber = wikidata.query.statistics.users,
			pagenumber = wikidata.query.statistics.pages,
			articlenumber = wikidata.query.statistics.articles,
			editnumber = wikidata.query.statistics.edits,
			imagenumber = wikidata.query.statistics.images,
			statdate = new Date();
			statdate = statdate.toUTCString(),
			statcontent = 'Users: ' + usernumber + ' Pages: ' + pagenumber + ' Articles: ' + articlenumber + ' Edits: ' + editnumber + ' Images: ' + imagenumber + ' Date: ' + statdate + '<br />';
			
		wecUpdateTemplatePage(statcontent, 'Dogcraft_Wiki:Statistics/History', true);
		
	});
	
}


	/*if (mw.config.get("wgPageName") === "Dogcraft_Wiki:Statistics")
	{
		wecGetUserEditCounts();
	}*/
	
	/* Creates the updat button. (Button is only visable to people with this gadget enabled, aka admins.)
	 * Line 1: Creates the button (the wiki by defualt does not allow the <button> html tag, so it has to be created from here)
	 * Line 2: Adds the function "wecGetUserEditCounts()" to be executed when the button is clicked
	 */
	var wecUpdateButton = document.getElementById("wecUpdateButton");
	if (wecUpdateButton !== null) {
		wecUpdateButton.innerHTML = "<div id='wecUpdateButtonBox'><button type='button' class='wecUpdateButton' style='background:blue;'>Press this to update the data on the Template:EditCountMain page</button></div>";
		wecUpdateButton.onclick = function() {wecGetUserEditCounts()};
	}
});