Example #1
0
        private RoomState GetRoomState(string roomName)
        {
            var room = roomRepository.GetByName(roomName);

            if (room == null)
            {
                return(null);
            }

            var stateFromDb = new RoomState(roomName);

            stateFromDb.AddId(room.Id);

            var visitors = visitRepository.Get(room.Id);

            if (visitors == null || !visitors.Any())
            {
                return(stateFromDb);
            }

            visitors.ForEach(visitor =>
            {
                var userSubscriber = userRepository.GetById(visitor.UserId.Value);
                stateFromDb.AddSubscriber(new RoomSubscription {
                    Subscriber = userSubscriber.Name, LastVisit = visitor.LastVisitTimeStamp.Value
                });
            });

            return(stateFromDb);
        }
Example #2
0
        private UserState GetUserState(string userName)
        {
            var user = userRepository.GetByName(userName);

            if (user == null)
            {
                return(null);
            }

            var stateFromDb = new UserState(userName);

            stateFromDb.SetId(user.Id);

            if (user.LastRoomId.HasValue)
            {
                var room = roomRepository.GetById(user.LastRoomId.Value);
                stateFromDb.SetLastRoom(room);
            }
            return(stateFromDb);
        }
Example #3
0
        private KeyValuePair <User, Room> Subscribe(string roomName, string userName)
        {
            var commandHandled = Context
                                 .System
                                 .ActorSelection(pathResolver.GetRoomDispatcherPath())
                                 .Ask <CommandHandled>(new Messages.Subscribe(roomName, userName))
                                 .Result;

            Context.System.EventStream.Publish(new ChangeCurrentRoom(roomName));

            var user = userRepository.GetByName(userName);
            var room = roomRepository.GetByName(roomName);

            userState.SetLastRoom(room);
            user.LastRoomId = room.Id;
            userRepository.Update(user);

            return(new KeyValuePair <User, Room>(user, room));
        }
Example #4
0
        private void HandleSubscribe(Messages.Subscribe evt)
        {
            var user = userRepository.GetByName(evt.UserName);

            if (roomState.Subscribers.Any(s => s.Subscriber == evt.UserName))
            {
                var estimatedSubscriber = roomState.Subscribers.First(v => v.Subscriber == evt.UserName);
                var messages            = messageRepository.GetMessages(roomState.Id, estimatedSubscriber.LastVisit);
                if (messages == null || !messages.Any())
                {
                    HandleUpdateSubscription(user.Id, roomState.Id, DateTime.Now, estimatedSubscriber);

                    Sender.Tell(new CommandHandled(true), Self);
                    return;
                }

                var maxTimeStamp = messages.Max(m => m.TimeStamp);

                HandleUpdateSubscription(user.Id, roomState.Id, maxTimeStamp, estimatedSubscriber);

                Sender.Tell(new CommandHandled(true), Self);

                messages.ForEach(msg =>
                {
                    Context.System.EventStream.Publish(new DisplayMessages(new TextMessage[]
                    {
                        new TextMessage
                        {
                            RoomId    = msg.RoomId,
                            RoomName  = roomState.RoomName,
                            UserId    = msg.UserId,
                            UserName  = msg.UserName,
                            Text      = msg.Text,
                            TimeStamp = msg.TimeStamp
                        }
                    }));
                });
                return;
            }

            var unreadedMessages = messageRepository.GetMessages(roomState.Id, DateTime.Now.AddDays(-2d));

            if (unreadedMessages != null && unreadedMessages.Any())
            {
                HandleCreateSubscription(user.Id, evt.UserName, roomState.Id, unreadedMessages.Max(m => m.TimeStamp));
                Sender.Tell(new CommandHandled(true), Self);
                unreadedMessages.ForEach(msg =>
                {
                    Context.System.EventStream.Publish(new DisplayMessages(new TextMessage[]
                    {
                        new TextMessage
                        {
                            RoomId    = msg.RoomId,
                            RoomName  = roomState.RoomName,
                            UserId    = msg.UserId,
                            UserName  = msg.UserName,
                            Text      = msg.Text,
                            TimeStamp = msg.TimeStamp
                        }
                    }));
                });
                return;
            }
            else
            {
                HandleCreateSubscription(user.Id, evt.UserName, roomState.Id, DateTime.Now);
            }

            Sender.Tell(new CommandHandled(true), Self);

            return;
        }