Beispiel #1
0
        async Task IGamePlayService.MakeMoveAsync(MoveModel move, CancellationToken cancellationToken)
        {
            var game = await ValidateMoveInternalAsync(move, cancellationToken : cancellationToken);

            var turns = await _turnRepository.GetTurnsByGameIdAsync(game.Id, cancellationToken : cancellationToken);

            var currentTurn = turns
                              .Where(x => !x.EndTime.HasValue)
                              .OrderByDescending(x => x.StartTime)
                              .FirstOrDefault();

            var turnUpdate = new TurnUpdateData
            {
                EndTime = DateTime.UtcNow,
            };

            await _turnRepository.UpdateTurnAsync(currentTurn.Id, turnUpdate, cancellationToken : cancellationToken);

            var currentMove = new MoveData
            {
                GameDeckCardCollectionId = move.GameDeckCardCollectionId,
                Column = move.Column,
                Row    = move.Row,
                TurnId = currentTurn.Id,
            };

            await _moveRepository.AddMoveAsync(currentMove, cancellationToken : cancellationToken);

            var nextUserId = game.UserIds
                             .SkipWhile(x => x != move.UserId)
                             .Skip(1)
                             .FirstOrDefault();

            if (nextUserId == default)
            {
                nextUserId = game.UserIds.First();
            }

            var newTurn = new TurnData
            {
                CurrentUserId = nextUserId,
                GameId        = game.Id,
                StartTime     = DateTime.UtcNow,
            };

            await _turnRepository.AddTurnAsync(newTurn, cancellationToken : cancellationToken);

            var gameUpdate = new GameUpdateData
            {
                CurrentUserId = nextUserId,
            };
            await _gameRepository.UpdateGameAsync(game.Id, gameUpdate, cancellationToken : cancellationToken);
        }
Beispiel #2
0
        async Task ITurnRepository.UpdateTurnAsync(int id, TurnUpdateData update, CancellationToken cancellationToken)
        {
            var existingTurn = await _context.Turn.SingleOrDefaultAsync(x => x.TurnPk == id, cancellationToken : cancellationToken);

            if (existingTurn == null)
            {
                throw new CardHeroDataException($"Turn { id } does not exist.");
            }

            if (update.EndTime.IsSet)
            {
                existingTurn.EndTime = update.EndTime.Value;
            }

            await _context.SaveChangesAsync(cancellationToken : cancellationToken);
        }