Compare commits
6 commits
Author | SHA1 | Date | |
---|---|---|---|
|
4d2b20f0b4 | ||
![]() |
06b220dd27 | ||
![]() |
ab3bfad376 | ||
![]() |
3fa5d0820b | ||
![]() |
e366410d61 | ||
|
1fe6b75b4e |
1
.gitignore
vendored
1
.gitignore
vendored
|
@ -1,4 +1,3 @@
|
||||||
/build/
|
/build/
|
||||||
/temp/
|
/temp/
|
||||||
/conf/
|
|
||||||
/.geany
|
/.geany
|
||||||
|
|
25
data/localization/deu.json
Normal file
25
data/localization/deu.json
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
{
|
||||||
|
"meta": {
|
||||||
|
"identifier": "deu",
|
||||||
|
"name": "Deutsch"
|
||||||
|
},
|
||||||
|
"tree": {
|
||||||
|
"core.event.event": "Termin",
|
||||||
|
"core.event.events": "Termine",
|
||||||
|
"core.event.title.long": "Titel",
|
||||||
|
"core.event.title.short": "was",
|
||||||
|
"core.event.time.long": "Datum und Uhrzeit",
|
||||||
|
"core.event.time.short": "wann",
|
||||||
|
"core.event.location.long": "Ort",
|
||||||
|
"core.event.location.short": "wo",
|
||||||
|
"core.reminder.reminder": "Erinnerung",
|
||||||
|
"args.action.description": "auszuführende Aktion",
|
||||||
|
"args.conf_path.description": "Pfad zur Konfigurations-Datei",
|
||||||
|
"args.conf_schema.description": "nur das Konfigurations-Schema ausgeben",
|
||||||
|
"args.conf_expose.description": "die vervollständigte Konfiguration ausgeben",
|
||||||
|
"args.single_run.description": "nur einen Durchlauf ausführen",
|
||||||
|
"args.dry_run.description": "das Senden von Benachrichtigungen überspringen",
|
||||||
|
"args.help.description": "nur die Hilfe-Seite anzeigen",
|
||||||
|
"help.description": "sendet Erinnerungen zu anstehenden Terminen"
|
||||||
|
}
|
||||||
|
}
|
25
data/localization/eng.json
Normal file
25
data/localization/eng.json
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
{
|
||||||
|
"meta": {
|
||||||
|
"identifier": "eng",
|
||||||
|
"name": "English"
|
||||||
|
},
|
||||||
|
"tree": {
|
||||||
|
"core.event.event": "event",
|
||||||
|
"core.event.events": "events",
|
||||||
|
"core.event.title.long": "title",
|
||||||
|
"core.event.title.short": "what",
|
||||||
|
"core.event.time.long": "date and time",
|
||||||
|
"core.event.time.short": "when",
|
||||||
|
"core.event.location.long": "location",
|
||||||
|
"core.event.location.short": "where",
|
||||||
|
"core.reminder.reminder": "reminder",
|
||||||
|
"args.action.description": "what to do",
|
||||||
|
"args.conf_path.description": "path to configuration file",
|
||||||
|
"args.conf_schema.description": "only print the configuration schema",
|
||||||
|
"args.conf_expose.description": "whether to expose the full configuration",
|
||||||
|
"args.single_run.description": "whether to only execute one iteration at run",
|
||||||
|
"args.dry_run.description": "whether to skip the sending of reminders (logs will be written)",
|
||||||
|
"args.help.description": "only print the help page",
|
||||||
|
"help.description": "sends reminders about upcoming events"
|
||||||
|
}
|
||||||
|
}
|
|
@ -16,6 +16,7 @@
|
||||||
"file",
|
"file",
|
||||||
"conf",
|
"conf",
|
||||||
"log",
|
"log",
|
||||||
|
"translate",
|
||||||
"args"
|
"args"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
99
libs/plankton/plankton.d.ts
vendored
99
libs/plankton/plankton.d.ts
vendored
|
@ -1,11 +1,11 @@
|
||||||
/**
|
/**
|
||||||
* @author fenris
|
* @author fenris
|
||||||
*/
|
*/
|
||||||
declare type int = number;
|
type int = number;
|
||||||
/**
|
/**
|
||||||
* @author fenris
|
* @author fenris
|
||||||
*/
|
*/
|
||||||
declare type float = number;
|
type float = number;
|
||||||
declare var process: any;
|
declare var process: any;
|
||||||
declare var require: any;
|
declare var require: any;
|
||||||
declare class Buffer {
|
declare class Buffer {
|
||||||
|
@ -22,7 +22,7 @@ declare namespace lib_plankton.base {
|
||||||
/**
|
/**
|
||||||
* @author fenris
|
* @author fenris
|
||||||
*/
|
*/
|
||||||
declare type type_pseudopointer<type_value> = {
|
type type_pseudopointer<type_value> = {
|
||||||
value: type_value;
|
value: type_value;
|
||||||
};
|
};
|
||||||
/**
|
/**
|
||||||
|
@ -2701,6 +2701,99 @@ declare namespace lib_plankton.conf {
|
||||||
*/
|
*/
|
||||||
function load_versioned(path: string, get_schema: ((version: string) => type_schema), migrations: Record<string, type_migration<any, any>>): Promise<type_sheet<any>>;
|
function load_versioned(path: string, get_schema: ((version: string) => type_schema), migrations: Record<string, type_migration<any, any>>): Promise<type_sheet<any>>;
|
||||||
}
|
}
|
||||||
|
declare namespace lib_plankton.translate {
|
||||||
|
/**
|
||||||
|
* @author fenris
|
||||||
|
*/
|
||||||
|
type type_package_meta = {
|
||||||
|
identifier: string;
|
||||||
|
name?: string;
|
||||||
|
};
|
||||||
|
/**
|
||||||
|
* @author fenris
|
||||||
|
*/
|
||||||
|
type type_package = {
|
||||||
|
meta: type_package_meta;
|
||||||
|
tree: {
|
||||||
|
[id: string]: string;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
/**
|
||||||
|
* @desc the level of verbosity, specifiying how much output the system shall provide about its actions
|
||||||
|
* @author fenris
|
||||||
|
*/
|
||||||
|
var _verbosity: int;
|
||||||
|
/**
|
||||||
|
* @desc moves a language to the top of the order, making it the primary one
|
||||||
|
* @author fenris
|
||||||
|
*/
|
||||||
|
function promote(identifier: string): void;
|
||||||
|
/**
|
||||||
|
* @desc adds a package to the sytem
|
||||||
|
* @author fenris
|
||||||
|
*/
|
||||||
|
function add(package_: type_package): void;
|
||||||
|
/**
|
||||||
|
* @desc integrates a package to the system, i.e. creates a new one if none existed so far or merges with an existing one
|
||||||
|
* @author fenris
|
||||||
|
*/
|
||||||
|
function feed(package_: type_package): void;
|
||||||
|
/**
|
||||||
|
* @desc tries to retrieve a translation for a specific package identifier
|
||||||
|
* @author fenris
|
||||||
|
*/
|
||||||
|
function fetch(identifier: string, path: string, args?: {
|
||||||
|
[id: string]: string;
|
||||||
|
}): lib_plankton.pod.type_pod<string>;
|
||||||
|
/**
|
||||||
|
* @desc retrieves a string by going through the order and trying to fetch it for the current entry
|
||||||
|
* @author fenris
|
||||||
|
* @todo rename to "get"
|
||||||
|
*/
|
||||||
|
function get_new(path: string, { "args": args, "preferred_language": preferred_language, "fallback": fallback, }?: {
|
||||||
|
args?: Record<string, string>;
|
||||||
|
preferred_language?: (null | string);
|
||||||
|
fallback?: string;
|
||||||
|
}): string;
|
||||||
|
/**
|
||||||
|
* @desc retrieves a string by going through the order and trying to fetch it for the current entry
|
||||||
|
* @author fenris
|
||||||
|
* @deprecated use "get_new"
|
||||||
|
* @todo remove
|
||||||
|
*/
|
||||||
|
function get(path: string, args?: {
|
||||||
|
[id: string]: string;
|
||||||
|
}, fallback?: string): string;
|
||||||
|
/**
|
||||||
|
* @author fenris
|
||||||
|
*/
|
||||||
|
function list(): Array<type_package_meta>;
|
||||||
|
/**
|
||||||
|
* @author fenris
|
||||||
|
* @todo get rid of this; it's currenly needed only for the cdh-internal lib_completion
|
||||||
|
*/
|
||||||
|
function paths(): Array<string>;
|
||||||
|
/**
|
||||||
|
* @author fenris
|
||||||
|
*/
|
||||||
|
function initialize({ "logprefix": logprefix, "verbosity": verbosity, "packages": packages, "order": order, "autopromote": autopromote, }?: {
|
||||||
|
logprefix?: string;
|
||||||
|
verbosity?: int;
|
||||||
|
packages?: Array<type_package>;
|
||||||
|
order?: Array<string>;
|
||||||
|
autopromote?: boolean;
|
||||||
|
}): Promise<void>;
|
||||||
|
}
|
||||||
|
declare namespace lib_plankton.translate {
|
||||||
|
/**
|
||||||
|
* @author fenris
|
||||||
|
*/
|
||||||
|
function iso_639_1_to_iso_639_2(iso6391: string): string;
|
||||||
|
/**
|
||||||
|
* @author fenris
|
||||||
|
*/
|
||||||
|
function stance(str: string): string;
|
||||||
|
}
|
||||||
declare namespace lib_plankton.args {
|
declare namespace lib_plankton.args {
|
||||||
/**
|
/**
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -1486,7 +1486,7 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
|
||||||
function verb(n) { return function (v) { return step([n, v]); }; }
|
function verb(n) { return function (v) { return step([n, v]); }; }
|
||||||
function step(op) {
|
function step(op) {
|
||||||
if (f) throw new TypeError("Generator is already executing.");
|
if (f) throw new TypeError("Generator is already executing.");
|
||||||
while (_) try {
|
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
||||||
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
||||||
if (y = 0, t) op = [op[0] & 2, t.value];
|
if (y = 0, t) op = [op[0] & 2, t.value];
|
||||||
switch (op[0]) {
|
switch (op[0]) {
|
||||||
|
@ -8060,6 +8060,370 @@ var lib_plankton;
|
||||||
})(conf = lib_plankton.conf || (lib_plankton.conf = {}));
|
})(conf = lib_plankton.conf || (lib_plankton.conf = {}));
|
||||||
})(lib_plankton || (lib_plankton = {}));
|
})(lib_plankton || (lib_plankton = {}));
|
||||||
/*
|
/*
|
||||||
|
This file is part of »bacterio-plankton:translate«.
|
||||||
|
|
||||||
|
Copyright 2016-2024 'Christian Fraß, Christian Neubauer, Martin Springwald GbR'
|
||||||
|
<info@greenscale.de>
|
||||||
|
|
||||||
|
»bacterio-plankton:translate« 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.
|
||||||
|
|
||||||
|
»bacterio-plankton:translate« 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 »bacterio-plankton:translate«. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
var lib_plankton;
|
||||||
|
(function (lib_plankton) {
|
||||||
|
var translate;
|
||||||
|
(function (translate) {
|
||||||
|
/**
|
||||||
|
* @desc contains the sets of strings
|
||||||
|
* @author fenris
|
||||||
|
*/
|
||||||
|
var _packages = {};
|
||||||
|
/**
|
||||||
|
* @desc specifies in which order the languages shall be queried; if getting a string from language #0 fails, the
|
||||||
|
* system tries to get it from language #1, and so on
|
||||||
|
* @author fenris
|
||||||
|
*/
|
||||||
|
var _order = [];
|
||||||
|
/**
|
||||||
|
* @desc whether to automatically promote the language of a newly added package
|
||||||
|
* @author fenris
|
||||||
|
*/
|
||||||
|
var _autopromote = false;
|
||||||
|
/**
|
||||||
|
* @desc the level of verbosity, specifiying how much output the system shall provide about its actions
|
||||||
|
* @author fenris
|
||||||
|
*/
|
||||||
|
translate._verbosity = 1;
|
||||||
|
/**
|
||||||
|
* @desc which initial string to use for log-outputs
|
||||||
|
* @author fenris
|
||||||
|
*/
|
||||||
|
var _logprefix = "[lib_translate]";
|
||||||
|
/**
|
||||||
|
* @desc moves a language to the top of the order, making it the primary one
|
||||||
|
* @author fenris
|
||||||
|
*/
|
||||||
|
function promote(identifier) {
|
||||||
|
if (Object.keys(_packages).indexOf(identifier) < 0) {
|
||||||
|
if (translate._verbosity >= 1) {
|
||||||
|
console.warn(`${_logprefix} package '${identifier}' doesn't exist yet`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
let position = _order.indexOf(identifier);
|
||||||
|
if (position >= 0) {
|
||||||
|
if (translate._verbosity >= 2) {
|
||||||
|
console.info(`${_logprefix} '${identifier}' already in order; will promote it`);
|
||||||
|
}
|
||||||
|
_order.splice(position, 1);
|
||||||
|
}
|
||||||
|
_order.unshift(identifier);
|
||||||
|
if (translate._verbosity >= 2) {
|
||||||
|
console.info(`${_logprefix} order is now ${_order.toString()}`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
translate.promote = promote;
|
||||||
|
/**
|
||||||
|
* @desc adds a package to the sytem
|
||||||
|
* @author fenris
|
||||||
|
*/
|
||||||
|
function add(package_) {
|
||||||
|
let identifier = package_.meta.identifier;
|
||||||
|
if (identifier in _packages) {
|
||||||
|
if (translate._verbosity >= 1) {
|
||||||
|
console.warn(`${_logprefix} package '${identifier}' has already been added; will overwrite`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (translate._verbosity >= 2) {
|
||||||
|
console.log(`${_logprefix} got package '${identifier}'`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_packages[identifier] = package_;
|
||||||
|
if (_autopromote) {
|
||||||
|
promote(identifier);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
translate.add = add;
|
||||||
|
/**
|
||||||
|
* @desc integrates a package to the system, i.e. creates a new one if none existed so far or merges with an existing one
|
||||||
|
* @author fenris
|
||||||
|
*/
|
||||||
|
function feed(package_) {
|
||||||
|
let identifier = package_.meta.identifier;
|
||||||
|
if (identifier in _packages) {
|
||||||
|
lib_plankton.object.patch(_packages[identifier].tree, package_.tree, {
|
||||||
|
"deep": true,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (translate._verbosity >= 2) {
|
||||||
|
console.info(`${_logprefix} package '${identifier}' didn't exist so far; will create it now`);
|
||||||
|
}
|
||||||
|
add(package_);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
translate.feed = feed;
|
||||||
|
/**
|
||||||
|
* @desc tries to retrieve a translation for a specific package identifier
|
||||||
|
* @author fenris
|
||||||
|
*/
|
||||||
|
function fetch(identifier, path, args = {}) {
|
||||||
|
if (!(identifier in _packages)) {
|
||||||
|
if (translate._verbosity >= 1) {
|
||||||
|
console.warn(`${_logprefix} no package '${identifier}'`);
|
||||||
|
}
|
||||||
|
return (lib_plankton.pod.make_empty());
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// let str : string = lib_plankton.object.path_read<string>(_packages[identifier].tree, path);
|
||||||
|
let str = _packages[identifier].tree[path];
|
||||||
|
if (str == undefined) {
|
||||||
|
if (translate._verbosity >= 1) {
|
||||||
|
console.warn(`${_logprefix} string '${path}' missing in package '${identifier}'`);
|
||||||
|
}
|
||||||
|
return (lib_plankton.pod.make_empty());
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// resolve references
|
||||||
|
{
|
||||||
|
let regexp_reference = new RegExp("#\\(([\\w\\.]*)(?:\\?(\\w+)=(\\w+)(?:&(\\w+)=(\\w+))*)?\\)");
|
||||||
|
while (true) {
|
||||||
|
let matching = regexp_reference.exec(str);
|
||||||
|
if (matching != null) {
|
||||||
|
let path_ = matching[1];
|
||||||
|
let args_ = {};
|
||||||
|
if (translate._verbosity >= 2) {
|
||||||
|
// console.info(`${_logprefix} found reference to '${path_}' with args ${JSON.stringify(args_)}`);
|
||||||
|
console.info(`${_logprefix} found reference to '${path_}'`);
|
||||||
|
}
|
||||||
|
// parse args
|
||||||
|
{
|
||||||
|
for (let index = 2; index <= matching.length - 1; index += 2) {
|
||||||
|
let id = matching[index + 0];
|
||||||
|
let value = matching[index + 1];
|
||||||
|
if (id != undefined) {
|
||||||
|
args_[id] = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// fetch referenced string
|
||||||
|
{
|
||||||
|
let result_ = fetch(identifier, path_, args_);
|
||||||
|
if (lib_plankton.pod.is_filled(result_)) {
|
||||||
|
let front = str.slice(0, matching.index);
|
||||||
|
let back = str.slice(matching.index + matching[0].length);
|
||||||
|
str = (front + lib_plankton.pod.cull(result_) + back);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return (lib_plankton.pod.make_empty());
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// insert arguments
|
||||||
|
{
|
||||||
|
str = lib_plankton.string.coin(str, args);
|
||||||
|
}
|
||||||
|
return (lib_plankton.pod.make_filled(str));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
translate.fetch = fetch;
|
||||||
|
/**
|
||||||
|
* @desc retrieves a string by going through the order and trying to fetch it for the current entry
|
||||||
|
* @author fenris
|
||||||
|
* @todo rename to "get"
|
||||||
|
*/
|
||||||
|
function get_new(path, { "args": args = {}, "preferred_language": preferred_language = null, "fallback": fallback = null, } = {}) {
|
||||||
|
if (fallback == null) {
|
||||||
|
fallback = `{${path}}`;
|
||||||
|
}
|
||||||
|
if (translate._verbosity >= 2) {
|
||||||
|
console.info(`${_logprefix} getting translation for string '${path}' with arguments ${JSON.stringify(args)} …`);
|
||||||
|
}
|
||||||
|
let result = lib_plankton.pod.make_empty();
|
||||||
|
const order = ((preferred_language === null)
|
||||||
|
?
|
||||||
|
_order
|
||||||
|
:
|
||||||
|
([preferred_language].concat(_order.filter(x => (x !== preferred_language)))));
|
||||||
|
const found = order.some(identifier => {
|
||||||
|
if (translate._verbosity >= 2) {
|
||||||
|
console.info(`${_logprefix} trying package '${identifier}' …`);
|
||||||
|
}
|
||||||
|
const result_ = fetch(identifier, path, args);
|
||||||
|
if (lib_plankton.pod.is_filled(result_)) {
|
||||||
|
result = result_;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
if (found) {
|
||||||
|
const str = lib_plankton.pod.cull(result);
|
||||||
|
if (translate._verbosity >= 3) {
|
||||||
|
console.info(`${_logprefix} found translation: '${str}'`);
|
||||||
|
}
|
||||||
|
return str;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
const str = fallback;
|
||||||
|
if (translate._verbosity >= 1) {
|
||||||
|
console.warn(`${_logprefix} no package provides a translation for string '${path}'; will use the fallback translation '${str}'`);
|
||||||
|
}
|
||||||
|
return str;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
translate.get_new = get_new;
|
||||||
|
/**
|
||||||
|
* @desc retrieves a string by going through the order and trying to fetch it for the current entry
|
||||||
|
* @author fenris
|
||||||
|
* @deprecated use "get_new"
|
||||||
|
* @todo remove
|
||||||
|
*/
|
||||||
|
function get(path, args = {}, fallback = null) {
|
||||||
|
return get_new(path, {
|
||||||
|
"args": args,
|
||||||
|
"fallback": fallback,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
translate.get = get;
|
||||||
|
/**
|
||||||
|
* @author fenris
|
||||||
|
*/
|
||||||
|
function list() {
|
||||||
|
return lib_plankton.object.to_array(_packages).map(x => x.value.meta);
|
||||||
|
}
|
||||||
|
translate.list = list;
|
||||||
|
/**
|
||||||
|
* @author fenris
|
||||||
|
* @todo get rid of this; it's currenly needed only for the cdh-internal lib_completion
|
||||||
|
*/
|
||||||
|
function paths() {
|
||||||
|
return lib_plankton.object.keys(lib_plankton.object.flatten(_packages[_order[0]].tree));
|
||||||
|
}
|
||||||
|
translate.paths = paths;
|
||||||
|
/**
|
||||||
|
* @author fenris
|
||||||
|
*/
|
||||||
|
function initialize({ "logprefix": logprefix = undefined, "verbosity": verbosity = undefined, "packages": packages = [], "order": order = undefined, "autopromote": autopromote = undefined, } = {}) {
|
||||||
|
return (Promise.resolve(undefined)
|
||||||
|
// set variables
|
||||||
|
.then(_ => {
|
||||||
|
if (logprefix != undefined)
|
||||||
|
_logprefix = logprefix;
|
||||||
|
if (verbosity != undefined)
|
||||||
|
translate._verbosity = verbosity;
|
||||||
|
// _packages = {};
|
||||||
|
if (order != undefined)
|
||||||
|
_order = order;
|
||||||
|
if (autopromote != undefined)
|
||||||
|
_autopromote = autopromote;
|
||||||
|
return Promise.resolve(undefined);
|
||||||
|
})
|
||||||
|
// feed
|
||||||
|
.then(_ => {
|
||||||
|
packages.forEach(feed);
|
||||||
|
return Promise.resolve(undefined);
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
translate.initialize = initialize;
|
||||||
|
})(translate = lib_plankton.translate || (lib_plankton.translate = {}));
|
||||||
|
})(lib_plankton || (lib_plankton = {}));
|
||||||
|
/*
|
||||||
|
This file is part of »bacterio-plankton:translate«.
|
||||||
|
|
||||||
|
Copyright 2016-2024 'Christian Fraß, Christian Neubauer, Martin Springwald GbR'
|
||||||
|
<info@greenscale.de>
|
||||||
|
|
||||||
|
»bacterio-plankton:translate« 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.
|
||||||
|
|
||||||
|
»bacterio-plankton:translate« 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 »bacterio-plankton:translate«. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
var lib_plankton;
|
||||||
|
(function (lib_plankton) {
|
||||||
|
var translate;
|
||||||
|
(function (translate) {
|
||||||
|
/**
|
||||||
|
* @author fenris
|
||||||
|
*/
|
||||||
|
function iso_639_1_to_iso_639_2(iso6391) {
|
||||||
|
let mapping = {
|
||||||
|
"af": "afr",
|
||||||
|
"ar": "ara",
|
||||||
|
"bg": "bul",
|
||||||
|
"cs": "ces",
|
||||||
|
"da": "dan",
|
||||||
|
"de": "deu",
|
||||||
|
"el": "ell",
|
||||||
|
"en": "eng",
|
||||||
|
"eo": "epo",
|
||||||
|
"es": "esp",
|
||||||
|
"fa": "fas",
|
||||||
|
"fi": "fin",
|
||||||
|
"fr": "fra",
|
||||||
|
"hi": "hin",
|
||||||
|
"hr": "hrv",
|
||||||
|
"hu": "hun",
|
||||||
|
"is": "isl",
|
||||||
|
"it": "ita",
|
||||||
|
"ja": "jpn",
|
||||||
|
"ko": "kor",
|
||||||
|
"nb": "nob",
|
||||||
|
"nl": "nld",
|
||||||
|
"nn": "nno",
|
||||||
|
"pt": "por",
|
||||||
|
"pl": "pol",
|
||||||
|
"ro": "ron",
|
||||||
|
"ru": "rus",
|
||||||
|
"sk": "slk",
|
||||||
|
"sv": "swe",
|
||||||
|
"zh": "zho",
|
||||||
|
};
|
||||||
|
return mapping[iso6391];
|
||||||
|
}
|
||||||
|
translate.iso_639_1_to_iso_639_2 = iso_639_1_to_iso_639_2;
|
||||||
|
/**
|
||||||
|
* @author fenris
|
||||||
|
*/
|
||||||
|
function stance(str) {
|
||||||
|
let regexp = new RegExp("^translate:(.*)$");
|
||||||
|
let matching = regexp.exec(str);
|
||||||
|
if (matching != null) {
|
||||||
|
return translate.get(matching[1]);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return str;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
translate.stance = stance;
|
||||||
|
})(translate = lib_plankton.translate || (lib_plankton.translate = {}));
|
||||||
|
})(lib_plankton || (lib_plankton = {}));
|
||||||
|
/*
|
||||||
This file is part of »bacterio-plankton:args«.
|
This file is part of »bacterio-plankton:args«.
|
||||||
|
|
||||||
Copyright 2016-2024 'Christian Fraß, Christian Neubauer, Martin Springwald GbR'
|
Copyright 2016-2024 'Christian Fraß, Christian Neubauer, Martin Springwald GbR'
|
||||||
|
|
784
source/conf.ts
784
source/conf.ts
|
@ -18,9 +18,6 @@ along with »munin«. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @todo versioning
|
|
||||||
*/
|
|
||||||
namespace _munin.conf
|
namespace _munin.conf
|
||||||
{
|
{
|
||||||
|
|
||||||
|
@ -43,154 +40,9 @@ namespace _munin.conf
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
* @todo rename to "type_conf"
|
||||||
*/
|
*/
|
||||||
type type_conf_v1 = {
|
type type_conf_v6 = {
|
||||||
sources : Array<
|
|
||||||
(
|
|
||||||
{
|
|
||||||
kind : "kalender_digital";
|
|
||||||
data : {
|
|
||||||
path : string;
|
|
||||||
filtration : {
|
|
||||||
category_blacklist : Array<string>;
|
|
||||||
title_blacklist : Array<string>;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
}
|
|
||||||
)
|
|
||||||
>;
|
|
||||||
targets : Array<
|
|
||||||
(
|
|
||||||
{
|
|
||||||
kind : "telegram_bot";
|
|
||||||
data : {
|
|
||||||
bot_token : string;
|
|
||||||
chat_id : int;
|
|
||||||
/**
|
|
||||||
* in hours
|
|
||||||
*/
|
|
||||||
interval : Array<int>;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
)
|
|
||||||
>;
|
|
||||||
frequency : float;
|
|
||||||
labels : {
|
|
||||||
head : string;
|
|
||||||
title : string;
|
|
||||||
time : string;
|
|
||||||
location : string;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
*/
|
|
||||||
type type_conf_v2 = {
|
|
||||||
sources : Array<
|
|
||||||
(
|
|
||||||
{
|
|
||||||
kind : "ical_feed";
|
|
||||||
data : {
|
|
||||||
url : string;
|
|
||||||
filtration : {
|
|
||||||
category_blacklist : Array<string>;
|
|
||||||
title_blacklist : Array<string>;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
)
|
|
||||||
>;
|
|
||||||
targets : Array<
|
|
||||||
(
|
|
||||||
{
|
|
||||||
kind : "telegram_bot";
|
|
||||||
data : {
|
|
||||||
bot_token : string;
|
|
||||||
chat_id : int;
|
|
||||||
/**
|
|
||||||
* in hours
|
|
||||||
*/
|
|
||||||
reminders : Array<int>;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
)
|
|
||||||
>;
|
|
||||||
settings : {
|
|
||||||
interval : float;
|
|
||||||
};
|
|
||||||
labels : {
|
|
||||||
head : string;
|
|
||||||
title : string;
|
|
||||||
time : string;
|
|
||||||
location : string;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
*/
|
|
||||||
type type_conf_v3 = {
|
|
||||||
sources : Array<
|
|
||||||
(
|
|
||||||
{
|
|
||||||
kind : "ical_feed";
|
|
||||||
data : {
|
|
||||||
url : string;
|
|
||||||
filtration : {
|
|
||||||
category_blacklist : Array<string>;
|
|
||||||
title_blacklist : Array<string>;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
)
|
|
||||||
>;
|
|
||||||
targets : Array<
|
|
||||||
(
|
|
||||||
{
|
|
||||||
kind : "email";
|
|
||||||
data : {
|
|
||||||
smtp_host : string;
|
|
||||||
smtp_port : int;
|
|
||||||
smtp_username : string;
|
|
||||||
smtp_password : string;
|
|
||||||
sender : string;
|
|
||||||
receivers : Array<string>;
|
|
||||||
/**
|
|
||||||
* in hours
|
|
||||||
*/
|
|
||||||
reminders : Array<int>;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
||||||
{
|
|
||||||
kind : "telegram_bot";
|
|
||||||
data : {
|
|
||||||
bot_token : string;
|
|
||||||
chat_id : int;
|
|
||||||
/**
|
|
||||||
* in hours
|
|
||||||
*/
|
|
||||||
reminders : Array<int>;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
)
|
|
||||||
>;
|
|
||||||
settings : {
|
|
||||||
interval : float;
|
|
||||||
};
|
|
||||||
labels : {
|
|
||||||
head : string;
|
|
||||||
title : string;
|
|
||||||
time : string;
|
|
||||||
location : string;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
*/
|
|
||||||
type type_conf_v4 = {
|
|
||||||
sources : Array<
|
sources : Array<
|
||||||
(
|
(
|
||||||
{
|
{
|
||||||
|
@ -219,10 +71,11 @@ namespace _munin.conf
|
||||||
sender : string;
|
sender : string;
|
||||||
receivers : Array<string>;
|
receivers : Array<string>;
|
||||||
hide_tags : boolean;
|
hide_tags : boolean;
|
||||||
/**
|
reminders : Array<type_reminder_raw>;
|
||||||
* in hours
|
language : string;
|
||||||
*/
|
strings : {
|
||||||
reminders : Array<int>;
|
notification_head : string;
|
||||||
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
|
||||||
|
@ -232,10 +85,11 @@ namespace _munin.conf
|
||||||
bot_token : string;
|
bot_token : string;
|
||||||
chat_id : int;
|
chat_id : int;
|
||||||
hide_tags : boolean;
|
hide_tags : boolean;
|
||||||
/**
|
reminders : Array<type_reminder_raw>;
|
||||||
* in hours
|
language : string;
|
||||||
*/
|
strings : {
|
||||||
reminders : Array<int>;
|
notification_head : string;
|
||||||
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
@ -243,371 +97,23 @@ namespace _munin.conf
|
||||||
settings : {
|
settings : {
|
||||||
interval : float;
|
interval : float;
|
||||||
};
|
};
|
||||||
labels : {
|
|
||||||
head : string;
|
|
||||||
title : string;
|
|
||||||
time : string;
|
|
||||||
location : string;
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*/
|
*/
|
||||||
type type_conf_v5 = {
|
const current_version : string = "6";
|
||||||
sources : Array<
|
|
||||||
(
|
|
||||||
{
|
|
||||||
kind : "ical_feed";
|
|
||||||
data : {
|
|
||||||
url : string;
|
|
||||||
filtration : {
|
|
||||||
category_whitelist : (null | Array<string>);
|
|
||||||
category_blacklist : (null | Array<string>);
|
|
||||||
title_whitelist : (null | Array<string>);
|
|
||||||
title_blacklist : (null | Array<string>);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
)
|
|
||||||
>;
|
|
||||||
targets : Array<
|
|
||||||
(
|
|
||||||
{
|
|
||||||
kind : "email";
|
|
||||||
data : {
|
|
||||||
smtp_host : string;
|
|
||||||
smtp_port : int;
|
|
||||||
smtp_username : string;
|
|
||||||
smtp_password : string;
|
|
||||||
sender : string;
|
|
||||||
receivers : Array<string>;
|
|
||||||
hide_tags : boolean;
|
|
||||||
/**
|
|
||||||
* in hours
|
|
||||||
*/
|
|
||||||
reminders : Array<type_reminder_raw>;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
||||||
{
|
|
||||||
kind : "telegram_bot";
|
|
||||||
data : {
|
|
||||||
bot_token : string;
|
|
||||||
chat_id : int;
|
|
||||||
hide_tags : boolean;
|
|
||||||
/**
|
|
||||||
* in hours
|
|
||||||
*/
|
|
||||||
reminders : Array<type_reminder_raw>;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
)
|
|
||||||
>;
|
|
||||||
settings : {
|
|
||||||
interval : float;
|
|
||||||
};
|
|
||||||
labels : {
|
|
||||||
head : string;
|
|
||||||
title : string;
|
|
||||||
time : string;
|
|
||||||
location : string;
|
|
||||||
events : string;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
* @todo remove
|
||||||
*/
|
*/
|
||||||
export type type_conf = type_conf_v5;
|
export type type_conf = type_conf_v6;
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
*/
|
|
||||||
function convert_from_v1(
|
|
||||||
conf_v1 : type_conf_v1
|
|
||||||
) : type_conf_v2
|
|
||||||
{
|
|
||||||
return {
|
|
||||||
"sources": conf_v1.sources.map(
|
|
||||||
source => {
|
|
||||||
switch (source.kind) {
|
|
||||||
case "kalender_digital": {
|
|
||||||
return {
|
|
||||||
"kind": "ical_feed",
|
|
||||||
"data": {
|
|
||||||
"url": lib_plankton.url.encode(
|
|
||||||
{
|
|
||||||
"scheme": "https",
|
|
||||||
"host": "export.kalender.digital",
|
|
||||||
"username": null,
|
|
||||||
"password": null,
|
|
||||||
"port": null,
|
|
||||||
"path": ("/ics/" + source.data.path + ".ics"),
|
|
||||||
"query": "past_months=0&future_months=1",
|
|
||||||
"hash": null,
|
|
||||||
}
|
|
||||||
),
|
|
||||||
"filtration": source.data.filtration,
|
|
||||||
}
|
|
||||||
};
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
default: {
|
|
||||||
// return source;
|
|
||||||
throw (new Error("unhandled source kind: " + source.kind));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
),
|
|
||||||
"targets": conf_v1.targets.map(
|
|
||||||
target => {
|
|
||||||
switch (target.kind) {
|
|
||||||
case "telegram_bot": {
|
|
||||||
return {
|
|
||||||
"kind": "telegram_bot",
|
|
||||||
"data": {
|
|
||||||
"bot_token": target.data.bot_token,
|
|
||||||
"chat_id": target.data.chat_id,
|
|
||||||
"reminders": target.data.interval,
|
|
||||||
},
|
|
||||||
};
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
default: {
|
|
||||||
// return target;
|
|
||||||
throw (new Error("unhandled target kind: " + target.kind));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
),
|
|
||||||
"settings": {
|
|
||||||
"interval": conf_v1.frequency,
|
|
||||||
},
|
|
||||||
"labels": conf_v1.labels,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
*/
|
|
||||||
function convert_from_v2(
|
|
||||||
conf_v2 : type_conf_v2
|
|
||||||
) : type_conf_v3
|
|
||||||
{
|
|
||||||
return conf_v2;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
*/
|
|
||||||
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 convert_from_v4(
|
|
||||||
conf_v4 : type_conf_v4
|
|
||||||
) : type_conf_v5
|
|
||||||
{
|
|
||||||
const map_reminder = hours => ({
|
|
||||||
"frequency": "hourly",
|
|
||||||
"offset": 0,
|
|
||||||
"from": hours,
|
|
||||||
"to": (hours + 1),
|
|
||||||
} as type_reminder_raw);
|
|
||||||
return {
|
|
||||||
"sources": conf_v4.sources,
|
|
||||||
"targets": conf_v4.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": target.data.hide_tags,
|
|
||||||
"reminders": target.data.reminders.map(map_reminder),
|
|
||||||
},
|
|
||||||
};
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case "telegram_bot": {
|
|
||||||
return {
|
|
||||||
"kind": "telegram_bot",
|
|
||||||
"data": {
|
|
||||||
"bot_token": target.data.bot_token,
|
|
||||||
"chat_id": target.data.chat_id,
|
|
||||||
"hide_tags": target.data.hide_tags,
|
|
||||||
"reminders": target.data.reminders.map(map_reminder),
|
|
||||||
},
|
|
||||||
};
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
default: {
|
|
||||||
// return target;
|
|
||||||
throw (new Error("unhandled target kind: " + String(target)));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
),
|
|
||||||
"settings": conf_v4.settings,
|
|
||||||
"labels": Object.assign({"events": "Termine"}, conf_v4.labels),
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
*/
|
|
||||||
function schema_source_kalender_digital(
|
|
||||||
version : string
|
|
||||||
) : lib_plankton.conf.type_schema
|
|
||||||
{
|
|
||||||
return {
|
|
||||||
"type": "object",
|
|
||||||
"properties": {
|
|
||||||
"kind": {
|
|
||||||
"nullable": false,
|
|
||||||
"type": "string",
|
|
||||||
"enum": ["kalender_digital"]
|
|
||||||
},
|
|
||||||
"data": {
|
|
||||||
"nullable": false,
|
|
||||||
"type": "object",
|
|
||||||
"properties": {
|
|
||||||
"path": {
|
|
||||||
"nullable": false,
|
|
||||||
"type": "string"
|
|
||||||
},
|
|
||||||
"filtration": {
|
|
||||||
"nullable": false,
|
|
||||||
"type": "object",
|
|
||||||
"properties": {
|
|
||||||
"category_blacklist": {
|
|
||||||
"nullable": true,
|
|
||||||
"type": "array",
|
|
||||||
"items": {
|
|
||||||
"nullable": false,
|
|
||||||
"type": "string",
|
|
||||||
},
|
|
||||||
"default": [],
|
|
||||||
},
|
|
||||||
"title_blacklist": {
|
|
||||||
"nullable": true,
|
|
||||||
"type": "array",
|
|
||||||
"items": {
|
|
||||||
"nullable": false,
|
|
||||||
"type": "string",
|
|
||||||
},
|
|
||||||
"default": [],
|
|
||||||
},
|
|
||||||
},
|
|
||||||
"additionalProperties": false,
|
|
||||||
"required": [
|
|
||||||
],
|
|
||||||
"default": {}
|
|
||||||
},
|
|
||||||
},
|
|
||||||
"additionalProperties": false,
|
|
||||||
"required": [
|
|
||||||
"path",
|
|
||||||
]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"additionalProperties": false,
|
|
||||||
"required": [
|
|
||||||
"kind",
|
|
||||||
"data",
|
|
||||||
]
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*/
|
*/
|
||||||
function schema_source_ical_feed(
|
function schema_source_ical_feed(
|
||||||
version : string
|
|
||||||
) : lib_plankton.conf.type_schema
|
) : lib_plankton.conf.type_schema
|
||||||
{
|
{
|
||||||
return {
|
return {
|
||||||
|
@ -691,60 +197,25 @@ namespace _munin.conf
|
||||||
/**
|
/**
|
||||||
*/
|
*/
|
||||||
function schema_sources(
|
function schema_sources(
|
||||||
version : string
|
|
||||||
) : lib_plankton.conf.type_schema
|
) : lib_plankton.conf.type_schema
|
||||||
{
|
{
|
||||||
switch (version) {
|
|
||||||
case "1": {
|
|
||||||
return {
|
return {
|
||||||
"nullable": false,
|
"nullable": false,
|
||||||
"type": "array",
|
"type": "array",
|
||||||
"items": {
|
"items": {
|
||||||
"nullable": false,
|
"nullable": false,
|
||||||
"anyOf": [
|
"anyOf": [
|
||||||
schema_source_kalender_digital(version),
|
schema_source_ical_feed(),
|
||||||
],
|
],
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
break;
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
case "2": {
|
|
||||||
return {
|
|
||||||
"nullable": false,
|
|
||||||
"type": "array",
|
|
||||||
"items": {
|
|
||||||
"nullable": false,
|
|
||||||
"anyOf": [
|
|
||||||
schema_source_ical_feed(version),
|
|
||||||
],
|
|
||||||
}
|
|
||||||
};
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*/
|
*/
|
||||||
function schema_reminder(
|
function schema_reminder(
|
||||||
version : string
|
|
||||||
) : lib_plankton.conf.type_schema
|
) : lib_plankton.conf.type_schema
|
||||||
{
|
|
||||||
switch (version)
|
|
||||||
{
|
|
||||||
case "1":
|
|
||||||
case "2":
|
|
||||||
case "3":
|
|
||||||
case "4":
|
|
||||||
{
|
|
||||||
return {
|
|
||||||
"type": "integer",
|
|
||||||
};
|
|
||||||
}
|
|
||||||
case "5":
|
|
||||||
default:
|
|
||||||
{
|
{
|
||||||
return {
|
return {
|
||||||
"nullable": false,
|
"nullable": false,
|
||||||
|
@ -781,29 +252,13 @@ namespace _munin.conf
|
||||||
"to",
|
"to",
|
||||||
]
|
]
|
||||||
};
|
};
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*/
|
*/
|
||||||
function default_reminder(
|
function default_reminder(
|
||||||
version : string
|
|
||||||
) : any
|
) : any
|
||||||
{
|
|
||||||
switch (version)
|
|
||||||
{
|
|
||||||
case "1":
|
|
||||||
case "2":
|
|
||||||
case "3":
|
|
||||||
case "4":
|
|
||||||
{
|
|
||||||
return [24];
|
|
||||||
}
|
|
||||||
case "5":
|
|
||||||
default:
|
|
||||||
{
|
{
|
||||||
return [
|
return [
|
||||||
{
|
{
|
||||||
|
@ -812,16 +267,12 @@ namespace _munin.conf
|
||||||
"to": 25
|
"to": 25
|
||||||
}
|
}
|
||||||
];
|
];
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*/
|
*/
|
||||||
function schema_target_email(
|
function schema_target_email(
|
||||||
version : string
|
|
||||||
) : lib_plankton.conf.type_schema
|
) : lib_plankton.conf.type_schema
|
||||||
{
|
{
|
||||||
return {
|
return {
|
||||||
|
@ -874,8 +325,28 @@ namespace _munin.conf
|
||||||
"reminders": {
|
"reminders": {
|
||||||
"nullable": false,
|
"nullable": false,
|
||||||
"type": "array",
|
"type": "array",
|
||||||
"items": schema_reminder(version),
|
"items": schema_reminder(),
|
||||||
"default": default_reminder(version),
|
"default": default_reminder(),
|
||||||
|
},
|
||||||
|
"language": {
|
||||||
|
"nullable": false,
|
||||||
|
"type": "string",
|
||||||
|
"default": "deu"
|
||||||
|
},
|
||||||
|
"strings": {
|
||||||
|
"nullable": false,
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"notification_head": {
|
||||||
|
"nullable": false,
|
||||||
|
"type": "string",
|
||||||
|
"default": "[{{core}}] {{extra}}"
|
||||||
|
},
|
||||||
|
},
|
||||||
|
"additionalProperties": false,
|
||||||
|
"required": [
|
||||||
|
],
|
||||||
|
"default": {},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"additionalProperties": false,
|
"additionalProperties": false,
|
||||||
|
@ -900,7 +371,6 @@ namespace _munin.conf
|
||||||
/**
|
/**
|
||||||
*/
|
*/
|
||||||
function schema_target_telegram_bot(
|
function schema_target_telegram_bot(
|
||||||
version : string
|
|
||||||
) : lib_plankton.conf.type_schema
|
) : lib_plankton.conf.type_schema
|
||||||
{
|
{
|
||||||
return {
|
return {
|
||||||
|
@ -932,8 +402,28 @@ namespace _munin.conf
|
||||||
"reminders": {
|
"reminders": {
|
||||||
"nullable": false,
|
"nullable": false,
|
||||||
"type": "array",
|
"type": "array",
|
||||||
"items": schema_reminder(version),
|
"items": schema_reminder(),
|
||||||
"default": default_reminder(version),
|
"default": default_reminder(),
|
||||||
|
},
|
||||||
|
"language": {
|
||||||
|
"nullable": false,
|
||||||
|
"type": "string",
|
||||||
|
"default": "deu"
|
||||||
|
},
|
||||||
|
"strings": {
|
||||||
|
"nullable": false,
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"notification_head": {
|
||||||
|
"nullable": false,
|
||||||
|
"type": "string",
|
||||||
|
"default": "[{{core}}] {{extra}}"
|
||||||
|
},
|
||||||
|
},
|
||||||
|
"additionalProperties": false,
|
||||||
|
"required": [
|
||||||
|
],
|
||||||
|
"default": {},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"additionalProperties": false,
|
"additionalProperties": false,
|
||||||
|
@ -955,7 +445,6 @@ namespace _munin.conf
|
||||||
/**
|
/**
|
||||||
*/
|
*/
|
||||||
function schema_targets(
|
function schema_targets(
|
||||||
version : string
|
|
||||||
) : lib_plankton.conf.type_schema
|
) : lib_plankton.conf.type_schema
|
||||||
{
|
{
|
||||||
return {
|
return {
|
||||||
|
@ -963,28 +452,10 @@ namespace _munin.conf
|
||||||
"type": "array",
|
"type": "array",
|
||||||
"items": {
|
"items": {
|
||||||
"nullable": false,
|
"nullable": false,
|
||||||
"anyOf": (() => {
|
"anyOf": [
|
||||||
switch (version) {
|
schema_target_email(),
|
||||||
case "1":
|
schema_target_telegram_bot(),
|
||||||
case "2":
|
]
|
||||||
{
|
|
||||||
return [
|
|
||||||
schema_target_telegram_bot(version),
|
|
||||||
];
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case "4":
|
|
||||||
case "5":
|
|
||||||
default:
|
|
||||||
{
|
|
||||||
return [
|
|
||||||
schema_target_email(version),
|
|
||||||
schema_target_telegram_bot(version),
|
|
||||||
];
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}) (),
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@ -993,7 +464,6 @@ namespace _munin.conf
|
||||||
/**
|
/**
|
||||||
*/
|
*/
|
||||||
function schema_settings(
|
function schema_settings(
|
||||||
version : string
|
|
||||||
) : lib_plankton.conf.type_schema
|
) : lib_plankton.conf.type_schema
|
||||||
{
|
{
|
||||||
return {
|
return {
|
||||||
|
@ -1017,98 +487,40 @@ namespace _munin.conf
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*/
|
*/
|
||||||
function schema_labels(
|
export function schema(
|
||||||
version : string
|
|
||||||
) : lib_plankton.conf.type_schema
|
) : lib_plankton.conf.type_schema
|
||||||
{
|
{
|
||||||
return {
|
return {
|
||||||
"nullable": false,
|
"nullable": false,
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"properties": {
|
"properties": {
|
||||||
"head": {
|
"sources": schema_sources(),
|
||||||
"nullable": false,
|
"targets": schema_targets(),
|
||||||
"type": "string",
|
"settings": schema_settings(),
|
||||||
"default": "Termin-Erinnerung"
|
|
||||||
},
|
|
||||||
"title": {
|
|
||||||
"nullable": false,
|
|
||||||
"type": "string",
|
|
||||||
"default": "was"
|
|
||||||
},
|
|
||||||
"time": {
|
|
||||||
"nullable": false,
|
|
||||||
"type": "string",
|
|
||||||
"default": "wann"
|
|
||||||
},
|
|
||||||
"location": {
|
|
||||||
"nullable": false,
|
|
||||||
"type": "string",
|
|
||||||
"default": "wo"
|
|
||||||
},
|
|
||||||
"events": {
|
|
||||||
"nullable": false,
|
|
||||||
"type": "string",
|
|
||||||
"default": "Termine"
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
"additionalProperties": false,
|
"additionalProperties": false,
|
||||||
"required": [
|
"required": [
|
||||||
|
"sources",
|
||||||
|
"targets",
|
||||||
],
|
],
|
||||||
"default": {}
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*/
|
*/
|
||||||
export function schema(
|
export function schema_extended(
|
||||||
version : string = "5"
|
|
||||||
) : lib_plankton.conf.type_schema
|
) : lib_plankton.conf.type_schema
|
||||||
{
|
{
|
||||||
switch (version) {
|
|
||||||
case "1": {
|
|
||||||
return {
|
return {
|
||||||
"nullable": false,
|
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"properties": {
|
"properties": {
|
||||||
"sources": schema_sources(version),
|
"version": {
|
||||||
"targets": schema_targets(version),
|
|
||||||
"frequency": {
|
|
||||||
"nullable": false,
|
"nullable": false,
|
||||||
"type": "number",
|
"type": "string",
|
||||||
"default": 1.0,
|
"enum": [current_version],
|
||||||
},
|
},
|
||||||
"labels": schema_labels(version),
|
"content": _munin.conf.schema(),
|
||||||
},
|
|
||||||
"additionalProperties": false,
|
|
||||||
"required": [
|
|
||||||
"sources",
|
|
||||||
"targets",
|
|
||||||
],
|
|
||||||
};
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case "2":
|
|
||||||
case "3":
|
|
||||||
case "4":
|
|
||||||
case "5":
|
|
||||||
{
|
|
||||||
return {
|
|
||||||
"nullable": false,
|
|
||||||
"type": "object",
|
|
||||||
"properties": {
|
|
||||||
"sources": schema_sources(version),
|
|
||||||
"targets": schema_targets(version),
|
|
||||||
"settings": schema_settings(version),
|
|
||||||
"labels": schema_labels(version),
|
|
||||||
},
|
|
||||||
"additionalProperties": false,
|
|
||||||
"required": [
|
|
||||||
"sources",
|
|
||||||
"targets",
|
|
||||||
],
|
|
||||||
};
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1124,49 +536,17 @@ namespace _munin.conf
|
||||||
path,
|
path,
|
||||||
schema,
|
schema,
|
||||||
{
|
{
|
||||||
"1": {"target": "2", "function": convert_from_v1},
|
"v6": null,
|
||||||
"2": {"target": "3", "function": convert_from_v2},
|
|
||||||
"3": {"target": "4", "function": convert_from_v3},
|
|
||||||
"4": {"target": "5", "function": convert_from_v4},
|
|
||||||
"5": null,
|
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
if (conf_raw.version !== current_version)
|
||||||
/*
|
{
|
||||||
switch (conf_raw.version) {
|
throw (new Error("conf expected in version '" + current_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);
|
|
||||||
const conf_v4 : type_conf_v4 = convert_from_v3(conf_v3);
|
|
||||||
return conf_v4;
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
case "2": {
|
else
|
||||||
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_raw.content as type_conf_v6);
|
||||||
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);
|
|
||||||
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: {
|
|
||||||
throw (new Error("invalid version: " + conf_raw.version));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
return (conf_raw.content as type_conf_v5);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -203,7 +203,7 @@ namespace _munin.logic
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
await target.send(conf.labels, events);
|
await target.send(events);
|
||||||
}
|
}
|
||||||
catch (error)
|
catch (error)
|
||||||
{
|
{
|
||||||
|
|
|
@ -27,6 +27,31 @@ namespace _munin
|
||||||
args_raw : Array<string>
|
args_raw : Array<string>
|
||||||
): Promise<void>
|
): Promise<void>
|
||||||
{
|
{
|
||||||
|
// init
|
||||||
|
const language_codes : Array<string> = [
|
||||||
|
"deu",
|
||||||
|
"eng",
|
||||||
|
];
|
||||||
|
const packages = await Promise.all<lib_plankton.translate.type_package>(
|
||||||
|
language_codes
|
||||||
|
.map<Promise<lib_plankton.translate.type_package>>(
|
||||||
|
code => (
|
||||||
|
Promise.resolve<string>(code)
|
||||||
|
.then<string>(code => Promise.resolve(lib_plankton.string.coin("data/localization/{{code}}.json", {"code": code})))
|
||||||
|
.then<string>(path => lib_plankton.file.read(path))
|
||||||
|
.then<lib_plankton.translate.type_package>(content => Promise.resolve(lib_plankton.json.decode(content)))
|
||||||
|
)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
await lib_plankton.translate.initialize(
|
||||||
|
{
|
||||||
|
"verbosity": 1,
|
||||||
|
"packages": packages,
|
||||||
|
"order": language_codes,
|
||||||
|
"autopromote": false,
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
// args
|
// args
|
||||||
const arg_handler : lib_plankton.args.class_handler = new lib_plankton.args.class_handler(
|
const arg_handler : lib_plankton.args.class_handler = new lib_plankton.args.class_handler(
|
||||||
{
|
{
|
||||||
|
@ -35,7 +60,12 @@ namespace _munin
|
||||||
"type": lib_plankton.args.enum_type.string,
|
"type": lib_plankton.args.enum_type.string,
|
||||||
"mode": lib_plankton.args.enum_mode.replace,
|
"mode": lib_plankton.args.enum_mode.replace,
|
||||||
"default": "run",
|
"default": "run",
|
||||||
"info": "what to do : test | run",
|
"info": lib_plankton.string.coin(
|
||||||
|
"{{core}} : test | run",
|
||||||
|
{
|
||||||
|
"core": lib_plankton.translate.get("args.action.description"),
|
||||||
|
}
|
||||||
|
),
|
||||||
"name": "action",
|
"name": "action",
|
||||||
}),
|
}),
|
||||||
"conf_path": lib_plankton.args.class_argument.volatile({
|
"conf_path": lib_plankton.args.class_argument.volatile({
|
||||||
|
@ -44,16 +74,16 @@ namespace _munin
|
||||||
"type": lib_plankton.args.enum_type.string,
|
"type": lib_plankton.args.enum_type.string,
|
||||||
"mode": lib_plankton.args.enum_mode.replace,
|
"mode": lib_plankton.args.enum_mode.replace,
|
||||||
"default": "munin.json",
|
"default": "munin.json",
|
||||||
"info": "path to configuration file",
|
"info": lib_plankton.translate.get("args.conf_path.description"),
|
||||||
"name": "conf-path",
|
"name": "conf-path",
|
||||||
}),
|
}),
|
||||||
"conf_schema": lib_plankton.args.class_argument.volatile({
|
"conf_schema": lib_plankton.args.class_argument.volatile({
|
||||||
"indicators_long": ["conf-schema"],
|
"indicators_long": ["conf-schema"],
|
||||||
"indicators_short": ["s"],
|
"indicators_short": ["s"],
|
||||||
"type": lib_plankton.args.enum_type.string,
|
"type": lib_plankton.args.enum_type.boolean,
|
||||||
"mode": lib_plankton.args.enum_mode.replace,
|
"mode": lib_plankton.args.enum_mode.replace,
|
||||||
"default": "",
|
"default": false,
|
||||||
"info": "only print the configuration schema in a specific version (latest version via argument '_')",
|
"info": lib_plankton.translate.get("args.conf_schema.description"),
|
||||||
"name": "conf-schema",
|
"name": "conf-schema",
|
||||||
}),
|
}),
|
||||||
"conf_expose": lib_plankton.args.class_argument.volatile({
|
"conf_expose": lib_plankton.args.class_argument.volatile({
|
||||||
|
@ -62,7 +92,7 @@ namespace _munin
|
||||||
"type": lib_plankton.args.enum_type.boolean,
|
"type": lib_plankton.args.enum_type.boolean,
|
||||||
"mode": lib_plankton.args.enum_mode.replace,
|
"mode": lib_plankton.args.enum_mode.replace,
|
||||||
"default": false,
|
"default": false,
|
||||||
"info": "whether to expose the full configuration",
|
"info": lib_plankton.translate.get("args.conf_expose.description"),
|
||||||
"name": "conf-expose",
|
"name": "conf-expose",
|
||||||
}),
|
}),
|
||||||
"single_run": lib_plankton.args.class_argument.volatile({
|
"single_run": lib_plankton.args.class_argument.volatile({
|
||||||
|
@ -71,7 +101,7 @@ namespace _munin
|
||||||
"type": lib_plankton.args.enum_type.boolean,
|
"type": lib_plankton.args.enum_type.boolean,
|
||||||
"mode": lib_plankton.args.enum_mode.replace,
|
"mode": lib_plankton.args.enum_mode.replace,
|
||||||
"default": false,
|
"default": false,
|
||||||
"info": "whether to only execute one iteration at run",
|
"info": lib_plankton.translate.get("args.single_run.description"),
|
||||||
"name": "single-run",
|
"name": "single-run",
|
||||||
}),
|
}),
|
||||||
"verbosity": lib_plankton.args.class_argument.volatile({
|
"verbosity": lib_plankton.args.class_argument.volatile({
|
||||||
|
@ -89,7 +119,7 @@ namespace _munin
|
||||||
"type": lib_plankton.args.enum_type.boolean,
|
"type": lib_plankton.args.enum_type.boolean,
|
||||||
"mode": lib_plankton.args.enum_mode.replace,
|
"mode": lib_plankton.args.enum_mode.replace,
|
||||||
"default": false,
|
"default": false,
|
||||||
"info": "whether to skip the sending of reminders (logs will be written)",
|
"info": lib_plankton.translate.get("args.dry_run.description"),
|
||||||
"name": "dry-run",
|
"name": "dry-run",
|
||||||
}),
|
}),
|
||||||
"help": lib_plankton.args.class_argument.volatile({
|
"help": lib_plankton.args.class_argument.volatile({
|
||||||
|
@ -98,7 +128,7 @@ namespace _munin
|
||||||
"type": lib_plankton.args.enum_type.boolean,
|
"type": lib_plankton.args.enum_type.boolean,
|
||||||
"mode": lib_plankton.args.enum_mode.replace,
|
"mode": lib_plankton.args.enum_mode.replace,
|
||||||
"default": false,
|
"default": false,
|
||||||
"info": "alias for action 'help'",
|
"info": lib_plankton.translate.get("args.help.description"),
|
||||||
"name": "help",
|
"name": "help",
|
||||||
}),
|
}),
|
||||||
}
|
}
|
||||||
|
@ -113,17 +143,17 @@ namespace _munin
|
||||||
arg_handler.generate_help(
|
arg_handler.generate_help(
|
||||||
{
|
{
|
||||||
"programname": "munin",
|
"programname": "munin",
|
||||||
"description": "sends reminders about upcoming events",
|
"description": lib_plankton.translate.get("help.description"),
|
||||||
"executable": "node build/munin",
|
"executable": "node build/munin",
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if (args.conf_schema !== "") {
|
if (args.conf_schema) {
|
||||||
process.stdout.write(
|
process.stdout.write(
|
||||||
lib_plankton.json.encode(
|
lib_plankton.json.encode(
|
||||||
_munin.conf.schema((args.conf_schema === "_") ? undefined : args.conf_schema),
|
_munin.conf.schema_extended(),
|
||||||
{
|
{
|
||||||
"formatted": true,
|
"formatted": true,
|
||||||
}
|
}
|
||||||
|
|
|
@ -32,21 +32,46 @@ namespace _munin.targets.email
|
||||||
receivers : Array<string>;
|
receivers : Array<string>;
|
||||||
hide_tags : boolean;
|
hide_tags : boolean;
|
||||||
reminders : Array<_munin.type_reminder>;
|
reminders : Array<_munin.type_reminder>;
|
||||||
|
language : string;
|
||||||
|
strings : {
|
||||||
|
notification_head : string;
|
||||||
};
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
*/
|
||||||
|
function get_translation(
|
||||||
|
parameters : type_parameters,
|
||||||
|
path : string
|
||||||
|
) : string
|
||||||
|
{
|
||||||
|
return lib_plankton.translate.get_new(
|
||||||
|
path,
|
||||||
|
{
|
||||||
|
"preferred_language": parameters.language,
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*/
|
*/
|
||||||
function summarize_event(
|
function summarize_event(
|
||||||
parameters : type_parameters,
|
parameters : type_parameters,
|
||||||
labels : _munin.type_labels,
|
|
||||||
event : _munin.type_event
|
event : _munin.type_event
|
||||||
) : string
|
) : string
|
||||||
{
|
{
|
||||||
return lib_plankton.string.coin(
|
return lib_plankton.string.coin(
|
||||||
"[{{head}}] {{date}} : {{macro_tags}}{{title}}",
|
"[{{head}}] {{date}} : {{macro_tags}}{{title}}",
|
||||||
{
|
{
|
||||||
"head": labels.head,
|
"head": lib_plankton.string.coin(
|
||||||
|
"{{event}}-{{reminder}}",
|
||||||
|
{
|
||||||
|
"event": get_translation(parameters, "core.event.event").toLowerCase(),
|
||||||
|
"reminder": get_translation(parameters, "core.reminder.reminder").toLowerCase(),
|
||||||
|
}
|
||||||
|
),
|
||||||
"date": lib_plankton.pit.date_format(
|
"date": lib_plankton.pit.date_format(
|
||||||
event.begin.date
|
event.begin.date
|
||||||
),
|
),
|
||||||
|
@ -67,14 +92,13 @@ namespace _munin.targets.email
|
||||||
*/
|
*/
|
||||||
function render_event(
|
function render_event(
|
||||||
parameters : type_parameters,
|
parameters : type_parameters,
|
||||||
labels : _munin.type_labels,
|
|
||||||
event : _munin.type_event
|
event : _munin.type_event
|
||||||
) : string
|
) : string
|
||||||
{
|
{
|
||||||
return lib_plankton.string.coin(
|
return lib_plankton.string.coin(
|
||||||
"{{title_label}} | {{macro_tags}}{{title_value}}\n{{time_label}} | {{time_value}}{{macro_location}}{{macro_description}}",
|
"{{title_label}} | {{macro_tags}}{{title_value}}\n{{time_label}} | {{time_value}}{{macro_location}}{{macro_description}}",
|
||||||
{
|
{
|
||||||
"title_label": labels.title.toUpperCase(),
|
"title_label": get_translation(parameters, "core.event.title.short").toUpperCase(),
|
||||||
"macro_tags": (
|
"macro_tags": (
|
||||||
(parameters.hide_tags || (event.tags === null))
|
(parameters.hide_tags || (event.tags === null))
|
||||||
?
|
?
|
||||||
|
@ -83,7 +107,7 @@ namespace _munin.targets.email
|
||||||
(event.tags.map(tag => ("{" + tag + "}")).join(" ") + " ")
|
(event.tags.map(tag => ("{" + tag + "}")).join(" ") + " ")
|
||||||
),
|
),
|
||||||
"title_value": event.title,
|
"title_value": event.title,
|
||||||
"time_label": labels.time.toUpperCase(),
|
"time_label": get_translation(parameters, "core.event.time.short").toUpperCase(),
|
||||||
"time_value": lib_plankton.pit.timespan_format(
|
"time_value": lib_plankton.pit.timespan_format(
|
||||||
event.begin,
|
event.begin,
|
||||||
event.end,
|
event.end,
|
||||||
|
@ -99,7 +123,7 @@ namespace _munin.targets.email
|
||||||
lib_plankton.string.coin(
|
lib_plankton.string.coin(
|
||||||
"\n{{location_label}} | {{location_value}}",
|
"\n{{location_label}} | {{location_value}}",
|
||||||
{
|
{
|
||||||
"location_label": labels.location.toUpperCase(),
|
"location_label": get_translation(parameters, "core.event.location.short").toUpperCase(),
|
||||||
"location_value": event.location,
|
"location_value": event.location,
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
@ -126,7 +150,6 @@ namespace _munin.targets.email
|
||||||
*/
|
*/
|
||||||
async function send(
|
async function send(
|
||||||
parameters : type_parameters,
|
parameters : type_parameters,
|
||||||
labels : _munin.type_labels,
|
|
||||||
events : Array<_munin.type_event>
|
events : Array<_munin.type_event>
|
||||||
) : Promise<void>
|
) : Promise<void>
|
||||||
{
|
{
|
||||||
|
@ -142,21 +165,32 @@ namespace _munin.targets.email
|
||||||
(
|
(
|
||||||
(events.length === 1)
|
(events.length === 1)
|
||||||
?
|
?
|
||||||
summarize_event(parameters, labels, events[0])
|
summarize_event(parameters, events[0])
|
||||||
:
|
:
|
||||||
lib_plankton.string.coin(
|
lib_plankton.string.coin(
|
||||||
"[{{head}}] {{count}} {{events}}",
|
parameters.strings.notification_head,
|
||||||
|
{
|
||||||
|
"core": lib_plankton.string.coin(
|
||||||
|
"{{event}}-{{reminder}}",
|
||||||
|
{
|
||||||
|
"event": get_translation(parameters, "core.event.event").toLowerCase(),
|
||||||
|
"reminder": get_translation(parameters, "core.reminder.reminder").toLowerCase(),
|
||||||
|
}
|
||||||
|
),
|
||||||
|
"extra": lib_plankton.string.coin(
|
||||||
|
"{{count}} {{events}}",
|
||||||
{
|
{
|
||||||
"head": labels.head,
|
|
||||||
"count": events.length.toFixed(0),
|
"count": events.length.toFixed(0),
|
||||||
"events": labels.events,
|
"events": get_translation(parameters, "core.event.events"),
|
||||||
|
}
|
||||||
|
),
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
),
|
),
|
||||||
(
|
(
|
||||||
events
|
events
|
||||||
.map(event => render_event(parameters, labels, event))
|
.map(event => render_event(parameters, event))
|
||||||
.join("\n\n---\n\n")
|
.join("\n\n--------\n\n")
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -176,7 +210,7 @@ namespace _munin.targets.email
|
||||||
"receivers": parameters.receivers.join(","),
|
"receivers": parameters.receivers.join(","),
|
||||||
}
|
}
|
||||||
),
|
),
|
||||||
"send": (labels, events) => send(parameters, labels, events),
|
"send": (events) => send(parameters, events),
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -28,14 +28,33 @@ namespace _munin.targets.telegram_bot
|
||||||
chat_id : int;
|
chat_id : int;
|
||||||
hide_tags : boolean;
|
hide_tags : boolean;
|
||||||
reminders : Array<_munin.type_reminder>;
|
reminders : Array<_munin.type_reminder>;
|
||||||
|
language : string;
|
||||||
|
strings : {
|
||||||
|
notification_head : string;
|
||||||
};
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
*/
|
||||||
|
function get_translation(
|
||||||
|
parameters : type_parameters,
|
||||||
|
path : string
|
||||||
|
) : string
|
||||||
|
{
|
||||||
|
return lib_plankton.translate.get_new(
|
||||||
|
path,
|
||||||
|
{
|
||||||
|
"preferred_language": parameters.language,
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*/
|
*/
|
||||||
function render_event(
|
function render_event(
|
||||||
parameters : type_parameters,
|
parameters : type_parameters,
|
||||||
labels : _munin.type_labels,
|
|
||||||
event : _munin.type_event
|
event : _munin.type_event
|
||||||
) : string
|
) : string
|
||||||
{
|
{
|
||||||
|
@ -49,9 +68,9 @@ namespace _munin.targets.telegram_bot
|
||||||
:
|
:
|
||||||
(event.tags.map(tag => ("{" + tag + "}")).join(" ") + " ")
|
(event.tags.map(tag => ("{" + tag + "}")).join(" ") + " ")
|
||||||
),
|
),
|
||||||
"title_label": labels.title.toUpperCase(),
|
"title_label": get_translation(parameters, "core.event.title.short").toUpperCase(),
|
||||||
"title_value": event.title,
|
"title_value": event.title,
|
||||||
"time_label": labels.time.toUpperCase(),
|
"time_label": get_translation(parameters, "core.event.time.short").toUpperCase(),
|
||||||
"time_value": lib_plankton.pit.timespan_format(
|
"time_value": lib_plankton.pit.timespan_format(
|
||||||
event.begin,
|
event.begin,
|
||||||
event.end,
|
event.end,
|
||||||
|
@ -67,7 +86,7 @@ namespace _munin.targets.telegram_bot
|
||||||
lib_plankton.string.coin(
|
lib_plankton.string.coin(
|
||||||
"\n{{location_label}} | {{location_value}}",
|
"\n{{location_label}} | {{location_value}}",
|
||||||
{
|
{
|
||||||
"location_label": labels.location.toUpperCase(),
|
"location_label": get_translation(parameters, "core.event.location.short").toUpperCase(),
|
||||||
"location_value": event.location,
|
"location_value": event.location,
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
@ -93,7 +112,6 @@ namespace _munin.targets.telegram_bot
|
||||||
*/
|
*/
|
||||||
async function send(
|
async function send(
|
||||||
parameters : type_parameters,
|
parameters : type_parameters,
|
||||||
labels : _munin.type_labels,
|
|
||||||
events : Array<_munin.type_event>
|
events : Array<_munin.type_event>
|
||||||
) : Promise<void>
|
) : Promise<void>
|
||||||
{
|
{
|
||||||
|
@ -101,10 +119,19 @@ namespace _munin.targets.telegram_bot
|
||||||
parameters.bot_token,
|
parameters.bot_token,
|
||||||
parameters.chat_id,
|
parameters.chat_id,
|
||||||
lib_plankton.string.coin(
|
lib_plankton.string.coin(
|
||||||
"*{{head_core}}{{head_extra}}*\n\n{{events}}",
|
"*{{head}}*\n\n{{body}}",
|
||||||
{
|
{
|
||||||
"head_core": labels.head,
|
"head": lib_plankton.string.coin(
|
||||||
"head_extra": (
|
parameters.strings.notification_head,
|
||||||
|
{
|
||||||
|
"core": lib_plankton.string.coin(
|
||||||
|
"{{label_event}}-{{label_reminder}}",
|
||||||
|
{
|
||||||
|
"label_event": lib_plankton.string.capitalize(get_translation(parameters, "core.event.event")),
|
||||||
|
"label_reminder": lib_plankton.string.capitalize(get_translation(parameters, "core.reminder.reminder")),
|
||||||
|
}
|
||||||
|
),
|
||||||
|
"extra": (
|
||||||
(events.length <= 1)
|
(events.length <= 1)
|
||||||
?
|
?
|
||||||
""
|
""
|
||||||
|
@ -113,14 +140,16 @@ namespace _munin.targets.telegram_bot
|
||||||
" ({{count}} {{events}})",
|
" ({{count}} {{events}})",
|
||||||
{
|
{
|
||||||
"count": events.length.toFixed(0),
|
"count": events.length.toFixed(0),
|
||||||
"events": labels.events,
|
"events": get_translation(parameters, "core.event.events"),
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
),
|
),
|
||||||
"events": (
|
}
|
||||||
|
),
|
||||||
|
"body": (
|
||||||
events
|
events
|
||||||
.map(event => render_event(parameters, labels, event))
|
.map(event => render_event(parameters, event))
|
||||||
.join("\n\n---\n\n")
|
.join("\n\n--------\n\n")
|
||||||
),
|
),
|
||||||
}
|
}
|
||||||
),
|
),
|
||||||
|
@ -145,7 +174,7 @@ namespace _munin.targets.telegram_bot
|
||||||
"chat_id": parameters.chat_id.toFixed(0),
|
"chat_id": parameters.chat_id.toFixed(0),
|
||||||
}
|
}
|
||||||
),
|
),
|
||||||
"send": (labels, events) => send(parameters, labels, events),
|
"send": (events) => send(parameters, events),
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -67,7 +67,7 @@ namespace _munin.test
|
||||||
type_output
|
type_output
|
||||||
>
|
>
|
||||||
> = await _munin.helpers.test.get_data<type_input, type_output>(
|
> = await _munin.helpers.test.get_data<type_input, type_output>(
|
||||||
"data/reminder_check.testdata.json",
|
"data/test/reminder_check.testdata.json",
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
|
@ -31,17 +31,6 @@ namespace _munin
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
*/
|
|
||||||
export type type_labels = {
|
|
||||||
head : string;
|
|
||||||
title : string;
|
|
||||||
time : string;
|
|
||||||
location : string;
|
|
||||||
events : string;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*/
|
*/
|
||||||
export type type_event = {
|
export type type_event = {
|
||||||
|
@ -83,10 +72,7 @@ namespace _munin
|
||||||
reminders : Array<type_reminder>;
|
reminders : Array<type_reminder>;
|
||||||
show : (() => string);
|
show : (() => string);
|
||||||
send : (
|
send : (
|
||||||
(
|
(events : Array<type_event>)
|
||||||
labels : type_labels,
|
|
||||||
events : Array<type_event>
|
|
||||||
)
|
|
||||||
=>
|
=>
|
||||||
Promise<void>
|
Promise<void>
|
||||||
);
|
);
|
||||||
|
|
Loading…
Reference in a new issue