internal async Task <bool> SendTradeOffer(HashSet <Steam.Item> inventory, ulong partnerID, string token = null)
        {
            if ((inventory == null) || (inventory.Count == 0) || (partnerID == 0))
            {
                Logging.LogNullError(nameof(inventory) + " || " + nameof(inventory.Count) + " || " + nameof(partnerID), Bot.BotName);
                return(false);
            }

            if (!await RefreshSessionIfNeeded().ConfigureAwait(false))
            {
                return(false);
            }

            string sessionID = WebBrowser.CookieContainer.GetCookieValue(SteamCommunityURL, "sessionid");

            if (string.IsNullOrEmpty(sessionID))
            {
                Logging.LogNullError(nameof(sessionID), Bot.BotName);
                return(false);
            }

            Steam.TradeOfferRequest           singleTrade = new Steam.TradeOfferRequest();
            HashSet <Steam.TradeOfferRequest> trades      = new HashSet <Steam.TradeOfferRequest> {
                singleTrade
            };

            byte itemID = 0;

            foreach (Steam.Item item in inventory)
            {
                if (itemID >= Trading.MaxItemsPerTrade)
                {
                    if (trades.Count >= Trading.MaxTradesPerAccount)
                    {
                        break;
                    }

                    singleTrade = new Steam.TradeOfferRequest();
                    trades.Add(singleTrade);
                    itemID = 0;
                }

                singleTrade.ItemsToGive.Assets.Add(new Steam.Item(Steam.Item.SteamAppID, Steam.Item.SteamContextID, item.AssetID, item.Amount));
                itemID++;
            }

            string referer = SteamCommunityURL + "/tradeoffer/new";
            string request = referer + "/send";

            foreach (Dictionary <string, string> data in trades.Select(trade => new Dictionary <string, string>(6)
            {
                { "sessionid", sessionID },
                { "serverid", "1" },
                { "partner", partnerID.ToString() },
                { "tradeoffermessage", "Sent by ASF" },
                { "json_tradeoffer", JsonConvert.SerializeObject(trade) },
                { "trade_offer_create_params", string.IsNullOrEmpty(token) ? "" : $"{{\"trade_offer_access_token\":\"{token}\"}}" }
            }))
            {
                if (!await WebBrowser.UrlPostRetry(request, data, referer).ConfigureAwait(false))
                {
                    return(false);
                }
            }

            return(true);
        }
Exemple #2
0
        internal async Task <bool> SendTradeOffer(List <Steam.Item> inventory, ulong partnerID, string token = null)
        {
            if (inventory == null || inventory.Count == 0 || partnerID == 0)
            {
                return(false);
            }

            string sessionID;

            if (!Cookie.TryGetValue("sessionid", out sessionID))
            {
                return(false);
            }

            List <Steam.TradeOfferRequest> trades = new List <Steam.TradeOfferRequest>(1 + inventory.Count / Trading.MaxItemsPerTrade);

            Steam.TradeOfferRequest singleTrade = null;
            for (ushort i = 0; i < inventory.Count; i++)
            {
                if (i % Trading.MaxItemsPerTrade == 0)
                {
                    if (trades.Count >= Trading.MaxTradesPerAccount)
                    {
                        break;
                    }

                    singleTrade = new Steam.TradeOfferRequest();
                    trades.Add(singleTrade);
                }

                Steam.Item item = inventory[i];
                singleTrade.me.assets.Add(new Steam.Item()
                {
                    appid     = "753",
                    contextid = "6",
                    amount    = item.amount,
                    assetid   = item.id
                });
            }

            string referer = SteamCommunityURL + "/tradeoffer/new";
            string request = referer + "/send";

            foreach (Steam.TradeOfferRequest trade in trades)
            {
                Dictionary <string, string> data = new Dictionary <string, string>(6)
                {
                    { "sessionid", sessionID },
                    { "serverid", "1" },
                    { "partner", partnerID.ToString() },
                    { "tradeoffermessage", "Sent by ASF" },
                    { "json_tradeoffer", JsonConvert.SerializeObject(trade) },
                    { "trade_offer_create_params", string.IsNullOrEmpty(token) ? "" : $"{{\"trade_offer_access_token\":\"{token}\"}}" }
                };

                HttpResponseMessage response = null;
                for (byte i = 0; i < WebBrowser.MaxRetries && response == null; i++)
                {
                    response = await WebBrowser.UrlPost(request, data, Cookie, referer).ConfigureAwait(false);
                }

                if (response == null)
                {
                    Logging.LogGenericWTF("Request failed even after " + WebBrowser.MaxRetries + " tries", Bot.BotName);
                    return(false);
                }
            }

            return(true);
        }