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/dist/init.js ADDED
@@ -0,0 +1,163 @@
1
+ /**
2
+ * `npx easyoref init` β€” Interactive setup wizard.
3
+ *
4
+ * Asks 4 questions, writes ~/.easyoref/config.yaml.
5
+ */
6
+ import { confirm, input, password, select } from "@inquirer/prompts";
7
+ import chalk from "chalk";
8
+ import { Bot } from "grammy";
9
+ import yaml from "js-yaml";
10
+ import { existsSync, mkdirSync, writeFileSync } from "node:fs";
11
+ import { CONFIG_DIR, HOME_CONFIG_PATH } from "./config.js";
12
+ export async function init() {
13
+ console.log(chalk.bold("\n🚨 EasyOref Setup\n"));
14
+ // ── Guard: config already exists ─────────────────────
15
+ if (existsSync(HOME_CONFIG_PATH)) {
16
+ const overwrite = await confirm({
17
+ message: `${HOME_CONFIG_PATH} already exists. Overwrite?`,
18
+ default: false,
19
+ });
20
+ if (!overwrite) {
21
+ console.log(chalk.dim("Cancelled."));
22
+ return;
23
+ }
24
+ }
25
+ // ── 1. Language ──────────────────────────────────────
26
+ const language = await select({
27
+ message: "🌍 Language / Π―Π·Ρ‹ΠΊ / Χ©Χ€Χ”:",
28
+ choices: [
29
+ { name: "Русский", value: "ru" },
30
+ { name: "English", value: "en" },
31
+ { name: "Χ’Χ‘Χ¨Χ™Χͺ", value: "he" },
32
+ { name: "Ψ§Ω„ΨΉΨ±Ψ¨ΩŠΨ©", value: "ar" },
33
+ ],
34
+ });
35
+ const t = STRINGS[language] ?? STRINGS.en;
36
+ // ── 2. Bot Token ─────────────────────────────────────
37
+ const botToken = await password({
38
+ message: t.token,
39
+ validate: (val) => {
40
+ if (!val || val.length < 10)
41
+ return t.tokenRequired;
42
+ if (!val.includes(":"))
43
+ return t.tokenFormat;
44
+ return true;
45
+ },
46
+ });
47
+ console.log(chalk.dim(t.validating));
48
+ try {
49
+ const bot = new Bot(botToken);
50
+ const me = await bot.api.getMe();
51
+ console.log(chalk.green(` βœ… ${t.botOk}: @${me.username}`));
52
+ }
53
+ catch {
54
+ console.log(chalk.yellow(` ⚠️ ${t.botFail}`));
55
+ }
56
+ // ── 3. Chat ID ───────────────────────────────────────
57
+ const chatId = await input({
58
+ message: t.chatId,
59
+ validate: (val) => {
60
+ if (!val)
61
+ return t.chatIdRequired;
62
+ if (!/^-?\d+$/.test(val))
63
+ return t.chatIdFormat;
64
+ return true;
65
+ },
66
+ });
67
+ // ── 4. City ID ───────────────────────────────────────
68
+ const cityIdRaw = await input({
69
+ message: t.cityId,
70
+ validate: (val) => {
71
+ if (!val)
72
+ return t.cityIdRequired;
73
+ if (!/^\d+$/.test(val))
74
+ return t.cityIdFormat;
75
+ return true;
76
+ },
77
+ });
78
+ // ── Write config ─────────────────────────────────────
79
+ const cfg = {
80
+ city_ids: [Number(cityIdRaw)],
81
+ language,
82
+ telegram: {
83
+ bot_token: botToken,
84
+ chat_id: chatId,
85
+ },
86
+ };
87
+ mkdirSync(CONFIG_DIR, { recursive: true });
88
+ writeFileSync(HOME_CONFIG_PATH, yaml.dump(cfg), "utf-8");
89
+ console.log("");
90
+ console.log(chalk.green(`βœ… ${t.saved} ${HOME_CONFIG_PATH}`));
91
+ console.log("");
92
+ console.log(t.next);
93
+ console.log(` ${chalk.cyan("npx easyoref")}`);
94
+ console.log("");
95
+ }
96
+ // ── i18n strings for the wizard ────────────────────────
97
+ const STRINGS = {
98
+ ru: {
99
+ token: "πŸ€– Π’ΠΎΠΊΠ΅Π½ Π±ΠΎΡ‚Π° (ΠΎΡ‚ @BotFather):",
100
+ tokenRequired: "Π’ΠΎΠΊΠ΅Π½ обязатСлСн",
101
+ tokenFormat: "Π€ΠΎΡ€ΠΌΠ°Ρ‚: 123456:ABC-DEF...",
102
+ validating: " ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡΠ΅ΠΌ Ρ‚ΠΎΠΊΠ΅Π½...",
103
+ botOk: "Π‘ΠΎΡ‚ Π½Π°ΠΉΠ΄Π΅Π½",
104
+ botFail: "НС ΡƒΠ΄Π°Π»ΠΎΡΡŒ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ (ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Π΅ΠΌ)",
105
+ chatId: "πŸ’¬ Chat ID (ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ число для Π³Ρ€ΡƒΠΏΠΏ):",
106
+ chatIdRequired: "Chat ID обязатСлСн",
107
+ chatIdFormat: "Число (ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ для Π³Ρ€ΡƒΠΏΠΏ)",
108
+ cityId: "πŸ“ ID Π³ΠΎΡ€ΠΎΠ΄Π° (Π½Π°ΠΉΠ΄ΠΈΡ‚Π΅ Π½Π° https://github.com/eladnava/pikud-haoref-api/blob/master/cities.json):",
109
+ cityIdRequired: "ID обязатСлСн",
110
+ cityIdFormat: "Волько Ρ†ΠΈΡ„Ρ€Ρ‹",
111
+ saved: "ΠšΠΎΠ½Ρ„ΠΈΠ³ сохранён β†’",
112
+ next: "ЗапуститС Π±ΠΎΡ‚Π°:",
113
+ },
114
+ en: {
115
+ token: "πŸ€– Bot token (from @BotFather):",
116
+ tokenRequired: "Token is required",
117
+ tokenFormat: "Format: 123456:ABC-DEF...",
118
+ validating: " Validating token...",
119
+ botOk: "Bot found",
120
+ botFail: "Could not verify (continuing anyway)",
121
+ chatId: "πŸ’¬ Chat ID (negative number for groups):",
122
+ chatIdRequired: "Chat ID is required",
123
+ chatIdFormat: "Must be a number (negative for groups)",
124
+ cityId: "πŸ“ City ID (find at https://github.com/eladnava/pikud-haoref-api/blob/master/cities.json):",
125
+ cityIdRequired: "City ID is required",
126
+ cityIdFormat: "Numbers only",
127
+ saved: "Config saved β†’",
128
+ next: "Start the bot:",
129
+ },
130
+ he: {
131
+ token: "πŸ€– Χ˜Χ•Χ§ΧŸ Χ‘Χ•Χ˜ (מ-@BotFather):",
132
+ tokenRequired: "Χ˜Χ•Χ§ΧŸ Χ Χ“Χ¨Χ©",
133
+ tokenFormat: "Χ€Χ•Χ¨ΧžΧ˜: 123456:ABC-DEF...",
134
+ validating: " מאמΧͺ Χ˜Χ•Χ§ΧŸ...",
135
+ botOk: "Χ‘Χ•Χ˜ נמצא",
136
+ botFail: "לא Χ Χ™Χͺן לאמΧͺ (ΧžΧžΧ©Χ™Χ›Χ™Χ)",
137
+ chatId: "πŸ’¬ Chat ID (מב׀ר Χ©ΧœΧ™ΧœΧ™ ΧœΧ§Χ‘Χ•Χ¦Χ•Χͺ):",
138
+ chatIdRequired: "Chat ID Χ Χ“Χ¨Χ©",
139
+ chatIdFormat: "Χ—Χ™Χ™Χ‘ ΧœΧ”Χ™Χ•Χͺ מב׀ר (Χ©ΧœΧ™ΧœΧ™ ΧœΧ§Χ‘Χ•Χ¦Χ•Χͺ)",
140
+ cityId: "πŸ“ ID Χ’Χ™Χ¨ (ΧžΧ¦ΧΧ• Χ‘-https://github.com/eladnava/pikud-haoref-api/blob/master/cities.json):",
141
+ cityIdRequired: "ID Χ’Χ™Χ¨ Χ Χ“Χ¨Χ©",
142
+ cityIdFormat: "ΧžΧ‘Χ€Χ¨Χ™Χ Χ‘ΧœΧ‘Χ“",
143
+ saved: "Χ”Χ’Χ“Χ¨Χ•Χͺ Χ Χ©ΧžΧ¨Χ• β†’",
144
+ next: "Χ”Χ€Χ’Χ™ΧœΧ• אΧͺ Χ”Χ‘Χ•Χ˜:",
145
+ },
146
+ ar: {
147
+ token: "πŸ€– Ψ±Ω…Ψ² Ψ§Ω„Ψ¨ΩˆΨͺ (Ω…Ω† @BotFather):",
148
+ tokenRequired: "Ψ§Ω„Ψ±Ω…Ψ² Ω…Ψ·Ω„ΩˆΨ¨",
149
+ tokenFormat: "Ψ§Ω„Ψ΄ΩƒΩ„: 123456:ABC-DEF...",
150
+ validating: " جارٍ Ψ§Ω„ΨͺΨ­Ω‚Ω‚...",
151
+ botOk: "ΨͺΩ… Ψ§Ω„ΨΉΨ«ΩˆΨ± ΨΉΩ„Ω‰ Ψ§Ω„Ψ¨ΩˆΨͺ",
152
+ botFail: "ΨͺΨΉΨ°Ψ± Ψ§Ω„ΨͺΨ­Ω‚Ω‚ (Ω…ΨͺΨ§Ψ¨ΨΉΨ©)",
153
+ chatId: "πŸ’¬ Chat ID (Ψ±Ω‚Ω… Ψ³Ψ§Ω„Ψ¨ Ω„Ω„Ω…Ψ¬Ω…ΩˆΨΉΨ§Ψͺ):",
154
+ chatIdRequired: "Chat ID Ω…Ψ·Ω„ΩˆΨ¨",
155
+ chatIdFormat: "يجب Ψ£Ω† ΩŠΩƒΩˆΩ† Ψ±Ω‚Ω…Ω‹Ψ§ (Ψ³Ψ§Ω„Ψ¨ Ω„Ω„Ω…Ψ¬Ω…ΩˆΨΉΨ§Ψͺ)",
156
+ cityId: "πŸ“ Ψ±Ω‚Ω… Ψ§Ω„Ω…Ψ―ΩŠΩ†Ψ© (Ψ§Ψ¨Ψ­Ψ« في https://github.com/eladnava/pikud-haoref-api/blob/master/cities.json):",
157
+ cityIdRequired: "Ψ±Ω‚Ω… Ψ§Ω„Ω…Ψ―ΩŠΩ†Ψ© Ω…Ψ·Ω„ΩˆΨ¨",
158
+ cityIdFormat: "Ψ£Ψ±Ω‚Ψ§Ω… فقط",
159
+ saved: "ΨͺΩ… حفظ Ψ§Ω„Ψ₯ΨΉΨ―Ψ§Ψ―Ψ§Ψͺ β†’",
160
+ next: "Ψ΄ΨΊΩ‘Ω„ Ψ§Ω„Ψ¨ΩˆΨͺ:",
161
+ },
162
+ };
163
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * EasyOref Logger
3
+ *
4
+ * Dual-output: console (always) + Better Stack Logtail (if token set).
5
+ * Token source: config.yaml `observability.betterstack_token` or LOGTAIL_TOKEN env.
6
+ * Live Tail: https://logs.betterstack.com β†’ your source β†’ "Live Tail"
7
+ */
8
+ export declare function info(message: string, ctx?: Record<string, unknown>): void;
9
+ export declare function warn(message: string, ctx?: Record<string, unknown>): void;
10
+ export declare function error(message: string, ctx?: Record<string, unknown>): void;
11
+ export declare function debug(message: string, ctx?: Record<string, unknown>): void;
12
+ /** Call before process.exit() β€” flushes Logtail buffer */
13
+ export declare function flush(): Promise<void>;
14
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAuBH,wBAAgB,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAGzE;AAED,wBAAgB,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAGzE;AAED,wBAAgB,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAG1E;AAED,wBAAgB,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAK1E;AAED,0DAA0D;AAC1D,wBAAsB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAE3C"}
package/dist/logger.js ADDED
@@ -0,0 +1,45 @@
1
+ /**
2
+ * EasyOref Logger
3
+ *
4
+ * Dual-output: console (always) + Better Stack Logtail (if token set).
5
+ * Token source: config.yaml `observability.betterstack_token` or LOGTAIL_TOKEN env.
6
+ * Live Tail: https://logs.betterstack.com β†’ your source β†’ "Live Tail"
7
+ */
8
+ import { Logtail } from "@logtail/node";
9
+ import { config } from "./config.js";
10
+ const token = config.logtailToken;
11
+ const logtail = token ? new Logtail(token) : null;
12
+ const base = {
13
+ service: "easyoref",
14
+ env: process.env.NODE_ENV ?? "production",
15
+ };
16
+ if (logtail) {
17
+ console.log("πŸ“‘ Better Stack Logtail enabled β€” live tail at logs.betterstack.com");
18
+ }
19
+ else {
20
+ console.log("πŸ“Ÿ LOGTAIL_TOKEN not set β€” logging to console only");
21
+ }
22
+ // ── Public API ────────────────────────────────────────────────────────────────
23
+ export function info(message, ctx) {
24
+ console.log(message, ctx ?? "");
25
+ logtail?.info(message, { ...base, ...ctx });
26
+ }
27
+ export function warn(message, ctx) {
28
+ console.warn(message, ctx ?? "");
29
+ logtail?.warn(message, { ...base, ...ctx });
30
+ }
31
+ export function error(message, ctx) {
32
+ console.error(message, ctx ?? "");
33
+ logtail?.error(message, { ...base, ...ctx });
34
+ }
35
+ export function debug(message, ctx) {
36
+ if (process.env.LOG_LEVEL === "debug") {
37
+ console.debug(message, ctx ?? "");
38
+ }
39
+ logtail?.debug(message, { ...base, ...ctx });
40
+ }
41
+ /** Call before process.exit() β€” flushes Logtail buffer */
42
+ export async function flush() {
43
+ await logtail?.flush();
44
+ }
45
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,MAAM,KAAK,GAAG,MAAM,CAAC,YAAY,CAAC;AAClC,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAElD,MAAM,IAAI,GAAG;IACX,OAAO,EAAE,UAAU;IACnB,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,YAAY;CAC1C,CAAC;AAEF,IAAI,OAAO,EAAE,CAAC;IACZ,OAAO,CAAC,GAAG,CACT,qEAAqE,CACtE,CAAC;AACJ,CAAC;KAAM,CAAC;IACN,OAAO,CAAC,GAAG,CAAC,oDAAoD,CAAC,CAAC;AACpE,CAAC;AAED,iFAAiF;AAEjF,MAAM,UAAU,IAAI,CAAC,OAAe,EAAE,GAA6B;IACjE,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC;IAChC,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,GAAG,IAAI,EAAE,GAAG,GAAG,EAAE,CAAC,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,IAAI,CAAC,OAAe,EAAE,GAA6B;IACjE,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC;IACjC,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,GAAG,IAAI,EAAE,GAAG,GAAG,EAAE,CAAC,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,KAAK,CAAC,OAAe,EAAE,GAA6B;IAClE,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC;IAClC,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,EAAE,GAAG,IAAI,EAAE,GAAG,GAAG,EAAE,CAAC,CAAC;AAC/C,CAAC;AAED,MAAM,UAAU,KAAK,CAAC,OAAe,EAAE,GAA6B;IAClE,IAAI,OAAO,CAAC,GAAG,CAAC,SAAS,KAAK,OAAO,EAAE,CAAC;QACtC,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC;IACpC,CAAC;IACD,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,EAAE,GAAG,IAAI,EAAE,GAAG,GAAG,EAAE,CAAC,CAAC;AAC/C,CAAC;AAED,0DAA0D;AAC1D,MAAM,CAAC,KAAK,UAAU,KAAK;IACzB,MAAM,OAAO,EAAE,KAAK,EAAE,CAAC;AACzB,CAAC"}
package/package.json ADDED
@@ -0,0 +1,60 @@
1
+ {
2
+ "name": "easyoref",
3
+ "version": "1.0.0",
4
+ "description": "Real-time Israeli civil defense alerts β†’ Telegram, filtered by your location",
5
+ "type": "module",
6
+ "bin": {
7
+ "easyoref": "dist/bin.js"
8
+ },
9
+ "main": "dist/bot.js",
10
+ "scripts": {
11
+ "dev": "tsx watch src/bot.ts",
12
+ "build": "tsc",
13
+ "start": "node dist/bot.js",
14
+ "lint": "eslint src/",
15
+ "typecheck": "tsc --noEmit"
16
+ },
17
+ "keywords": [
18
+ "telegram",
19
+ "oref",
20
+ "red-alert",
21
+ "israel",
22
+ "pikud-haoref",
23
+ "civil-defense",
24
+ "rocket-alerts"
25
+ ],
26
+ "author": "Mikhail Kogan <kogan.mikhail@gmail.com>",
27
+ "license": "MIT",
28
+ "repository": {
29
+ "type": "git",
30
+ "url": "https://github.com/mikhailkogan17/easyoref.git",
31
+ "directory": "packages/bot"
32
+ },
33
+ "dependencies": {
34
+ "@inquirer/prompts": "^7.0.0",
35
+ "@logtail/node": "^0.5.6",
36
+ "chalk": "^5.3.0",
37
+ "grammy": "^1.35.0",
38
+ "js-yaml": "^4.1.1"
39
+ },
40
+ "devDependencies": {
41
+ "@types/js-yaml": "^4.0.9",
42
+ "@types/node": "^22.0.0",
43
+ "eslint": "^9.0.0",
44
+ "tsx": "^4.19.0",
45
+ "typescript": "^5.7.0"
46
+ },
47
+ "engines": {
48
+ "node": ">=22"
49
+ },
50
+ "publishConfig": {
51
+ "access": "public",
52
+ "provenance": true
53
+ },
54
+ "files": [
55
+ "dist/**",
56
+ "!dist/__tests__/**",
57
+ "README.md",
58
+ "LICENSE"
59
+ ]
60
+ }