mirror of
https://github.com/NodeBB/NodeBB.git
synced 2026-01-15 03:52:46 +01:00
52 lines
1.6 KiB
JavaScript
52 lines
1.6 KiB
JavaScript
'use strict';
|
|
|
|
const db = require('../database');
|
|
const topics = require('../topics');
|
|
const plugins = require('../plugins');
|
|
const meta = require('../meta');
|
|
const utils = require('../utils');
|
|
|
|
module.exports = function (User) {
|
|
User.updateLastOnlineTime = async function (uid) {
|
|
if (utils.isNumber(uid) && !(parseInt(uid, 10) > 0)) {
|
|
return;
|
|
}
|
|
const userData = await db.getObjectFields(`user:${uid}`, ['userslug', 'status', 'lastonline']);
|
|
const now = Date.now();
|
|
if (!userData.userslug || userData.status === 'offline' || now - parseInt(userData.lastonline, 10) < 300000) {
|
|
return;
|
|
}
|
|
await User.setUserField(uid, 'lastonline', now);
|
|
};
|
|
|
|
User.updateOnlineUsers = async function (uid) {
|
|
if (!(parseInt(uid, 10) > 0)) {
|
|
return;
|
|
}
|
|
const [exists, userOnlineTime] = await Promise.all([
|
|
User.exists(uid),
|
|
db.sortedSetScore('users:online', uid),
|
|
]);
|
|
const now = Date.now();
|
|
if (!exists || (now - parseInt(userOnlineTime, 10) < 300000)) {
|
|
return;
|
|
}
|
|
await User.onUserOnline(uid, now);
|
|
topics.pushUnreadCount(uid);
|
|
};
|
|
|
|
User.onUserOnline = async (uid, timestamp) => {
|
|
await db.sortedSetAdd('users:online', timestamp, uid);
|
|
plugins.hooks.fire('action:user.online', { uid, timestamp });
|
|
};
|
|
|
|
User.isOnline = async function (uid) {
|
|
const now = Date.now();
|
|
const isArray = Array.isArray(uid);
|
|
uid = isArray ? uid : [uid];
|
|
const lastonline = await db.sortedSetScores('users:online', uid);
|
|
const isOnline = uid.map((uid, index) => (now - lastonline[index]) < (meta.config.onlineCutoff * 60000));
|
|
return isArray ? isOnline : isOnline[0];
|
|
};
|
|
};
|