public static bool RequestItemData(GBAPIItemData item) { var handler = new GBAPIRequestHandler(); handler.ProcessItemData(item); string request = handler.Build(); string response = new WebClient().DownloadString(request); return(handler.ParseResponse(response, item)); }
public void ProcessItemData(GBAPIItemData item) { ItemType = item.ItemType; ItemID = item.ItemID; APIType = GBAPIRequestType.COREITEMDATA; var type = item.GetType(); foreach (var field in type.GetFields()) { var GBField = (GBAPIField)field.GetCustomAttributes(typeof(GBAPIField), true).FirstOrDefault(); if (GBField != null) { Fields.Add(new KeyValuePair <string, FieldInfo>(GBField.FieldName, field)); } } }
/// <summary> /// Parses the response data(XML) and writes all data into parameter "item". /// </summary> /// <param name="response">The Response data from GameBanana API in XML string format</param> /// <param name="item">Reference to a GBAPIItemData to write the data to</param> /// <returns>If Parse completed with no errors</returns> public bool ParseResponse(string response, GBAPIItemData item) { var responseXML = XDocument.Parse(response).Root; var elements = responseXML.Elements().ToList(); if (elements.Count() != Fields.Count) { var list = Fields.Select(t => t.Key).ToList(); list.Insert(0, response); MainForm.AddMessage("Exception thrown while Parsing a GBAPI Response!", new Exception("GameBanana Returned less values than requested! Parsing must abort!"), list.ToArray()); return(false); } foreach (var field in Fields) { var element = elements.First(); var GBFieldKey = (GBAPIFieldKeyArray)field.Value.GetCustomAttributes(typeof(GBAPIFieldKeyArray), true).FirstOrDefault(); if (GBFieldKey != null) { var arrayElements = element.Elements().ToArray(); var array = Array.CreateInstance(field.Value.FieldType.GetElementType(), arrayElements.Length); var keyInfo = field.Value.FieldType.GetElementType().GetField(GBFieldKey.KeyName); var arrayInfo = field.Value.FieldType.GetElementType().GetField(GBFieldKey.ArrayName); for (int i = 0; i < array.Length; ++i) { object obj = Activator.CreateInstance(field.Value.FieldType.GetElementType()); // Key object value = TryConvert(arrayElements[i].Attribute("key").Value, keyInfo.FieldType); if (value != null) { keyInfo.SetValue(obj, value); } // Array var subElements = arrayElements[i].Elements().ToArray(); var array2 = Array.CreateInstance(arrayInfo.FieldType.GetElementType(), subElements.Length); for (int ii = 0; ii < array2.Length; ++ii) { array2.SetValue(XMLtoObject(arrayInfo.FieldType.GetElementType(), subElements[ii]), ii); } arrayInfo.SetValue(obj, array2); array.SetValue(obj, i); } field.Value.SetValue(item, array); } else if (element.Name == "value") { field.Value.SetValue(item, XMLtoObject(field.Value.FieldType, elements.First())); } else { var arrayElements = element.Elements().ToArray(); var array = Array.CreateInstance(field.Value.FieldType.GetElementType(), arrayElements.Length); for (int i = 0; i < array.Length; ++i) { array.SetValue(XMLtoObject(field.Value.FieldType.GetElementType(), arrayElements[i]), i); } field.Value.SetValue(item, array); } elements.RemoveAt(0); } return(true); }