/// <summary> /// Returns encounter details sorted by method, indexed by version ID, from the given version details. /// </summary> public async Task <IEnumerable <WithId <EncounterMethodDetails[]> > > GetEncounterDetails(IEnumerable <VersionEncounterDetail> versionEncounterDetails) { var entryList = new List <WithId <EncounterMethodDetails[]> >(); var versionGroupings = versionEncounterDetails.GroupBy(d => d.Version, new NamedApiResourceComparer <Version>()); // loop through versions foreach (var versionGrouping in versionGroupings) { var encountersList = versionGrouping.Select(g => g.EncounterDetails); var methodDetailsList = new List <EncounterMethodDetails>(); // loop through list of encounters in each version foreach (var encounters in encountersList) { var methodDetails = await GetEncounterMethodDetails(encounters); methodDetailsList.AddRange(methodDetails); } var version = await VersionService.Upsert(versionGrouping.Key); var versionEntry = new WithId <EncounterMethodDetails[]>(version.VersionId, methodDetailsList.ToArray()); entryList.Add(versionEntry); } return(entryList); }
/// <summary> /// Returns the Pokemon's encounters in all version groups. /// </summary> private async Task <List <WithId <EncounterEntry[]> > > GetEncounters(Pokemon pokemon) { var encounterEntriesList = new List <WithId <EncounterEntry[]> >(); // enumerate version groups spanned by this Pokemon's encounters // TODO: create encounters cache service var encounters = await PokeApi.GetEncounters(pokemon); var versions = await VersionService.UpsertMany(encounters.GetDistinctVersions()); var versionGroups = await VersionGroupsService.UpsertManyByVersionIds(versions.Select(v => v.VersionId)); foreach (var vg in versionGroups) { var relevantEncounters = encounters.Where(e => IsInVersionGroup(e, vg)); // create entries for relevant encounters var encounterEntries = new List <EncounterEntry>(); foreach (var encounter in relevantEncounters) { var locationArea = await LocationAreasService.Upsert(encounter.LocationArea); var displayNames = await GetDisplayNames(encounter); // filter to relevant version details var relevantVersionDetails = encounter.VersionDetails.Where(vd => { var versionName = vd.Version.Name; return(vg.Versions.Select(v => v.Name).Contains(versionName)); }); var chances = await GetChances(relevantVersionDetails); var encounterDetails = await GetEncounterDetails(relevantVersionDetails); var encounterEntry = new EncounterEntry { LocationAreaId = locationArea.LocationAreaId, DisplayNames = displayNames.ToList(), Details = encounterDetails.ToList() }; encounterEntries.Add(encounterEntry); } // add encounter entries to list indexed by version group ID var entryList = new WithId <EncounterEntry[]>(vg.VersionGroupId, encounterEntries.ToArray()); encounterEntriesList.Add(entryList); } return(encounterEntriesList); }
/// <summary> /// Returns the chances of the given encounter indexed by version ID. /// </summary> private async Task <IEnumerable <WithId <int> > > GetChances(IEnumerable <VersionEncounterDetail> encounterDetails) { var chancesList = new List <WithId <int> >(); foreach (var vd in encounterDetails) { var version = await VersionService.Upsert(vd.Version); var chance = new WithId <int>(version.VersionId, vd.MaxChance); chancesList.Add(chance); } return(chancesList); }
/// <summary> /// Returns the moves of the given Pokemon. /// </summary> private async Task <IEnumerable <WithId <Move[]> > > GetMoves(Pokemon pokemon) { var movesList = new List <WithId <Move[]> >(); var versionGroups = await VersionGroupService.GetAll(); foreach (var vg in versionGroups) { var moves = await GetMoves(pokemon, vg); var movesEntry = new WithId <Move[]>(vg.VersionGroupId, moves.ToArray()); movesList.Add(movesEntry); } return(movesList); }
/// <summary> /// Returns the held items of the given Pokemon, indexed by version ID. /// </summary> private async Task <IEnumerable <WithId <VersionHeldItemContext[]> > > GetHeldItems(Pokemon pokemon) { var itemsList = new List <WithId <VersionHeldItemContext[]> >(); var versions = await VersionService.GetAll(); foreach (var v in versions) { var items = await GetHeldItems(pokemon, v); if (items.Any()) { var itemsEntry = new WithId <VersionHeldItemContext[]>(v.VersionId, items.ToArray()); itemsList.Add(itemsEntry); } } return(itemsList); }