Ejemplo n.º 1
0
        private async Task <MissionCompletionResult> ProcessCommonPlace(MissionRequest request)
        {
            var commonPlaceAlias = request.Mission.CommonPlaceAlias;
            var passedCoordinate = request.Proof.Coordinates.First();

            if (request.User.HomeCoordinate.GetDistanceTo(passedCoordinate) < Core.Constants.GameConstants.Mission.CommonPlaceMinDistanceFromHome)
            {
                var incorrectResult = await ProcessIncorrectTry(request, _missionRepository, _missionRequestRepository);

                if (incorrectResult.MissionCompletionStatus == MissionCompletionStatus.IntermediateFail)
                {
                    incorrectResult.Description = "StillHome";
                }
                return(incorrectResult);
            }

            var realCommonPlace = await _commonPlacesRepository.GetCommonPlaceByAlias(request.UserId, commonPlaceAlias);

            if (realCommonPlace == null)
            {
                return(await ProcessTemporaryCommonPlace(request, commonPlaceAlias, passedCoordinate));
            }

            var distance = passedCoordinate.GetDistanceTo(realCommonPlace.Coordinate);

            if (distance > request.Mission.AccuracyRadius)
            {
                var incorrectResult = await ProcessIncorrectTry(request, _missionRepository, _missionRequestRepository);

                if (incorrectResult.MissionCompletionStatus == MissionCompletionStatus.IntermediateFail)
                {
                    incorrectResult.Description = distance > request.Mission.AccuracyRadius * 2 ? "Incorrect" : "IsNear";
                }
                return(incorrectResult);
            }

            await SetStarsAccordingToTries(request, _missionRequestRepository);

            var completePoints =
                await
                RewardsCalculator.UpdateUserAfterMissionCompletion(request, _missionRepository, _appCountersService);

            var finalResult = new MissionCompletionResult
            {
                Points     = completePoints,
                StarsCount = request.StarsCount,
                MissionCompletionStatus = MissionCompletionStatus.Success
            };

            var requestResult = await _missionRequestRepository.AddMissionRequest(request);

            return(requestResult.Status != OperationResultStatus.Success
                       ? MissionCompletionResult.FromOperationResult(requestResult)
                       : finalResult);
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Gets the hint to user.
        /// </summary>
        /// <param name="missionId">The mission identifier.</param>
        /// <param name="hintId">The hint identifier.</param>
        /// <param name="userId">The user identifier.</param>
        /// <returns></returns>
        public async Task <HintRequestResult> GetHint(string missionId, string hintId, string userId)
        {
            var hintRequest = new HintRequest
            {
                HintId    = hintId,
                MissionId = missionId,
                UserId    = userId,
                Status    = HintRequestStatus.Success
            };

            var user = await _userRepository.GetUser(userId);

            if (!user.ActiveMissionIds.AnyValues(t => t.MissionId == missionId))
            {
                hintRequest.Status = HintRequestStatus.UserDontHaveThatMissionInActiveStatus;
                return(await LogHintRequestAndReturnResult(hintRequest, OperationResultStatus.Error, "Mission is inactive"));
            }
            var mission = await GetMission(missionId);

            var hint = mission.Hints?.SingleOrDefault(h => h.Id == hintId);

            if (hint == null)
            {
                hintRequest.Status = HintRequestStatus.HintNotFound;
                return(await LogHintRequestAndReturnResult(hintRequest, OperationResultStatus.Error, "Invalid hint Id"));
            }

            string hintText;

            switch (hint.Type)
            {
            case HintType.Coordinate:
            case HintType.Direction:
            {
                var commonPlaceAlias = mission.CommonPlaceAlias;
                var realCommonPlace  = await _commonPlacesRepository.GetCommonPlaceByAlias(userId, commonPlaceAlias);

                if (realCommonPlace == null)
                {
                    hintRequest.Status = HintRequestStatus.CommonPlaceNotExist;
                    return(await LogHintRequestAndReturnResult(hintRequest, OperationResultStatus.Warning, "Common place is not fixed"));
                }
                hintText = realCommonPlace.Coordinate.ToString();
                break;
            }

            case HintType.Text:
            {
                hintText = hint.Text;
                break;
            }

            default:
                throw new Exception("Invalid hint type");
            }

            if (!user.BoughtHintIds.AnyValues(t => t == hint.Id))
            {
                if (!user.CoinsCount.HasValue || user.CoinsCount < hint.Score)
                {
                    hintRequest.Status = HintRequestStatus.UserDontHaveCoins;
                    return(await LogHintRequestAndReturnResult(hintRequest, OperationResultStatus.Error, "Not enough coins"));
                }
                user.CoinsCount    = user.CoinsCount - hint.Score;
                user.BoughtHintIds = user.BoughtHintIds ?? new List <string>();
                user.BoughtHintIds.Add(hint.Id);
                await _userRepository.UpdateUser(user);
            }
            return(await LogHintRequestAndReturnResult(hintRequest, OperationResultStatus.Success, hintText));
        }