예제 #1
0
        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");
                    }
                }
            }
        }