package main import ( "log" "regexp" "sync" "time" ) var ( playerRegex = regexp.MustCompile(`^(.+): (\d+)$`) ) type PlayerCount struct { // The number of minutes elapsed since January 1, 1970 UTC. Time int64 `json:"time"` Playing int `json:"playing"` NormalQueue int `json:"normal_queue"` PriorityQueue int `json:"priority_queue"` } type Poller interface { PollPlayerCount() (PlayerCount, error) String() string } func PollLoop(stop chan bool, wg *sync.WaitGroup, queue chan PlayerCount, logger *log.Logger, poller Poller) { defer wg.Done() defer logger.Printf("Poll loop exited") wg.Add(1) logger.Printf("Poll loop started") var lastPoll int64 = 0 for { select { case <-stop: return default: now := time.Now().Unix() / 60 if lastPoll == now { continue } count, err := poller.PollPlayerCount() if err != nil { logger.Printf("Failed polling player count: %s", err) continue } // Convert seconds into minutes count.Time = now lastPoll = now logger.Printf("Polled player count: %+v", count) queue <- count } } }