@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.
@@ -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;AAuEnE;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,GAAG,OAAO,GAAG,IAAI,CAwC/E"}
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.9.0",
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.7.0"
40
+ "@chatman-media/channel-core": "1.10.0"
41
41
  },
42
42
  "peerDependencies": {
43
43
  "telegram": ">=2.26.0"
@@ -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
  }