package config import ( "fmt" "os" "github.com/kelseyhightower/envconfig" ) type Config struct { Bot BotConfig N8n N8nConfig Speech SpeechConfig Redis RedisConfig Server ServerConfig Log LogConfig } type BotConfig struct { Token string `envconfig:"TELEGRAM_BOT_TOKEN" required:"true"` Mode string `envconfig:"BOT_MODE" default:"polling"` WebhookURL string `envconfig:"TELEGRAM_WEBHOOK_URL"` Debug bool `envconfig:"TELEGRAM_DEBUG" default:"false"` } type N8nConfig struct { WebhookURL string `envconfig:"N8N_WEBHOOK_URL" required:"true"` AuthToken string `envconfig:"N8N_AUTH_TOKEN"` TimeoutSecs int `envconfig:"N8N_TIMEOUT" default:"30"` RetryCount int `envconfig:"N8N_RETRY_COUNT" default:"3"` } type SpeechConfig struct { Provider string `envconfig:"STT_PROVIDER" default:"openai"` OpenAIKey string `envconfig:"OPENAI_API_KEY"` WhisperModel string `envconfig:"WHISPER_MODEL" default:"whisper-1"` Language string `envconfig:"WHISPER_LANGUAGE" default:""` FFmpegPath string `envconfig:"FFMPEG_PATH" default:"ffmpeg"` VoiceStorePath string `envconfig:"VOICE_STORE_PATH" default:"/tmp/gw_telegram/voice"` } type RedisConfig struct { URL string `envconfig:"REDIS_URL" default:"redis://localhost:6379"` TTLHours int `envconfig:"SESSION_TTL" default:"24"` } type ServerConfig struct { Port int `envconfig:"SERVER_PORT" default:"8080"` } type LogConfig struct { Level string `envconfig:"LOG_LEVEL" default:"info"` Format string `envconfig:"LOG_FORMAT" default:"json"` } func Load() (*Config, error) { var cfg Config if err := envconfig.Process("", &cfg); err != nil { return nil, fmt.Errorf("load config: %w", err) } return &cfg, nil } func MustLoad() *Config { cfg, err := Load() if err != nil { fmt.Fprintf(os.Stderr, "fatal: %v\n", err) os.Exit(1) } return cfg }