root.go 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. package cmd
  2. import (
  3. "flag"
  4. "log/slog"
  5. "github.com/ayn2op/discordo/internal/config"
  6. "github.com/ayn2op/discordo/internal/consts"
  7. "github.com/ayn2op/discordo/internal/logger"
  8. "github.com/ayn2op/tview"
  9. "github.com/diamondburned/arikawa/v3/utils/ws"
  10. "github.com/gdamore/tcell/v2"
  11. "github.com/zalando/go-keyring"
  12. )
  13. var (
  14. discordState *state
  15. app *application
  16. )
  17. func Run() error {
  18. logLevel := flag.String("log-level", "info", "log level")
  19. logFormat := flag.String("log-format", "text", "log format")
  20. token := flag.String("token", "", "authentication token")
  21. configPath := flag.String("config", config.DefaultPath(), "path to the configuration file")
  22. flag.Parse()
  23. var level slog.Level
  24. switch *logLevel {
  25. case "debug":
  26. ws.EnableRawEvents = true
  27. level = slog.LevelDebug
  28. case "info":
  29. level = slog.LevelInfo
  30. case "warn":
  31. level = slog.LevelWarn
  32. case "error":
  33. level = slog.LevelError
  34. }
  35. var format logger.Format
  36. switch *logFormat {
  37. case "text":
  38. format = logger.FormatText
  39. case "json":
  40. format = logger.FormatJson
  41. }
  42. if err := logger.Load(format, level); err != nil {
  43. return err
  44. }
  45. tok := *token
  46. if tok == "" {
  47. var err error
  48. tok, err = keyring.Get(consts.Name, "token")
  49. if err != nil {
  50. slog.Info("failed to retrieve token from keyring", "err", err)
  51. }
  52. }
  53. cfg, err := config.Load(*configPath)
  54. if err != nil {
  55. return err
  56. }
  57. tview.Styles.PrimitiveBackgroundColor = tcell.GetColor(cfg.Theme.BackgroundColor)
  58. app = newApplication(cfg)
  59. return app.run(tok)
  60. }