package services import ( "context" "log/slog" "time" "gitea.henriburau.de/haw-lan/cod4watcher/models" ) type Scanner struct { p models.Persistence c4s models.StatusProvider done chan bool interval time.Duration } func NewScanner(p models.Persistence, c4s models.StatusProvider, interval time.Duration, done chan bool) (*Scanner, error) { return &Scanner{ p, c4s, done, interval, }, nil } func (s *Scanner) Scan() { ticker := time.NewTicker(s.interval) for { select { case <-s.done: return case <-ticker.C: ctx := context.Background() slog.Info("starting update") captures, err := s.p.GetCaptures(ctx) if err != nil { slog.Error("cannot get captures", "err", err) continue } for _, capture := range captures { if capture.Active { err := s.fetchInformation(ctx, capture) if err != nil { slog.Error("failed to update captures", "err", err) continue } } } } } } func (s *Scanner) fetchInformation(ctx context.Context, capture models.Capture) error { status, err := s.c4s.GetServerStatus(capture.Host, capture.Port, time.Second) if err != nil { return err } slog.Info("fetched data", "host", capture.Host, "map", status.MapName) recentMap, err := s.p.GetRecentMapScore(ctx, capture.ID) if err != nil { return err } if recentMap == nil || recentMap.StartTime.Before(status.MapStartTime) { newMap := models.MapScore{ CaptureID: capture.ID, StartTime: status.MapStartTime, Map: status.MapName, Counted: true, } err := s.p.CreateMapScore(ctx, &newMap) if err != nil { return err } recentMap, err = s.p.GetRecentMapScore(ctx, capture.ID) if err != nil { return err } } var scores []models.Score for _, score := range status.Score { score.MapScoreID = recentMap.ID scores = append(scores, score) } if len(scores) <= 0 { return nil } return s.p.CreateOrUpdateScores(ctx, scores) }