User:Ahechtbot/wikiprojects.js

console.log("Wikiprojects.js run started at " + new Date);

//Set up parameters try { var credentials = require('./credentials.js').credentials.enwiki; } catch { console.error("Credentials file not found!"); return; } finally { if (!credentials) { console.error("Credentials not found in credentials file!"); return; } }

var templateList = "Wikipedia:WikiProject Articles for creation/WikiProject templates.json"; var configFile = "Wikipedia:WikiProject Articles for creation/WikiProject templates.json/config.json";

//Define globals require('jsdom-global')(undefined, {"url": credentials.wikiUrl}); require('mock-mediawiki'); var configObject, wikiProjectCategories, wikiprojects = {}; var apiUrl = credentials.wikiUrl+mw.util.wikiScript('api'); var api = new mw.Api({ ajax: { url: apiUrl} });

//Log in api.login( credentials.username, credentials.password ) .done (function (data) {		console.log("Logged in as "+data.login.lgusername);		configObject = fetchJSONList(configFile);		wikiProjectCategories = [configObject["WikiProject main category"]]			.concat(configObject["Other WikiProject template categories not included in 'WikiProject main category'"]);		getTemplateCategories;	} ).fail (function(error) {		console.error("Error logging in:");		console.error(error);		return;	} );

function fetchJSONList(listName) { var parsedList = {}; //console.log("Attempting to fetch " + listName + "..."); var listData = JSON.parse($.ajax({ url: apiUrl, async:false, error: function (jsondata) { console.warn("Unable to fetch contents of " + listName + ":"); console.log(jsondata); return {}; }, data: {action:'parse', format:'json', prop:'wikitext', page: listName, formatversion: '2', origin: '*' } }).responseText).parse; //console.log("Attempting to parse " + listName + "..."); if (listData && listData.wikitext) { try { parsedList = JSON.parse(listData.wikitext); console.log("Successfully parsed " + listName); } catch (jsonerror) { console.warn("Error parsing JSON list " + listName + ":"); console.log(jsonerror); }	}

return parsedList; }

function getTemplateCategories(cont) { // Recursively call API var query = { action: "query", list: "categorymembers", cmtitle: configObject["WikiProject main category"], cmtype: "subcat", cmlimit: "max", origin: '*' };	if (cont) { query = Object.assign(query, cont); }	//console.log("Fetching subcategories of " + query.cmtitle + "..."); api.get( query ) .done (function (data) {			if (data && data.query && data.query.categorymembers) { //API query returned members				Object.entries(data.query.categorymembers).forEach( function(item) { wikiProjectCategories.push(item[1].title); } );			}			if (data && data.continue) { //More results are available				getTemplateCategories(data.continue);			} else {				console.log("Fetching contents of: " + wikiProjectCategories .map(function (e) { return e.toString.replace(/(Category:|WikiProject |banner wrapper )/ig, ""); }) .join(", ") );				getTemplatesFromCategories;			}		} ).fail (function(error) {			console.warn("Error getting list of categories:");			console.log(error);		} ); return; }

function getTemplatesFromCategories(catTitle, cont) { // Recursively call API if (typeof catTitle === 'undefined') { // Grab next item in wikiProjectCategories catTitle = wikiProjectCategories.pop; }	if (typeof catTitle === 'undefined') { // No remaining entries in wikiProjectCategories // Manually add Wikiprojects with /s in their title jQuery.extend( wikiprojects, configObject.includelist ); writeList; } else { var query = { action: "query", list: "categorymembers", cmtitle: catTitle, cmtype: "page", cmnamespace: "10", cmlimit: "max", origin: '*' };		//console.log("Fetching contents of " + query.cmtitle + "..."); if (cont) { query = Object.assign(query, cont); }		api.get( query ) .done (function (data) {				if (data && data.query && data.query.categorymembers) { //API query returned members					Object.entries(data.query.categorymembers).forEach( function(item) { var title = item[1].title.match(/^Template:WikiProject\s(.*)$/); if ( (title && title[1] && title[1] !== "") && ( title[1].indexOf("/") == -1 || title[1].match(/ task ?force$/i) ) ) { //Valid page name format title[1] = title[1].replace(/ task ?force$/i,""); if( !(configObject.blocklist[ title[1] ]) ) { //Not on blocklist wikiprojects[ title[1] ] = item[1].title.replace("Template:", ""); }						}					} );				}				if (data && data.continue) { //More results are available					getTemplatesFromCategories(catTitle, data.continue);				} else {					getTemplatesFromCategories;				}			} ).fail (function(error) {				console.warn("Error getting list of templates:");				console.log(error);			} ); return; } }

function writeList { wikiprojects = Object.keys(wikiprojects).sort.reduce(		(obj, key) => { 			obj[key] = wikiprojects[key]; 			return obj;		}, 		{}	); //console.log("Length of list: " + Object.keys(wikiprojects).length); //console.log(wikiprojects); var params = { action: 'edit', title: templateList, text: JSON.stringify(wikiprojects), summary: "Update WikiProject list", watchlist:"unwatch", bot: 'true' };	//console.log("Writing to " + params.title + "..."); api.postWithToken("csrf", params ).done( function(reslt) {		console.log(templateList + " updated.");		//console.log(reslt);	} ).fail( function(reslt) {		console.warn("Error updating " + templateList + ":");		console.log(reslt);	} ); }