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