/// <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);
        }
Exemple #4
0
        /// <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);
        }
Exemple #5
0
        /// <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);
        }