-
Notifications
You must be signed in to change notification settings - Fork 0
/
TgBot.ts
115 lines (111 loc) · 3.34 KB
/
TgBot.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
import type { TgApi, TgGetUpdatesParams, TgUpdate } from "./TgApi.ts";
import { getTgFileData } from "./getTgFileData.ts";
import { listTgUpdates } from "./listTgUpdates.ts";
import { callTgApi } from "./callTgApi.ts";
import type { TgApiOptions } from "./TgApiOptions.ts";
import type { TgBotConfig } from "./TgBotConfig.ts";
/**
* Wraps {@link callTgApi} and other functions into a single easy-to-use class.
*
* @example Getting bot's information.
*
* ```ts
* import { TgBot } from "./mod.ts";
*
* const bot = new TgBot({ botToken: "YOUR_TOKEN" });
*
* const botUser = await bot.callApi("getMe");
* console.log(botUser.is_bot); // true
* ```
*/
export class TgBot {
constructor(public config: TgBotConfig) {}
/**
* Calls a method from the {@link TgApi}.
*
* Calls {@link callTgApi} internally.
*
* @throws {TgError} if the response is not OK.
*
* @example Setting bot's name.
*
* ```ts
* import { TgBot } from "./mod.ts";
*
* const bot = new TgBot({ botToken: "YOUR_TOKEN" });
*
* await bot.callApi("setMyName", { name: "My Bot" });
*
* const botUser = await bot.callApi("getMe");
* console.log(botUser.first_name); // "My Bot"
* ```
*/
callApi<M extends keyof TgApi>(
method: M,
...params: Parameters<TgApi<TgApiOptions>[M]>
): Promise<Awaited<ReturnType<TgApi[M]>>> {
return callTgApi(this.config, method, ...params);
}
/**
* Returns an iterator over updates from the Telegram Bot API.
*
* Calls {@link listTgUpdates} internally.
*
* Exits normally when the passed signal is aborted.
*
* If a request fails with {@link TgError.code} == 429 (Too Many Requests) or {@link DOMException.name} == "TimeoutError",
* it will be retried automatically.
*
* @throws {TgError} if the response is not OK.
*
* @example Logging all incoming messages.
*
* ```ts
* import { TgBot } from "./mod.ts";
*
* const bot = new TgBot({ botToken: "YOUR_TOKEN" });
*
* for await (const update of bot.listUpdates()) {
* if (update.message) {
* console.log(update.message.text);
* }
* }
* ```
*/
async *listUpdates(
params?: TgGetUpdatesParams,
options?: TgApiOptions,
): AsyncGenerator<TgUpdate, void, undefined> {
yield* listTgUpdates(this.config, params, options);
}
/**
* Fetches the contents of a file that you get from {@link TgApi.getFile}.
*
* Calls {@link getTgFileData} internally.
*
* @throws {TgError} if the response is not OK.
*
* @example Downloading bot's profile photo.
*
* ```ts
* import { TgBot } from "./mod.ts";
*
* const bot = new TgBot({ botToken: "YOUR_TOKEN" });
*
* const botUser = await bot.callApi("getMe");
*
* const botPhoto = await bot.callApi("getUserProfilePhotos", { user_id: botUser.id });
* const botPhotoFileId = botPhoto.photos[0]?.[0]?.file_id;
* if (botPhotoFileId == null) throw new Error("No profile photo");
*
* const botPhotoFile = await bot.callApi("getFile", { file_id: botPhotoFileId });
* if (botPhotoFile.file_path == null) throw new Error("Photo file unavailable");
*
* const botPhotoBlob = await bot.getFileData(botPhotoFile.file_path);
* console.log(botPhotoBlob.size);
* ```
*/
getFileData(filePath: string, options?: TgApiOptions): Promise<Blob> {
return getTgFileData(this.config, filePath, options);
}
}