root.go 1.5 KB

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