public MessageViewModel(ChatMessage message) { Id = message.Id; Content = message.Content; User = new UserViewModel(message.User); When = message.When; }
public MessageViewModel(ChatMessage message, ChatRoom room) { Id = message.Id; Content = message.Content; User = new UserViewModel(message.User); When = message.When; Room = room.Name; }
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); } }); } }
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); } }); }
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); }
public static ChatMessage ToViewModel(this Message entity) { var result = new ChatMessage { Text = entity.Text, WhenPosted = entity.WhenPosted, WhoPosted = entity.WhoPosted }; return result; }
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"); }
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"); }
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); }