easyoref 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +127 -0
- package/dist/bin.d.ts +9 -0
- package/dist/bin.d.ts.map +1 -0
- package/dist/bin.js +25 -0
- package/dist/bin.js.map +1 -0
- package/dist/bot.d.ts +16 -0
- package/dist/bot.d.ts.map +1 -0
- package/dist/bot.js +481 -0
- package/dist/bot.js.map +1 -0
- package/dist/config.d.ts +72 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +120 -0
- package/dist/config.js.map +1 -0
- package/dist/gif-state.d.ts +17 -0
- package/dist/gif-state.d.ts.map +1 -0
- package/dist/gif-state.js +67 -0
- package/dist/gif-state.js.map +1 -0
- package/dist/i18n.d.ts +37 -0
- package/dist/i18n.d.ts.map +1 -0
- package/dist/i18n.js +240 -0
- package/dist/i18n.js.map +1 -0
- package/dist/init.d.ts +7 -0
- package/dist/init.d.ts.map +1 -0
- package/dist/init.js +163 -0
- package/dist/init.js.map +1 -0
- package/dist/logger.d.ts +14 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +45 -0
- package/dist/logger.js.map +1 -0
- package/package.json +60 -0
package/dist/config.js
ADDED
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* EasyOref — Centralized Configuration
|
|
3
|
+
*
|
|
4
|
+
* Primary: config.yaml (searched in cwd, /app, /etc/easyoref)
|
|
5
|
+
* Fallback: environment variables + Docker secrets (for backward compat)
|
|
6
|
+
*
|
|
7
|
+
* See config.yaml.example for all available options.
|
|
8
|
+
*/
|
|
9
|
+
import yaml from "js-yaml";
|
|
10
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
11
|
+
import { homedir } from "node:os";
|
|
12
|
+
import { join, resolve } from "node:path";
|
|
13
|
+
import { isValidLanguage } from "./i18n.js";
|
|
14
|
+
const VALID_GIF_MODES = [
|
|
15
|
+
"funny_cats",
|
|
16
|
+
"assertive",
|
|
17
|
+
"pikud_haoref",
|
|
18
|
+
"none",
|
|
19
|
+
];
|
|
20
|
+
const ALL_ALERT_TYPES = ["early", "siren", "incident_over"];
|
|
21
|
+
// ── YAML Loader ──────────────────────────────────────────
|
|
22
|
+
/** Config dir in user home — ~/.easyoref/ */
|
|
23
|
+
export const CONFIG_DIR = join(homedir(), ".easyoref");
|
|
24
|
+
export const HOME_CONFIG_PATH = join(CONFIG_DIR, "config.yaml");
|
|
25
|
+
const CONFIG_SEARCH_PATHS = [
|
|
26
|
+
HOME_CONFIG_PATH,
|
|
27
|
+
"config.yaml",
|
|
28
|
+
"config.yml",
|
|
29
|
+
"/app/config.yaml",
|
|
30
|
+
"/etc/easyoref/config.yaml",
|
|
31
|
+
];
|
|
32
|
+
function findConfigFile() {
|
|
33
|
+
const envPath = process.env.EASYOREF_CONFIG;
|
|
34
|
+
if (envPath && existsSync(envPath))
|
|
35
|
+
return envPath;
|
|
36
|
+
for (const p of CONFIG_SEARCH_PATHS) {
|
|
37
|
+
const abs = resolve(p);
|
|
38
|
+
if (existsSync(abs))
|
|
39
|
+
return abs;
|
|
40
|
+
}
|
|
41
|
+
return null;
|
|
42
|
+
}
|
|
43
|
+
function loadYaml() {
|
|
44
|
+
const path = findConfigFile();
|
|
45
|
+
if (path) {
|
|
46
|
+
try {
|
|
47
|
+
const raw = readFileSync(path, "utf-8");
|
|
48
|
+
const parsed = yaml.load(raw);
|
|
49
|
+
// eslint-disable-next-line no-console
|
|
50
|
+
console.log(`[config] Loaded from ${path}`);
|
|
51
|
+
return parsed ?? {};
|
|
52
|
+
}
|
|
53
|
+
catch (err) {
|
|
54
|
+
// eslint-disable-next-line no-console
|
|
55
|
+
console.error(`[config] Failed to parse ${path}:`, err);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
return {};
|
|
59
|
+
}
|
|
60
|
+
// ── Helpers ──────────────────────────────────────────────
|
|
61
|
+
function readSecret(envKey, secretPaths) {
|
|
62
|
+
for (const p of secretPaths) {
|
|
63
|
+
if (existsSync(p))
|
|
64
|
+
return readFileSync(p, "utf-8").trim();
|
|
65
|
+
}
|
|
66
|
+
return process.env[envKey] ?? "";
|
|
67
|
+
}
|
|
68
|
+
function parseGifMode(raw) {
|
|
69
|
+
const lower = raw.toLowerCase();
|
|
70
|
+
return VALID_GIF_MODES.includes(lower) ? lower : "none";
|
|
71
|
+
}
|
|
72
|
+
function parseAlertTypes(raw) {
|
|
73
|
+
if (!raw || !Array.isArray(raw))
|
|
74
|
+
return ALL_ALERT_TYPES;
|
|
75
|
+
return raw.filter((t) => ALL_ALERT_TYPES.includes(t));
|
|
76
|
+
}
|
|
77
|
+
// ── Build Config ─────────────────────────────────────────
|
|
78
|
+
const yml = loadYaml();
|
|
79
|
+
export const config = {
|
|
80
|
+
/** Telegram bot token */
|
|
81
|
+
botToken: yml.telegram?.bot_token ??
|
|
82
|
+
readSecret("BOT_TOKEN", ["/run/secrets/bot_token", "secrets/bot_token"]),
|
|
83
|
+
/** Telegram chat ID */
|
|
84
|
+
chatId: yml.telegram?.chat_id ?? process.env.CHAT_ID ?? "",
|
|
85
|
+
/** City IDs to monitor (resolved to Hebrew names at startup via cities.json) */
|
|
86
|
+
cityIds: yml.city_ids ?? [],
|
|
87
|
+
/**
|
|
88
|
+
* Hebrew area names — legacy fallback for AREAS env var.
|
|
89
|
+
* Populated at startup from cityIds OR from AREAS env if no cityIds.
|
|
90
|
+
*/
|
|
91
|
+
areas: [],
|
|
92
|
+
/** Which alert types to send */
|
|
93
|
+
alertTypes: parseAlertTypes(yml.alert_types),
|
|
94
|
+
/** Message language */
|
|
95
|
+
language: (() => {
|
|
96
|
+
const raw = (yml.language ?? process.env.LANGUAGE ?? "ru").toLowerCase();
|
|
97
|
+
return isValidLanguage(raw) ? raw : "ru";
|
|
98
|
+
})(),
|
|
99
|
+
/** Title overrides per alert type */
|
|
100
|
+
titleOverride: yml.title_override ?? {},
|
|
101
|
+
/** Description overrides per alert type */
|
|
102
|
+
descriptionOverride: yml.description_override ?? {},
|
|
103
|
+
/** Oref API polling interval (ms) */
|
|
104
|
+
pollIntervalMs: yml.poll_interval_ms ?? Number(process.env.OREF_POLL_INTERVAL_MS ?? "2000"),
|
|
105
|
+
/** Health endpoint port */
|
|
106
|
+
healthPort: yml.health_port ?? Number(process.env.HEALTH_PORT ?? "3100"),
|
|
107
|
+
/** Oref API URL */
|
|
108
|
+
orefApiUrl: yml.oref_api_url ??
|
|
109
|
+
process.env.OREF_API_URL ??
|
|
110
|
+
"https://www.oref.org.il/WarningMessages/alert/alerts.json",
|
|
111
|
+
/** Better Stack Logtail token */
|
|
112
|
+
logtailToken: yml.observability?.betterstack_token ?? process.env.LOGTAIL_TOKEN ?? "",
|
|
113
|
+
/** GIF mode */
|
|
114
|
+
gifMode: parseGifMode(yml.gif_mode ?? process.env.GIF_MODE ?? "none"),
|
|
115
|
+
/** Path for persistent data */
|
|
116
|
+
dataDir: yml.data_dir ?? process.env.DATA_DIR ?? join(CONFIG_DIR, "data"),
|
|
117
|
+
};
|
|
118
|
+
/** Exported for testing */
|
|
119
|
+
export { loadYaml as _loadYaml, parseAlertTypes as _parseAlertTypes, };
|
|
120
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* EasyOref — Persistent GIF Rotation State
|
|
3
|
+
*
|
|
4
|
+
* Stores which GIFs have been shown to avoid repeats.
|
|
5
|
+
* State survives restarts + redeploys via JSON file.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Initialize persistent GIF state.
|
|
9
|
+
* @param dataDir — directory for state file (created if missing)
|
|
10
|
+
*/
|
|
11
|
+
export declare function initGifState(dataDir: string): void;
|
|
12
|
+
/**
|
|
13
|
+
* Pick a GIF from a pool without repeats.
|
|
14
|
+
* When all GIFs in the pool have been shown, reshuffles.
|
|
15
|
+
*/
|
|
16
|
+
export declare function pickGif(pool: string[], poolKey: string): string;
|
|
17
|
+
//# sourceMappingURL=gif-state.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gif-state.d.ts","sourceRoot":"","sources":["../src/gif-state.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAkBH;;;GAGG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CA4BlD;AAWD;;;GAGG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAS/D"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* EasyOref — Persistent GIF Rotation State
|
|
3
|
+
*
|
|
4
|
+
* Stores which GIFs have been shown to avoid repeats.
|
|
5
|
+
* State survives restarts + redeploys via JSON file.
|
|
6
|
+
*/
|
|
7
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
8
|
+
import { join } from "node:path";
|
|
9
|
+
import * as logger from "./logger.js";
|
|
10
|
+
let gifBags = {};
|
|
11
|
+
let stateFilePath = "";
|
|
12
|
+
/**
|
|
13
|
+
* Initialize persistent GIF state.
|
|
14
|
+
* @param dataDir — directory for state file (created if missing)
|
|
15
|
+
*/
|
|
16
|
+
export function initGifState(dataDir) {
|
|
17
|
+
stateFilePath = join(dataDir, "gif-state.json");
|
|
18
|
+
try {
|
|
19
|
+
mkdirSync(dataDir, { recursive: true });
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
// dir may already exist
|
|
23
|
+
}
|
|
24
|
+
if (existsSync(stateFilePath)) {
|
|
25
|
+
try {
|
|
26
|
+
const raw = readFileSync(stateFilePath, "utf-8");
|
|
27
|
+
const parsed = JSON.parse(raw);
|
|
28
|
+
if (parsed.version === 1 && parsed.bags) {
|
|
29
|
+
gifBags = parsed.bags;
|
|
30
|
+
logger.info("GIF state loaded", {
|
|
31
|
+
pools: Object.keys(gifBags).length,
|
|
32
|
+
path: stateFilePath,
|
|
33
|
+
});
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
logger.warn("Corrupt gif-state.json — starting fresh");
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
gifBags = {};
|
|
42
|
+
persist();
|
|
43
|
+
}
|
|
44
|
+
function persist() {
|
|
45
|
+
try {
|
|
46
|
+
const state = { version: 1, bags: gifBags };
|
|
47
|
+
writeFileSync(stateFilePath, JSON.stringify(state, null, 2), "utf-8");
|
|
48
|
+
}
|
|
49
|
+
catch (err) {
|
|
50
|
+
logger.warn("Failed to persist GIF state", { error: String(err) });
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Pick a GIF from a pool without repeats.
|
|
55
|
+
* When all GIFs in the pool have been shown, reshuffles.
|
|
56
|
+
*/
|
|
57
|
+
export function pickGif(pool, poolKey) {
|
|
58
|
+
let bag = gifBags[poolKey];
|
|
59
|
+
if (!bag || bag.length === 0) {
|
|
60
|
+
bag = [...pool].sort(() => Math.random() - 0.5);
|
|
61
|
+
gifBags[poolKey] = bag;
|
|
62
|
+
}
|
|
63
|
+
const gif = bag.pop();
|
|
64
|
+
persist();
|
|
65
|
+
return gif;
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=gif-state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gif-state.js","sourceRoot":"","sources":["../src/gif-state.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,KAAK,MAAM,MAAM,aAAa,CAAC;AAWtC,IAAI,OAAO,GAAY,EAAE,CAAC;AAC1B,IAAI,aAAa,GAAG,EAAE,CAAC;AAEvB;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,OAAe;IAC1C,aAAa,GAAG,IAAI,CAAC,OAAO,EAAE,gBAAgB,CAAC,CAAC;IAEhD,IAAI,CAAC;QACH,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1C,CAAC;IAAC,MAAM,CAAC;QACP,wBAAwB;IAC1B,CAAC;IAED,IAAI,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;QAC9B,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,YAAY,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;YACjD,MAAM,MAAM,GAAiB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAiB,CAAC;YAC7D,IAAI,MAAM,CAAC,OAAO,KAAK,CAAC,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;gBACxC,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC;gBACtB,MAAM,CAAC,IAAI,CAAC,kBAAkB,EAAE;oBAC9B,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM;oBAClC,IAAI,EAAE,aAAa;iBACpB,CAAC,CAAC;gBACH,OAAO;YACT,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,CAAC,IAAI,CAAC,yCAAyC,CAAC,CAAC;QACzD,CAAC;IACH,CAAC;IAED,OAAO,GAAG,EAAE,CAAC;IACb,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,SAAS,OAAO;IACd,IAAI,CAAC;QACH,MAAM,KAAK,GAAiB,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;QAC1D,aAAa,CAAC,aAAa,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IACxE,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,CAAC,IAAI,CAAC,6BAA6B,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACrE,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,OAAO,CAAC,IAAc,EAAE,OAAe;IACrD,IAAI,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC3B,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7B,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC;QAChD,OAAO,CAAC,OAAO,CAAC,GAAG,GAAG,CAAC;IACzB,CAAC;IACD,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,EAAG,CAAC;IACvB,OAAO,EAAE,CAAC;IACV,OAAO,GAAG,CAAC;AACb,CAAC"}
|
package/dist/i18n.d.ts
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* EasyOref — Internationalization (i18n)
|
|
3
|
+
*
|
|
4
|
+
* Supported languages: Russian (ru), English (en), Hebrew (he), Arabic (ar)
|
|
5
|
+
* Default: ru (built for diaspora families)
|
|
6
|
+
*
|
|
7
|
+
* Message format:
|
|
8
|
+
* <b>🚀 Title</b>
|
|
9
|
+
* Description
|
|
10
|
+
* <blockquote>
|
|
11
|
+
* <b>Key:</b> Value
|
|
12
|
+
* ...
|
|
13
|
+
* </blockquote>
|
|
14
|
+
*/
|
|
15
|
+
export type Language = "ru" | "en" | "he" | "ar";
|
|
16
|
+
export interface MessageTemplates {
|
|
17
|
+
earlyWarning: (areas: string, time: string) => string;
|
|
18
|
+
siren: (areas: string, time: string) => string;
|
|
19
|
+
resolved: (areas: string) => string;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Load and cache translations from pikud-haoref-api.
|
|
23
|
+
* Must be called once at startup (before first alert).
|
|
24
|
+
* Falls back silently to Hebrew names on fetch failure.
|
|
25
|
+
*/
|
|
26
|
+
export declare function initTranslations(): Promise<void>;
|
|
27
|
+
/** Translate comma-separated Hebrew area names to target language */
|
|
28
|
+
export declare function translateAreas(areas: string, lang: Language): string;
|
|
29
|
+
/**
|
|
30
|
+
* Resolve numeric city IDs to Hebrew area names.
|
|
31
|
+
* Call AFTER initTranslations().
|
|
32
|
+
* Unknown IDs are logged as warnings and skipped.
|
|
33
|
+
*/
|
|
34
|
+
export declare function resolveCityIds(ids: number[]): string[];
|
|
35
|
+
export declare function getTemplates(lang: Language): MessageTemplates;
|
|
36
|
+
export declare function isValidLanguage(s: string): s is Language;
|
|
37
|
+
//# sourceMappingURL=i18n.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"i18n.d.ts","sourceRoot":"","sources":["../src/i18n.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,MAAM,MAAM,QAAQ,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAEjD,MAAM,WAAW,gBAAgB;IAC/B,YAAY,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;IACtD,KAAK,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;IAC/C,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;CACrC;AA+LD;;;;GAIG;AACH,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC,CAoCtD;AAED,qEAAqE;AACrE,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,GAAG,MAAM,CAapE;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAYtD;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,QAAQ,GAAG,gBAAgB,CAE7D;AAED,wBAAgB,eAAe,CAAC,CAAC,EAAE,MAAM,GAAG,CAAC,IAAI,QAAQ,CAExD"}
|
package/dist/i18n.js
ADDED
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* EasyOref — Internationalization (i18n)
|
|
3
|
+
*
|
|
4
|
+
* Supported languages: Russian (ru), English (en), Hebrew (he), Arabic (ar)
|
|
5
|
+
* Default: ru (built for diaspora families)
|
|
6
|
+
*
|
|
7
|
+
* Message format:
|
|
8
|
+
* <b>🚀 Title</b>
|
|
9
|
+
* Description
|
|
10
|
+
* <blockquote>
|
|
11
|
+
* <b>Key:</b> Value
|
|
12
|
+
* ...
|
|
13
|
+
* </blockquote>
|
|
14
|
+
*/
|
|
15
|
+
// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
16
|
+
// Message Templates — HTML with blockquote
|
|
17
|
+
// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
18
|
+
const ru = {
|
|
19
|
+
earlyWarning: (areas, time) => [
|
|
20
|
+
"<b>🚀 Раннее предупреждение</b>",
|
|
21
|
+
"Зафиксированы запуски ракет. Находитесь рядом с защищённым помещением.",
|
|
22
|
+
"",
|
|
23
|
+
"<blockquote>",
|
|
24
|
+
`<b>Район:</b> ${areas}`,
|
|
25
|
+
`<b>Подлётное время:</b> ~5–12 мин`,
|
|
26
|
+
`<b>Время:</b> ${time}`,
|
|
27
|
+
"</blockquote>",
|
|
28
|
+
].join("\n"),
|
|
29
|
+
siren: (areas, time) => [
|
|
30
|
+
"<b>🚨 Сирена</b>",
|
|
31
|
+
"Войдите в защищённое помещение.",
|
|
32
|
+
"",
|
|
33
|
+
"<blockquote>",
|
|
34
|
+
`<b>Район:</b> ${areas}`,
|
|
35
|
+
`<b>Подлётное время:</b> ~1.5 мин`,
|
|
36
|
+
`<b>Время:</b> ${time}`,
|
|
37
|
+
"</blockquote>",
|
|
38
|
+
].join("\n"),
|
|
39
|
+
resolved: (areas) => [
|
|
40
|
+
"<b>😮💨 Инцидент завершён</b>",
|
|
41
|
+
"Можно покинуть защищённое помещение.",
|
|
42
|
+
"",
|
|
43
|
+
"<blockquote>",
|
|
44
|
+
`<b>Район:</b> ${areas}`,
|
|
45
|
+
"</blockquote>",
|
|
46
|
+
].join("\n"),
|
|
47
|
+
};
|
|
48
|
+
const en = {
|
|
49
|
+
earlyWarning: (areas, time) => [
|
|
50
|
+
"<b>🚀 Early Warning</b>",
|
|
51
|
+
"Rocket launches detected. Stay near a protected space.",
|
|
52
|
+
"",
|
|
53
|
+
"<blockquote>",
|
|
54
|
+
`<b>Area:</b> ${areas}`,
|
|
55
|
+
`<b>Time to impact:</b> ~5–12 min`,
|
|
56
|
+
`<b>Time:</b> ${time}`,
|
|
57
|
+
"</blockquote>",
|
|
58
|
+
].join("\n"),
|
|
59
|
+
siren: (areas, time) => [
|
|
60
|
+
"<b>🚨 Siren Alert</b>",
|
|
61
|
+
"Enter a protected space immediately.",
|
|
62
|
+
"",
|
|
63
|
+
"<blockquote>",
|
|
64
|
+
`<b>Area:</b> ${areas}`,
|
|
65
|
+
`<b>Time to impact:</b> ~1.5 min`,
|
|
66
|
+
`<b>Time:</b> ${time}`,
|
|
67
|
+
"</blockquote>",
|
|
68
|
+
].join("\n"),
|
|
69
|
+
resolved: (areas) => [
|
|
70
|
+
"<b>😮💨 Incident Over</b>",
|
|
71
|
+
"You may leave the protected space.",
|
|
72
|
+
"",
|
|
73
|
+
"<blockquote>",
|
|
74
|
+
`<b>Area:</b> ${areas}`,
|
|
75
|
+
"</blockquote>",
|
|
76
|
+
].join("\n"),
|
|
77
|
+
};
|
|
78
|
+
const he = {
|
|
79
|
+
earlyWarning: (areas, time) => [
|
|
80
|
+
"<b>🚀 התרעה מוקדמת</b>",
|
|
81
|
+
"זוהו שיגורים. הישארו בקרבת מרחב מוגן.",
|
|
82
|
+
"",
|
|
83
|
+
"<blockquote>",
|
|
84
|
+
`<b>אזור:</b> ${areas}`,
|
|
85
|
+
`<b>זמן מעוף:</b> ~5–12 דקות`,
|
|
86
|
+
`<b>שעה:</b> ${time}`,
|
|
87
|
+
"</blockquote>",
|
|
88
|
+
].join("\n"),
|
|
89
|
+
siren: (areas, time) => [
|
|
90
|
+
"<b>🚨 צבע אדום</b>",
|
|
91
|
+
"היכנסו למרחב מוגן.",
|
|
92
|
+
"",
|
|
93
|
+
"<blockquote>",
|
|
94
|
+
`<b>אזור:</b> ${areas}`,
|
|
95
|
+
`<b>זמן מעוף:</b> ~1.5 דקות`,
|
|
96
|
+
`<b>שעה:</b> ${time}`,
|
|
97
|
+
"</blockquote>",
|
|
98
|
+
].join("\n"),
|
|
99
|
+
resolved: (areas) => [
|
|
100
|
+
"<b>😮💨 האירוע הסתיים</b>",
|
|
101
|
+
"ניתן לצאת מהמרחב המוגן.",
|
|
102
|
+
"",
|
|
103
|
+
"<blockquote>",
|
|
104
|
+
`<b>אזור:</b> ${areas}`,
|
|
105
|
+
"</blockquote>",
|
|
106
|
+
].join("\n"),
|
|
107
|
+
};
|
|
108
|
+
const ar = {
|
|
109
|
+
earlyWarning: (areas, time) => [
|
|
110
|
+
"<b>🚀 إنذار مبكر</b>",
|
|
111
|
+
"تم رصد إطلاق صواريخ. ابقوا بالقرب من الملجأ.",
|
|
112
|
+
"",
|
|
113
|
+
"<blockquote>",
|
|
114
|
+
`<b>المنطقة:</b> ${areas}`,
|
|
115
|
+
`<b>وقت الوصول:</b> ~5–12 دقيقة`,
|
|
116
|
+
`<b>الوقت:</b> ${time}`,
|
|
117
|
+
"</blockquote>",
|
|
118
|
+
].join("\n"),
|
|
119
|
+
siren: (areas, time) => [
|
|
120
|
+
"<b>🚨 صفارة إنذار</b>",
|
|
121
|
+
"ادخلوا إلى الملجأ فوراً.",
|
|
122
|
+
"",
|
|
123
|
+
"<blockquote>",
|
|
124
|
+
`<b>المنطقة:</b> ${areas}`,
|
|
125
|
+
`<b>وقت الوصول:</b> ~1.5 دقيقة`,
|
|
126
|
+
`<b>الوقت:</b> ${time}`,
|
|
127
|
+
"</blockquote>",
|
|
128
|
+
].join("\n"),
|
|
129
|
+
resolved: (areas) => [
|
|
130
|
+
"<b>😮💨 انتهى الحادث</b>",
|
|
131
|
+
"يمكنكم مغادرة الملجأ.",
|
|
132
|
+
"",
|
|
133
|
+
"<blockquote>",
|
|
134
|
+
`<b>المنطقة:</b> ${areas}`,
|
|
135
|
+
"</blockquote>",
|
|
136
|
+
].join("\n"),
|
|
137
|
+
};
|
|
138
|
+
const templates = { ru, en, he, ar };
|
|
139
|
+
// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
140
|
+
// Area Name Translation — loaded from pikud-haoref-api/cities.json
|
|
141
|
+
// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
142
|
+
const CITIES_JSON_URL = "https://raw.githubusercontent.com/eladnava/pikud-haoref-api/master/cities.json";
|
|
143
|
+
/** Hebrew city name → { en, ru, ar } */
|
|
144
|
+
const cityMap = new Map();
|
|
145
|
+
/** Hebrew zone name → { en, ru, ar } */
|
|
146
|
+
const zoneMap = new Map();
|
|
147
|
+
/** City ID → Hebrew name (for YAML city_ids resolution) */
|
|
148
|
+
const idToNameMap = new Map();
|
|
149
|
+
/**
|
|
150
|
+
* Known bad translations in upstream cities.json.
|
|
151
|
+
* Applied as post-processing corrections after loading.
|
|
152
|
+
* Key: Hebrew name, Value: { lang: corrected_name }
|
|
153
|
+
*/
|
|
154
|
+
const TRANSLATION_FIXES = {
|
|
155
|
+
"תל אביב - דרום העיר ויפו": {
|
|
156
|
+
ru: "Тель-Авив — Южный район и Яффо",
|
|
157
|
+
},
|
|
158
|
+
};
|
|
159
|
+
/**
|
|
160
|
+
* Load and cache translations from pikud-haoref-api.
|
|
161
|
+
* Must be called once at startup (before first alert).
|
|
162
|
+
* Falls back silently to Hebrew names on fetch failure.
|
|
163
|
+
*/
|
|
164
|
+
export async function initTranslations() {
|
|
165
|
+
try {
|
|
166
|
+
const res = await fetch(CITIES_JSON_URL);
|
|
167
|
+
if (!res.ok)
|
|
168
|
+
throw new Error(`HTTP ${res.status}`);
|
|
169
|
+
const data = (await res.json());
|
|
170
|
+
for (const c of data) {
|
|
171
|
+
if (!c.name || c.name === "בחר הכל")
|
|
172
|
+
continue;
|
|
173
|
+
cityMap.set(c.name, { en: c.name_en, ru: c.name_ru, ar: c.name_ar });
|
|
174
|
+
if (c.id)
|
|
175
|
+
idToNameMap.set(c.id, c.name);
|
|
176
|
+
if (c.zone && !zoneMap.has(c.zone)) {
|
|
177
|
+
zoneMap.set(c.zone, { en: c.zone_en, ru: c.zone_ru, ar: c.zone_ar });
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
// Apply known corrections over upstream data
|
|
181
|
+
for (const [heName, fixes] of Object.entries(TRANSLATION_FIXES)) {
|
|
182
|
+
const existing = cityMap.get(heName);
|
|
183
|
+
if (existing) {
|
|
184
|
+
for (const [lang, corrected] of Object.entries(fixes)) {
|
|
185
|
+
existing[lang] = corrected;
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
// eslint-disable-next-line no-console
|
|
190
|
+
console.log(`[i18n] Loaded ${cityMap.size} city + ${zoneMap.size} zone translations`);
|
|
191
|
+
}
|
|
192
|
+
catch (err) {
|
|
193
|
+
// eslint-disable-next-line no-console
|
|
194
|
+
console.warn("[i18n] Failed to load cities.json — area names will stay in Hebrew", err);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
/** Translate comma-separated Hebrew area names to target language */
|
|
198
|
+
export function translateAreas(areas, lang) {
|
|
199
|
+
if (lang === "he")
|
|
200
|
+
return areas;
|
|
201
|
+
const key = lang;
|
|
202
|
+
return areas
|
|
203
|
+
.split(", ")
|
|
204
|
+
.map((a) => {
|
|
205
|
+
const city = cityMap.get(a);
|
|
206
|
+
if (city?.[key])
|
|
207
|
+
return city[key];
|
|
208
|
+
const zone = zoneMap.get(a);
|
|
209
|
+
if (zone?.[key])
|
|
210
|
+
return zone[key];
|
|
211
|
+
return a; // fallback: Hebrew as-is
|
|
212
|
+
})
|
|
213
|
+
.join(", ");
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Resolve numeric city IDs to Hebrew area names.
|
|
217
|
+
* Call AFTER initTranslations().
|
|
218
|
+
* Unknown IDs are logged as warnings and skipped.
|
|
219
|
+
*/
|
|
220
|
+
export function resolveCityIds(ids) {
|
|
221
|
+
const names = [];
|
|
222
|
+
for (const id of ids) {
|
|
223
|
+
const name = idToNameMap.get(id);
|
|
224
|
+
if (name) {
|
|
225
|
+
names.push(name);
|
|
226
|
+
}
|
|
227
|
+
else {
|
|
228
|
+
// eslint-disable-next-line no-console
|
|
229
|
+
console.warn(`[i18n] Unknown city ID: ${id} — skipping`);
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
return names;
|
|
233
|
+
}
|
|
234
|
+
export function getTemplates(lang) {
|
|
235
|
+
return templates[lang] ?? templates.ru;
|
|
236
|
+
}
|
|
237
|
+
export function isValidLanguage(s) {
|
|
238
|
+
return s === "ru" || s === "en" || s === "he" || s === "ar";
|
|
239
|
+
}
|
|
240
|
+
//# sourceMappingURL=i18n.js.map
|
package/dist/i18n.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"i18n.js","sourceRoot":"","sources":["../src/i18n.ts"],"names":[],"mappings":"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"}
|
package/dist/init.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AASH,wBAAsB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAsF1C"}
|