117 lines
4.2 KiB
Go
117 lines
4.2 KiB
Go
package config
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"github.com/spf13/viper"
|
|
)
|
|
|
|
// Config holds all Tongo Core configuration values.
|
|
type Config struct {
|
|
Daemon DaemonConfig `mapstructure:"daemon"`
|
|
Valkey ValkeyConfig `mapstructure:"valkey"`
|
|
Engine EngineConfig `mapstructure:"engine"`
|
|
Combat CombatConfig `mapstructure:"combat"`
|
|
Markets MarketsConfig `mapstructure:"markets"`
|
|
}
|
|
|
|
// DaemonConfig holds parameters for the daemon runtime.
|
|
type DaemonConfig struct {
|
|
TickIntervalMs int `mapstructure:"tick_interval_ms"`
|
|
LogLevel string `mapstructure:"log_level"`
|
|
}
|
|
|
|
// ValkeyConfig holds connections settings for Valkey/Redis.
|
|
type ValkeyConfig struct {
|
|
Host string `mapstructure:"host"`
|
|
Port int `mapstructure:"port"`
|
|
Password string `mapstructure:"password"`
|
|
DB int `mapstructure:"db"`
|
|
}
|
|
|
|
// EngineConfig holds high-level simulation settings.
|
|
type EngineConfig struct {
|
|
TargetActiveMatches int `mapstructure:"target_active_matches"`
|
|
MaxActiveMatches int `mapstructure:"max_active_matches"`
|
|
MinActiveMatches int `mapstructure:"min_active_matches"`
|
|
PreMatchDurationTicks int `mapstructure:"pre_match_duration_ticks"`
|
|
MinMatchDurationTicks int `mapstructure:"min_match_duration_ticks"`
|
|
MaxMatchDurationTicks int `mapstructure:"max_match_duration_ticks"`
|
|
ResolvingDurationTicks int `mapstructure:"resolving_duration_ticks"`
|
|
TaxonomyPath string `mapstructure:"taxonomy_path"`
|
|
}
|
|
|
|
// CombatConfig holds modifiers for combat simulation.
|
|
type CombatConfig struct {
|
|
DamageScalingFactor float64 `mapstructure:"damage_scaling_factor"`
|
|
DamageVarianceLow float64 `mapstructure:"damage_variance_low"`
|
|
DamageVarianceHigh float64 `mapstructure:"damage_variance_high"`
|
|
CriticalHitChance float64 `mapstructure:"critical_hit_chance"`
|
|
CriticalHitMultiplier float64 `mapstructure:"critical_hit_multiplier"`
|
|
}
|
|
|
|
// MarketsConfig holds parameters for overround margin and price limits.
|
|
type MarketsConfig struct {
|
|
PrimaryMargin float64 `mapstructure:"primary_margin"`
|
|
SecondaryMargin float64 `mapstructure:"secondary_margin"`
|
|
ExoticMargin float64 `mapstructure:"exotic_margin"`
|
|
MinPrice float64 `mapstructure:"min_price"`
|
|
MaxPrice float64 `mapstructure:"max_price"`
|
|
MinProbability float64 `mapstructure:"min_probability"`
|
|
MaxProbability float64 `mapstructure:"max_probability"`
|
|
}
|
|
|
|
// Load reads configuration from the config file and environment variables.
|
|
func Load() (*Config, error) {
|
|
viper.SetConfigName("tongo")
|
|
viper.SetConfigType("yaml")
|
|
viper.AddConfigPath("./config")
|
|
viper.AddConfigPath(".")
|
|
viper.SetEnvPrefix("TONGO")
|
|
viper.AutomaticEnv()
|
|
|
|
// Defaults
|
|
viper.SetDefault("daemon.tick_interval_ms", 2000)
|
|
viper.SetDefault("daemon.log_level", "info")
|
|
|
|
viper.SetDefault("valkey.host", "localhost")
|
|
viper.SetDefault("valkey.port", 6379)
|
|
viper.SetDefault("valkey.password", "")
|
|
viper.SetDefault("valkey.db", 0)
|
|
|
|
viper.SetDefault("engine.target_active_matches", 8)
|
|
viper.SetDefault("engine.max_active_matches", 12)
|
|
viper.SetDefault("engine.min_active_matches", 4)
|
|
viper.SetDefault("engine.pre_match_duration_ticks", 30)
|
|
viper.SetDefault("engine.min_match_duration_ticks", 60)
|
|
viper.SetDefault("engine.max_match_duration_ticks", 150)
|
|
viper.SetDefault("engine.resolving_duration_ticks", 3)
|
|
viper.SetDefault("engine.taxonomy_path", "../data-source/taxonomy.yaml")
|
|
|
|
viper.SetDefault("combat.damage_scaling_factor", 0.1)
|
|
viper.SetDefault("combat.damage_variance_low", 0.6)
|
|
viper.SetDefault("combat.damage_variance_high", 1.4)
|
|
viper.SetDefault("combat.critical_hit_chance", 0.05)
|
|
viper.SetDefault("combat.critical_hit_multiplier", 3.0)
|
|
|
|
viper.SetDefault("markets.primary_margin", 1.06)
|
|
viper.SetDefault("markets.secondary_margin", 1.075)
|
|
viper.SetDefault("markets.exotic_margin", 1.12)
|
|
viper.SetDefault("markets.min_price", 1.01)
|
|
viper.SetDefault("markets.max_price", 51.00)
|
|
viper.SetDefault("markets.min_probability", 0.02)
|
|
viper.SetDefault("markets.max_probability", 0.98)
|
|
|
|
if err := viper.ReadInConfig(); err != nil {
|
|
if _, ok := err.(viper.ConfigFileNotFoundError); !ok {
|
|
return nil, fmt.Errorf("reading config: %w", err)
|
|
}
|
|
}
|
|
|
|
var cfg Config
|
|
if err := viper.Unmarshal(&cfg); err != nil {
|
|
return nil, fmt.Errorf("unmarshaling config: %w", err)
|
|
}
|
|
|
|
return &cfg, nil
|
|
}
|