From bde9a8defb73399e5174794d7bb20907f8716832 Mon Sep 17 00:00:00 2001 From: Georg Pfuetzenreuter Date: Sat, 21 Sep 2024 16:06:04 +0200 Subject: Implement configuration file Abstract settings which commonly differ between instances to a YAML based configuration file to allow for easy administration without the need for modifying the source code. Signed-off-by: Georg Pfuetzenreuter --- main.go | 115 +++++++++++++++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 93 insertions(+), 22 deletions(-) (limited to 'main.go') diff --git a/main.go b/main.go index e817bcc..2ae52d0 100644 --- a/main.go +++ b/main.go @@ -1,40 +1,111 @@ package main -import "fmt" -import "crypto/tls" +import ( + "crypto/tls" + "errors" + "fmt" + "log" + "os" -import "github.com/go-irc/irc" -import "github.com/namsral/flag" + "flag" + "github.com/go-irc/irc" -import "git.circuitco.de/self/watbot/wat" + "git.circuitco.de/self/watbot/wat" + "github.com/creasty/defaults" + "gopkg.in/yaml.v3" +) + +type Config struct { + Watbot watConfig `yaml:"watbot"` +} + +type watConfig struct { + Nick string `yaml:"nick"` + Pass string `yaml:"pass"` + User string `yaml:"user"` + Name string `yaml:"name"` + Admins struct { + Hosts []string `yaml:"hosts"` + } `yaml:"admins"` + Channels struct { + Permitted []string `yaml:"permitted"` + } `yaml:"channels"` + Ignores struct { + Hosts []string `yaml:"hosts"` + } `yaml:"ignores"` + Server struct { + Host string `yaml:"host"` + Port int `default:"6697" yaml:"port"` + TlsVerify bool `default:"true" yaml:"tls_verify"` + } `yaml:"server"` +} + +func readConfig(configPath string) (*watConfig, error) { + allConfig := Config{} + + buffer, err := os.ReadFile(configPath) + if err != nil { + return nil, fmt.Errorf("Could not read configuration file: %s", err) + } + + err = yaml.Unmarshal(buffer, &allConfig) + if err != nil { + return nil, fmt.Errorf("Could not parse configuration file: %s", err) + } + + config := &allConfig.Watbot + defaults.Set(config) + + if config.Server.Host == "" { + return nil, errors.New("Shall I play wattery to know where to connect to?") + } + + if config.Name != "" && config.Nick == "" { + config.Nick = config.Name + } + + if config.Nick != "" && config.User == "" { + config.User = config.Nick + } + + if config.Name == "" || config.Nick == "" || config.User == "" { + return nil, errors.New("Don't know who I am.") + } + + return config, nil +} func main() { - pass := flag.String("pass", "", "password") + var configPathArg string + flag.StringVar(&configPathArg, "config", "config.yaml", "Path to configuration file") flag.Parse() - fmt.Printf("PASS len %d\n", len(*pass)) - config := irc.ClientConfig{ - Nick: "watt", - Pass: *pass, - User: "wat", - Name: "wat", + log.Println("Starting with configuration:", configPathArg) + + config, err := readConfig(configPathArg) + if err != nil { + log.Fatalln(err) + os.Exit(1) + } + + ircConfig := irc.ClientConfig{ + Nick: config.Nick, + Pass: config.Pass, + User: config.User, + Name: config.Name, } watConfig := wat.WatConfig{ - PermittedChannels: []string{ - "#lucy", - "#sweden", - }, - IgnoredHosts: []string{ - "tripsit/user/creatonez", - }, + PermittedChannels: config.Channels.Permitted, + IgnoredHosts: config.Ignores.Hosts, + AdminHosts: config.Admins.Hosts, } tcpConf := &tls.Config{ - InsecureSkipVerify: true, + InsecureSkipVerify: !config.Server.TlsVerify, } - conn, err := tls.Dial("tcp", "127.0.0.1:6697", tcpConf) + conn, err := tls.Dial("tcp", fmt.Sprintf("%s:%d", config.Server.Host, config.Server.Port), tcpConf) if err != nil { fmt.Println("err " + err.Error()) return } - wwat := wat.NewWatBot(&config, &watConfig, conn) + wwat := wat.NewWatBot(&ircConfig, &watConfig, conn) wwat.Run() } -- cgit v1.2.3