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();