Skip to content

Commit a0ac2cd

Browse files
committed
Update daemon; some cleanup
1 parent 775401a commit a0ac2cd

File tree

4 files changed

+58
-56
lines changed

4 files changed

+58
-56
lines changed

testcmd.yaml

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
99
Available Commands:
1010
completion Generate the autocompletion script for the specified shell
11-
daemon Update the duration for current activity in a loop
11+
daemon Update the duration for current activity and run hook if specified
1212
db Execute sqlite3 with db file
1313
finish Finish current activity
1414
help Help about any command
@@ -27,26 +27,26 @@
2727
- name: daemon-help
2828
cmd: daemon -h
2929
output: |
30-
Update the duration for current activity in a loop
30+
Update the duration for current activity and run hook if specified
3131
3232
Usage:
3333
timefor daemon [flags]
3434
3535
Flags:
36-
--break-time duration time for a break reminder (default 1h20m0s)
37-
-h, --help help for daemon
38-
--hook string a hook command template
39-
--repeat-time duration time to repeat a break reminder (default 10m0s)
40-
--sleep-time duration sleep time in the loop (default 30s)
36+
--break-interval duration interval to show a break reminder (default 1h20m0s)
37+
-h, --help help for daemon
38+
--hook string a hook command template
39+
--repeat-interval duration interval to repeat a break reminder (default 10m0s)
40+
--update-interval duration interval to update activity time in db (default 30s)
4141
4242
- name: daemon--bad-hook-template
43-
cmd: daemon --sleep-time 1s --hook 'echo "{{if}}"'
43+
cmd: daemon --hook 'echo "{{if}}"'
4444
code: 1
4545
output: |
4646
Error: cannot render hook command: failed to parse template: template: tpl:1: missing value for if
4747
4848
- name: daemon--err-in-hook-cmd
49-
cmd: daemon --sleep-time 1s --hook 'exit 1'
49+
cmd: daemon --hook 'exit 1'
5050
code: 1
5151
output: |
5252
running hook command: exit 1

timefor

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
version https://git-lfs.github.com/spec/v1
2-
oid sha256:346fa2a8671bb134c5215e03b8b539581ae85f6624cb2ae2e95b71d59540ea8a
3-
size 9552712
2+
oid sha256:b99f6a7f9fe9b6a1683f7679d8a010e140fbcb0750bc8c3e50da97300f097dcc
3+
size 9552992

timefor.go

Lines changed: 45 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,11 @@ import (
2222
)
2323

2424
const (
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

3232
var 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
438438
func 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

692695
func (a Activity) Expired() bool {
693-
return time.Since(a.Updated()) > timeForExpire
696+
return time.Since(a.Updated()) > intervalToExpire
694697
}
695698

696699
func (a Activity) Active() bool {

timefor_test.go

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import (
44
"bytes"
55
"errors"
66
"fmt"
7-
"io/ioutil"
87
"os"
98
"os/exec"
109
"strings"
@@ -77,7 +76,7 @@ func TestSchema(t *testing.T) {
7776
}
7877

7978
func TestCmd(t *testing.T) {
80-
file, err := ioutil.TempFile("", "logtest")
79+
file, err := os.CreateTemp("", "logtest")
8180
if err != nil {
8281
t.Fatal(err)
8382
}
@@ -86,7 +85,7 @@ func TestCmd(t *testing.T) {
8685
db = sqlx.MustOpen("sqlite3", file.Name())
8786
defer db.Close()
8887

89-
data, err := ioutil.ReadFile("testcmd.yaml")
88+
data, err := os.ReadFile("testcmd.yaml")
9089
if err != nil {
9190
t.Fatal(err)
9291
}

0 commit comments

Comments
 (0)