/// <summary> /// Upserts all entries into the cache. /// </summary> public async Task <IEnumerable <TResource> > UpsertAll() { var resourcesPage = await PokeApi.GetNamedPage <TResource>(); var allResources = await GetAllResources(); if (!allResources.Any() || allResources.ToList().Count != resourcesPage.Count) { const int pageSize = 20; var entryList = new List <TResource>(); var pagesUsed = 0; NamedApiResourceList <TResource> page; do { page = await PokeApi.GetNamedPage <TResource>(pageSize, pageSize *pagesUsed++); var entries = await UpsertMany(page.Results); entryList.AddRange(entries); } while (!string.IsNullOrEmpty(page.Next)); return(entryList); } // if we have the right number of entries then we're probably good return(allResources); }
/// <summary> /// Returns the resource with the given ID, creating a cache entry if it doesn't exist. /// </summary> public override async Task <TResource> Upsert(UrlNavigation <TResource> res) { if (res == null) { return(null); } var namedRes = res as NamedApiResource <TResource>; var name = namedRes.Name; var entry = await CacheSource.GetCacheEntry(name); if (entry == null) { var entryType = typeof(TResource).Name; Logger.LogInformation($"Caching {entryType} with name {name}..."); var resource = await PokeApi.Get(res); return(await Create(resource)); } else if (IsStale(entry)) { // update cache entry if it's stale var entryType = typeof(TResource).Name; Logger.LogInformation($"Cached {entryType} with name {name} is stale - updating..."); var resource = await PokeApi.Get(res); await Update(resource); return(resource); } return(entry.Resource); }
/// <summary> /// Returns all Pokemon species up to a limit from an offset. /// </summary> public async Task <PokemonSpeciesEntry[]> GetPokemonSpecies(int limit, int offset) { var resources = await PokeApi.GetNamedPage <PokemonSpecies>(limit, offset); var species = await UpsertMany(resources); return(species.OrderBy(s => s.SpeciesId).ToArray()); }
public void Setup() { Mocker = new AutoMocker(); optionsValues = new PokeApi { ImgUrl = "urlImg.com", PokeApiUrl = "https://pokeapi.co/api/v2/pokemon/", Weaknesses = "https://pokeapi.co/api/v2/pokemon/" }; }
public void Setup() { Mocker = new AutoMocker(); optionsValues = new PokeApi { ImgUrl = "https://assets.pokemon.com/assets/cms2/img/pokedex/full", PokeApiUrl = "https://pokeapi.co/api/v2/pokemon/", Weaknesses = "https://pokeapi.co/api/v2/pokemon/" }; }
/// <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); }
static void Main(string[] args) { StreamWriter FileLog = new StreamWriter(@"TestApiList.log", false); foreach (PropertyInfo prop in typeof(UriInfo).GetProperties()) { WriteLog(FileLog); WriteLog(FileLog, $"TEST API [{prop.Name}] START: "); try { string url = prop.GetValue(PokeApi.ApiUri).ToString(); WriteLog(FileLog, $"Requesting to {url}"); var result = PokeApi.Call_GetList(requestUrl: url, limit: 3); WriteLog(FileLog, $"Response:"); #region WriteLog(FileLog, $"\tCount:\t{result.Count}"); WriteLog(FileLog, $"\tNext:\t{result.Next}"); WriteLog(FileLog, $"\tPrev:\t{result.Previous}"); WriteLog(FileLog, $"\tResult:"); foreach (var item in result.Results) { WriteLog(FileLog, $"\t\tName:{item.Name}"); WriteLog(FileLog, $"\t\tUrl:{item.Url}"); } #endregion } catch (Exception ex) { WriteLog(FileLog, $"ERROR: {ex.Message}"); } WriteLog(FileLog, $"TEST API [{prop.Name}] END."); WriteLog(FileLog); } FileLog.Close(); }
private void Awake() { api = this; }
public static async Task <List <PokeApi> > GetOnePokemon(int pokeId) { List <PokeApi> _pokemon = new List <PokeApi>(); //Define your base url string baseURL = $"http://pokeapi.co/api/v2/pokemon/{pokeId}/"; //Have your api call in try/catch block. try { using (HttpClient client = new HttpClient()) { using (HttpResponseMessage res = await client.GetAsync(baseURL)) { using (HttpContent content = res.Content) { string data = await content.ReadAsStringAsync(); if (data != null) { //Parses the data to a object var dataObj = JObject.Parse(data); //this will create a new instance of PokeApi, and string interpolate the name property to the JSON object. ////Which will convert it to a string, since each property value is a instance of JToken. try // Need to get rid of this try catch and replace it with a if(["types"].count > 1{}) { PokeApi PokeApis = new PokeApi(name: $"{dataObj["name"]}" // for the pokemon's name , spriteUrl: $"{dataObj["sprites"]["front_default"]}" // for the sprite url , types: $"{dataObj["types"][0]["type"]["name"] + "/" + dataObj["types"][1]["type"]["name"]}" //for the types , pokedexId: $"{dataObj["id"]}"); //Console.WriteLine("Pokemon Name: {0} \nSprite URL: {1} \nPokemon Type(s): {2}\nPokedex ID: {3}", PokeApis.name, PokeApis.spriteUrl, PokeApis.types, PokeApis.pokedexId); _pokemon.Add(PokeApis); return(_pokemon); } catch (Exception ex) { PokeApi PokeApis = new PokeApi(name: $"{dataObj["name"]}" // for the pokemon's name , spriteUrl: $"{dataObj["sprites"]["front_default"]}" // for the sprite url , types: $"{dataObj["types"][0]["type"]["name"]}" //for the types - dont know if it prints for dual type , pokedexId: $"{dataObj["id"]}"); //Console.WriteLine("Pokemon Name: {0} \nSprite URL: {1} \nPokemon Type: {2}\nPokedex ID: {3}", PokeApis.name, PokeApis.spriteUrl, PokeApis.types, PokeApis.pokedexId); _pokemon.Add(PokeApis); return(_pokemon); } } else { //If data is null log it into console. Console.WriteLine("Data is null!"); return(null); } } } } //Catch any exceptions and log it into the console. } catch (Exception exception) { Console.WriteLine(exception); return(null); } }
public async Task Pokemon([Remainder] String name) => await PokeApi.getPokemonInfo(Context, name);