package main import ( "fmt" "regexp" "strings" "github.com/BurntSushi/toml" "go.jolheiser.com/beaver" ) type Config struct { SubReddits []*SubReddit `toml:"subreddit"` Map map[string]*SubReddit `toml:"-"` // Agent file AppName string `toml:"app_name"` Version string `toml:"version"` ClientID string `toml:"client_id"` ClientSecret string `toml:"client_secret"` Username string `toml:"username"` Password string `toml:"password"` } type SubReddit struct { Name string `toml:"name"` IconURL string `toml:"icon_url"` FlairWhitelist []string `toml:"flair_whitelist"` FlairWhitelistRe []*regexp.Regexp `toml:"-"` FlairBlacklist []string `toml:"flair_blacklist"` FlairBlacklistRe []*regexp.Regexp `toml:"-"` TitleWhitelist []string `toml:"title_whitelist"` TitleWhitelistRe []*regexp.Regexp `toml:"-"` TitleBlacklist []string `toml:"title_blacklist"` TitleBlacklistRe []*regexp.Regexp `toml:"-"` TitleLimit int `toml:"title_limit"` BodyWhitelist []string `toml:"body_whitelist"` BodyWhitelistRe []*regexp.Regexp `toml:"-"` BodyBlacklist []string `toml:"body_blacklist"` BodyBlacklistRe []*regexp.Regexp `toml:"-"` BodyLimit int `toml:"body_limit"` Webhook string `toml:"webhook"` } func (c *Config) UserAgent() string { return fmt.Sprintf("%s/%s by /u/%s", c.AppName, c.Version, c.Username) } func (c *Config) SubRedditNames() []string { names := make([]string, len(c.SubReddits)) for idx, sub := range c.SubReddits { names[idx] = sub.Name } return names } func (c *Config) load() { for _, sub := range c.SubReddits { c.Map[strings.ToLower(sub.Name)] = sub if sub.TitleLimit == 0 || sub.TitleLimit > 253 { sub.TitleLimit = 253 } if sub.BodyLimit == 0 || sub.BodyLimit > 2045 { sub.BodyLimit = 2045 } sub.FlairWhitelistRe = make([]*regexp.Regexp, len(sub.FlairWhitelist)) for idx, f := range sub.FlairWhitelist { sub.FlairWhitelistRe[idx] = regexp.MustCompile(f) } sub.FlairBlacklistRe = make([]*regexp.Regexp, len(sub.FlairBlacklist)) for idx, f := range sub.FlairBlacklist { sub.FlairBlacklistRe[idx] = regexp.MustCompile(f) } sub.TitleWhitelistRe = make([]*regexp.Regexp, len(sub.TitleWhitelist)) for idx, t := range sub.TitleWhitelist { sub.TitleWhitelistRe[idx] = regexp.MustCompile(t) } sub.TitleBlacklistRe = make([]*regexp.Regexp, len(sub.TitleBlacklist)) for idx, t := range sub.TitleBlacklist { sub.TitleBlacklistRe[idx] = regexp.MustCompile(t) } sub.BodyWhitelistRe = make([]*regexp.Regexp, len(sub.BodyWhitelist)) for idx, b := range sub.BodyWhitelist { sub.BodyWhitelistRe[idx] = regexp.MustCompile(b) } sub.BodyBlacklistRe = make([]*regexp.Regexp, len(sub.BodyBlacklist)) for idx, b := range sub.BodyBlacklist { sub.BodyBlacklistRe[idx] = regexp.MustCompile(b) } } } func LoadConfig() (*Config, error) { cfg := &Config{ Map: make(map[string]*SubReddit), } if _, err := toml.DecodeFile(configPath, &cfg); err != nil { return nil, err } cfg.load() beaver.Debug(cfg) return cfg, nil }