mirror of
https://github.com/NodeBB/NodeBB.git
synced 2025-11-01 11:35:55 +01:00
user activity counter (bug present where all users register as same session? this isn't good....)
This commit is contained in:
@@ -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 -->
|
||||
|
||||
10
src/redis.js
10
src/redis.js
@@ -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);
|
||||
}
|
||||
|
||||
39
src/user.js
39
src/user.js
@@ -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));
|
||||
|
||||
Reference in New Issue
Block a user