root.go 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. package cmd
  2. import (
  3. "fmt"
  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/spf13/cobra"
  13. "github.com/zalando/go-keyring"
  14. )
  15. var (
  16. discordState *ningen.State
  17. app *application
  18. rootCmd = &cobra.Command{
  19. Use: consts.Name,
  20. RunE: func(cmd *cobra.Command, _ []string) error {
  21. flags := cmd.Flags()
  22. logLevel, _ := flags.GetString("log-level")
  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. logFormat, _ := flags.GetString("log-format")
  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 fmt.Errorf("failed to load logger: %w", err)
  45. }
  46. configPath, _ := flags.GetString("config")
  47. cfg, err := config.Load(configPath)
  48. if err != nil {
  49. return fmt.Errorf("failed to load config: %w", err)
  50. }
  51. tview.Styles.PrimitiveBackgroundColor = tcell.GetColor(cfg.Theme.BackgroundColor)
  52. token, _ := flags.GetString("token")
  53. if token == "" {
  54. token, err = keyring.Get(consts.Name, "token")
  55. if err != nil {
  56. slog.Info("failed to retrieve token from keyring", "err", err)
  57. }
  58. }
  59. app = newApplication(cfg)
  60. return app.run(token)
  61. },
  62. }
  63. Execute = rootCmd.Execute
  64. )
  65. func init() {
  66. flags := rootCmd.Flags()
  67. flags.StringP("token", "t", "", "authentication token")
  68. flags.StringP("config", "c", config.DefaultPath(), "path of the configuration file")
  69. flags.String("log-level", "info", "log level")
  70. flags.String("log-format", "text", "log format")
  71. }