package steamreq import ( "fmt" "math" "net/http" "steam_analyzer/internal/utils/jsonutils" "time" "golang.org/x/time/rate" ) type Categories struct { caseCat string knife string } type Requester struct { baseMarketURL string categories Categories limiter *rate.Limiter } func NewRequester(baseURL string, perTime time.Duration, count int) *Requester { return &Requester{ baseMarketURL: baseURL, categories: Categories{ caseCat: "category_730_Type[]=tag_CSGO_Type_WeaponCase", knife: "category_730_Type[]=tag_CSGO_Type_Knife", }, limiter: rate.NewLimiter(rate.Every(perTime), count), } } func (r *Requester) GetItem(query string, itemType string) ([]SteamMarketItem, error) { var steamMarketItems []SteamMarketItem var pageCount int = 1 for i := 0; i < pageCount; i++ { //if err := r.limiter.Wait(context.Background()); err != nil { // fmt.Printf("Limiter error: %v\n", err) // continue //} response, err := r.doRequest(query, itemType, i) if err != nil { fmt.Printf("Error while doing request. Query: %v. ItemType: %v. Start %v", query, itemType, i) continue } steamMarketItems = append(steamMarketItems, response.Results...) if i == 0 { pageCount = int(math.Ceil(float64(response.TotalCount) / float64(response.Pagesize))) } } return steamMarketItems, nil } func (r *Requester) doRequest(query string, itemType string, start int) (*Response, error) { itemURL := r.createItemURL(query, itemType, start*10) // fmt.Println(itemURL) req, err := http.NewRequest("GET", itemURL, nil) if err != nil { return nil, fmt.Errorf("error while creating request %v", err) } resp, err := http.DefaultClient.Do(req) if err != nil { return nil, fmt.Errorf("error while making http request %v", err) } defer resp.Body.Close() var steamResponse Response err = jsonutils.FromJSON(resp.Body, &steamResponse) if err != nil { return nil, fmt.Errorf("error while getting item %v", err) } return &steamResponse, nil } func (r *Requester) createItemURL(item string, itemType string, start int) string { marketItemsURL := r.baseMarketURL + `?query=%v&start=%v&count=%v&search_descriptions=0&sort_column=%v&sort_dir=%v&appid=730&norender=1` count := 10 sortColumn := "price" sortDir := "asc" url := fmt.Sprintf(marketItemsURL, item, start, count, sortColumn, sortDir, ) switch itemType { case "case": url = url + "&" + r.categories.caseCat case "knife": url = url + "&" + r.categories.knife } return url }