summaryrefslogtreecommitdiff
path: root/jobs.go
diff options
context:
space:
mode:
Diffstat (limited to 'jobs.go')
-rw-r--r--jobs.go63
1 files changed, 58 insertions, 5 deletions
diff --git a/jobs.go b/jobs.go
index 02683c8..3f15e2d 100644
--- a/jobs.go
+++ b/jobs.go
@@ -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}
+ }
+ }
+}