public MessageViewModel(ChatMessage message)
 {
     Id = message.Id;
     Content = message.Content;
     User = new UserViewModel(message.User);
     When = message.When;
 }
Esempio n. 2
0
 public MessageViewModel(ChatMessage message, ChatRoom room)
 {
     Id = message.Id;
     Content = message.Content;
     User = new UserViewModel(message.User);
     When = message.When;
     Room = room.Name;
 }
Esempio n. 3
0
        public void Send(string content)
        {
            if (OldVersion) {
                throw new InvalidOperationException("Chat was just updated, please refresh you browser and rejoin " + Caller.room);
            }

            UpdateActivity();

            content = Sanitizer.GetSafeHtmlFragment(content);

            if (TryHandleCommand(content)) {
                return;
            }

            string roomName = Caller.room;
            string name = Caller.name;

            EnsureUserAndRoom();

            HashSet<string> links;
            var messageText = Transform(content, out links);
            var chatMessage = new ChatMessage(_users[name], messageText);

            _rooms[roomName].Messages.Add(chatMessage);

            Clients[roomName].addMessage(chatMessage.Id,
                                         chatMessage.User,
                                         chatMessage.Content,
                                         chatMessage.WhenFormatted);

            if (links.Any()) {
                // REVIEW: is this safe to do? We're holding on to this instance
                // when this should really be a fire and forget.
                var contentTasks = links.Select(ExtractContent).ToArray();
                Task.Factory.ContinueWhenAll(contentTasks, tasks => {
                    foreach (var task in tasks) {
                        if (task.IsFaulted) {
                            Trace.TraceError(task.Exception.GetBaseException().Message);
                            continue;
                        }

                        if (String.IsNullOrEmpty(task.Result)) {
                            continue;
                        }

                        // Try to get content from each url we're resolved in the query
                        string extractedContent = "<p>" + task.Result + "</p>";

                        // If we did get something, update the message and notify all clients
                        chatMessage.Content += extractedContent;

                        Clients[roomName].addMessageContent(chatMessage.Id, extractedContent);
                    }
                });
            }
        }
Esempio n. 4
0
        private void ProcessUrls(IEnumerable<string> links, ChatRoom chatRoom, ChatMessage chatMessage)
        {
            // REVIEW: is this safe to do? We're holding on to this instance
            // when this should really be a fire and forget.
            var contentTasks = links.Select(ExtractContent).ToArray();
            Task.Factory.ContinueWhenAll(contentTasks, tasks => {
                foreach (var task in tasks) {
                    if (task.IsFaulted) {
                        Trace.TraceError(task.Exception.GetBaseException().Message);
                        continue;
                    }

                    if (String.IsNullOrEmpty(task.Result)) {
                        continue;
                    }

                    // Try to get content from each url we're resolved in the query
                    string extractedContent = "<p>" + task.Result + "</p>";

                    // If we did get something, update the message and notify all clients
                    chatMessage.Content += extractedContent;

                    Clients[chatRoom.Name].addMessageContent(chatMessage.Id, extractedContent);
                }
            });
        }
Esempio n. 5
0
        public void Send(string content)
        {
            if (OutOfSync) {
                throw new InvalidOperationException("Chat was just updated, please refresh you browser and rejoin " + Caller.room);
            }

            content = Sanitizer.GetSafeHtmlFragment(content);

            // See if this is a valid command (starts with /)
            if (TryHandleCommand(content)) {
                return;
            }

            string roomName = Caller.room;
            string name = Caller.name;

            Tuple<ChatUser, ChatRoom> tuple = EnsureUserAndRoom();

            ChatUser user = tuple.Item1;
            ChatRoom chatRoom = tuple.Item2;

            // Update activity *after* ensuring the user, this forces them to be active
            UpdateActivity();

            HashSet<string> links;
            var messageText = Transform(content, out links);

            var chatMessage = new ChatMessage {
                Id = Guid.NewGuid().ToString("d"),
                User = user,
                Content = messageText,
                When = DateTimeOffset.UtcNow
            };

            chatRoom.Messages.Add(chatMessage);

            var messageViewModel = new MessageViewModel(chatMessage);

            Clients[chatRoom.Name].addMessage(messageViewModel);

            if (!links.Any()) {
                return;
            }

            ProcessUrls(links, chatRoom, chatMessage);
        }
Esempio n. 6
0
 public static ChatMessage ToViewModel(this Message entity)
 {
     var result = new ChatMessage { Text = entity.Text, WhenPosted = entity.WhenPosted, WhoPosted = entity.WhoPosted };
       return result;
 }
Esempio n. 7
0
        public ActionResult Logout()
        {
            Session["isadmin"] = false;
            Session["login"] = false;
            int uid = (int)Session["userid"];
            ChatRoomUser user = Db.users.Where(c => c.Id == uid).FirstOrDefault();
            ChatRoom oldRoom = Db.chatRooms.Where(c => c.isCurrent == true).FirstOrDefault();
            if (user != null)
            {
                user.Room = null;
                user.rid = -1;

                if (oldRoom != null)
                {
                    ChatMessage leaveMsg = new ChatMessage();
                    leaveMsg.Author = user;
                    leaveMsg.AuthorId = user.Id;
                    leaveMsg.AuthorName = user.FirstName + " " + user.LastName;
                    leaveMsg.MessageDate = DateTime.Now;
                    leaveMsg.Room = oldRoom;
                    leaveMsg.RoomId = oldRoom.id;
                    leaveMsg.Message = user.FirstName + " " + user.LastName + "Has Left The Room.";

                    Db.messages.Add(leaveMsg);
                }

                if (Db.currentRoom != null)
                {
                    Db.currentRoom.Users.Remove(user);
                    Db.Entry(Db.currentRoom).State = System.Data.Entity.EntityState.Modified;
                }

                foreach (ChatRoom cr in Db.chatRooms)
                {
                    if (cr.Users.Contains(user))
                    {
                        cr.Users.Remove(user);
                        Db.Entry(cr).State = System.Data.Entity.EntityState.Modified;
                    }
                }
                Db.Entry(user).State = System.Data.Entity.EntityState.Modified;
                Db.SaveChanges();
            }
            Db.currentRoom = null;

            return RedirectToAction("Login");
        }
Esempio n. 8
0
        public ActionResult JoinRoom(int id = -1)
        {
            int userId = (int)Session["userid"];
            ChatRoomUser user = Db.users.Where(m => m.Id == userId).FirstOrDefault();
            ChatRoom newRoom = Db.chatRooms.Where(c => c.id == id).FirstOrDefault();
            ChatRoom oldRoom = Db.chatRooms.Where(c => c.isCurrent == true).FirstOrDefault();

            if (oldRoom != null)
            {

                //RedirectToAction("SendMessage", new { msg = user.FirstName + " " + user.LastName + " Has Left The Room" });
                ChatMessage leaveMsg = new ChatMessage();
                leaveMsg.Author = user;
                leaveMsg.AuthorId = user.Id;
                leaveMsg.AuthorName = user.FirstName + " " + user.LastName;
                leaveMsg.MessageDate = DateTime.Now;
                leaveMsg.Room = oldRoom;
                leaveMsg.RoomId = oldRoom.id;
                leaveMsg.Message = user.FirstName + " " + user.LastName + " Has Left The Room.";

                Db.messages.Add(leaveMsg);

                oldRoom.isCurrent = false;
                Db.Entry(oldRoom).State = System.Data.Entity.EntityState.Modified;
                Db.SaveChanges();
            }

            if(newRoom != null)
            {
                if (user != null)
                {
                    user.rid = newRoom.id;
                    Db.Entry(user).State = System.Data.Entity.EntityState.Modified;
                }
                if (Db.currentRoom != null)
                {
                    Db.currentRoom.isCurrent = false;
                }
                newRoom.isCurrent = true;
                Db.currentRoom = newRoom;
                Db.currentRoom.Users.Add(user);

                Db.SaveChanges();
            }
            return RedirectToAction("SendMessage", new { msg = user.FirstName + " " + user.LastName + " Has Joined The Room"});
            //return RedirectToAction("ChatIndex");
        }
Esempio n. 9
0
        public ActionResult SendMessage(string msg)
        {
            ChatMessage newMsg = new ChatMessage();
            newMsg.Message = msg;
            newMsg.MessageDate = DateTime.Now;

            if (Db.currentRoom == null)
            {
                Db.currentRoom = Db.chatRooms.Where(c => c.isCurrent == true).FirstOrDefault();
                if (Db.currentRoom == null)
                {
                    Db.currentRoom = Db.chatRooms.FirstOrDefault();
                }
            }

            if (Db.currentRoom != null)
            {
                newMsg.Room = Db.currentRoom;
                newMsg.RoomId = Db.currentRoom.id;
                Db.currentRoom.isCurrent = true;

            }
            if (Session["userid"] != null)
            {
                newMsg.AuthorId = (int)Session["userid"];
            }

            ChatRoomUser author = Db.users.Where(u => u.Id == newMsg.AuthorId).FirstOrDefault();

            if (author != null)
            {
                author.LastActivity = DateTime.Now;
                newMsg.Author = author;
                newMsg.AuthorName = author.FirstName + " " + author.LastName;
            }

            //Db.currentRoom.messages.Add(newMsg);
            //Db.Entry(Db.currentRoom).State = System.Data.Entity.EntityState.Modified;

            Db.messages.Add(newMsg);
            Db.SaveChanges();
            return RedirectToAction("ChatIndex");
            //return View("ChatIndex", Db);
        }