Profile pages now display user status.
This commit is contained in:
parent
6445950f90
commit
1384b02f4d
11 changed files with 119 additions and 5 deletions
|
|
@ -15,6 +15,7 @@ You should have received a copy of the GNU Affero General Public License
|
|||
along with this program. If not, see <https://www.gnu.org/licenses/>.*/
|
||||
|
||||
//local includes
|
||||
const server = require('../server');
|
||||
const userSchema = require('../schemas/user/userSchema');
|
||||
|
||||
//User activity map to keep us from constantly reading off of the DB
|
||||
|
|
@ -23,6 +24,64 @@ let activityMap = new Map();
|
|||
//How much difference between last write and now until we hit the DB again (in millis)
|
||||
//Defaults to two minutes
|
||||
const tolerance = 2 * (60 * 1000);
|
||||
//How long a user has to be in-active to be considered offline
|
||||
//Defaults to five minutes
|
||||
const offlineTimeout = 5 * (60 * 1000);
|
||||
|
||||
module.exports.getPresence = async function(user, userDB){
|
||||
//If we don't have a user
|
||||
if(user == null || user == '' || user == 'Tokebot'){
|
||||
//Drop that shit
|
||||
return;
|
||||
}
|
||||
|
||||
//Set status as offline
|
||||
let status = "Offline"
|
||||
//Attempt to pull from activity map to save on DB pull
|
||||
let activity = activityMap.get(user);
|
||||
//Pull current epoch in millis
|
||||
const now = new Date().getTime();
|
||||
|
||||
//If we couldn't find anything in RAM
|
||||
if(activity == null){
|
||||
//If we wheren't handed a free user doc
|
||||
if(userDB == null){
|
||||
//Pull one from the username
|
||||
userDB = await userSchema.userModel.findOne({user: user});
|
||||
}
|
||||
|
||||
//If for some reason we can't find a user doc
|
||||
if(userDB == null){
|
||||
//Bail with empty status object
|
||||
return {
|
||||
status,
|
||||
activeConnections: [],
|
||||
lastActive: 0
|
||||
}
|
||||
}
|
||||
|
||||
//Pull last active date from userDB
|
||||
activity = userDB.lastActive.getTime();
|
||||
}
|
||||
|
||||
//Pull active connections for user from the channel manager
|
||||
const activeConnections = server.channelManager.getConnections(user);
|
||||
|
||||
//If the user is connected to at least one channel
|
||||
if(activeConnections != null && activeConnections.length > 0){
|
||||
status = "Streaming";
|
||||
//Otherwise, if it's been five minutes
|
||||
}else if(now - activity < offlineTimeout){
|
||||
status = "Recently Active";
|
||||
}
|
||||
|
||||
//Assemble and return status object
|
||||
return {
|
||||
status,
|
||||
activeConnections,
|
||||
lastActive: activity
|
||||
}
|
||||
}
|
||||
|
||||
module.exports.presenceMiddleware = function(req, res, next){
|
||||
//Pull user from session
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue