public void RemoveOnlineUser() { var chatAdminUser = _service.GetChatUserByConnectionId(Context.ConnectionId); ChatRoomVM roomVM = new ChatRoomVM(); if (chatAdminUser != null) { // Notify Admins Clients.Group("adminGroup").removeUser(chatAdminUser.UserName); Clients.Group("adminGroup").removeOnlineUser(chatAdminUser.UserName); // This is used to update the database var rooms = _service.GetAllActiveChatRoomsByUser(chatAdminUser.ChatUserId); if (rooms != null && rooms.Count > 0) { foreach (var r in rooms) { ChatRoomVM chatRoomVM = new ChatRoomVM(); --r.ActiveUserCount; if (r.ActiveUserCount == 0) { r.Status = 1; r.EndTime = GetLocalTime(); _service.UpdateChatRoom(r); RemoveActiveRoom(r.ChatRoomName); Clients.Group("adminGroup").removeRoom(r.ChatRoomName); } else { r.HasAdminUser = false; r.ChatUser = null; _service.UpdateChatRoom(r); chatRoomVM.ActiveUserCount = r.ActiveUserCount; chatRoomVM.ChatRoomName = r.ChatRoomName; chatRoomVM.HasAdminUser = r.HasAdminUser; Clients.Group("adminGroup").updateActiveRoom(chatRoomVM); // TODO: Place room update code for live feed here RoomFeedVM roomFeed = new RoomFeedVM(); roomFeed.UsersInRoom = r.ActiveUserCount; roomFeed.StartTime = r.StartTime; roomFeed.RoomName = r.ChatRoomName; roomFeed.HelperName = chatAdminUser.FirstName + " " + chatAdminUser.LastName; roomFeed.ClientId = r.ChatUserId; if (r.HasAdminUser == true) { roomFeed.BeingHelped = "Yes"; } else { roomFeed.BeingHelped = "No"; } Clients.Group("adminGroup").updateRoom(roomFeed); Groups.Remove(Context.ConnectionId, roomFeed.RoomName); } } chatAdminUser.IsOnline = false; chatAdminUser.LogOutTime = GetLocalTime(); _service.UpdateAdminUser(chatAdminUser); } else { chatAdminUser.IsOnline = false; chatAdminUser.LogOutTime = GetLocalTime(); _service.UpdateAdminUser(chatAdminUser); } } }
// Disconnects Users public override Task OnDisconnected() { // Get user from Active User list var user = activeUsers.Find(u => u.ConnectionId == Context.ConnectionId); var chatAdminUser = _service.GetChatUserByConnectionId(Context.ConnectionId); if (chatAdminUser != null) { Clients.Group("adminGroup").removeOnlineUser(chatAdminUser.UserName); } ChatRoomVM roomVM = new ChatRoomVM(); if (user != null) { // get room var chatRoom = _service.GetActiveRoomByName(user.roomName); // Remove user from ChatRoom var chatRoomCount = chatRoom.ActiveUserCount; chatRoom.ActiveUserCount = chatRoomCount - 1; // Check to see if there are any other users if (chatRoom.ActiveUserCount == 0) { // If no users then remove room from active Chat Rooms list chatRoom.Status = 1; chatRoom.EndTime = GetLocalTime(); // Javascript function that removes room from ChatLobby room list. RemoveActiveRoom(chatRoom.ChatRoomName); // Update the room in the database. _service.UpdateChatRoom(chatRoom); Clients.All.removeRoom(chatRoom.ChatRoomName); } else { // If there are still users in a room update the count in the lobby //TODO: change to roomVM roomVM.ActiveUserCount = chatRoom.ActiveUserCount; roomVM.ChatRoomName = chatRoom.ChatRoomName; roomVM.HasAdminUser = chatRoom.HasAdminUser; _service.UpdateChatRoom(chatRoom); Clients.Group("adminGroup").updateActiveRoom(roomVM); // TODO: Place room update code for live feed here RoomFeedVM roomFeed = new RoomFeedVM(); roomFeed.UsersInRoom = chatRoom.ActiveUserCount; roomFeed.StartTime = chatRoom.StartTime; roomFeed.RoomName = chatRoom.ChatRoomName; roomFeed.ClientId = chatRoom.ChatUserId; if (chatRoom.HasAdminUser == true) { roomFeed.BeingHelped = "Yes"; } else { roomFeed.BeingHelped = "No"; } Clients.All.updateRoom(roomFeed); Groups.Remove(Context.ConnectionId, roomFeed.RoomName); } activeUsers.Remove(user); } else if (chatAdminUser != null && chatAdminUser.IsOnline == true) { // Notify Admins Clients.Group("adminGroup").removeUser(chatAdminUser.UserName); Clients.Group("adminGroup").removeOnlineUser(chatAdminUser.UserName); // This is used to update the database var rooms = _service.GetAllActiveChatRoomsByUser(chatAdminUser.ChatUserId); if (rooms != null && rooms.Count > 0) { foreach (var r in rooms) { ChatRoomVM chatRoomVM = new ChatRoomVM(); --r.ActiveUserCount; if (r.ActiveUserCount == 0) { r.Status = 1; r.EndTime = GetLocalTime(); _service.UpdateChatRoom(r); RemoveActiveRoom(r.ChatRoomName); Clients.Group("adminGroup").removeRoom(r.ChatRoomName); } else { r.HasAdminUser = false; r.ChatUser = null; _service.UpdateChatRoom(r); chatRoomVM.ActiveUserCount = r.ActiveUserCount; chatRoomVM.ChatRoomName = r.ChatRoomName; chatRoomVM.HasAdminUser = r.HasAdminUser; Clients.Group("adminGroup").updateActiveRoom(chatRoomVM); // TODO: Place room update code for live feed here RoomFeedVM roomFeed = new RoomFeedVM(); roomFeed.UsersInRoom = r.ActiveUserCount; roomFeed.StartTime = r.StartTime; roomFeed.RoomName = r.ChatRoomName; roomFeed.HelperName = chatAdminUser.FirstName + " " + chatAdminUser.LastName; roomFeed.ClientId = r.ChatUserId; if (r.HasAdminUser == true) { roomFeed.BeingHelped = "Yes"; } else { roomFeed.BeingHelped = "No"; } Clients.Group("adminGroup").updateRoom(roomFeed); Groups.Remove(Context.ConnectionId, roomFeed.RoomName); } } chatAdminUser.IsOnline = false; chatAdminUser.LogOutTime = GetLocalTime(); _service.UpdateAdminUser(chatAdminUser); } else { chatAdminUser.IsOnline = false; chatAdminUser.LogOutTime = GetLocalTime(); _service.UpdateAdminUser(chatAdminUser); } } return base.OnDisconnected(); }
// Connect/Create Agent ChatUser and add to a ChatRoom and SignalR Group public ChatClientUser ConnectUser(string username) { var OnlineUsers = _service.GetOnlineUsers(); if (OnlineUsers.Count() > 1) { string roomName = RandomString(5); JoinGroup(roomName); ChatClientUser user = new ChatClientUser() { userName = username, roomName = roomName, isUserAllowed = true, ConnectionId = Context.ConnectionId }; ChatRoom room = new ChatRoom(); room.ChatUserId = user.userName; room.StartTime = GetLocalTime(); //room.StartTime = DateTime.Now; room.Status = 0; room.ActiveUserCount = 1; room.ChatRoomName = roomName; room.HasAdminUser = false; activeUsers.Add(user); // Save ChatRoom to Repo _service.AddChatRoom(room); // This adds the new chat room to the admin chat lobby Clients.Group("adminGroup").addActiveRoom(room, user); RoomFeedVM roomFeed = new RoomFeedVM(); if (room.HasAdminUser == true) { roomFeed.BeingHelped = "Yes"; } else { roomFeed.BeingHelped = "No"; } roomFeed.ClientId = room.ChatUserId; roomFeed.HelperName = ""; roomFeed.RoomName = room.ChatRoomName; roomFeed.StartTime = room.StartTime; roomFeed.UsersInRoom = room.ActiveUserCount; Clients.All.addRoom(roomFeed); return user; } else { return new ChatClientUser { userName = username, isUserAllowed = false }; } }
// Add ChatUser and ChatRoom to SignalR Groups public void JoinGroup(string groupName) { Groups.Add(Context.ConnectionId, groupName); // If admin, add to ChatRoom's list of active ChatUsers //var user = activeUsers.Find(u => u.ConnectionId == Context.ConnectionId); //var room = activeChatRooms.Find(r => r.ChatRoomName == groupName); var adminUser = _service.GetChatUserByConnectionId(Context.ConnectionId); var chatRoom = _service.GetActiveRoomByName(groupName); var defaultCannedMessage = _service.GetDefaultCannedMessage(); if (adminUser != null && chatRoom != null) { ChatRoomVM roomVM = new ChatRoomVM(); ChatMessage message = new ChatMessage(); // Initial Welcome Message if (chatRoom.FirstMessage == true) { if (defaultCannedMessage != null) { message.ChatRoom = chatRoom; message.ChatRoomId = chatRoom.ChatRoomId; message.UserName = adminUser.UserName; message.Content = defaultCannedMessage.CannedMessageContent; message.MessageSent = GetLocalTime(); chatRoom.ChatMessages.Add(message); chatRoom.FirstMessage = false; Clients.Group(groupName).DisplayMessage(message.UserName, message.Content, groupName); Clients.Group(groupName).DisplayMessageToClient(adminUser.FirstName, message.Content); } } ++chatRoom.ActiveUserCount; chatRoom.AdminChatUserId = adminUser.ChatUserId; chatRoom.HasAdminUser = true; chatRoom.ChatUser = adminUser; adminUser.ChatRooms.Add(chatRoom); roomVM.HasAdminUser = chatRoom.HasAdminUser; roomVM.ActiveUserCount = chatRoom.ActiveUserCount; roomVM.ChatRoomName = chatRoom.ChatRoomName; _service.UpdateChatRoom(chatRoom); _service.UpdateAdminUser(adminUser); Clients.OthersInGroup(groupName).userConnected(adminUser.FirstName); Clients.Group("adminGroup").updateActiveRoom(roomVM); RoomFeedVM roomFeed = new RoomFeedVM(); roomFeed.UsersInRoom = chatRoom.ActiveUserCount; roomFeed.StartTime = chatRoom.StartTime; roomFeed.RoomName = chatRoom.ChatRoomName; roomFeed.HelperName = adminUser.FirstName + " " + adminUser.LastName; roomFeed.ClientId = chatRoom.ChatUserId; if (chatRoom.HasAdminUser == true) { roomFeed.BeingHelped = "Yes"; } else { roomFeed.BeingHelped = "No"; } // TODO: Update Chat Room in Live Feed Clients.All.updateRoom(roomFeed); } }
// Methods for Control Panel public ActionResult LiveUserRoomFeed() { ViewBag.MenuBar = "ControlPanel"; var currentUser = _service.GetChatUserByUsername(HttpContext.User.Identity.Name.ToString()); ViewBag.UserNameFullName = currentUser.FirstName + " " + currentUser.LastName; if (currentUser.IsOnline == true) { currentUser.IsOnline = false; _service.UpdateAdminUser(currentUser); } ViewBag.IsAdmin = currentUser.IsAdmin; ViewBag.UserName = currentUser.FirstName + " " + currentUser.LastName; ViewBag.User = currentUser.UserName; var onlineUsers = _service.GetOnlineUsers(); var rooms = _service.GetActiveChatRooms(); LiveUserRoomFeedVM feed = new LiveUserRoomFeedVM(); foreach (var ou in onlineUsers) { UserFeedVM user = new UserFeedVM(); user.FirstName = ou.FirstName; user.LastName = ou.LastName; user.LogInTime = ou.LogInTime; user.UserName = ou.UserName; feed.OnlineUsers.Add(user); } foreach (var r in rooms) { RoomFeedVM room = new RoomFeedVM(); if (r.HasAdminUser == true) { room.BeingHelped = "Yes"; } else { room.BeingHelped = "No"; } room.ClientId = r.ChatUserId; if (r.ChatUser != null) { room.HelperName = r.ChatUser.FirstName + " " + r.ChatUser.LastName; } else { room.HelperName = string.Empty; } room.RoomName = r.ChatRoomName; room.StartTime = r.StartTime; room.UsersInRoom = r.ActiveUserCount; feed.ActiveRooms.Add(room); } return View(feed); }