Note: After publishing, you may have to bypass your browser's cache to see the changes.
- Firefox / Safari: Hold Shift while clicking Reload, or press either Ctrl-F5 or Ctrl-R (⌘-R on a Mac)
- Google Chrome: Press Ctrl-Shift-R (⌘-Shift-R on a Mac)
- Internet Explorer / Edge: Hold Ctrl while clicking Refresh, or press Ctrl-F5
- Opera: Press Ctrl-F5.
/**
* @name UserBadge
* @author 机智的小鱼君
*
* @description Add user group badge after user links
*/
;(function ($) {
// Only registered users
if ($('.mw-userlink:not(.mw-anonuserlink)').length < 1) return
// Adjust global variables
window.dev = window.dev || []
window.dev.userBadge = window.dev.userBadge || {}
if (typeof window.dev.userBadge !== 'object') window.dev.userBadge = {}
/** @type {{ name: string; groups: string[]; missing?: true; invalid?: true }[]} */
var USERS_CACHE = []
/** @type {Record<string, string>} */
var BADGES_DEFAULTS = {
// local
sysop:
'https://vignette.wikia.nocookie.net/central/images/1/12/Badge-Admin.svg',
'content-moderator':
'https://vignette.wikia.nocookie.net/central/images/e/ef/Badge-ContentModerator.svg',
threadmoderator:
'https://vignette.wikia.nocookie.net/central/images/5/50/Badge-DiscussionsModerator.svg',
// global
staff:
'https://vignette.wikia.nocookie.net/central/images/0/06/Badge-Staff.svg',
'wiki-specialist':
'https://vignette.wikia.nocookie.net/central/images/0/06/Badge-Staff.svg',
soap: 'https://vignette.wikia.nocookie.net/central/images/9/9a/Badge-SOAP.svg',
'global-discussions-moderator':
'https://vignette.wikia.nocookie.net/central/images/4/40/Badge-GlobalDiscussionsModerator.svg',
}
/** @type {string[]} */
var DISABLED_USERS = window.dev.userBadge.disabledUsers || []
if (typeof DISABLED_USERS === 'string') {
DISABLED_USERS = DISABLED_USERS.split('|')
}
/** @type {string[]} */
var DISABLED_GROUPS = window.dev.userBadge.disabledGroups || []
if (typeof DISABLED_USERS === 'string') {
DISABLED_GROUPS = DISABLED_GROUPS.split('|')
}
/** @type {Record<string, string>} */
var CUSTOM_BADGES = window.dev.userBadge.customBadges || {}
if (typeof CUSTOM_BADGES !== 'object') {
CUSTOM_BADGES = {}
}
var BADGES_LIST = Object.assign({}, BADGES_DEFAULTS, CUSTOM_BADGES)
// Get all registered users
var _userNames = []
$('.mw-userlink:not(.mw-anonuserlink)').each(function (_, el) {
var $this = $(el)
var userName = $this.text().trim()
_userNames.push(userName)
})
USERS_CACHE = Array.from(new Set(_userNames)).map(function (name) {
return {
name: name,
groups: [],
}
})
mw.loader.using(['mediawiki.api', 'mediawiki.Title'], function () {
// Get user groups
new mw.Api().get({
action: 'query',
list: 'users',
ususers: USERS_CACHE.map(function (i) {
return i.name
}),
usprop: 'groups',
format: 'json',
formatversion: 2,
})
.then(function (data) {
USERS_CACHE = data.query.users
USERS_CACHE.filter(function (item) {
return !item.missing && !item.invalid
}).forEach(function (item) {
// Variables
var name = item.name
var groups = item.groups
// Get localized FULLPAGENAME for user
// "Foo bar" becomes "User:Foo bar" (English wikis)
// "Foo bar" becomes "ユーザー:Foo bar" (Japanese wikis)
var fullpagename = new mw.Title(name, 2).getPrefixedText()
var $userLink = $('.mw-userlink[title="' + fullpagename + '"]')
// Add group classes
$userLink.addClass(
groups.map(function (group) {
return 'group-' + group
})
)
// Disabled user
if (DISABLED_USERS.includes(name)) {
return $userLink.addClass('badge-disabled-user')
}
item.groups.forEach(function (group) {
var src = BADGES_LIST[group]
// Has group badge?
if (!src) return
// Disabled group
if (DISABLED_GROUPS.includes(group)) {
return $userLink.addClass('badge-disabled-group-' + group)
}
$userLink.append(function () {
// Already has badge
if ($(this).find('.user-badge.group-' + group).length > 0) return
return $('<img>', {
class: 'user-badge group-' + group,
src: src,
}).css({
width: '1em',
height: '1em',
})
})
})
})
})
})
})(window.jQuery)