From 014b42cbb3af403d51991dd9a2e64c1af779ca0f Mon Sep 17 00:00:00 2001 From: "A. Svensson" Date: Thu, 21 Apr 2016 14:54:02 +0200 Subject: [PATCH] Handle errors better in updater/scraper/poller. --- src/poller.go | 7 +++--- src/scraper.go | 58 ++++++++++++++++++++++++++++++++------------------ src/updater.go | 18 ++++++++++------ 3 files changed, 51 insertions(+), 32 deletions(-) diff --git a/src/poller.go b/src/poller.go index 702603c..3891c8c 100644 --- a/src/poller.go +++ b/src/poller.go @@ -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 } diff --git a/src/scraper.go b/src/scraper.go index 00af45b..4acdf7c 100644 --- a/src/scraper.go +++ b/src/scraper.go @@ -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) - if tmp != nil { - servers = append(servers, tmp) + 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 } diff --git a/src/updater.go b/src/updater.go index 906f2cc..28add56 100644 --- a/src/updater.go +++ b/src/updater.go @@ -23,22 +23,26 @@ 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) { - i.update_server(tx, s) + 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() { - i.update_server(tx, s) + scraped, err := ScrapePage() + if !log_error(err) { + for _, s := range scraped { + i.update_server(tx, s) + } } if i.Debug {