Files
steam_analyzer/internal/steamreq/requester.go
2026-01-17 22:45:02 +03:00

108 lines
2.5 KiB
Go

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
}