74 lines
2.1 KiB
JavaScript
74 lines
2.1 KiB
JavaScript
|
'use strict'
|
||
|
const UserChildUtils = use('App/Utils/UserChildUtils');
|
||
|
const connectedUsers = {
|
||
|
|
||
|
};
|
||
|
|
||
|
class UserChannelController {
|
||
|
constructor({socket, request, auth}) {
|
||
|
console.log(`User #${auth.user.id} connected`);
|
||
|
this.socket = socket;
|
||
|
this.request = request;
|
||
|
this.user = auth.user;
|
||
|
connectedUsers[this.user.id] = this;
|
||
|
this.notifyOnConnection(true).catch(console.error);
|
||
|
// socket.on('close', this.onClose.bind(this))
|
||
|
}
|
||
|
onClose() {
|
||
|
this.notifyOnConnection(false)
|
||
|
.then(_ => {
|
||
|
delete connectedUsers[this.user.id];
|
||
|
})
|
||
|
.catch(console.error);
|
||
|
}
|
||
|
emit(event, data) {
|
||
|
this.socket.emit(event, data);
|
||
|
}
|
||
|
|
||
|
static getUserChannel(userId) {
|
||
|
return connectedUsers[userId];
|
||
|
}
|
||
|
static isUserOnline(userId) {
|
||
|
return !!UserChannelController.getUserChannel(userId);
|
||
|
}
|
||
|
async notifyOnConnection(online) {
|
||
|
this.user.last_logged_in = new Date();
|
||
|
try {
|
||
|
await this.user.save();
|
||
|
} catch (e) {
|
||
|
console.error(e);
|
||
|
}
|
||
|
const userConnections =
|
||
|
await UserChildUtils.getUserConnections(this.user.id);
|
||
|
const notifiedIds = [];
|
||
|
for (const child of userConnections.children) {
|
||
|
for (const user of child.connections) {
|
||
|
const channel = UserChannelController.getUserChannel(user.id);
|
||
|
if (channel && notifiedIds.indexOf(user.id) < 0 &&
|
||
|
user.id != this.user.id) {
|
||
|
/// connection:online
|
||
|
channel.emit(
|
||
|
`connection:${online ? 'online' : 'offline'}`,
|
||
|
this.user.toJSON());
|
||
|
notifiedIds.push(user.id);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
for (const child of userConnections.connections) {
|
||
|
for (const user of child.connections) {
|
||
|
const channel = UserChannelController.getUserChannel(user.id);
|
||
|
if (channel && notifiedIds.indexOf(user.id) < 0 &&
|
||
|
user.id != this.user.id) {
|
||
|
channel.emit(
|
||
|
`connection:${online ? 'online' : 'offline'}`,
|
||
|
this.user.toJSON());
|
||
|
notifiedIds.push(user.id);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
return true;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
module.exports = UserChannelController
|