telegram-bot-api-nodejs 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/index.js ADDED
@@ -0,0 +1,415 @@
1
+ const headers = {
2
+ "Content-Type": "application/json",
3
+ "Accept": "application/json",
4
+ };
5
+ /**
6
+ * Methods
7
+ */
8
+ export function setWebhook(token, body, signal) {
9
+ return fetch(`https://api.telegram.org/bot${token}/setWebhook`, {
10
+ method: "POST",
11
+ body: JSON.stringify(body),
12
+ headers,
13
+ signal
14
+ }).then(parseResponse);
15
+ }
16
+ export function deleteWebhook(token, signal) {
17
+ return fetch(`https://api.telegram.org/bot${token}/deleteWebhook`, {
18
+ method: "POST",
19
+ body: JSON.stringify({}),
20
+ headers,
21
+ signal
22
+ }).then(parseResponse);
23
+ }
24
+ /** @todo cehck if response is the same as in typings */
25
+ export function getWebhookInfo(token, signal) {
26
+ return fetch(`https://api.telegram.org/bot${token}/getWebhookInfo`, {
27
+ method: "POST",
28
+ body: JSON.stringify({}),
29
+ headers,
30
+ signal
31
+ }).then(parseResponse);
32
+ }
33
+ export function getMe(token, signal) {
34
+ return fetch(`https://api.telegram.org/bot${token}/getMe`, {
35
+ method: "POST",
36
+ body: JSON.stringify({}),
37
+ headers,
38
+ signal
39
+ }).then(parseResponse);
40
+ }
41
+ export function sendMessage(token, payload, signal) {
42
+ return fetch(`https://api.telegram.org/bot${token}/sendMessage`, {
43
+ method: "POST",
44
+ body: JSON.stringify(payload),
45
+ headers,
46
+ signal
47
+ }).then(parseResponse);
48
+ }
49
+ export function editMessageText(token, payload, signal) {
50
+ return fetch(`https://api.telegram.org/bot${token}/editMessageText`, {
51
+ method: "POST",
52
+ body: JSON.stringify(payload),
53
+ headers,
54
+ signal
55
+ }).then(parseResponse);
56
+ }
57
+ export function sendPhoto(token, payload, signal) {
58
+ return fetch(`https://api.telegram.org/bot${token}/sendPhoto`, {
59
+ method: "POST",
60
+ body: JSON.stringify(payload),
61
+ headers,
62
+ signal
63
+ }).then(parseResponse);
64
+ }
65
+ export function sendAnimation(token, payload, signal) {
66
+ return fetch(`https://api.telegram.org/bot${token}/sendAnimation`, {
67
+ method: "POST",
68
+ body: JSON.stringify(payload),
69
+ headers,
70
+ signal
71
+ }).then(parseResponse);
72
+ }
73
+ export function sendDocument(token, payload, signal) {
74
+ return fetch(`https://api.telegram.org/bot${token}/sendDocument`, {
75
+ method: "POST",
76
+ body: JSON.stringify(payload),
77
+ headers,
78
+ signal
79
+ }).then(parseResponse);
80
+ }
81
+ export function sendDocumentStream(token, payload, signal) {
82
+ const body = new FormData();
83
+ body.append("chat_id", String(payload.chat_id));
84
+ if (payload.caption) {
85
+ body.append("caption", payload.caption);
86
+ }
87
+ body.append("document", payload.document, payload.documentName);
88
+ if (payload.parse_mode) {
89
+ body.append("parse_mode", payload.parse_mode);
90
+ }
91
+ return fetch(`https://api.telegram.org/bot${token}/sendDocument`, {
92
+ method: "POST",
93
+ body: body,
94
+ signal
95
+ }).then(parseResponse);
96
+ }
97
+ export function getUserProfilePhotos(token, payload, signal) {
98
+ return fetch(`https://api.telegram.org/bot${token}/getUserProfilePhotos`, {
99
+ method: "POST",
100
+ body: JSON.stringify(payload),
101
+ headers,
102
+ signal
103
+ }).then(parseResponse);
104
+ }
105
+ export function getFile(token, file_id, signal) {
106
+ return fetch(`https://api.telegram.org/bot${token}/getFile`, {
107
+ method: "POST",
108
+ body: JSON.stringify({ file_id }),
109
+ headers,
110
+ signal
111
+ }).then(parseResponse);
112
+ }
113
+ export function answerCallbackQuery(token, payload, signal) {
114
+ return fetch(`https://api.telegram.org/bot${token}/answerCallbackQuery`, {
115
+ method: "POST",
116
+ body: JSON.stringify(payload),
117
+ headers,
118
+ signal
119
+ }).then(parseResponse);
120
+ }
121
+ export function getChat(token, payload, signal) {
122
+ return fetch(`https://api.telegram.org/bot${token}/getChat`, {
123
+ method: "POST",
124
+ body: JSON.stringify(payload),
125
+ headers,
126
+ signal
127
+ }).then(parseResponse);
128
+ }
129
+ export function getChatMember(token, payload, signal) {
130
+ return fetch(`https://api.telegram.org/bot${token}/getChatMember`, {
131
+ method: "POST",
132
+ body: JSON.stringify(payload),
133
+ headers,
134
+ signal: signal
135
+ }).then(parseResponse);
136
+ }
137
+ export function setMyCommands(token, payload, signal) {
138
+ return fetch(`https://api.telegram.org/bot${token}/setMyCommands`, {
139
+ method: "POST",
140
+ body: JSON.stringify(payload),
141
+ headers,
142
+ signal
143
+ }).then(parseResponse);
144
+ }
145
+ export function deleteMyCommands(token, payload, signal) {
146
+ return fetch(`https://api.telegram.org/bot${token}/deleteMyCommands`, {
147
+ method: "POST",
148
+ body: JSON.stringify(payload),
149
+ headers,
150
+ signal
151
+ }).then(parseResponse);
152
+ }
153
+ /**
154
+ * Parsers
155
+ */
156
+ export function parseUpdate(update) {
157
+ const update_id = Number(update.update_id);
158
+ return {
159
+ update_id,
160
+ message: parseMessage(update.message),
161
+ edited_message: parseMessage(update.edited_message),
162
+ callback_query: parseCallbackQuery(update.callback_query),
163
+ };
164
+ }
165
+ export function parseMessage(m) {
166
+ if (!m) {
167
+ return;
168
+ }
169
+ return {
170
+ message_id: Number(m.message_id),
171
+ from: m.from ? parseUser(m.from) : void 0,
172
+ date: Number(m.date),
173
+ chat: parseChat(m.chat),
174
+ text: String(m.text ?? ""),
175
+ forward_from: m.forward_from ? parseUser(m.forward_from) : void 0,
176
+ forward_from_chat: m.forward_from_chat ? parseChat(m.forward_from_chat) : void 0,
177
+ forward_from_message_id: m.forward_from_message_id ? Number(m.forward_from_message_id) : void 0,
178
+ forward_signature: m.forward_signature ? String(m.forward_signature) : void 0,
179
+ forward_sender_name: m.forward_sender_name ? String(m.forward_sender_name) : void 0,
180
+ forward_date: m.forward_date ? Number(m.forward_date) : void 0,
181
+ // reply_to_message: m.reply_to_message ? parseMessage(m.reply_to_message) : void 0, // Message;
182
+ edit_date: m.edit_date ? Number(m.edit_date) : void 0,
183
+ media_group_id: m.media_group_id ? String(m.media_group_id) : void 0,
184
+ author_signature: m.author_signature ? String(m.author_signature) : void 0,
185
+ entities: m.entities ? parseEntities(m.entities) : void 0,
186
+ // caption_entities: m.caption_entities ? parseSometh(m.caption_entities) : void 0, // MessageEntity[];
187
+ audio: m.audio ? parseAudio(m.audio) : void 0,
188
+ document: m.document ? parseDocument(m.document) : void 0,
189
+ animation: m.animation ? parseAnimation(m.animation) : void 0,
190
+ // game?: Game;
191
+ photo: m.photo ? parsePhotoSizes(m.photo) : void 0,
192
+ sticker: m.sticker ? parseSticker(m.sticker) : void 0,
193
+ video: m.video ? parseVideo(m.video) : void 0,
194
+ voice: m.voice ? parseVoice(m.voice) : void 0,
195
+ video_note: m.video_note ? parseVideoNote(m.video_note) : void 0,
196
+ caption: m.caption ? String(m.caption) : void 0,
197
+ contact: m.contact ? parseContact(m.contact) : void 0,
198
+ location: m.location ? parseLocation(m.location) : void 0,
199
+ venue: m.venue ? parseVenue(m.venue) : void 0,
200
+ poll: m.poll ? parsePoll(m.poll) : void 0,
201
+ // new_chat_members?: User[];
202
+ // left_chat_member?: User;
203
+ // new_chat_title?: string;
204
+ // new_chat_photo?: PhotoSize[];
205
+ // delete_chat_photo?: boolean;
206
+ // group_chat_created?: boolean;
207
+ // supergroup_chat_created?: boolean;
208
+ // channel_chat_created?: boolean;
209
+ // migrate_to_chat_id?: number;
210
+ // migrate_from_chat_id?: number;
211
+ // pinned_message?: Message;
212
+ // invoice?: Invoice;
213
+ // successful_payment?: SuccessfulPayment;
214
+ // connected_website?: string;
215
+ // passport_data?: PassportData;
216
+ // reply_markup?: InlineKeyboardMarkup;
217
+ sender_chat: m.sender_chat ? parseChat(m.sender_chat) : void 0,
218
+ };
219
+ }
220
+ export function parseUser(u) {
221
+ return {
222
+ id: String(u.id),
223
+ is_bot: Boolean(u.is_bot),
224
+ first_name: String(u.first_name),
225
+ last_name: String(u.last_name ?? ""),
226
+ username: String(u.username ?? ""),
227
+ language_code: String(u.language_code ?? ""),
228
+ };
229
+ }
230
+ export function parseChat(c) {
231
+ return {
232
+ id: Number(c.id),
233
+ type: c.type,
234
+ title: String(c.title ?? ""),
235
+ username: String(c.username ?? ""),
236
+ first_name: String(c.first_name ?? ""),
237
+ last_name: String(c.last_name ?? ""),
238
+ };
239
+ }
240
+ export function parsePhotoSizes(p) {
241
+ if (!Array.isArray(p)) {
242
+ return void 0;
243
+ }
244
+ return p.map(parsePhotoSize);
245
+ }
246
+ export function parsePhotoSize(p) {
247
+ return {
248
+ file_id: String(p.file_id),
249
+ file_size: Number(p.file_size),
250
+ width: Number(p.width),
251
+ height: Number(p.height),
252
+ };
253
+ }
254
+ export function parseSticker(v) {
255
+ return {
256
+ file_id: String(v.file_id),
257
+ width: Number(v.width),
258
+ height: Number(v.height),
259
+ thumb: v.thumb ? parsePhotoSize(v.thumb) : void 0,
260
+ emoji: String(v.emoji),
261
+ };
262
+ }
263
+ export function parseVideo(v) {
264
+ return {
265
+ file_id: String(v.file_id),
266
+ width: Number(v.width),
267
+ height: Number(v.height),
268
+ duration: Number(v.duration),
269
+ thumb: v.thumb ? parsePhotoSize(v.thumb) : void 0,
270
+ mime_type: String(v.mime_type ?? ""),
271
+ file_name: String(v.file_name ?? ""),
272
+ file_size: Number(v.file_size ?? ""),
273
+ };
274
+ }
275
+ export function parseVoice(v) {
276
+ return {
277
+ file_id: String(v.file_id),
278
+ file_size: Number(v.file_size),
279
+ duration: Number(v.duration),
280
+ mime_type: String(v.mime_type)
281
+ };
282
+ }
283
+ export function parseVideoNote(v) {
284
+ return {
285
+ file_id: String(v.file_id),
286
+ length: Number(v.length),
287
+ duration: Number(v.duration),
288
+ thumb: v.thumb ? parsePhotoSize(v.thumb) : void 0,
289
+ };
290
+ }
291
+ export function parseEntities(v) {
292
+ if (!Array.isArray(v)) {
293
+ return [];
294
+ }
295
+ return v.map(function (entity) {
296
+ return {
297
+ type: entity.type,
298
+ offset: entity.offset,
299
+ length: entity.length,
300
+ url: String(entity.url ?? ""),
301
+ user: entity.user ? parseUser(entity.user) : void 0,
302
+ };
303
+ });
304
+ }
305
+ export function parseAudio(v) {
306
+ return {
307
+ file_id: String(v.file_id),
308
+ duration: Number(v.duration),
309
+ title: String(v.title ?? ""),
310
+ performer: String(v.performer ?? ""),
311
+ file_name: String(v.file_name ?? ""),
312
+ mime_type: String(v.mime_type ?? ""),
313
+ };
314
+ }
315
+ export function parseDocument(v) {
316
+ return {
317
+ file_id: String(v.file_id),
318
+ file_name: String(v.file_name || ""),
319
+ mime_type: String(v.mime_type || ""),
320
+ file_size: Number(v.file_size || 0),
321
+ };
322
+ }
323
+ export function parseAnimation(v) {
324
+ return {
325
+ file_id: String(v.file_id),
326
+ width: Number(v.width),
327
+ height: Number(v.height),
328
+ duration: Number(v.duration),
329
+ file_name: String(v.file_name),
330
+ mime_type: String(v.mime_type || ""),
331
+ };
332
+ }
333
+ export function parseContact(v) {
334
+ return {
335
+ phone_number: String(v.phone_number),
336
+ first_name: String(v.first_name),
337
+ last_name: String(v.last_name ?? ""),
338
+ user_id: Number(v.user_id ?? ""),
339
+ vcard: String(v.vcard ?? ""),
340
+ };
341
+ }
342
+ export function parseLocation(v) {
343
+ return {
344
+ longitude: Number(v.longitude),
345
+ latitude: Number(v.latitude),
346
+ };
347
+ }
348
+ export function parseVenue(v) {
349
+ return {
350
+ location: parseLocation(v.location),
351
+ title: String(v.title),
352
+ address: String(v.address),
353
+ foursquare_id: String(v.foursquare_id ?? ""),
354
+ foursquare_type: String(v.foursquare_type ?? ""),
355
+ google_place_id: String(v.google_place_id ?? ""),
356
+ google_place_type: String(v.google_place_type ?? ""),
357
+ };
358
+ }
359
+ export function parsePoll(v) {
360
+ return {
361
+ id: String(v.id),
362
+ question: String(v.question),
363
+ options: parsePollOptions(v.options),
364
+ is_closed: Boolean(v.is_closed),
365
+ };
366
+ }
367
+ export function parsePollOptions(v) {
368
+ return Array.isArray(v) ? v.map(parsePollOption) : [];
369
+ }
370
+ export function parsePollOption(v) {
371
+ return {
372
+ text: String(v.text),
373
+ voter_count: Number(v.voter_count),
374
+ };
375
+ }
376
+ /**
377
+ * @see https://core.telegram.org/bots/api#callbackquery
378
+ */
379
+ export function parseCallbackQuery(v) {
380
+ if (!v) {
381
+ return;
382
+ }
383
+ return {
384
+ id: String(v.id),
385
+ from: parseUser(v.from),
386
+ data: String(v.data ?? ""),
387
+ message: parseMessage(v.message),
388
+ chat_instance: String(v.chat_instance ?? ""),
389
+ };
390
+ }
391
+ function parseResponse(response) {
392
+ return response.text().then(function (text) {
393
+ let data;
394
+ try {
395
+ data = JSON.parse(text);
396
+ }
397
+ catch (err) {
398
+ throw new TelegramError(`Invalid response: ${text}`, response.status);
399
+ }
400
+ const ok = Boolean(data.ok);
401
+ if (ok) {
402
+ return data.result || {};
403
+ }
404
+ const error_code = Number(data.error_code ?? 0);
405
+ const description = String(data.description ?? "");
406
+ throw new TelegramError(description, response.status);
407
+ });
408
+ }
409
+ export class TelegramError extends Error {
410
+ status;
411
+ constructor(message, status) {
412
+ super(message);
413
+ this.status = status;
414
+ }
415
+ }