public override async Task <bool> UpdateMissionProgression(Observation observation, ObservationStatement statement, ActionType?type)
        {
            bool conditionsCompleted = true;

            //Si la mission à une restriction géographique on vérifie que nous somme dedans
            if (!this.ValidateRestrictedArea(observation))
            {
                return(false);
            }

            //si ce n'est pas une action de création de proposition ou d'observation ça ne concerne pas ce type de mission
            if (!type.HasValue || (type.Value != ActionType.CreateStatement && type.Value != ActionType.CreateObservation))
            {
                return(false);
            }

            var missionProgressHistory  = User.MissionProgress.History?.ToList() ?? new List <MissionProgressionHistory>();
            var observationsFromHistory = await this.ObservationsManager.GetObservationsByIds(missionProgressHistory.Select(x => x.ObservationId).ToArray());

            //Si on arrive la alors nous avons forcement un statement...
            if (missionProgressHistory.Any(h => h.ObservationId == observation.Id))
            {
                return(false);
            }
            switch (this.Mission.Type)
            {
            case NewObservationMissionType.DifferentGenders:
                if (observationsFromHistory.Any(x => x.ObservationStatements.Any(s => s.UserId == User.OsmId && s.CommonGenus.ToLowerInvariant().RemoveDiacritics() == statement.CommonGenus.ToLowerInvariant().RemoveDiacritics())))
                {
                    return(false);
                }
                break;

            case NewObservationMissionType.DifferentSpecies:
                if (observationsFromHistory.Any(x => x.ObservationStatements.Any(s => s.UserId == User.OsmId && s.CommonSpeciesName.ToLowerInvariant().RemoveDiacritics() == statement.CommonSpeciesName.ToLowerInvariant().RemoveDiacritics())))
                {
                    return(false);
                }
                break;

            case NewObservationMissionType.ExactSpecies:
                if (statement.CommonSpeciesName.ToLowerInvariant().RemoveDiacritics() != this.Mission.Value.ToLowerInvariant().RemoveDiacritics() || statement.SpeciesName.ToLowerInvariant().RemoveDiacritics() != this.Mission.Value.ToLowerInvariant().RemoveDiacritics())
                {
                    return(false);
                }
                break;

            case NewObservationMissionType.ExactGender:
                if (!(statement.CommonGenus.RemoveDiacritics().ToLowerInvariant() == this.Mission.Value.RemoveDiacritics().ToLowerInvariant() || statement.Genus.RemoveDiacritics().ToLowerInvariant() == this.Mission.Value.RemoveDiacritics().ToLowerInvariant()))
                {
                    return(false);
                }
                break;
            }


            missionProgressHistory.Add(new MissionProgressionHistory
            {
                ObservationId = observation.Id,
                Date          = DateTime.UtcNow,
                StatementId   = statement?.Id,
                Type          = type.Value
            });


            if (this.Mission.EndingCondition.GetType() == typeof(NumberOfActions))
            {
                NumberOfActions endCondition = (NumberOfActions)this.Mission.EndingCondition;
                if (missionProgressHistory.Count() < endCondition.Number)
                {
                    conditionsCompleted = false;
                }
            }
            if (this.Mission.EndingCondition.GetType() == typeof(TimeLimit))
            {
                TimeLimit timeLimit = (TimeLimit)this.Mission.EndingCondition;
                conditionsCompleted = this.IsTimerEnd(timeLimit.Minutes, User.MissionProgress.StartDate);
            }
            if (conditionsCompleted)
            {
                await this.UsersManager.EndCurrentMission(userId : this.User.OsmId, missionProgressHistory.ToArray());
            }
            else
            {
                await this.UpdateProgression(missionProgressHistory.ToArray());
            }

            return(true);
        }
Пример #2
0
        public override async Task <bool> UpdateMissionProgression(Observation observation, ObservationStatement statement, ActionType?type)
        {
            bool conditionsCompleted = true;

            //Si la mission à une restriction géographique on vérifie que nous somme dedans
            if (!this.ValidateRestrictedArea(observation))
            {
                return(false);
            }

            //si ce n'est pas une action de création de proposition ou de confirmation ça ne concerne pas ce type de mission
            if (!type.HasValue || (type.Value != ActionType.CreateStatement && type.Value != ActionType.ConfirmStatement))
            {
                return(false);
            }

            //Si on demande une observation avec photos mais qu'il y en a pas on ignore
            if (this.Mission.ObservationWithPics && (observation.Pictures == null || !observation.Pictures.Any()))
            {
                return(false);
            }
            //Si on ne demande pas les observation fiable, et que l'observation modifié n'est pas déjà fiable.
            if (!this.Mission.UnreliableObservation && observation.StatementValidatedId == null)
            {
                return(false);
            }

            Console.WriteLine(User.MissionProgress.History);
            var missionProgressHistory  = User.MissionProgress.History?.ToList() ?? new List <MissionProgressionHistory>();
            var observationsFromHistory = await this.ObservationsManager.GetObservationsByIds(missionProgressHistory.Select(x => x.ObservationId).ToArray());


            //Question Est-ce que si le relevé est certains, on vérifie qu'il valide bien la bonne données

            if (this.Mission.Restriction != null)
            {
                var value = this.Mission.Restriction.Value?.ToLowerInvariant().RemoveDiacritics().Trim();
                if (!string.IsNullOrEmpty(value))
                {
                    switch (this.Mission.Restriction.Type)
                    {
                    case RestrictionType.ExactSpecies:
                        if (statement.CommonSpeciesName?.ToLowerInvariant().RemoveDiacritics().Trim() != value && statement.SpeciesName?.ToLowerInvariant().RemoveDiacritics().Trim() != value)
                        {
                            return(false);
                        }
                        break;

                    case RestrictionType.ExactGender:
                        if (statement.CommonGenus?.ToLowerInvariant().RemoveDiacritics().Trim() != value && statement.Genus?.ToLowerInvariant().RemoveDiacritics().Trim() != value)
                        {
                            return(false);
                        }
                        break;
                    }
                }
            }

            missionProgressHistory.Add(new MissionProgressionHistory
            {
                ObservationId = observation.Id,
                Date          = DateTime.UtcNow,
                StatementId   = statement?.Id,
                Type          = type.Value
            });

            if (this.Mission.EndingCondition.GetType() == typeof(NumberOfActions))
            {
                NumberOfActions endCondition = (NumberOfActions)this.Mission.EndingCondition;
                if (missionProgressHistory.Count() < endCondition.Number)
                {
                    conditionsCompleted = false;
                }
            }
            if (this.Mission.EndingCondition.GetType() == typeof(TimeLimit))
            {
                TimeLimit timeLimit = (TimeLimit)this.Mission.EndingCondition;
                conditionsCompleted = this.IsTimerEnd(timeLimit.Minutes, User.MissionProgress.StartDate);
            }

            if (conditionsCompleted)
            {
                await this.UsersManager.EndCurrentMission(userId : this.User.OsmId, missionProgressHistory.ToArray());
            }
            else
            {
                await this.UpdateProgression(missionProgressHistory.ToArray());
            }
            return(false);
        }
Пример #3
0
        public async Task <bool> UpdateIdentifyMissionProgression(string observationId, Mission mission, ObservationStatement identification, string osmId)
        {
            bool        isMissionCompleted = false;
            bool        isIdentified       = true;
            Observation observation        = await this.ObservationsManager.GetObservationbyId(observationId);

            ObservationStatement observationStatement = observation.ObservationStatements.FirstOrDefault(x => x.Id == observation.StatementValidatedId);

            if (mission.GetType() == typeof(NewObservationMission) || mission.GetType() == typeof(VerificationMission))
            {
                return(false);
            }
            IdentificationMission identifyMission = (IdentificationMission)mission;

            if (identifyMission.Restriction == null || string.IsNullOrEmpty(identifyMission.Restriction.Value))
            {
                if (!(observationStatement.Genus == identification.Genus && observationStatement.SpeciesName == identification.SpeciesName))
                {
                    isIdentified = false;
                }
            }
            else
            {
                var value = identifyMission.Restriction.Value.ToLowerInvariant().RemoveDiacritics().Trim();
                if (identifyMission.Restriction.Type == RestrictionType.ExactGender)
                {
                    if (value != identification.Genus?.ToLowerInvariant().RemoveDiacritics().Trim() && value != identification.CommonGenus?.ToLowerInvariant().RemoveDiacritics().Trim())
                    {
                        isIdentified = false;
                    }
                }
                else if (identifyMission.Restriction.Type == RestrictionType.ExactSpecies)
                {
                    if (value != identification.SpeciesName?.ToLowerInvariant().RemoveDiacritics().Trim() && value != identification.CommonSpeciesName?.ToLowerInvariant().RemoveDiacritics().Trim())
                    {
                        isIdentified = false;
                    }
                }
            }
            User user = await this.UsersManager.SelectAsync(osmId);

            var missionProgressHistory = user.MissionProgress.History?.ToList() ?? new List <MissionProgressionHistory>();

            missionProgressHistory.Add(new MissionProgressionHistory
            {
                ObservationId      = observation.Id,
                Date               = DateTime.UtcNow,
                StatementId        = observationStatement?.Id,
                Type               = ActionType.Recognition,
                Gender             = identification.Genus,
                Species            = identification.SpeciesName,
                SuccessRecognition = isIdentified
            });
            user.MissionProgress.Progression += isIdentified ? 1 : 0;
            if (identifyMission.EndingCondition.GetType() == typeof(NumberOfActions))
            {
                NumberOfActions numberOfActions = (NumberOfActions)identifyMission.EndingCondition;
                if (user.MissionProgress.Progression == numberOfActions.Number)
                {
                    isMissionCompleted = true;
                }
            }
            if (identifyMission.EndingCondition.GetType() == typeof(TimeLimit))
            {
                TimeLimit timeLimit = (TimeLimit)identifyMission.EndingCondition;
                if (this.IsTimerEnd(timeLimit.Minutes, user.MissionProgress.StartDate))
                {
                    isMissionCompleted = true;
                }
            }
            if (isMissionCompleted)
            {
                await this.UsersManager.EndCurrentMission(osmId, missionProgressHistory.ToArray());
            }
            else
            {
                await this.UpdateProgression(missionProgressHistory.ToArray(), true, isIdentified);
            }
            return(isIdentified);
        }