/* This file is part of »munin«. Copyright 2025 'Fenris Wolf' »munin« is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. »munin« is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with »munin«. If not, see . */ namespace _munin.sources.ical_feed { /** */ export type type_parameters = { url : string; filtration : { category_whitelist : (null | Array); category_blacklist : (null | Array); title_whitelist : (null | Array); title_blacklist : (null | Array); }; }; /** */ async function fetch( parameters : type_parameters ) : Promise> { const url : lib_plankton.url.type_url = lib_plankton.url.decode(parameters.url); const http_request : lib_plankton.http.type_request = { "scheme": (url.scheme as ("http" | "https")), "host": url.host, "path": url.path, "version": "HTTP/2", "method": lib_plankton.http.enum_method.get, "query": ("?" + url.query), "headers": {}, "body": null, }; const http_response : lib_plankton.http.type_response = await lib_plankton.http.call(http_request); const ics : string = http_response.body.toString(); const vcalendar : lib_plankton.ical.type_vcalendar = lib_plankton.ical.ics_decode(ics); const events : Array<_munin.type_event> = ( vcalendar.vevents .filter( vevent => ( // category whitelist ( (parameters.filtration.category_whitelist === null) || vevent.categories.some( category => ( parameters.filtration.category_whitelist .map(category_ => category_.toLowerCase()) .includes(category.toLowerCase()) ) ) ) && // category blacklist ( (parameters.filtration.category_blacklist === null) || vevent.categories.every ( category => ! ( parameters.filtration.category_blacklist .map(category_ => category_.toLowerCase()) .includes(category.toLowerCase()) ) ) ) && // title whitelist ( (parameters.filtration.title_whitelist === null) || parameters.filtration.title_whitelist.some( title => ( vevent.summary.toLowerCase() .includes(title.toLowerCase()) ) ) ) && // title blacklist ( (parameters.filtration.title_blacklist === null) || parameters.filtration.title_blacklist.every( title => ! ( vevent.summary.toLowerCase() .includes(title.toLowerCase()) ) ) ) ) ) .map( vevent => { const begin : lib_plankton.pit.type_datetime = { "timezone_shift": 0, "date": vevent.dtstart.value.date, "time": vevent.dtstart.value.time, }; const end : lib_plankton.pit.type_datetime = { "timezone_shift": 0, "date": vevent.dtend.value.date, "time": vevent.dtend.value.time, }; const event : _munin.type_event = { "title": vevent.summary, "begin": begin, "end": end, "description": (vevent.description ?? null), "location": (vevent.location ?? null), "tags": vevent.categories, }; return event; } ) ); return events; } /** */ export function implementation_source( parameters : type_parameters ) : _munin.type_source { return { "fetch": () => fetch(parameters), }; } }