public async Task Join(string characterColor) { Log.Logger.Information($"Join: {Context.ConnectionId} {characterColor}"); var rooms = await _dbConnection.GetAllAsync <GameplayRoom>(new BsonDocument()); if (!rooms.Any())//no room { var firstPlayer = await _dbConnection.GetAsync <Player>( new BsonDocument("ConnectionId", Context.ConnectionId)); firstPlayer = await CreateOrUpdatePlayer(firstPlayer, characterColor, true); var room = _modelFactory.CreateGameplayRoom(firstPlayer.ConnectionId); await _dbConnection.SaveAsync(room);//creating room Log.Logger.Information($"User {Context.ConnectionId} added to room {room.Id}"); } else//room exist { var gameplayRoom = rooms.First(room => room.Players.Count() < room.MaxPlayers); var secondPlayer = await _dbConnection.GetAsync <Player>( new BsonDocument("ConnectionId", Context.ConnectionId)); secondPlayer = await CreateOrUpdatePlayer(secondPlayer, characterColor, false); var players = new List <string>(gameplayRoom.Players) { secondPlayer.ConnectionId }; gameplayRoom.Players = players; await _dbConnection.UpdateAsync(gameplayRoom); Log.Logger.Information($"User {Context.ConnectionId} added to room {gameplayRoom.Id}"); var firstPlayer = await _dbConnection.GetAsync <Player>(new BsonDocument("ConnectionId", players[0])); await NotifyOpponentJoined(firstPlayer, secondPlayer); if (gameplayRoom.Players.Count() == gameplayRoom.MaxPlayers) { foreach (var playerId in gameplayRoom.Players) { await Clients.Client(playerId).SendAsync("CanPlay"); } } } }