find-stone-beer / commit
Moved the loading logic for objects to the object files.
find-stone.go => beers-info.go | 61 ++++++++++++++++++++++++++ main.go | 97 ++---------------------------------------- seller-info.go | 16 +++++++ seller.go | 40 ++++++++++++----- 4 files changed, 110 insertions(+), 104 deletions(-) diff --git a/find-stone.go b/beers-info.go similarity index 69% rename from find-stone.go rename to beers-info.go index eb37cd9..6b251b9 100644 --- a/find-stone.go +++ b/beers-info.go @@ -1,7 +1,12 @@ package main import ( + "bytes" "encoding/json" + "errors" + "strings" + + "golang.org/x/net/html" ) type Core struct { @@ -64,6 +69,62 @@ func (f *BeersInfo) FindBrandById(targetId string) (bool, Brand) { return false, Brand{} } +func GetBeersInfo() (BeersInfo, error) { + data, err := getCachedUrlFunc( + "https://find.stonebrewing.com", + "find-stone-beer-core", + "2006-01-02", + func(d []byte) ([]byte, error) { + reader := bytes.NewReader(d) + doc, err := html.Parse(reader) + if err != nil { + return nil, err + } + + var findNodeWithText func(node *html.Node, text string) (bool, *html.Node) + findNodeWithText = func(node *html.Node, text string) (bool, *html.Node) { + if node.Type == html.TextNode && strings.Contains(node.Data, text) { + return true, node + } + + if node.FirstChild != nil { + found, child := findNodeWithText(node.FirstChild, text) + if found { + return true, child + } + } + + if node.NextSibling != nil { + found, sibling := findNodeWithText(node.NextSibling, text) + if found { + return true, sibling + } + } + + return false, nil + } + found, node := findNodeWithText(doc, "6376") + if !found { + return nil, errors.New("could not find node") + } + + firstCurly := strings.Index(node.Data, "{") + lastCurly := strings.LastIndex(node.Data, "}") + jsonText := node.Data[firstCurly : lastCurly+1] + return []byte(jsonText), nil + }) + if err != nil { + return BeersInfo{}, err + } + + var core = Core{} + err = json.Unmarshal(data, &core) + if err != nil { + return BeersInfo{}, err + } + return core.Beers, nil +} + type PackageType struct { Name string `json:"name"` ReleaseDate int `json:"release_date"` diff --git a/main.go b/main.go index b0a5d0e..30a8867 100644 --- a/main.go +++ b/main.go @@ -1,9 +1,7 @@ package main import ( - "bytes" "encoding/json" - "errors" "fmt" "io" "net/http" @@ -15,7 +13,6 @@ import ( "github.com/jftuga/geodist" "golang.org/x/exp/slices" - "golang.org/x/net/html" ) type relevantSeller struct { @@ -44,13 +41,13 @@ func main() { var maxDeliveryWindowDays = getEnvVarInteger(MAX_DELIVERY_DAYS_ENV_VAR, 14) // descriptions of the beers and packaging - beersInfo, err := getBeersInfo() + beersInfo, err := GetBeersInfo() if err != nil { panic(err) } // get sellers by location - sellers, err := getSellers(coords) + sellers, err := GetSellers(coords) if err != nil { panic(err) } @@ -93,7 +90,7 @@ func main() { continue } - sellerInfo, err := getSellerInfo(seller.Nid) + sellerInfo, err := GetSellerInfo(seller.Nid) if err != nil { panic(err) } @@ -192,94 +189,6 @@ func getCoordsFromEnvVars() (geodist.Coord, error) { return coords, nil } -func getSellers(coords geodist.Coord) ([]Seller, error) { - lat := coords.Lat - latInt := int(lat) - lon := coords.Lon - lonInt := int(lon) - url := fmt.Sprintf("https://find.stonebrewing.com/api/search/%f,%f/%d,%d", lat, lon, latInt, lonInt) - bytes, err := getCachedUrl(url, "find-stone-beer", "2006-01-02") - if err != nil { - return nil, err - } - - var sellers []Seller - err = json.Unmarshal(bytes, &sellers) - if err != nil { - panic(err) - } - return sellers, nil -} -func getSellerInfo(id string) (SellerInfo, error) { - url := fmt.Sprintf("https://find.stonebrewing.com/api/location/%s", id) - bytes, err := getCachedUrl(url, fmt.Sprintf("find-stone-beer-seller-%s", id), "2006-01-02") - if err != nil { - return SellerInfo{}, err - } - - var sellerInfo SellerInfo - err = json.Unmarshal(bytes, &sellerInfo) - if err != nil { - return SellerInfo{}, err - } - return sellerInfo, nil -} -func getBeersInfo() (BeersInfo, error) { - data, err := getCachedUrlFunc( - "https://find.stonebrewing.com", - "find-stone-beer-core", - "2006-01-02", - func(d []byte) ([]byte, error) { - reader := bytes.NewReader(d) - doc, err := html.Parse(reader) - if err != nil { - return nil, err - } - - var findNodeWithText func(node *html.Node, text string) (bool, *html.Node) - findNodeWithText = func(node *html.Node, text string) (bool, *html.Node) { - if node.Type == html.TextNode && strings.Contains(node.Data, text) { - return true, node - } - - if node.FirstChild != nil { - found, child := findNodeWithText(node.FirstChild, text) - if found { - return true, child - } - } - - if node.NextSibling != nil { - found, sibling := findNodeWithText(node.NextSibling, text) - if found { - return true, sibling - } - } - - return false, nil - } - found, node := findNodeWithText(doc, "6376") - if !found { - return nil, errors.New("could not find node") - } - - firstCurly := strings.Index(node.Data, "{") - lastCurly := strings.LastIndex(node.Data, "}") - jsonText := node.Data[firstCurly : lastCurly+1] - return []byte(jsonText), nil - }) - if err != nil { - return BeersInfo{}, err - } - - var core = Core{} - err = json.Unmarshal(data, &core) - if err != nil { - return BeersInfo{}, err - } - return core.Beers, nil -} - func getCachedUrl(url string, id string, cacheFileTimeFormat string) ([]byte, error) { return getCachedUrlFunc(url, id, cacheFileTimeFormat, func(bytes []byte) ([]byte, error) { return bytes, nil diff --git a/seller-info.go b/seller-info.go index ff8b25f..eae8f2e 100644 --- a/seller-info.go +++ b/seller-info.go @@ -2,6 +2,7 @@ package main import ( "encoding/json" + "fmt" "strconv" "github.com/jftuga/geodist" @@ -47,3 +48,18 @@ func (s *SellerInfo) UnmarshalJSON(data []byte) error { *s = newSellerInfo return nil } + +func GetSellerInfo(id string) (SellerInfo, error) { + url := fmt.Sprintf("https://find.stonebrewing.com/api/location/%s", id) + bytes, err := getCachedUrl(url, fmt.Sprintf("find-stone-beer-seller-%s", id), "2006-01-02") + if err != nil { + return SellerInfo{}, err + } + + var sellerInfo SellerInfo + err = json.Unmarshal(bytes, &sellerInfo) + if err != nil { + return SellerInfo{}, err + } + return sellerInfo, nil +} diff --git a/seller.go b/seller.go index 7f7cf2e..bb64dd2 100644 --- a/seller.go +++ b/seller.go @@ -2,21 +2,22 @@ package main import ( "encoding/json" + "fmt" "strconv" "github.com/jftuga/geodist" ) type Seller struct { - Nid string - Title string - Addr string - Addr1 string - Addr2 string - Distance float64 - Phone string - Cot string - Pos geodist.Coord + Nid string + Title string + Addr string + Addr1 string + Addr2 string + Distance float64 + Phone string + Cot string + Pos geodist.Coord // Lat float64 // Lng float64 LocationCategory string @@ -68,7 +69,7 @@ func (s *Seller) UnmarshalJSON(data []byte) error { if err != nil { return err } - + lng, err := strconv.ParseFloat(seller.Lng, 64) if err != nil { return err @@ -80,3 +81,22 @@ func (s *Seller) UnmarshalJSON(data []byte) error { *s = newSeller return nil } + +func GetSellers(coords geodist.Coord) ([]Seller, error) { + lat := coords.Lat + latInt := int(lat) + lon := coords.Lon + lonInt := int(lon) + url := fmt.Sprintf("https://find.stonebrewing.com/api/search/%f,%f/%d,%d", lat, lon, latInt, lonInt) + bytes, err := getCachedUrl(url, "find-stone-beer", "2006-01-02") + if err != nil { + return nil, err + } + + var sellers []Seller + err = json.Unmarshal(bytes, &sellers) + if err != nil { + return nil, err + } + return sellers, nil +}