|
@@ -6,6 +6,7 @@ const mongoose = require('mongoose');
|
|
const socket = require("socket.io");
|
|
const socket = require("socket.io");
|
|
const User = require('./db/models/User');
|
|
const User = require('./db/models/User');
|
|
const Message = require('./db/models/Message');
|
|
const Message = require('./db/models/Message');
|
|
|
|
+const PrivateMessage = require('./db/models/PrivateMessage')
|
|
const jwt = require('jsonwebtoken');
|
|
const jwt = require('jsonwebtoken');
|
|
const bcrypt = require('bcrypt');
|
|
const bcrypt = require('bcrypt');
|
|
require('dotenv').config(); // add dotnv for config
|
|
require('dotenv').config(); // add dotnv for config
|
|
@@ -201,14 +202,13 @@ io.use( async (socket, next) => {
|
|
const token = socket.handshake.auth.token;
|
|
const token = socket.handshake.auth.token;
|
|
const sockets = await io.fetchSockets();
|
|
const sockets = await io.fetchSockets();
|
|
if(!token) {
|
|
if(!token) {
|
|
- console.log('socket disconnect')
|
|
|
|
|
|
+ console.log('token error - socket disconnect')
|
|
socket.disconnect();
|
|
socket.disconnect();
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
|
|
|
|
const usersOnline = [];
|
|
const usersOnline = [];
|
|
sockets.map(sock => usersOnline.push(sock.user))
|
|
sockets.map(sock => usersOnline.push(sock.user))
|
|
-
|
|
|
|
|
|
|
|
try {
|
|
try {
|
|
const user = jwt.verify(token, TOKEN_KEY);
|
|
const user = jwt.verify(token, TOKEN_KEY);
|
|
@@ -239,19 +239,53 @@ io.on("connection", async (socket) => {
|
|
const userName = socket.user.userName;
|
|
const userName = socket.user.userName;
|
|
const sockets = await io.fetchSockets();
|
|
const sockets = await io.fetchSockets();
|
|
const dbUser = await getOneUser(userName);
|
|
const dbUser = await getOneUser(userName);
|
|
- const exist = sockets.find(current => current.user.userName == socket.user.userName)
|
|
|
|
- const usersOnline = sockets.map(sock => sock.user)
|
|
|
|
|
|
+ const allUsers = await getAllDbUsers(socket) // send allUsers from DB to socket user
|
|
|
|
+ //need to use this ID to socket privat messges
|
|
|
|
+
|
|
|
|
+ socket.emit('connected', dbUser); //socket.user
|
|
|
|
+ const usersInSocket = [];
|
|
|
|
+ for (let [id, socket] of io.of("/").sockets) {
|
|
|
|
+
|
|
|
|
+ const dbUser = await getOneUser(socket.user.userName)
|
|
|
|
+ usersInSocket.push({...dbUser._doc,socketId: id });
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+// const onUser = []
|
|
|
|
+// const usersOnlineID = usersOnline.map(users => Object.values(users)[0])
|
|
|
|
+// const userSet = new Set(usersOnlineID)
|
|
|
|
+// for (let id of userSet) {
|
|
|
|
+// const userFromDb = await User.findById(id)
|
|
|
|
+// onUser.push(userFromDb)
|
|
|
|
+// }
|
|
|
|
|
|
|
|
|
|
- const usersOnlineID = usersOnline.map(users => Object.values(users)[0])
|
|
|
|
- const userSet = new Set(usersOnlineID)
|
|
|
|
|
|
+//tasks
|
|
|
|
+// find private chats and send to users
|
|
|
|
|
|
- console.log(userSet)
|
|
|
|
|
|
+// if(socket.user){
|
|
|
|
+// const siPrivate = await PrivateMessage.find({toUser: socket.user.id})
|
|
|
|
+// console.log(!!siPrivate)
|
|
|
|
+// }
|
|
|
|
|
|
|
|
+ io.emit('usersOnline', usersInSocket); // send array online users
|
|
|
|
|
|
- io.emit('usersOnline', usersOnline); // send array online users
|
|
|
|
|
|
+ dbUser.populate({path:'friends'}).then(res => socket.emit('friends',res.friends))
|
|
|
|
+
|
|
|
|
+ //send private chats for user
|
|
|
|
+
|
|
|
|
+ const privateChats = await PrivateMessage.find( {$or:[ {toUser: dbUser._id}, {fromUser: dbUser._id }],foreignField: '_id'}).populate( ['fromUser','toUser'])//need to optimal way found
|
|
|
|
+
|
|
|
|
+ const myChats = []
|
|
|
|
+// privateChats.map((item, i) => {
|
|
|
|
+// console.log(item)
|
|
|
|
+
|
|
|
|
+// })
|
|
|
|
+///
|
|
|
|
+// console.log(myChats)
|
|
|
|
+ //console.log(privateChats)
|
|
|
|
+
|
|
|
|
+socket.emit('my chats', privateChats)
|
|
|
|
|
|
- socket.emit('connected', dbUser); //socket.user
|
|
|
|
|
|
|
|
if(socket.user.isAdmin){
|
|
if(socket.user.isAdmin){
|
|
getAllDbUsers(socket);
|
|
getAllDbUsers(socket);
|
|
@@ -307,7 +341,7 @@ io.on("connection", async (socket) => {
|
|
const filteredUsersOnline = usersOnline.filter(user => exist.user.id !== user.id)
|
|
const filteredUsersOnline = usersOnline.filter(user => exist.user.id !== user.id)
|
|
|
|
|
|
|
|
|
|
- socket.emit('usersOnline', filteredUsersOnline);
|
|
|
|
|
|
+ // io.emit('usersOnline', filteredUsersOnline);
|
|
|
|
|
|
// const sockets = await io.fetchSockets();
|
|
// const sockets = await io.fetchSockets();
|
|
// io.emit('usersOnline', sockets.map(sock => sock.user));
|
|
// io.emit('usersOnline', sockets.map(sock => sock.user));
|
|
@@ -315,6 +349,7 @@ io.on("connection", async (socket) => {
|
|
|
|
|
|
});
|
|
});
|
|
console.log(`user :${socket.user.userName} , connected to socket`);
|
|
console.log(`user :${socket.user.userName} , connected to socket`);
|
|
|
|
+
|
|
socket.on("muteUser",async (data) => {
|
|
socket.on("muteUser",async (data) => {
|
|
if(!socket.user.isAdmin){
|
|
if(!socket.user.isAdmin){
|
|
return;
|
|
return;
|
|
@@ -333,13 +368,123 @@ io.on("connection", async (socket) => {
|
|
// }
|
|
// }
|
|
});
|
|
});
|
|
|
|
|
|
- socket.on('privat', (data) => {
|
|
|
|
- console.log(data)
|
|
|
|
-
|
|
|
|
- })
|
|
|
|
|
|
|
|
|
|
+ socket.on('privat chat', async (data) => {
|
|
|
|
+ //find user to in Db
|
|
|
|
+ const privateMessagesToUser = await PrivateMessage.find({toUser: {$in:[data.user._id, data.toUser._id]}, fromUser: {$in:[data.user._id, data.toUser._id]}}).sort({ 'createDate': 1 })
|
|
|
|
+ //find user from in db
|
|
|
|
+ //compare users and if messages is - send
|
|
|
|
+ socket.emit('send privat messages', privateMessagesToUser)
|
|
|
|
+
|
|
|
|
+ })
|
|
|
|
|
|
|
|
+ socket.on("private message", async ({ fromUser, from, message, toUser , to}) => {
|
|
|
|
+//create message and save to DB
|
|
|
|
+ const privateMessage = new PrivateMessage({
|
|
|
|
+ text: message,
|
|
|
|
+ createDate: Date.now(),
|
|
|
|
+ fromUser,
|
|
|
|
+ toUser
|
|
|
|
+ });
|
|
|
|
+ await privateMessage.save()
|
|
|
|
+ //emit event
|
|
|
|
+
|
|
|
|
+ const privateMessageSentUser = await User.find({_id: fromUser }) // send from user what messaged
|
|
|
|
+ // const privateMessagesToUser = await PrivateMessage.find({toUser: {$in:[fromUser._id, toUser._id]}, fromUser: {$in:[fromUser._id,toUser._id]}}).sort({ 'createDate': 1 })
|
|
|
|
+ socket.to(toUser?.socketId).emit('private', {...privateMessage._doc, sender: privateMessageSentUser });
|
|
|
|
+ //socket.to(fromUser?.socketId).emit('private', {...privateMessage._doc, sender: privateMessageSentUser });
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+// fix time start and messages after private
|
|
|
|
+
|
|
|
|
+//********EXEMPLE DOCUMENTATION
|
|
|
|
+
|
|
|
|
+// Persistent messages
|
|
|
|
+// On the server-side (server/index.js), we now persist the message in our new store:
|
|
|
|
+
|
|
|
|
+// io.on("connection", (socket) => {
|
|
|
|
+// // ...
|
|
|
|
+// socket.on("private message", ({ content, to }) => {
|
|
|
|
+// const message = {
|
|
|
|
+// content,
|
|
|
|
+// from: socket.userID,
|
|
|
|
+// to,
|
|
|
|
+// };
|
|
|
|
+// socket.to(to).to(socket.userID).emit("private message", message);
|
|
|
|
+// messageStore.saveMessage(message);
|
|
|
|
+// });
|
|
|
|
+// // ...
|
|
|
|
+// });
|
|
|
|
+
|
|
|
|
+// And we fetch the list of messages upon connection:
|
|
|
|
+
|
|
|
|
+// io.on("connection", (socket) => {
|
|
|
|
+// // ...
|
|
|
|
+// const users = [];
|
|
|
|
+// const messagesPerUser = new Map();
|
|
|
|
+// messageStore.findMessagesForUser(socket.userID).forEach((message) => {
|
|
|
|
+// const { from, to } = message;
|
|
|
|
+// const otherUser = socket.userID === from ? to : from;
|
|
|
|
+// if (messagesPerUser.has(otherUser)) {
|
|
|
|
+// messagesPerUser.get(otherUser).push(message);
|
|
|
|
+// } else {
|
|
|
|
+// messagesPerUser.set(otherUser, [message]);
|
|
|
|
+// }
|
|
|
|
+// });
|
|
|
|
+// sessionStore.findAllSessions().forEach((session) => {
|
|
|
|
+// users.push({
|
|
|
|
+// userID: session.userID,
|
|
|
|
+// username: session.username,
|
|
|
|
+// connected: session.connected,
|
|
|
|
+// messages: messagesPerUser.get(session.userID) || [],
|
|
|
|
+// });
|
|
|
|
+// });
|
|
|
|
+// socket.emit("users", users);
|
|
|
|
+// // ...
|
|
|
|
+// });
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+//*********** PRIVAT EXEMPLE */
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ //add send messages to myself socket.emit('send privat messages', privateMessagesToUser)
|
|
|
|
+
|
|
|
|
+ // //send new messages array to user
|
|
|
|
+
|
|
|
|
+ // const privateMessagesToUser = await PrivateMessage.find({toUser: {$in:[fromUser._id, toUser._id]}, fromUser: {$in:[fromUser._id, toUser._id]}}).sort({ 'createDate': 1 })
|
|
|
|
+
|
|
|
|
+ //socket.emit('private', {privateMessageSentUser, fromUser})
|
|
|
|
+
|
|
|
|
+ });
|
|
|
|
+
|
|
|
|
+//add and remove friends functions
|
|
|
|
+
|
|
|
|
+ socket.on('addToFriends', async (data) => {
|
|
|
|
+ const isFriend = await User.find({userName:userName,friends: {'_id':data.user._id}})
|
|
|
|
+ if(!!isFriend.length){
|
|
|
|
+ await User.findOneAndUpdate({userName: userName},{$set: {'friends': []}}, {new: true })
|
|
|
|
+ }
|
|
|
|
+ await dbUser.friends.push({'_id':data.user._id})
|
|
|
|
+ await dbUser.save()
|
|
|
|
+ await User.findOne({userName}).populate({path:'friends'}).then(res => socket.emit('friends',res.friends) )
|
|
|
|
+
|
|
|
|
+ })
|
|
|
|
+
|
|
|
|
+ //need to fix - removed all users from frend only clicked not removed
|
|
|
|
+
|
|
|
|
+ socket.on('removeFromFriends', async(user) => {
|
|
|
|
+ const res = await User.updateOne({ userName}, {
|
|
|
|
+ $pullAll: {
|
|
|
|
+ friends: [{_id: user.user._id}],
|
|
|
|
+ },
|
|
|
|
+ });
|
|
|
|
+ await User.findOne({userName}).populate({path:'friends'}).then(res => socket.emit('friends',res.friends))
|
|
|
|
+
|
|
|
|
+ })
|
|
|
|
|
|
|
|
+//admin functions
|
|
|
|
+
|
|
socket.on("banUser",async (data) => {
|
|
socket.on("banUser",async (data) => {
|
|
if(!socket.user.isAdmin){
|
|
if(!socket.user.isAdmin){
|
|
return;
|
|
return;
|
|
@@ -359,11 +504,16 @@ io.on("connection", async (socket) => {
|
|
// }
|
|
// }
|
|
});
|
|
});
|
|
|
|
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
socket.on('userWriting', async () => {
|
|
socket.on('userWriting', async () => {
|
|
let isTyping = true;
|
|
let isTyping = true;
|
|
io.emit('writing', {userName, isTyping})
|
|
io.emit('writing', {userName, isTyping})
|
|
})
|
|
})
|
|
|
|
|
|
|
|
+// edit and remove messages
|
|
|
|
+
|
|
socket.on('editmessage', async (data) => {
|
|
socket.on('editmessage', async (data) => {
|
|
console.log(data.messageNewText)
|
|
console.log(data.messageNewText)
|
|
const user = jwt.verify(data.token, TOKEN_KEY)
|
|
const user = jwt.verify(data.token, TOKEN_KEY)
|