Exemple #1
0
        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);
        }
Exemple #2
0
        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>());
                    }
                }
            }
        }
Exemple #4
0
        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();
            }
        }