root.go 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  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/diamondburned/arikawa/v3/utils/ws"
  9. "github.com/gdamore/tcell/v2"
  10. "github.com/rivo/tview"
  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. tview.Borders.Horizontal = cfg.Theme.Border.Preset.Horizontal
  59. tview.Borders.Vertical = cfg.Theme.Border.Preset.Vertical
  60. tview.Borders.TopLeft = cfg.Theme.Border.Preset.TopLeft
  61. tview.Borders.TopRight = cfg.Theme.Border.Preset.TopRight
  62. tview.Borders.BottomLeft = cfg.Theme.Border.Preset.BottomLeft
  63. tview.Borders.BottomRight = cfg.Theme.Border.Preset.BottomRight
  64. tview.Borders.HorizontalFocus = tview.Borders.Horizontal
  65. tview.Borders.VerticalFocus = tview.Borders.Vertical
  66. tview.Borders.TopLeftFocus = tview.Borders.TopLeft
  67. tview.Borders.TopRightFocus = tview.Borders.TopRight
  68. tview.Borders.BottomLeftFocus = tview.Borders.BottomLeft
  69. tview.Borders.BottomRightFocus = tview.Borders.BottomRight
  70. app = newApp(cfg)
  71. return app.run(tok)
  72. }