package config import ( "time" "github.com/fsnotify/fsnotify" "github.com/khlieng/dispatch/storage" "github.com/spf13/viper" ) type Config struct { Address string Port string Dev bool Identd bool HexIP bool AutoCTCP bool `mapstructure:"auto_ctcp"` VerifyCertificates bool `mapstructure:"verify_certificates"` Headers map[string]string Defaults Defaults HTTPS HTTPS LetsEncrypt LetsEncrypt Auth Auth DCC DCC Proxy Proxy } type Defaults struct { Name string Host string Port string Channels []string ServerPassword string `mapstructure:"server_password"` SSL bool ReadOnly bool ShowDetails bool `mapstructure:"show_details"` } type HTTPS struct { Enabled bool Port string Cert string Key string HSTS HSTS } type HSTS struct { Enabled bool MaxAge string `mapstructure:"max_age"` IncludeSubdomains bool `mapstructure:"include_subdomains"` Preload bool } type LetsEncrypt struct { Domain string Email string } type Auth struct { Anonymous bool Login bool Registration bool Providers map[string]Provider } type Provider struct { Key string Secret string } type DCC struct { Enabled bool Autoget Autoget } type Autoget struct { Enabled bool Delete bool DeleteAfter time.Duration `mapstructure:"delete_after"` } type Proxy struct { Enabled bool Protocol string Host string Port string Username string Password string } func LoadConfig() (*Config, chan *Config) { viper.SetConfigName("config") viper.AddConfigPath(storage.Path.ConfigRoot()) viper.ReadInConfig() config := &Config{} viper.Unmarshal(config) viper.WatchConfig() configCh := make(chan *Config, 1) prev := time.Now() viper.OnConfigChange(func(e fsnotify.Event) { now := time.Now() // fsnotify sometimes fires twice if now.Sub(prev) > time.Second { config := &Config{} err := viper.Unmarshal(config) if err == nil { configCh <- config } prev = now } }) return config, configCh }