package main import ( "context" "log" "github.com/kami/maven/internal/phraser" "github.com/kami/maven/internal/router" ) // actionReminder handles router.IntentReminder: parse the time when stage-0 // skipped the extractor, then create the reminder. func (h *reactiveHandler) actionReminder(ctx context.Context, dec router.Decision) string { if !dec.Slots.HasTime { // Stage-0 (reminder-wakeword grammar) skips the extractor, so the // time wasn't parsed. Run the parser as a fallback. if dec.Stage == 0 && h.timeParser != nil { t, ok, err := h.timeParser.Parse(ctx, dec.Utterance, h.now()) if err == nil && ok { dec.Slots.Time = t dec.Slots.HasTime = true } } if !dec.Slots.HasTime { return phraser.Ack(phraser.FailReminderTime, nil) } } // The body is what she says at the hour, so the marker and the time come // out of it: the fire time is already a column, and "напомни" is an // instruction that has been carried out (Vikunja #469). payload := `{"text":` + jsonString(reminderBody(dec.Utterance, dec.Slots.Text)) + `}` if _, err := h.api.CreateReminder(ctx, dec.Slots.Time, payload, ""); err != nil { log.Printf("voice: create reminder: %v", err) return phraser.Ack(phraser.FailReminder, nil) } return "" }