func (c *Client) getPartialPartnerInventory(other steamid.SteamId, contextId uint64, appId uint32, offerId *uint64, start *uint) (*inventory.PartialInventory, error) { data := map[string]string{ "sessionid": c.sessionId, "partner": other.ToString(), "contextid": strconv.FormatUint(contextId, 10), "appid": strconv.FormatUint(uint64(appId), 10), } if start != nil { data["start"] = strconv.FormatUint(uint64(*start), 10) } baseUrl := "https://steamcommunity.com/tradeoffer/%v/" if offerId != nil { baseUrl = fmt.Sprintf(baseUrl, *offerId) } else { baseUrl = fmt.Sprintf(baseUrl, "new") } req, err := http.NewRequest("GET", baseUrl+"partnerinventory/?"+netutil.ToUrlValues(data).Encode(), nil) if err != nil { panic(err) } req.Header.Add("Referer", baseUrl+"?partner="+strconv.FormatUint(uint64(other.GetAccountId()), 10)) return inventory.DoInventoryRequest(c.client, req) }
// Get duration of escrow in days. Call this before sending a trade offer func (c *Client) GetPartnerEscrowDuration(other steamid.SteamId, accessToken *string) (*EscrowDuration, error) { data := map[string]string{ "partner": strconv.FormatUint(uint64(other.GetAccountId()), 10), } if accessToken != nil { data["token"] = *accessToken } return c.getEscrowDuration("https://steamcommunity.com/tradeoffer/new/?" + netutil.ToUrlValues(data).Encode()) }
func GetInventoryApps(client *http.Client, steamId steamid.SteamId) (InventoryApps, error) { resp, err := http.Get("http://steamcommunity.com/profiles/" + steamId.ToString() + "/inventory/") if err != nil { return nil, err } defer resp.Body.Close() respBody, err := ioutil.ReadAll(resp.Body) if err != nil { return nil, err } reg := regexp.MustCompile("var g_rgAppContextData = (.*?);") inventoryAppsMatches := reg.FindSubmatch(respBody) if inventoryAppsMatches == nil { return nil, fmt.Errorf("profile inventory not found in steam response") } var inventoryApps InventoryApps if err = json.Unmarshal(inventoryAppsMatches[1], &inventoryApps); err != nil { return nil, err } return inventoryApps, nil }
// Sends a new trade offer to the given Steam user. You can optionally specify an access token if you've got one. // In addition, `counteredOfferId` can be non-nil, indicating the trade offer this is a counter for. // On success returns trade offer id func (c *Client) Create(other steamid.SteamId, accessToken *string, myItems, theirItems []TradeItem, counteredOfferId *uint64, message string) (uint64, error) { // Create new trade offer status to := map[string]interface{}{ "newversion": true, "version": 3, "me": map[string]interface{}{ "assets": myItems, "currency": make([]struct{}, 0), "ready": false, }, "them": map[string]interface{}{ "assets": theirItems, "currency": make([]struct{}, 0), "ready": false, }, } jto, err := json.Marshal(to) if err != nil { panic(err) } // Create url parameters for request data := map[string]string{ "sessionid": c.sessionId, "serverid": "1", "partner": other.ToString(), "tradeoffermessage": message, "json_tradeoffer": string(jto), } var referer string if counteredOfferId != nil { referer = fmt.Sprintf("https://steamcommunity.com/tradeoffer/%d/", *counteredOfferId) data["tradeofferid_countered"] = strconv.FormatUint(*counteredOfferId, 10) } else { // Add token for non-friend offers if accessToken != nil { params := map[string]string{ "trade_offer_access_token": *accessToken, } paramsJson, err := json.Marshal(params) if err != nil { panic(err) } data["trade_offer_create_params"] = string(paramsJson) referer = "https://steamcommunity.com/tradeoffer/new/?partner=" + strconv.FormatUint(uint64(other.GetAccountId()), 10) + "&token=" + *accessToken } else { referer = "https://steamcommunity.com/tradeoffer/new/?partner=" + strconv.FormatUint(uint64(other.GetAccountId()), 10) } } // Create request req := netutil.NewPostForm("https://steamcommunity.com/tradeoffer/new/send", netutil.ToUrlValues(data)) req.Header.Add("Referer", referer) // Send request resp, err := c.client.Do(req) if err != nil { return 0, err } defer resp.Body.Close() t := new(struct { StrError string `json:"strError"` TradeOfferId uint64 `json:"tradeofferid,string"` }) if err = json.NewDecoder(resp.Body).Decode(t); err != nil { return 0, err } // strError code descriptions: // 15 invalide trade access token // 16 timeout // 20 wrong contextid // 25 can't send more offers until some is accepted/cancelled... // 26 object is not in our inventory // error code names are in internal/steamlang/enums.go EResult_name if t.StrError != "" { return 0, newSteamErrorf("create error: %v\n", t.StrError) } if resp.StatusCode != 200 { return 0, fmt.Errorf("create error: status code %d", resp.StatusCode) } if t.TradeOfferId == 0 { return 0, newSteamErrorf("create error: steam returned 0 for trade offer id") } return t.TradeOfferId, nil }