| 
									
										
										
										
											2014-02-26 21:04:20 -05:00
										 |  |  | 'use strict'; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-09-19 15:54:13 -04:00
										 |  |  | var	async = require('async'), | 
					
						
							| 
									
										
										
										
											2013-09-17 15:38:50 -04:00
										 |  |  | 	nconf = require('nconf'), | 
					
						
							| 
									
										
										
										
											2013-11-30 13:13:18 -05:00
										 |  |  | 	gravatar = require('gravatar'), | 
					
						
							| 
									
										
										
										
											2013-12-01 16:21:19 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-01 10:52:50 -05:00
										 |  |  | 	plugins = require('./plugins'), | 
					
						
							| 
									
										
										
										
											2013-12-02 17:10:26 -05:00
										 |  |  | 	db = require('./database'), | 
					
						
							| 
									
										
										
										
											2013-11-18 16:22:43 -05:00
										 |  |  | 	meta = require('./meta'), | 
					
						
							| 
									
										
										
										
											2015-02-12 12:23:13 -05:00
										 |  |  | 	topics = require('./topics'), | 
					
						
							| 
									
										
										
										
											2013-12-02 19:40:11 -05:00
										 |  |  | 	groups = require('./groups'), | 
					
						
							| 
									
										
										
										
											2014-08-12 21:41:23 -04:00
										 |  |  | 	Password = require('./password'); | 
					
						
							| 
									
										
										
										
											2013-11-22 14:08:02 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-05-09 01:04:15 -04:00
										 |  |  | (function(User) { | 
					
						
							| 
									
										
										
										
											2014-02-26 21:04:20 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-03-12 20:53:42 -04:00
										 |  |  | 	User.email = require('./user/email'); | 
					
						
							|  |  |  | 	User.notifications = require('./user/notifications'); | 
					
						
							|  |  |  | 	User.reset = require('./user/reset'); | 
					
						
							| 
									
										
										
										
											2014-11-17 13:37:07 -05:00
										 |  |  | 	User.digest = require('./user/digest'); | 
					
						
							| 
									
										
										
										
											2014-03-12 20:53:42 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-11 11:45:20 -04:00
										 |  |  | 	require('./user/auth')(User); | 
					
						
							| 
									
										
										
										
											2014-03-17 21:47:37 -04:00
										 |  |  | 	require('./user/create')(User); | 
					
						
							| 
									
										
										
										
											2014-11-14 21:47:24 -05:00
										 |  |  | 	require('./user/posts')(User); | 
					
						
							| 
									
										
										
										
											2014-03-12 20:53:42 -04:00
										 |  |  | 	require('./user/follow')(User); | 
					
						
							|  |  |  | 	require('./user/profile')(User); | 
					
						
							|  |  |  | 	require('./user/admin')(User); | 
					
						
							| 
									
										
										
										
											2014-03-15 15:09:54 -04:00
										 |  |  | 	require('./user/delete')(User); | 
					
						
							| 
									
										
										
										
											2014-03-12 20:53:42 -04:00
										 |  |  | 	require('./user/settings')(User); | 
					
						
							| 
									
										
										
										
											2014-03-12 22:11:48 -04:00
										 |  |  | 	require('./user/search')(User); | 
					
						
							| 
									
										
										
										
											2014-03-18 15:35:48 -04:00
										 |  |  | 	require('./user/jobs')(User); | 
					
						
							| 
									
										
										
										
											2013-08-23 13:14:36 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-05-09 01:04:15 -04:00
										 |  |  | 	User.getUserField = function(uid, field, callback) { | 
					
						
							| 
									
										
										
										
											2014-05-04 17:26:56 -04:00
										 |  |  | 		User.getUserFields(uid, [field], function(err, user) { | 
					
						
							|  |  |  | 			callback(err, user ? user[field] : null); | 
					
						
							|  |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2013-11-04 01:57:58 +02:00
										 |  |  | 	}; | 
					
						
							| 
									
										
										
										
											2013-07-05 16:37:45 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-05-09 01:04:15 -04:00
										 |  |  | 	User.getUserFields = function(uid, fields, callback) { | 
					
						
							| 
									
										
										
										
											2014-05-04 17:26:56 -04:00
										 |  |  | 		User.getMultipleUserFields([uid], fields, function(err, users) { | 
					
						
							|  |  |  | 			callback(err, users ? users[0] : null); | 
					
						
							|  |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2013-11-04 01:57:58 +02:00
										 |  |  | 	}; | 
					
						
							| 
									
										
										
										
											2013-05-09 01:04:15 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	User.getMultipleUserFields = function(uids, fields, callback) { | 
					
						
							| 
									
										
										
										
											2014-05-04 17:26:56 -04:00
										 |  |  | 		var fieldsToRemove = []; | 
					
						
							|  |  |  | 		function addField(field) { | 
					
						
							|  |  |  | 			if (fields.indexOf(field) === -1) { | 
					
						
							|  |  |  | 				fields.push(field); | 
					
						
							|  |  |  | 				fieldsToRemove.push(field); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2014-03-11 03:39:41 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		if (!Array.isArray(uids) || !uids.length) { | 
					
						
							| 
									
										
										
										
											2013-09-11 12:49:54 -04:00
										 |  |  | 			return callback(null, []); | 
					
						
							| 
									
										
										
										
											2013-05-16 13:13:46 -04:00
										 |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-03-11 03:39:41 -04:00
										 |  |  | 		var keys = uids.map(function(uid) { | 
					
						
							|  |  |  | 			return 'user:' + uid; | 
					
						
							|  |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2013-07-05 19:08:59 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-19 10:38:43 -05:00
										 |  |  | 		if (fields.indexOf('uid') === -1) { | 
					
						
							|  |  |  | 			fields.push('uid'); | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2014-05-04 17:26:56 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		if (fields.indexOf('picture') !== -1) { | 
					
						
							|  |  |  | 			addField('email'); | 
					
						
							|  |  |  | 			addField('gravatarpicture'); | 
					
						
							|  |  |  | 			addField('uploadedpicture'); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		db.getObjectsFields(keys, fields, function(err, users) { | 
					
						
							|  |  |  | 			if (err) { | 
					
						
							|  |  |  | 				return callback(err); | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2014-08-26 15:55:17 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 			modifyUserData(users, fieldsToRemove, callback); | 
					
						
							| 
									
										
										
										
											2014-05-04 17:26:56 -04:00
										 |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2013-11-04 01:57:58 +02:00
										 |  |  | 	}; | 
					
						
							| 
									
										
										
										
											2013-05-09 01:04:15 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	User.getUserData = function(uid, callback) { | 
					
						
							| 
									
										
										
										
											2014-03-11 03:39:41 -04:00
										 |  |  | 		User.getUsersData([uid], function(err, users) { | 
					
						
							|  |  |  | 			callback(err, users ? users[0] : null); | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	User.getUsersData = function(uids, callback) { | 
					
						
							|  |  |  | 		if (!Array.isArray(uids) || !uids.length) { | 
					
						
							|  |  |  | 			return callback(null, []); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		var keys = uids.map(function(uid) { | 
					
						
							|  |  |  | 			return 'user:' + uid; | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		db.getObjects(keys, function(err, users) { | 
					
						
							|  |  |  | 			if (err) { | 
					
						
							| 
									
										
										
										
											2013-12-02 17:10:26 -05:00
										 |  |  | 				return callback(err); | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2013-09-11 13:02:55 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-08-26 15:55:17 -04:00
										 |  |  | 			modifyUserData(users, [], callback); | 
					
						
							| 
									
										
										
										
											2014-05-04 17:26:56 -04:00
										 |  |  | 		}); | 
					
						
							|  |  |  | 	}; | 
					
						
							| 
									
										
										
										
											2014-03-12 16:11:33 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-08-26 15:55:17 -04:00
										 |  |  | 	function modifyUserData(users, fieldsToRemove, callback) { | 
					
						
							| 
									
										
										
										
											2014-05-04 17:26:56 -04:00
										 |  |  | 		users.forEach(function(user) { | 
					
						
							|  |  |  | 			if (!user) { | 
					
						
							|  |  |  | 				return; | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			if (user.password) { | 
					
						
							| 
									
										
										
										
											2014-11-05 23:58:46 -05:00
										 |  |  | 				user.password = undefined; | 
					
						
							| 
									
										
										
										
											2014-05-04 17:26:56 -04:00
										 |  |  | 			} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-10 18:41:28 -04:00
										 |  |  | 			if (!parseInt(user.uid, 10)) { | 
					
						
							| 
									
										
										
										
											2014-09-20 18:07:46 -04:00
										 |  |  | 				user.uid = 0; | 
					
						
							| 
									
										
										
										
											2014-05-04 17:26:56 -04:00
										 |  |  | 				user.username = '[[global:guest]]'; | 
					
						
							|  |  |  | 				user.userslug = ''; | 
					
						
							| 
									
										
										
										
											2014-10-03 15:28:46 -04:00
										 |  |  | 				user.picture = User.createGravatarURLFromEmail(''); | 
					
						
							| 
									
										
										
										
											2014-05-04 17:26:56 -04:00
										 |  |  | 			} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			if (user.picture) { | 
					
						
							|  |  |  | 				if (user.picture === user.uploadedpicture) { | 
					
						
							| 
									
										
										
										
											2015-03-20 14:48:19 -04:00
										 |  |  | 					user.picture = user.uploadedpicture = user.picture.startsWith('http') ? user.picture : nconf.get('relative_path') + user.picture; | 
					
						
							| 
									
										
										
										
											2014-05-04 17:26:56 -04:00
										 |  |  | 				} else { | 
					
						
							|  |  |  | 					user.picture = User.createGravatarURLFromEmail(user.email); | 
					
						
							| 
									
										
										
										
											2014-03-06 15:32:06 -05:00
										 |  |  | 				} | 
					
						
							| 
									
										
										
										
											2014-05-04 17:26:56 -04:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2014-03-11 03:39:41 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-04 17:26:56 -04:00
										 |  |  | 			for(var i=0; i<fieldsToRemove.length; ++i) { | 
					
						
							|  |  |  | 				user[fieldsToRemove[i]] = undefined; | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2013-05-09 01:04:15 -04:00
										 |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2014-08-26 15:55:17 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		plugins.fireHook('filter:users.get', users, callback); | 
					
						
							| 
									
										
										
										
											2014-05-04 17:26:56 -04:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2013-05-09 01:04:15 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-12 17:16:16 -05:00
										 |  |  | 	User.updateLastOnlineTime = function(uid, callback) { | 
					
						
							| 
									
										
										
										
											2014-06-08 16:06:42 -04:00
										 |  |  | 		callback = callback || function() {}; | 
					
						
							| 
									
										
										
										
											2014-09-16 11:06:10 -04:00
										 |  |  | 		User.getUserFields(uid, ['status', 'lastonline'], function(err, userData) { | 
					
						
							| 
									
										
										
										
											2014-11-28 14:25:11 -05:00
										 |  |  | 			var now = Date.now(); | 
					
						
							| 
									
										
										
										
											2014-11-28 20:31:47 -05:00
										 |  |  | 			if (err || userData.status === 'offline' || now - parseInt(userData.lastonline, 10) < 300000) { | 
					
						
							| 
									
										
										
										
											2014-06-08 16:06:42 -04:00
										 |  |  | 				return callback(err); | 
					
						
							| 
									
										
										
										
											2014-02-12 17:16:16 -05:00
										 |  |  | 			} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-28 14:25:11 -05:00
										 |  |  | 			User.setUserField(uid, 'lastonline', now, callback); | 
					
						
							| 
									
										
										
										
											2014-02-12 17:16:16 -05:00
										 |  |  | 		}); | 
					
						
							|  |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-28 20:31:47 -05:00
										 |  |  | 	User.updateOnlineUsers = function(uid, callback) { | 
					
						
							|  |  |  | 		callback = callback || function() {}; | 
					
						
							| 
									
										
										
										
											2015-02-12 12:23:13 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		var now = Date.now(); | 
					
						
							|  |  |  | 		async.waterfall([ | 
					
						
							|  |  |  | 			function(next) { | 
					
						
							|  |  |  | 				db.sortedSetScore('users:online', uid, next); | 
					
						
							|  |  |  | 			}, | 
					
						
							|  |  |  | 			function(userOnlineTime, next) { | 
					
						
							|  |  |  | 				if (now - parseInt(userOnlineTime, 10) < 300000) { | 
					
						
							|  |  |  | 					return callback(); | 
					
						
							| 
									
										
										
										
											2015-01-29 12:52:30 -05:00
										 |  |  | 				} | 
					
						
							| 
									
										
										
										
											2015-03-14 23:00:24 -04:00
										 |  |  | 				db.sortedSetAdd('users:online', now, uid, next); | 
					
						
							| 
									
										
										
										
											2015-02-12 12:23:13 -05:00
										 |  |  | 			}, | 
					
						
							|  |  |  | 			function(next) { | 
					
						
							|  |  |  | 				topics.pushUnreadCount(uid); | 
					
						
							| 
									
										
										
										
											2015-01-29 12:52:30 -05:00
										 |  |  | 				plugins.fireHook('action:user.online', {uid: uid, timestamp: now}); | 
					
						
							| 
									
										
										
										
											2015-02-12 12:23:13 -05:00
										 |  |  | 				next(); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		], callback); | 
					
						
							| 
									
										
										
										
											2014-11-28 20:36:11 -05:00
										 |  |  | 	}; | 
					
						
							| 
									
										
										
										
											2014-11-28 20:31:47 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-14 13:32:07 -04:00
										 |  |  | 	User.setUserField = function(uid, field, value, callback) { | 
					
						
							| 
									
										
										
										
											2015-01-31 18:06:54 +03:00
										 |  |  | 		callback = callback || function() {}; | 
					
						
							| 
									
										
										
										
											2015-01-29 12:52:30 -05:00
										 |  |  | 		db.setObjectField('user:' + uid, field, value, function(err) { | 
					
						
							|  |  |  | 			if (err) { | 
					
						
							| 
									
										
										
										
											2015-02-12 12:23:13 -05:00
										 |  |  | 				return callback(err); | 
					
						
							| 
									
										
										
										
											2015-01-29 12:52:30 -05:00
										 |  |  | 			} | 
					
						
							|  |  |  | 			plugins.fireHook('action:user.set', {uid: uid, field: field, value: value, type: 'set'}); | 
					
						
							|  |  |  | 			callback(); | 
					
						
							|  |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2013-11-04 01:57:58 +02:00
										 |  |  | 	}; | 
					
						
							| 
									
										
										
										
											2013-05-09 01:04:15 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-11-27 15:02:09 -05:00
										 |  |  | 	User.setUserFields = function(uid, data, callback) { | 
					
						
							| 
									
										
										
										
											2015-01-31 18:06:54 +03:00
										 |  |  | 		callback = callback || function() {}; | 
					
						
							| 
									
										
										
										
											2015-01-29 12:52:30 -05:00
										 |  |  | 		db.setObject('user:' + uid, data, function(err) { | 
					
						
							|  |  |  | 			if (err) { | 
					
						
							|  |  |  | 				return callback(err); | 
					
						
							| 
									
										
										
										
											2014-05-01 14:37:26 -04:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2015-01-29 12:52:30 -05:00
										 |  |  | 			for (var field in data) { | 
					
						
							|  |  |  | 				if (data.hasOwnProperty(field)) { | 
					
						
							|  |  |  | 					plugins.fireHook('action:user.set', {uid: uid, field: field, value: data[field], type: 'set'}); | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			callback(); | 
					
						
							|  |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2013-11-04 01:57:58 +02:00
										 |  |  | 	}; | 
					
						
							| 
									
										
										
										
											2013-07-24 13:12:56 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-12 14:32:56 -04:00
										 |  |  | 	User.incrementUserFieldBy = function(uid, field, value, callback) { | 
					
						
							| 
									
										
										
										
											2014-11-08 14:38:56 -05:00
										 |  |  | 		callback = callback || function() {}; | 
					
						
							| 
									
										
										
										
											2014-05-01 14:30:53 -04:00
										 |  |  | 		db.incrObjectFieldBy('user:' + uid, field, value, function(err, value) { | 
					
						
							| 
									
										
										
										
											2014-11-08 14:38:56 -05:00
										 |  |  | 			if (err) { | 
					
						
							|  |  |  | 				return callback(err); | 
					
						
							| 
									
										
										
										
											2014-05-01 14:30:53 -04:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2015-01-29 12:52:30 -05:00
										 |  |  | 			plugins.fireHook('action:user.set', {uid: uid, field: field, value: value, type: 'increment'}); | 
					
						
							| 
									
										
										
										
											2014-11-08 14:38:56 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | 			callback(null, value); | 
					
						
							| 
									
										
										
										
											2014-05-01 14:30:53 -04:00
										 |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2013-11-04 01:57:58 +02:00
										 |  |  | 	}; | 
					
						
							| 
									
										
										
										
											2013-05-09 01:04:15 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-12 14:32:56 -04:00
										 |  |  | 	User.decrementUserFieldBy = function(uid, field, value, callback) { | 
					
						
							| 
									
										
										
										
											2014-11-08 14:38:56 -05:00
										 |  |  | 		callback = callback || function() {}; | 
					
						
							| 
									
										
										
										
											2014-05-01 14:30:53 -04:00
										 |  |  | 		db.incrObjectFieldBy('user:' + uid, field, -value, function(err, value) { | 
					
						
							| 
									
										
										
										
											2014-11-08 14:38:56 -05:00
										 |  |  | 			if (err) { | 
					
						
							|  |  |  | 				return callback(err); | 
					
						
							| 
									
										
										
										
											2014-05-01 14:30:53 -04:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2015-01-29 12:52:30 -05:00
										 |  |  | 			plugins.fireHook('action:user.set', {uid: uid, field: field, value: value, type: 'decrement'}); | 
					
						
							| 
									
										
										
										
											2014-11-08 14:38:56 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | 			callback(null, value); | 
					
						
							| 
									
										
										
										
											2014-05-01 14:30:53 -04:00
										 |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2013-11-04 01:57:58 +02:00
										 |  |  | 	}; | 
					
						
							| 
									
										
										
										
											2013-07-19 10:59:24 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-28 14:25:11 -05:00
										 |  |  | 	User.getUidsFromSet = function(set, start, stop, callback) { | 
					
						
							|  |  |  | 		if (set === 'users:online') { | 
					
						
							|  |  |  | 			var count = parseInt(stop, 10) === -1 ? stop : stop - start + 1; | 
					
						
							|  |  |  | 			var now = Date.now(); | 
					
						
							| 
									
										
										
										
											2014-11-28 14:30:43 -05:00
										 |  |  | 			db.getSortedSetRevRangeByScore(set, start, count, now, now - 300000, callback); | 
					
						
							| 
									
										
										
										
											2014-11-28 14:25:11 -05:00
										 |  |  | 		} else { | 
					
						
							| 
									
										
										
										
											2014-11-28 14:30:43 -05:00
										 |  |  | 			db.getSortedSetRevRange(set, start, stop, callback); | 
					
						
							| 
									
										
										
										
											2014-11-28 14:25:11 -05:00
										 |  |  | 		} | 
					
						
							|  |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-29 17:02:20 -05:00
										 |  |  | 	User.getUsersFromSet = function(set, uid, start, stop, callback) { | 
					
						
							| 
									
										
										
										
											2014-03-19 21:32:13 -04:00
										 |  |  | 		async.waterfall([ | 
					
						
							|  |  |  | 			function(next) { | 
					
						
							| 
									
										
										
										
											2014-11-28 14:25:11 -05:00
										 |  |  | 				User.getUidsFromSet(set, start, stop, next); | 
					
						
							| 
									
										
										
										
											2014-03-19 21:32:13 -04:00
										 |  |  | 			}, | 
					
						
							|  |  |  | 			function(uids, next) { | 
					
						
							| 
									
										
										
										
											2015-01-29 17:02:20 -05:00
										 |  |  | 				User.getUsers(uids, uid, next); | 
					
						
							| 
									
										
										
										
											2014-03-19 21:32:13 -04:00
										 |  |  | 			} | 
					
						
							|  |  |  | 		], callback); | 
					
						
							|  |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-29 17:02:20 -05:00
										 |  |  | 	User.getUsers = function(uids, uid, callback) { | 
					
						
							| 
									
										
										
										
											2015-01-13 12:02:08 -05:00
										 |  |  | 		var fields = ['uid', 'username', 'userslug', 'picture', 'status', 'banned', 'postcount', 'reputation', 'email:confirmed']; | 
					
						
							|  |  |  | 		plugins.fireHook('filter:users.addFields', {fields: fields}, function(err, data) { | 
					
						
							| 
									
										
										
										
											2014-03-19 21:32:13 -04:00
										 |  |  | 			if (err) { | 
					
						
							|  |  |  | 				return callback(err); | 
					
						
							| 
									
										
										
										
											2014-03-12 20:53:42 -04:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2015-01-13 12:02:08 -05:00
										 |  |  | 			data.fields = data.fields.filter(function(field, index, array) { | 
					
						
							|  |  |  | 				return array.indexOf(field) === index; | 
					
						
							| 
									
										
										
										
											2014-08-06 12:39:14 -04:00
										 |  |  | 			}); | 
					
						
							| 
									
										
										
										
											2015-01-13 12:02:08 -05:00
										 |  |  | 			async.parallel({ | 
					
						
							|  |  |  | 				userData: function(next) { | 
					
						
							|  |  |  | 					User.getMultipleUserFields(uids, data.fields, next); | 
					
						
							|  |  |  | 				}, | 
					
						
							|  |  |  | 				isAdmin: function(next) { | 
					
						
							|  |  |  | 					User.isAdministrator(uids, next); | 
					
						
							|  |  |  | 				}, | 
					
						
							|  |  |  | 				isOnline: function(next) { | 
					
						
							|  |  |  | 					require('./socket.io').isUsersOnline(uids, next); | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			}, function(err, results) { | 
					
						
							|  |  |  | 				if (err) { | 
					
						
							|  |  |  | 					return callback(err); | 
					
						
							|  |  |  | 				} | 
					
						
							| 
									
										
										
										
											2014-08-06 12:39:14 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-13 12:02:08 -05:00
										 |  |  | 				results.userData.forEach(function(user, index) { | 
					
						
							|  |  |  | 					if (!user) { | 
					
						
							|  |  |  | 						return; | 
					
						
							|  |  |  | 					} | 
					
						
							|  |  |  | 					user.status = User.getStatus(user.status, results.isOnline[index]); | 
					
						
							|  |  |  | 					user.administrator = results.isAdmin[index]; | 
					
						
							|  |  |  | 					user.banned = parseInt(user.banned, 10) === 1; | 
					
						
							|  |  |  | 					user['email:confirmed'] = parseInt(user['email:confirmed'], 10) === 1; | 
					
						
							|  |  |  | 				}); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-29 17:02:20 -05:00
										 |  |  | 				plugins.fireHook('filter:userlist.get', {users: results.userData, uid: uid}, function(err, data) { | 
					
						
							| 
									
										
										
										
											2015-01-28 10:30:18 -05:00
										 |  |  | 					if (err) { | 
					
						
							|  |  |  | 						return callback(err); | 
					
						
							|  |  |  | 					} | 
					
						
							|  |  |  | 					callback(null, data.users); | 
					
						
							|  |  |  | 				}); | 
					
						
							| 
									
										
										
										
											2015-01-13 12:02:08 -05:00
										 |  |  | 			}); | 
					
						
							| 
									
										
										
										
											2014-03-19 21:32:13 -04:00
										 |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2013-11-04 01:57:58 +02:00
										 |  |  | 	}; | 
					
						
							| 
									
										
										
										
											2013-05-09 01:04:15 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-12 15:57:45 -05:00
										 |  |  | 	User.getStatus = function(status, isOnline) { | 
					
						
							|  |  |  | 		return isOnline ? (status || 'online') : 'offline'; | 
					
						
							|  |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-05-09 01:04:15 -04:00
										 |  |  | 	User.createGravatarURLFromEmail = function(email) { | 
					
						
							| 
									
										
										
										
											2014-05-11 19:39:52 -04:00
										 |  |  | 		var customGravatarDefaultImage = meta.config.customGravatarDefaultImage; | 
					
						
							|  |  |  | 		if (customGravatarDefaultImage && customGravatarDefaultImage.indexOf('http') === -1) { | 
					
						
							|  |  |  | 			customGravatarDefaultImage = nconf.get('url') + meta.config.customGravatarDefaultImage; | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2014-04-26 15:53:00 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-07-12 16:23:35 -04:00
										 |  |  | 		var options = { | 
					
						
							| 
									
										
										
										
											2014-08-13 18:25:26 -04:00
										 |  |  | 			size: parseInt(meta.config.profileImageDimension, 10) || 128, | 
					
						
							| 
									
										
										
										
											2014-05-22 11:42:37 -04:00
										 |  |  | 			default: customGravatarDefaultImage || meta.config.defaultGravatarImage || 'identicon', | 
					
						
							| 
									
										
										
										
											2013-07-12 16:23:35 -04:00
										 |  |  | 			rating: 'pg' | 
					
						
							| 
									
										
										
										
											2014-01-25 12:05:48 -05:00
										 |  |  | 		}; | 
					
						
							| 
									
										
										
										
											2013-08-23 13:14:36 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-07-05 15:55:58 -05:00
										 |  |  | 		if (!email) { | 
					
						
							| 
									
										
										
										
											2013-07-12 16:23:35 -04:00
										 |  |  | 			email = ''; | 
					
						
							| 
									
										
										
										
											2013-07-05 15:55:58 -05:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2013-07-12 16:23:35 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-25 12:05:48 -05:00
										 |  |  | 		return gravatar.url(email, options, true); | 
					
						
							| 
									
										
										
										
											2013-11-04 01:57:58 +02:00
										 |  |  | 	}; | 
					
						
							| 
									
										
										
										
											2013-05-09 01:04:15 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	User.hashPassword = function(password, callback) { | 
					
						
							| 
									
										
										
										
											2013-09-17 13:09:37 -04:00
										 |  |  | 		if (!password) { | 
					
						
							| 
									
										
										
										
											2014-03-17 21:47:37 -04:00
										 |  |  | 			return callback(null, password); | 
					
						
							| 
									
										
										
										
											2013-05-09 01:04:15 -04:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2013-07-05 15:55:58 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-30 16:48:36 -05:00
										 |  |  | 		Password.hash(nconf.get('bcrypt_rounds') || 12, password, callback); | 
					
						
							| 
									
										
										
										
											2014-02-26 21:04:20 -05:00
										 |  |  | 	}; | 
					
						
							| 
									
										
										
										
											2014-01-07 14:01:32 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-09-19 14:25:43 -04:00
										 |  |  | 	User.addTopicIdToUser = function(uid, tid, timestamp, callback) { | 
					
						
							| 
									
										
										
										
											2015-01-14 15:29:57 -05:00
										 |  |  | 		async.parallel([ | 
					
						
							|  |  |  | 			async.apply(db.sortedSetAdd, 'uid:' + uid + ':topics', timestamp, tid), | 
					
						
							|  |  |  | 			async.apply(User.incrementUserFieldBy, uid, 'topiccount', 1) | 
					
						
							|  |  |  | 		], callback); | 
					
						
							| 
									
										
										
										
											2013-11-04 01:57:58 +02:00
										 |  |  | 	}; | 
					
						
							| 
									
										
										
										
											2013-07-02 16:24:13 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-06-24 16:16:50 -04:00
										 |  |  | 	User.exists = function(userslug, callback) { | 
					
						
							| 
									
										
										
										
											2013-10-30 18:31:36 -04:00
										 |  |  | 		User.getUidByUserslug(userslug, function(err, exists) { | 
					
						
							| 
									
										
										
										
											2014-01-16 16:50:41 -05:00
										 |  |  | 			callback(err, !! exists); | 
					
						
							| 
									
										
										
										
											2013-05-09 01:04:15 -04:00
										 |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2013-11-04 01:57:58 +02:00
										 |  |  | 	}; | 
					
						
							| 
									
										
										
										
											2013-07-05 16:37:45 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-10-30 18:31:36 -04:00
										 |  |  | 	User.getUidByUsername = function(username, callback) { | 
					
						
							| 
									
										
										
										
											2014-12-01 17:59:38 -05:00
										 |  |  | 		if (!username) { | 
					
						
							|  |  |  | 			return callback(); | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2013-12-02 19:40:11 -05:00
										 |  |  | 		db.getObjectField('username:uid', username, callback); | 
					
						
							| 
									
										
										
										
											2013-11-04 01:57:58 +02:00
										 |  |  | 	}; | 
					
						
							| 
									
										
										
										
											2013-05-09 01:04:15 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-14 23:00:24 -04:00
										 |  |  | 	User.getUidsByUsernames = function(usernames, callback) { | 
					
						
							| 
									
										
										
										
											2015-03-15 01:45:24 -04:00
										 |  |  | 		db.getObjectFields('username:uid', usernames, function(err, users) { | 
					
						
							|  |  |  | 			if (err) { | 
					
						
							|  |  |  | 				return callback(err); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			var uids = usernames.map(function(username) { | 
					
						
							|  |  |  | 				return users[username]; | 
					
						
							|  |  |  | 			}); | 
					
						
							|  |  |  | 			callback(null, uids); | 
					
						
							|  |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2015-03-14 23:00:24 -04:00
										 |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-10-30 18:31:36 -04:00
										 |  |  | 	User.getUidByUserslug = function(userslug, callback) { | 
					
						
							| 
									
										
										
										
											2014-12-01 17:59:38 -05:00
										 |  |  | 		if (!userslug) { | 
					
						
							|  |  |  | 			return callback(); | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2013-12-02 19:40:11 -05:00
										 |  |  | 		db.getObjectField('userslug:uid', userslug, callback); | 
					
						
							| 
									
										
										
										
											2013-11-04 01:57:58 +02:00
										 |  |  | 	}; | 
					
						
							| 
									
										
										
										
											2013-06-24 14:33:53 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-10-30 18:31:36 -04:00
										 |  |  | 	User.getUsernamesByUids = function(uids, callback) { | 
					
						
							| 
									
										
										
										
											2014-03-11 03:39:41 -04:00
										 |  |  | 		User.getMultipleUserFields(uids, ['username'], function(err, users) { | 
					
						
							|  |  |  | 			if (err) { | 
					
						
							|  |  |  | 				return callback(err); | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2013-05-17 13:28:34 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-03-11 03:39:41 -04:00
										 |  |  | 			users = users.map(function(user) { | 
					
						
							|  |  |  | 				return user.username; | 
					
						
							|  |  |  | 			}); | 
					
						
							| 
									
										
										
										
											2013-07-05 18:19:55 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-03-11 03:39:41 -04:00
										 |  |  | 			callback(null, users); | 
					
						
							|  |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2013-11-04 01:57:58 +02:00
										 |  |  | 	}; | 
					
						
							| 
									
										
										
										
											2013-05-09 01:04:15 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-27 12:19:25 -05:00
										 |  |  | 	User.getUsernameByUserslug = function(slug, callback) { | 
					
						
							|  |  |  | 		async.waterfall([ | 
					
						
							|  |  |  | 			function(next) { | 
					
						
							|  |  |  | 				User.getUidByUserslug(slug, next); | 
					
						
							|  |  |  | 			}, | 
					
						
							|  |  |  | 			function(uid, next) { | 
					
						
							|  |  |  | 				User.getUserField(uid, 'username', next); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		], callback); | 
					
						
							|  |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-10-30 18:31:36 -04:00
										 |  |  | 	User.getUidByEmail = function(email, callback) { | 
					
						
							| 
									
										
										
										
											2014-06-10 13:35:31 -04:00
										 |  |  | 		db.getObjectField('email:uid', email.toLowerCase(), callback); | 
					
						
							| 
									
										
										
										
											2013-11-04 01:57:58 +02:00
										 |  |  | 	}; | 
					
						
							| 
									
										
										
										
											2013-05-09 01:04:15 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-03-17 15:38:06 -04:00
										 |  |  | 	User.getUsernameByEmail = function(email, callback) { | 
					
						
							| 
									
										
										
										
											2014-06-10 13:35:31 -04:00
										 |  |  | 		db.getObjectField('email:uid', email.toLowerCase(), function(err, uid) { | 
					
						
							| 
									
										
										
										
											2014-03-17 15:46:53 -04:00
										 |  |  | 			if (err) { | 
					
						
							|  |  |  | 				return callback(err); | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2014-03-17 15:38:06 -04:00
										 |  |  | 			User.getUserField(uid, 'username', callback); | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-05-16 12:49:39 -04:00
										 |  |  | 	User.isModerator = function(uid, cid, callback) { | 
					
						
							| 
									
										
										
										
											2014-12-02 14:19:06 -05:00
										 |  |  | 		function filterIsModerator(err, isModerator) { | 
					
						
							| 
									
										
										
										
											2014-12-02 15:13:18 -05:00
										 |  |  | 			if (err) { | 
					
						
							|  |  |  | 				return callback(err); | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2014-12-02 16:13:29 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-12-02 14:21:17 -05:00
										 |  |  | 			plugins.fireHook('filter:user.isModerator', {uid: uid, cid:cid, isModerator: isModerator}, function(err, data) { | 
					
						
							| 
									
										
										
										
											2014-12-02 16:13:29 -05:00
										 |  |  | 				if (Array.isArray(uid) && !Array.isArray(data.isModerator) || Array.isArray(cid) && !Array.isArray(data.isModerator)) { | 
					
						
							|  |  |  | 					return callback(new Error('filter:user.isModerator - i/o mismatch')); | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-12-02 14:19:06 -05:00
										 |  |  | 				callback(err, data.isModerator); | 
					
						
							|  |  |  | 			}); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-06-28 14:59:01 -04:00
										 |  |  | 		if (Array.isArray(cid)) { | 
					
						
							| 
									
										
										
										
											2014-11-04 19:05:55 -05:00
										 |  |  | 			if (!parseInt(uid, 10)) { | 
					
						
							| 
									
										
										
										
											2014-12-02 14:19:06 -05:00
										 |  |  | 				return filterIsModerator(null, cid.map(function() {return false;})); | 
					
						
							| 
									
										
										
										
											2014-11-04 19:05:55 -05:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2014-10-09 19:53:10 -04:00
										 |  |  | 			var uniqueCids = cid.filter(function(cid, index, array) { | 
					
						
							|  |  |  | 				return array.indexOf(cid) === index; | 
					
						
							|  |  |  | 			}); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			var groupNames = uniqueCids.map(function(cid) { | 
					
						
							| 
									
										
										
										
											2015-03-25 20:04:45 -04:00
										 |  |  | 					return 'cid:' + cid + ':privileges:mods';	// At some point we should *probably* change this to "moderate" as well
 | 
					
						
							|  |  |  | 				}), | 
					
						
							|  |  |  | 				groupListNames = uniqueCids.map(function(cid) { | 
					
						
							|  |  |  | 					return 'cid:' + cid + ':privileges:groups:moderate'; | 
					
						
							|  |  |  | 				}); | 
					
						
							| 
									
										
										
										
											2014-10-09 19:53:10 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-25 20:04:45 -04:00
										 |  |  | 			async.parallel({ | 
					
						
							|  |  |  | 				user: async.apply(groups.isMemberOfGroups, uid, groupNames), | 
					
						
							|  |  |  | 				group: async.apply(groups.isMemberOfGroupsList, uid, groupListNames) | 
					
						
							|  |  |  | 			}, function(err, checks) { | 
					
						
							| 
									
										
										
										
											2014-10-09 19:53:10 -04:00
										 |  |  | 				if (err) { | 
					
						
							|  |  |  | 					return callback(err); | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-25 20:04:45 -04:00
										 |  |  | 				var isMembers = checks.user.map(function(isMember, idx) { | 
					
						
							|  |  |  | 						return isMember || checks.group[idx] | 
					
						
							|  |  |  | 					}), | 
					
						
							|  |  |  | 					map = {}; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-09 19:53:10 -04:00
										 |  |  | 				uniqueCids.forEach(function(cid, index) { | 
					
						
							|  |  |  | 					map[cid] = isMembers[index]; | 
					
						
							|  |  |  | 				}); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-12-02 14:19:06 -05:00
										 |  |  | 				filterIsModerator(null, cid.map(function(cid) { | 
					
						
							| 
									
										
										
										
											2014-10-09 19:53:10 -04:00
										 |  |  | 					return map[cid]; | 
					
						
							|  |  |  | 				})); | 
					
						
							|  |  |  | 			}); | 
					
						
							| 
									
										
										
										
											2014-06-28 14:59:01 -04:00
										 |  |  | 		} else { | 
					
						
							| 
									
										
										
										
											2014-09-09 15:19:57 -04:00
										 |  |  | 			if (Array.isArray(uid)) { | 
					
						
							| 
									
										
										
										
											2015-03-25 20:04:45 -04:00
										 |  |  | 				async.parallel([ | 
					
						
							|  |  |  | 					async.apply(groups.isMembers, uid, 'cid:' + cid + ':privileges:mods'), | 
					
						
							|  |  |  | 					async.apply(groups.isMembers, uid, 'cid:' + cid + ':privileges:groups:moderate') | 
					
						
							|  |  |  | 				], function(err, checks) { | 
					
						
							|  |  |  | 					var isModerator = checks[0].map(function(isMember, idx) { | 
					
						
							|  |  |  | 							return isMember || checks[1][idx] | 
					
						
							|  |  |  | 						}); | 
					
						
							|  |  |  | 					filterIsModerator(null, isModerator); | 
					
						
							|  |  |  | 				}); | 
					
						
							| 
									
										
										
										
											2014-09-09 15:19:57 -04:00
										 |  |  | 			} else { | 
					
						
							| 
									
										
										
										
											2015-03-25 20:04:45 -04:00
										 |  |  | 				async.parallel([ | 
					
						
							|  |  |  | 					async.apply(groups.isMember, uid, 'cid:' + cid + ':privileges:mods'), | 
					
						
							|  |  |  | 					async.apply(groups.isMember, uid, 'cid:' + cid + ':privileges:groups:moderate') | 
					
						
							|  |  |  | 				], function(err, checks) { | 
					
						
							|  |  |  | 					var isModerator = checks[0] || checks[1]; | 
					
						
							|  |  |  | 					filterIsModerator(null, isModerator); | 
					
						
							|  |  |  | 				}); | 
					
						
							| 
									
										
										
										
											2014-09-09 15:19:57 -04:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2014-06-28 14:59:01 -04:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2013-11-04 01:57:58 +02:00
										 |  |  | 	}; | 
					
						
							| 
									
										
										
										
											2013-05-17 21:14:58 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	User.isAdministrator = function(uid, callback) { | 
					
						
							| 
									
										
										
										
											2014-08-06 12:39:14 -04:00
										 |  |  | 		if (Array.isArray(uid)) { | 
					
						
							|  |  |  | 			groups.isMembers(uid, 'administrators', callback); | 
					
						
							|  |  |  | 		} else { | 
					
						
							|  |  |  | 			groups.isMember(uid, 'administrators', callback); | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2013-11-04 01:57:58 +02:00
										 |  |  | 	}; | 
					
						
							| 
									
										
										
										
											2013-06-20 14:45:38 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-08-29 15:57:20 -04:00
										 |  |  | 	User.getIgnoredCategories = function(uid, callback) { | 
					
						
							|  |  |  | 		db.getSortedSetRange('uid:' + uid + ':ignored:cids', 0, -1, callback); | 
					
						
							|  |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-02-05 14:55:36 -05:00
										 |  |  | 	User.getWatchedCategories = function(uid, callback) { | 
					
						
							|  |  |  | 		async.parallel({ | 
					
						
							|  |  |  | 			ignored: function(next) { | 
					
						
							|  |  |  | 				User.getIgnoredCategories(uid, next); | 
					
						
							|  |  |  | 			}, | 
					
						
							|  |  |  | 			all: function(next) { | 
					
						
							|  |  |  | 				db.getSortedSetRange('categories:cid', 0, -1, next); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		}, function(err, results) { | 
					
						
							|  |  |  | 			if (err) { | 
					
						
							|  |  |  | 				return callback(err); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			var watched = results.all.filter(function(cid) { | 
					
						
							|  |  |  | 				return cid && results.ignored.indexOf(cid) === -1; | 
					
						
							|  |  |  | 			}); | 
					
						
							|  |  |  | 			callback(null, watched); | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-08-29 15:57:20 -04:00
										 |  |  | 	User.ignoreCategory = function(uid, cid, callback) { | 
					
						
							| 
									
										
										
										
											2014-08-29 17:55:44 -04:00
										 |  |  | 		if (!uid) { | 
					
						
							|  |  |  | 			return callback(); | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2014-08-29 15:57:20 -04:00
										 |  |  | 		db.sortedSetAdd('uid:' + uid + ':ignored:cids', Date.now(), cid, callback); | 
					
						
							|  |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	User.watchCategory = function(uid, cid, callback) { | 
					
						
							| 
									
										
										
										
											2014-08-29 17:55:44 -04:00
										 |  |  | 		if (!uid) { | 
					
						
							|  |  |  | 			return callback(); | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2014-08-29 15:57:20 -04:00
										 |  |  | 		db.sortedSetRemove('uid:' + uid + ':ignored:cids', cid, callback); | 
					
						
							|  |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-11 23:38:25 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-11-30 13:13:18 -05:00
										 |  |  | }(exports)); |