package main import ( "flag" "log" "os" "os/signal" "gitlab.com/whom/bingobot/internal/activity" "gitlab.com/whom/bingobot/internal/confession" "gitlab.com/whom/bingobot/internal/config" "gitlab.com/whom/bingobot/internal/discord" "gitlab.com/whom/bingobot/internal/logging" "gitlab.com/whom/bingobot/internal/state" "gitlab.com/whom/bingobot/internal/web" ) var ( token = flag.String("token", "", "Bot authentication token") ) func main() { var err error err = config.Init() if err != nil { log.Fatal(err) } logging.Init() flag.Parse() logging.Info("startup: initializing state engine") if err := state.Init( config.Get().InMemoryEventCacheSize, config.Get().PersistentCacheStore, ); err != nil { log.Fatalf("couldn't initialize state engine: %s", err.Error()) } logging.Info("startup: starting activity module") if err := activity.Start(); err != nil { // TODO: handle gracefully and continue? log.Fatalf("failed to start activity module: %s", err.Error()) } logging.Info("startup: starting confession module") if err := confession.Start(); err != nil { // TODO: handle gracefully and continue? log.Fatalf("failed to start confession module: %s", err.Error()) } logging.Info("startup: starting web module") go func() { if err := web.Start(); err != nil { log.Fatalf("failed to start local web server: %s", err.Error()) } }() // start this LAST logging.Info("startup: starting state engine") if err := state.Start(); err != nil { log.Fatalf("failed to start state machine: %s", err.Error()) } c := make(chan os.Signal, 1) signal.Notify(c, os.Interrupt) go func(){ for _ = range c { state.Teardown() discord.Close() os.Exit(1) } }() logging.Info("startup: connecting to discord") if err := discord.Connect(*token); err != nil { log.Fatal(err) } for {} }