108 lines
2.5 KiB
Go
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
|
|
}
|