package main import ( "flag" "fmt" "os" "github.com/dominicgisler/imap-spam-cleaner/app" "github.com/dominicgisler/imap-spam-cleaner/database" "github.com/dominicgisler/imap-spam-cleaner/handler" "github.com/dominicgisler/imap-spam-cleaner/inbox" "github.com/dominicgisler/imap-spam-cleaner/logx" "github.com/dominicgisler/imap-spam-cleaner/provider" ) const appName = "imap-spam-cleaner" var version = "dev" var options app.Options func init() { var v bool flag.BoolVar(&v, "version", false, "Show short version") flag.BoolVar(&options.RunNow, "now", false, "Run all inboxes once immediately, ignoring schedule") flag.BoolVar(&options.AnalyzeOnly, "analyze-only", false, "Only analyze emails, do not move or delete them") flag.Parse() if v { fmt.Printf("%s %s\n", appName, version) os.Exit(0) } } func main() { logx.Infof("Starting %s %s", appName, version) c, err := app.LoadConfig() if err != nil { logx.Errorf("Could not load config: %v", err) return } if err = database.Init("store.db"); err != nil { logx.Errorf("Could not init database: %v", err) } ctx := app.Context{ Config: c, Options: options, } var p provider.Provider for name, prov := range c.Providers { p, err = provider.New(prov.Type) if err != nil { logx.Errorf("Could not load provider: %v\n", err) return } if err = p.ValidateConfig(prov.Config); err != nil { logx.Errorf("Invalid config for provider %s: %v\n", name, err) return } } if ctx.Options.RunNow { logx.Info("Running all inboxes once immediately") inbox.RunAllInboxes(ctx) return } go func() { if err = handler.ListenAndServe(); err != nil { logx.Errorf("Error starting handler: %v", err) } }() inbox.Schedule(ctx) }