package lib import ( "os" "strconv" "time" ) // Config holds all configuration values type Config struct { // Discord settings DiscordToken string AdminIDs []string // Himbucks settings HimbucksPerReward int MessageCountThreshold int CooldownPeriod time.Duration // Markov settings MarkovDefaultMessages int MarkovMaxMessages int MarkovCacheSize int MarkovMaxNGram int // Maximum n-gram level (3, 4, 5, etc.) MarkovMemoryLimit int // Memory limit in MB for n-gram chains // Database settings MaxOpenConns int MaxIdleConns int ConnMaxLifetime time.Duration // Command cooldowns (in seconds) PingCooldown int HsCooldown int MarkovCooldown int MarkovAskCooldown int HimbucksCooldown int HimboardCooldown int SendbucksCooldown int ShopCooldown int GivebucksCooldown int } var AppConfig *Config // LoadConfig loads configuration from environment variables func LoadConfig() *Config { config := &Config{ // Discord settings DiscordToken: getEnv("DISCORD_TOKEN", ""), AdminIDs: getEnvSlice("ADMIN_USER_IDS", []string{}), // Himbucks settings HimbucksPerReward: getEnvInt("HIMBUCKS_PER_REWARD", 10), MessageCountThreshold: getEnvInt("MESSAGE_COUNT_THRESHOLD", 5), CooldownPeriod: time.Duration(getEnvInt("HIMBUCKS_COOLDOWN_MINUTES", 1)) * time.Minute, // Markov settings MarkovDefaultMessages: getEnvInt("MARKOV_DEFAULT_MESSAGES", 100), MarkovMaxMessages: getEnvInt("MARKOV_MAX_MESSAGES", 1000), MarkovCacheSize: getEnvInt("MARKOV_CACHE_SIZE", 10), MarkovMaxNGram: getEnvInt("MARKOV_MAX_NGRAM", 5), MarkovMemoryLimit: getEnvInt("MARKOV_MEMORY_LIMIT_MB", 100), // Database settings MaxOpenConns: getEnvInt("DB_MAX_OPEN_CONNS", 25), MaxIdleConns: getEnvInt("DB_MAX_IDLE_CONNS", 5), ConnMaxLifetime: time.Duration(getEnvInt("DB_CONN_MAX_LIFETIME_MINUTES", 5)) * time.Minute, // Command cooldowns (in seconds) PingCooldown: getEnvInt("PING_COOLDOWN_SECONDS", 5), HsCooldown: getEnvInt("HS_COOLDOWN_SECONDS", 10), MarkovCooldown: getEnvInt("MARKOV_COOLDOWN_SECONDS", 30), MarkovAskCooldown: getEnvInt("MARKOV_ASK_COOLDOWN_SECONDS", 30), HimbucksCooldown: getEnvInt("HIMBUCKS_COOLDOWN_SECONDS", 5), HimboardCooldown: getEnvInt("HIMBOARD_COOLDOWN_SECONDS", 5), SendbucksCooldown: getEnvInt("SENDBUCKS_COOLDOWN_SECONDS", 1800), ShopCooldown: getEnvInt("SHOP_COOLDOWN_SECONDS", 5), GivebucksCooldown: getEnvInt("GIVEBUCKS_COOLDOWN_SECONDS", 1), } AppConfig = config return config } // getEnv gets an environment variable with a default value func getEnv(key, defaultValue string) string { if value := os.Getenv(key); value != "" { return value } return defaultValue } // getEnvInt gets an environment variable as an integer with a default value func getEnvInt(key string, defaultValue int) int { if value := os.Getenv(key); value != "" { if intValue, err := strconv.Atoi(value); err == nil { return intValue } } return defaultValue } func getEnvSlice(key string, defaultValue []string) []string { if value := os.Getenv(key); value != "" { return importStrings(value) } return defaultValue } func importStrings(s string) []string { var strings []string current := "" for _, c := range s { if c == ',' { strings = append(strings, current) current = "" } else { current += string(c) } } if current != "" { strings = append(strings, current) } return strings }