check for online/offline users, added custom redis sismembers method, fix for category view not showing up if it has no topics

v1.18.x
psychobunny 12 years ago
parent 03fcbcb051
commit ab492f147f

@ -722,4 +722,15 @@ body .navbar .nodebb-inline-block {
max-width:200px;
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,

@ -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 = [];

@ -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);
});

Loading…
Cancel
Save