User:Opencooper/collapseBots.js

// Automatically collapse talk page sections from bots // License: CC0

function setup { // If we're not reading a talk page, do nothing if (!(mw.config.get('wgAction') === 'view' && mw.config.get('wgIsArticle') && !location.search.split('oldid=')[1] // Old revision && mw.config.get('wgNamespaceNumber') % 2 == 1)) { // talk namespaces have odd numbers return; }   mw.loader.using("jquery.makeCollapsible", function {    	var userMappings = {};    	$(".mw-heading2").each(function { extractUsers(this, userMappings); });   	checkBotStatus(userMappings);    }); }

function extractUsers(header, userMappings) { var talkNodes = $(header).nextUntil(".mw-heading2"); var lastSignature = $(talkNodes).find("a[href^='/wiki/User:']").last; if (lastSignature.length) { var username = lastSignature.text; // Map each user with their sections if (!(username in userMappings)) { userMappings[username] = [header]; } else { userMappings[username].push(header); }	} }

function checkBotStatus(userMappings) { var userList = Object.keys(userMappings); // API docs: https://www.mediawiki.org/wiki/API:Users $.ajax({       url: "https://en.wikipedia.org/w/api.php",        data: {            action: "query",            list: "users",            format: "json",            ususers: userList.join("|"),            usprop: "groups"        },        success: function(response) {        	var botList = [];        	var responseList = response.query.users;        	for (var r of responseList) {        		if (r.groups && r.groups.includes("bot")) {        			botList.push(r.name);        	    }        	}        	filterUsers(userMappings, botList);        }    }); }

// Look for the bots in our mappings // More convoluted than necessary because API returns usernames in its // own case, while we use them as keys function filterUsers(userMappings, botList) { var headers = []; for (var bot of botList) { for (var user in userMappings) { if (bot.toLowerCase == user.toLowerCase) { headers = headers.concat(userMappings[user]); }       }    }    for (var h of headers) { collapseSection(h); } }

// In-house method: https://www.mediawiki.org/wiki/Manual:Collapsible_elements function collapseSection(header) { var siblings = $(header).nextUntil(".mw-heading2, .collapseBots"); $(siblings).wrapAll(" "); // Recompute since we just wrapped all the siblings siblings = $(header).next(".mw-collapsible-content"); var section = $.add(header).add(siblings); $(section).wrapAll(" "); $(section).parent.makeCollapsible; }

setup;