public RiotRestAPI.ItemDTO LoadItem(string region, string version, int itemId)
        {
            RiotRestAPI.ItemDTO item = null;

            if (DoesRawCachedCopyOfItemExist(region, version, itemId))
            {
                item = LoadItemFromRawFile(region, version, itemId);
            }
            else
            {
                string rawResponse = "";
                item = LoadItemFromAPI(region, version, itemId, ref rawResponse);

                if (item != null)
                {
                    // Save the raw response file to speed up future queries
                    string prettyJSON = JsonPrettyPrinterPlus.PrettyPrinterExtensions.PrettyPrintJson(rawResponse);

                    string[]   rawfilePathParts = new string[] { _rawItemDataDirectory, GenerateRawItemFileName(region, version, itemId) };
                    string     filePath         = System.IO.Path.Combine(rawfilePathParts);
                    FileStream fstream          = new FileStream(filePath, FileMode.Create);
                    byte[]     data             = Encoding.ASCII.GetBytes(prettyJSON);
                    fstream.Write(data, 0, data.Length);
                    fstream.Close();
                }
            }

            return(item);
        }
        private ItemDTO LoadItemFromAPI(string region, string version, int itemId, ref string rawResponse)
        {
            RiotRestAPI.ItemDTO item = null;

            bool rateLimitHit = true;

            while (rateLimitHit)
            {
                string resource = "/static-data/" + region + "/v1.2/item/" + itemId;

                Dictionary <string, string> queryParams = new Dictionary <string, string>();
                queryParams["version"]  = version;
                queryParams["itemData"] = "all";
                item = _apiConnection.Get <RiotRestAPI.ItemDTO>(resource, queryParams,
                                                                ref rateLimitHit, ref rawResponse);
                if (item != null)
                {
                    LogManager.LogMessage("Loaded item " + region + "-" + version + "-" + itemId + " from the API.");
                }
                else if (rateLimitHit)
                {
                    LogManager.LogMessage("Hit rate limit. Waiting to retry.");
                    System.Threading.Thread.Sleep(RATE_LIMIT_WAIT_IN_MS);
                }
                else
                {
                    LogManager.LogMessage("Unable to load item: " + region + "-" + version + "-" + itemId);
                }
            }

            return(item);
        }
        private ItemDTO LoadItemFromRawFile(string region, string version, int itemId)
        {
            RiotRestAPI.ItemDTO item = null;

            string[]   rawfilePathParts = new string[] { _rawItemDataDirectory, GenerateRawItemFileName(region, version, itemId) };
            string     filePath         = System.IO.Path.Combine(rawfilePathParts);
            FileStream fstream          = new FileStream(filePath, FileMode.Open);
            DataContractJsonSerializer jsonSerializer = new DataContractJsonSerializer(typeof(RiotRestAPI.ItemDTO));
            object objResponse = null;

            try
            {
                objResponse = jsonSerializer.ReadObject(fstream);
            }
            catch (System.Xml.XmlException ex)
            {
                LogManager.LogMessage("XML Exception parsing item response: " + region + "-" + version + "-" + itemId + " - " + ex.Message);
            }
            catch (Exception ex)
            {
                LogManager.LogMessage("Generic Exception parsing item response: " + region + "-" + version + "-" + itemId + " - " + ex.Message);
            }

            fstream.Close();

            if (objResponse == null)
            {
                LogManager.LogMessage("Failed to load item " + region + "-" + version + "-" + itemId + " from cached data. Deleting file.");
                File.Delete(filePath);
            }
            else
            {
                item = (RiotRestAPI.ItemDTO)Convert.ChangeType(objResponse, typeof(RiotRestAPI.ItemDTO));
                LogManager.LogMessage("Loaded item " + region + "-" + version + "-" + itemId + " from cached data.");
            }

            return(item);
        }