User:Bugghost/Scripts/UserRoleIndicator.js: Difference between revisions

Content deleted Content added
looking good, just cleaning up now
adding ๐Ÿ•ต๏ธ for check users
ย 
(13 intermediate revisions by the same user not shown)
Line 1:
// [[User:Bugghost]]
// <nowiki>
// Copied and edited from novemNovem linguaeLinguae's user highlighter simple: [[User:Novem_Linguae/Scripts/UserHighlighterSimple.js]]
 
class UserRoleIndicator {
Line 14 โŸถ 13:
this.mw = mw;
this.window = window;
this.linksChecked = new Set([]);
}
}
 
async execute() {
//console.time("uri");
await this.getUsernames();
const defaultRoleInfoLookup = {
if ( !this.window.userHighlighterSimpleNoColors ) {
wmf: ['๐ŸŒ', 'Wikimedia Foundation (WMF)'],
this.setCss();
bot: ['๐Ÿค–', 'Bot'],
stewards: ['๐Ÿฉบ', 'Steward or Ombud'],
arbcom: ['โš–๏ธ', 'Arbitration Committee member'],
bureaucrats: ['๐Ÿ’ผ', 'Bureaucrat'],
checkUsers: ['๐Ÿ•ต๏ธ๏ธ๏ธ๏ธ', 'Check User'],
admins: ['๐Ÿงน', 'Admin'],
formerAdmins: ['๐Ÿšฌ', 'Former Admin'],
newPageReviewers: ['๐Ÿงบ', 'New page reviewer'],
tenThousandEdits: ['๐Ÿ“š', 'More than 10,000 edits'],
extendedConfirmed: ['๐Ÿ“˜', 'Extended confirmed'],
lessThan500: ['๐Ÿฃ', 'Less than 500 edits'],
};
 
if(this.window.UserRoleIndicatorCustomLabels){
this.roleInfoLookup = { ...defaultRoleInfoLookup, ...window.UserRoleIndicatorCustomLabels };
}else{
this.roleInfoLookup = defaultRoleInfoLookup;
}
 
this.labelPosition = "after";
if(this.window.UserRoleIndicatorCustomPlacement){
this.labelPosition = this.window.UserRoleIndicatorCustomPlacement;
}
 
//console.time("get usernames")
await this.getUsernames();
//console.timeEnd("get usernames")
this.addCSS('user-role-indicator', 'font-size: smaller; display: inline; background: #b7b9ff55; padding: 0.1em; border-radius: 5px;')
this.addCSS('label-after', 'margin-left:3px;');
this.addCSS('label-before', 'margin-right:1px;margin-left:2px;');
 
const $links = this.$( '#article a, #bodyContent a, #mw_contentholder a' );
 
//console.time("linkloop")
$links.each( ( index, element ) => {
this.$link = this.$( element );
if(this.linksChecked.has(element)){
return;
}
 
this.linksChecked.add(element);
 
if ( !this.linksToAUser() ) {
return;
Line 33 โŸถ 72:
}
this.hasAdvancedPermissions = false;
this.addClassesAndHoverTextToLinkIfNeededaddRoleInfoIfNeeded();
// If the user has any advanced perms, they are likely to have a signature, so be aggressive about overriding the background and foreground color. That way there's no risk their signature is unreadable due to background color and foreground color being too similar. Don't do this for users without advanced perms... being able to see a redlinked username is useful.
if ( this.hasAdvancedPermissions ) {
this.$link.addClass( this.$link.attr( 'class' ) + ' UHS-override-signature-colors' );
}
} );
//console.timeEnd("linkloop")
 
//console.timeEnd("uri");
//console.log("-------");
}
 
Line 78 โŸถ 117:
 
async getUsernames() {
if(this.wmf){
return;
}
 
const dataString = await this.getWikitextFromCache( 'User:NovemBot/userlist.js' );
const dataJSON = JSON.parse( dataString );
Line 92 โŸถ 136:
// ...dataJSON['global-sysop'],
};
this.bot = dataJSON.bot;
this.stewards = dataJSON.steward;
this.arbcom = dataJSON.arbcom;
this.bureaucrats = dataJSON.bureaucrat;
this.admins = dataJSON.sysop;
this.formeradminscheckUsers = dataJSON.formeradmincheckuser;
this.formerAdmins = dataJSON.formeradmin;
this.newPageReviewers = dataJSON.patroller;
this.tenThousandEdits = dataJSON[ '10k' ];
this.extendedConfirmed = {
...dataJSON.extendedconfirmed,
...dataJSON.bot,
...dataJSON.productiveIPs
};
Line 228 โŸถ 273:
}
 
checkForPermissionaddRoleInfoIfAppropriate( listOfUsernames, classNamelabel, descriptionForHover ) {
if ( listOfUsernames[ this.user ] === 1 ) {
this.addHoverIconaddRoleIcon( classNamelabel, descriptionForHover );
}
}
 
addHoverIconaddRoleIcon( icon, descriptionForHover ) {
 
const title = this.$link.attr( 'title' );
if ( !title || title.startsWith( 'User:' ) ) {
this.$link.attr( 'title', descriptionForHover );
 
this.$link.append($("<div class='user-role-indicator'>"+icon+"</div>"))
switch(this.labelPosition){
case "before":
this.$link.prepend($("<div class='user-role-indicator label-before'>"+icon+"</div>"))
break;
 
default:
// Defaults to "after"
this.$link.append($("<div class='user-role-indicator label-after'>"+icon+"</div>"))
break;
}
}
 
Line 245 โŸถ 300:
}
 
addRoleInfoIfNeeded() {
addClassesAndHoverTextToLinkIfNeeded() {
// highlight anybody with "WMF" in their name, case insensitive. this should not generate false positives because "WMF" is on the username blacklist. see https://meta.wikimedia.org/wiki/Title_blacklist
if ( this.user.match( /^[^/]*WMF/i ) ) {
this.addRoleIcon( this.roleInfoLookup.wmf[0], this.roleInfoLookup.wmf[1] );
this.addHoverIcon( '๐ŸŒ', 'Wikimedia Foundation (WMF)' );
}
 
// TODO: grab the order from an array, so I can keep checkForPermission and addCSS in the same order easily, lowering the risk of the HTML title="" being one thing, and the color being another
this.checkForPermissionaddRoleInfoIfAppropriate( this.wmf, '๐ŸŒ'this.roleInfoLookup.wmf[0], 'Wikimedia Foundation (WMF)' this.roleInfoLookup.wmf[1]);
this.addRoleInfoIfAppropriate( this.bot, this.roleInfoLookup.bot[0], this.roleInfoLookup.bot[1]);
this.checkForPermission( this.stewards, 'โš’', 'Steward or Ombud' );
this.addRoleInfoIfAppropriate( this.stewards, this.roleInfoLookup.stewards[0], this.roleInfoLookup.stewards[1]);
this.checkForPermission( this.arbcom, 'โš–๏ธ', 'Arbitration Committee member' );
this.addRoleInfoIfAppropriate( this.arbcom, this.roleInfoLookup.arbcom[0], this.roleInfoLookup.arbcom[1]);
this.checkForPermission( this.bureaucrats, '๐Ÿ’ผโ€', 'Bureaucrat' );
this.addRoleInfoIfAppropriate( this.bureaucrats, this.roleInfoLookup.bureaucrats[0], this.roleInfoLookup.bureaucrats[1]);
this.checkForPermission( this.admins, '๐Ÿงน', 'Admin' );
this.addRoleInfoIfAppropriate( this.checkUsers, this.roleInfoLookup.checkUsers[0], this.roleInfoLookup.checkUsers[1]);
this.checkForPermission( this.formeradmins, '๐Ÿšฌ', 'Former Admin' );
this.addRoleInfoIfAppropriate( this.admins, this.roleInfoLookup.admins[0], this.roleInfoLookup.admins[1]);
this.checkForPermission( this.newPageReviewers, '๐Ÿงฝ', 'New page reviewer' );
this.addRoleInfoIfAppropriate( this.formerAdmins, this.roleInfoLookup.formerAdmins[0], this.roleInfoLookup.formerAdmins[1]);
this.checkForPermission( this.tenThousandEdits, '๐Ÿฅ‡', 'More than 10,000 edits' );
this.addRoleInfoIfAppropriate( this.newPageReviewers, this.roleInfoLookup.newPageReviewers[0], this.roleInfoLookup.newPageReviewers[1]);
this.checkForPermission( this.extendedConfirmed, 'โœ', 'Extended confirmed' );
this.addRoleInfoIfAppropriate( this.tenThousandEdits, this.roleInfoLookup.tenThousandEdits[0], this.roleInfoLookup.tenThousandEdits[1]);
this.addRoleInfoIfAppropriate( this.extendedConfirmed, this.roleInfoLookup.extendedConfirmed[0], this.roleInfoLookup.extendedConfirmed[1]);
 
// If they have no perms, then they are non-EC, so <500 edits
if ( !this.hasAdvancedPermissions ) {
this.addRoleIcon(this.roleInfoLookup.lessThan500[0], this.roleInfoLookup.lessThan500[1]);
this.addHoverIcon("๐Ÿฃ", "Less than 500 edits");
}
}
 
setCss() {
// this.addCSS('user-role-indicator-container', 'position: relative !important; display: inline;')
this.addCSS('user-role-indicator', 'font-size: smaller; display: inline; background: gainsboro; padding: 0.1em; border-radius: 5px; border: 1px black solid; margin-left: 3px;')
}
}
 
var userRoleIndicator = new UserRoleIndicator( $, mw, window )
 
// Fire after wiki content is added to the DOM, such as when first loading a page, or when a gadget such as the XTools gadget loads.
mw.hook( 'wikipage.content' ).add( async () => {
await mw.loader.using( [ 'mediawiki.util', 'mediawiki.Uri', 'mediawiki.Title' ], async () => {
await ( new UserRoleIndicator( $, mw, window ) )userRoleIndicator.execute();
} );
} );
Line 284 โŸถ 339:
mw.hook( 'postEdit' ).add( async () => {
await mw.loader.using( [ 'mediawiki.util', 'mediawiki.Uri', 'mediawiki.Title' ], async () => {
await ( new UserRoleIndicator( $, mw, window ) )userRoleIndicator.execute();
} );
} );