Handle errors better in updater/scraper/poller.
This commit is contained in:
parent
a91ba8a5dd
commit
014b42cbb3
@ -57,8 +57,7 @@ func poll_players(host string, timeout int) (int, error) {
|
||||
return int(players), nil
|
||||
}
|
||||
|
||||
// TODO: return errors!
|
||||
func PollServers(servers []ServerConfig, timeout int) []*RawServerData {
|
||||
func PollServers(servers []ServerConfig, timeout int) ([]*RawServerData, error) {
|
||||
var wg sync.WaitGroup
|
||||
var tmp []*RawServerData
|
||||
for _, s := range servers {
|
||||
@ -66,7 +65,7 @@ func PollServers(servers []ServerConfig, timeout int) []*RawServerData {
|
||||
go func(s ServerConfig) {
|
||||
defer wg.Done()
|
||||
players, err := poll_players(s.GameUrl, timeout)
|
||||
if err != nil {
|
||||
if log_error(err) {
|
||||
return
|
||||
}
|
||||
gameurl := fmt.Sprintf("byond://%s", s.GameUrl)
|
||||
@ -74,5 +73,5 @@ func PollServers(servers []ServerConfig, timeout int) []*RawServerData {
|
||||
}(s)
|
||||
}
|
||||
wg.Wait()
|
||||
return tmp
|
||||
return tmp, nil
|
||||
}
|
||||
|
||||
@ -19,48 +19,62 @@ var (
|
||||
RE_PLAYERS = regexp.MustCompile(`Logged in: (\d+) player`)
|
||||
)
|
||||
|
||||
// TODO: return errors!
|
||||
func ScrapePage() []*RawServerData {
|
||||
data := download_data()
|
||||
return parse_data(data)
|
||||
func ScrapePage() ([]*RawServerData, error) {
|
||||
data, err := download_data()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
tmp, err := parse_data(data)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return tmp, nil
|
||||
}
|
||||
|
||||
func download_data() *goquery.Document {
|
||||
func download_data() (*goquery.Document, error) {
|
||||
var r io.Reader
|
||||
if IsDebugging() {
|
||||
fmt.Println("Scraper data source: ./dump.html")
|
||||
f, err := os.Open("./tmp/dump.html")
|
||||
log_error(err)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
defer f.Close()
|
||||
r = charmap.Windows1252.NewDecoder().Reader(f)
|
||||
} else {
|
||||
client := &http.Client{
|
||||
Timeout: time.Duration(1) * time.Minute,
|
||||
}
|
||||
resp, e := client.Get("http://www.byond.com/games/exadv1/spacestation13")
|
||||
log_error(e)
|
||||
resp, err := client.Get("http://www.byond.com/games/exadv1/spacestation13")
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
// Yep, Byond serve's it's pages with Windows-1252 encoding...
|
||||
r = charmap.Windows1252.NewDecoder().Reader(resp.Body)
|
||||
|
||||
}
|
||||
doc, e := goquery.NewDocumentFromReader(r)
|
||||
log_error(e)
|
||||
return doc
|
||||
doc, err := goquery.NewDocumentFromReader(r)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return doc, nil
|
||||
}
|
||||
|
||||
func parse_data(data *goquery.Document) []*RawServerData {
|
||||
func parse_data(data *goquery.Document) ([]*RawServerData, error) {
|
||||
var servers []*RawServerData
|
||||
data.Find(".live_game_entry").Each(func(i int, s *goquery.Selection) {
|
||||
tmp := parse_server_data(s)
|
||||
tmp, err := parse_server_data(s)
|
||||
if !log_error(err) {
|
||||
if tmp != nil {
|
||||
servers = append(servers, tmp)
|
||||
}
|
||||
}
|
||||
})
|
||||
return servers
|
||||
return servers, nil
|
||||
}
|
||||
|
||||
func parse_server_data(raw *goquery.Selection) *RawServerData {
|
||||
func parse_server_data(raw *goquery.Selection) (*RawServerData, error) {
|
||||
s := raw.Find(".live_game_status")
|
||||
|
||||
t := s.Find("b").First()
|
||||
@ -72,7 +86,7 @@ func parse_server_data(raw *goquery.Selection) *RawServerData {
|
||||
title = strings.Replace(title, "\n", "", -1)
|
||||
if len(title) < 1 {
|
||||
// Yes, someone has made a public server without a server name at least once
|
||||
return nil
|
||||
return nil, fmt.Errorf("Empty name for server")
|
||||
}
|
||||
|
||||
game_url := s.Find("span.smaller").Find("nobr").Text()
|
||||
@ -90,9 +104,11 @@ func parse_server_data(raw *goquery.Selection) *RawServerData {
|
||||
// than 2 there's multiple matches, which is fishy...
|
||||
if len(ret) == 2 {
|
||||
p, err := strconv.ParseInt(ret[1], 10, 0)
|
||||
log_error(err)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
players = int(p)
|
||||
}
|
||||
|
||||
return &RawServerData{title, game_url, site_url, players, Now()}
|
||||
return &RawServerData{title, game_url, site_url, players, Now()}, nil
|
||||
}
|
||||
|
||||
@ -23,23 +23,27 @@ func (i *Instance) UpdateServers() {
|
||||
tx := i.DB.NewTransaction()
|
||||
|
||||
config, err := LoadConfig(SERVERS_CONFIG)
|
||||
if err != nil {
|
||||
fmt.Printf("Unable to load servers to poll: %s\n", err) // TODO
|
||||
} else {
|
||||
if !log_error(err) {
|
||||
if i.Debug {
|
||||
fmt.Println("\nPolling servers...")
|
||||
}
|
||||
for _, s := range PollServers(config.PollServers, config.Timeout) {
|
||||
polled, err := PollServers(config.PollServers, config.Timeout)
|
||||
if !log_error(err) {
|
||||
for _, s := range polled {
|
||||
i.update_server(tx, s)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if i.Debug {
|
||||
fmt.Println("\nScraping servers...")
|
||||
}
|
||||
for _, s := range ScrapePage() {
|
||||
scraped, err := ScrapePage()
|
||||
if !log_error(err) {
|
||||
for _, s := range scraped {
|
||||
i.update_server(tx, s)
|
||||
}
|
||||
}
|
||||
|
||||
if i.Debug {
|
||||
fmt.Println("\nUpdating inactive servers...")
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user