@chatman-media/channel-telegram 1.7.0 → 1.9.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/client.d.ts +24 -0
- package/dist/bot-api/client.d.ts.map +1 -1
- package/dist/bot-api/types.d.ts +7 -0
- package/dist/bot-api/types.d.ts.map +1 -1
- package/dist/index.js +38 -6
- package/package.json +3 -3
- package/src/bot-api/client.ts +56 -6
- package/src/bot-api/types.ts +7 -0
package/dist/bot-api/client.d.ts
CHANGED
|
@@ -50,7 +50,22 @@ export declare class TelegramClient {
|
|
|
50
50
|
replyMarkup?: TgReplyMarkup;
|
|
51
51
|
disableWebPagePreview?: boolean;
|
|
52
52
|
replyToMessageId?: number;
|
|
53
|
+
/** Топик форум-группы (operator bot): сообщение уходит в конкретный тред. */
|
|
54
|
+
messageThreadId?: number;
|
|
53
55
|
}): Promise<TgSendMessageResult>;
|
|
56
|
+
/**
|
|
57
|
+
* Создать топик в форум-группе (operator bot). Требует: группа = форум, бот —
|
|
58
|
+
* админ с правом Manage Topics. Возвращает message_thread_id топика, который
|
|
59
|
+
* мы сохраняем на диалоге и используем для маршрутизации карточек/ответов.
|
|
60
|
+
*/
|
|
61
|
+
createForumTopic(input: {
|
|
62
|
+
chatId: number | string;
|
|
63
|
+
name: string;
|
|
64
|
+
iconColor?: number;
|
|
65
|
+
}): Promise<{
|
|
66
|
+
message_thread_id: number;
|
|
67
|
+
name: string;
|
|
68
|
+
}>;
|
|
54
69
|
/**
|
|
55
70
|
* Re-send a photo by file_id. Used by the operator-relay path: when the
|
|
56
71
|
* operator uploads a photo to the ops chat as a reply to a lead card,
|
|
@@ -62,15 +77,19 @@ export declare class TelegramClient {
|
|
|
62
77
|
chatId: number | string;
|
|
63
78
|
photoFileId: string;
|
|
64
79
|
caption?: string;
|
|
80
|
+
/** Топик форум-группы (operator bot): медиа уходит в конкретный тред. */
|
|
81
|
+
messageThreadId?: number;
|
|
65
82
|
}): Promise<TgSendMessageResult>;
|
|
66
83
|
sendVideo(input: {
|
|
67
84
|
chatId: number | string;
|
|
68
85
|
videoFileId: string;
|
|
69
86
|
caption?: string;
|
|
87
|
+
messageThreadId?: number;
|
|
70
88
|
}): Promise<TgSendMessageResult>;
|
|
71
89
|
sendVideoNote(input: {
|
|
72
90
|
chatId: number | string;
|
|
73
91
|
videoNoteFileId: string;
|
|
92
|
+
messageThreadId?: number;
|
|
74
93
|
}): Promise<TgSendMessageResult>;
|
|
75
94
|
sendPhotoUpload(input: {
|
|
76
95
|
chatId: number | string;
|
|
@@ -78,6 +97,7 @@ export declare class TelegramClient {
|
|
|
78
97
|
filename: string;
|
|
79
98
|
contentType?: string;
|
|
80
99
|
caption?: string;
|
|
100
|
+
messageThreadId?: number;
|
|
81
101
|
}): Promise<TgSendMessageResult>;
|
|
82
102
|
sendVideoUpload(input: {
|
|
83
103
|
chatId: number | string;
|
|
@@ -85,12 +105,14 @@ export declare class TelegramClient {
|
|
|
85
105
|
filename: string;
|
|
86
106
|
contentType?: string;
|
|
87
107
|
caption?: string;
|
|
108
|
+
messageThreadId?: number;
|
|
88
109
|
}): Promise<TgSendMessageResult>;
|
|
89
110
|
sendVideoNoteUpload(input: {
|
|
90
111
|
chatId: number | string;
|
|
91
112
|
bytes: ArrayBuffer | Uint8Array;
|
|
92
113
|
filename: string;
|
|
93
114
|
contentType?: string;
|
|
115
|
+
messageThreadId?: number;
|
|
94
116
|
}): Promise<TgSendMessageResult>;
|
|
95
117
|
/**
|
|
96
118
|
* Send a video from a local file on disk (not a Telegram `file_id`).
|
|
@@ -108,6 +130,7 @@ export declare class TelegramClient {
|
|
|
108
130
|
chatId: number | string;
|
|
109
131
|
documentFileId: string;
|
|
110
132
|
caption?: string;
|
|
133
|
+
messageThreadId?: number;
|
|
111
134
|
}): Promise<TgSendMessageResult>;
|
|
112
135
|
sendDocumentUpload(input: {
|
|
113
136
|
chatId: number | string;
|
|
@@ -115,6 +138,7 @@ export declare class TelegramClient {
|
|
|
115
138
|
filename: string;
|
|
116
139
|
contentType?: string;
|
|
117
140
|
caption?: string;
|
|
141
|
+
messageThreadId?: number;
|
|
118
142
|
}): Promise<TgSendMessageResult>;
|
|
119
143
|
/**
|
|
120
144
|
* Edit a message we previously sent (commonly the lead card after the
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/bot-api/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAErF,MAAM,MAAM,SAAS,GAAG,OAAO,KAAK,CAAC;AAErC,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,SAAS,CAAC;CACnB;AAED,qBAAa,gBAAiB,SAAQ,KAAK;IAEhC,MAAM,EAAE,MAAM;IACd,UAAU,EAAE,MAAM;IAClB,SAAS,EAAE,MAAM,GAAG,SAAS;IAC7B,WAAW,EAAE,MAAM;gBAHnB,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,GAAG,SAAS,EAC7B,WAAW,EAAE,MAAM;CAK7B;AAgBD,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAY;gBAE1B,IAAI,EAAE,qBAAqB;YAOzB,aAAa;YAuBb,IAAI;YAUJ,aAAa;IA8B3B,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC;IAIxB;;;;;OAKG;IACH,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAIxC;;;;;;;;;;;;;OAaG;IACG,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC;IASrD,WAAW,CAAC,KAAK,EAAE;QACjB,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;QACxB,IAAI,EAAE,MAAM,CAAC;QACb,SAAS,CAAC,EAAE,YAAY,GAAG,MAAM,GAAG,UAAU,CAAC;QAC/C,WAAW,CAAC,EAAE,aAAa,CAAC;QAC5B,qBAAqB,CAAC,EAAE,OAAO,CAAC;QAChC,gBAAgB,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/bot-api/client.ts"],"names":[],"mappings":"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"}
|
package/dist/bot-api/types.d.ts
CHANGED
|
@@ -11,6 +11,10 @@ export interface TgChat {
|
|
|
11
11
|
type: "private" | "group" | "supergroup" | "channel";
|
|
12
12
|
title?: string;
|
|
13
13
|
username?: string;
|
|
14
|
+
/** true для супергрупп с включёнными топиками (форум). Telegram отдаёт это
|
|
15
|
+
* поле в `message.chat` — используется как opt-in сигнал «оператор-чат —
|
|
16
|
+
* форум» при /setup (#651): 1 топик на диалог. */
|
|
17
|
+
is_forum?: boolean;
|
|
14
18
|
}
|
|
15
19
|
/**
|
|
16
20
|
* One frame of a Telegram photo upload. Telegram delivers an array of
|
|
@@ -73,6 +77,9 @@ export interface TgMessage {
|
|
|
73
77
|
from?: TgUser;
|
|
74
78
|
chat: TgChat;
|
|
75
79
|
date: number;
|
|
80
|
+
/** Топик форум-группы, в котором пришло сообщение (для маршрутизации ответов
|
|
81
|
+
* оператора по диалогу: conversations.operator_thread_id). */
|
|
82
|
+
message_thread_id?: number;
|
|
76
83
|
text?: string;
|
|
77
84
|
/** Caption that can accompany media uploads (photo / video / document /
|
|
78
85
|
* voice). Treated as the message's "text" by the persistence layer
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/bot-api/types.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,MAAM;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,MAAM;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,SAAS,GAAG,OAAO,GAAG,YAAY,GAAG,SAAS,CAAC;IACrD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/bot-api/types.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -32637,8 +32637,19 @@ class TelegramClient {
|
|
|
32637
32637
|
params.disable_web_page_preview = input.disableWebPagePreview;
|
|
32638
32638
|
if (input.replyToMessageId !== undefined)
|
|
32639
32639
|
params.reply_to_message_id = input.replyToMessageId;
|
|
32640
|
+
if (input.messageThreadId !== undefined)
|
|
32641
|
+
params.message_thread_id = input.messageThreadId;
|
|
32640
32642
|
return this.call("sendMessage", params);
|
|
32641
32643
|
}
|
|
32644
|
+
createForumTopic(input) {
|
|
32645
|
+
const params = {
|
|
32646
|
+
chat_id: input.chatId,
|
|
32647
|
+
name: input.name
|
|
32648
|
+
};
|
|
32649
|
+
if (input.iconColor !== undefined)
|
|
32650
|
+
params.icon_color = input.iconColor;
|
|
32651
|
+
return this.call("createForumTopic", params);
|
|
32652
|
+
}
|
|
32642
32653
|
sendPhoto(input) {
|
|
32643
32654
|
const params = {
|
|
32644
32655
|
chat_id: input.chatId,
|
|
@@ -32646,6 +32657,8 @@ class TelegramClient {
|
|
|
32646
32657
|
};
|
|
32647
32658
|
if (input.caption)
|
|
32648
32659
|
params.caption = input.caption;
|
|
32660
|
+
if (input.messageThreadId !== undefined)
|
|
32661
|
+
params.message_thread_id = input.messageThreadId;
|
|
32649
32662
|
return this.call("sendPhoto", params);
|
|
32650
32663
|
}
|
|
32651
32664
|
sendVideo(input) {
|
|
@@ -32655,16 +32668,25 @@ class TelegramClient {
|
|
|
32655
32668
|
};
|
|
32656
32669
|
if (input.caption)
|
|
32657
32670
|
params.caption = input.caption;
|
|
32671
|
+
if (input.messageThreadId !== undefined)
|
|
32672
|
+
params.message_thread_id = input.messageThreadId;
|
|
32658
32673
|
return this.call("sendVideo", params);
|
|
32659
32674
|
}
|
|
32660
32675
|
sendVideoNote(input) {
|
|
32661
|
-
|
|
32676
|
+
const params = {
|
|
32662
32677
|
chat_id: input.chatId,
|
|
32663
32678
|
video_note: input.videoNoteFileId
|
|
32664
|
-
}
|
|
32679
|
+
};
|
|
32680
|
+
if (input.messageThreadId !== undefined)
|
|
32681
|
+
params.message_thread_id = input.messageThreadId;
|
|
32682
|
+
return this.call("sendVideoNote", params);
|
|
32665
32683
|
}
|
|
32666
32684
|
sendPhotoUpload(input) {
|
|
32667
|
-
return this.callMultipart("sendPhoto", {
|
|
32685
|
+
return this.callMultipart("sendPhoto", {
|
|
32686
|
+
chat_id: input.chatId,
|
|
32687
|
+
caption: input.caption,
|
|
32688
|
+
message_thread_id: input.messageThreadId
|
|
32689
|
+
}, {
|
|
32668
32690
|
field: "photo",
|
|
32669
32691
|
bytes: input.bytes,
|
|
32670
32692
|
filename: input.filename,
|
|
@@ -32672,7 +32694,11 @@ class TelegramClient {
|
|
|
32672
32694
|
});
|
|
32673
32695
|
}
|
|
32674
32696
|
sendVideoUpload(input) {
|
|
32675
|
-
return this.callMultipart("sendVideo", {
|
|
32697
|
+
return this.callMultipart("sendVideo", {
|
|
32698
|
+
chat_id: input.chatId,
|
|
32699
|
+
caption: input.caption,
|
|
32700
|
+
message_thread_id: input.messageThreadId
|
|
32701
|
+
}, {
|
|
32676
32702
|
field: "video",
|
|
32677
32703
|
bytes: input.bytes,
|
|
32678
32704
|
filename: input.filename,
|
|
@@ -32680,7 +32706,7 @@ class TelegramClient {
|
|
|
32680
32706
|
});
|
|
32681
32707
|
}
|
|
32682
32708
|
sendVideoNoteUpload(input) {
|
|
32683
|
-
return this.callMultipart("sendVideoNote", { chat_id: input.chatId }, {
|
|
32709
|
+
return this.callMultipart("sendVideoNote", { chat_id: input.chatId, message_thread_id: input.messageThreadId }, {
|
|
32684
32710
|
field: "video_note",
|
|
32685
32711
|
bytes: input.bytes,
|
|
32686
32712
|
filename: input.filename,
|
|
@@ -32697,10 +32723,16 @@ class TelegramClient {
|
|
|
32697
32723
|
};
|
|
32698
32724
|
if (input.caption)
|
|
32699
32725
|
params.caption = input.caption;
|
|
32726
|
+
if (input.messageThreadId !== undefined)
|
|
32727
|
+
params.message_thread_id = input.messageThreadId;
|
|
32700
32728
|
return this.call("sendDocument", params);
|
|
32701
32729
|
}
|
|
32702
32730
|
sendDocumentUpload(input) {
|
|
32703
|
-
return this.callMultipart("sendDocument", {
|
|
32731
|
+
return this.callMultipart("sendDocument", {
|
|
32732
|
+
chat_id: input.chatId,
|
|
32733
|
+
caption: input.caption,
|
|
32734
|
+
message_thread_id: input.messageThreadId
|
|
32735
|
+
}, {
|
|
32704
32736
|
field: "document",
|
|
32705
32737
|
bytes: input.bytes,
|
|
32706
32738
|
filename: input.filename,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@chatman-media/channel-telegram",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.9.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.7.0"
|
|
41
41
|
},
|
|
42
42
|
"peerDependencies": {
|
|
43
43
|
"telegram": ">=2.26.0"
|
|
@@ -51,7 +51,7 @@
|
|
|
51
51
|
"telegram": "^2.26.22"
|
|
52
52
|
},
|
|
53
53
|
"devDependencies": {
|
|
54
|
-
"@biomejs/biome": "^2.
|
|
54
|
+
"@biomejs/biome": "^2.5.0",
|
|
55
55
|
"@types/bun": "1.3.14",
|
|
56
56
|
"typescript": "^6.0.3"
|
|
57
57
|
},
|
package/src/bot-api/client.ts
CHANGED
|
@@ -153,6 +153,8 @@ export class TelegramClient {
|
|
|
153
153
|
replyMarkup?: TgReplyMarkup;
|
|
154
154
|
disableWebPagePreview?: boolean;
|
|
155
155
|
replyToMessageId?: number;
|
|
156
|
+
/** Топик форум-группы (operator bot): сообщение уходит в конкретный тред. */
|
|
157
|
+
messageThreadId?: number;
|
|
156
158
|
}): Promise<TgSendMessageResult> {
|
|
157
159
|
const params: Record<string, unknown> = {
|
|
158
160
|
chat_id: input.chatId,
|
|
@@ -162,9 +164,31 @@ export class TelegramClient {
|
|
|
162
164
|
if (input.replyMarkup) params.reply_markup = input.replyMarkup;
|
|
163
165
|
if (input.disableWebPagePreview) params.disable_web_page_preview = input.disableWebPagePreview;
|
|
164
166
|
if (input.replyToMessageId !== undefined) params.reply_to_message_id = input.replyToMessageId;
|
|
167
|
+
if (input.messageThreadId !== undefined) params.message_thread_id = input.messageThreadId;
|
|
165
168
|
return this.call<TgSendMessageResult>("sendMessage", params);
|
|
166
169
|
}
|
|
167
170
|
|
|
171
|
+
/**
|
|
172
|
+
* Создать топик в форум-группе (operator bot). Требует: группа = форум, бот —
|
|
173
|
+
* админ с правом Manage Topics. Возвращает message_thread_id топика, который
|
|
174
|
+
* мы сохраняем на диалоге и используем для маршрутизации карточек/ответов.
|
|
175
|
+
*/
|
|
176
|
+
createForumTopic(input: {
|
|
177
|
+
chatId: number | string;
|
|
178
|
+
name: string;
|
|
179
|
+
iconColor?: number;
|
|
180
|
+
}): Promise<{ message_thread_id: number; name: string }> {
|
|
181
|
+
const params: Record<string, unknown> = {
|
|
182
|
+
chat_id: input.chatId,
|
|
183
|
+
name: input.name,
|
|
184
|
+
};
|
|
185
|
+
if (input.iconColor !== undefined) params.icon_color = input.iconColor;
|
|
186
|
+
return this.call<{ message_thread_id: number; name: string }>(
|
|
187
|
+
"createForumTopic",
|
|
188
|
+
params,
|
|
189
|
+
);
|
|
190
|
+
}
|
|
191
|
+
|
|
168
192
|
/**
|
|
169
193
|
* Re-send a photo by file_id. Used by the operator-relay path: when the
|
|
170
194
|
* operator uploads a photo to the ops chat as a reply to a lead card,
|
|
@@ -176,12 +200,15 @@ export class TelegramClient {
|
|
|
176
200
|
chatId: number | string;
|
|
177
201
|
photoFileId: string;
|
|
178
202
|
caption?: string;
|
|
203
|
+
/** Топик форум-группы (operator bot): медиа уходит в конкретный тред. */
|
|
204
|
+
messageThreadId?: number;
|
|
179
205
|
}): Promise<TgSendMessageResult> {
|
|
180
206
|
const params: Record<string, unknown> = {
|
|
181
207
|
chat_id: input.chatId,
|
|
182
208
|
photo: input.photoFileId,
|
|
183
209
|
};
|
|
184
210
|
if (input.caption) params.caption = input.caption;
|
|
211
|
+
if (input.messageThreadId !== undefined) params.message_thread_id = input.messageThreadId;
|
|
185
212
|
return this.call<TgSendMessageResult>("sendPhoto", params);
|
|
186
213
|
}
|
|
187
214
|
|
|
@@ -189,23 +216,28 @@ export class TelegramClient {
|
|
|
189
216
|
chatId: number | string;
|
|
190
217
|
videoFileId: string;
|
|
191
218
|
caption?: string;
|
|
219
|
+
messageThreadId?: number;
|
|
192
220
|
}): Promise<TgSendMessageResult> {
|
|
193
221
|
const params: Record<string, unknown> = {
|
|
194
222
|
chat_id: input.chatId,
|
|
195
223
|
video: input.videoFileId,
|
|
196
224
|
};
|
|
197
225
|
if (input.caption) params.caption = input.caption;
|
|
226
|
+
if (input.messageThreadId !== undefined) params.message_thread_id = input.messageThreadId;
|
|
198
227
|
return this.call<TgSendMessageResult>("sendVideo", params);
|
|
199
228
|
}
|
|
200
229
|
|
|
201
230
|
sendVideoNote(input: {
|
|
202
231
|
chatId: number | string;
|
|
203
232
|
videoNoteFileId: string;
|
|
233
|
+
messageThreadId?: number;
|
|
204
234
|
}): Promise<TgSendMessageResult> {
|
|
205
|
-
|
|
235
|
+
const params: Record<string, unknown> = {
|
|
206
236
|
chat_id: input.chatId,
|
|
207
237
|
video_note: input.videoNoteFileId,
|
|
208
|
-
}
|
|
238
|
+
};
|
|
239
|
+
if (input.messageThreadId !== undefined) params.message_thread_id = input.messageThreadId;
|
|
240
|
+
return this.call<TgSendMessageResult>("sendVideoNote", params);
|
|
209
241
|
}
|
|
210
242
|
|
|
211
243
|
sendPhotoUpload(input: {
|
|
@@ -214,10 +246,15 @@ export class TelegramClient {
|
|
|
214
246
|
filename: string;
|
|
215
247
|
contentType?: string;
|
|
216
248
|
caption?: string;
|
|
249
|
+
messageThreadId?: number;
|
|
217
250
|
}): Promise<TgSendMessageResult> {
|
|
218
251
|
return this.callMultipart<TgSendMessageResult>(
|
|
219
252
|
"sendPhoto",
|
|
220
|
-
{
|
|
253
|
+
{
|
|
254
|
+
chat_id: input.chatId,
|
|
255
|
+
caption: input.caption,
|
|
256
|
+
message_thread_id: input.messageThreadId,
|
|
257
|
+
},
|
|
221
258
|
{
|
|
222
259
|
field: "photo",
|
|
223
260
|
bytes: input.bytes,
|
|
@@ -233,10 +270,15 @@ export class TelegramClient {
|
|
|
233
270
|
filename: string;
|
|
234
271
|
contentType?: string;
|
|
235
272
|
caption?: string;
|
|
273
|
+
messageThreadId?: number;
|
|
236
274
|
}): Promise<TgSendMessageResult> {
|
|
237
275
|
return this.callMultipart<TgSendMessageResult>(
|
|
238
276
|
"sendVideo",
|
|
239
|
-
{
|
|
277
|
+
{
|
|
278
|
+
chat_id: input.chatId,
|
|
279
|
+
caption: input.caption,
|
|
280
|
+
message_thread_id: input.messageThreadId,
|
|
281
|
+
},
|
|
240
282
|
{
|
|
241
283
|
field: "video",
|
|
242
284
|
bytes: input.bytes,
|
|
@@ -251,10 +293,11 @@ export class TelegramClient {
|
|
|
251
293
|
bytes: ArrayBuffer | Uint8Array;
|
|
252
294
|
filename: string;
|
|
253
295
|
contentType?: string;
|
|
296
|
+
messageThreadId?: number;
|
|
254
297
|
}): Promise<TgSendMessageResult> {
|
|
255
298
|
return this.callMultipart<TgSendMessageResult>(
|
|
256
299
|
"sendVideoNote",
|
|
257
|
-
{ chat_id: input.chatId },
|
|
300
|
+
{ chat_id: input.chatId, message_thread_id: input.messageThreadId },
|
|
258
301
|
{
|
|
259
302
|
field: "video_note",
|
|
260
303
|
bytes: input.bytes,
|
|
@@ -283,12 +326,14 @@ export class TelegramClient {
|
|
|
283
326
|
chatId: number | string;
|
|
284
327
|
documentFileId: string;
|
|
285
328
|
caption?: string;
|
|
329
|
+
messageThreadId?: number;
|
|
286
330
|
}): Promise<TgSendMessageResult> {
|
|
287
331
|
const params: Record<string, unknown> = {
|
|
288
332
|
chat_id: input.chatId,
|
|
289
333
|
document: input.documentFileId,
|
|
290
334
|
};
|
|
291
335
|
if (input.caption) params.caption = input.caption;
|
|
336
|
+
if (input.messageThreadId !== undefined) params.message_thread_id = input.messageThreadId;
|
|
292
337
|
return this.call<TgSendMessageResult>("sendDocument", params);
|
|
293
338
|
}
|
|
294
339
|
|
|
@@ -298,10 +343,15 @@ export class TelegramClient {
|
|
|
298
343
|
filename: string;
|
|
299
344
|
contentType?: string;
|
|
300
345
|
caption?: string;
|
|
346
|
+
messageThreadId?: number;
|
|
301
347
|
}): Promise<TgSendMessageResult> {
|
|
302
348
|
return this.callMultipart<TgSendMessageResult>(
|
|
303
349
|
"sendDocument",
|
|
304
|
-
{
|
|
350
|
+
{
|
|
351
|
+
chat_id: input.chatId,
|
|
352
|
+
caption: input.caption,
|
|
353
|
+
message_thread_id: input.messageThreadId,
|
|
354
|
+
},
|
|
305
355
|
{
|
|
306
356
|
field: "document",
|
|
307
357
|
bytes: input.bytes,
|
package/src/bot-api/types.ts
CHANGED
|
@@ -14,6 +14,10 @@ export interface TgChat {
|
|
|
14
14
|
type: "private" | "group" | "supergroup" | "channel";
|
|
15
15
|
title?: string;
|
|
16
16
|
username?: string;
|
|
17
|
+
/** true для супергрупп с включёнными топиками (форум). Telegram отдаёт это
|
|
18
|
+
* поле в `message.chat` — используется как opt-in сигнал «оператор-чат —
|
|
19
|
+
* форум» при /setup (#651): 1 топик на диалог. */
|
|
20
|
+
is_forum?: boolean;
|
|
17
21
|
}
|
|
18
22
|
|
|
19
23
|
/**
|
|
@@ -83,6 +87,9 @@ export interface TgMessage {
|
|
|
83
87
|
from?: TgUser;
|
|
84
88
|
chat: TgChat;
|
|
85
89
|
date: number;
|
|
90
|
+
/** Топик форум-группы, в котором пришло сообщение (для маршрутизации ответов
|
|
91
|
+
* оператора по диалогу: conversations.operator_thread_id). */
|
|
92
|
+
message_thread_id?: number;
|
|
86
93
|
text?: string;
|
|
87
94
|
/** Caption that can accompany media uploads (photo / video / document /
|
|
88
95
|
* voice). Treated as the message's "text" by the persistence layer
|