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); }
/// <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)); }