Commit Graph

5 Commits

Author SHA1 Message Date
kami 3af290152c Render maven's own reminders to a calendar she owns (#127)
Radicale becomes a write-only render target, not a store. sqlite stays
canonical: every poll mavcaldav reads the pending reminders out of core and
publishes each one as a single-event iCal resource, withdrawing the ones that
have fired or been cancelled. Losing the collection costs nothing — the next
tick rebuilds it, and nothing is ever read back from it.

It structurally cannot write to a calendar maven only reads. The render URL and
credential are their own flags, and -render-url is refused at startup when it
names the collection -url reads; the only paths it addresses carry the
maven-reminder- prefix, so even aimed at the wrong collection it can only touch
resources it created. Rendering is off unless -render-url is given.

The calendar data model now lives in one place, internal/calendar: the Event,
the iCal parse it comes from and the render it goes to, the fact key/value
encoding, and the source constants that say which calendars may be written to.
It was a parse inlined in cmd/mavcaldav and a Sprintf in two files; #126 and
#128 both need to agree with it.

Fixes a latent day-boundary bug moved out of that inline parse: it took the day
number off a local clock reading but built the window boundaries in UTC, so on
a box east of Greenwich part of the evening fell outside "today" and the poller
saw an empty calendar after 20:00 UTC. Today is now the owner's day in the
owner's location, which is what the busy gate and the day plan mean.
2026-08-01 01:55:51 +04:00
kami db17cfcc65 Delete the dead lockedAPI, add UnimplementedCoreAPI for the doubles 2026-07-31 23:31:24 +04:00
kami 6daa96b66e mavcaldav: add comprehensive test suite (14 cases)
Covers:
- iCal parsing: filters today's events, excludes past/future/all-day
- VEVENT parsing: TZID, UTC, and all-day (nil) events
- DTSTART/DTEND parsing: UTC, local (treated as UTC), all-day, invalid
- safeKey sanitization: spaces→dashes, strip special chars
- writeIfChanged: no-prev writes, same-value skips, diff-value writes,
  read-error and write-error propagation
- pollOnce end-to-end: httptest.Server + fakeCore verifies calendar_busy
  + calendar_event facts written with correct keys/values
2026-07-05 02:24:28 +04:00
kami 7683a9b32c ipc: promote startup socket-wait to a shared DialWait; use in all modules
The cold-start crash-loop wasn't mavweb-specific — mavpoll and mavcaldav also
ipc.Dial + exit on failure, so they crash-looped until core booted too. Moved
the retry into ipc.DialWait (capped backoff, bounded) and switched mavweb,
mavpoll, mavcaldav to it. mavweb's local dialCoreWithRetry is gone.

Test: server appears after DialWait starts → it waits and connects.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-04 00:17:10 +04:00
kami f94758966f cmd/mavcaldav: new CalDAV poller module
Polls Radicale for today's events, writes calendar_busy and calendar_event
facts through CoreAPI. Only writes on value change (same append-only
discipline as mavpoll).

Usage: mavcaldav -socket <core> -url <radicale> -user <u> -pass <p>

Flags: -interval (default 5m), -timeout (default 10s).
Fires immediately on start, then on interval.

iCal parser supports UTC and local DTSTART/DTEND, skips all-day events.
2026-07-03 13:19:47 +02:00