| 
									
										
										
										
											2014-03-02 23:07:16 -05:00
										 |  |  | "use strict"; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-28 15:58:29 -05:00
										 |  |  | var usersController = {}; | 
					
						
							| 
									
										
										
										
											2014-02-28 14:04:21 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-28 15:33:25 -05:00
										 |  |  | var async = require('async'), | 
					
						
							| 
									
										
										
										
											2015-07-14 17:03:28 -04:00
										 |  |  | 	validator = require('validator'), | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-09-12 18:31:04 -04:00
										 |  |  | 	user = require('../user'), | 
					
						
							| 
									
										
										
										
											2015-01-12 15:57:45 -05:00
										 |  |  | 	meta = require('../meta'), | 
					
						
							| 
									
										
										
										
											2015-07-14 17:03:28 -04:00
										 |  |  | 	categories = require('../categories'), | 
					
						
							|  |  |  | 	topics = require('../topics'), | 
					
						
							| 
									
										
										
										
											2015-03-10 15:04:17 -04:00
										 |  |  | 	pagination = require('../pagination'), | 
					
						
							| 
									
										
										
										
											2015-01-27 16:39:33 -05:00
										 |  |  | 	plugins = require('../plugins'), | 
					
						
							| 
									
										
										
										
											2015-04-27 16:02:08 -04:00
										 |  |  | 	db = require('../database'), | 
					
						
							|  |  |  | 	helpers = require('./helpers'); | 
					
						
							| 
									
										
										
										
											2014-02-28 14:04:21 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-28 14:19:43 -05:00
										 |  |  | usersController.getOnlineUsers = function(req, res, next) { | 
					
						
							|  |  |  | 	var	websockets = require('../socket.io'); | 
					
						
							| 
									
										
										
										
											2014-09-12 18:31:04 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	async.parallel({ | 
					
						
							|  |  |  | 		users: function(next) { | 
					
						
							| 
									
										
										
										
											2015-04-01 00:23:57 -04:00
										 |  |  | 			user.getUsersFromSet('users:online', req.uid, 0, 49, next); | 
					
						
							| 
									
										
										
										
											2014-09-12 18:31:04 -04:00
										 |  |  | 		}, | 
					
						
							|  |  |  | 		count: function(next) { | 
					
						
							| 
									
										
										
										
											2014-11-28 14:25:11 -05:00
										 |  |  | 			var now = Date.now(); | 
					
						
							|  |  |  | 			db.sortedSetCount('users:online', now - 300000, now, next); | 
					
						
							| 
									
										
										
										
											2014-09-12 18:31:04 -04:00
										 |  |  | 		}, | 
					
						
							|  |  |  | 		isAdministrator: function(next) { | 
					
						
							| 
									
										
										
										
											2015-04-01 00:23:57 -04:00
										 |  |  | 			user.isAdministrator(req.uid, next); | 
					
						
							| 
									
										
										
										
											2014-09-12 18:31:04 -04:00
										 |  |  | 		} | 
					
						
							|  |  |  | 	}, function(err, results) { | 
					
						
							|  |  |  | 		if (err) { | 
					
						
							| 
									
										
										
										
											2014-02-28 14:19:43 -05:00
										 |  |  | 			return next(err); | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2014-09-01 23:33:32 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-09-12 18:31:04 -04:00
										 |  |  | 		if (!results.isAdministrator) { | 
					
						
							|  |  |  | 			results.users = results.users.filter(function(user) { | 
					
						
							|  |  |  | 				return user && user.status !== 'offline'; | 
					
						
							|  |  |  | 			}); | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2014-02-28 14:19:43 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-09-12 18:31:04 -04:00
										 |  |  | 		var userData = { | 
					
						
							| 
									
										
										
										
											2015-08-06 16:38:20 -04:00
										 |  |  | 			'route_users:online': true, | 
					
						
							| 
									
										
										
										
											2014-09-25 15:13:54 -04:00
										 |  |  | 			search_display: 'hidden', | 
					
						
							| 
									
										
										
										
											2014-09-12 18:31:04 -04:00
										 |  |  | 			loadmore_display: results.count > 50 ? 'block' : 'hide', | 
					
						
							|  |  |  | 			users: results.users, | 
					
						
							| 
									
										
										
										
											2015-04-01 15:22:56 -04:00
										 |  |  | 			anonymousUserCount: websockets.getOnlineAnonCount() | 
					
						
							| 
									
										
										
										
											2014-09-12 18:31:04 -04:00
										 |  |  | 		}; | 
					
						
							| 
									
										
										
										
											2014-02-28 14:19:43 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-04 18:01:45 -04:00
										 |  |  | 		render(req, res, userData, next); | 
					
						
							| 
									
										
										
										
											2014-02-28 14:19:43 -05:00
										 |  |  | 	}); | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | usersController.getUsersSortedByPosts = function(req, res, next) { | 
					
						
							| 
									
										
										
										
											2015-05-19 23:04:28 -04:00
										 |  |  | 	usersController.getUsers('users:postcount', 0, 49, req, res, next); | 
					
						
							| 
									
										
										
										
											2014-02-28 14:19:43 -05:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | usersController.getUsersSortedByReputation = function(req, res, next) { | 
					
						
							| 
									
										
										
										
											2015-05-19 23:04:28 -04:00
										 |  |  | 	usersController.getUsers('users:reputation', 0, 49, req, res, next); | 
					
						
							| 
									
										
										
										
											2014-02-28 14:19:43 -05:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | usersController.getUsersSortedByJoinDate = function(req, res, next) { | 
					
						
							| 
									
										
										
										
											2015-05-19 23:04:28 -04:00
										 |  |  | 	usersController.getUsers('users:joindate', 0, 49, req, res, next); | 
					
						
							| 
									
										
										
										
											2014-03-15 16:18:03 -04:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-19 23:04:28 -04:00
										 |  |  | usersController.getUsers = function(set, start, stop, req, res, next) { | 
					
						
							|  |  |  | 	usersController.getUsersAndCount(set, req.uid, start, stop, function(err, data) { | 
					
						
							| 
									
										
										
										
											2015-01-12 15:57:45 -05:00
										 |  |  | 		if (err) { | 
					
						
							|  |  |  | 			return next(err); | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2015-03-10 15:04:17 -04:00
										 |  |  | 		var pageCount = Math.ceil(data.count / (parseInt(meta.config.userSearchResultsPerPage, 10) || 20)); | 
					
						
							| 
									
										
										
										
											2015-01-12 15:57:45 -05:00
										 |  |  | 		var userData = { | 
					
						
							|  |  |  | 			search_display: 'hidden', | 
					
						
							| 
									
										
										
										
											2015-05-19 23:04:28 -04:00
										 |  |  | 			loadmore_display: data.count > (stop - start + 1) ? 'block' : 'hide', | 
					
						
							| 
									
										
										
										
											2015-01-12 15:57:45 -05:00
										 |  |  | 			users: data.users, | 
					
						
							| 
									
										
										
										
											2015-03-10 15:04:17 -04:00
										 |  |  | 			pagination: pagination.create(1, pageCount) | 
					
						
							| 
									
										
										
										
											2015-01-12 15:57:45 -05:00
										 |  |  | 		}; | 
					
						
							| 
									
										
										
										
											2015-08-06 16:38:20 -04:00
										 |  |  | 		userData['route_' + set] = true; | 
					
						
							| 
									
										
										
										
											2015-05-04 18:01:45 -04:00
										 |  |  | 		render(req, res, userData, next); | 
					
						
							| 
									
										
										
										
											2015-01-12 15:57:45 -05:00
										 |  |  | 	}); | 
					
						
							| 
									
										
										
										
											2015-01-27 16:03:57 -05:00
										 |  |  | }; | 
					
						
							| 
									
										
										
										
											2015-01-12 15:57:45 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-19 23:04:28 -04:00
										 |  |  | usersController.getUsersAndCount = function(set, uid, start, stop, callback) { | 
					
						
							| 
									
										
										
										
											2014-09-12 18:31:04 -04:00
										 |  |  | 	async.parallel({ | 
					
						
							|  |  |  | 		users: function(next) { | 
					
						
							| 
									
										
										
										
											2015-05-19 23:04:28 -04:00
										 |  |  | 			user.getUsersFromSet(set, uid, start, stop, next); | 
					
						
							| 
									
										
										
										
											2014-09-12 18:31:04 -04:00
										 |  |  | 		}, | 
					
						
							|  |  |  | 		count: function(next) { | 
					
						
							| 
									
										
										
										
											2015-05-20 16:08:22 -04:00
										 |  |  | 			db.getObjectField('global', 'userCount', next); | 
					
						
							| 
									
										
										
										
											2014-09-12 18:31:04 -04:00
										 |  |  | 		} | 
					
						
							|  |  |  | 	}, function(err, results) { | 
					
						
							| 
									
										
										
										
											2014-03-15 16:18:03 -04:00
										 |  |  | 		if (err) { | 
					
						
							| 
									
										
										
										
											2015-01-12 15:57:45 -05:00
										 |  |  | 			return callback(err); | 
					
						
							| 
									
										
										
										
											2014-03-15 16:18:03 -04:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2014-09-12 18:31:04 -04:00
										 |  |  | 		results.users = results.users.filter(function(user) { | 
					
						
							| 
									
										
										
										
											2014-09-12 18:05:09 -04:00
										 |  |  | 			return user && parseInt(user.uid, 10); | 
					
						
							|  |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2014-09-12 18:31:04 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-10 15:04:17 -04:00
										 |  |  | 		callback(null, results); | 
					
						
							| 
									
										
										
										
											2014-02-28 14:19:43 -05:00
										 |  |  | 	}); | 
					
						
							| 
									
										
										
										
											2015-05-19 23:04:28 -04:00
										 |  |  | }; | 
					
						
							| 
									
										
										
										
											2014-02-28 14:19:43 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | usersController.getUsersForSearch = function(req, res, next) { | 
					
						
							| 
									
										
										
										
											2015-06-17 14:57:10 -04:00
										 |  |  | 	if (!req.uid && parseInt(meta.config.allowGuestUserSearching, 10) !== 1) { | 
					
						
							| 
									
										
										
										
											2015-04-27 16:02:08 -04:00
										 |  |  | 		return helpers.notAllowed(req, res); | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2015-04-01 00:23:57 -04:00
										 |  |  | 	var resultsPerPage = parseInt(meta.config.userSearchResultsPerPage, 10) || 20; | 
					
						
							| 
									
										
										
										
											2015-01-27 16:51:48 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-19 23:04:28 -04:00
										 |  |  | 	usersController.getUsersAndCount('users:joindate', req.uid, 0, resultsPerPage - 1, function(err, data) { | 
					
						
							| 
									
										
										
										
											2015-01-12 15:57:45 -05:00
										 |  |  | 		if (err) { | 
					
						
							|  |  |  | 			return next(err); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-27 16:39:33 -05:00
										 |  |  | 		var userData = { | 
					
						
							| 
									
										
										
										
											2015-01-12 15:57:45 -05:00
										 |  |  | 			search_display: 'block', | 
					
						
							|  |  |  | 			loadmore_display: 'hidden', | 
					
						
							| 
									
										
										
										
											2015-04-01 15:22:56 -04:00
										 |  |  | 			users: data.users | 
					
						
							| 
									
										
										
										
											2015-01-12 15:57:45 -05:00
										 |  |  | 		}; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-04 18:01:45 -04:00
										 |  |  | 		render(req, res, userData, next); | 
					
						
							| 
									
										
										
										
											2015-01-12 15:57:45 -05:00
										 |  |  | 	}); | 
					
						
							| 
									
										
										
										
											2014-02-28 14:19:43 -05:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-14 17:03:28 -04:00
										 |  |  | usersController.getMap = function(req, res, next) { | 
					
						
							|  |  |  | 	var socketIO = require('../socket.io'); | 
					
						
							|  |  |  | 	var rooms = require('../socket.io/rooms'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	var roomNames = ['user_list', 'categories', 'unread_topics', 'recent_topics', 'popular_topics', 'tags']; | 
					
						
							|  |  |  | 	var links = { | 
					
						
							|  |  |  | 		user_list: '/users', | 
					
						
							|  |  |  | 		categories: '/categories', | 
					
						
							|  |  |  | 		unread_topics: '/unread', | 
					
						
							|  |  |  | 		recent_topics: '/recent', | 
					
						
							|  |  |  | 		popular_topics: '/popular', | 
					
						
							|  |  |  | 		tags: '/tags' | 
					
						
							|  |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	var keys = Object.keys(rooms.roomClients()); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	keys = keys.filter(function(key) { | 
					
						
							|  |  |  | 		return key.startsWith('topic_') || key.startsWith('category_'); | 
					
						
							|  |  |  | 	}); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	roomNames = roomNames.concat(keys); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	async.map(roomNames, function(roomName, next) { | 
					
						
							|  |  |  | 		socketIO.getUsersInRoom(0, roomName, 0, 39, function(err, data) { | 
					
						
							|  |  |  | 			if (err) { | 
					
						
							|  |  |  | 				return next(err); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			if (roomName.startsWith('category_')) { | 
					
						
							|  |  |  | 				var cid = roomName.split('_')[1]; | 
					
						
							|  |  |  | 				categories.getCategoryFields(cid, ['slug', 'name'], function(err, categoryData) { | 
					
						
							|  |  |  | 					if (err) { | 
					
						
							|  |  |  | 						return next(err); | 
					
						
							|  |  |  | 					} | 
					
						
							|  |  |  | 					data.room = validator.escape(categoryData.name); | 
					
						
							|  |  |  | 					data.link = '/category/' + categoryData.slug; | 
					
						
							| 
									
										
										
										
											2015-08-19 01:16:30 -04:00
										 |  |  | 					data.core = false; | 
					
						
							| 
									
										
										
										
											2015-07-14 17:03:28 -04:00
										 |  |  | 					next(null, data); | 
					
						
							|  |  |  | 				}); | 
					
						
							|  |  |  | 			} else if (roomName.startsWith('topic_')) { | 
					
						
							|  |  |  | 				var tid = roomName.split('_')[1]; | 
					
						
							|  |  |  | 				topics.getTopicFields(tid, ['slug', 'title'], function(err, topicData) { | 
					
						
							|  |  |  | 					if (err) { | 
					
						
							|  |  |  | 						return next(err); | 
					
						
							|  |  |  | 					} | 
					
						
							|  |  |  | 					data.room = validator.escape(topicData.title); | 
					
						
							|  |  |  | 					data.link = '/topic/' + topicData.slug; | 
					
						
							| 
									
										
										
										
											2015-08-19 01:16:30 -04:00
										 |  |  | 					data.core = false; | 
					
						
							| 
									
										
										
										
											2015-07-14 17:03:28 -04:00
										 |  |  | 					next(null, data); | 
					
						
							|  |  |  | 				}); | 
					
						
							|  |  |  | 			} else { | 
					
						
							| 
									
										
										
										
											2015-08-19 01:16:30 -04:00
										 |  |  | 				data.core = true; | 
					
						
							| 
									
										
										
										
											2015-07-14 17:03:28 -04:00
										 |  |  | 				next(null, data); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 	}, function(err, data) { | 
					
						
							| 
									
										
										
										
											2015-08-19 01:16:30 -04:00
										 |  |  | 		if (err) { | 
					
						
							|  |  |  | 			return next(err); | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2015-07-14 17:03:28 -04:00
										 |  |  | 		data.sort(function(a, b) { | 
					
						
							|  |  |  | 			return b.total - a.total; | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		data.forEach(function(room) { | 
					
						
							|  |  |  | 			if (!room.link) { | 
					
						
							|  |  |  | 				room.link = links[room.room]; | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-14 17:14:35 -04:00
										 |  |  | 		res.render('usersMap', {rooms: data}); | 
					
						
							| 
									
										
										
										
											2015-07-14 17:03:28 -04:00
										 |  |  | 	}); | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-04 18:01:45 -04:00
										 |  |  | function render(req, res, data, next) { | 
					
						
							|  |  |  | 	plugins.fireHook('filter:users.build', {req: req, res: res, templateData: data}, function(err, data) { | 
					
						
							|  |  |  | 		if (err) { | 
					
						
							|  |  |  | 			return next(err); | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2015-06-28 21:54:21 -04:00
										 |  |  | 		data.templateData.inviteOnly = meta.config.registrationType === 'invite-only'; | 
					
						
							| 
									
										
										
										
											2015-05-04 18:01:45 -04:00
										 |  |  | 		res.render('users', data.templateData); | 
					
						
							|  |  |  | 	}); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-28 14:19:43 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-28 14:04:21 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-04-10 20:31:57 +01:00
										 |  |  | module.exports = usersController; |