mirror of
https://github.com/NodeBB/NodeBB.git
synced 2025-11-02 20:16:04 +01:00
user.isOnline fix
wont hit db on every user socket connect or user disconnect
This commit is contained in:
@@ -12,7 +12,6 @@ var SocketIO = require('socket.io'),
|
||||
|
||||
db = require('../database'),
|
||||
user = require('../user'),
|
||||
socketUser = require('./user'),
|
||||
topics = require('../topics'),
|
||||
logger = require('../logger'),
|
||||
meta = require('../meta'),
|
||||
@@ -59,9 +58,9 @@ function onMessage(msg) {
|
||||
onlineUsersMap[msg.uid] -= 1;
|
||||
onlineUsersMap[msg.uid] = Math.max(0, onlineUsersMap[msg.uid]);
|
||||
}
|
||||
|
||||
var index = 0;
|
||||
if (msg.uid && onlineUsersMap[msg.uid] === 0) {
|
||||
var index = onlineUsers.indexOf(msg.uid);
|
||||
index = onlineUsers.indexOf(msg.uid);
|
||||
if (index !== -1) {
|
||||
onlineUsers.splice(index, 1);
|
||||
}
|
||||
@@ -162,7 +161,7 @@ Sockets.init = function(server) {
|
||||
|
||||
async.parallel({
|
||||
user: function(next) {
|
||||
user.getUserFields(uid, ['username', 'userslug', 'picture'], next);
|
||||
user.getUserFields(uid, ['username', 'userslug', 'picture', 'status'], next);
|
||||
},
|
||||
isAdmin: function(next) {
|
||||
user.isAdministrator(uid, next);
|
||||
@@ -180,9 +179,7 @@ Sockets.init = function(server) {
|
||||
uid: uid
|
||||
});
|
||||
|
||||
socketUser.isOnline(socket, uid, function(err, data) {
|
||||
socket.broadcast.emit('user.isOnline', err, data);
|
||||
});
|
||||
socket.broadcast.emit('event:user_status_change', {uid:uid, status: userData.user.status});
|
||||
});
|
||||
});
|
||||
} else {
|
||||
@@ -200,9 +197,10 @@ Sockets.init = function(server) {
|
||||
|
||||
if (uid && (!onlineUsersMap[uid] || onlineUsersMap[uid] <= 1)) {
|
||||
db.sortedSetRemove('users:online', uid, function(err) {
|
||||
socketUser.isOnline(socket, uid, function(err, data) {
|
||||
socket.broadcast.emit('user.isOnline', err, data);
|
||||
});
|
||||
if (err) {
|
||||
return winston.error(err.message);
|
||||
}
|
||||
socket.broadcast.emit('event:user_status_change', {uid: uid, status: 'offline'});
|
||||
});
|
||||
}
|
||||
|
||||
@@ -295,7 +293,8 @@ Sockets.uidInRoom = function(uid, room) {
|
||||
|
||||
Sockets.getSocketCount = function() {
|
||||
return Object.keys(socketIdToUid).length;
|
||||
}
|
||||
};
|
||||
|
||||
Sockets.getConnectedClients = function() {
|
||||
return onlineUsers;
|
||||
};
|
||||
|
||||
@@ -8,7 +8,8 @@ var async = require('async'),
|
||||
notifications = require('../notifications'),
|
||||
messaging = require('../messaging'),
|
||||
plugins = require('../plugins'),
|
||||
utils = require('./../../public/src/utils'),
|
||||
utils = require('../../public/src/utils'),
|
||||
websockets = require('./index'),
|
||||
meta = require('../meta'),
|
||||
SocketUser = {};
|
||||
|
||||
@@ -87,13 +88,20 @@ SocketUser.reset.commit = function(socket, data, callback) {
|
||||
}
|
||||
};
|
||||
|
||||
var tempCache = null; // temp, as always a false promise --psychobunny
|
||||
SocketUser.isOnline = function(socket, uid, callback) {
|
||||
if (tempCache) return callback(null, tempCache);
|
||||
|
||||
user.isOnline([uid], function(err, data) {
|
||||
tempCache = Array.isArray(data) ? data[0] : null;
|
||||
callback(err, tempCache);
|
||||
SocketUser.checkStatus = function(socket, uid, callback) {
|
||||
if (!socket.uid) {
|
||||
return callback('[[error:invalid-uid]]');
|
||||
}
|
||||
var online = websockets.isUserOnline(uid);
|
||||
if (!online) {
|
||||
return callback(null, 'offline');
|
||||
}
|
||||
user.getUserField(uid, 'status', function(err, status) {
|
||||
if (err) {
|
||||
return callback(err);
|
||||
}
|
||||
status = status || 'online';
|
||||
callback(null, status);
|
||||
});
|
||||
};
|
||||
|
||||
@@ -321,12 +329,19 @@ SocketUser.loadMore = function(socket, data, callback) {
|
||||
|
||||
|
||||
SocketUser.setStatus = function(socket, status, callback) {
|
||||
var server = require('./index');
|
||||
if (!socket.uid) {
|
||||
return callback(new Error('[[invalid-uid]]'));
|
||||
}
|
||||
user.setUserField(socket.uid, 'status', status, function(err) {
|
||||
SocketUser.isOnline(socket, socket.uid, function(err, data) {
|
||||
server.server.sockets.emit('user.isOnline', err, data);
|
||||
callback(err, data);
|
||||
});
|
||||
if (err) {
|
||||
return callback(err);
|
||||
}
|
||||
var data = {
|
||||
uid: socket.uid,
|
||||
status: status
|
||||
};
|
||||
websockets.server.sockets.emit('event:user_status_change', data);
|
||||
callback(null, data);
|
||||
});
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user