~kris/9p

glenda

699e5f0a309941f571df571e0316dad1440a7594 — Sean Hinchee 8 years ago ebcc0a2
fixed a bug which didnt check for errors, causing rare crashes over time
3 files changed, 71 insertions(+), 2 deletions(-)

M TODO
M x/mux/commits.go
M x/mux/remind.go
M TODO => TODO +1 -0
@@ 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)

M x/mux/commits.go => x/mux/commits.go +5 -1
@@ 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 {

M x/mux/remind.go => x/mux/remind.go +65 -1
@@ 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)."
	}