public async Task <IUser> Login(string username, string hashedPassword) { methodCallCounter(); return(await Task.Factory.StartNew(() => { if (!PlayerClients.ContainsKey(username)) { // TODO Verify user creds from DB here UserData userData = new UserData() { userName = username, password = hashedPassword }; if (UserDB.loginUser(userData)) { Console.WriteLine($"++ {username} logged in"); IUser newUser = new User(username, Context.ConnectionId, hashedPassword); bool added = PlayerClients.TryAdd(username, newUser); if (!added) { return null; } // Keeps username in shared state until client logs out Clients.CallerState.UserName = username; // Accounces to all other connected clients that *username* has joined Clients.Others.announceClientLoggedIn(username); // Creates the basic opponent layout PlayerDTO newPlayer = PlayerDTOFactory.GetPlayerDTO(newUser); if (Opponents.TryAdd(newPlayer.Name, newPlayer)) { Clients.Others.opponentJoined(newPlayer); return newUser; } } /*else { * // Handle what to send back to denied client * Clients.Caller.AccessDenied("No way Jose!"); * }*/ } return null; })); }