Example #1
0
        /// <summary>
        ///     Updates the user ater mission completion.
        /// </summary>
        /// <param name="missionRequest">The mission request.</param>
        /// <param name="missionRepository">The mission repository.</param>
        /// <param name="appCountersService">The application counters service.(need to be passed for missions from the last set)</param>
        /// <returns>
        ///     Points increase
        /// </returns>
        public static async Task <int> UpdateUserAfterMissionCompletion(
            MissionRequest missionRequest,
            IMissionRepository missionRepository,
            AppCountersService appCountersService = null)
        {
            var currentLevelMax = levelMap[missionRequest.User.Level.Value]; //user level can't be null
            var expIncrease     = (ushort)(missionRequest.Mission.Difficulty * GameConstants.Experience.PerDifficultyPoint);
            var pointsIncrease  =
                (int)Math.Round(expIncrease * GameConstants.Points.ExtraMultiplier * missionRequest.StarsCount.Value);

            //stars after completion can't be null
            missionRequest.User.LevelPoints += expIncrease;
            missionRequest.User.Points       = (missionRequest.User.Points ?? 0) + pointsIncrease;
            if (missionRequest.User.LevelPoints >= currentLevelMax)
            {
                missionRequest.User.Level++;
                missionRequest.User.LevelPoints = (ushort)(missionRequest.User.LevelPoints - currentLevelMax);
            }

            CalculatePersonQualities(missionRequest, true);

            await MissionFinished(missionRequest, true, missionRepository, appCountersService);

            return(expIncrease);
        }
Example #2
0
        private async Task <MissionCompletionResult> ProcessTemporaryCommonPlace(
            MissionRequest request,
            string commonPlaceAlias,
            GeoCoordinate passedCoordinate)
        {
            var result =
                await _commonPlacesRepository.AddCommonPlace(request.UserId, commonPlaceAlias, passedCoordinate);

            if (result.Status != OperationResultStatus.Success)
            {
                return(new MissionCompletionResult(
                           OperationResultStatus.Error,
                           "Невозможно добавить временное общее место"));
            }

            request.StarsCount = 3;
            var recievedPoints =
                await
                RewardsCalculator.UpdateUserAfterMissionCompletion(request, _missionRepository, _appCountersService);

            var requestResult = await _missionRequestRepository.AddMissionRequest(request);

            if (requestResult.Status != OperationResultStatus.Success)
            {
                return(MissionCompletionResult.FromOperationResult(requestResult));
            }

            return(new MissionCompletionResult
            {
                Points = recievedPoints,
                StarsCount = request.StarsCount,
                MissionCompletionStatus = MissionCompletionStatus.Success
            });
        }
Example #3
0
        /// <summary>
        /// Processes the request.
        /// </summary>
        /// <param name="request">The request.</param>
        /// <returns>Task{MissionCompletionResult}.</returns>
        public async Task <MissionCompletionResult> ProcessRequest(MissionRequest request)
        {
            request.Mission.TriesFor1Star  = 7;
            request.Mission.TriesFor2Stars = 4;
            request.Mission.TriesFor3Stars = 2;

            if (request.Proof.Coordinates == null || !request.Proof.Coordinates.Any())
            {
                return(new MissionCompletionResult(OperationResultStatus.Error, "Not enough data"));
            }

            var    oupostCoordinate = request.Proof.Coordinates.First();
            double distanceError;

            if (!CheckOutpost(oupostCoordinate, request.User, out distanceError))
            {
                return(await MissionRequestService.ProcessIncorrectTry(request, _missionRepository, _missionRequestRepository));
            }
            await MissionRequestService.SetStarsAccordingToTries(request, _missionRequestRepository);

            request.User.OutpostCoordinate = oupostCoordinate;

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

            return(new MissionCompletionResult
            {
                Points = recievedPoints,
                StarsCount = request.StarsCount,
                MissionCompletionStatus = MissionCompletionStatus.Success
            });
        }
Example #4
0
        private static async Task <List <MissionIdWithSetId> > CheckActiveMissionDependencies(
            MissionRequest missionRequest,
            bool success,
            IMissionRepository missionRepository)
        {
            var autoRemovedActiveMissions = new List <MissionIdWithSetId>();

            if (success)
            {
                return(autoRemovedActiveMissions);
            }

            var user = missionRequest.User;
            var declinedMissionId = missionRequest.Mission.Id;
            var activeMissionsIds = user.ActiveMissionIds.Select(m => m.MissionId).ToIList();
            var activeMissions    =
                (await
                 missionRepository.GetMissions(
                     new QueryOptions <Mission>
            {
                Filter =
                    ExpressionHelper.Expr((Mission x) => x.Id).In(activeMissionsIds),
                Select = mission => new { mission.Id, mission.DependsOn }
            }));

            AutoDeclineActiveMissions(
                declinedMissionId,
                activeMissions,
                user,
                autoRemovedActiveMissions);

            return(autoRemovedActiveMissions);
        }
Example #5
0
        /// <summary>
        /// Processes the request.
        /// </summary>
        /// <param name="request">The request.</param>
        /// <returns>Task{MissionCompletionResult}.</returns>
        public async Task <MissionCompletionResult> ProcessRequest(MissionRequest request)
        {
            var userAnswer = request.Proof.CreatedText.ToLower();

            if ((userAnswer.Contains("мам") && !userAnswer.Contains("друг")) ||
                (userAnswer.Contains("друг") && !userAnswer.Contains("мам")))
            {
                request.StarsCount = 1;
            }
            else if (userAnswer.Contains("мам") && userAnswer.Contains("друг") || userAnswer.Contains("обоим") ||
                     userAnswer.Contains("двоим"))
            {
                request.StarsCount = 3;
            }
            else
            {
                request.DeclineReason = "Это неправильный выбор.";
                await RewardsCalculator.UpdateUserAfterMissionDecline(request, _missionRepository);

                return(new MissionCompletionResult
                {
                    MissionCompletionStatus = MissionCompletionStatus.Fail,
                    Description = request.DeclineReason
                });
            }

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

            return(new MissionCompletionResult
            {
                Points = recievedPoints,
                StarsCount = request.StarsCount,
                MissionCompletionStatus = MissionCompletionStatus.Success
            });
        }
Example #6
0
        /// <summary>
        /// Processes the request.
        /// </summary>
        /// <param name="request">The request.</param>
        /// <returns>Task{MissionCompletionResult}.</returns>
        public async Task <MissionCompletionResult> ProcessRequest(MissionRequest request)
        {
            var baseCoordinates = request.Proof.Coordinates.ToArray();

            if (!ValidBaseCoordinates(baseCoordinates, request.User.HomeCoordinate))
            {
                request.DeclineReason = "Координаты базы ошибочны";
                await RewardsCalculator.UpdateUserAfterMissionDecline(request, _missionRepository);

                return(new MissionCompletionResult
                {
                    MissionCompletionStatus = MissionCompletionStatus.Fail,
                    Description = request.DeclineReason
                });
            }

            request.User.BaseNorthCoordinate = baseCoordinates[0];
            request.User.BaseEastCoordinate  = baseCoordinates[1];
            request.User.BaseSouthCoordinate = baseCoordinates[2];
            request.User.BaseWestCoordinate  = baseCoordinates[3];
            request.StarsCount = 3;
            var recievedPoints = await RewardsCalculator.UpdateUserAfterMissionCompletion(request, _missionRepository);

            return(new MissionCompletionResult
            {
                Points = recievedPoints,
                StarsCount = request.StarsCount,
                MissionCompletionStatus = MissionCompletionStatus.Success
            });
        }
        /// <summary>
        ///     The add mission request.
        /// </summary>
        /// <param name="missionRequest">
        ///     The mission request.
        /// </param>
        /// <returns>
        ///     The <see cref="Task" />.
        /// </returns>
        public async Task <IdResult> AddMissionRequest(MissionRequest missionRequest)
        {
            missionRequest.Id = Guid.NewGuid().ToString();
            await Task.Factory.StartNew(() => _allMissionRequests.Add(missionRequest));

            return(new IdResult(missionRequest.Id));
        }
Example #8
0
        /// <summary>
        /// Processes the request.
        /// </summary>
        /// <param name="request">The request.</param>
        /// <returns></returns>
        public async Task <MissionCompletionResult> ProcessRequest(MissionRequest request)
        {
            if (String.IsNullOrEmpty(request.Proof.CreatedText))
            {
                request.StarsCount = 3;
                var recievedPoints =
                    await RewardsCalculator.UpdateUserAfterMissionCompletion(request, _missionRepository, _appCountersService);

                return(new MissionCompletionResult
                {
                    Points = recievedPoints,
                    StarsCount = request.StarsCount,
                    MissionCompletionStatus = MissionCompletionStatus.Success
                });
            }

            request.DeclineReason = "Увы. В следующий раз постарайся думать своей головой и не совершать глупости";
            await RewardsCalculator.UpdateUserAfterMissionDecline(request, _missionRepository, _appCountersService);

            return(new MissionCompletionResult
            {
                MissionCompletionStatus = MissionCompletionStatus.Fail,
                Description = request.DeclineReason
            });
        }
Example #9
0
        /// <summary>
        ///     Converts MissionRequestAzure to MissionRequest..
        /// </summary>
        /// <param name="azureModel">The azure model.</param>
        /// <returns>MissionRequest.</returns>
        public static MissionRequest FromAzureModel(this MissionRequestAzure azureModel)
        {
            if (azureModel == null)
            {
                return(null);
            }

            var domainModel = new MissionRequest();

            azureModel.CopyTo(domainModel);
            MissionRequestStatus status;

            if (Enum.TryParse(azureModel.Status, out status))
            {
                domainModel.Status = status;
            }

            domainModel.StarsCount = (byte?)azureModel.StarsCount;
            domainModel.Proof      = new MissionProof
            {
                ImageUrls     = azureModel.ProofImageUrls?.SplitStringByDelimiter(),
                CreatedText   = azureModel.CreatedText,
                Coordinates   = azureModel.ProofCoordinates?.SplitStringByDelimiter(CommonConstants.Delimiter)?.Select(coord => coord.ConvertToGeoCoordinate()).ToList(),
                TimeElapsed   = azureModel.TimeElapsed,
                NumberOfTries = (ushort?)azureModel.NumberOfTries
            };
            return(domainModel);
        }
Example #10
0
 private static void CalculatePersonQualities(MissionRequest missionRequest, bool afterSuccess)
 {
     if (missionRequest.Mission.PersonQualities != null && missionRequest.Mission.PersonQualities.Any())
     {
         var lightQuality =
             missionRequest.Mission.PersonQualities.FirstOrDefault(
                 q => q.PersonQualityId == GameConstants.PersonQuality.LightQualityId);
         if (lightQuality != null)
         {
             var lightScore = lightQuality.Score * missionRequest.StarsCount
                              ?? (double)0 / GameConstants.PersonQuality.StarsNeededForMissionValue;
             if (missionRequest.User.PersonQualitiesWithScores != null)
             {
                 var userLightQuality =
                     missionRequest.User.PersonQualitiesWithScores.FirstOrDefault(pq => pq.PersonQualityId == GameConstants.PersonQuality.LightQualityId);
                 if (userLightQuality != null)
                 {
                     if (afterSuccess)
                     {
                         userLightQuality.Score += lightScore;
                         if (userLightQuality.Score > GameConstants.PersonQuality.LightScoreMax)
                         {
                             userLightQuality.Score = GameConstants.PersonQuality.LightScoreMax;
                         }
                     }
                     else
                     {
                         userLightQuality.Score -= lightScore;
                         if (userLightQuality.Score < GameConstants.PersonQuality.LightScoreMin)
                         {
                             userLightQuality.Score = GameConstants.PersonQuality.LightScoreMin;
                         }
                     }
                 }
                 else if (afterSuccess)
                 {
                     missionRequest.User.PersonQualitiesWithScores
                     .Add(
                         new PersonQualityIdWithScore
                     {
                         PersonQualityId = GameConstants.PersonQuality.LightQualityId,
                         Score           = lightScore
                     });
                 }
             }
             else if (afterSuccess)
             {
                 missionRequest.User.PersonQualitiesWithScores = new List <PersonQualityIdWithScore>
                 {
                     new PersonQualityIdWithScore
                     {
                         PersonQualityId = GameConstants.PersonQuality.LightQualityId,
                         Score           = lightScore
                     }
                 };
             }
             UpdateRadrugaColor(missionRequest.User, false);
         }
     }
 }
Example #11
0
        /// <summary>
        ///     Updates the missionRequest.
        /// </summary>
        /// <param name="missionRequest">
        ///     The missionRequest.
        /// </param>
        /// <returns>
        ///     Task{OperationResult}.
        /// </returns>
        public async Task <OperationResult> UpdateMissionRequest(MissionRequest missionRequest)
        {
            var missionRequestsAzure =
                await
                _azureManager.GetEntitiesAsync(
                    new TableQuery <MissionRequestAzure>().Where(GetFilterByPartitionKey(missionRequest.Id)));

            var missionRequestAzure = missionRequestsAzure.FirstOrDefault();

            if (missionRequestAzure == null)
            {
                return(new OperationResult(OperationResultStatus.Error, "Can't find missionRequest for update"));
            }

            var updatedMissionRequest = missionRequest.ToAzureModel();

            var oldUrls = missionRequestAzure.ProofImageUrls.SplitStringByDelimiter();
            var newUrls = missionRequest.Proof.ImageUrls;
            await
            _imagesProvider.SaveImagesToProductionBlobOnUpdate(oldUrls, newUrls, BlobContainer.MissionRequestImages);

            updatedMissionRequest.ProofImageUrls = newUrls.JoinToString();
            updatedMissionRequest.CopyToTableEntity(missionRequestAzure);

            return(await _azureManager.UpdateEntityAsync(missionRequestAzure));
        }
Example #12
0
        private static async Task MissionFinished(
            MissionRequest missionRequest,
            bool success,
            IMissionRepository missionRepository,
            AppCountersService appCountersService)
        {
            var user          = missionRequest.User;
            var mission       = missionRequest.Mission;
            var changedSetIds = await GetChangedSetIds(missionRequest, success, missionRepository, user, mission);

            var lastSetExist = changedSetIds.Contains(GameConstants.MissionSet.LastSetId);

            foreach (var changedSetId in changedSetIds)
            {
                var hasOtherSetMissions = user.ActiveMissionIds.Any(m => m.MissionSetId == changedSetId);
                if (!hasOtherSetMissions)
                {
                    user.ActiveMissionSetIds.Remove(changedSetId);

                    user.CompletedMissionSetIds = user.CompletedMissionSetIds ?? new List <string>();
                    user.CompletedMissionSetIds.Add(changedSetId);

                    await CheckForLastSetAndLoadMissions(missionRequest, missionRepository, user, changedSetId, lastSetExist);
                }
            }

            await CheckLastSetCounters(missionRequest, appCountersService);

            UpdateThreeStarsAchievement(user, missionRequest.StarsCount);
        }
Example #13
0
        private static void SetStarsAccordingToTime(MissionRequest request)
        {
            if (!request.Proof.TimeElapsed.HasValue)
            {
                request.StarsCount = 0;
                return;
            }

            var time = request.Proof.TimeElapsed;

            if (time <= request.Mission.SecondsFor3Stars)
            {
                request.StarsCount = 3;
            }
            else if (time <= request.Mission.SecondsFor2Stars)
            {
                request.StarsCount = 2;
            }
            else if (time <= request.Mission.SecondsFor1Star)
            {
                request.StarsCount = 1;
            }
            else
            {
                request.StarsCount = 0;
            }
        }
Example #14
0
        public static async Task SetStarsAccordingToTries(
            MissionRequest request,
            IMissionRequestRepository missionRequestRepository)
        {
            Expression <Func <MissionRequest, bool> > filter =
                a => a.MissionId == request.MissionId && a.UserId == request.UserId;
            var previousRequiests =
                await missionRequestRepository.GetMissionRequests(new QueryOptions <MissionRequest> {
                Filter = filter
            });

            var tries = previousRequiests.Count + 1;

            if (tries <= request.Mission.TriesFor3Stars)
            {
                request.StarsCount = 3;
            }
            else if (tries <= request.Mission.TriesFor2Stars)
            {
                request.StarsCount = 2;
            }
            else if (tries <= request.Mission.TriesFor1Star)
            {
                request.StarsCount = 1;
            }
            else
            {
                throw new Exception("Can't pass mission with more tries than allowed");
            }
        }
Example #15
0
        private static async Task <IList <string> > GetChangedSetIds(
            MissionRequest missionRequest,
            bool success,
            IMissionRepository missionRepository,
            User user,
            Mission mission)
        {
            if (success)
            {
                user.CompletedMissionIds = user.CompletedMissionIds ?? new List <string>();
                user.CompletedMissionIds.Add(mission.Id);
            }
            else
            {
                user.FailedMissionIds = user.FailedMissionIds ?? new List <string>();
                user.FailedMissionIds.Add(mission.Id);
            }
            user.ActiveMissionIds.RemoveAll(m => m.MissionId == mission.Id);

            var autoRemovedActiveMissions = await CheckActiveMissionDependencies(missionRequest, success, missionRepository);

            var changedSetIds = autoRemovedActiveMissions.Select(m => m.MissionSetId).ToIList();

            if (!changedSetIds.Contains(mission.MissionSetId))
            {
                changedSetIds.Add(mission.MissionSetId);
            }
            return(changedSetIds);
        }
Example #16
0
        private static async Task CheckForLastSetAndLoadMissions(
            MissionRequest missionRequest,
            IMissionRepository missionRepository,
            User user,
            string changedSetId,
            bool lastSetExist)
        {
            var finishedSet = user.MissionSetIds.First(s => s.MissionSetId == changedSetId);

            if (!lastSetExist)
            {
                MissionSetIdWithOrder newSet;
                var currentOrder = finishedSet.Order + 1;
                do
                {
                    newSet = user.MissionSetIds.FirstOrDefault(s => s.Order == currentOrder);
                    if (newSet == null) //after 3 sets completed before test passed
                    {
                        break;
                    }
                    currentOrder++;
                }while ((user.ActiveMissionSetIds.Contains(newSet.MissionSetId) ||
                         user.CompletedMissionSetIds.Contains(newSet.MissionSetId)));

                if (newSet != null)
                {
                    user.ActiveMissionSetIds.Add(newSet.MissionSetId);
                    // go to db to load missions from set, not ideal but for now is ok
                    await LoadMissionsFromNewSet(missionRepository, newSet.MissionSetId, missionRequest.User);
                }
            }
        }
Example #17
0
        /// <summary>
        ///     Processes the request.
        /// </summary>
        /// <param name="request">The request.</param>
        /// <returns>Task{MissionCompletionResult}.</returns>
        public async Task <MissionCompletionResult> ProcessRequest(MissionRequest request)
        {
            var homeCoordinate = request.Proof.Coordinates.First();

            request.User.HomeCoordinate = homeCoordinate;
            var homePlaceIdResult = await _placeIdService.GetUniquePlaceId(request.User.HomeCoordinate);

            if (homePlaceIdResult == null)
            {
                request.DeclineReason = "Невозможно опеределить идентификатор города. Возможно, ты находишься в пути. Попробуй еще раз позже.";
                return(new MissionCompletionResult
                {
                    MissionCompletionStatus = MissionCompletionStatus.IntermediateFail,
                    Description = request.DeclineReason
                });
            }

            request.User.CityShortName    = homePlaceIdResult.CityShortName;
            request.User.CountryShortName = homePlaceIdResult.CountryShortName;
            request.StarsCount            = 3;
            var recievedPoints = await RewardsCalculator.UpdateUserAfterMissionCompletion(request, _missionRepository);

            await _appCountersService.UserPassedFirstMission();

            return(new MissionCompletionResult
            {
                Points = recievedPoints,
                StarsCount = request.StarsCount,
                MissionCompletionStatus = MissionCompletionStatus.Success
            });
        }
Example #18
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);
        }
Example #19
0
        private async Task <MissionCompletionResult> ProcessAutoApprovedMissions(MissionRequest missionRequest)
        {
            var oldUserPoints = missionRequest.User.Points;
            MissionCompletionResult result;

            switch (missionRequest.Mission.ExecutionType)
            {
            case ExecutionType.RightAnswer:
            {
                result = await ProcessRightAnswer(missionRequest);

                break;
            }

            case ExecutionType.Path:
            {
                result = await ProcessGeoCoordinate(missionRequest);

                break;
            }

            case ExecutionType.CommonPlace:
            {
                result = await ProcessCommonPlace(missionRequest);

                break;
            }

            default:
            {
                throw new ArgumentOutOfRangeException(nameof(missionRequest), "Incorrect execution type");
            }
            }

            if (result.Status != OperationResultStatus.Success ||
                result.MissionCompletionStatus == MissionCompletionStatus.IntermediateFail)
            {
                return(result);
            }

            //after any mission completion user should be updated
            var userUpdateResult = await _userRepository.UpdateUser(missionRequest.User);

            if (userUpdateResult.Status != OperationResultStatus.Error)
            {
                // new points should always have value
                // ReSharper disable once PossibleInvalidOperationException
                await _ratingService.UpdateUserRating(missionRequest.User, oldUserPoints, missionRequest.User.Points.Value);
            }

            return(userUpdateResult.Status == OperationResultStatus.Success
                       ? result
                       : MissionCompletionResult.FromOperationResult(userUpdateResult));
        }
Example #20
0
 private static async Task CheckLastSetCounters(
     MissionRequest missionRequest,
     AppCountersService appCountersService)
 {
     if (appCountersService != null && !missionRequest.User.ActiveMissionIds.Any() &&
         !missionRequest.User.ActiveMissionSetIds.Any() &&
         !string.IsNullOrEmpty(missionRequest.User.RadrugaColor))
     {
         await appCountersService.UserHasFinished();
     }
 }
Example #21
0
        /// <summary>
        /// Processes the request.
        /// </summary>
        /// <param name="request">The request.</param>
        /// <returns>Task{MissionCompletionResult}.</returns>
        public async Task <MissionCompletionResult> ProcessRequest(MissionRequest request)
        {
            request.StarsCount = 3;
            var recievedPoints = await RewardsCalculator.UpdateUserAfterMissionCompletion(request, _missionRepository);

            return(new MissionCompletionResult
            {
                Points = recievedPoints,
                StarsCount = request.StarsCount,
                MissionCompletionStatus = MissionCompletionStatus.Success
            });
        }
        /// <summary>
        ///     The update mission request.
        /// </summary>
        /// <param name="missionRequest">
        ///     The mission request.
        /// </param>
        /// <returns>
        ///     The <see cref="Task" />.
        /// </returns>
        public async Task <OperationResult> UpdateMissionRequest(MissionRequest missionRequest)
        {
            var existingMissionRequest = await GetMissionRequest(missionRequest.Id);

            if (existingMissionRequest == null)
            {
                return(OperationResult.NotFound);
            }

            missionRequest.CopyTo(existingMissionRequest);
            return(new OperationResult(OperationResultStatus.Success));
        }
Example #23
0
        /// <summary>
        ///     Processes the request.
        /// </summary>
        /// <param name="request">The request.</param>
        /// <returns>Task{MissionCompletionResult}.</returns>
        public async Task <MissionCompletionResult> ProcessRequest(MissionRequest request)
        {
            var users = await _userRepository.GetUsers(new QueryOptions <User> {
                Filter = u => u.Id != request.UserId, Select = u => u.HomeCoordinate
            });

            var           coordinates           = users.Select(u => u.HomeCoordinate).Where(coord => coord != null);
            var           passedCoordinate      = request.Proof.Coordinates.First();
            GeoCoordinate friendsBaseCoordinate = null;

            foreach (var geoCoordinate in coordinates)
            {
                var distance = passedCoordinate.GetDistanceTo(geoCoordinate);

                if (distance <= 100)
                {
                    request.StarsCount = 1;
                    if (distance <= 50)
                    {
                        request.StarsCount = 2;
                    }
                    if (distance <= 10)
                    {
                        request.StarsCount = 3;
                    }
                    friendsBaseCoordinate = geoCoordinate;
                    break;
                }
            }

            if (friendsBaseCoordinate == null)
            {
                request.DeclineReason = "Мы не смогли найти ни одного пользователя с таким командным пунктом";
                await RewardsCalculator.UpdateUserAfterMissionDecline(request, _missionRepository, _appCountersService);

                return(new MissionCompletionResult
                {
                    MissionCompletionStatus = MissionCompletionStatus.Fail,
                    Description = request.DeclineReason
                });
            }

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

            return(new MissionCompletionResult
            {
                Points = recievedPoints,
                StarsCount = request.StarsCount,
                MissionCompletionStatus = MissionCompletionStatus.Success
            });
        }
Example #24
0
        public async Task <IActionResult> AddMission([FromBody] MissionRequest missionRequest)
        {
            bool result = await _missionService.AddMission(missionRequest);

            if (result)
            {
                return(Ok(new { message = "Mission was created" }));
            }
            else
            {
                return(StatusCode(500, "An error occured"));
            }
        }
Example #25
0
        /// <summary>
        ///     Updates the user ater mission decline.
        /// </summary>
        /// <param name="missionRequest">The mission request.</param>
        /// <param name="missionRepository">The mission repository.</param>
        /// <param name="appCountersService">The application counters service.</param>
        /// <returns>
        ///     If not empty returns the set id, so active missions need to be populated
        /// </returns>
        public static async Task UpdateUserAfterMissionDecline(
            MissionRequest missionRequest,
            IMissionRepository missionRepository,
            AppCountersService appCountersService = null)
        {
            var pointsDecrease =
                (ushort)
                (missionRequest.Mission.Difficulty * GameConstants.Experience.PerDifficultyPoint
                 * GameConstants.Points.ExtraMultiplier);

            missionRequest.User.Points = (missionRequest.User.Points ?? 0) - pointsDecrease;

            CalculatePersonQualities(missionRequest, false);

            await MissionFinished(missionRequest, false, missionRepository, appCountersService);
        }
Example #26
0
        // GET: Admin/MissionRequests/Details/5

        /// <summary>
        /// Detailses the specified id.
        /// </summary>
        /// <param name="id">The id.</param>
        /// <returns>Task{ActionResult}.</returns>
        public async Task <ActionResult> Details(string id)
        {
            if (id == null)
            {
                return(new HttpStatusCodeResult(HttpStatusCode.BadRequest));
            }

            MissionRequest missionRequest = await _missionRequestService.GetRequest(id);

            if (missionRequest == null)
            {
                return(HttpNotFound());
            }

            return(View(missionRequest));
        }
Example #27
0
        /// <summary>
        /// Add mission and the correspondent agent and country
        /// </summary>
        /// <param name="mission"></param>
        /// <returns></returns>
        public async Task <bool> AddMission(MissionRequest missionRequest)
        {
            Mission mission = _mapper.Map <Mission>(missionRequest);

            //if agent already eixst we will not add another one
            Agent agent = await _missionRepository.GetAgentByName(mission.Agent.Name);

            mission.Agent = agent ?? mission.Agent;

            //if country already eixst we will not add another one
            Country country = await _missionRepository.GetCountryByName(mission.Country.Name);

            mission.Country = country ?? mission.Country;

            return(await _missionRepository.AddMission(mission));
        }
Example #28
0
        /// <summary>
        ///     To the azure model.
        /// </summary>
        /// <param name="missionRequest">The mission request.</param>
        /// <returns>MissionRequestAzure</returns>
        public static MissionRequestAzure ToAzureModel(this MissionRequest missionRequest)
        {
            var azureModel = new MissionRequestAzure();

            missionRequest.CopyTo(azureModel);
            azureModel.StarsCount = missionRequest.StarsCount;
            azureModel.Status     = missionRequest.Status.ToString();
            //set proofs
            azureModel.ProofImageUrls   = missionRequest.Proof.ImageUrls?.JoinToString();
            azureModel.ProofCoordinates = missionRequest.Proof.Coordinates?.Select(coord => coord.ConvertToAzureCoordinate())
                                          .JoinToString(CommonConstants.Delimiter);
            azureModel.CreatedText   = missionRequest.Proof.CreatedText;
            azureModel.TimeElapsed   = missionRequest.Proof.TimeElapsed;
            azureModel.NumberOfTries = missionRequest.Proof.NumberOfTries;
            return(azureModel);
        }
Example #29
0
        private async Task <RightAnswerMissionCompletionResult> ProcessRightAnswer(MissionRequest request)
        {
            var userAnswers = request.Proof.CreatedText.Trim().SplitStringByDelimiter();

            if (!userAnswers.AnyValues())
            {
                return(new RightAnswerMissionCompletionResult(OperationResultStatus.Error, "Ответ не может быть пустым"));
            }

            var           rightAnswers = AnswerModelHelper.SplitAnswer(request.Mission.CorrectAnswers);
            List <string> userAnswerStatuses;
            var           invalidAnswersCount = ParseUserAnswers(rightAnswers, userAnswers, request.Mission.ExactAnswer ?? false, out userAnswerStatuses);
            var           rightAnswersCount   = userAnswers.Count - invalidAnswersCount;

            if (rightAnswersCount == 0 || rightAnswersCount < request.Mission.AnswersCount)
            {
                var result = await ProcessIncorrectTry(request, _missionRepository, _missionRequestRepository);

                var rightAnswerResult = RightAnswerMissionCompletionResult.FromMissionCompletionResult(result);
                request.DeclineReason            = userAnswerStatuses.JoinToString();
                rightAnswerResult.AnswerStatuses = userAnswerStatuses;

                return(rightAnswerResult);
            }

            await SetStarsAccordingToTries(request, _missionRequestRepository);

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

            var requestResult = await _missionRequestRepository.AddMissionRequest(request);

            if (requestResult.Status != OperationResultStatus.Success)
            {
                return
                    (RightAnswerMissionCompletionResult.FromMissionCompletionResult(
                         MissionCompletionResult.FromOperationResult(requestResult)));
            }

            return(new RightAnswerMissionCompletionResult
            {
                Points = recievedPoints,
                StarsCount = request.StarsCount,
                MissionCompletionStatus = MissionCompletionStatus.Success
            });
        }
Example #30
0
        /// <summary>
        ///     Adds the missionRequest.
        /// </summary>
        /// <param name="missionRequest">
        ///     The missionRequest.
        /// </param>
        /// <returns>
        ///     Task{AddResult}.
        /// </returns>
        public async Task <IdResult> AddMissionRequest(MissionRequest missionRequest)
        {
            missionRequest.Id = Guid.NewGuid().ToString("N");
            if (missionRequest.Proof.ImageUrls != null)
            {
                var newUrlsTasks =
                    missionRequest.Proof.ImageUrls.Select(
                        async url =>
                        await _imagesProvider.SaveImageToProductionBlobOnAdd(url, BlobContainer.MissionRequestImages));
                var newUrls = await Task.WhenAll(newUrlsTasks);

                missionRequest.Proof.ImageUrls = newUrls.ToList();
            }

            var azureModel = missionRequest.ToAzureModel();

            return(await _azureManager.AddEntityAsync(azureModel));
        }