user activity counter (bug present where all users register as same session? this isn't good....)

v1.18.x
Julian Lam 12 years ago
parent a085b7eb0a
commit 2a9c33b9f8

@ -28,7 +28,6 @@ var templates = {};
loadTemplates([
'header', 'footer', 'register', 'home',
'login', 'reset', 'reset_code', 'account_settings',
'logout',
'emails/reset', 'emails/reset_plaintext'
]);
}

@ -4,6 +4,7 @@
<!-- START Forum Info -->
<div id="footer" class="container" style="padding-top: 50px;">
<div class="alert alert-info">
<span id="active_users"></span><br />
<span id="number_of_users"></span><br />
<span id="latest_user"></span>
</div>
@ -13,7 +14,9 @@
<script type="text/javascript">
(function() {
var num_users = document.getElementById('number_of_users'),
latest_user = document.getElementById('latest_user');
latest_user = document.getElementById('latest_user'),
active_users = document.getElementById('active_users');
socket.emit('user.count', {});
socket.on('user.count', function(data) {
num_users.innerHTML = "We currently have <b>" + data.count + "</b> registered users.";
@ -22,6 +25,10 @@
socket.on('user.latest', function(data) {
latest_user.innerHTML = "The most recent user to register is <b>" + data.username + "</b>.";
});
socket.emit('api:user.active.get');
socket.on('api:user.active.get', function(data) {
active_users.innerHTML = 'There ' + (parseInt(data.users) !== 1 ? 'are' : 'is') + ' <strong>' + data.users + '</strong> user' + (parseInt(data.users) !== 1 ? 's' : '') + ' and <strong>' + data.anon + '</strong> guest' + (parseInt(data.anon) !== 1 ? 's' : '') + ' online';
});
}());
</script>
<!-- END Forum Info -->

@ -5,8 +5,8 @@
redis = require('redis'),
db = redis.createClient();
// todo (holy cow): append,auth,bgrewriteaof,bgsave,bitcount,bitop,blpop,brpop,brpoplpush,client kill,client list,client getname,client setname,config get,config set,config resetstat,dbsize,debug object,debug segfault,decrby,discard,dump,echo,eval,evalsha,exec,exists,expireat,flushall,flushdb,getbit,getrange,getset,hdel,hexists,hget,hgetall,hincrby,hincrbyfloat,hkeys,hlen,hmget,hmset,hset,hsetnx,hvals,incrby,incrbyfloat,info,keys,lastsave,lindex,linsert,llen,lpop,lpushx,lrem,lset,ltrim,migrate,monitor,move,mset,msetnx,object,persist,pexpire,pexpireat,ping,psetex,psubscribe,pttl,publish,punsubscribe,quit,randomkey,rename,renamenx,restore,rpop,rpoplpush,rpush,rpushx,sadd,save,scard,script exists,script flush,script kill,script load,sdiff,sdiffstore,select,setbit,setex,setnx,setrange,shutdown,sinter,sinterstore,sismember,slaveof,slowlog,smembers,smove,sort,spop,srandmember,srem,strlen,subscribe,sunion,sunionstore,sync,time,ttl,type,unsubscribe,unwatch,watch,zadd,zcard,zcount,zincrby,zinterstore,zrange,zrangebyscore,zrank,zrem,zremrangebyrank,zremrangebyscore,zrevrange,zrevrangebyscore,zrevrank,zscore,zunionstore
// done: get, set, incr, decr, del, mget, multi, expire, lpush, lrange
// todo (holy cow): append,auth,bgrewriteaof,bgsave,bitcount,bitop,blpop,brpop,brpoplpush,client kill,client list,client getname,client setname,config get,config set,config resetstat,dbsize,debug object,debug segfault,decrby,discard,dump,echo,eval,evalsha,exec,exists,expireat,flushall,flushdb,getbit,getrange,getset,hdel,hexists,hget,hgetall,hincrby,hincrbyfloat,hkeys,hlen,hmget,hmset,hset,hsetnx,hvals,incrby,incrbyfloat,info,lastsave,lindex,linsert,llen,lpop,lpushx,lrem,lset,ltrim,migrate,monitor,move,mset,msetnx,object,persist,pexpire,pexpireat,ping,psetex,psubscribe,pttl,publish,punsubscribe,quit,randomkey,rename,renamenx,restore,rpop,rpoplpush,rpush,rpushx,sadd,save,scard,script exists,script flush,script kill,script load,sdiff,sdiffstore,select,setbit,setex,setnx,setrange,shutdown,sinter,sinterstore,sismember,slaveof,slowlog,smembers,smove,sort,spop,srandmember,srem,strlen,subscribe,sunion,sunionstore,sync,time,ttl,type,unsubscribe,unwatch,watch,zadd,zcard,zcount,zincrby,zinterstore,zrange,zrangebyscore,zrank,zrem,zremrangebyrank,zremrangebyscore,zrevrange,zrevrangebyscore,zrevrank,zscore,zunionstore
// done: get, set, incr, decr, del, mget, multi, expire, lpush, lrange, keys
function return_handler(error, data, callback, error_handler) {
if (error !== null) {
@ -43,6 +43,12 @@
return db.multi();
}
RedisDB.keys = function(pattern, callback, error_handler) {
return db.keys(pattern, function(error, data) {
return_handler(error, data, callback, error_handler);
});
}
RedisDB.del = function(key, callback) {
db.del(key);
}

@ -225,4 +225,43 @@ var config = require('../config.js'),
});
}
}
User.active = {
get: function(callback) {
RDB.keys('active:*', function(active) {
var returnObj = {
users: 0,
anon: 0,
uids: []
},
keys = [];
for(var a in active) {
keys.push('sess:' + active[a].split(':')[1] + ':uid');
}
RDB.mget(keys, function(uids) {
for(var u in uids) {
if (uids[u] !== null) {
if (returnObj.uids.indexOf(uids[u]) === -1) {
returnObj.users++;
returnObj.uids.push(uids[u]);
}
} else {
returnObj.anon++;
}
}
if (callback === undefined) {
global.socket.emit('api:user.active.get', returnObj)
} else {
callback(returnObj);
}
});
});
},
register: function(sessionID) {
RDB.set('active:' + sessionID, 60*10); // Active state persists for 10 minutes
}
}
}(exports));

@ -43,6 +43,9 @@ var express = require('express'),
if (global.uid !== null) console.log('info: [Auth] uid ' + global.uid + ' found. Welcome back.');
else console.log('info: [Auth] No login session found.');
});
// (Re-)register the session as active
global.modules.user.active.register(req.sessionID);
} else {
console.log('info: [Auth] Ping from uid ' + global.uid);
}

@ -82,6 +82,10 @@ var SocketIO = require('socket.io').listen(global.server),
socket.on('api:topics.post', function(data) {
modules.topics.post(data.title, data.content);
});
socket.on('api:user.active.get', function() {
modules.user.active.get();
});
});
}(SocketIO));

Loading…
Cancel
Save