bazaar/pkg/shop/steam/steam.go

68 lines
1.7 KiB
Go

package steam
import (
"fmt"
"net/url"
"strconv"
"strings"
"time"
"github.com/PuerkitoBio/goquery"
"github.com/fmartingr/bazaar/pkg/models"
)
var Domains = []string{"store.steampowered.com"}
type SteamShop struct {
models.ShopOptions
domains []string
}
func (s *SteamShop) Get(u *url.URL) (*models.Product, error) {
body, err := s.ShopOptions.Client.Get(u)
if err != nil {
return nil, fmt.Errorf("error during request: %s", err)
}
doc, err := goquery.NewDocumentFromReader(body)
if err != nil {
return nil, fmt.Errorf("error parsing body: %s", err)
}
product := models.Product{
URL: u.String(),
}
doc.Find(`.page_content_ctn`).Each(func(i int, s *goquery.Selection) {
priceText := strings.TrimSpace(s.Find(`.game_purchase_action .price`).Text())
priceValue, _ := s.Find(`.game_purchase_price.price`).Attr("data-price-final")
priceNum, _ := strconv.ParseFloat(strings.ReplaceAll(strings.Split(priceValue, " ")[0], ",", "."), 64)
// TODO: error logging
imgURL, _ := s.Find("img.game_header_image_full").Attr("src")
// TODO: error logging
product.Name = s.Find("#appHubAppName").Text()
product.InStock = len(s.Find(".game_area_comingsoon").Nodes) == 0
product.ImageURL = imgURL
product.PriceText = priceText
product.Price = priceNum / 100
releaseDateText := s.Find(".release_date .date").Text()
releaseDate, _ := time.Parse("2 Jan, 2006", releaseDateText)
// TODO: error logging
product.ReleaseDate = &releaseDate
})
return &product, nil
}
func NewSteamShopFactory() models.ShopFactory {
return func(shopOptions models.ShopOptions) models.Shop {
shop := SteamShop{
ShopOptions: shopOptions,
domains: Domains,
}
return &shop
}
}