root.go 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. package cmd
  2. import (
  3. "flag"
  4. "fmt"
  5. "log/slog"
  6. "os"
  7. "github.com/ayn2op/discordo/internal/app"
  8. "github.com/ayn2op/discordo/internal/config"
  9. "github.com/ayn2op/discordo/internal/keyring"
  10. "github.com/ayn2op/discordo/internal/logger"
  11. "github.com/diamondburned/arikawa/v3/utils/ws"
  12. )
  13. var (
  14. token string
  15. configPath string
  16. logPath string
  17. logLevel string
  18. )
  19. func Run() error {
  20. flag.StringVar(&token, "token", "", "authentication token (default: $DISCORDO_TOKEN or keyring)")
  21. flag.StringVar(&configPath, "config-path", config.DefaultPath(), "path of the configuration file")
  22. flag.StringVar(&logPath, "log-path", logger.DefaultPath(), "path of the log file")
  23. flag.StringVar(&logLevel, "log-level", "info", "log level")
  24. flag.Parse()
  25. var level slog.Level
  26. switch logLevel {
  27. case "debug":
  28. ws.EnableRawEvents = true
  29. level = slog.LevelDebug
  30. case "info":
  31. level = slog.LevelInfo
  32. case "warn":
  33. level = slog.LevelWarn
  34. case "error":
  35. level = slog.LevelError
  36. }
  37. if err := logger.Load(logPath, level); err != nil {
  38. return fmt.Errorf("failed to load logger: %w", err)
  39. }
  40. cfg, err := config.Load(configPath)
  41. if err != nil {
  42. return fmt.Errorf("failed to load config: %w", err)
  43. }
  44. if token == "" {
  45. token = os.Getenv("DISCORDO_TOKEN")
  46. }
  47. if token == "" {
  48. token, err = keyring.GetToken()
  49. if err != nil {
  50. slog.Info("failed to retrieve token from keyring", "err", err)
  51. }
  52. }
  53. return app.New(cfg).Run(token)
  54. }