public override async Task <GameResponse> DoPlay(GameRequest request, ServerCallContext context)
        {
            _logger.LogInformation($"Player {request.Username} picked {PickDto.ToText(request.Pick)} against {request.Challenger}.");

            var challenger = _challengersService.SelectChallenger(request);

            var result = new GameResponse()
            {
                Challenger = request.Challenger,
                User       = request.Username,
                UserPick   = request.Pick
            };

            var pick = await challenger.Pick(GetContext(context), request.TwitterLogged, request.Username);

            _logger.LogInformation($"Challenger {result.Challenger} picked {PickDto.ToText(pick.Value)} against {request.Username}.");

            result.ChallengerPick = pick.Value;
            result.IsValid        = IsValid(pick);
            result.Result         = result.IsValid ? _gameService.Check(result.UserPick, result.ChallengerPick) : Result.Player;
            _logger.LogInformation($"Result of User {request.Username} vs Challenger {result.Challenger}, winner: {result.Result}");

            if (result.IsValid && request.TwitterLogged)
            {
                await _resultsDao.SaveMatch(pick, request.Username, request.Pick, result.Result);
            }

            if (_playFabService.HasCredentials)
            {
                var username = !request.TwitterLogged ? $"${request.Username}" : request.Username;
                await _playFabService.UpdateStats(username, result.Result == Result.Player);
            }

            return(result);
        }
        public override async Task <Empty> Pick(PickRequest request, ServerCallContext context)
        {
            var username = GetUsername(request.Username, request.TwitterLogged);
            var dto      = await _repository.SaveMatchPick(request.MatchId, username, request.Pick);

            if (!string.IsNullOrWhiteSpace(dto.ChallengerMove?.Text) && !string.IsNullOrWhiteSpace(dto.PlayerMove?.Text))
            {
                var result = _gameService.Check(dto.PlayerMove.Value, dto.ChallengerMove.Value);
                await _playFabService.UpdateStats(dto.PlayerName, result == Result.Player);

                await _playFabService.UpdateStats(dto.Challenger.Name, result == Result.Challenger);

                await _repository.SaveMatchResult(request.MatchId, result);
            }

            return(new Empty());
        }