@chatman-media/channel-telegram 1.9.0 → 1.11.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/bot-api/types.d.ts +6 -0
- package/dist/bot-api/types.d.ts.map +1 -1
- package/dist/bot-api/update-parser.d.ts.map +1 -1
- package/dist/index.js +8 -3
- package/package.json +2 -2
- package/src/bot-api/types.ts +7 -0
- package/src/bot-api/update-parser.test.ts +48 -0
- package/src/bot-api/update-parser.ts +10 -3
package/dist/bot-api/types.d.ts
CHANGED
|
@@ -72,6 +72,11 @@ export interface TgDocument {
|
|
|
72
72
|
mime_type?: string;
|
|
73
73
|
file_size?: number;
|
|
74
74
|
}
|
|
75
|
+
export interface TgLocation {
|
|
76
|
+
latitude: number;
|
|
77
|
+
longitude: number;
|
|
78
|
+
horizontal_accuracy?: number;
|
|
79
|
+
}
|
|
75
80
|
export interface TgMessage {
|
|
76
81
|
message_id: number;
|
|
77
82
|
from?: TgUser;
|
|
@@ -92,6 +97,7 @@ export interface TgMessage {
|
|
|
92
97
|
/** «Кружок» — видео-сообщение (video note). Для видео-верификации. */
|
|
93
98
|
video_note?: TgVideoNote;
|
|
94
99
|
document?: TgDocument;
|
|
100
|
+
location?: TgLocation;
|
|
95
101
|
/** When this message is a reply to another, Telegram inlines the
|
|
96
102
|
* parent message here. We use it to detect operator replies to lead
|
|
97
103
|
* cards (matched by the parent's `message_id` against
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/bot-api/types.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/bot-api/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update-parser.d.ts","sourceRoot":"","sources":["../../src/bot-api/update-parser.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAyB,MAAM,6BAA6B,CAAC;AAClF,OAAO,KAAK,EAA0B,QAAQ,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"update-parser.d.ts","sourceRoot":"","sources":["../../src/bot-api/update-parser.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAyB,MAAM,6BAA6B,CAAC;AAClF,OAAO,KAAK,EAA0B,QAAQ,EAAE,MAAM,YAAY,CAAC;AA4EnE;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,GAAG,OAAO,GAAG,IAAI,CA0C/E"}
|
package/dist/index.js
CHANGED
|
@@ -32845,6 +32845,11 @@ function partsFromMessage(channelId, msg) {
|
|
|
32845
32845
|
...msg.document.mime_type ? { mimeType: msg.document.mime_type } : {},
|
|
32846
32846
|
...msg.document.file_name ? { fileName: msg.document.file_name } : {}
|
|
32847
32847
|
});
|
|
32848
|
+
} else if (msg.location) {
|
|
32849
|
+
parts.push({
|
|
32850
|
+
kind: "text",
|
|
32851
|
+
text: `\uD83D\uDCCD Геолокация: ${msg.location.latitude}, ${msg.location.longitude}`
|
|
32852
|
+
});
|
|
32848
32853
|
} else if (!msg.text && msg.caption) {
|
|
32849
32854
|
parts.push({ kind: "text", text: msg.caption });
|
|
32850
32855
|
}
|
|
@@ -32861,10 +32866,9 @@ function parseUpdate(channelId, update) {
|
|
|
32861
32866
|
externalMessageId: String(cb.message?.message_id ?? cb.id),
|
|
32862
32867
|
externalUserId: String(cb.from.id),
|
|
32863
32868
|
...cb.from.username ? { externalUsername: cb.from.username } : {},
|
|
32864
|
-
parts: [
|
|
32865
|
-
{ kind: "callback_query", data: cb.data, originalMessageId: String(messageId) }
|
|
32866
|
-
],
|
|
32869
|
+
parts: [{ kind: "callback_query", data: cb.data, originalMessageId: String(messageId) }],
|
|
32867
32870
|
receivedAt: Math.floor(Date.now() / 1000),
|
|
32871
|
+
...cb.from.language_code ? { channelLangHint: cb.from.language_code } : {},
|
|
32868
32872
|
raw: update
|
|
32869
32873
|
};
|
|
32870
32874
|
}
|
|
@@ -32885,6 +32889,7 @@ function parseUpdate(channelId, update) {
|
|
|
32885
32889
|
parts,
|
|
32886
32890
|
receivedAt: msg.date,
|
|
32887
32891
|
...isEdit ? { edited: true } : {},
|
|
32892
|
+
...msg.from.language_code ? { channelLangHint: msg.from.language_code } : {},
|
|
32888
32893
|
raw: update
|
|
32889
32894
|
};
|
|
32890
32895
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@chatman-media/channel-telegram",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.11.0",
|
|
4
4
|
"description": "Telegram-каналы (BotAPI + MTProto userbot) как реализация ChannelAdapter из @chatman-media/channel-core.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -37,7 +37,7 @@
|
|
|
37
37
|
"author": "Alexander Kireev",
|
|
38
38
|
"license": "MIT",
|
|
39
39
|
"dependencies": {
|
|
40
|
-
"@chatman-media/channel-core": "1.
|
|
40
|
+
"@chatman-media/channel-core": "1.10.0"
|
|
41
41
|
},
|
|
42
42
|
"peerDependencies": {
|
|
43
43
|
"telegram": ">=2.26.0"
|
package/src/bot-api/types.ts
CHANGED
|
@@ -82,6 +82,12 @@ export interface TgDocument {
|
|
|
82
82
|
file_size?: number;
|
|
83
83
|
}
|
|
84
84
|
|
|
85
|
+
export interface TgLocation {
|
|
86
|
+
latitude: number;
|
|
87
|
+
longitude: number;
|
|
88
|
+
horizontal_accuracy?: number;
|
|
89
|
+
}
|
|
90
|
+
|
|
85
91
|
export interface TgMessage {
|
|
86
92
|
message_id: number;
|
|
87
93
|
from?: TgUser;
|
|
@@ -102,6 +108,7 @@ export interface TgMessage {
|
|
|
102
108
|
/** «Кружок» — видео-сообщение (video note). Для видео-верификации. */
|
|
103
109
|
video_note?: TgVideoNote;
|
|
104
110
|
document?: TgDocument;
|
|
111
|
+
location?: TgLocation;
|
|
105
112
|
/** When this message is a reply to another, Telegram inlines the
|
|
106
113
|
* parent message here. We use it to detect operator replies to lead
|
|
107
114
|
* cards (matched by the parent's `message_id` against
|
|
@@ -285,4 +285,52 @@ describe("parseUpdate", () => {
|
|
|
285
285
|
};
|
|
286
286
|
expect(parseUpdate(CH, update)).toBeNull();
|
|
287
287
|
});
|
|
288
|
+
|
|
289
|
+
// #735 — слабый bootstrap-сигнал языка из Telegram language_code.
|
|
290
|
+
it("пробрасывает from.language_code → Inbound.channelLangHint", () => {
|
|
291
|
+
const update: TgUpdate = {
|
|
292
|
+
update_id: 10,
|
|
293
|
+
message: {
|
|
294
|
+
message_id: 1,
|
|
295
|
+
chat: { id: 1, type: "private" },
|
|
296
|
+
from: { id: 1, language_code: "ko" },
|
|
297
|
+
date: 1700000000,
|
|
298
|
+
text: "안녕",
|
|
299
|
+
},
|
|
300
|
+
};
|
|
301
|
+
expect(parseUpdate(CH, update)?.channelLangHint).toBe("ko");
|
|
302
|
+
});
|
|
303
|
+
|
|
304
|
+
it("без language_code — channelLangHint отсутствует", () => {
|
|
305
|
+
const update: TgUpdate = {
|
|
306
|
+
update_id: 11,
|
|
307
|
+
message: {
|
|
308
|
+
message_id: 2,
|
|
309
|
+
chat: { id: 2, type: "private" },
|
|
310
|
+
from: { id: 2 },
|
|
311
|
+
date: 1700000000,
|
|
312
|
+
text: "hi",
|
|
313
|
+
},
|
|
314
|
+
};
|
|
315
|
+
const inbound = parseUpdate(CH, update);
|
|
316
|
+
expect(inbound).not.toBeNull();
|
|
317
|
+
expect(inbound?.channelLangHint).toBeUndefined();
|
|
318
|
+
});
|
|
319
|
+
|
|
320
|
+
it("пробрасывает language_code из callback_query.from", () => {
|
|
321
|
+
const update: TgUpdate = {
|
|
322
|
+
update_id: 12,
|
|
323
|
+
callback_query: {
|
|
324
|
+
id: "cb1",
|
|
325
|
+
from: { id: 99, language_code: "en-US" },
|
|
326
|
+
data: "ok",
|
|
327
|
+
message: {
|
|
328
|
+
message_id: 50,
|
|
329
|
+
chat: { id: 99, type: "private" },
|
|
330
|
+
date: 1700000000,
|
|
331
|
+
},
|
|
332
|
+
},
|
|
333
|
+
};
|
|
334
|
+
expect(parseUpdate(CH, update)?.channelLangHint).toBe("en-US");
|
|
335
|
+
});
|
|
288
336
|
});
|
|
@@ -62,6 +62,11 @@ function partsFromMessage(channelId: string, msg: TgMessage): InboundPart[] {
|
|
|
62
62
|
...(msg.document.mime_type ? { mimeType: msg.document.mime_type } : {}),
|
|
63
63
|
...(msg.document.file_name ? { fileName: msg.document.file_name } : {}),
|
|
64
64
|
});
|
|
65
|
+
} else if (msg.location) {
|
|
66
|
+
parts.push({
|
|
67
|
+
kind: "text",
|
|
68
|
+
text: `📍 Геолокация: ${msg.location.latitude}, ${msg.location.longitude}`,
|
|
69
|
+
});
|
|
65
70
|
} else if (!msg.text && msg.caption) {
|
|
66
71
|
// Caption без media — теоретически невозможно по Bot API, но обработаем как text.
|
|
67
72
|
parts.push({ kind: "text", text: msg.caption });
|
|
@@ -85,10 +90,10 @@ export function parseUpdate(channelId: string, update: TgUpdate): Inbound | null
|
|
|
85
90
|
externalMessageId: String(cb.message?.message_id ?? cb.id),
|
|
86
91
|
externalUserId: String(cb.from.id),
|
|
87
92
|
...(cb.from.username ? { externalUsername: cb.from.username } : {}),
|
|
88
|
-
parts: [
|
|
89
|
-
{ kind: "callback_query", data: cb.data, originalMessageId: String(messageId) },
|
|
90
|
-
],
|
|
93
|
+
parts: [{ kind: "callback_query", data: cb.data, originalMessageId: String(messageId) }],
|
|
91
94
|
receivedAt: Math.floor(Date.now() / 1000),
|
|
95
|
+
// #735 — слабый bootstrap-сигнал языка (язык интерфейса клиента, не переписки).
|
|
96
|
+
...(cb.from.language_code ? { channelLangHint: cb.from.language_code } : {}),
|
|
92
97
|
raw: update,
|
|
93
98
|
};
|
|
94
99
|
}
|
|
@@ -113,6 +118,8 @@ export function parseUpdate(channelId: string, update: TgUpdate): Inbound | null
|
|
|
113
118
|
parts,
|
|
114
119
|
receivedAt: msg.date,
|
|
115
120
|
...(isEdit ? { edited: true } : {}),
|
|
121
|
+
// #735 — слабый bootstrap-сигнал языка (язык интерфейса клиента, не переписки).
|
|
122
|
+
...(msg.from.language_code ? { channelLangHint: msg.from.language_code } : {}),
|
|
116
123
|
raw: update,
|
|
117
124
|
};
|
|
118
125
|
}
|