diff --git a/source/conf.ts b/source/conf.ts index de7c6eb..cd440d7 100644 --- a/source/conf.ts +++ b/source/conf.ts @@ -136,6 +136,7 @@ namespace _munin.conf smtp_port : int; smtp_username : string; smtp_password : string; + sender : string; receivers : Array; /** * in hours @@ -171,7 +172,71 @@ namespace _munin.conf /** */ - export type type_conf = type_conf_v3; + type type_conf_v4 = { + sources : Array< + ( + { + kind : "ical_feed"; + data : { + url : string; + filtration : { + category_whitelist : (null | Array); + category_blacklist : (null | Array); + title_whitelist : (null | Array); + title_blacklist : (null | Array); + } + } + } + ) + >; + targets : Array< + ( + { + kind : "email"; + data : { + smtp_host : string; + smtp_port : int; + smtp_username : string; + smtp_password : string; + sender : string; + receivers : Array; + hide_tags : boolean; + /** + * in hours + */ + reminders : Array; + } + } + | + { + kind : "telegram_bot"; + data : { + bot_token : string; + chat_id : int; + hide_tags : boolean; + /** + * in hours + */ + reminders : Array; + } + } + ) + >; + settings : { + interval : float; + }; + labels : { + head : string; + title : string; + time : string; + location : string; + }; + }; + + + /** + */ + export type type_conf = type_conf_v4; /** @@ -253,6 +318,84 @@ namespace _munin.conf } + /** + */ + function convert_from_v3( + conf_v3 : type_conf_v3 + ) : type_conf_v4 + { + return { + "sources": conf_v3.sources.map( + source => { + switch (source.kind) { + case "ical_feed": { + return { + "kind": "ical_feed", + "data": { + "url": source.data.url, + "filtration": { + "category_whitelist": null, + "category_blacklist": source.data.filtration.category_blacklist, + "title_whitelist": null, + "title_blacklist": source.data.filtration.category_blacklist, + }, + } + }; + break; + } + default: { + // return source; + throw (new Error("unhandled source kind: " + source.kind)); + break; + } + } + } + ), + "targets": conf_v3.targets.map( + target => { + switch (target.kind) { + case "email": { + return { + "kind": "email", + "data": { + "smtp_host": target.data.smtp_host, + "smtp_port": target.data.smtp_port, + "smtp_username": target.data.smtp_username, + "smtp_password": target.data.smtp_password, + "sender": target.data.sender, + "receivers": target.data.receivers, + "hide_tags": false, + "reminders": target.data.reminders, + }, + }; + break; + } + case "telegram_bot": { + return { + "kind": "telegram_bot", + "data": { + "bot_token": target.data.bot_token, + "chat_id": target.data.chat_id, + "hide_tags": false, + "reminders": target.data.reminders, + }, + }; + break; + } + default: { + // return target; + throw (new Error("unhandled target kind: " + String(target))); + break; + } + } + } + ), + "settings": conf_v3.settings, + "labels": conf_v3.labels, + }; + } + + /** */ function schema_source_kalender_digital( @@ -280,7 +423,7 @@ namespace _munin.conf "type": "object", "properties": { "category_blacklist": { - "nullable": false, + "nullable": true, "type": "array", "items": { "nullable": false, @@ -289,7 +432,7 @@ namespace _munin.conf "default": [], }, "title_blacklist": { - "nullable": false, + "nullable": true, "type": "array", "items": { "nullable": false, @@ -345,23 +488,41 @@ namespace _munin.conf "nullable": false, "type": "object", "properties": { - "category_blacklist": { - "nullable": false, + "category_whitelist": { + "nullable": true, "type": "array", "items": { "nullable": false, "type": "string", }, - "default": [], + "default": null, + }, + "category_blacklist": { + "nullable": true, + "type": "array", + "items": { + "nullable": false, + "type": "string", + }, + "default": null, + }, + "title_whitelist": { + "nullable": true, + "type": "array", + "items": { + "nullable": false, + "type": "string", + }, + "default": null, }, "title_blacklist": { - "nullable": false, + "nullable": true, "type": "array", "items": { "nullable": false, "type": "string", }, - "default": [], + "default": null, }, }, "additionalProperties": false, @@ -433,6 +594,11 @@ namespace _munin.conf "type": "string", } }, + "hide_tags": { + "nullable": false, + "type": "boolean", + "default": false, + }, "reminders": { "nullable": false, "type": "array", @@ -527,6 +693,11 @@ namespace _munin.conf "nullable": false, "type": "integer", }, + "hide_tags": { + "nullable": false, + "type": "boolean", + "default": false, + }, "reminders": { "nullable": false, "type": "array", @@ -653,7 +824,7 @@ namespace _munin.conf /** */ export function schema( - version : string = "3" + version : string = "4" ) : lib_plankton.conf.type_schema { switch (version) { @@ -680,7 +851,8 @@ namespace _munin.conf break; } case "2": - case "3": { + case "3": + case "4": { return { "nullable": false, "type": "object", @@ -714,27 +886,37 @@ namespace _munin.conf { "1": {"target": "2", "function": convert_from_v1}, "2": {"target": "3", "function": convert_from_v2}, - "3": null, + "3": {"target": "4", "function": convert_from_v3}, + "4": null, } ); + /* switch (conf_raw.version) { case "1": { const conf_v1 : type_conf_v1 = (conf_raw.content as type_conf_v1); const conf_v2 : type_conf_v2 = convert_from_v1(conf_v1); const conf_v3 : type_conf_v3 = convert_from_v2(conf_v2); - return conf_v3; + const conf_v4 : type_conf_v4 = convert_from_v3(conf_v3); + return conf_v4; break; } case "2": { const conf_v2 : type_conf_v2 = (conf_raw.content as type_conf_v2); const conf_v3 : type_conf_v3 = convert_from_v2(conf_v2); - return conf_v3; + const conf_v4 : type_conf_v4 = convert_from_v3(conf_v3); + return conf_v4; break; } case "3": { const conf_v3 : type_conf_v3 = (conf_raw.content as type_conf_v3); - return conf_v3; + const conf_v4 : type_conf_v4 = convert_from_v3(conf_v3); + return conf_v4; + break; + } + case "4": { + const conf_v4 : type_conf_v4 = (conf_raw.content as type_conf_v4); + return conf_v4; break; } default: { @@ -742,6 +924,8 @@ namespace _munin.conf break; } } + */ + return (conf_raw.content as type_conf_v4); } } diff --git a/source/sources/ical_feed.ts b/source/sources/ical_feed.ts index a3128f8..c4f0ec4 100644 --- a/source/sources/ical_feed.ts +++ b/source/sources/ical_feed.ts @@ -26,8 +26,10 @@ namespace _munin.sources.ical_feed export type type_parameters = { url : string; filtration : { - category_blacklist : Array; - title_blacklist : Array; + category_whitelist : (null | Array); + category_blacklist : (null | Array); + title_whitelist : (null | Array); + title_blacklist : (null | Array); }; }; @@ -56,27 +58,52 @@ namespace _munin.sources.ical_feed vcalendar.vevents .filter( vevent => ( - // category + // category whitelist ( - vevent.categories.every( + (parameters.filtration.category_whitelist === null) + || + vevent.categories.some( category => ( - ! ( - parameters.filtration.category_blacklist - .map(category_ => category_.toLowerCase()) - .includes(category.toLowerCase()) - ) + parameters.filtration.category_whitelist + .map(category_ => category_.toLowerCase()) + .includes(category.toLowerCase()) ) ) ) && - // title + // category blacklist ( - parameters.filtration.title_blacklist.every( + (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()) - ) + 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()) ) ) ) diff --git a/source/targets/email.ts b/source/targets/email.ts index f291acf..7c060d5 100644 --- a/source/targets/email.ts +++ b/source/targets/email.ts @@ -30,6 +30,7 @@ namespace _munin.targets.email smtp_password : string; sender : string; receivers : Array; + hide_tags : boolean; /** * in hours */ @@ -76,7 +77,7 @@ namespace _munin.targets.email { "title_label": labels.title.toUpperCase(), "macro_tags": ( - (event.tags === null) + (parameters.hide_tags || (event.tags === null)) ? "" : diff --git a/source/targets/telegram_bot.ts b/source/targets/telegram_bot.ts index 8ab53d4..81f1ef1 100644 --- a/source/targets/telegram_bot.ts +++ b/source/targets/telegram_bot.ts @@ -26,6 +26,7 @@ namespace _munin.targets.telegram_bot export type type_parameters = { bot_token : string; chat_id : int; + hide_tags : boolean; reminders : Array; }; @@ -46,7 +47,7 @@ namespace _munin.targets.telegram_bot { "head": labels.head, "macro_tags": ( - (event.tags === null) + (parameters.hide_tags || (event.tags === null)) ? "" :