Exemplo n.º 1
0
            public async Task <Game> Handle(JoinAnyGameCommand request, CancellationToken cancellationToken)
            {
                if (!GameTypeMetadata.All.TryGetValue(request.GameType, out var metadata))
                {
                    throw new ValidationException("Invalid game type");
                }

                var player = new Player()
                {
                    Id   = _playerIdentity.Id,
                    Name = _playerIdentity.Name,
                };
                await _repository.CreatePlayerIfNotExistingAsync(player);

                await _gameAssert.NotTooManyOpenGamesAsync();

                Game?waitingRoom;

                if (!request.IsOpen)
                {
                    waitingRoom = await CreateGameAsync(request, metadata);
                }
                else
                {
                    waitingRoom = await _repository.AddPlayerToGameAsync(
                        request.GameType,
                        request.MaxPlayers,
                        request.Duration,
                        new Game.Player()
                    {
                        Id         = player.Id,
                        Name       = player.Name,
                        AcceptedAt = DateTime.UtcNow
                    });

                    if (waitingRoom == null)
                    {
                        waitingRoom = await CreateGameAsync(request, metadata);
                    }
                }

                if (waitingRoom.Id == null)
                {
                    throw new Exception("Since the game has been created an ID must be set");
                }

                return(await _gameService.JoinAsync(waitingRoom));
            }
Exemplo n.º 2
0
        public async Task Should_not_add_player_to_game_if_already_in()
        {
            var game = new GameBuilder()
                       .FirstPlayerEinstein
                       .CardBattle
                       .Build();
            await _repository.CreateGameAsync(game);

            // Act
            var fetchedGame = await _repository.AddPlayerToGameAsync(GameType.CardBattle, null, null, GameBuilder.Einstein);

            fetchedGame.Should().BeNull();
        }