@easyoref/gramjs 1.27.0 → 1.27.1
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/__tests__/monitor.test.ts +107 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +107 -26
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/src/index.ts +109 -25
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unit tests for GramJS channel monitor.
|
|
3
|
+
*
|
|
4
|
+
* Tests the channel ID cache, handleNewMessage resolution,
|
|
5
|
+
* backfillChannelPosts, and the silent-catch fix.
|
|
6
|
+
*
|
|
7
|
+
* No real Telegram connection — everything is mocked.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import { describe, expect, it, vi, beforeEach } from "vitest";
|
|
11
|
+
|
|
12
|
+
// ── Mocks ──────────────────────────────────────────────────
|
|
13
|
+
|
|
14
|
+
const mockPushChannelPost = vi.fn();
|
|
15
|
+
const mockGetActiveAlert = vi.fn();
|
|
16
|
+
const mockGetActiveSession = vi.fn();
|
|
17
|
+
|
|
18
|
+
vi.mock("@easyoref/shared", async () => {
|
|
19
|
+
const actual = await vi.importActual("@easyoref/shared");
|
|
20
|
+
return {
|
|
21
|
+
...actual,
|
|
22
|
+
config: {
|
|
23
|
+
agent: {
|
|
24
|
+
enabled: true,
|
|
25
|
+
apiKey: "test-key",
|
|
26
|
+
mtproto: { apiId: 123, apiHash: "abc", sessionString: "session" },
|
|
27
|
+
socks5Proxy: "",
|
|
28
|
+
filterModel: "test-model",
|
|
29
|
+
filterFallbackModel: "test-fallback",
|
|
30
|
+
extractModel: "test-model",
|
|
31
|
+
extractFallbackModel: "test-fallback",
|
|
32
|
+
redisUrl: "redis://localhost:6379",
|
|
33
|
+
},
|
|
34
|
+
botToken: "",
|
|
35
|
+
areas: [],
|
|
36
|
+
language: "ru",
|
|
37
|
+
},
|
|
38
|
+
pushChannelPost: (...args: unknown[]) => mockPushChannelPost(...args),
|
|
39
|
+
getActiveAlert: () => mockGetActiveAlert(),
|
|
40
|
+
getActiveSession: () => mockGetActiveSession(),
|
|
41
|
+
};
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
vi.mock("@easyoref/monitoring", () => ({
|
|
45
|
+
info: vi.fn(),
|
|
46
|
+
warn: vi.fn(),
|
|
47
|
+
error: vi.fn(),
|
|
48
|
+
debug: vi.fn(),
|
|
49
|
+
}));
|
|
50
|
+
|
|
51
|
+
// Mock the telegram module — we don't actually connect
|
|
52
|
+
vi.mock("telegram", () => ({
|
|
53
|
+
TelegramClient: vi.fn(),
|
|
54
|
+
Api: { channels: { JoinChannel: vi.fn() }, messages: { ImportChatInvite: vi.fn() } },
|
|
55
|
+
}));
|
|
56
|
+
vi.mock("telegram/events/index.js", () => ({
|
|
57
|
+
NewMessage: vi.fn(),
|
|
58
|
+
}));
|
|
59
|
+
vi.mock("telegram/sessions/index.js", () => ({
|
|
60
|
+
StringSession: vi.fn().mockImplementation(() => ({})),
|
|
61
|
+
}));
|
|
62
|
+
|
|
63
|
+
// ── Import (after mocks) ──────────────────────────────────
|
|
64
|
+
|
|
65
|
+
import { MONITORED_CHANNELS, backfillChannelPosts } from "../src/index.js";
|
|
66
|
+
|
|
67
|
+
// ── Tests ──────────────────────────────────────────────────
|
|
68
|
+
|
|
69
|
+
describe("MONITORED_CHANNELS export", () => {
|
|
70
|
+
it("exports a non-empty array of channel handles", () => {
|
|
71
|
+
expect(Array.isArray(MONITORED_CHANNELS)).toBe(true);
|
|
72
|
+
expect(MONITORED_CHANNELS.length).toBeGreaterThan(0);
|
|
73
|
+
for (const ch of MONITORED_CHANNELS) {
|
|
74
|
+
expect(ch).toMatch(/^@/);
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
it("includes key news channels", () => {
|
|
79
|
+
expect(MONITORED_CHANNELS).toContain("@N12LIVE");
|
|
80
|
+
expect(MONITORED_CHANNELS).toContain("@lieldaphna");
|
|
81
|
+
expect(MONITORED_CHANNELS).toContain("@divuhim1234");
|
|
82
|
+
});
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
describe("backfillChannelPosts", () => {
|
|
86
|
+
beforeEach(() => {
|
|
87
|
+
vi.clearAllMocks();
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
it("returns 0 when no active alert", async () => {
|
|
91
|
+
mockGetActiveAlert.mockResolvedValue(undefined);
|
|
92
|
+
const count = await backfillChannelPosts(Date.now() - 60_000);
|
|
93
|
+
expect(count).toBe(0);
|
|
94
|
+
expect(mockPushChannelPost).not.toHaveBeenCalled();
|
|
95
|
+
});
|
|
96
|
+
|
|
97
|
+
it("returns 0 when client is not connected (no startMonitor called)", async () => {
|
|
98
|
+
mockGetActiveAlert.mockResolvedValue({
|
|
99
|
+
alertId: "alert-1",
|
|
100
|
+
alertTs: Date.now(),
|
|
101
|
+
alertType: "red_alert",
|
|
102
|
+
});
|
|
103
|
+
// _client is undefined since startMonitor() was never called
|
|
104
|
+
const count = await backfillChannelPosts(Date.now() - 60_000);
|
|
105
|
+
expect(count).toBe(0);
|
|
106
|
+
});
|
|
107
|
+
});
|
package/dist/index.d.ts
CHANGED
|
@@ -8,7 +8,17 @@
|
|
|
8
8
|
* Rate-limited: 1-2s/channel with ±500ms jitter to avoid bans.
|
|
9
9
|
* Uses exponential backoff on flood errors.
|
|
10
10
|
*/
|
|
11
|
+
export declare const MONITORED_CHANNELS: string[];
|
|
11
12
|
export declare function startMonitor(): Promise<void>;
|
|
13
|
+
/**
|
|
14
|
+
* Active polling fallback: fetch recent posts from all monitored channels.
|
|
15
|
+
* Called by pre-filter-node when event-based collection yields 0 posts.
|
|
16
|
+
* Uses the existing fetchRecentChannelPosts() with 3 messages per channel.
|
|
17
|
+
*
|
|
18
|
+
* @param sessionStartTs — only store posts newer than session start
|
|
19
|
+
* @returns number of posts stored
|
|
20
|
+
*/
|
|
21
|
+
export declare function backfillChannelPosts(sessionStartTs: number): Promise<number>;
|
|
12
22
|
export declare function stopMonitor(): Promise<void>;
|
|
13
23
|
/**
|
|
14
24
|
* Fetch recent messages from a public Telegram channel via MTProto.
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAyCH,eAAO,MAAM,kBAAkB,UAkB9B,CAAC;AA6BF,wBAAsB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAyKlD;AAmHD;;;;;;;GAOG;AACH,wBAAsB,oBAAoB,CACxC,cAAc,EAAE,MAAM,GACrB,OAAO,CAAC,MAAM,CAAC,CAsCjB;AAED,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAMjD;AAID;;;;;;;GAOG;AACH,wBAAsB,uBAAuB,CAC3C,OAAO,EAAE,MAAM,EACf,KAAK,GAAE,MAAU,GAChB,OAAO,CAAC,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC,CA+BnE"}
|
package/dist/index.js
CHANGED
|
@@ -15,8 +15,14 @@ import { NewMessage } from "telegram/events/index.js";
|
|
|
15
15
|
import { StringSession } from "telegram/sessions/index.js";
|
|
16
16
|
const SOCKS5_TYPE = 5;
|
|
17
17
|
let _client = undefined;
|
|
18
|
+
/**
|
|
19
|
+
* Channel ID → @username cache.
|
|
20
|
+
* Populated from getDialogs() at startup so handleNewMessage() can resolve
|
|
21
|
+
* channels from peerId.channelId without calling the expensive getChat() API.
|
|
22
|
+
*/
|
|
23
|
+
const _channelIdCache = new Map();
|
|
18
24
|
// ── Monitored channels (hardcoded) ────────────────────
|
|
19
|
-
const MONITORED_CHANNELS = [
|
|
25
|
+
export const MONITORED_CHANNELS = [
|
|
20
26
|
// Original 5 channels
|
|
21
27
|
"@newsflashhhj",
|
|
22
28
|
"@yediotnews25",
|
|
@@ -111,14 +117,23 @@ export async function startMonitor() {
|
|
|
111
117
|
// Public channel username
|
|
112
118
|
if (entity && "username" in entity && entity.username) {
|
|
113
119
|
existingChannels.add(String(entity.username).toLowerCase());
|
|
120
|
+
// Populate channel ID cache: entity.id → @username
|
|
121
|
+
if ("id" in entity) {
|
|
122
|
+
_channelIdCache.set(String(entity.id), `@${entity.username}`);
|
|
123
|
+
}
|
|
114
124
|
}
|
|
115
125
|
// Private channel ID
|
|
116
126
|
if (entity && "id" in entity) {
|
|
117
127
|
existingPrivateIds.add(String(entity.id));
|
|
118
128
|
}
|
|
119
129
|
}
|
|
130
|
+
// Also cache private channels by their known IDs
|
|
131
|
+
for (const priv of PRIVATE_CHANNELS) {
|
|
132
|
+
_channelIdCache.set(priv.channelId, priv.title);
|
|
133
|
+
}
|
|
120
134
|
logger.info("GramJS: fetched existing dialogs", {
|
|
121
135
|
total: dialogs.length,
|
|
136
|
+
cachedChannelIds: _channelIdCache.size,
|
|
122
137
|
});
|
|
123
138
|
}
|
|
124
139
|
catch (err) {
|
|
@@ -204,34 +219,52 @@ async function handleNewMessage(event) {
|
|
|
204
219
|
let channel = "";
|
|
205
220
|
let channelId = ""; // for private channels
|
|
206
221
|
let isPrivate = false;
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
// Check if it's a
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
222
|
+
// Step 1: Extract channelId from peerId (always available without API call)
|
|
223
|
+
if (msg.peerId && "channelId" in msg.peerId) {
|
|
224
|
+
channelId = String(msg.peerId.channelId);
|
|
225
|
+
}
|
|
226
|
+
// Step 2: Try channel ID cache first (avoids getChat() API call)
|
|
227
|
+
const cachedChannel = channelId ? _channelIdCache.get(channelId) : undefined;
|
|
228
|
+
if (cachedChannel) {
|
|
229
|
+
channel = cachedChannel;
|
|
230
|
+
// Check if it's a private channel
|
|
231
|
+
isPrivate = PRIVATE_CHANNELS.some((p) => p.channelId === channelId);
|
|
232
|
+
}
|
|
233
|
+
else {
|
|
234
|
+
// Step 3: Fallback to getChat() for unknown channels
|
|
235
|
+
try {
|
|
236
|
+
const chat = await event.message.getChat();
|
|
237
|
+
// Check if it's a monitored private channel
|
|
238
|
+
const privateMatch = PRIVATE_CHANNELS.find((p) => p.channelId === channelId);
|
|
239
|
+
if (privateMatch) {
|
|
240
|
+
channel = privateMatch.title;
|
|
241
|
+
isPrivate = true;
|
|
242
|
+
// Cache for next time
|
|
243
|
+
_channelIdCache.set(channelId, privateMatch.title);
|
|
244
|
+
}
|
|
245
|
+
else if (chat && "username" in chat && chat.username) {
|
|
246
|
+
channel = `@${chat.username}`;
|
|
247
|
+
// Cache for next time
|
|
248
|
+
if (channelId)
|
|
249
|
+
_channelIdCache.set(channelId, channel);
|
|
250
|
+
}
|
|
251
|
+
else if (chat && "title" in chat && chat.title) {
|
|
252
|
+
channel = String(chat.title);
|
|
253
|
+
}
|
|
254
|
+
else {
|
|
255
|
+
logger.debug("GramJS: skipped message (unidentifiable chat)");
|
|
256
|
+
return;
|
|
257
|
+
}
|
|
226
258
|
}
|
|
227
|
-
|
|
228
|
-
logger.
|
|
229
|
-
|
|
259
|
+
catch (err) {
|
|
260
|
+
logger.warn("GramJS: getChat() failed — message dropped", {
|
|
261
|
+
channelId,
|
|
262
|
+
messageId: msg.id,
|
|
263
|
+
error: String(err),
|
|
264
|
+
});
|
|
265
|
+
return;
|
|
230
266
|
}
|
|
231
267
|
}
|
|
232
|
-
catch {
|
|
233
|
-
return;
|
|
234
|
-
}
|
|
235
268
|
// Only care about configured channels (public or private)
|
|
236
269
|
const normalizedChannel = channel.toLowerCase();
|
|
237
270
|
const isMonitored = isPrivate ||
|
|
@@ -276,6 +309,54 @@ async function handleNewMessage(event) {
|
|
|
276
309
|
private: isPrivate,
|
|
277
310
|
});
|
|
278
311
|
}
|
|
312
|
+
// ── Backfill (active polling fallback) ─────────────────
|
|
313
|
+
/**
|
|
314
|
+
* Active polling fallback: fetch recent posts from all monitored channels.
|
|
315
|
+
* Called by pre-filter-node when event-based collection yields 0 posts.
|
|
316
|
+
* Uses the existing fetchRecentChannelPosts() with 3 messages per channel.
|
|
317
|
+
*
|
|
318
|
+
* @param sessionStartTs — only store posts newer than session start
|
|
319
|
+
* @returns number of posts stored
|
|
320
|
+
*/
|
|
321
|
+
export async function backfillChannelPosts(sessionStartTs) {
|
|
322
|
+
const active = await getActiveAlert();
|
|
323
|
+
if (!active)
|
|
324
|
+
return 0;
|
|
325
|
+
if (!_client?.connected) {
|
|
326
|
+
logger.warn("GramJS: backfill skipped — client not connected");
|
|
327
|
+
return 0;
|
|
328
|
+
}
|
|
329
|
+
let stored = 0;
|
|
330
|
+
for (const ch of MONITORED_CHANNELS) {
|
|
331
|
+
try {
|
|
332
|
+
const posts = await fetchRecentChannelPosts(ch, 3);
|
|
333
|
+
for (const post of posts) {
|
|
334
|
+
if (post.ts < sessionStartTs)
|
|
335
|
+
continue;
|
|
336
|
+
await pushChannelPost(active.alertId, {
|
|
337
|
+
channel: ch,
|
|
338
|
+
text: post.text,
|
|
339
|
+
ts: post.ts,
|
|
340
|
+
messageUrl: post.messageUrl,
|
|
341
|
+
});
|
|
342
|
+
stored++;
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
catch (err) {
|
|
346
|
+
logger.debug("GramJS: backfill failed for channel", {
|
|
347
|
+
channel: ch,
|
|
348
|
+
error: String(err),
|
|
349
|
+
});
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
if (stored > 0) {
|
|
353
|
+
logger.info("GramJS: backfill stored posts", {
|
|
354
|
+
count: stored,
|
|
355
|
+
alertId: active.alertId,
|
|
356
|
+
});
|
|
357
|
+
}
|
|
358
|
+
return stored;
|
|
359
|
+
}
|
|
279
360
|
export async function stopMonitor() {
|
|
280
361
|
if (_client) {
|
|
281
362
|
await _client.disconnect();
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,MAAM,MAAM,sBAAsB,CAAC;AAC/C,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAC3E,OAAO,EAAE,GAAG,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAEtD,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAE3D,MAAM,WAAW,GAAG,CAAU,CAAC;AAqB/B,IAAI,OAAO,GAA+B,SAAS,CAAC;AAEpD;;;;GAIG;AACH,MAAM,eAAe,GAAG,IAAI,GAAG,EAAkB,CAAC;AAElD,yDAAyD;AAEzD,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,sBAAsB;IACtB,eAAe;IACf,eAAe;IACf,aAAa;IACb,iBAAiB;IACjB,UAAU;IACV,gCAAgC;IAChC,cAAc;IACd,cAAc;IACd,wBAAwB;IACxB,QAAQ;IACR,aAAa;IACb,oBAAoB;IACpB,iBAAiB;IACjB,aAAa;IACb,eAAe;IACf,WAAW,EAAE,6BAA6B;CAC3C,CAAC;AASF,MAAM,gBAAgB,GAAqB;IACzC;QACE,UAAU,EAAE,wBAAwB;QACpC,SAAS,EAAE,YAAY;QACvB,KAAK,EAAE,qBAAqB;KAC7B;CACF,CAAC;AAEF,0DAA0D;AAE1D,SAAS,KAAK,CAAC,EAAU;IACvB,OAAO,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;AAC/C,CAAC;AAED,SAAS,MAAM,CAAC,MAAc;IAC5B,OAAO,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,GAAG,GAAG,CAAC;AAC5C,CAAC;AAED,0DAA0D;AAE1D,MAAM,CAAC,KAAK,UAAU,YAAY;IAChC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO;QAAE,OAAO;IAElC,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC;IAE/D,IAAI,CAAC,KAAK,IAAI,CAAC,OAAO,EAAE,CAAC;QACvB,MAAM,CAAC,IAAI,CACT,+DAA+D,CAChE,CAAC;QACF,OAAO;IACT,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,aAAa,CAAC,aAAa,IAAI,EAAE,CAAC,CAAC;IAEvD,MAAM,UAAU,GAAG;QACjB,iBAAiB,EAAE,CAAC;QACpB,UAAU,EAAE,IAAI;QAChB,aAAa,EAAE,IAAI;QACnB,WAAW,EAAE,SAAS;QACtB,UAAU,EAAE,OAAO;QACnB,aAAa,EAAE,UAAU;QACzB,QAAQ,EAAE,IAAI;QACd,KAAK,EAAE,SAAwC;KACnB,CAAC;IAE/B,uBAAuB;IACvB,IAAI,MAAM,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;QAC7B,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;YACnD,UAAU,CAAC,KAAK,GAAG;gBACjB,SAAS,EAAE,WAAW;gBACtB,EAAE,EAAE,QAAQ,CAAC,QAAQ;gBACrB,IAAI,EAAE,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;gBAC3B,QAAQ,EAAE,QAAQ,CAAC,QAAQ,IAAI,SAAS;gBACxC,QAAQ,EAAE,QAAQ,CAAC,QAAQ,IAAI,SAAS;aACzC,CAAC;YACF,MAAM,CAAC,IAAI,CAAC,iCAAiC,EAAE;gBAC7C,IAAI,EAAE,QAAQ,CAAC,QAAQ;aACxB,CAAC,CAAC;QACL,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC;QAC5D,CAAC;IACH,CAAC;IAED,OAAO,GAAG,IAAI,cAAc,CAAC,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;IAElE,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,MAAM,CAAC,IAAI,CACT,8EAA8E,CAC/E,CAAC;QACF,OAAO;IACT,CAAC;IAED,IAAI,CAAC;QACH,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;QACxB,MAAM,CAAC,IAAI,CAAC,uCAAuC,CAAC,CAAC;IACvD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,CAAC,KAAK,CAAC,2BAA2B,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAClE,OAAO;IACT,CAAC;IAED,gDAAgD;IAChD,IAAI,gBAAgB,GAAgB,IAAI,GAAG,EAAE,CAAC;IAC9C,IAAI,kBAAkB,GAAgB,IAAI,GAAG,EAAE,CAAC;IAEhD,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;QACzD,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;YAC7B,0BAA0B;YAC1B,IAAI,MAAM,IAAI,UAAU,IAAI,MAAM,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;gBACtD,gBAAgB,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;gBAC5D,mDAAmD;gBACnD,IAAI,IAAI,IAAI,MAAM,EAAE,CAAC;oBACnB,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;gBAChE,CAAC;YACH,CAAC;YACD,qBAAqB;YACrB,IAAI,MAAM,IAAI,IAAI,IAAI,MAAM,EAAE,CAAC;gBAC7B,kBAAkB,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;YAC5C,CAAC;QACH,CAAC;QACD,iDAAiD;QACjD,KAAK,MAAM,IAAI,IAAI,gBAAgB,EAAE,CAAC;YACpC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QAClD,CAAC;QACD,MAAM,CAAC,IAAI,CAAC,kCAAkC,EAAE;YAC9C,KAAK,EAAE,OAAO,CAAC,MAAM;YACrB,gBAAgB,EAAE,eAAe,CAAC,IAAI;SACvC,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,CAAC,IAAI,CAAC,0DAA0D,EAAE;YACtE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC;SACnB,CAAC,CAAC;IACL,CAAC;IAED,2EAA2E;IAC3E,KAAK,MAAM,EAAE,IAAI,kBAAkB,EAAE,CAAC;QACpC,MAAM,QAAQ,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QACrC,MAAM,kBAAkB,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC;QAElD,4BAA4B;QAC5B,IAAI,gBAAgB,CAAC,GAAG,CAAC,kBAAkB,CAAC,EAAE,CAAC;YAC7C,MAAM,CAAC,KAAK,CAAC,4BAA4B,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC;YAC5D,SAAS;QACX,CAAC;QAED,IAAI,CAAC;YACH,MAAM,OAAO,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC;YAC1E,MAAM,CAAC,IAAI,CAAC,wBAAwB,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC;QACzD,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;YAC3B,IAAI,MAAM,CAAC,QAAQ,CAAC,0BAA0B,CAAC,EAAE,CAAC;gBAChD,MAAM,CAAC,KAAK,CAAC,sCAAsC,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC;YACxE,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,IAAI,CAAC,gCAAgC,EAAE;oBAC5C,OAAO,EAAE,EAAE;oBACX,KAAK,EAAE,MAAM;iBACd,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QACD,iCAAiC;QACjC,MAAM,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;IAC5B,CAAC;IAED,6CAA6C;IAC7C,KAAK,MAAM,IAAI,IAAI,gBAAgB,EAAE,CAAC;QACpC,0CAA0C;QAC1C,IAAI,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;YAC3C,MAAM,CAAC,KAAK,CAAC,oCAAoC,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;YAC1E,SAAS;QACX,CAAC;QAED,IAAI,CAAC;YACH,MAAM,OAAO,CAAC,MAAM,CAClB,IAAI,GAAG,CAAC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC,CAC7D,CAAC;YACF,MAAM,CAAC,IAAI,CAAC,gCAAgC,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;QACvE,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;YAC3B,IACE,MAAM,CAAC,QAAQ,CAAC,0BAA0B,CAAC;gBAC3C,MAAM,CAAC,QAAQ,CAAC,qBAAqB,CAAC,EACtC,CAAC;gBACD,MAAM,CAAC,KAAK,CAAC,oDAAoD,EAAE;oBACjE,KAAK,EAAE,IAAI,CAAC,KAAK;iBAClB,CAAC,CAAC;YACL,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,IAAI,CAAC,wCAAwC,EAAE;oBACpD,KAAK,EAAE,IAAI,CAAC,KAAK;oBACjB,KAAK,EAAE,MAAM;iBACd,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QACD,iCAAiC;QACjC,MAAM,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;IAC5B,CAAC;IAED,0DAA0D;IAC1D,OAAO,CAAC,eAAe,CAAC,KAAK,EAAE,KAAsB,EAAE,EAAE;QACvD,MAAM,gBAAgB,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;YAC1C,MAAM,CAAC,IAAI,CAAC,uBAAuB,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC/D,CAAC,CAAC,CAAC;IACL,CAAC,EAAE,IAAI,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC;IAEvB,MAAM,CAAC,IAAI,CAAC,6BAA6B,EAAE;QACzC,MAAM,EAAE,kBAAkB,CAAC,MAAM;QACjC,OAAO,EAAE,gBAAgB,CAAC,MAAM;KACjC,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,gBAAgB,CAAC,KAAsB;IACpD,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC;IAC1B,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;QAC9B,MAAM,CAAC,KAAK,CAAC,6CAA6C,CAAC,CAAC;QAC5D,OAAO;IACT,CAAC;IAED,6CAA6C;IAC7C,IAAI,OAAO,GAAG,EAAE,CAAC;IACjB,IAAI,SAAS,GAAG,EAAE,CAAC,CAAC,uBAAuB;IAC3C,IAAI,SAAS,GAAG,KAAK,CAAC;IAEtB,4EAA4E;IAC5E,IAAI,GAAG,CAAC,MAAM,IAAI,WAAW,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;QAC5C,SAAS,GAAG,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IAC3C,CAAC;IAED,iEAAiE;IACjE,MAAM,aAAa,GAAG,SAAS,CAAC,CAAC,CAAC,eAAe,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC7E,IAAI,aAAa,EAAE,CAAC;QAClB,OAAO,GAAG,aAAa,CAAC;QACxB,kCAAkC;QAClC,SAAS,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC;IACtE,CAAC;SAAM,CAAC;QACN,qDAAqD;QACrD,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;YAE3C,4CAA4C;YAC5C,MAAM,YAAY,GAAG,gBAAgB,CAAC,IAAI,CACxC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,SAAS,CACjC,CAAC;YACF,IAAI,YAAY,EAAE,CAAC;gBACjB,OAAO,GAAG,YAAY,CAAC,KAAK,CAAC;gBAC7B,SAAS,GAAG,IAAI,CAAC;gBACjB,sBAAsB;gBACtB,eAAe,CAAC,GAAG,CAAC,SAAS,EAAE,YAAY,CAAC,KAAK,CAAC,CAAC;YACrD,CAAC;iBAAM,IAAI,IAAI,IAAI,UAAU,IAAI,IAAI,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACvD,OAAO,GAAG,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAC9B,sBAAsB;gBACtB,IAAI,SAAS;oBAAE,eAAe,CAAC,GAAG,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;YACzD,CAAC;iBAAM,IAAI,IAAI,IAAI,OAAO,IAAI,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;gBACjD,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC/B,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,KAAK,CAAC,+CAA+C,CAAC,CAAC;gBAC9D,OAAO;YACT,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,IAAI,CAAC,4CAA4C,EAAE;gBACxD,SAAS;gBACT,SAAS,EAAE,GAAG,CAAC,EAAE;gBACjB,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC;aACnB,CAAC,CAAC;YACH,OAAO;QACT,CAAC;IACH,CAAC;IAED,0DAA0D;IAC1D,MAAM,iBAAiB,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAChD,MAAM,WAAW,GACf,SAAS;QACT,kBAAkB,CAAC,IAAI,CACrB,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC,CAAC,WAAW,EAAE,KAAK,iBAAiB;YACrC,CAAC,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,KAAK,iBAAiB,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAC1E,CAAC;IAEJ,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,CAAC,KAAK,CAAC,yCAAyC,EAAE;YACtD,OAAO;YACP,SAAS;SACV,CAAC,CAAC;QACH,OAAO;IACT,CAAC;IAED,+CAA+C;IAC/C,MAAM,MAAM,GAAG,MAAM,cAAc,EAAE,CAAC;IACtC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,CAAC,KAAK,CAAC,2CAA2C,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;QACvE,OAAO;IACT,CAAC;IAED,6BAA6B;IAC7B,MAAM,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;IAE1B,2BAA2B;IAC3B,IAAI,UAAkB,CAAC;IACvB,IAAI,SAAS,EAAE,CAAC;QACd,iDAAiD;QACjD,UAAU,GAAG,kBAAkB,SAAS,IAAI,GAAG,CAAC,EAAE,EAAE,CAAC;IACvD,CAAC;SAAM,CAAC;QACN,4CAA4C;QAC5C,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QAC1C,UAAU,GAAG,gBAAgB,QAAQ,IAAI,GAAG,CAAC,EAAE,EAAE,CAAC;IACpD,CAAC;IAED,MAAM,eAAe,CAAC,MAAM,CAAC,OAAO,EAAE;QACpC,OAAO;QACP,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE;QACd,UAAU;KACX,CAAC,CAAC;IAEH,MAAM,CAAC,IAAI,CAAC,6BAA6B,EAAE;QACzC,OAAO;QACP,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,QAAQ,EAAE,GAAG,CAAC,IAAI,CAAC,MAAM;QACzB,OAAO,EAAE,SAAS;KACnB,CAAC,CAAC;AACL,CAAC;AAED,0DAA0D;AAE1D;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,cAAsB;IAEtB,MAAM,MAAM,GAAG,MAAM,cAAc,EAAE,CAAC;IACtC,IAAI,CAAC,MAAM;QAAE,OAAO,CAAC,CAAC;IAEtB,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,CAAC;QACxB,MAAM,CAAC,IAAI,CAAC,iDAAiD,CAAC,CAAC;QAC/D,OAAO,CAAC,CAAC;IACX,CAAC;IAED,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,KAAK,MAAM,EAAE,IAAI,kBAAkB,EAAE,CAAC;QACpC,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,uBAAuB,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;YACnD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,IAAI,IAAI,CAAC,EAAE,GAAG,cAAc;oBAAE,SAAS;gBACvC,MAAM,eAAe,CAAC,MAAM,CAAC,OAAO,EAAE;oBACpC,OAAO,EAAE,EAAE;oBACX,IAAI,EAAE,IAAI,CAAC,IAAI;oBACf,EAAE,EAAE,IAAI,CAAC,EAAE;oBACX,UAAU,EAAE,IAAI,CAAC,UAAU;iBAC5B,CAAC,CAAC;gBACH,MAAM,EAAE,CAAC;YACX,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,KAAK,CAAC,qCAAqC,EAAE;gBAClD,OAAO,EAAE,EAAE;gBACX,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC;aACnB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;QACf,MAAM,CAAC,IAAI,CAAC,+BAA+B,EAAE;YAC3C,KAAK,EAAE,MAAM;YACb,OAAO,EAAE,MAAM,CAAC,OAAO;SACxB,CAAC,CAAC;IACL,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW;IAC/B,IAAI,OAAO,EAAE,CAAC;QACZ,MAAM,OAAO,CAAC,UAAU,EAAE,CAAC;QAC3B,OAAO,GAAG,SAAS,CAAC;QACpB,MAAM,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;IACtC,CAAC;AACH,CAAC;AAED,0DAA0D;AAE1D;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,OAAe,EACf,QAAgB,CAAC;IAEjB,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,CAAC;QACxB,MAAM,CAAC,IAAI,CAAC,wDAAwD,CAAC,CAAC;QACtE,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IAC1C,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAEnD,IAAI,CAAC;QACH,6CAA6C;QAC7C,MAAM,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;QAE1B,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,WAAW,CAAC,QAAQ,EAAE;YACnD,KAAK,EAAE,SAAS;SACjB,CAAC,CAAC;QAEH,OAAO,QAAQ;aACZ,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC;aACzB,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YACb,IAAI,EAAE,GAAG,CAAC,IAAI,IAAI,EAAE;YACpB,EAAE,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE;YAC3C,UAAU,EAAE,gBAAgB,QAAQ,IAAI,GAAG,CAAC,EAAE,EAAE;SACjD,CAAC,CAAC,CAAC;IACR,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,CAAC,IAAI,CAAC,wCAAwC,EAAE;YACpD,OAAO;YACP,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC;SACnB,CAAC,CAAC;QACH,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC"}
|
package/package.json
CHANGED
package/src/index.ts
CHANGED
|
@@ -39,9 +39,16 @@ type TelegramClientOpts = {
|
|
|
39
39
|
|
|
40
40
|
let _client: TelegramClient | undefined = undefined;
|
|
41
41
|
|
|
42
|
+
/**
|
|
43
|
+
* Channel ID → @username cache.
|
|
44
|
+
* Populated from getDialogs() at startup so handleNewMessage() can resolve
|
|
45
|
+
* channels from peerId.channelId without calling the expensive getChat() API.
|
|
46
|
+
*/
|
|
47
|
+
const _channelIdCache = new Map<string, string>();
|
|
48
|
+
|
|
42
49
|
// ── Monitored channels (hardcoded) ────────────────────
|
|
43
50
|
|
|
44
|
-
const MONITORED_CHANNELS = [
|
|
51
|
+
export const MONITORED_CHANNELS = [
|
|
45
52
|
// Original 5 channels
|
|
46
53
|
"@newsflashhhj",
|
|
47
54
|
"@yediotnews25",
|
|
@@ -160,14 +167,23 @@ export async function startMonitor(): Promise<void> {
|
|
|
160
167
|
// Public channel username
|
|
161
168
|
if (entity && "username" in entity && entity.username) {
|
|
162
169
|
existingChannels.add(String(entity.username).toLowerCase());
|
|
170
|
+
// Populate channel ID cache: entity.id → @username
|
|
171
|
+
if ("id" in entity) {
|
|
172
|
+
_channelIdCache.set(String(entity.id), `@${entity.username}`);
|
|
173
|
+
}
|
|
163
174
|
}
|
|
164
175
|
// Private channel ID
|
|
165
176
|
if (entity && "id" in entity) {
|
|
166
177
|
existingPrivateIds.add(String(entity.id));
|
|
167
178
|
}
|
|
168
179
|
}
|
|
180
|
+
// Also cache private channels by their known IDs
|
|
181
|
+
for (const priv of PRIVATE_CHANNELS) {
|
|
182
|
+
_channelIdCache.set(priv.channelId, priv.title);
|
|
183
|
+
}
|
|
169
184
|
logger.info("GramJS: fetched existing dialogs", {
|
|
170
185
|
total: dialogs.length,
|
|
186
|
+
cachedChannelIds: _channelIdCache.size,
|
|
171
187
|
});
|
|
172
188
|
} catch (err) {
|
|
173
189
|
logger.warn("GramJS: failed to fetch dialogs, will try joining anyway", {
|
|
@@ -262,33 +278,49 @@ async function handleNewMessage(event: NewMessageEvent): Promise<void> {
|
|
|
262
278
|
let channelId = ""; // for private channels
|
|
263
279
|
let isPrivate = false;
|
|
264
280
|
|
|
265
|
-
|
|
266
|
-
|
|
281
|
+
// Step 1: Extract channelId from peerId (always available without API call)
|
|
282
|
+
if (msg.peerId && "channelId" in msg.peerId) {
|
|
283
|
+
channelId = String(msg.peerId.channelId);
|
|
284
|
+
}
|
|
267
285
|
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
286
|
+
// Step 2: Try channel ID cache first (avoids getChat() API call)
|
|
287
|
+
const cachedChannel = channelId ? _channelIdCache.get(channelId) : undefined;
|
|
288
|
+
if (cachedChannel) {
|
|
289
|
+
channel = cachedChannel;
|
|
290
|
+
// Check if it's a private channel
|
|
291
|
+
isPrivate = PRIVATE_CHANNELS.some((p) => p.channelId === channelId);
|
|
292
|
+
} else {
|
|
293
|
+
// Step 3: Fallback to getChat() for unknown channels
|
|
294
|
+
try {
|
|
295
|
+
const chat = await event.message.getChat();
|
|
274
296
|
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
297
|
+
// Check if it's a monitored private channel
|
|
298
|
+
const privateMatch = PRIVATE_CHANNELS.find(
|
|
299
|
+
(p) => p.channelId === channelId,
|
|
300
|
+
);
|
|
301
|
+
if (privateMatch) {
|
|
302
|
+
channel = privateMatch.title;
|
|
303
|
+
isPrivate = true;
|
|
304
|
+
// Cache for next time
|
|
305
|
+
_channelIdCache.set(channelId, privateMatch.title);
|
|
306
|
+
} else if (chat && "username" in chat && chat.username) {
|
|
307
|
+
channel = `@${chat.username}`;
|
|
308
|
+
// Cache for next time
|
|
309
|
+
if (channelId) _channelIdCache.set(channelId, channel);
|
|
310
|
+
} else if (chat && "title" in chat && chat.title) {
|
|
311
|
+
channel = String(chat.title);
|
|
312
|
+
} else {
|
|
313
|
+
logger.debug("GramJS: skipped message (unidentifiable chat)");
|
|
314
|
+
return;
|
|
315
|
+
}
|
|
316
|
+
} catch (err) {
|
|
317
|
+
logger.warn("GramJS: getChat() failed — message dropped", {
|
|
318
|
+
channelId,
|
|
319
|
+
messageId: msg.id,
|
|
320
|
+
error: String(err),
|
|
321
|
+
});
|
|
322
|
+
return;
|
|
289
323
|
}
|
|
290
|
-
} catch {
|
|
291
|
-
return;
|
|
292
324
|
}
|
|
293
325
|
|
|
294
326
|
// Only care about configured channels (public or private)
|
|
@@ -345,6 +377,58 @@ async function handleNewMessage(event: NewMessageEvent): Promise<void> {
|
|
|
345
377
|
});
|
|
346
378
|
}
|
|
347
379
|
|
|
380
|
+
// ── Backfill (active polling fallback) ─────────────────
|
|
381
|
+
|
|
382
|
+
/**
|
|
383
|
+
* Active polling fallback: fetch recent posts from all monitored channels.
|
|
384
|
+
* Called by pre-filter-node when event-based collection yields 0 posts.
|
|
385
|
+
* Uses the existing fetchRecentChannelPosts() with 3 messages per channel.
|
|
386
|
+
*
|
|
387
|
+
* @param sessionStartTs — only store posts newer than session start
|
|
388
|
+
* @returns number of posts stored
|
|
389
|
+
*/
|
|
390
|
+
export async function backfillChannelPosts(
|
|
391
|
+
sessionStartTs: number,
|
|
392
|
+
): Promise<number> {
|
|
393
|
+
const active = await getActiveAlert();
|
|
394
|
+
if (!active) return 0;
|
|
395
|
+
|
|
396
|
+
if (!_client?.connected) {
|
|
397
|
+
logger.warn("GramJS: backfill skipped — client not connected");
|
|
398
|
+
return 0;
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
let stored = 0;
|
|
402
|
+
for (const ch of MONITORED_CHANNELS) {
|
|
403
|
+
try {
|
|
404
|
+
const posts = await fetchRecentChannelPosts(ch, 3);
|
|
405
|
+
for (const post of posts) {
|
|
406
|
+
if (post.ts < sessionStartTs) continue;
|
|
407
|
+
await pushChannelPost(active.alertId, {
|
|
408
|
+
channel: ch,
|
|
409
|
+
text: post.text,
|
|
410
|
+
ts: post.ts,
|
|
411
|
+
messageUrl: post.messageUrl,
|
|
412
|
+
});
|
|
413
|
+
stored++;
|
|
414
|
+
}
|
|
415
|
+
} catch (err) {
|
|
416
|
+
logger.debug("GramJS: backfill failed for channel", {
|
|
417
|
+
channel: ch,
|
|
418
|
+
error: String(err),
|
|
419
|
+
});
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
if (stored > 0) {
|
|
424
|
+
logger.info("GramJS: backfill stored posts", {
|
|
425
|
+
count: stored,
|
|
426
|
+
alertId: active.alertId,
|
|
427
|
+
});
|
|
428
|
+
}
|
|
429
|
+
return stored;
|
|
430
|
+
}
|
|
431
|
+
|
|
348
432
|
export async function stopMonitor(): Promise<void> {
|
|
349
433
|
if (_client) {
|
|
350
434
|
await _client.disconnect();
|