From 699e5f0a309941f571df571e0316dad1440a7594 Mon Sep 17 00:00:00 2001 From: Sean Hinchee Date: Fri, 8 Jun 2018 18:54:03 +0000 Subject: [PATCH] fixed a bug which didnt check for errors, causing rare crashes over time --- TODO | 1 + x/mux/commits.go | 6 ++++- x/mux/remind.go | 66 +++++++++++++++++++++++++++++++++++++++++++++++- 3 files changed, 71 insertions(+), 2 deletions(-) diff --git a/TODO b/TODO index 2bee68189fb4e7aa15b501a869bd910aa04183ad..5add39e62f32e42aa89d6dae92dd8cf0c0150bcd 100644 --- a/TODO +++ b/TODO @@ -16,3 +16,4 @@ Problems * Reminders don't persist between bot reboots * Reminders should be hashed and deletable/modifiable by the creating user * Reminders should use a min heap +* Config is not modular and should allow config modules to be loaded and have .cfg files associated with them (such as for feeds and reminders) diff --git a/x/mux/commits.go b/x/mux/commits.go index 2d8ab35648750b16e4830e176bf0034adeebf11e..f1d9ca7b1733034bd32e9bee6371930eda31446d 100644 --- a/x/mux/commits.go +++ b/x/mux/commits.go @@ -20,7 +20,11 @@ func Listener() { // maybe only do at init step? str := Config.Feeds[p].Feed.UpdateURL feed, err := rss.Fetch(str) - Config.Feeds[p].Feed = *feed + if err != nil { + Config.Feeds[p].Feed = *feed + } else { + fmt.Println("Got a nil pointer for feed in commits for ", str, " as ", err) + } //err := Config.Feeds[p].Feed.Update() if err != nil { diff --git a/x/mux/remind.go b/x/mux/remind.go index b11884d4e4151e82c6da47e71aedad134140ee16..78e7bac7b51789496427c0be176f6a639ef458a8 100644 --- a/x/mux/remind.go +++ b/x/mux/remind.go @@ -5,6 +5,10 @@ import ( "time" sc "strconv" "container/list" + "fmt" + "os" + "encoding/json" + "strings" ) @@ -22,13 +26,70 @@ type Reminder struct { // Reminder daemon process that gets started in main and listens on RemChan func Reminders() { - // Should be a heap and persist across reboots + // TODO -- Should be a heap and more robus (fix config first) + rems := list.New() + + RD: + f, err := os.Open("./cfg/reminders.cfg") + + write := func() (rerr error) { + e := json.NewEncoder(f) + err = e.Encode(rems) + if err != nil { + fmt.Println("Error writing config, see: remind.go") + fmt.Printf("%s\n", err) + rerr = err + } + return + } + + setup := func() (rerr error) { + + err := os.Mkdir("./cfg", 0774) + if err != nil { + fmt.Println("Error in making cfg dir, see: remind.go") + fmt.Println(err) + } + + _, err = os.Create("cfg/reminders.cfg") + if err != nil { + fmt.Println("Error in making cfg file, see: remind.go") + fmt.Println(err) + } + rerr = err + return + } + + defer f.Close() + if err != nil { + if strings.Contains(err.Error(), "no such file or directory") { + // danger: this can go infinite + setup() + goto RD + } else { + fmt.Println("Error opening config (r), see: remind.go") + fmt.Printf("%s\n", err) + } + } else { + d := json.NewDecoder(f) + err = d.Decode(&rems) + if err != nil { + fmt.Println("Error reading config, see: remind.go") + fmt.Printf("%s\n", err) + + write() + } + } + + + // Handle reminders for { select { case r := <- RemChan: // Handle new reminder rems.PushBack(r) + write() default: // Check for any due reminders @@ -42,6 +103,7 @@ func Reminders() { // If we have passed the time of desired notification r.Session.ChannelMessageSend(r.ChannelID, r.User.Mention() + " -- " + r.Reason) rems.Remove(e) + write() } } @@ -96,6 +158,8 @@ func (m *Mux) RemindMe(ds *discordgo.Session, dm *discordgo.Message, ctx *Contex RemChan <- rem + resp += "Ok." + } else { resp += "Please specify a time operator in the form [int][type] and a description (20h do thing)." }