package mux import ( "github.com/bwmarrin/discordgo" "time" sc "strconv" ) // Channel for posting reminders -- inits in main var RemChan chan Reminder // Stores a reminder to be posted to a given user type Reminder struct { NotifyAfter time.Time Reason string User discordgo.User ChannelID string } // Reminder daemon process that gets started in main and listens on RemChan func Reminders() { // TODO -- Should be a heap and more robust (fix config first) // Handle reminders for { select { case r := <- RemChan: // Handle new reminder Config.Reminders = append(Config.Reminders, r) //write() default: // Check for any due reminders for i, r := range Config.Reminders { if time.Now().After(r.NotifyAfter) { // If we have passed the time of desired notification Session.ChannelMessageSend(r.ChannelID, r.User.Mention() + " -- " + r.Reason) // Delete the reminder // God this is ugly switch len(Config.Reminders) { case 1: // Make empty safely Config.Reminders = []Reminder{} case 2: // Binary switch switch i { case 0: Config.Reminders = []Reminder{Config.Reminders[1]} case 1: Config.Reminders = []Reminder{Config.Reminders[0]} } default: i = min(i, len(Config.Reminders) - 1) switch i { case len(Config.Reminders) - 1: // Last Config.Reminders = Config.Reminders[:i] case 0: // First Config.Reminders = Config.Reminders[i+1:] default: // Not first nor last Config.Reminders = append(Config.Reminders[:i], Config.Reminders[i+1:]...) } } //write() } } time.Sleep(50 * time.Millisecond) } } } // Reminds a user about a given reason after a specified time interval has passed func (m *Mux) RemindMe(ds *discordgo.Session, dm *discordgo.Message, ctx *Context) { resp := "" // remindme 20m dothing if len(ctx.Fields) >= 3 { var rem Reminder periodLong := ctx.Fields[1] reasonLong := ctx.Fields[2 : len(ctx.Fields)] rem.User = *dm.Author rem.ChannelID = dm.ChannelID //rem.Session = *ds reason := "" for _, v := range reasonLong { reason += v reason += " " } rem.Reason = reason interval := periodLong[len(periodLong)-1] period, err := sc.Atoi(periodLong[:len(periodLong)-1]) if err != nil { resp += "Invalid period value." goto SEND } var dur time.Duration switch interval { case 's': dur = time.Second case 'm': dur = time.Minute case 'h': dur = time.Hour case 'd': dur = time.Hour * time.Duration(24) default: resp += "Invalid interval specifier." goto SEND } rem.NotifyAfter = time.Now().Add(time.Duration(period) * dur) RemChan <- rem resp += "Ok." } else { resp += "Please specify a time operator in the form [int][type] and a description (20h do thing)." } SEND: resp += "\n" ds.ChannelMessageSend(dm.ChannelID, resp) return }