Basic examples for CalDAV and .ics URL

This commit is contained in:
Marek S. Lukasiewicz
2025-01-03 22:45:14 +01:00
parent d796b8ac62
commit 23f9208e9c
4 changed files with 54 additions and 7 deletions

View File

@@ -1,6 +1,8 @@
name: caldav
requiredPermissions:
- fetch
functions:
helloWorld:
path: caldav.ts:helloWorld
command:
name: "Say hello"
queryIcs:
path: ./caldav.ts:queryIcs
events:
- query:cal-ics

View File

@@ -1,5 +1,33 @@
import { editor } from "@silverbulletmd/silverbullet/syscalls";
import { QueryProviderEvent } from "@silverbulletmd/silverbullet/types";
import { readYamlPage } from "@silverbulletmd/silverbullet/lib/yaml_page";
import { applyQuery } from "@silverbulletmd/silverbullet/lib/query";
import { parseIcsCalendar, type VCalendar } from "ts-ics";
export async function helloWorld() {
await editor.flashNotification("Hello world!");
interface Event {
summary: string | undefined;
description: string | undefined;
}
export async function queryIcs({ query }: QueryProviderEvent): Promise<any[]> {
const secrets = await readYamlPage("SECRETS");
const icsUrl = secrets.icsUrl;
const result = await fetch(icsUrl);
const icsData = await result.text();
const calendarParsed: VCalendar = parseIcsCalendar(icsData);
// TODO: Loop over multiple .ics URLs and assign calendar name based on X-WR-CALNAME
if (calendarParsed.events === undefined) {
editor.flashNotification("Did not parse events from iCalendar");
return [];
}
const events: Event[] = calendarParsed.events.map((ics) => {
return {
summary: ics.summary,
description: ics.description,
};
});
return applyQuery(query, events);
}

View File

@@ -18,6 +18,8 @@
},
"imports": {
"@silverbulletmd/silverbullet": "jsr:@silverbulletmd/silverbullet@^0.9.0",
"tsdav": "npm:tsdav@2.1.3"
"tsdav": "npm:tsdav@2.1.3",
"ts-ics": "npm:ts-ics@1.6.5",
"@js-temporal/polyfill": "https://esm.sh/@js-temporal/polyfill@0.4.4"
}
}

15
example.ts Normal file
View File

@@ -0,0 +1,15 @@
import { createDAVClient } from "tsdav";
const client = await createDAVClient({
serverUrl:
"https://calendar.google.com/calendar/ical/marqus34%40gmail.com/private-df2ea81c13f2fa2b9d837aef069effe6/basic.ics",
credentials: {
username: "exemplar",
password: Deno.env.get("DAV_PASSWORD"),
},
authMethod: "Basic",
defaultAccountType: "caldav",
});
const calendars = await client.fetchCalendars();
console.log(calendars);