@effect-ak/tg-bot-client 0.2.1 → 0.2.2
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/index.d.ts +2821 -0
- package/dist/index.js +462 -0
- package/dist/index.mjs +418 -0
- package/package.json +15 -15
- package/readme.md +1 -1
- package/dist/cjs/bot/factory/_service.js +0 -59
- package/dist/cjs/bot/factory/client-config.js +0 -68
- package/dist/cjs/bot/factory/make-bot.js +0 -59
- package/dist/cjs/bot/message-handler/_service.js +0 -51
- package/dist/cjs/bot/message-handler/types.js +0 -5
- package/dist/cjs/bot/message-handler/utils.js +0 -19
- package/dist/cjs/bot/run.js +0 -10
- package/dist/cjs/bot/update-poller/_service.js +0 -78
- package/dist/cjs/bot/update-poller/errors.js +0 -5
- package/dist/cjs/bot/update-poller/fetch-updates.js +0 -109
- package/dist/cjs/bot/update-poller/poll-and-handle.js +0 -89
- package/dist/cjs/bot/update-poller/settings.js +0 -23
- package/dist/cjs/client/_client.js +0 -64
- package/dist/cjs/client/config.js +0 -56
- package/dist/cjs/client/errors.js +0 -57
- package/dist/cjs/client/execute-request/_service.js +0 -59
- package/dist/cjs/client/execute-request/execute.js +0 -98
- package/dist/cjs/client/execute-request/payload.js +0 -24
- package/dist/cjs/client/file/_service.js +0 -61
- package/dist/cjs/client/file/get-file.js +0 -77
- package/dist/cjs/client/guards.js +0 -12
- package/dist/cjs/const.js +0 -20
- package/dist/cjs/index.js +0 -29
- package/dist/cjs/specification/api.js +0 -5
- package/dist/cjs/specification/types.js +0 -5
- package/dist/dts/bot/factory/_service.d.ts +0 -37
- package/dist/dts/bot/factory/client-config.d.ts +0 -3
- package/dist/dts/bot/factory/make-bot.d.ts +0 -7
- package/dist/dts/bot/message-handler/_service.d.ts +0 -6
- package/dist/dts/bot/message-handler/types.d.ts +0 -16
- package/dist/dts/bot/message-handler/utils.d.ts +0 -6
- package/dist/dts/bot/run.d.ts +0 -7
- package/dist/dts/bot/update-poller/_service.d.ts +0 -21
- package/dist/dts/bot/update-poller/errors.d.ts +0 -1
- package/dist/dts/bot/update-poller/fetch-updates.d.ts +0 -17
- package/dist/dts/bot/update-poller/poll-and-handle.d.ts +0 -16
- package/dist/dts/bot/update-poller/settings.d.ts +0 -6
- package/dist/dts/client/_client.d.ts +0 -8
- package/dist/dts/client/config.d.ts +0 -8
- package/dist/dts/client/errors.d.ts +0 -23
- package/dist/dts/client/execute-request/_service.d.ts +0 -15
- package/dist/dts/client/execute-request/execute.d.ts +0 -5
- package/dist/dts/client/execute-request/payload.d.ts +0 -1
- package/dist/dts/client/file/_service.d.ts +0 -16
- package/dist/dts/client/file/get-file.d.ts +0 -5
- package/dist/dts/client/guards.d.ts +0 -17
- package/dist/dts/const.d.ts +0 -12
- package/dist/dts/index.d.ts +0 -5
- package/dist/dts/specification/api.d.ts +0 -1030
- package/dist/dts/specification/types.d.ts +0 -1663
- package/dist/esm/bot/factory/_service.js +0 -49
- package/dist/esm/bot/factory/client-config.js +0 -57
- package/dist/esm/bot/factory/make-bot.js +0 -46
- package/dist/esm/bot/message-handler/_service.js +0 -41
- package/dist/esm/bot/message-handler/types.js +0 -2
- package/dist/esm/bot/message-handler/utils.js +0 -16
- package/dist/esm/bot/run.js +0 -10
- package/dist/esm/bot/update-poller/_service.js +0 -68
- package/dist/esm/bot/update-poller/errors.js +0 -2
- package/dist/esm/bot/update-poller/fetch-updates.js +0 -86
- package/dist/esm/bot/update-poller/poll-and-handle.js +0 -74
- package/dist/esm/bot/update-poller/settings.js +0 -19
- package/dist/esm/client/_client.js +0 -53
- package/dist/esm/client/config.js +0 -46
- package/dist/esm/client/errors.js +0 -46
- package/dist/esm/client/execute-request/_service.js +0 -49
- package/dist/esm/client/execute-request/execute.js +0 -74
- package/dist/esm/client/execute-request/payload.js +0 -25
- package/dist/esm/client/file/_service.js +0 -51
- package/dist/esm/client/file/get-file.js +0 -61
- package/dist/esm/client/guards.js +0 -13
- package/dist/esm/const.js +0 -17
- package/dist/esm/index.js +0 -21
- package/dist/esm/specification/api.js +0 -2
- package/dist/esm/specification/types.js +0 -2
package/dist/index.js
ADDED
|
@@ -0,0 +1,462 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __create = Object.create;
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
7
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
|
+
var __export = (target, all) => {
|
|
9
|
+
for (var name in all)
|
|
10
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
11
|
+
};
|
|
12
|
+
var __copyProps = (to, from, except, desc) => {
|
|
13
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
14
|
+
for (let key of __getOwnPropNames(from))
|
|
15
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
16
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
17
|
+
}
|
|
18
|
+
return to;
|
|
19
|
+
};
|
|
20
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
21
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
22
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
23
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
24
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
25
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
26
|
+
mod
|
|
27
|
+
));
|
|
28
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
29
|
+
|
|
30
|
+
// src/index.ts
|
|
31
|
+
var src_exports = {};
|
|
32
|
+
__export(src_exports, {
|
|
33
|
+
BotFactoryService: () => BotFactoryService,
|
|
34
|
+
BotFactoryServiceDefault: () => BotFactoryServiceDefault,
|
|
35
|
+
MESSAGE_EFFECTS: () => MESSAGE_EFFECTS,
|
|
36
|
+
defaultBaseUrl: () => defaultBaseUrl,
|
|
37
|
+
isMessageEffect: () => isMessageEffect,
|
|
38
|
+
makeTgBotClient: () => makeTgBotClient,
|
|
39
|
+
messageEffectIdCodes: () => messageEffectIdCodes,
|
|
40
|
+
runTgChatBot: () => runTgChatBot
|
|
41
|
+
});
|
|
42
|
+
module.exports = __toCommonJS(src_exports);
|
|
43
|
+
|
|
44
|
+
// src/client/_client.ts
|
|
45
|
+
var Micro5 = __toESM(require("effect/Micro"));
|
|
46
|
+
|
|
47
|
+
// src/client/config.ts
|
|
48
|
+
var Context = __toESM(require("effect/Context"));
|
|
49
|
+
|
|
50
|
+
// src/const.ts
|
|
51
|
+
var defaultBaseUrl = "https://api.telegram.org";
|
|
52
|
+
var MESSAGE_EFFECTS = {
|
|
53
|
+
"\u{1F525}": "5104841245755180586",
|
|
54
|
+
"\u{1F44D}": "5107584321108051014",
|
|
55
|
+
"\u{1F44E}": "5104858069142078462",
|
|
56
|
+
"\u2764\uFE0F": "5159385139981059251",
|
|
57
|
+
"\u{1F389}": "5046509860389126442",
|
|
58
|
+
"\u{1F4A9}": "5046589136895476101"
|
|
59
|
+
};
|
|
60
|
+
var messageEffectIdCodes = Object.keys(MESSAGE_EFFECTS);
|
|
61
|
+
var isMessageEffect = (input) => {
|
|
62
|
+
return typeof input === "string" && input in MESSAGE_EFFECTS;
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
// src/client/config.ts
|
|
66
|
+
var makeTgBotClientConfig = (input) => TgBotClientConfig.of({
|
|
67
|
+
...input,
|
|
68
|
+
["base-url"]: input["base-url"] ?? defaultBaseUrl
|
|
69
|
+
});
|
|
70
|
+
var TgBotClientConfig = class extends Context.Tag("TgBotClientConfig")() {
|
|
71
|
+
};
|
|
72
|
+
|
|
73
|
+
// src/client/execute-request/_service.ts
|
|
74
|
+
var Micro2 = __toESM(require("effect/Micro"));
|
|
75
|
+
var Context2 = __toESM(require("effect/Context"));
|
|
76
|
+
|
|
77
|
+
// src/client/execute-request/execute.ts
|
|
78
|
+
var Micro = __toESM(require("effect/Micro"));
|
|
79
|
+
var String = __toESM(require("effect/String"));
|
|
80
|
+
|
|
81
|
+
// src/client/errors.ts
|
|
82
|
+
var Data = __toESM(require("effect/Data"));
|
|
83
|
+
var TgBotClientError = class _TgBotClientError extends Data.TaggedError("TgBotClientError") {
|
|
84
|
+
static missingSuccess = new _TgBotClientError({
|
|
85
|
+
reason: {
|
|
86
|
+
type: "ClientInternalError",
|
|
87
|
+
cause: "Expected 'success' to be defined"
|
|
88
|
+
}
|
|
89
|
+
});
|
|
90
|
+
};
|
|
91
|
+
|
|
92
|
+
// src/client/guards.ts
|
|
93
|
+
var isFileContent = (input) => typeof input == "object" && input != null && ("file_content" in input && input.file_content instanceof Uint8Array) && ("file_name" in input && typeof input.file_name == "string");
|
|
94
|
+
var isTgBotApiResponse = (input) => typeof input == "object" && input != null && ("ok" in input && typeof input.ok == "boolean");
|
|
95
|
+
var isTgBotClientSettingsInput = (input) => typeof input == "object" && input != null && ("bot-token" in input && typeof input["bot-token"] == "string");
|
|
96
|
+
|
|
97
|
+
// src/client/execute-request/payload.ts
|
|
98
|
+
var makePayload = (body) => {
|
|
99
|
+
const entries = Object.entries(body);
|
|
100
|
+
if (entries.length == 0) return void 0;
|
|
101
|
+
const result = new FormData();
|
|
102
|
+
for (const [key, value] of entries) {
|
|
103
|
+
if (!value) continue;
|
|
104
|
+
if (typeof value != "object") {
|
|
105
|
+
result.append(key, `${value}`);
|
|
106
|
+
} else if (isFileContent(value)) {
|
|
107
|
+
result.append(key, new Blob([value.file_content]), value.file_name);
|
|
108
|
+
} else {
|
|
109
|
+
result.append(key, JSON.stringify(value));
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
return result;
|
|
113
|
+
};
|
|
114
|
+
|
|
115
|
+
// src/client/execute-request/execute.ts
|
|
116
|
+
var execute = (config, method, input) => Micro.gen(function* () {
|
|
117
|
+
const httpResponse = yield* Micro.tryPromise({
|
|
118
|
+
try: () => fetch(
|
|
119
|
+
`${config["base-url"]}/bot${config["bot-token"]}/${String.snakeToCamel(method)}`,
|
|
120
|
+
{
|
|
121
|
+
body: makePayload(input) ?? null,
|
|
122
|
+
method: "POST"
|
|
123
|
+
}
|
|
124
|
+
),
|
|
125
|
+
catch: (cause) => new TgBotClientError({
|
|
126
|
+
reason: { type: "ClientInternalError", cause }
|
|
127
|
+
})
|
|
128
|
+
});
|
|
129
|
+
const response = yield* Micro.tryPromise({
|
|
130
|
+
try: () => httpResponse.json(),
|
|
131
|
+
catch: () => new TgBotClientError({
|
|
132
|
+
reason: { type: "UnexpectedResponse", response: httpResponse }
|
|
133
|
+
})
|
|
134
|
+
});
|
|
135
|
+
if (!isTgBotApiResponse(response)) {
|
|
136
|
+
return yield* Micro.fail(new TgBotClientError({
|
|
137
|
+
reason: { type: "UnexpectedResponse", response }
|
|
138
|
+
}));
|
|
139
|
+
}
|
|
140
|
+
if (!httpResponse.ok) {
|
|
141
|
+
return yield* Micro.fail(new TgBotClientError({
|
|
142
|
+
reason: {
|
|
143
|
+
type: "NotOkResponse",
|
|
144
|
+
...response.error_code ? { errorCode: response.error_code } : void 0,
|
|
145
|
+
...response.description ? { details: response.description } : void 0
|
|
146
|
+
}
|
|
147
|
+
}));
|
|
148
|
+
}
|
|
149
|
+
return response.result;
|
|
150
|
+
});
|
|
151
|
+
|
|
152
|
+
// src/client/execute-request/_service.ts
|
|
153
|
+
var ClientExecuteRequestService = class extends Context2.Tag("ClientExecuteRequestService")() {
|
|
154
|
+
};
|
|
155
|
+
var ClientExecuteRequestServiceDefault = Micro2.gen(function* () {
|
|
156
|
+
const config = yield* Micro2.service(TgBotClientConfig);
|
|
157
|
+
return {
|
|
158
|
+
execute: (method, input) => execute(config, method, input)
|
|
159
|
+
};
|
|
160
|
+
});
|
|
161
|
+
|
|
162
|
+
// src/client/file/_service.ts
|
|
163
|
+
var Micro4 = __toESM(require("effect/Micro"));
|
|
164
|
+
var Context3 = __toESM(require("effect/Context"));
|
|
165
|
+
|
|
166
|
+
// src/client/file/get-file.ts
|
|
167
|
+
var Micro3 = __toESM(require("effect/Micro"));
|
|
168
|
+
var getFile = (fileId, config, execute2) => Micro3.gen(function* () {
|
|
169
|
+
const response = yield* execute2.execute("get_file", { file_id: fileId });
|
|
170
|
+
const file_path = response.file_path;
|
|
171
|
+
if (!file_path || file_path.length == 0) {
|
|
172
|
+
return yield* Micro3.fail(
|
|
173
|
+
new TgBotClientError({
|
|
174
|
+
reason: {
|
|
175
|
+
type: "UnableToGetFile",
|
|
176
|
+
cause: "File path not defined"
|
|
177
|
+
}
|
|
178
|
+
})
|
|
179
|
+
);
|
|
180
|
+
}
|
|
181
|
+
const file_name = file_path.replaceAll("/", "-");
|
|
182
|
+
const url = `${config["base-url"]}/file/bot${config["bot-token"]}/${file_path}`;
|
|
183
|
+
const fileContent = yield* Micro3.tryPromise({
|
|
184
|
+
try: () => fetch(url).then((_) => _.arrayBuffer()),
|
|
185
|
+
catch: (cause) => new TgBotClientError({
|
|
186
|
+
reason: { type: "UnableToGetFile", cause }
|
|
187
|
+
})
|
|
188
|
+
});
|
|
189
|
+
const file = new File([new Uint8Array(fileContent)], file_name);
|
|
190
|
+
return file;
|
|
191
|
+
});
|
|
192
|
+
|
|
193
|
+
// src/client/file/_service.ts
|
|
194
|
+
var ClientFileService = class extends Context3.Tag("ClientFileService")() {
|
|
195
|
+
};
|
|
196
|
+
var ClientFileServiceDefault = Micro4.gen(function* () {
|
|
197
|
+
const config = yield* Micro4.service(TgBotClientConfig);
|
|
198
|
+
const execute2 = yield* Micro4.service(ClientExecuteRequestService);
|
|
199
|
+
return {
|
|
200
|
+
getFile: (input) => getFile(input.file_id, config, execute2)
|
|
201
|
+
};
|
|
202
|
+
}).pipe(
|
|
203
|
+
Micro4.provideServiceEffect(ClientExecuteRequestService, ClientExecuteRequestServiceDefault)
|
|
204
|
+
);
|
|
205
|
+
|
|
206
|
+
// src/client/_client.ts
|
|
207
|
+
var makeTgBotClient = (input) => {
|
|
208
|
+
const config = makeTgBotClientConfig(input);
|
|
209
|
+
const client = Micro5.gen(function* () {
|
|
210
|
+
const execute2 = yield* Micro5.service(ClientExecuteRequestService);
|
|
211
|
+
const file = yield* Micro5.service(ClientFileService);
|
|
212
|
+
return {
|
|
213
|
+
execute: (method, input2) => execute2.execute(method, input2).pipe(Micro5.runPromise),
|
|
214
|
+
getFile: (input2) => file.getFile(input2).pipe(Micro5.runPromise)
|
|
215
|
+
};
|
|
216
|
+
}).pipe(
|
|
217
|
+
Micro5.provideServiceEffect(ClientExecuteRequestService, ClientExecuteRequestServiceDefault),
|
|
218
|
+
Micro5.provideServiceEffect(ClientFileService, ClientFileServiceDefault),
|
|
219
|
+
Micro5.provideService(TgBotClientConfig, config),
|
|
220
|
+
Micro5.runSync
|
|
221
|
+
);
|
|
222
|
+
return client;
|
|
223
|
+
};
|
|
224
|
+
|
|
225
|
+
// src/bot/run.ts
|
|
226
|
+
var Micro12 = __toESM(require("effect/Micro"));
|
|
227
|
+
|
|
228
|
+
// src/bot/factory/_service.ts
|
|
229
|
+
var Micro11 = __toESM(require("effect/Micro"));
|
|
230
|
+
var Context5 = __toESM(require("effect/Context"));
|
|
231
|
+
|
|
232
|
+
// src/bot/factory/client-config.ts
|
|
233
|
+
var Micro6 = __toESM(require("effect/Micro"));
|
|
234
|
+
var makeClientConfigFrom = (input) => Micro6.gen(function* () {
|
|
235
|
+
if (input.type == "config") {
|
|
236
|
+
return makeTgBotClientConfig(input);
|
|
237
|
+
}
|
|
238
|
+
const config = yield* Micro6.tryPromise({
|
|
239
|
+
try: async () => {
|
|
240
|
+
const { readFile } = await import("fs/promises");
|
|
241
|
+
return JSON.parse(await readFile("config.json", "utf-8"));
|
|
242
|
+
},
|
|
243
|
+
catch: (error) => {
|
|
244
|
+
console.warn(error);
|
|
245
|
+
return "ReadingConfigError";
|
|
246
|
+
}
|
|
247
|
+
});
|
|
248
|
+
if (!isTgBotClientSettingsInput(config)) {
|
|
249
|
+
return yield* Micro6.fail("InvalidConfig");
|
|
250
|
+
}
|
|
251
|
+
return makeTgBotClientConfig(config);
|
|
252
|
+
});
|
|
253
|
+
|
|
254
|
+
// src/bot/factory/make-bot.ts
|
|
255
|
+
var Micro10 = __toESM(require("effect/Micro"));
|
|
256
|
+
|
|
257
|
+
// src/bot/update-poller/_service.ts
|
|
258
|
+
var Micro9 = __toESM(require("effect/Micro"));
|
|
259
|
+
var Context4 = __toESM(require("effect/Context"));
|
|
260
|
+
|
|
261
|
+
// src/bot/update-poller/poll-and-handle.ts
|
|
262
|
+
var Micro8 = __toESM(require("effect/Micro"));
|
|
263
|
+
|
|
264
|
+
// src/bot/update-poller/settings.ts
|
|
265
|
+
var makeSettingsFrom = (input) => {
|
|
266
|
+
let limit = input.batch_size ?? 10;
|
|
267
|
+
let timeout = input.timeout ?? 10;
|
|
268
|
+
let max_empty_responses = input.max_empty_responses;
|
|
269
|
+
if (limit < 10 || limit > 100) {
|
|
270
|
+
console.warn("Wrong limit, must be in [10..100], using 10 instead");
|
|
271
|
+
limit = 10;
|
|
272
|
+
}
|
|
273
|
+
if (timeout < 2 || timeout > 10) {
|
|
274
|
+
console.warn("Wrong timeout, must be in [2..10], using 2 instead");
|
|
275
|
+
limit = 10;
|
|
276
|
+
}
|
|
277
|
+
if (max_empty_responses && max_empty_responses < 2) {
|
|
278
|
+
console.warn("Wrong max_empty_responses, must be in [2..infinity], using infinity");
|
|
279
|
+
max_empty_responses = void 0;
|
|
280
|
+
}
|
|
281
|
+
return {
|
|
282
|
+
limit,
|
|
283
|
+
timeout,
|
|
284
|
+
max_empty_responses
|
|
285
|
+
};
|
|
286
|
+
};
|
|
287
|
+
|
|
288
|
+
// src/bot/update-poller/fetch-updates.ts
|
|
289
|
+
var Micro7 = __toESM(require("effect/Micro"));
|
|
290
|
+
|
|
291
|
+
// src/bot/message-handler/utils.ts
|
|
292
|
+
var extractUpdate = (input) => {
|
|
293
|
+
for (const [field, value] of Object.entries(input)) {
|
|
294
|
+
if (field == "update_id") {
|
|
295
|
+
continue;
|
|
296
|
+
}
|
|
297
|
+
return {
|
|
298
|
+
type: field,
|
|
299
|
+
...value
|
|
300
|
+
};
|
|
301
|
+
}
|
|
302
|
+
return void 0;
|
|
303
|
+
};
|
|
304
|
+
|
|
305
|
+
// src/bot/update-poller/fetch-updates.ts
|
|
306
|
+
var fetchUpdates = ({ state, settings, execute: execute2, handlers }) => Micro7.gen(function* () {
|
|
307
|
+
const updateId = state.lastUpdateId;
|
|
308
|
+
console.info("getting updates", state);
|
|
309
|
+
const updates = yield* execute2("get_updates", {
|
|
310
|
+
...settings,
|
|
311
|
+
...updateId ? { offset: updateId } : void 0
|
|
312
|
+
}).pipe(
|
|
313
|
+
Micro7.andThen((_) => _.sort((_2) => _2.update_id))
|
|
314
|
+
);
|
|
315
|
+
let lastSuccessId = void 0;
|
|
316
|
+
let hasError = false;
|
|
317
|
+
for (const updateObject of updates) {
|
|
318
|
+
const update = extractUpdate(updateObject);
|
|
319
|
+
if (!update) {
|
|
320
|
+
console.warn("Unknown update", update);
|
|
321
|
+
hasError = true;
|
|
322
|
+
break;
|
|
323
|
+
}
|
|
324
|
+
const handler = handlers[`on_${update.type}`];
|
|
325
|
+
if (!handler) {
|
|
326
|
+
console.warn("Handler for update not defined", update);
|
|
327
|
+
hasError = true;
|
|
328
|
+
break;
|
|
329
|
+
}
|
|
330
|
+
const handleResult = handler(update);
|
|
331
|
+
if ("chat" in update) {
|
|
332
|
+
const response = yield* execute2(`send_${handleResult.type}`, {
|
|
333
|
+
...handleResult,
|
|
334
|
+
chat_id: update.chat.id
|
|
335
|
+
});
|
|
336
|
+
console.log("bot response", response);
|
|
337
|
+
}
|
|
338
|
+
if (!handleResult) {
|
|
339
|
+
hasError = true;
|
|
340
|
+
console.log(handleResult);
|
|
341
|
+
break;
|
|
342
|
+
}
|
|
343
|
+
;
|
|
344
|
+
lastSuccessId = updateObject.update_id;
|
|
345
|
+
}
|
|
346
|
+
if (hasError && lastSuccessId) {
|
|
347
|
+
const resp = (
|
|
348
|
+
//commit successfully handled messages
|
|
349
|
+
yield* execute2("get_updates", {
|
|
350
|
+
offset: lastSuccessId,
|
|
351
|
+
limit: 0
|
|
352
|
+
})
|
|
353
|
+
);
|
|
354
|
+
}
|
|
355
|
+
return { updates, lastSuccessId, hasError };
|
|
356
|
+
});
|
|
357
|
+
|
|
358
|
+
// src/bot/update-poller/poll-and-handle.ts
|
|
359
|
+
var pollAndHandle = (input) => {
|
|
360
|
+
const state = {
|
|
361
|
+
lastUpdateId: void 0,
|
|
362
|
+
emptyResponses: 0
|
|
363
|
+
};
|
|
364
|
+
const settings = makeSettingsFrom(input.settings);
|
|
365
|
+
return Micro8.delay(1e3)(
|
|
366
|
+
fetchUpdates({
|
|
367
|
+
state,
|
|
368
|
+
settings,
|
|
369
|
+
execute: input.execute,
|
|
370
|
+
handlers: input.settings
|
|
371
|
+
})
|
|
372
|
+
).pipe(
|
|
373
|
+
Micro8.repeat({
|
|
374
|
+
while: ({ updates, lastSuccessId, hasError }) => {
|
|
375
|
+
if (hasError) {
|
|
376
|
+
console.warn("error in handler, quitting");
|
|
377
|
+
return false;
|
|
378
|
+
}
|
|
379
|
+
if (updates.length == 0) {
|
|
380
|
+
state.emptyResponses += 1;
|
|
381
|
+
if (settings.max_empty_responses && state.emptyResponses > settings.max_empty_responses) {
|
|
382
|
+
console.info("too many empty responses, quitting");
|
|
383
|
+
return false;
|
|
384
|
+
}
|
|
385
|
+
} else {
|
|
386
|
+
state.emptyResponses = 0;
|
|
387
|
+
}
|
|
388
|
+
;
|
|
389
|
+
if (lastSuccessId) {
|
|
390
|
+
state.lastUpdateId = lastSuccessId + 1;
|
|
391
|
+
}
|
|
392
|
+
return true;
|
|
393
|
+
}
|
|
394
|
+
})
|
|
395
|
+
);
|
|
396
|
+
};
|
|
397
|
+
|
|
398
|
+
// src/bot/update-poller/_service.ts
|
|
399
|
+
var BotUpdatePollerService = class extends Context4.Tag("BotUpdatePollerService")() {
|
|
400
|
+
};
|
|
401
|
+
var BotUpdatesPollerServiceDefault = Micro9.gen(function* () {
|
|
402
|
+
const state = {
|
|
403
|
+
isActive: false
|
|
404
|
+
};
|
|
405
|
+
const client = yield* Micro9.service(ClientExecuteRequestService);
|
|
406
|
+
const runBot = (messageHandler) => Micro9.gen(function* () {
|
|
407
|
+
if (state.isActive) {
|
|
408
|
+
return yield* Micro9.fail("AlreadyRunning");
|
|
409
|
+
}
|
|
410
|
+
const fiber = yield* pollAndHandle({
|
|
411
|
+
settings: messageHandler,
|
|
412
|
+
execute: client.execute
|
|
413
|
+
}).pipe(Micro9.forkDaemon);
|
|
414
|
+
fiber.addObserver((exit) => {
|
|
415
|
+
console.log("bot's fiber has been closed", exit);
|
|
416
|
+
state.isActive = false;
|
|
417
|
+
});
|
|
418
|
+
console.log("Reading bot's updates...");
|
|
419
|
+
return fiber;
|
|
420
|
+
});
|
|
421
|
+
return {
|
|
422
|
+
runBot
|
|
423
|
+
};
|
|
424
|
+
}).pipe(
|
|
425
|
+
Micro9.provideServiceEffect(ClientExecuteRequestService, ClientExecuteRequestServiceDefault)
|
|
426
|
+
);
|
|
427
|
+
|
|
428
|
+
// src/bot/factory/make-bot.ts
|
|
429
|
+
var makeBot = (messageHandler) => Micro10.gen(function* () {
|
|
430
|
+
const { runBot } = yield* Micro10.service(BotUpdatePollerService);
|
|
431
|
+
return yield* runBot(messageHandler);
|
|
432
|
+
}).pipe(
|
|
433
|
+
Micro10.provideServiceEffect(BotUpdatePollerService, BotUpdatesPollerServiceDefault),
|
|
434
|
+
Micro10.tapError((error) => {
|
|
435
|
+
console.error(error);
|
|
436
|
+
return Micro10.void;
|
|
437
|
+
})
|
|
438
|
+
);
|
|
439
|
+
|
|
440
|
+
// src/bot/factory/_service.ts
|
|
441
|
+
var BotFactoryService = class extends Context5.Tag("BotFactoryService")() {
|
|
442
|
+
};
|
|
443
|
+
var BotFactoryServiceDefault = {
|
|
444
|
+
makeBot,
|
|
445
|
+
runBot: (input) => makeBot(input).pipe(
|
|
446
|
+
Micro11.provideServiceEffect(TgBotClientConfig, makeClientConfigFrom(input))
|
|
447
|
+
)
|
|
448
|
+
};
|
|
449
|
+
|
|
450
|
+
// src/bot/run.ts
|
|
451
|
+
var runTgChatBot = (input) => BotFactoryServiceDefault.runBot(input).pipe(Micro12.runPromiseExit);
|
|
452
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
453
|
+
0 && (module.exports = {
|
|
454
|
+
BotFactoryService,
|
|
455
|
+
BotFactoryServiceDefault,
|
|
456
|
+
MESSAGE_EFFECTS,
|
|
457
|
+
defaultBaseUrl,
|
|
458
|
+
isMessageEffect,
|
|
459
|
+
makeTgBotClient,
|
|
460
|
+
messageEffectIdCodes,
|
|
461
|
+
runTgChatBot
|
|
462
|
+
});
|