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.
/* Sysop decrier/detector (rights group displayer), version [0.2.1]
Originally from http://en.wikipedia.org/wiki/User:Splarka/sysopdectector.js

Notes:
* Fixed this up to use the new API fun stuffs.
* Shows all groups now
* nstab-user isn't available in all skins, all skins have at least one h1 or h2 I believe.
* heading given class="detected-userrights-heading" and text in span class="detected-userrights"

Options:
* Now supports an option system.
* By setting a datalet true it shows in the header instead of the title.
* Note, all are assumed false if omitted. All but 'groups' are assumed false if undefined.
var showUserGroupSettings = {
  'IP':true,
  'unregistered':true,
  'registered':true,
  'groups': true,
  'editcount':true,
  'regdate':true,
  'blocked':true
};
*/
function showUserGroups() {
  var url = mw.config.get( 'wgServer' ) + mw.config.get( 'wgScriptPath' ) + '/api.php?action=query&format=json&callback=showUserGroupsCB&maxage=3600&smaxage=3600&usprop=blockinfo|groups|editcount|registration&list=users&ususers=' + encodeURIComponent( mw.config.get( 'wgTitle' ) );
  mw.loader.load( url );
}

function showUserGroupsCB(obj) {
  var show = window.showUserGroupSettings || false;
  var user = obj.query && obj.query.users;
  if(!user || !user[0]) return;
  user = user[0];
  var someHeading = document.getElementsByTagName('h1')[0] || document.getElementsByTagName('h2')[0];
  if(!someHeading) return;

  var span = document.createElement('span');
  var title = 'User:' + user.name + ' ';
  var text = ' ';

  if(user.invalid === '') {
    if(show && show.IP) text += '[IP] ';
    else title += '[invalid or IP username] ';
  } else if(user.missing === '') {
    if(show && show.unregistered) text += '[doesn\'t exist] ';
    else title += '[not a registered name] ';
  } else {
    if(show && show.registered) text += '[exists] ';
    else title += '[username registered] ';
    if(user.groups) {
      if(show && show.groups || !show) text += '[' + user.groups + '] ';
      else title += '[' + user.groups + '] ';
    }
    if(user.editcount) {
      if(show && show.editcount) text += '[' + user.editcount + ' edits] ';
      else title += '[' + user.editcount + ' edits] ';
    }
    if(user.registration) {
      if(show && show.regdate) text += '[created: ' + user.registration.split('T')[0] + '] ';
      else title += '[created: ' + user.registration + '] ';
    }
    if(user.blockedby) {
      if(show && show.blocked) text += '[blocked] ';
      else text += '[currently blocked] ';
    }
  }

  span.setAttribute('class', 'detected-userrights');
  span.appendChild(document.createTextNode(text));
  someHeading.appendChild(span);
  someHeading.setAttribute('title', title);
  someHeading.className += ' detected-userrights-heading';
}

if ( ( mw.config.get( 'wgNamespaceNumber' ) === 2 || mw.config.get( 'wgNamespaceNumber') === 3 ) &&
	mw.config.get( 'wgTitle' ).indexOf( '/' ) === -1 &&
	( mw.config.get( 'wgAction' ) !== 'edit' || mw.config.get( 'wgAction' ) !== 'submit' ) ) {
		$( showUserGroups );
}