@@ -22,11 +22,11 @@ import (
2222)
2323
2424const (
25- timeForExpire = 10 * time .Minute
26- sleepTimeForDaemon = 30 * time .Second
27- breakTimeForDaemon = 80 * time .Minute
28- repeatTimeForDaemon = 10 * time .Minute
29- defaultTpl = "{{if .Active}}☭{{else}}☯{{end}} {{.FormatLabel}}"
25+ intervalToExpire = 10 * time .Minute
26+ defaultIntervalToUpdateDb = 30 * time .Second
27+ defaultIntervalToShowBreakReminder = 80 * time .Minute
28+ defaultIntervalToRepeatBreakReminder = 10 * time .Minute
29+ defaultTpl = "{{if .Active}}☭{{else}}☯{{end}} {{.FormatLabel}}"
3030)
3131
3232var dbFile string
@@ -172,34 +172,34 @@ func newCmd(db *sqlx.DB) *cobra.Command {
172172
173173 var daemonCmd = & cobra.Command {
174174 Use : "daemon" ,
175- Short : "Update the duration for current activity in a loop " ,
175+ Short : "Update the duration for current activity and run hook if specified " ,
176176 RunE : func (cmd * cobra.Command , args []string ) error {
177- sleepTime , err := cmd .Flags ().GetDuration ("sleep-time " )
177+ intervalToUpdateDb , err := cmd .Flags ().GetDuration ("update-interval " )
178178 if err != nil {
179179 return err
180180 }
181- breakTime , err := cmd .Flags ().GetDuration ("break-time " )
181+ intervalToShowBreakReminder , err := cmd .Flags ().GetDuration ("break-interval " )
182182 if err != nil {
183183 return err
184184 }
185- repeatTime , err := cmd .Flags ().GetDuration ("repeat-time " )
185+ intervalToRepeatBreakReminder , err := cmd .Flags ().GetDuration ("repeat-interval " )
186186 if err != nil {
187187 return err
188188 }
189189 hook , err := cmd .Flags ().GetString ("hook" )
190190 if err != nil {
191191 return err
192192 }
193- err = Daemon (db , sleepTime , breakTime , repeatTime , hook )
193+ err = Daemon (db , intervalToUpdateDb , intervalToShowBreakReminder , intervalToRepeatBreakReminder , hook )
194194 if err != nil {
195195 return err
196196 }
197197 return nil
198198 },
199199 }
200- daemonCmd .Flags ().Duration ("sleep-time " , sleepTimeForDaemon , "sleep time in the loop " )
201- daemonCmd .Flags ().Duration ("break-time " , breakTimeForDaemon , "time for a break reminder" )
202- daemonCmd .Flags ().Duration ("repeat-time " , repeatTimeForDaemon , "time to repeat a break reminder" )
200+ daemonCmd .Flags ().Duration ("update-interval " , defaultIntervalToUpdateDb , "interval to update activity time in db " )
201+ daemonCmd .Flags ().Duration ("break-interval " , defaultIntervalToShowBreakReminder , "interval to show a break reminder" )
202+ daemonCmd .Flags ().Duration ("repeat-interval " , defaultIntervalToRepeatBreakReminder , "interval to repeat a break reminder" )
203203 daemonCmd .Flags ().StringP ("hook" , "" , "" , "a hook command template" )
204204
205205 var dbCmd = & cobra.Command {
@@ -434,40 +434,15 @@ func Show(db *sqlx.DB, tpl string) error {
434434 return nil
435435}
436436
437- // Daemon updates the duration of current activity then sleeps for a while
437+ // Daemon updates the duration of current activity and runs the hook if specified
438438func Daemon (db * sqlx.DB , sleepTime time.Duration , breakTime time.Duration , repeatTime time.Duration , hook string ) error {
439439 var notified time.Time
440440 var lastHook string
441441 for {
442- _ , err := UpdateIfExists (db , "" , false )
443- if err != nil {
444- return err
445- }
446442 activity , err := Latest (db )
447443 if err != nil {
448444 return err
449445 }
450- duration , err := activeDuration (db )
451- if err != nil {
452- return err
453- }
454- if activity .Active () && duration > breakTime && time .Since (notified ) > repeatTime {
455- args := []string {
456- "Take a break!" ,
457- fmt .Sprintf ("Active for %v already" , formatDuration (duration )),
458- }
459- if duration .Seconds () > breakTime .Seconds ()* 1.2 {
460- args = append (args , "-u" , "critical" )
461- } else {
462- // default timeout is too quick, so set it to 5s
463- args = append (args , "-t" , "5000" )
464- }
465- err := exec .Command ("notify-send" , args ... ).Run ()
466- if err != nil {
467- fmt .Printf ("cannot send notification: %v" , err )
468- }
469- notified = time .Now ()
470- }
471446 if hook != "" {
472447 cmd , err := activity .Format (hook )
473448 if err != nil {
@@ -482,7 +457,35 @@ func Daemon(db *sqlx.DB, sleepTime time.Duration, breakTime time.Duration, repea
482457 }
483458 }
484459 }
485- time .Sleep (sleepTime )
460+ if activity .Active () && time .Since (activity .Updated ()) > sleepTime {
461+ fmt .Printf ("updating time for %s\n " , activity .Name )
462+ _ , err := UpdateIfExists (db , "" , false )
463+ if err != nil {
464+ return err
465+ }
466+ duration , err := activeDuration (db )
467+ if err != nil {
468+ return err
469+ }
470+ if activity .Active () && duration > breakTime && time .Since (notified ) > repeatTime {
471+ args := []string {
472+ "Take a break!" ,
473+ fmt .Sprintf ("Active for %v already" , formatDuration (duration )),
474+ }
475+ if duration .Seconds () > breakTime .Seconds ()* 1.2 {
476+ args = append (args , "-u" , "critical" )
477+ } else {
478+ // default timeout is too quick, so set it to 5s
479+ args = append (args , "-t" , "5000" )
480+ }
481+ err := exec .Command ("notify-send" , args ... ).Run ()
482+ if err != nil {
483+ fmt .Printf ("cannot send notification: %v" , err )
484+ }
485+ notified = time .Now ()
486+ }
487+ }
488+ time .Sleep (1 )
486489 }
487490}
488491
@@ -503,7 +506,7 @@ func activeDuration(db *sqlx.DB) (time.Duration, error) {
503506 }
504507 if prev .ID == 0 && cur .Expired () {
505508 break
506- } else if prev .Started ().Sub (cur .Updated ()) > timeForExpire {
509+ } else if prev .Started ().Sub (cur .Updated ()) > intervalToExpire {
507510 break
508511 }
509512 duration += cur .Duration ()
@@ -690,7 +693,7 @@ func (a Activity) Updated() time.Time {
690693}
691694
692695func (a Activity ) Expired () bool {
693- return time .Since (a .Updated ()) > timeForExpire
696+ return time .Since (a .Updated ()) > intervalToExpire
694697}
695698
696699func (a Activity ) Active () bool {
0 commit comments