mirror of
https://github.com/NodeBB/NodeBB.git
synced 2025-11-01 19:46:01 +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;
|
||||
}
|
||||
}
|
||||
|
||||
.username-field {
|
||||
.icon-circle {
|
||||
font-size: 12px;
|
||||
color: green;
|
||||
}
|
||||
.icon-circle-blank {
|
||||
font-size: 12px;
|
||||
color: red;
|
||||
}
|
||||
}
|
||||
@@ -56,6 +56,8 @@ var ajaxify = {};
|
||||
callback();
|
||||
}
|
||||
|
||||
app.process_page();
|
||||
|
||||
jQuery('#content, #footer').fadeIn(200);
|
||||
}, url, template);
|
||||
|
||||
|
||||
@@ -278,6 +278,35 @@ var socket,
|
||||
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() {
|
||||
app.enter_room('global');
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
|
||||
|
||||
<!-- 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="post-block">
|
||||
<a class="main-avatar" href="/users/{main_posts.username}">
|
||||
@@ -37,7 +37,7 @@
|
||||
|
||||
<hr />
|
||||
<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>
|
||||
</small>
|
||||
|
||||
@@ -52,7 +52,7 @@
|
||||
<!-- END main_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">
|
||||
<!--<i class="icon-spinner icon-spin icon-2x pull-left"></i>-->
|
||||
<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 class="post_reply"><i class="icon-reply"></i></div>
|
||||
</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}"><i class="icon-edit visible-phone" title="edited by {posts.editor} {posts.relativeEditTime} ago"></i></span>
|
||||
</div>
|
||||
@@ -272,6 +272,7 @@
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
$('.post-container').delegate('.edit', 'click', function(e) {
|
||||
var pid = ($(this).attr('id') || $(this.parentNode).attr('id')).split('_')[1];
|
||||
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',
|
||||
'api:posts.favourite'
|
||||
]);
|
||||
|
||||
socket.on('api:get_users_in_room', function(users) {
|
||||
var anonymous = users.anonymous,
|
||||
usernames = users.usernames,
|
||||
|
||||
17
src/redis.js
17
src/redis.js
@@ -3,7 +3,8 @@
|
||||
ERROR_LOGS = true,
|
||||
|
||||
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);
|
||||
@@ -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));
|
||||
@@ -72,6 +72,15 @@ marked.setOptions({
|
||||
callback(false);
|
||||
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];
|
||||
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 = {
|
||||
get_record : function(socket) {
|
||||
|
||||
@@ -48,6 +48,7 @@ var SocketIO = require('socket.io').listen(global.server,{log:false}),
|
||||
var hs = socket.handshake;
|
||||
|
||||
var uid = users[hs.sessionID];
|
||||
user.go_online(uid);
|
||||
|
||||
|
||||
/*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.on('disconnect', function() {
|
||||
user.go_offline(uid);
|
||||
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);
|
||||
});
|
||||
|
||||
socket.on('api:user.get_online_users', function(data) {
|
||||
user.get_online_users(socket, data);
|
||||
});
|
||||
|
||||
socket.on('api:topics.post', function(data) {
|
||||
topics.post(socket, uid, data.title, data.content, data.category_id);
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user