diff options
Diffstat (limited to 'jobs.go')
-rw-r--r-- | jobs.go | 63 |
1 files changed, 58 insertions, 5 deletions
@@ -12,13 +12,15 @@ type jobIdentifier int const ( JobIdCloseDecisions jobIdentifier = iota + JobIdRemindVotersJob ) var rescheduleChannel = make(chan jobIdentifier, 1) func JobScheduler(quitChannel chan int) { var jobs = map[jobIdentifier]Job{ - JobIdCloseDecisions: NewCloseDecisionsJob(), + JobIdCloseDecisions: NewCloseDecisionsJob(), + JobIdRemindVotersJob: NewRemindVotersJob(), } logger.Println("INFO started job scheduler") @@ -60,11 +62,10 @@ func (j *CloseDecisionsJob) Schedule() { return } if nextDue == nil { - if j.timer != nil { - j.timer.Stop() - j.timer = nil - } + logger.Println("INFO no next planned execution of CloseDecisionsJob") + j.Stop() } else { + nextDue := nextDue.Add(time.Minute) logger.Println("INFO scheduling CloseDecisionsJob for", nextDue) when := nextDue.Sub(time.Now()) if j.timer != nil { @@ -78,6 +79,7 @@ func (j *CloseDecisionsJob) Schedule() { func (j *CloseDecisionsJob) Stop() { if j.timer != nil { j.timer.Stop() + j.timer = nil } } @@ -93,3 +95,54 @@ func (j *CloseDecisionsJob) Run() { func (j *CloseDecisionsJob) String() string { return "CloseDecisionsJob" } + +type RemindVotersJob struct { + timer *time.Timer +} + +func NewRemindVotersJob() *RemindVotersJob { + job := &RemindVotersJob{} + job.Schedule() + return job +} + +func (j *RemindVotersJob) Schedule() { + year, month, day := time.Now().UTC().Date() + nextExecution := time.Date(year, month, day, 0, 0, 0, 0, time.UTC).AddDate(0, 0, 3) + logger.Println("INFO scheduling RemindVotersJob for", nextExecution) + when := nextExecution.Sub(time.Now()) + if j.timer != nil { + j.timer.Reset(when) + } else { + j.timer = time.AfterFunc(when, j.Run) + } +} + +func (j *RemindVotersJob) Stop() { + if j.timer != nil { + j.timer.Stop() + j.timer = nil + } +} + +func (j *RemindVotersJob) Run() { + logger.Println("INFO running RemindVotersJob") + defer func() { rescheduleChannel <- JobIdRemindVotersJob }() + + voters, err := GetReminderVoters() + if err != nil { + logger.Println("ERROR problem getting voters", err) + return + } + + for _, voter := range *voters { + decisions, err := FindUnvotedDecisionsForVoter(&voter) + if err != nil { + logger.Println("ERROR problem getting unvoted decisions") + return + } + if len(*decisions) > 0 { + voterMail <- &RemindVoterNotification{voter: voter, decisions: *decisions} + } + } +} |