package mux // General configuration utilities for Glenda import ( "encoding/json" "os" "fmt" "strings" "github.com/SlyMarbo/rss" "github.com/bwmarrin/discordgo" "container/list" ) // Global variables are bad var Config Configuration var Feeds Feeder var Rems *list.List var Session *discordgo.Session // Stores subscription information for channels related to RSS feeds type Subscription struct { ChanID string SubID int } // Stores a Feed and a list of the last n commits; n=3 type Feed struct { Feed rss.Feed Recent []string } type Feeder struct { Feeds []Feed Subs []Subscription } // Stores config for current state type Configuration struct { } // Initializes current config (called once at start) ­ just .Read()? func (c *Configuration) Init(s *discordgo.Session) { c.Read() Session = s for id, _ := range Feeds.Feeds { // maybe only do at init step? str := Feeds.Feeds[id].Feed.UpdateURL feed, _ := rss.Fetch(str) if feed != nil { Feeds.Feeds[id].Feed = *feed } else { fmt.Println("Failed to fetch feed: ", id) } } if Rems == nil { Rems = list.New() } go Listener() } // Writes current config func (c *Configuration) Write() (rerr error) { WRT: rerr = nil f, err := os.OpenFile("./cfg/glenda.cfg", os.O_RDWR, 0666) defer f.Close() if err != nil { if strings.Contains(err.Error(), "no such file or directory") { // danger: this can go infinite Config.Setup() goto WRT } else { fmt.Println("Error opening config (w), see: config.go") fmt.Printf("%s\n", err) rerr = err } } else { e := json.NewEncoder(f) err = e.Encode(Config) if err != nil { fmt.Println("Error writing config, see: config.go") fmt.Printf("%s\n", err) rerr = err } } return } // Writes the Feed config file func (c *Feeder) Write() (rerr error) { FWRT: rerr = nil f, err := os.OpenFile("./cfg/feeds.cfg", os.O_RDWR, 0666) defer f.Close() if err != nil { if strings.Contains(err.Error(), "no such file or directory") { // danger: this can go infinite Config.Setup() goto FWRT } else { fmt.Println("Error opening feeds config (w), see: config.go") fmt.Printf("%s\n", err) rerr = err } } else { e := json.NewEncoder(f) err = e.Encode(Feeds) if err != nil { fmt.Println("Error writing feeds config, see: config.go") fmt.Printf("%s\n", err) rerr = err } } return } // Writes the Reminders config file func RemindersWrite() (rerr error) { RWRT: rerr = nil f, err := os.OpenFile("./cfg/reminders.cfg", os.O_RDWR, 0666) defer f.Close() if err != nil { if strings.Contains(err.Error(), "no such file or directory") { // danger: this can go infinite Config.Setup() goto RWRT } else { fmt.Println("Error opening reminders config (w), see: config.go") fmt.Printf("%s\n", err) rerr = err } } else { e := json.NewEncoder(f) err = e.Encode(*Rems) if err != nil { fmt.Println("Error writing reminders config, see: config.go") fmt.Printf("%s\n", err) rerr = err } } return } // Reads current config into memory func (c *Configuration) Read() (rerr error) { RD: f, err := os.Open("./cfg/glenda.cfg") defer f.Close() if err != nil { if strings.Contains(err.Error(), "no such file or directory") { // danger: this can go infinite Config.Setup() goto RD } else { fmt.Println("Error opening config (r), see: config.go") fmt.Printf("%s\n", err) rerr = err } } else { d := json.NewDecoder(f) err = d.Decode(&Config) if err != nil { fmt.Println("Error reading config, see: config.go") fmt.Printf("%s\n", err) rerr = err Config.Write() } } f.Close() // Feeds f, err = os.Open("./cfg/feeds.cfg") if err != nil { if strings.Contains(err.Error(), "no such file or directory") { // danger: this can go infinite Config.Setup() goto RD } else { fmt.Println("Error opening feeds config (r), see: config.go") fmt.Printf("%s\n", err) rerr = err } } else { d := json.NewDecoder(f) err = d.Decode(&Feeds) if err != nil { fmt.Println("Error reading feeds config, see: config.go") fmt.Printf("%s\n", err) rerr = err Feeds.Write() } } f.Close() // Reminders f, err = os.Open("./cfg/reminders.cfg") if err != nil { if strings.Contains(err.Error(), "no such file or directory") { // danger: this can go infinite Config.Setup() goto RD } else { fmt.Println("Error opening reminders config (r), see: config.go") fmt.Printf("%s\n", err) rerr = err } } else { d := json.NewDecoder(f) err = d.Decode(Rems) if err != nil { fmt.Println("Error reading reminders config, see: config.go") fmt.Printf("%s\n", err) rerr = err Rems = list.New() RemindersWrite() } } f.Close() return } // Set up config for the first time (if one doesn't exist) func (c *Configuration) Setup() { err := os.Mkdir("./cfg", 0774) if err != nil { fmt.Println("Error in making cfg dir, see: config.go") fmt.Println(err) } _, err = os.Create("cfg/glenda.cfg") if err != nil { fmt.Println("Error in making cfg file, see: config.go") fmt.Println(err) } // Feeds _, err = os.Create("cfg/feeds.cfg") if err != nil { fmt.Println("Error in making feed cfg file, see: config.go") fmt.Println(err) } // Reminders _, err = os.Create("cfg/reminders.cfg") if err != nil { fmt.Println("Error in making reminders cfg file, see: config.go") fmt.Println(err) } }