package config import ( "fmt" "os" "strconv" ) type Config struct { TelegramChatID int64 Port int RateLimit int APIKey string DeviceName string PrismEndpointPrefix string SignalSocket string ProtonIMAPUsername string ProtonIMAPPassword string ProtonBridgeAddr string TelegramBotToken string StoragePath string VerboseLogging bool EnableSignal bool EnableProton bool EnableTelegram bool } func Load() (*Config, error) { cfg := &Config{ APIKey: os.Getenv("API_KEY"), Port: getEnvInt("PORT", 8080), VerboseLogging: getEnvBool("VERBOSE_LOGGING", false), RateLimit: getEnvInt("RATE_LIMIT", 100), DeviceName: getEnvString("DEVICE_NAME", "Prism"), EnableSignal: getEnvBool("FEATURE_ENABLE_SIGNAL", false), SignalSocket: getEnvString("SIGNAL_SOCKET", "/run/signal-cli/socket"), EnableProton: getEnvBool("FEATURE_ENABLE_PROTON", false), ProtonIMAPUsername: os.Getenv("PROTON_IMAP_USERNAME"), ProtonIMAPPassword: os.Getenv("PROTON_IMAP_PASSWORD"), ProtonBridgeAddr: getEnvString("PROTON_BRIDGE_ADDR", "protonmail-bridge:143"), EnableTelegram: getEnvBool("FEATURE_ENABLE_TELEGRAM", false), TelegramBotToken: os.Getenv("TELEGRAM_BOT_TOKEN"), TelegramChatID: getEnvInt64("TELEGRAM_CHAT_ID", 0), StoragePath: getEnvString("STORAGE_PATH", "./data/prism.db"), } cfg.PrismEndpointPrefix = fmt.Sprintf("[%s:", cfg.DeviceName) if err := cfg.Validate(); err != nil { return nil, err } return cfg, nil } func (c *Config) Validate() error { if c.APIKey == "" { return fmt.Errorf("API_KEY environment variable is required") } return nil } func (c *Config) IsProtonEnabled() bool { return c.EnableProton && c.ProtonIMAPUsername != "" && c.ProtonIMAPPassword != "" && c.ProtonBridgeAddr != "" } func (c *Config) IsSignalEnabled() bool { return c.EnableSignal } func (c *Config) IsTelegramEnabled() bool { return c.EnableTelegram } func getEnvString(key, defaultValue string) string { if value := os.Getenv(key); value != "" { return value } return defaultValue } func getEnvInt(key string, defaultValue int) int { if value := os.Getenv(key); value != "" { if i, err := strconv.Atoi(value); err == nil { return i } } return defaultValue } func getEnvInt64(key string, defaultValue int64) int64 { if value := os.Getenv(key); value != "" { if i, err := strconv.ParseInt(value, 10, 64); err == nil { return i } } return defaultValue } func getEnvBool(key string, defaultValue bool) bool { if value := os.Getenv(key); value != "" { return value == "true" || value == "1" } return defaultValue }