package main import ( "os" "strconv" ) // ================== Config ================== // // Matrix ENV attese (nuovo): // MATRIX_HS es. https://matrix.tuodominio.tld // MATRIX_USER es. demone oppure @demone:tuodominio.tld // MATRIX_PASS password // MATRIX_DEVICE_NAME (opzionale) nome dispositivo, default "daemon-bot" // MATRIX_ROOM ID (!...), alias (#...), o permalink (https://matrix.to/#/...) // // Retro-compat: // MATRIX_ROOM_ID (vecchio nome campo; se presente ma c'è anche MATRIX_ROOM, vince MATRIX_ROOM) // type Config struct { // Dati e simboli DataDir string StateDir string BinanceSymbol string // es. "BTCUSDT" o "ETHUSDT" // Asset THORChain ThorFrom string // es. "ETH.USDT-0xdAC17F..." (USDT ERC-20 mainnet) ThorTo string // es. "BTC.BTC" oppure "ETH.ETH" FromUnitPow int // unità per quote (tipicamente 8 per THORChain) ToUnitPow int // unità per quote (tipicamente 8 per THORChain) // Dataset / training Lookback int LearningRate float64 BatchSize int ValSplit float64 MaxEpochs int EarlyStopFrac float64 ValConfZ float64 // Decisione SafetyBps float64 MinMoveBps float64 // Quantità di riferimento per quote e per istruzioni manuali RefFrom float64 // es. 100.0 USDT RefTo float64 // es. 0.1 ETH/BTC // Matrix (username+password da env; il token lo gestiamo noi) MatrixHS string // es. "https://matrix.tuodominio.tld" MatrixUser string // es. "demone" oppure "@demone:tuodominio.tld" MatrixPass string // password dell'utente bot MatrixDeviceName string // opzionale: nome dispositivo per il login // Nuova chiave generica stanza (ID/alias/permalink). Preferita. MatrixRoom string // Legacy per retro-compat (ID puro). Usata solo se MatrixRoom è vuota. MatrixRoomID string } func getenvDefault(k, def string) string { if v := os.Getenv(k); v != "" { return v } return def } func getInt(k string, def int) int { if v := os.Getenv(k); v != "" { if n, err := strconv.Atoi(v); err == nil { return n } } return def } func getF(k string, def float64) float64 { if v := os.Getenv(k); v != "" { if f, err := strconv.ParseFloat(v, 64); err == nil { return f } } return def } func loadConfig() Config { cfg := Config{ // Cartelle / simboli DataDir: getenvDefault("DATA_DIR", "data"), StateDir: getenvDefault("STATE_DIR", "state"), BinanceSymbol: getenvDefault("BINANCE_SYMBOL", "BTCUSDT"), // THORChain ThorFrom: getenvDefault("THOR_FROM", "ETH.USDT-0xdAC17F958D2ee523a2206206994597C13D831ec7"), ThorTo: getenvDefault("THOR_TO", "BTC.BTC"), FromUnitPow: getInt("FROM_UNIT_POW", 8), ToUnitPow: getInt("TO_UNIT_POW", 8), // Training Lookback: getInt("LOOKBACK", 30), LearningRate: getF("LR", 0.03), BatchSize: getInt("BATCH", 32), ValSplit: getF("VAL_SPLIT", 0.2), MaxEpochs: getInt("MAX_EPOCHS", 100), EarlyStopFrac: getF("EARLY_STOP_PCT", 0.5), ValConfZ: getF("VAL_CONF_Z", 0.90), // Decisione SafetyBps: getF("SAFETY_BPS", 10.0), MinMoveBps: getF("MIN_MOVE_BPS", 5.0), // Quote di riferimento RefFrom: getF("REF_FROM", 100.0), RefTo: getF("REF_TO", 0.1), // Matrix base MatrixHS: getenvDefault("MATRIX_HS", ""), MatrixUser: getenvDefault("MATRIX_USER", ""), MatrixPass: getenvDefault("MATRIX_PASS", ""), MatrixDeviceName: getenvDefault("MATRIX_DEVICE_NAME", "daemon-bot"), // Matrix room (nuovo + legacy) MatrixRoom: getenvDefault("MATRIX_ROOM", ""), MatrixRoomID: getenvDefault("MATRIX_ROOM_ID", ""), } // Retro-compatibilità: se MATRIX_ROOM è vuota ma MATRIX_ROOM_ID è valorizzata, usa quella. if cfg.MatrixRoom == "" && cfg.MatrixRoomID != "" { cfg.MatrixRoom = cfg.MatrixRoomID } return cfg }