133 lines
2.4 KiB
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()
|
|
}
|