package config import ( "os" "strconv" "strings" "time" ) type Config struct { ListenAddr string PublicBaseURL string MySQLDSN string RedisAddr string RedisPassword string RedisDB int AutoMigrate bool JavaAuthBaseURL string JavaDeviceBaseURL string JavaAppBaseURL string JavaBridgeBaseURL string JavaOtherBaseURL string JavaWalletBaseURL string BaishunPlatformBaseURL string BaishunAppID int64 BaishunAppName string BaishunAppChannel string BaishunAppKey string BaishunGSP int BaishunLaunchCodeTTLSeconds int BaishunSSTokenTTLSeconds int InternalCallbackSecret string RegisterRewardStreamKey string RegisterRewardConsumerGroup string RegisterRewardConsumerName string RegisterRewardBatchSize int64 RegisterRewardBlock time.Duration RegisterRewardMinIdle time.Duration Timeout time.Duration } func Load() Config { return Config{ ListenAddr: getEnv("INVITE_HTTP_ADDR", ":2900"), PublicBaseURL: getEnv("INVITE_PUBLIC_BASE_URL", "http://localhost:2900"), MySQLDSN: getEnv("INVITE_MYSQL_DSN", "root:root@tcp(127.0.0.1:3306)/chatapp3?charset=utf8mb4&parseTime=True&loc=Local"), RedisAddr: getEnv("INVITE_REDIS_ADDR", "127.0.0.1:6379"), RedisPassword: getEnv("INVITE_REDIS_PASSWORD", ""), RedisDB: getEnvInt("INVITE_REDIS_DB", 0), AutoMigrate: getEnvBool("INVITE_AUTO_MIGRATE", false), JavaAuthBaseURL: getEnv("INVITE_JAVA_AUTH_BASE_URL", "http://127.0.0.1:2100"), JavaDeviceBaseURL: getEnv("INVITE_JAVA_DEVICE_BASE_URL", "http://127.0.0.1:2400"), JavaAppBaseURL: getEnv("INVITE_JAVA_APP_BASE_URL", "http://127.0.0.1:2400"), JavaBridgeBaseURL: getEnv("INVITE_JAVA_BRIDGE_BASE_URL", "http://127.0.0.1:2200"), JavaOtherBaseURL: getEnv("GAME_JAVA_OTHER_BASE_URL", getEnv("INVITE_JAVA_APP_BASE_URL", "http://127.0.0.1:2400")), JavaWalletBaseURL: getEnv("GAME_JAVA_WALLET_BASE_URL", "http://127.0.0.1:2300"), BaishunPlatformBaseURL: getEnv("BAISHUN_PLATFORM_BASE_URL", ""), BaishunAppID: getEnvInt64("BAISHUN_APP_ID", 0), BaishunAppName: getEnv("BAISHUN_APP_NAME", ""), BaishunAppChannel: getEnv("BAISHUN_APP_CHANNEL", ""), BaishunAppKey: getEnv("BAISHUN_APP_KEY", ""), BaishunGSP: getEnvInt("BAISHUN_GSP", 101), BaishunLaunchCodeTTLSeconds: getEnvInt("BAISHUN_LAUNCH_CODE_TTL_SECONDS", 300), BaishunSSTokenTTLSeconds: getEnvInt("BAISHUN_SS_TOKEN_TTL_SECONDS", 86400), InternalCallbackSecret: getEnv("GAME_INTERNAL_CALLBACK_SECRET", ""), RegisterRewardStreamKey: getEnv("REGISTER_REWARD_STREAM_KEY", "activity:register:reward"), RegisterRewardConsumerGroup: getEnv("REGISTER_REWARD_CONSUMER_GROUP", "register-reward"), RegisterRewardConsumerName: getEnv("REGISTER_REWARD_CONSUMER_NAME", defaultConsumerName("register-reward")), RegisterRewardBatchSize: int64(getEnvInt("REGISTER_REWARD_BATCH_SIZE", 10)), RegisterRewardBlock: time.Duration(getEnvInt("REGISTER_REWARD_BLOCK_MILLIS", 5000)) * time.Millisecond, RegisterRewardMinIdle: time.Duration(getEnvInt("REGISTER_REWARD_MIN_IDLE_MILLIS", 60000)) * time.Millisecond, Timeout: time.Duration(getEnvInt("INVITE_HTTP_TIMEOUT_SECONDS", 8)) * time.Second, } } func getEnv(key, fallback string) string { if value := os.Getenv(key); value != "" { return value } return fallback } func getEnvInt(key string, fallback int) int { value := os.Getenv(key) if value == "" { return fallback } parsed, err := strconv.Atoi(value) if err != nil { return fallback } return parsed } func getEnvInt64(key string, fallback int64) int64 { value := os.Getenv(key) if value == "" { return fallback } parsed, err := strconv.ParseInt(value, 10, 64) if err != nil { return fallback } return parsed } func getEnvBool(key string, fallback bool) bool { value := os.Getenv(key) if value == "" { return fallback } parsed, err := strconv.ParseBool(value) if err != nil { return fallback } return parsed } func defaultConsumerName(prefix string) string { host, err := os.Hostname() if err != nil { return prefix } host = strings.TrimSpace(host) if host == "" { return prefix } return prefix + "-" + host }