Here is a very simple interface for the battle.net RESTfull service.
Basically it will request asynchronously for any item details and current database status by providing either its id or name.
It's also very useful for loading general static data directly from the servers i.e races, classes, characters achievements, pvp status, etc.
Regions.cs
Code:
// ReSharper disable InconsistentNaming
namespace WoWHack.Common.REST
{
/*
* Example of how to use it:
* http://eu.battle.net/api/wow/data/character/races?locale=fr_FR
*/
public enum Regions
{
US,
Europe,
Korea,
Taiwan,
China,
NONE
}
public enum Locales
{
en_US,
es_MX,
pt_BR,
en_GB,
es_ES,
fr_FR,
ru_RU,
de_DE,
pt_PT,
it_IT,
ko_KR,
zh_TW,
zh_CN,
NONE
}
}
WoWItemInfo.cs
Code:
using Newtonsoft.Json.Linq;
namespace WoWHack.Common.REST
{
public class WoWItemInfo
{
#region Fields
private readonly JObject _jsonObject;
#endregion
#region Constructors
public WoWItemInfo(int id, string name, string description = null)
{
Name = name;
Id = id;
Description = description;
}
public WoWItemInfo(string jsonString)
{
_jsonObject = JObject.Parse(jsonString);
Id = _jsonObject.SelectToken("id").Value<int>();
Name = _jsonObject.SelectToken("name").Value<string>();
Description = _jsonObject.SelectToken("description").Value<string>();
}
#endregion
#region Properties
public int Id { get; private set; }
public string Name { get; private set; }
public string Description { get; private set; }
#endregion
#region Public Methods
public T GetProperty<T>(string proName)
{
if (_jsonObject == null)
return default(T);
var token = _jsonObject.SelectToken(proName);
return token != null ? token.Value<T>() : default(T);
}
#endregion
}
}
BattleNetREST.cs
Code:
/*
* Simple Interface for the WOW API RESTful Service
* By: F Vicaria
* Updated: 02/11/2014
* Documentation:
* http://blizzard.github.io/api-wow-docs/
*
*/
using System;
using System.Diagnostics;
using System.Net.Http;
using System.Net.Http.Headers;
namespace WoWHack.Common.REST
{
public delegate void ItemResponseHandler(WoWItemInfo item);
public static class BattleNetRest
{
private static Regions _region;
private static Locales _locale;
static BattleNetRest()
{
BaseUrl = @"http://eu.battle.net/api/wow/";
_region = Regions.Europe;
_locale = Locales.en_GB;
}
public static Regions Region
{
get { return _region; }
set
{
if (value == _region)
return;
_region = value;
_locale = Locales.NONE;
switch (value)
{
case Regions.US:
BaseUrl = @"http://us.battle.net/api/wow/";
break;
case Regions.Europe:
BaseUrl = @"http://eu.battle.net/api/wow/";
break;
case Regions.Korea:
BaseUrl = @"http://kr.battle.net/api/wow/";
break;
case Regions.Taiwan:
BaseUrl = @"http://tw.battle.net/api/wow/";
break;
case Regions.China:
BaseUrl = @"http://www.battlenet.com.cn/api/wow/";
break;
default:
BaseUrl = @"http://eu.battle.net/api/wow/";
break;
}
}
}
public static Locales Locale
{
get { return _locale; }
set
{
if (value == _locale)
return;
_locale = value;
switch (value)
{
case Locales.en_US:
case Locales.es_MX:
case Locales.pt_BR:
_region = Regions.US;
BaseUrl = @"http://us.battle.net/api/wow/";
break;
case Locales.en_GB:
case Locales.es_ES:
case Locales.fr_FR:
case Locales.ru_RU:
case Locales.de_DE:
case Locales.pt_PT:
case Locales.it_IT:
_region = Regions.Europe;
BaseUrl = @"http://eu.battle.net/api/wow/";
break;
case Locales.ko_KR:
_region = Regions.Korea;
BaseUrl = @"http://kr.battle.net/api/wow/";
break;
case Locales.zh_TW:
_region = Regions.Taiwan;
BaseUrl = @"http://tw.battle.net/api/wow/";
break;
case Locales.zh_CN:
_region = Regions.China;
BaseUrl = @"http://www.battlenet.com.cn/api/wow/";
break;
default:
_region = Regions.Europe;
BaseUrl = @"http://eu.battle.net/api/wow/";
break;
}
}
}
public static string BaseUrl { get; private set; }
public static async void GetItemInfoFromId(int displayId, ItemResponseHandler handler)
{
if (handler == null)
return;
try
{
using (var client = new HttpClient())
{
client.BaseAddress = new Uri(BaseUrl);
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
var response = await client.GetAsync("item/" + displayId);
if (!response.IsSuccessStatusCode)
{
handler(null);
return;
}
var jsonString = await response.Content.ReadAsStringAsync();
var info = new WoWItemInfo(jsonString);
handler(info);
}
}
catch (Exception ex)
{
Debug.WriteLine(ex.Message);
}
}
}
}
You need to get Json.NET from here https://www.nuget.org/packages/Newtonsoft.Json/
Here is a simple example on how to use it:
Code:
public WoWItem(IntPtr baseAddress)
: base(baseAddress)
{
BattleNetRest.GetItemInfoFromId(EntryId, item =>
{
_info = item;
});
}
Let me know if I missed anything (cut and paste laziness) or if you add anything into it.