mirror of
https://github.com/NodeBB/NodeBB.git
synced 2025-11-02 20:16:04 +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:
@@ -722,4 +722,15 @@ body .navbar .nodebb-inline-block {
|
|||||||
max-width:200px;
|
max-width:200px;
|
||||||
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