mirror of
				https://github.com/NodeBB/NodeBB.git
				synced 2025-11-03 20:45:58 +01:00 
			
		
		
		
	check for online/offline users, added custom redis sismembers method, fix for category view not showing up if it has no topics
This commit is contained in:
		@@ -723,3 +723,14 @@ body .navbar .nodebb-inline-block {
 | 
				
			|||||||
	  max-height:60px;
 | 
						  max-height:60px;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.username-field {
 | 
				
			||||||
 | 
						.icon-circle {
 | 
				
			||||||
 | 
							font-size: 12px;
 | 
				
			||||||
 | 
							color: green;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						.icon-circle-blank {
 | 
				
			||||||
 | 
							font-size: 12px;
 | 
				
			||||||
 | 
							color: red;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -56,6 +56,8 @@ var ajaxify = {};
 | 
				
			|||||||
					callback();
 | 
										callback();
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
				
 | 
									
 | 
				
			||||||
 | 
									app.process_page();
 | 
				
			||||||
 | 
									
 | 
				
			||||||
				jQuery('#content, #footer').fadeIn(200);
 | 
									jQuery('#content, #footer').fadeIn(200);
 | 
				
			||||||
			}, url, template);
 | 
								}, url, template);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -278,6 +278,35 @@ var socket,
 | 
				
			|||||||
		app.current_room = room;
 | 
							app.current_room = room;
 | 
				
			||||||
	};
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						app.process_page = function() {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							function populate_online_users() {
 | 
				
			||||||
 | 
								var uids = [];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								jQuery('.post-row').each(function() {
 | 
				
			||||||
 | 
									uids.push(this.getAttribute('data-uid'));
 | 
				
			||||||
 | 
								});
 | 
				
			||||||
 | 
								
 | 
				
			||||||
 | 
								socket.emit('api:user.get_online_users', uids);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							populate_online_users();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						socket.on('api:user.get_online_users', function(users) {
 | 
				
			||||||
 | 
							jQuery('.username-field').each(function() {
 | 
				
			||||||
 | 
								var uid = jQuery(this).parents('li').attr('data-uid');
 | 
				
			||||||
 | 
								
 | 
				
			||||||
 | 
								if (uid && jQuery.inArray(uid, users) !== -1) {
 | 
				
			||||||
 | 
									jQuery(this).prepend('<i class="icon-circle"></i>');
 | 
				
			||||||
 | 
								} else {
 | 
				
			||||||
 | 
									jQuery(this).prepend('<i class="icon-circle-blank"></i>');
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							});
 | 
				
			||||||
 | 
						});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	jQuery('document').ready(function() {
 | 
						jQuery('document').ready(function() {
 | 
				
			||||||
		app.enter_room('global');
 | 
							app.enter_room('global');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -12,7 +12,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	<!-- BEGIN main_posts -->
 | 
						<!-- BEGIN main_posts -->
 | 
				
			||||||
		<li class="row main-post" data-pid="{main_posts.pid}" data-deleted="{main_posts.deleted}">
 | 
							<li class="row post-row main-post" data-pid="{main_posts.pid}" data-uid="{main_posts.uid}" data-deleted="{main_posts.deleted}">
 | 
				
			||||||
			<div class="span12">
 | 
								<div class="span12">
 | 
				
			||||||
				<div class="post-block">
 | 
									<div class="post-block">
 | 
				
			||||||
					<a class="main-avatar" href="/users/{main_posts.username}">
 | 
										<a class="main-avatar" href="/users/{main_posts.username}">
 | 
				
			||||||
@@ -37,7 +37,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
					<hr />
 | 
										<hr />
 | 
				
			||||||
					<small>
 | 
										<small>
 | 
				
			||||||
						posted {main_posts.relativeTime} ago by <strong><a href="/users/{main_posts.username}">{main_posts.username}</a></strong>
 | 
											posted {main_posts.relativeTime} ago by <strong><a href="/users/{main_posts.username}" class="username-field">{main_posts.username}</a></strong>
 | 
				
			||||||
						<span class="{main_posts.edited-class}"><i class="icon-edit" title="edited by {main_posts.editor} {main_posts.relativeEditTime} ago"></i></span>
 | 
											<span class="{main_posts.edited-class}"><i class="icon-edit" title="edited by {main_posts.editor} {main_posts.relativeEditTime} ago"></i></span>
 | 
				
			||||||
					</small>
 | 
										</small>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -52,7 +52,7 @@
 | 
				
			|||||||
	<!-- END main_posts -->
 | 
						<!-- END main_posts -->
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	<!-- BEGIN posts -->
 | 
						<!-- BEGIN posts -->
 | 
				
			||||||
		<li class="row" data-pid="{posts.pid}" data-uid="{posts.uid}" data-deleted="{posts.deleted}">
 | 
							<li class="row post-row" data-pid="{posts.pid}" data-uid="{posts.uid}" data-deleted="{posts.deleted}">
 | 
				
			||||||
			<div class="span1 profile-image-block visible-desktop">
 | 
								<div class="span1 profile-image-block visible-desktop">
 | 
				
			||||||
				<!--<i class="icon-spinner icon-spin icon-2x pull-left"></i>-->
 | 
									<!--<i class="icon-spinner icon-spin icon-2x pull-left"></i>-->
 | 
				
			||||||
				<a href="/users/{posts.username}">
 | 
									<a href="/users/{posts.username}">
 | 
				
			||||||
@@ -72,7 +72,7 @@
 | 
				
			|||||||
							<div id="favs_{posts.pid}_{posts.uid}" class="favourite hidden-phone"><span class="post_rep_{posts.pid}">{posts.post_rep}</span><i class="{posts.fav_star_class}"></i></div>
 | 
												<div id="favs_{posts.pid}_{posts.uid}" class="favourite hidden-phone"><span class="post_rep_{posts.pid}">{posts.post_rep}</span><i class="{posts.fav_star_class}"></i></div>
 | 
				
			||||||
							<div class="post_reply"><i class="icon-reply"></i></div>
 | 
												<div class="post_reply"><i class="icon-reply"></i></div>
 | 
				
			||||||
						</span>
 | 
											</span>
 | 
				
			||||||
						<img class="hidden-desktop" src="{posts.gravatar}?s=10" align="left" /> posted by <strong><a href="/users/{posts.username}">{posts.username}</a></strong> {posts.relativeTime} ago
 | 
											<img class="hidden-desktop" src="{posts.gravatar}?s=10" align="left" /> posted by <strong><a class="username-field" href="/users/{posts.username}">{posts.username}</a></strong> {posts.relativeTime} ago
 | 
				
			||||||
						<span class="{posts.edited-class} hidden-phone">| last edited by <strong><a href="/users/{posts.editor}">{posts.editor}</a></strong> {posts.relativeEditTime} ago</span>
 | 
											<span class="{posts.edited-class} hidden-phone">| last edited by <strong><a href="/users/{posts.editor}">{posts.editor}</a></strong> {posts.relativeEditTime} ago</span>
 | 
				
			||||||
						<span class="{posts.edited-class}"><i class="icon-edit visible-phone" title="edited by {posts.editor} {posts.relativeEditTime} ago"></i></span>
 | 
											<span class="{posts.edited-class}"><i class="icon-edit visible-phone" title="edited by {posts.editor} {posts.relativeEditTime} ago"></i></span>
 | 
				
			||||||
					</div>
 | 
										</div>
 | 
				
			||||||
@@ -272,6 +272,7 @@
 | 
				
			|||||||
			}
 | 
								}
 | 
				
			||||||
		});
 | 
							});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		$('.post-container').delegate('.edit', 'click', function(e) {
 | 
							$('.post-container').delegate('.edit', 'click', function(e) {
 | 
				
			||||||
			var pid = ($(this).attr('id') || $(this.parentNode).attr('id')).split('_')[1];
 | 
								var pid = ($(this).attr('id') || $(this.parentNode).attr('id')).split('_')[1];
 | 
				
			||||||
			app.open_post_window('edit', "{topic_id}", "{topic_name}", pid);
 | 
								app.open_post_window('edit', "{topic_id}", "{topic_name}", pid);
 | 
				
			||||||
@@ -297,6 +298,7 @@
 | 
				
			|||||||
			'event:topic_moved', 'event:post_edited', 'event:post_deleted', 'event:post_restored',
 | 
								'event:topic_moved', 'event:post_edited', 'event:post_deleted', 'event:post_restored',
 | 
				
			||||||
			'api:posts.favourite'
 | 
								'api:posts.favourite'
 | 
				
			||||||
		]);
 | 
							]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		socket.on('api:get_users_in_room', function(users) {
 | 
							socket.on('api:get_users_in_room', function(users) {
 | 
				
			||||||
			var anonymous = users.anonymous,
 | 
								var anonymous = users.anonymous,
 | 
				
			||||||
				usernames = users.usernames,
 | 
									usernames = users.usernames,
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										17
									
								
								src/redis.js
									
									
									
									
									
								
							
							
						
						
									
										17
									
								
								src/redis.js
									
									
									
									
									
								
							@@ -3,7 +3,8 @@
 | 
				
			|||||||
		ERROR_LOGS = true,
 | 
							ERROR_LOGS = true,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		redis = require('redis'),
 | 
							redis = require('redis'),
 | 
				
			||||||
		config = require('../config.js');
 | 
							config = require('../config.js'),
 | 
				
			||||||
 | 
							utils = require('./utils.js');
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	RedisDB.exports = redis.createClient(config.redis.port, config.redis.host, config.redis.options);
 | 
						RedisDB.exports = redis.createClient(config.redis.port, config.redis.host, config.redis.options);
 | 
				
			||||||
@@ -22,4 +23,18 @@
 | 
				
			|||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/*
 | 
				
			||||||
 | 
						* A possibly more efficient way of doing multiple sismember calls
 | 
				
			||||||
 | 
						*/
 | 
				
			||||||
 | 
						RedisDB.exports.sismembers = function(key, needles, callback) {
 | 
				
			||||||
 | 
							var tempkey = key + ':temp:' + utils.generateUUID();
 | 
				
			||||||
 | 
							RedisDB.exports.sadd(tempkey, needles, function() {
 | 
				
			||||||
 | 
								RedisDB.exports.sinter(key, tempkey, function(err, data) {
 | 
				
			||||||
 | 
									RedisDB.exports.del(tempkey);
 | 
				
			||||||
 | 
									callback(err, data);
 | 
				
			||||||
 | 
								});
 | 
				
			||||||
 | 
							});
 | 
				
			||||||
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}(module));
 | 
					}(module));
 | 
				
			||||||
@@ -72,6 +72,15 @@ marked.setOptions({
 | 
				
			|||||||
					callback(false);
 | 
										callback(false);
 | 
				
			||||||
					return;
 | 
										return;
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
 | 
									if (tids.length == 0) {
 | 
				
			||||||
 | 
										callback({
 | 
				
			||||||
 | 
											'category_name' : category_id ? category_name : 'Recent',
 | 
				
			||||||
 | 
											'show_topic_button' : category_id ? 'show' : 'hidden',
 | 
				
			||||||
 | 
											'category_id': category_id || 0,
 | 
				
			||||||
 | 
											'topics': topics
 | 
				
			||||||
 | 
										});
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
									
 | 
				
			||||||
				active_usernames = replies[1];
 | 
									active_usernames = replies[1];
 | 
				
			||||||
				var topics = [];
 | 
									var topics = [];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										17
									
								
								src/user.js
									
									
									
									
									
								
							
							
						
						
									
										17
									
								
								src/user.js
									
									
									
									
									
								
							@@ -660,7 +660,22 @@ var config = require('../config.js'),
 | 
				
			|||||||
				}
 | 
									}
 | 
				
			||||||
			});
 | 
								});
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						User.get_online_users = function(socket, uids) {
 | 
				
			||||||
 | 
							RDB.sismembers('users:online', uids, function(err, data) {
 | 
				
			||||||
 | 
								socket.emit('api:user.get_online_users', data);
 | 
				
			||||||
 | 
							});		
 | 
				
			||||||
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						User.go_online = function(uid) {
 | 
				
			||||||
 | 
							RDB.sadd('users:online', uid);
 | 
				
			||||||
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						User.go_offline = function(uid) {
 | 
				
			||||||
 | 
							RDB.srem('users:online', uid);
 | 
				
			||||||
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	User.active = {
 | 
						User.active = {
 | 
				
			||||||
		get_record : function(socket) {
 | 
							get_record : function(socket) {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -48,6 +48,7 @@ var SocketIO = require('socket.io').listen(global.server,{log:false}),
 | 
				
			|||||||
		var hs = socket.handshake;
 | 
							var hs = socket.handshake;
 | 
				
			||||||
		
 | 
							
 | 
				
			||||||
		var uid = users[hs.sessionID];
 | 
							var uid = users[hs.sessionID];
 | 
				
			||||||
 | 
							user.go_online(uid);
 | 
				
			||||||
		
 | 
							
 | 
				
			||||||
		
 | 
							
 | 
				
			||||||
		/*process.on('uncaughtException', function(err) {
 | 
							/*process.on('uncaughtException', function(err) {
 | 
				
			||||||
@@ -59,6 +60,7 @@ var SocketIO = require('socket.io').listen(global.server,{log:false}),
 | 
				
			|||||||
		socket.emit('event:connect', {status: 1});
 | 
							socket.emit('event:connect', {status: 1});
 | 
				
			||||||
		
 | 
							
 | 
				
			||||||
		socket.on('disconnect', function() {
 | 
							socket.on('disconnect', function() {
 | 
				
			||||||
 | 
								user.go_offline(uid);
 | 
				
			||||||
      		delete users[hs.sessionID];
 | 
					      		delete users[hs.sessionID];
 | 
				
			||||||
   		});
 | 
					   		});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -154,6 +156,10 @@ var SocketIO = require('socket.io').listen(global.server,{log:false}),
 | 
				
			|||||||
			user.reset.commit(socket, data.code, data.password);
 | 
								user.reset.commit(socket, data.code, data.password);
 | 
				
			||||||
		});
 | 
							});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							socket.on('api:user.get_online_users', function(data) {
 | 
				
			||||||
 | 
								user.get_online_users(socket, data);
 | 
				
			||||||
 | 
							});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		socket.on('api:topics.post', function(data) {
 | 
							socket.on('api:topics.post', function(data) {
 | 
				
			||||||
			topics.post(socket, uid, data.title, data.content, data.category_id);
 | 
								topics.post(socket, uid, data.title, data.content, data.category_id);
 | 
				
			||||||
		});
 | 
							});
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user