Files
qqbot/internal/bootstrap/bootstrap.go
2026-03-17 23:21:27 +08:00

69 lines
1.3 KiB
Go

package bootstrap
import (
"log/slog"
"github.com/sky22333/qqbot/config"
"github.com/sky22333/qqbot/internal/collector"
"github.com/sky22333/qqbot/internal/notifier"
"github.com/sky22333/qqbot/internal/targets"
)
type Options struct {
StartCollector bool
}
type Components struct {
Notifier *notifier.Notifier
Targets *targets.Store
Collector *collector.Collector
}
func New(cfg config.Config, logger *slog.Logger, opts Options) (*Components, error) {
flushInterval, err := cfg.TargetsFlushInterval()
if err != nil {
return nil, err
}
targetStore, err := targets.NewStore(cfg.Targets.FilePath, cfg.Targets.MaxRecords, flushInterval)
if err != nil {
return nil, err
}
n, err := notifier.New(cfg, logger)
if err != nil {
_ = targetStore.Close()
return nil, err
}
n.SetTargetStore(targetStore)
c := &Components{
Notifier: n,
Targets: targetStore,
}
if !opts.StartCollector {
return c, nil
}
targetCollector, err := collector.New(cfg, logger, targetStore)
if err != nil {
n.Close()
_ = targetStore.Close()
return nil, err
}
targetCollector.Start()
c.Collector = targetCollector
return c, nil
}
func (c *Components) Close() {
if c == nil {
return
}
if c.Collector != nil {
c.Collector.Stop()
}
if c.Notifier != nil {
c.Notifier.Close()
}
if c.Targets != nil {
_ = c.Targets.Close()
}
}