private async Task <bool> ProcessMessage(IMessage message, NetworkStream stream) { if (message is ConnectRequestMessage) { var connectRequestMessage = message as ConnectRequestMessage; var newMsg = new NewUserOnlineMessage() { UserId = connectRequestMessage.UserId }; _clientWriter.WriteMessageToAllClients(newMsg); var existingConn = _clientsHolder.ClientConnections.FirstOrDefault(c => c.UserId == newMsg.UserId); if (existingConn != null) { _clientDisconnector.UserDisconnected((ushort)existingConn.UserId); } var connection = new ClientConnection(connectRequestMessage.UserId, stream); await NotifyNewUserOfOtherConnections(connection); _clientsHolder.ClientConnections.Add(connection); System.Console.WriteLine("Client joined with ID: " + connectRequestMessage.UserId); return(true); } return(false); }
private async Task NotifyNewUserOfOtherConnections(IClientConnection connection) { await Task.Run(async() => { var connections = _clientsHolder.ClientConnections.TakeCopy(); foreach (var conn in connections) { Console.WriteLine("notfying new user: "******" about existing user: " + conn.UserId); var msg = new NewUserOnlineMessage { UserId = (ushort)conn.UserId }; await _networkDataService.WriteAndEncodeMessageWithHeader(msg, connection.Stream); } }); }
private async Task NewUserOnline(NewUserOnlineMessage newUserOnlineMessage) { using (var uow = new UnitOfWork(new SocketDbContext())) { var user = await uow.SocketUserRepo.SingleOrDefaultAsync(u => u.Id == newUserOnlineMessage.UserId); if (user != null) { System.Windows.Application.Current.Dispatcher.Invoke(() => { AddUser(user); }); if (!_chatManager.Chats.ContainsKey(user.Id)) { _chatManager.Chats.Add(user.Id, new List <ChatMessageModel>()); } } } }
public async Task <IMessage> ReadAndDecodeMessage(Header header, NetworkStream networkStream) { byte[] dataBuffer = new byte[header.MessageSize]; await networkStream.ReadAsync(dataBuffer, 0, dataBuffer.Length); Console.WriteLine("message type being read in network service: " + header.MessageType); var dataBufferList = dataBuffer.ToList(); switch (header.MessageType) { case MessageType.NotSet: return(null); case MessageType.Connect: return(ConnectRequestMessage.Decode(dataBufferList)); case MessageType.Chat: return(ChatMessage.Decode(dataBufferList)); case MessageType.Image: return(ImageMessage.Decode(dataBufferList)); case MessageType.NewUserOnline: return(NewUserOnlineMessage.Decode(dataBufferList)); case MessageType.UserLogoff: return(UserLogoffMessage.Decode(dataBufferList)); case MessageType.UserOffline: return(UserOfflineMessage.Decode(dataBufferList)); case MessageType.Typing: return(UserTypingMessage.Decode(dataBufferList)); default: throw new ArgumentOutOfRangeException(); } }