rssmon3/copart/auction/.auction.go

133 lines
2.4 KiB
Go

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()
}