| 
									
										
										
										
											2014-03-02 23:07:16 -05:00
										 |  |  | "use strict"; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-16 10:19:53 +02:00
										 |  |  | var async = require('async'); | 
					
						
							|  |  |  | var user = require('../user'); | 
					
						
							|  |  |  | var meta = require('../meta'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | var pagination = require('../pagination'); | 
					
						
							|  |  |  | var plugins = require('../plugins'); | 
					
						
							|  |  |  | var db = require('../database'); | 
					
						
							|  |  |  | var helpers = require('./helpers'); | 
					
						
							| 
									
										
										
										
											2014-02-28 14:04:21 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-14 17:03:28 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-16 10:19:53 +02:00
										 |  |  | var usersController = {}; | 
					
						
							| 
									
										
										
										
											2014-02-28 14:04:21 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-28 14:19:43 -05:00
										 |  |  | usersController.getOnlineUsers = function(req, res, next) { | 
					
						
							| 
									
										
										
										
											2014-09-12 18:31:04 -04:00
										 |  |  | 	async.parallel({ | 
					
						
							| 
									
										
										
										
											2016-01-16 10:19:53 +02:00
										 |  |  | 		userData: function(next) { | 
					
						
							|  |  |  | 			usersController.getUsers('users:online', req.uid, req.query.page, 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) { | 
					
						
							| 
									
										
										
										
											2016-01-16 10:19:53 +02:00
										 |  |  | 			results.userData.users = results.userData.users.filter(function(user) { | 
					
						
							| 
									
										
										
										
											2014-09-12 18:31:04 -04:00
										 |  |  | 				return user && user.status !== 'offline'; | 
					
						
							|  |  |  | 			}); | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2014-02-28 14:19:43 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-16 10:19:53 +02:00
										 |  |  | 		results.userData.anonymousUserCount = require('../socket.io').getOnlineAnonCount(); | 
					
						
							| 
									
										
										
										
											2014-02-28 14:19:43 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-16 10:19:53 +02:00
										 |  |  | 		render(req, res, results.userData, next); | 
					
						
							| 
									
										
										
										
											2014-02-28 14:19:43 -05:00
										 |  |  | 	}); | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | usersController.getUsersSortedByPosts = function(req, res, next) { | 
					
						
							| 
									
										
										
										
											2016-01-16 10:19:53 +02:00
										 |  |  | 	usersController.renderUsersPage('users:postcount', req, res, next); | 
					
						
							| 
									
										
										
										
											2014-02-28 14:19:43 -05:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | usersController.getUsersSortedByReputation = function(req, res, next) { | 
					
						
							| 
									
										
										
										
											2015-10-09 14:23:02 -04:00
										 |  |  | 	if (parseInt(meta.config['reputation:disabled'], 10) === 1) { | 
					
						
							|  |  |  | 		return next(); | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2016-01-16 10:19:53 +02:00
										 |  |  | 	usersController.renderUsersPage('users:reputation', req, res, next); | 
					
						
							| 
									
										
										
										
											2014-02-28 14:19:43 -05:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | usersController.getUsersSortedByJoinDate = function(req, res, next) { | 
					
						
							| 
									
										
										
										
											2016-01-16 10:19:53 +02:00
										 |  |  | 	usersController.renderUsersPage('users:joindate', req, res, next); | 
					
						
							| 
									
										
										
										
											2014-03-15 16:18:03 -04:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-03 15:17:42 +02:00
										 |  |  | usersController.getBannedUsers = function(req, res, next) { | 
					
						
							|  |  |  | 	async.parallel({ | 
					
						
							|  |  |  | 		userData: function(next) { | 
					
						
							|  |  |  | 			usersController.getUsers('users:banned', req.uid, req.query.page, next); | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 		isAdministrator: function(next) { | 
					
						
							|  |  |  | 			user.isAdministrator(req.uid, next); | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 		isGlobalMod: function(next) { | 
					
						
							|  |  |  | 			user.isGlobalModerator(req.uid, next); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	}, function(err, results) { | 
					
						
							|  |  |  | 		if (err) { | 
					
						
							|  |  |  | 			return next(err); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		if (!results.isAdministrator && !results.isGlobalMod) { | 
					
						
							|  |  |  | 			return next(); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		render(req, res, results.userData, next); | 
					
						
							|  |  |  | 	}); | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-16 10:19:53 +02:00
										 |  |  | usersController.renderUsersPage = function(set, req, res, next) { | 
					
						
							|  |  |  | 	usersController.getUsers(set, req.uid, req.query.page, function(err, userData) { | 
					
						
							|  |  |  | 		if (err) { | 
					
						
							|  |  |  | 			return next(err); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		render(req, res, userData, next); | 
					
						
							|  |  |  | 	}); | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | usersController.getUsers = function(set, uid, page, callback) { | 
					
						
							| 
									
										
										
										
											2015-08-26 15:58:27 -04:00
										 |  |  | 	var setToTitles = { | 
					
						
							|  |  |  | 		'users:postcount': '[[pages:users/sort-posts]]', | 
					
						
							|  |  |  | 		'users:reputation': '[[pages:users/sort-reputation]]', | 
					
						
							| 
									
										
										
										
											2016-01-16 10:19:53 +02:00
										 |  |  | 		'users:joindate': '[[pages:users/latest]]', | 
					
						
							| 
									
										
										
										
											2016-02-03 15:17:42 +02:00
										 |  |  | 		'users:online': '[[pages:users/online]]', | 
					
						
							|  |  |  | 		'users:banned': '[[pages:users/banned]]' | 
					
						
							| 
									
										
										
										
											2015-08-26 15:58:27 -04:00
										 |  |  | 	}; | 
					
						
							| 
									
										
										
										
											2015-09-11 23:14:03 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	var setToCrumbs = { | 
					
						
							|  |  |  | 		'users:postcount': '[[users:top_posters]]', | 
					
						
							|  |  |  | 		'users:reputation': '[[users:most_reputation]]', | 
					
						
							| 
									
										
										
										
											2016-01-16 10:19:53 +02:00
										 |  |  | 		'users:joindate': '[[global:users]]', | 
					
						
							| 
									
										
										
										
											2016-02-03 15:17:42 +02:00
										 |  |  | 		'users:online': '[[global:online]]', | 
					
						
							|  |  |  | 		'users:banned': '[[user:banned]]' | 
					
						
							| 
									
										
										
										
											2015-09-11 23:14:03 -04:00
										 |  |  | 	}; | 
					
						
							| 
									
										
										
										
											2015-09-16 14:45:39 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	var breadcrumbs = [{text: setToCrumbs[set]}]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (set !== 'users:joindate') { | 
					
						
							|  |  |  | 		breadcrumbs.unshift({text: '[[global:users]]', url: '/users'}); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-16 10:19:53 +02:00
										 |  |  | 	page = parseInt(page, 10) || 1; | 
					
						
							|  |  |  | 	var resultsPerPage = parseInt(meta.config.userSearchResultsPerPage, 10) || 20; | 
					
						
							|  |  |  | 	var start = Math.max(0, page - 1) * resultsPerPage; | 
					
						
							|  |  |  | 	var stop = start + resultsPerPage - 1; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	usersController.getUsersAndCount(set, uid, start, stop, function(err, data) { | 
					
						
							| 
									
										
										
										
											2015-01-12 15:57:45 -05:00
										 |  |  | 		if (err) { | 
					
						
							| 
									
										
										
										
											2016-01-16 10:19:53 +02:00
										 |  |  | 			return callback(err); | 
					
						
							| 
									
										
										
										
											2015-01-12 15:57:45 -05:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2015-09-16 14:45:39 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-16 10:19:53 +02:00
										 |  |  | 		var pageCount = Math.ceil(data.count / resultsPerPage); | 
					
						
							| 
									
										
										
										
											2015-01-12 15:57:45 -05:00
										 |  |  | 		var userData = { | 
					
						
							| 
									
										
										
										
											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, | 
					
						
							| 
									
										
										
										
											2016-01-16 10:19:53 +02:00
										 |  |  | 			pagination: pagination.create(page, pageCount), | 
					
						
							| 
									
										
										
										
											2015-09-11 23:14:03 -04:00
										 |  |  | 			title: setToTitles[set] || '[[pages:users/latest]]', | 
					
						
							| 
									
										
										
										
											2015-09-16 14:45:39 -04:00
										 |  |  | 			breadcrumbs: helpers.buildBreadcrumbs(breadcrumbs) | 
					
						
							| 
									
										
										
										
											2015-01-12 15:57:45 -05:00
										 |  |  | 		}; | 
					
						
							| 
									
										
										
										
											2015-08-06 16:38:20 -04:00
										 |  |  | 		userData['route_' + set] = true; | 
					
						
							| 
									
										
										
										
											2016-02-03 15:17:42 +02:00
										 |  |  | 		userData.setName = set; | 
					
						
							| 
									
										
										
										
											2016-01-16 10:19:53 +02:00
										 |  |  | 		callback(null, userData); | 
					
						
							| 
									
										
										
										
											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) { | 
					
						
							| 
									
										
										
										
											2016-01-16 10:19:53 +02:00
										 |  |  | 			if (set === 'users:online') { | 
					
						
							|  |  |  | 				var now = Date.now(); | 
					
						
							|  |  |  | 				db.sortedSetCount('users:online', now - 300000, now, next); | 
					
						
							| 
									
										
										
										
											2016-02-03 15:17:42 +02:00
										 |  |  | 			} else if (set === 'users:banned') { | 
					
						
							|  |  |  | 				db.sortedSetCard('users:banned', next); | 
					
						
							| 
									
										
										
										
											2016-01-16 10:19:53 +02:00
										 |  |  | 			} else { | 
					
						
							|  |  |  | 				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
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-04 18:01:45 -04:00
										 |  |  | function render(req, res, data, next) { | 
					
						
							| 
									
										
										
										
											2016-02-03 15:17:42 +02:00
										 |  |  | 	plugins.fireHook('filter:users.build', {req: req, res: res, templateData: data }, function(err, data) { | 
					
						
							| 
									
										
										
										
											2015-05-04 18:01:45 -04:00
										 |  |  | 		if (err) { | 
					
						
							|  |  |  | 			return next(err); | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2015-09-11 23:14:03 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-11-28 15:33:17 -07:00
										 |  |  | 		var registrationType = meta.config.registrationType; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		data.templateData.maximumInvites = meta.config.maximumInvites; | 
					
						
							|  |  |  | 		data.templateData.inviteOnly = registrationType === 'invite-only' || registrationType === 'admin-invite-only'; | 
					
						
							| 
									
										
										
										
											2015-11-28 15:38:17 -07:00
										 |  |  | 		data.templateData.adminInviteOnly = registrationType === 'admin-invite-only'; | 
					
						
							| 
									
										
										
										
											2015-11-28 15:33:17 -07:00
										 |  |  | 		data.templateData['reputation:disabled'] = parseInt(meta.config['reputation:disabled'], 10) === 1; | 
					
						
							| 
									
										
										
										
											2015-11-27 16:55:31 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		user.getInvitesNumber(req.uid, function(err, num) { | 
					
						
							|  |  |  | 			if (err) { | 
					
						
							|  |  |  | 				return next(err); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			data.templateData.invites = num; | 
					
						
							|  |  |  | 			res.render('users', data.templateData); | 
					
						
							|  |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2015-05-04 18:01:45 -04:00
										 |  |  | 	}); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-04-10 20:31:57 +01:00
										 |  |  | module.exports = usersController; |