package config import ( "fmt" "os" "strconv" "strings" ) type Config struct { BotToken string BotDebug bool TelegramAdminID int64 RemnawaveName string RemnawaveURL string RemnawaveToken string RemnawaveCaddy string RemnawaveSubscription string } func Load() (*Config, error) { token := strings.TrimSpace(os.Getenv("BOT_TOKEN")) if token == "" { return nil, fmt.Errorf("BOT_TOKEN не задан") } adminID, err := strconv.ParseInt(strings.TrimSpace(os.Getenv("TELEGRAM_ADMIN_ID")), 10, 64) if err != nil || adminID <= 0 { return nil, fmt.Errorf("TELEGRAM_ADMIN_ID не задан или неверный") } panelURL := strings.TrimRight(strings.TrimSpace(os.Getenv("REMNAWAVE_PANEL_URL")), "/") if panelURL == "" { return nil, fmt.Errorf("REMNAWAVE_PANEL_URL не задан") } if !strings.HasPrefix(panelURL, "http://") && !strings.HasPrefix(panelURL, "https://") { return nil, fmt.Errorf("REMNAWAVE_PANEL_URL должен начинаться с http:// или https://") } panelToken := strings.TrimSpace(os.Getenv("REMNAWAVE_API_TOKEN")) if panelToken == "" { return nil, fmt.Errorf("REMNAWAVE_API_TOKEN не задан (создайте в панели: Settings → API Tokens)") } name := strings.TrimSpace(os.Getenv("REMNAWAVE_PANEL_NAME")) if name == "" { name = "Панель 1" } subURL := strings.TrimRight(strings.TrimSpace(os.Getenv("REMNAWAVE_SUBSCRIPTION_URL")), "/") if subURL != "" && !strings.HasPrefix(subURL, "http://") && !strings.HasPrefix(subURL, "https://") { return nil, fmt.Errorf("REMNAWAVE_SUBSCRIPTION_URL должен начинаться с http:// или https://") } return &Config{ BotToken: token, BotDebug: strings.EqualFold(strings.TrimSpace(os.Getenv("BOT_DEBUG")), "true"), TelegramAdminID: adminID, RemnawaveName: name, RemnawaveURL: panelURL, RemnawaveToken: panelToken, RemnawaveCaddy: strings.TrimSpace(os.Getenv("REMNAWAVE_CADDY_TOKEN")), RemnawaveSubscription: subURL, }, nil }