/// <summary> /// Retrieves completed trades from /inventoryhistory/ /// </summary> /// <param name="limit">Max number of trades to retrieve</param> /// <returns>A List of 'TradeHistory' objects</returns> public List <TradeHistory> GetTradeHistory(int limit = 0) { // most recent trade is first List <TradeHistory> TradeHistoryList = new List <TradeHistory>(); var url = "http://steamcommunity.com/profiles/" + BotId.ConvertToUInt64() + "/inventoryhistory/"; var html = RetryWebRequest(SteamWeb, url, "GET", null); // TODO: handle rgHistoryCurrency as well Regex reg = new Regex("rgHistoryInventory = (.*?)};"); Match m = reg.Match(html); if (m.Success) { var json = m.Groups[1].Value + "}"; var schemaResult = JsonConvert.DeserializeObject <Dictionary <int, Dictionary <ulong, Dictionary <ulong, GenericInventory.Inventory.Item> > > >(json); var trades = new Regex("HistoryPageCreateItemHover\\((.*?)\\);"); var tradeMatches = trades.Matches(html); foreach (Match match in tradeMatches) { if (match.Success) { var tradeHistoryItem = new TradeHistory(); tradeHistoryItem.ReceivedItems = new List <Trade.TradeAsset>(); tradeHistoryItem.GivenItems = new List <Trade.TradeAsset>(); var historyString = match.Groups[1].Value.Replace("'", "").Replace(" ", ""); var split = historyString.Split(','); var tradeString = split[0]; var tradeStringSplit = tradeString.Split('_'); var tradeNum = Convert.ToInt32(tradeStringSplit[0].Replace("trade", "")); if (limit > 0 && tradeNum >= limit) { break; } var appId = Convert.ToInt32(split[1]); var contextId = Convert.ToUInt64(split[2]); var itemId = Convert.ToUInt64(split[3]); var amount = Convert.ToInt32(split[4]); var historyItem = schemaResult[appId][contextId][itemId]; var genericItem = new Trade.TradeAsset(appId, contextId, itemId, amount); // given item has ownerId of 0 // received item has ownerId of own SteamID if (historyItem.OwnerId == 0) { tradeHistoryItem.GivenItems.Add(genericItem); } else { tradeHistoryItem.ReceivedItems.Add(genericItem); } TradeHistoryList.Add(tradeHistoryItem); } } } return(TradeHistoryList); }
/// <summary> /// Manually validate if a trade offer went through by checking /inventoryhistory/ /// </summary> /// <param name="tradeOffer">A 'TradeStatus' object</param> /// <returns>True if the trade offer was successfully accepted, false if otherwise</returns> public bool ValidateTradeAccept(TradeOffer tradeOffer) { var history = GetTradeHistory(1); foreach (var completedTrade in history) { var givenItems = new List <Trade.TradeAsset>(); foreach (var myItem in tradeOffer.ItemsToGive) { var genericItem = new Trade.TradeAsset(myItem.AppId, myItem.ContextId, myItem.AssetId, myItem.Amount); givenItems.Add(genericItem); } var receivedItems = new List <Trade.TradeAsset>(); foreach (var otherItem in tradeOffer.ItemsToReceive) { var genericItem = new Trade.TradeAsset(otherItem.AppId, otherItem.ContextId, otherItem.AssetId, otherItem.Amount); receivedItems.Add(genericItem); } if (givenItems.Count == completedTrade.GivenItems.Count && receivedItems.Count == completedTrade.ReceivedItems.Count) { foreach (var item in completedTrade.GivenItems) { var genericItem = new Trade.TradeAsset(item.appid, item.contextid, item.assetid, item.amount); if (!givenItems.Contains(genericItem)) { return(false); } } foreach (var item in completedTrade.ReceivedItems) { var genericItem = new Trade.TradeAsset(item.appid, item.contextid, item.assetid, item.amount); if (!receivedItems.Contains(genericItem)) { return(false); } } return(true); } } return(false); }
/// <summary> /// Manually validate if a trade offer went through by checking /inventoryhistory/ /// </summary> /// <param name="tradeOffer">A 'TradeStatus' object</param> /// <returns>True if the trade offer was successfully accepted, false if otherwise</returns> public bool ValidateTradeAccept(TradeOffer tradeOffer) { var history = GetTradeHistory(1); foreach (var completedTrade in history) { var givenItems = new List<Trade.TradeAsset>(); foreach (var myItem in tradeOffer.ItemsToGive) { var genericItem = new Trade.TradeAsset(myItem.AppId, myItem.ContextId, myItem.AssetId, myItem.Amount); givenItems.Add(genericItem); } var receivedItems = new List<Trade.TradeAsset>(); foreach (var otherItem in tradeOffer.ItemsToReceive) { var genericItem = new Trade.TradeAsset(otherItem.AppId, otherItem.ContextId, otherItem.AssetId, otherItem.Amount); receivedItems.Add(genericItem); } if (givenItems.Count == completedTrade.GivenItems.Count && receivedItems.Count == completedTrade.ReceivedItems.Count) { foreach (var item in completedTrade.GivenItems) { var genericItem = new Trade.TradeAsset(item.appid, item.contextid, item.assetid, item.amount); if (!givenItems.Contains(genericItem)) return false; } foreach (var item in completedTrade.ReceivedItems) { var genericItem = new Trade.TradeAsset(item.appid, item.contextid, item.assetid, item.amount); if (!receivedItems.Contains(genericItem)) return false; } return true; } } return false; }
/// <summary> /// Retrieves completed trades from /inventoryhistory/ /// </summary> /// <param name="limit">Max number of trades to retrieve</param> /// <returns>A List of 'TradeHistory' objects</returns> public List<TradeHistory> GetTradeHistory(int limit = 0) { // most recent trade is first List<TradeHistory> TradeHistoryList = new List<TradeHistory>(); var url = "http://steamcommunity.com/profiles/" + BotId.ConvertToUInt64() + "/inventoryhistory/"; var html = RetryWebRequest(SteamWeb, url, "GET", null); // TODO: handle rgHistoryCurrency as well Regex reg = new Regex("rgHistoryInventory = (.*?)};"); Match m = reg.Match(html); if (m.Success) { var json = m.Groups[1].Value + "}"; var schemaResult = JsonConvert.DeserializeObject<Dictionary<int, Dictionary<ulong, Dictionary<ulong, GenericInventory.Inventory.Item>>>>(json); var trades = new Regex("HistoryPageCreateItemHover\\((.*?)\\);"); var tradeMatches = trades.Matches(html); foreach (Match match in tradeMatches) { if (match.Success) { var tradeHistoryItem = new TradeHistory(); tradeHistoryItem.ReceivedItems = new List<Trade.TradeAsset>(); tradeHistoryItem.GivenItems = new List<Trade.TradeAsset>(); var historyString = match.Groups[1].Value.Replace("'", "").Replace(" ", ""); var split = historyString.Split(','); var tradeString = split[0]; var tradeStringSplit = tradeString.Split('_'); var tradeNum = Convert.ToInt32(tradeStringSplit[0].Replace("trade", "")); if (limit > 0 && tradeNum >= limit) break; var appId = Convert.ToInt32(split[1]); var contextId = Convert.ToUInt64(split[2]); var itemId = Convert.ToUInt64(split[3]); var amount = Convert.ToInt32(split[4]); var historyItem = schemaResult[appId][contextId][itemId]; var genericItem = new Trade.TradeAsset(appId, contextId, itemId, amount); // given item has ownerId of 0 // received item has ownerId of own SteamID if (historyItem.OwnerId == 0) tradeHistoryItem.GivenItems.Add(genericItem); else tradeHistoryItem.ReceivedItems.Add(genericItem); TradeHistoryList.Add(tradeHistoryItem); } } } return TradeHistoryList; }