monitor-player-count/poller.go
2025-07-14 19:35:50 +02:00

59 lines
1.1 KiB
Go

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