root.go 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. package cmd
  2. import (
  3. "log/slog"
  4. "github.com/ayn2op/discordo/internal/config"
  5. "github.com/ayn2op/discordo/internal/consts"
  6. "github.com/ayn2op/discordo/internal/logger"
  7. "github.com/diamondburned/arikawa/v3/utils/ws"
  8. "github.com/gdamore/tcell/v2"
  9. "github.com/rivo/tview"
  10. "github.com/spf13/cobra"
  11. "github.com/zalando/go-keyring"
  12. )
  13. var (
  14. discordState *State
  15. app *App
  16. )
  17. var (
  18. rootCmd = &cobra.Command{
  19. PreRunE: func(cmd *cobra.Command, args []string) error {
  20. flags := cmd.Flags()
  21. var level slog.Level
  22. switch s, _ := flags.GetString("log-level"); s {
  23. case "debug":
  24. ws.EnableRawEvents = true
  25. level = slog.LevelDebug
  26. case "info":
  27. level = slog.LevelInfo
  28. case "warn":
  29. level = slog.LevelWarn
  30. case "error":
  31. level = slog.LevelError
  32. }
  33. var format logger.Format
  34. switch s, _ := flags.GetString("log-format"); s {
  35. case "text":
  36. format = logger.FormatText
  37. case "json":
  38. format = logger.FormatJson
  39. }
  40. return logger.Load(format, level)
  41. },
  42. RunE: func(cmd *cobra.Command, args []string) error {
  43. token, _ := cmd.Flags().GetString("token")
  44. if token == "" {
  45. var err error
  46. token, err = keyring.Get(consts.Name, "token")
  47. if err != nil {
  48. slog.Info("failed to retrieve token from keyring", "err", err)
  49. }
  50. }
  51. cfg, err := config.Load()
  52. if err != nil {
  53. return err
  54. }
  55. tview.Styles.PrimitiveBackgroundColor = tcell.GetColor(cfg.Theme.BackgroundColor)
  56. tview.Borders.Horizontal = cfg.Theme.Border.Preset.Horizontal
  57. tview.Borders.Vertical = cfg.Theme.Border.Preset.Vertical
  58. tview.Borders.TopLeft = cfg.Theme.Border.Preset.TopLeft
  59. tview.Borders.TopRight = cfg.Theme.Border.Preset.TopRight
  60. tview.Borders.BottomLeft = cfg.Theme.Border.Preset.BottomLeft
  61. tview.Borders.BottomRight = cfg.Theme.Border.Preset.BottomRight
  62. tview.Borders.HorizontalFocus = tview.Borders.Horizontal
  63. tview.Borders.VerticalFocus = tview.Borders.Vertical
  64. tview.Borders.TopLeftFocus = tview.Borders.TopLeft
  65. tview.Borders.TopRightFocus = tview.Borders.TopRight
  66. tview.Borders.BottomLeftFocus = tview.Borders.BottomLeft
  67. tview.Borders.BottomRightFocus = tview.Borders.BottomRight
  68. app = newApp(cfg)
  69. return app.run(token)
  70. },
  71. }
  72. Execute = rootCmd.Execute
  73. )
  74. func init() {
  75. flags := rootCmd.Flags()
  76. flags.StringP("token", "t", "", "the authentication token")
  77. flags.String("log-level", "info", "log level")
  78. flags.String("log-format", "text", "log format")
  79. }