Compare commits

..

6 Commits

Author SHA1 Message Date
Bel LaPointe
cf9f50f583 only enough 2025-10-03 13:47:33 -06:00
Bel LaPointe
d17993453e alert at event START 2025-06-23 14:23:18 -06:00
Bel LaPointe
572f129ddb less 2025-06-23 12:26:10 -06:00
Bel LaPointe
d05789b36b better 2025-05-14 09:19:45 -04:00
Bel LaPointe
5f38a36027 exit with err if cancelled and newline 2025-05-14 09:15:37 -04:00
Bel LaPointe
d7d888453b shhh 2025-05-14 09:13:16 -04:00
2 changed files with 56 additions and 17 deletions

17
gcal.go
View File

@@ -71,11 +71,18 @@ func (gcal *GCal) EventsToday(ctx context.Context) ([]Event, error) {
d = t2.Sub(t) d = t2.Sub(t)
} }
result = append(result, Event{ result = append(result,
Name: events.Items[i].Summary, Event{
Time: t, Name: "Soon: " + events.Items[i].Summary,
Duration: d, Time: t.Add(-2 * time.Minute),
}) Duration: 0,
},
Event{
Name: "Now: " + events.Items[i].Summary,
Time: t,
Duration: d,
},
)
} }
return result, nil return result, nil
} }

56
main.go
View File

@@ -34,9 +34,19 @@ func main() {
} }
for alert := range alerts { for alert := range alerts {
if err := alertAt(ctx, *ntfy, time.Now(), alert, time.Now().Format("15:04")); err != nil { if ctx.Err() != nil {
break
}
if err := alertAt(ctx, *ntfy, time.Now(), alert, time.Now().Format("15:04")); err != nil && ctx.Err() == nil {
panic(err) panic(err)
} }
if ctx.Err() != nil {
break
}
}
if err := ctx.Err(); err != nil {
os.Exit(1)
} }
} }
@@ -48,18 +58,38 @@ func alerts(ctx context.Context, gcal bool, args []string) (chan string, error)
if err != nil { if err != nil {
return nil, err return nil, err
} }
return alertsAfter(ctx, duration) msg := "alerting after " + duration.String()
if len(args) > 1 {
msg = fmt.Sprintf("%s (%s)", args[1], duration.String())
}
return alertsAfter(ctx, duration, msg)
} }
func alertsAfter(ctx context.Context, dur time.Duration) (chan string, error) { func alertsAfter(ctx context.Context, dur time.Duration, msg string) (chan string, error) {
ch := make(chan string) ch := make(chan string)
deadline := time.Now().Add(dur)
go func() { go func() {
defer close(ch) defer close(ch)
select { var prev string
case <-ctx.Done(): for ctx.Err() == nil && time.Now().Before(deadline) {
case <-time.After(dur): seconds := int(time.Until(deadline).Seconds())
cur := fmt.Sprintf("%v", time.Duration(seconds)*time.Second)
if prev != "" {
fmt.Printf("\r%s\r", strings.Repeat(" ", len(prev)))
}
fmt.Printf("%s", cur)
prev = cur
select {
case <-ctx.Done():
case <-time.After(time.Second):
}
} }
ch <- "alerting after " + dur.String() if ctx.Err() == nil {
fmt.Println(msg)
}
ch <- msg
}() }()
return ch, nil return ch, nil
} }
@@ -100,16 +130,18 @@ func alertsGCal(ctx context.Context) (chan string, error) {
if err := refresh(); err != nil { if err := refresh(); err != nil {
panic(err) panic(err)
} }
case <-time.After(time.Until(events[0].Time.Add(-2 * time.Minute))): case <-time.After(time.Until(events[0].Time)):
select { select {
case <-ctx.Done(): case <-ctx.Done():
case ch <- events[0].Name: case ch <- events[0].Name:
select { if events[0].Duration > 0 {
case <-ctx.Done():
case <-time.After(events[0].Duration):
select { select {
case <-ctx.Done(): case <-ctx.Done():
case ch <- "/" + events[0].Name: case <-time.After(events[0].Duration):
select {
case <-ctx.Done():
case ch <- "/" + events[0].Name:
}
} }
} }
} }