package auction import ( "encoding/json" "local/sandbox/selenium/copart/copart/browser" "local/sandbox/selenium/copart/copart/config" "log" "time" "github.com/tebeka/selenium" ) type Auction struct { browser *browser.Browser cars []*Car stop bool stopped bool } func New(url string) (*Auction, error) { b, err := browser.New() if err != nil { b.Close() return nil, err } if err := b.Get(url); err != nil { b.Close() return nil, err } var elems []selenium.WebElement deadline := time.Now().Add(time.Second * 10) // TODO ctx configurable and load more later for deadline.After(time.Now()) { time.Sleep(time.Second) elems, err = b.Driver.FindElements("xpath", "//iframe") if err != nil { b.Close() return nil, err } if len(elems) > 0 { break } } if time.Now().After(deadline) { b.Close() return nil, b.Close() } url, err = elems[0].GetAttribute("src") if err != nil { b.Close() return nil, err } if err := b.Get(url); err != nil { b.Close() return nil, err } return &Auction{ browser: b, cars: []*Car{}, }, nil } func (a *Auction) Start() error { log.Println("START", a.stop) go func() { defer func() { a.stopped = true }() for !a.stop { log.Println("TOP") c := NewCar() if err := c.Parse(a.browser.Driver); err != nil { log.Println(err) return } log.Println("C", c) for !a.stop { time.Sleep(time.Second) d := NewCar() if err := d.Parse(a.browser.Driver); err != nil { log.Println(err) return } log.Printf("%v = (%v == %v)", c.Equals(d), c.String(), d.String()) if !c.Equals(d) { break } c = d } b, err := c.Encode() if err != nil { log.Println(err) return } if err := config.Values().DB.Set(c.String(), b); err != nil { log.Println(err) return } var list []string if b, err := config.Values().DB.Get("LIST"); err != nil { log.Println(err) return } else if err := json.Unmarshal(b, &list); err != nil { log.Println(err) return } else { list = append(list, c.String()) b, _ := json.Marshal(list) if err := config.Values().DB.Set("LIST", b); err != nil { log.Println(err) return } } } }() return nil } func (a *Auction) Stop() error { if a == nil { return nil } a.stop = true for !a.stopped { time.Sleep(time.Second) } if a.browser == nil || a.browser.Driver == nil { return nil } return a.browser.Driver.Close() }