/// <summary> /// Grabs the details of a Match from the Riot API /// </summary> /// <param name="region">Region to fetch from</param> /// <param name="matchId">Id of the Match to fetch</param> /// <returns>MatchDetail object containing the details of the match</returns> public static MatchDetail GetMatch(string region, int matchId) { Logger.LogMessageToFile(MethodBase.GetCurrentMethod().DeclaringType.ToString(), "Loading Match " + matchId); // Load the match from our Cache if we can, as this is much faster and saves on API calls var cachedMatch = CacheService <MatchDetail> .GetFromCache("MatchCache", region, matchId); if (cachedMatch != null && cachedMatch.MatchId != 0) { cachedMatch.FromCache = true; return(cachedMatch); } var client = ApiTools.ApiClient(region); var request = new RestRequest(UrlFormat, Method.GET); request.AddUrlSegment("region", region); request.AddUrlSegment("matchid", matchId.ToString()); request.AddParameter("includeTimeline", true); request.AddApiKey(); var response = client.Execute <MatchDetail>(request); //Check to see if we are approaching rate limiting if (response.StatusCode == HttpStatusCode.ServiceUnavailable || response.StatusCode.ToString() == "429") { Logger.LogMessageToFile(MethodBase.GetCurrentMethod().DeclaringType.ToString(), "Too many calls, briefly pausing. Headers: " + String.Join(",", response.Headers)); Thread.Sleep(Convert.ToInt32(ConfigurationManager.AppSettings["msBetweenApiCalls"]) * 2); } var match = response.Data; match.FromCache = false; Logger.LogMessageToFile(MethodBase.GetCurrentMethod().DeclaringType.ToString(), "ResponseCode: " + response.StatusCode); if (match.MatchId == 0) { Logger.LogMessageToFile(MethodBase.GetCurrentMethod().DeclaringType.ToString(), "Warning: Did not correctly load Match " + matchId + " Response: " + response.StatusDescription); } else { CacheService <MatchDetail> .WriteToCache("MatchCache", region, matchId, match); } // Save match to file cache return(match); }
/// <summary> /// Scrapes the Id's of current featured Matches in a region. Used to keep statistics up to date. /// This method is called externally. /// </summary> /// <param name="region"></param> public static void ScrapeCurrentFeaturedGames(string region) { Logger.LogMessageToFile(MethodBase.GetCurrentMethod().DeclaringType.ToString(), "Scraping current featured games"); var client = ApiTools.ApiClient(region); var request = new RestRequest( "/observer-mode/rest/featured", Method.GET); request.AddApiKey(); var response = client.Execute <FeaturedGames>(request); //Check to see if we are approaching rate limiting if (response.StatusCode == HttpStatusCode.ServiceUnavailable || response.StatusCode.ToString() == "429") { Logger.LogMessageToFile(MethodBase.GetCurrentMethod().DeclaringType.ToString(), "Too many calls, briefly pausing. Headers: " + String.Join(",", response.Headers)); Thread.Sleep(Convert.ToInt32(ConfigurationManager.AppSettings["msBetweenApiCalls"]) * 2); } var container = ApiTools.GetBlobContainer("matches"); var blob = container.GetAppendBlobReference("matchIds.txt"); if (!blob.Exists()) { blob.CreateOrReplace(); } foreach (var game in response.Data.GameList) { // Only scrape Ranked games on Summoner's Rift if ((game.GameQueueConfigId == 4 || game.GameQueueConfigId == 42) && game.MapId == 11) { blob.AppendText(game.GameId.ToString() + "\n"); } } Logger.LogMessageToFile(MethodBase.GetCurrentMethod().DeclaringType.ToString(), String.Format("Scrape complete, {0} games scraped", response.Data.GameList.Count)); }
/// <summary> /// Loads an Champion from cache or from the API /// </summary> /// <param name="region">Region of data</param> /// <param name="championId">ID of champion</param> public static Champion GetChampion(string region, int championId) { // Two layer caching: File and CurrentCache. var cacheName = "champ_" + region + "_" + championId; var cached = HttpContext.Current.Cache[cacheName] as Champion; if (cached != null) { return(cached); } cached = CacheService <Champion> .GetFromCache("ChampionCache", region, championId); if (cached != null) { return(cached); } var client = ApiTools.ApiClient(region); var request = new RestRequest(UrlFormat + "/{championid}", Method.GET); request.AddUrlSegment("region", region); request.AddUrlSegment("method", "champion"); request.AddUrlSegment("championid", championId.ToString()); request.AddParameter("champData", "image"); request.AddApiKey(); var response = client.Execute <Champion>(request); // Write to both File and Current cache CacheService <Champion> .WriteToCache("ChampionCache", region, championId, response.Data); HttpContext.Current.Cache[cacheName] = response.Data; return(response.Data); }
/// <summary> /// Loads an Item from cache or from the API /// </summary> /// <param name="region">Region of data</param> /// <param name="itemId">ID of item</param> public static Item GetItem(string region, long itemId) { // Two layer caching: File and CurrentCache. var cacheName = "item_" + region + "_" + itemId; var cached = HttpContext.Current.Cache[cacheName] as Item; if (cached != null) { return(cached); } cached = CacheService <Item> .GetFromCache("ItemCache", region, (int)itemId); if (cached != null) { return(cached); } var client = ApiTools.ApiClient(region); var request = new RestRequest(UrlFormat + "/{itemid}", Method.GET); request.AddUrlSegment("region", region); request.AddUrlSegment("method", "item"); request.AddUrlSegment("itemid", itemId.ToString()); request.AddParameter("itemData", "consumed,from,gold,into,image"); request.AddApiKey(); var response = client.Execute <Item>(request); // Write to both File and Current cache CacheService <Item> .WriteToCache("ItemCache", region, (int)itemId, response.Data); HttpContext.Current.Cache[cacheName] = response.Data; return(response.Data); }