package app import ( "context" "log/slog" "github.com/robfig/cron/v3" "cryptoHermes/internal/worker" ) type Scheduler struct { cron *cron.Cron collector *worker.Collector log *slog.Logger rootCtx context.Context } func NewScheduler(c *worker.Collector, log *slog.Logger) *Scheduler { return &Scheduler{ cron: cron.New(), collector: c, log: log, } } func (s *Scheduler) Start(ctx context.Context) { s.rootCtx = ctx s.add("*/15 * * * *", "klines_15m", func(c context.Context) { _ = s.collector.CollectKlines(c, "15m") }) s.add("0 * * * *", "klines_1h", func(c context.Context) { _ = s.collector.CollectKlines(c, "1h") }) s.add("0 */4 * * *", "klines_4h", func(c context.Context) { _ = s.collector.CollectKlines(c, "4h") }) s.add("5 0 * * *", "klines_1d", func(c context.Context) { _ = s.collector.CollectKlines(c, "1d") }) s.add("10 0 * * 1", "klines_1w", func(c context.Context) { _ = s.collector.CollectKlines(c, "1w") }) s.add("*/15 * * * *", "funding", func(c context.Context) { _ = s.collector.CollectFunding(c) }) s.add("*/15 * * * *", "oi", func(c context.Context) { _ = s.collector.CollectOpenInterest(c) }) s.add("*/15 * * * *", "ls", func(c context.Context) { _ = s.collector.CollectLongShortRatio(c) }) s.add("*/15 * * * *", "taker", func(c context.Context) { _ = s.collector.CollectTakerVolume(c) }) s.cron.Start() s.log.Info("scheduler_started") } func (s *Scheduler) add(spec, name string, fn func(context.Context)) { _, err := s.cron.AddFunc(spec, func() { s.log.Info("cron_tick", "job", name) fn(s.rootCtx) }) if err != nil { s.log.Error("cron_add_failed", "job", name, "err", err) } } func (s *Scheduler) Stop() { s.log.Info("scheduler_stopping") <-s.cron.Stop().Done() }