* Implementation for mediaWiki.user
*/
-(function( $ ) {
+( function ( mw, $ ) {
/**
* User object
*/
function User( options, tokens ) {
+ var user, callbacks;
/* Private Members */
- var that = this;
- var api = new mw.Api();
- var groupsDeferred;
- var rightsDeferred;
+ user = this;
+ callbacks = {};
+
+ /**
+ * Gets the current user's groups or rights.
+ * @param {String} info: One of 'groups' or 'rights'.
+ * @param {Function} callback
+ */
+ function getUserInfo( info, callback ) {
+ var api;
+ if ( callbacks[info] ) {
+ callbacks[info].add( callback );
+ return;
+ }
+ callbacks.rights = $.Callbacks('once memory');
+ callbacks.groups = $.Callbacks('once memory');
+ callbacks[info].add( callback );
+ api = new mw.Api();
+ api.get( {
+ action: 'query',
+ meta: 'userinfo',
+ uiprop: 'rights|groups'
+ } ).always( function ( data ) {
+ var rights, groups;
+ if ( data.query && data.query.userinfo ) {
+ rights = data.query.userinfo.rights;
+ groups = data.query.userinfo.groups;
+ }
+ callbacks.rights.fire( rights || [] );
+ callbacks.groups.fire( groups || [] );
+ } );
+ }
/* Public Members */
* @return String: Random set of 32 alpha-numeric characters
*/
function generateId() {
- var id = '';
- var seed = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
- for ( var i = 0, r; i < 32; i++ ) {
+ var i, r,
+ id = '',
+ seed = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
+ for ( i = 0; i < 32; i++ ) {
r = Math.floor( Math.random() * seed.length );
id += seed.substring( r, r + 1 );
}
* @return Boolean
*/
this.isAnon = function () {
- return that.getName() === null;
+ return user.getName() === null;
};
/**
* @deprecated since 1.20 use mw.user.isAnon() instead
*/
this.anonymous = function () {
- return that.isAnon();
+ return user.isAnon();
};
/**
*/
this.sessionId = function () {
var sessionId = $.cookie( 'mediaWiki.user.sessionId' );
- if ( typeof sessionId == 'undefined' || sessionId === null ) {
+ if ( typeof sessionId === 'undefined' || sessionId === null ) {
sessionId = generateId();
$.cookie( 'mediaWiki.user.sessionId', sessionId, { 'expires': null, 'path': '/' } );
}
* @return String: User name or random session ID
*/
this.id = function() {
- var name = that.getName();
+ var id,
+ name = user.getName();
if ( name ) {
return name;
}
- var id = $.cookie( 'mediaWiki.user.id' );
- if ( typeof id == 'undefined' || id === null ) {
+ id = $.cookie( 'mediaWiki.user.id' );
+ if ( typeof id === 'undefined' || id === null ) {
id = generateId();
}
// Set cookie if not set, or renew it if already set
- $.cookie( 'mediaWiki.user.id', id, { 'expires': 365, 'path': '/' } );
+ $.cookie( 'mediaWiki.user.id', id, {
+ expires: 365,
+ path: '/'
+ } );
return id;
};
* 'expires': 7
* } );
*/
- this.bucket = function( key, options ) {
+ this.bucket = function ( key, options ) {
+ var cookie, parts, version, bucket,
+ range, k, rand, total;
+
options = $.extend( {
- 'buckets': {},
- 'version': 0,
- 'tracked': false,
- 'expires': 30
+ buckets: {},
+ version: 0,
+ tracked: false,
+ expires: 30
}, options || {} );
- var cookie = $.cookie( 'mediaWiki.user.bucket:' + key );
- var bucket = null;
- var version = 0;
+
+ cookie = $.cookie( 'mediaWiki.user.bucket:' + key );
+
// Bucket information is stored as 2 integers, together as version:bucket like: "1:2"
if ( typeof cookie === 'string' && cookie.length > 2 && cookie.indexOf( ':' ) > 0 ) {
- var parts = cookie.split( ':' );
- if ( parts.length > 1 && parts[0] == options.version ) {
+ parts = cookie.split( ':' );
+ if ( parts.length > 1 && Number( parts[0] ) === options.version ) {
version = Number( parts[0] );
bucket = String( parts[1] );
}
}
- if ( bucket === null ) {
+ if ( bucket === undefined ) {
if ( !$.isPlainObject( options.buckets ) ) {
throw 'Invalid buckets error. Object expected for options.buckets.';
}
version = Number( options.version );
// Find range
- var range = 0, k;
+ range = 0;
for ( k in options.buckets ) {
range += options.buckets[k];
}
// Select random value within range
- var rand = Math.random() * range;
+ rand = Math.random() * range;
// Determine which bucket the value landed in
- var total = 0;
+ total = 0;
for ( k in options.buckets ) {
bucket = k;
total += options.buckets[k];
}
}
if ( options.tracked ) {
- mw.loader.using( 'jquery.clickTracking', function() {
+ mw.loader.using( 'jquery.clickTracking', function () {
$.trackAction(
'mediaWiki.user.bucket:' + key + '@' + version + ':' + bucket
);
* Gets the current user's groups.
*/
this.getGroups = function ( callback ) {
- if ( groupsDeferred ) {
- groupsDeferred.always( callback );
- return;
- }
-
- groupsDeferred = $.Deferred();
- groupsDeferred.always( callback );
- api.get( {
- action: 'query',
- meta: 'userinfo',
- uiprop: 'groups'
- } ).done( function ( data ) {
- if ( data.query && data.query.userinfo && data.query.userinfo.groups ) {
- groupsDeferred.resolve( data.query.userinfo.groups );
- } else {
- groupsDeferred.reject( [] );
- }
- } ).fail( function ( data ) {
- groupsDeferred.reject( [] );
- } );
+ getUserInfo( 'groups', callback );
};
/**
* Gets the current user's rights.
*/
this.getRights = function ( callback ) {
- if ( rightsDeferred ) {
- rightsDeferred.always( callback );
- return;
- }
-
- rightsDeferred = $.Deferred();
- rightsDeferred.always( callback );
- api.get( {
- action: 'query',
- meta: 'userinfo',
- uiprop: 'rights'
- } ).done( function ( data ) {
- if ( data.query && data.query.userinfo && data.query.userinfo.rights ) {
- rightsDeferred.resolve( data.query.userinfo.rights );
- } else {
- rightsDeferred.reject( [] );
- }
- } ).fail( function ( data ) {
- rightsDeferred.reject( [] );
- } );
+ getUserInfo( 'rights', callback );
};
}
// This is kind of ugly but we're stuck with this for b/c reasons
mw.user = new User( mw.user.options, mw.user.tokens );
-})(jQuery);
+}( mediaWiki, jQuery ) );