package config import ( "bufio" "os" "strconv" "strings" ) type Config struct { DatabaseURL string SecretKey string Algorithm string AccessTokenExpireMinutes int AIBackend string DeepSeekAPIKey string DeepSeekBaseURL string DeepSeekModel string OllamaBaseURL string OllamaModel string } var Cfg = load() func loadDotEnv() { f, err := os.Open(".env") if err != nil { return } defer f.Close() scanner := bufio.NewScanner(f) for scanner.Scan() { line := strings.TrimSpace(scanner.Text()) if line == "" || strings.HasPrefix(line, "#") { continue } idx := strings.Index(line, "=") if idx <= 0 { continue } key := strings.TrimSpace(line[:idx]) val := strings.Trim(strings.TrimSpace(line[idx+1:]), "\"'") if _, ok := os.LookupEnv(key); !ok { os.Setenv(key, val) } } } func getenv(key, def string) string { if v := os.Getenv(key); v != "" { return v } return def } func getenvInt(key string, def int) int { v := os.Getenv(key) if v == "" { return def } n, err := strconv.Atoi(v) if err != nil { return def } return n } func load() *Config { loadDotEnv() return &Config{ DatabaseURL: getenv("DATABASE_URL", "sqlite+aiosqlite:///./mmgame.db"), SecretKey: getenv("SECRET_KEY", "mmgame-dev-secret-key-change-in-production"), Algorithm: getenv("ALGORITHM", "HS256"), AccessTokenExpireMinutes: getenvInt("ACCESS_TOKEN_EXPIRE_MINUTES", 60*24*7), AIBackend: getenv("AI_BACKEND", "rule"), DeepSeekAPIKey: getenv("DEEPSEEK_API_KEY", ""), DeepSeekBaseURL: getenv("DEEPSEEK_BASE_URL", "https://api.deepseek.com"), DeepSeekModel: getenv("DEEPSEEK_MODEL", "deepseek-chat"), OllamaBaseURL: getenv("OLLAMA_BASE_URL", "http://localhost:11434"), OllamaModel: getenv("OLLAMA_MODEL", "qwen2.5:7b"), } }