Add initial simple approach to time loop
This commit is contained in:
parent
6c14403ff4
commit
3b09a7da10
1 changed files with 35 additions and 4 deletions
|
@ -3,6 +3,7 @@ package server
|
||||||
import (
|
import (
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"git.ctrlz.es/mgdelacroix/birthdaybot/model"
|
||||||
"github.com/charmbracelet/log"
|
"github.com/charmbracelet/log"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -35,15 +36,45 @@ func (w *Worker) Stop() {
|
||||||
w.logger.Info("worker stopped")
|
w.logger.Info("worker stopped")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (w *Worker) notifyDay(year, month, day int) {
|
||||||
|
birthdays := model.FilterByDate(w.server.Birthdays(), year, month, day)
|
||||||
|
w.logger.Info("notifying for date", "birthdays", len(birthdays), "year", year, "month", month, "day", day)
|
||||||
|
|
||||||
|
for _, b := range birthdays {
|
||||||
|
w.logger.Info("notifying for birthday", "name", b.Name)
|
||||||
|
w.server.Notify(b)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func (w *Worker) run() {
|
func (w *Worker) run() {
|
||||||
ticker := time.NewTicker(1 * time.Second)
|
// first we calculate the delta with 23:00
|
||||||
|
now := time.Now()
|
||||||
|
eleven := time.Date(now.Year(), now.Month(), now.Day(), 23, 0, 0, 0, now.Location())
|
||||||
|
|
||||||
|
if eleven.Before(now) {
|
||||||
|
// tomorrow at 23:00
|
||||||
|
eleven = time.Date(now.Year(), now.Month(), now.Day()+1, 23, 0, 0, 0, now.Location())
|
||||||
|
}
|
||||||
|
|
||||||
|
firstTick := eleven.Sub(now)
|
||||||
|
|
||||||
|
var ticker *time.Ticker
|
||||||
|
w.logger.Info("first timer tick set", "tick", firstTick)
|
||||||
|
select {
|
||||||
|
case <-time.After(firstTick):
|
||||||
|
ticker = time.NewTicker(24 * time.Hour)
|
||||||
|
w.notifyDay(eleven.Year(), int(eleven.Month()), eleven.Day())
|
||||||
|
case <-w.stop:
|
||||||
|
w.logger.Info("received stop signal")
|
||||||
|
w.stopped <- true
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
for {
|
for {
|
||||||
select {
|
select {
|
||||||
case t := <-ticker.C:
|
case t := <-ticker.C:
|
||||||
w.logger.Info("ticker ticked for worker", "tick", t)
|
w.logger.Info("ticker ticked for worker", "tick", t)
|
||||||
// ToDo: improve logic here
|
w.notifyDay(t.Year(), int(t.Month()), t.Day())
|
||||||
b := w.server.Birthdays()[0]
|
|
||||||
w.server.Notify(b)
|
|
||||||
case <-w.stop:
|
case <-w.stop:
|
||||||
w.logger.Info("received stop signal")
|
w.logger.Info("received stop signal")
|
||||||
w.stopped <- true
|
w.stopped <- true
|
||||||
|
|
Loading…
Reference in a new issue