Jump to content

User:Opencooper/collapseBots.js

From Wikipedia, the free encyclopedia
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.
Note: After saving, you have to bypass your browser's cache to see the changes. Google Chrome, Firefox, Microsoft Edge and Safari: Hold down the ⇧ Shift key and click the Reload toolbar button. For details and instructions about other browsers, see Wikipedia:Bypass your cache.
// 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("<div class='mw-collapsible-content'></div>");
	
	// Recompute since we just wrapped all the siblings
	siblings = $(header).next(".mw-collapsible-content");
	var section = $().add(header).add(siblings);
	$(section).wrapAll("<div class='collapseBots mw-collapsed'></div>");
	$(section).parent().makeCollapsible();
}

setup();