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); }
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); }
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)); }
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; }