chz-telegram-bot 0.3.10 → 0.3.12
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/builtin/helpAction.ts +1 -1
- package/dist/builtin/helpAction.js +1 -1
- package/dist/dtos/chatInfo.js +4 -0
- package/dist/dtos/commandTriggerCheckResult.js +3 -0
- package/dist/dtos/incomingMessage.js +9 -1
- package/dist/dtos/incomingQuery.js +5 -0
- package/dist/dtos/replyInfo.js +2 -0
- package/dist/dtos/responses/delay.js +6 -2
- package/dist/dtos/responses/imageMessage.js +10 -4
- package/dist/dtos/responses/inlineQueryResponse.js +6 -2
- package/dist/dtos/responses/reaction.js +7 -2
- package/dist/dtos/responses/textMessage.js +10 -3
- package/dist/dtos/responses/unpin.js +6 -2
- package/dist/dtos/responses/videoMessage.js +10 -4
- package/dist/entities/actions/commandAction.d.ts +4 -1
- package/dist/entities/actions/commandAction.d.ts.map +1 -1
- package/dist/entities/actions/commandAction.js +46 -17
- package/dist/entities/actions/inlineQueryAction.d.ts.map +1 -1
- package/dist/entities/actions/inlineQueryAction.js +8 -1
- package/dist/entities/actions/replyCaptureAction.d.ts.map +1 -1
- package/dist/entities/actions/replyCaptureAction.js +8 -1
- package/dist/entities/actions/scheduledAction.d.ts.map +1 -1
- package/dist/entities/actions/scheduledAction.js +13 -14
- package/dist/entities/botInstance.js +6 -1
- package/dist/entities/cachedStateFactory.js +2 -0
- package/dist/entities/context/baseContext.js +14 -2
- package/dist/entities/context/chatContext.d.ts +0 -3
- package/dist/entities/context/chatContext.d.ts.map +1 -1
- package/dist/entities/context/chatContext.js +38 -41
- package/dist/entities/context/inlineQueryContext.d.ts +0 -3
- package/dist/entities/context/inlineQueryContext.d.ts.map +1 -1
- package/dist/entities/context/inlineQueryContext.js +12 -6
- package/dist/entities/context/messageContext.d.ts +0 -3
- package/dist/entities/context/messageContext.d.ts.map +1 -1
- package/dist/entities/context/messageContext.js +77 -68
- package/dist/entities/context/replyContext.d.ts +0 -3
- package/dist/entities/context/replyContext.d.ts.map +1 -1
- package/dist/entities/context/replyContext.js +90 -65
- package/dist/entities/states/actionStateBase.js +2 -4
- package/dist/entities/taskRecord.js +3 -0
- package/dist/helpers/builders/commandActionBuilder.d.ts +3 -0
- package/dist/helpers/builders/commandActionBuilder.d.ts.map +1 -1
- package/dist/helpers/builders/commandActionBuilder.js +18 -9
- package/dist/helpers/builders/inlineQueryActionBuilder.js +7 -6
- package/dist/helpers/builders/scheduledActionBuilder.js +7 -5
- package/dist/helpers/mapUtils.d.ts +3 -0
- package/dist/helpers/mapUtils.d.ts.map +1 -0
- package/dist/helpers/mapUtils.js +17 -0
- package/dist/helpers/noop.d.ts +3 -4
- package/dist/helpers/noop.d.ts.map +1 -1
- package/dist/helpers/noop.js +2 -1
- package/dist/helpers/traceFactory.d.ts +1 -1
- package/dist/helpers/traceFactory.d.ts.map +1 -1
- package/dist/main.js +1 -3
- package/dist/services/actionProcessingService.d.ts.map +1 -1
- package/dist/services/actionProcessingService.js +15 -3
- package/dist/services/actionProcessors/baseProcessor.d.ts +1 -3
- package/dist/services/actionProcessors/baseProcessor.d.ts.map +1 -1
- package/dist/services/actionProcessors/baseProcessor.js +6 -2
- package/dist/services/actionProcessors/commandActionProcessor.d.ts +0 -4
- package/dist/services/actionProcessors/commandActionProcessor.d.ts.map +1 -1
- package/dist/services/actionProcessors/commandActionProcessor.js +10 -13
- package/dist/services/actionProcessors/inlineQueryActionProcessor.d.ts +0 -4
- package/dist/services/actionProcessors/inlineQueryActionProcessor.d.ts.map +1 -1
- package/dist/services/actionProcessors/inlineQueryActionProcessor.js +4 -6
- package/dist/services/actionProcessors/scheduledActionProcessor.js +6 -4
- package/dist/services/jsonFileStorage.d.ts +4 -3
- package/dist/services/jsonFileStorage.d.ts.map +1 -1
- package/dist/services/jsonFileStorage.js +22 -14
- package/dist/services/jsonLogger.d.ts +1 -1
- package/dist/services/jsonLogger.d.ts.map +1 -1
- package/dist/services/jsonLogger.js +9 -3
- package/dist/services/nodeTimeoutScheduler.d.ts +2 -2
- package/dist/services/nodeTimeoutScheduler.d.ts.map +1 -1
- package/dist/services/nodeTimeoutScheduler.js +6 -5
- package/dist/services/responseProcessingQueue.d.ts.map +1 -1
- package/dist/services/responseProcessingQueue.js +9 -7
- package/dist/services/telegramApi.d.ts.map +1 -1
- package/dist/services/telegramApi.js +17 -8
- package/dist/types/commandTrigger.d.ts +1 -2
- package/dist/types/commandTrigger.d.ts.map +1 -1
- package/dist/types/handlers.d.ts +1 -1
- package/dist/types/handlers.d.ts.map +1 -1
- package/dist/types/logger.d.ts +2 -2
- package/dist/types/logger.d.ts.map +1 -1
- package/dist/types/scheduler.d.ts +2 -2
- package/dist/types/scheduler.d.ts.map +1 -1
- package/dist/types/storage.d.ts +2 -2
- package/dist/types/storage.d.ts.map +1 -1
- package/dist/types/timeValues.d.ts +3 -3
- package/dist/types/timeValues.d.ts.map +1 -1
- package/dist/types/trace.d.ts +1 -1
- package/dist/types/trace.d.ts.map +1 -1
- package/dtos/incomingMessage.ts +1 -1
- package/entities/actions/commandAction.ts +55 -28
- package/entities/actions/inlineQueryAction.ts +5 -1
- package/entities/actions/replyCaptureAction.ts +5 -1
- package/entities/actions/scheduledAction.ts +11 -13
- package/entities/botInstance.ts +7 -7
- package/entities/context/chatContext.ts +0 -6
- package/entities/context/inlineQueryContext.ts +0 -6
- package/entities/context/messageContext.ts +0 -6
- package/entities/context/replyContext.ts +18 -15
- package/eslint.config.js +26 -1
- package/helpers/builders/commandActionBuilder.ts +10 -0
- package/helpers/mapUtils.ts +15 -0
- package/helpers/noop.ts +4 -4
- package/helpers/traceFactory.ts +2 -2
- package/package.json +1 -1
- package/services/actionProcessingService.ts +8 -4
- package/services/actionProcessors/baseProcessor.ts +5 -8
- package/services/actionProcessors/commandActionProcessor.ts +5 -17
- package/services/actionProcessors/inlineQueryActionProcessor.ts +5 -15
- package/services/actionProcessors/scheduledActionProcessor.ts +4 -4
- package/services/jsonFileStorage.ts +39 -21
- package/services/jsonLogger.ts +12 -8
- package/services/nodeTimeoutScheduler.ts +6 -6
- package/services/responseProcessingQueue.ts +9 -4
- package/services/telegramApi.ts +7 -5
- package/tsconfig.json +1 -1
- package/types/commandTrigger.ts +1 -3
- package/types/handlers.ts +1 -1
- package/types/logger.ts +3 -6
- package/types/scheduler.ts +2 -2
- package/types/storage.ts +2 -2
- package/types/timeValues.ts +3 -3
- package/types/trace.ts +3 -1
|
@@ -7,17 +7,18 @@ const inlineQueryAction_1 = require("../../entities/actions/inlineQueryAction");
|
|
|
7
7
|
* Builder for `InlineQueryAction`
|
|
8
8
|
*/
|
|
9
9
|
class InlineQueryActionBuilder {
|
|
10
|
+
name;
|
|
11
|
+
pattern = /.+/gi;
|
|
12
|
+
active = true;
|
|
13
|
+
cooldownSeconds = 0;
|
|
14
|
+
blacklist = [];
|
|
15
|
+
allowedUsers = [];
|
|
16
|
+
handler = noop_1.Noop.call;
|
|
10
17
|
/**
|
|
11
18
|
* Builder for `InlineQueryAction`
|
|
12
19
|
* @param name Action name, will be used for logging and storage
|
|
13
20
|
*/
|
|
14
21
|
constructor(name) {
|
|
15
|
-
this.pattern = /.+/gi;
|
|
16
|
-
this.active = true;
|
|
17
|
-
this.cooldownSeconds = 0;
|
|
18
|
-
this.blacklist = [];
|
|
19
|
-
this.allowedUsers = [];
|
|
20
|
-
this.handler = noop_1.Noop.call;
|
|
21
22
|
this.name = name;
|
|
22
23
|
}
|
|
23
24
|
/**
|
|
@@ -9,17 +9,19 @@ const noop_1 = require("../noop");
|
|
|
9
9
|
* Builder for `ScheduledAction` with state represented by `TActionState`
|
|
10
10
|
*/
|
|
11
11
|
class ScheduledActionBuilderWithState {
|
|
12
|
+
active = true;
|
|
13
|
+
time = 0;
|
|
14
|
+
cachedStateFactories = new Map();
|
|
15
|
+
whitelist = [];
|
|
16
|
+
stateConstructor;
|
|
17
|
+
handler = noop_1.Noop.call;
|
|
18
|
+
name;
|
|
12
19
|
/**
|
|
13
20
|
* Builder for `ScheduledAction` with state represented by `TActionState`
|
|
14
21
|
* @param name Action name, will be used for logging and storage
|
|
15
22
|
* @param stateConstructor Function that creates default state object
|
|
16
23
|
*/
|
|
17
24
|
constructor(name, stateConstructor) {
|
|
18
|
-
this.active = true;
|
|
19
|
-
this.time = 0;
|
|
20
|
-
this.cachedStateFactories = new Map();
|
|
21
|
-
this.whitelist = [];
|
|
22
|
-
this.handler = noop_1.Noop.call;
|
|
23
25
|
this.name = name;
|
|
24
26
|
this.stateConstructor = stateConstructor;
|
|
25
27
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mapUtils.d.ts","sourceRoot":"","sources":["../../helpers/mapUtils.ts"],"names":[],"mappings":"AAAA,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,KAO5E;AAED,wBAAgB,UAAU,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,kBAKrE"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getOrSetIfNotExists = getOrSetIfNotExists;
|
|
4
|
+
exports.getOrThrow = getOrThrow;
|
|
5
|
+
function getOrSetIfNotExists(map, key, fallback) {
|
|
6
|
+
const existingValue = map.get(key);
|
|
7
|
+
if (existingValue)
|
|
8
|
+
return existingValue;
|
|
9
|
+
map.set(key, fallback);
|
|
10
|
+
return fallback;
|
|
11
|
+
}
|
|
12
|
+
function getOrThrow(map, key, error) {
|
|
13
|
+
const existingValue = map.get(key);
|
|
14
|
+
if (existingValue)
|
|
15
|
+
return existingValue;
|
|
16
|
+
throw new Error(error);
|
|
17
|
+
}
|
package/dist/helpers/noop.d.ts
CHANGED
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
import { BotResponse } from '../types/response';
|
|
2
2
|
export declare class Noop {
|
|
3
3
|
static NoResponse: BotResponse[];
|
|
4
|
-
static true
|
|
5
|
-
static false
|
|
6
|
-
static call
|
|
7
|
-
static call<T1, T2>(arg1: T1, arg2: T2): Promise<void>;
|
|
4
|
+
static true(arg1: unknown): boolean;
|
|
5
|
+
static false(arg1: unknown): boolean;
|
|
6
|
+
static call(arg1: unknown): Promise<void>;
|
|
8
7
|
}
|
|
9
8
|
//# sourceMappingURL=noop.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"noop.d.ts","sourceRoot":"","sources":["../../helpers/noop.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"noop.d.ts","sourceRoot":"","sources":["../../helpers/noop.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAIhD,qBAAa,IAAI;IACb,MAAM,CAAC,UAAU,EAAE,WAAW,EAAE,CAAM;IACtC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO;IAGzB,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO;WAIb,IAAI,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;CAElD"}
|
package/dist/helpers/noop.js
CHANGED
|
@@ -2,7 +2,9 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.Noop = void 0;
|
|
4
4
|
/* eslint-disable @typescript-eslint/no-unused-vars */
|
|
5
|
+
// eslint-disable-next-line @typescript-eslint/no-extraneous-class
|
|
5
6
|
class Noop {
|
|
7
|
+
static NoResponse = [];
|
|
6
8
|
static true(arg1) {
|
|
7
9
|
return true;
|
|
8
10
|
}
|
|
@@ -12,4 +14,3 @@ class Noop {
|
|
|
12
14
|
static async call(arg1, arg2) { }
|
|
13
15
|
}
|
|
14
16
|
exports.Noop = Noop;
|
|
15
|
-
Noop.NoResponse = [];
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import { TraceId } from '../types/trace';
|
|
2
|
-
export declare function createTrace
|
|
2
|
+
export declare function createTrace(traceOwner: object | string, botName: string, traceName: string): TraceId;
|
|
3
3
|
//# sourceMappingURL=traceFactory.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"traceFactory.d.ts","sourceRoot":"","sources":["../../helpers/traceFactory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAEzC,wBAAgB,WAAW,
|
|
1
|
+
{"version":3,"file":"traceFactory.d.ts","sourceRoot":"","sources":["../../helpers/traceFactory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAEzC,wBAAgB,WAAW,CACvB,UAAU,EAAE,MAAM,GAAG,MAAM,EAC3B,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,GAIa,OAAO,CACxC"}
|
package/dist/main.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"actionProcessingService.d.ts","sourceRoot":"","sources":["../../services/actionProcessingService.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAuB,MAAM,qBAAqB,CAAC;AAEnE,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElD,OAAO,EAAE,iBAAiB,EAAE,MAAM,uCAAuC,CAAC;AAC1E,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,mCAAmC,CAAC;AAClE,OAAO,EAAE,eAAe,EAAE,MAAM,qCAAqC,CAAC;AAMtE,qBAAa,uBAAuB;IAChC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAiB;IACzC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAU;IAEjC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAyB;IAC1D,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAA2B;IAC9D,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAA6B;IAElE,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IAEjC,OAAO,CAAC,QAAQ,CAAY;gBAGxB,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC7B,OAAO,EAAE,cAAc,EACvB,SAAS,EAAE,UAAU,EACrB,MAAM,EAAE,OAAO;IA4Bb,UAAU,CACZ,KAAK,EAAE,MAAM,EACb,OAAO,EAAE;QACL,QAAQ,EAAE,aAAa,CAAC,YAAY,CAAC,EAAE,CAAC;QACxC,SAAS,EAAE,eAAe,CAAC,YAAY,CAAC,EAAE,CAAC;QAC3C,aAAa,EAAE,iBAAiB,EAAE,CAAC;KACtC,EACD,eAAe,CAAC,EAAE,OAAO,EACzB,gCAAgC,CAAC,EAAE,OAAO;
|
|
1
|
+
{"version":3,"file":"actionProcessingService.d.ts","sourceRoot":"","sources":["../../services/actionProcessingService.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAuB,MAAM,qBAAqB,CAAC;AAEnE,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElD,OAAO,EAAE,iBAAiB,EAAE,MAAM,uCAAuC,CAAC;AAC1E,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,mCAAmC,CAAC;AAClE,OAAO,EAAE,eAAe,EAAE,MAAM,qCAAqC,CAAC;AAMtE,qBAAa,uBAAuB;IAChC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAiB;IACzC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAU;IAEjC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAyB;IAC1D,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAA2B;IAC9D,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAA6B;IAElE,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IAEjC,OAAO,CAAC,QAAQ,CAAY;gBAGxB,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC7B,OAAO,EAAE,cAAc,EACvB,SAAS,EAAE,UAAU,EACrB,MAAM,EAAE,OAAO;IA4Bb,UAAU,CACZ,KAAK,EAAE,MAAM,EACb,OAAO,EAAE;QACL,QAAQ,EAAE,aAAa,CAAC,YAAY,CAAC,EAAE,CAAC;QACxC,SAAS,EAAE,eAAe,CAAC,YAAY,CAAC,EAAE,CAAC;QAC3C,aAAa,EAAE,iBAAiB,EAAE,CAAC;KACtC,EACD,eAAe,CAAC,EAAE,OAAO,EACzB,gCAAgC,CAAC,EAAE,OAAO;IA0D9C,IAAI,CAAC,IAAI,EAAE,MAAM;CAGpB"}
|
|
@@ -9,6 +9,13 @@ const commandActionProcessor_1 = require("./actionProcessors/commandActionProces
|
|
|
9
9
|
const inlineQueryActionProcessor_1 = require("./actionProcessors/inlineQueryActionProcessor");
|
|
10
10
|
const scheduledActionProcessor_1 = require("./actionProcessors/scheduledActionProcessor");
|
|
11
11
|
class ActionProcessingService {
|
|
12
|
+
storage;
|
|
13
|
+
logger;
|
|
14
|
+
commandProcessor;
|
|
15
|
+
scheduledProcessor;
|
|
16
|
+
inlineQueryProcessor;
|
|
17
|
+
botName;
|
|
18
|
+
telegraf;
|
|
12
19
|
constructor(botName, chats, storage, scheduler, logger) {
|
|
13
20
|
this.storage = storage;
|
|
14
21
|
this.logger = logger;
|
|
@@ -19,7 +26,9 @@ class ActionProcessingService {
|
|
|
19
26
|
}
|
|
20
27
|
async initialize(token, actions, scheduledPeriod, verboseLoggingForIncomingMessage) {
|
|
21
28
|
this.telegraf = new telegraf_1.Telegraf(token);
|
|
22
|
-
const api = new telegramApi_1.TelegramApiService(this.botName, this.telegraf.telegram, this.storage, this.logger, (capture, id, chatInfo, traceId) =>
|
|
29
|
+
const api = new telegramApi_1.TelegramApiService(this.botName, this.telegraf.telegram, this.storage, this.logger, (capture, id, chatInfo, traceId) => {
|
|
30
|
+
this.commandProcessor.captureRegistrationCallback(capture, id, chatInfo, traceId);
|
|
31
|
+
});
|
|
23
32
|
const botInfo = await this.telegraf.telegram.getMe();
|
|
24
33
|
const commandActions = actions.commands.length > 0
|
|
25
34
|
? [
|
|
@@ -32,8 +41,11 @@ class ActionProcessingService {
|
|
|
32
41
|
this.commandProcessor.initialize(api, this.telegraf, commandActions, verboseLoggingForIncomingMessage ?? false);
|
|
33
42
|
this.inlineQueryProcessor.initialize(api, this.telegraf, actions.inlineQueries, 300);
|
|
34
43
|
this.scheduledProcessor.initialize(api, actions.scheduled, scheduledPeriod ?? (0, timeConvertions_1.hoursToSeconds)(1));
|
|
35
|
-
this.storage.saveMetadata([
|
|
36
|
-
|
|
44
|
+
void this.storage.saveMetadata([
|
|
45
|
+
...actions.scheduled,
|
|
46
|
+
...commandActions
|
|
47
|
+
]);
|
|
48
|
+
void this.telegraf.launch();
|
|
37
49
|
}
|
|
38
50
|
stop(code) {
|
|
39
51
|
this.telegraf.stop(code);
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { Telegraf } from 'telegraf';
|
|
2
1
|
import { ILogger } from '../../types/logger';
|
|
3
2
|
import { IScheduler } from '../../types/scheduler';
|
|
4
3
|
import { IStorageClient } from '../../types/storage';
|
|
@@ -11,10 +10,9 @@ export declare abstract class BaseActionProcessor {
|
|
|
11
10
|
protected readonly logger: ILogger;
|
|
12
11
|
protected readonly botName: string;
|
|
13
12
|
protected api: TelegramApiService;
|
|
14
|
-
protected telegraf: Telegraf;
|
|
15
13
|
constructor(botName: string, storage: IStorageClient, scheduler: IScheduler, logger: ILogger);
|
|
16
14
|
private defaultErrorHandler;
|
|
17
|
-
initializeDependencies(api: TelegramApiService
|
|
15
|
+
initializeDependencies(api: TelegramApiService): void;
|
|
18
16
|
executeAction<TAction extends IAction, TActionContext extends BaseContext<TAction>>(action: TAction, ctx: TActionContext, errorHandler?: (error: Error, ctx: TActionContext) => void): Promise<void>;
|
|
19
17
|
}
|
|
20
18
|
//# sourceMappingURL=baseProcessor.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"baseProcessor.d.ts","sourceRoot":"","sources":["../../../services/actionProcessors/baseProcessor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"baseProcessor.d.ts","sourceRoot":"","sources":["../../../services/actionProcessors/baseProcessor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,oCAAoC,CAAC;AAEjE,8BAAsB,mBAAmB;IACrC,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,cAAc,CAAC;IAC3C,SAAS,CAAC,QAAQ,CAAC,SAAS,EAAE,UAAU,CAAC;IACzC,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IAEnC,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IAEnC,SAAS,CAAC,GAAG,EAAG,kBAAkB,CAAC;gBAG/B,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,cAAc,EACvB,SAAS,EAAE,UAAU,EACrB,MAAM,EAAE,OAAO;IASnB,OAAO,CAAC,mBAAmB;IAO3B,sBAAsB,CAAC,GAAG,EAAE,kBAAkB;IAIxC,aAAa,CACf,OAAO,SAAS,OAAO,EACvB,cAAc,SAAS,WAAW,CAAC,OAAO,CAAC,EAE3C,MAAM,EAAE,OAAO,EACf,GAAG,EAAE,cAAc,EACnB,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,cAAc,KAAK,IAAI;CAUjE"}
|
|
@@ -2,6 +2,11 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.BaseActionProcessor = void 0;
|
|
4
4
|
class BaseActionProcessor {
|
|
5
|
+
storage;
|
|
6
|
+
scheduler;
|
|
7
|
+
logger;
|
|
8
|
+
botName;
|
|
9
|
+
api;
|
|
5
10
|
constructor(botName, storage, scheduler, logger) {
|
|
6
11
|
this.storage = storage;
|
|
7
12
|
this.scheduler = scheduler;
|
|
@@ -11,9 +16,8 @@ class BaseActionProcessor {
|
|
|
11
16
|
defaultErrorHandler(error, ctx) {
|
|
12
17
|
ctx.logger.errorWithTraceId(error, ctx);
|
|
13
18
|
}
|
|
14
|
-
initializeDependencies(api
|
|
19
|
+
initializeDependencies(api) {
|
|
15
20
|
this.api = api;
|
|
16
|
-
this.telegraf = telegraf;
|
|
17
21
|
}
|
|
18
22
|
async executeAction(action, ctx, errorHandler) {
|
|
19
23
|
try {
|
|
@@ -1,9 +1,6 @@
|
|
|
1
1
|
import { Telegraf } from 'telegraf';
|
|
2
2
|
import { CommandAction } from '../../entities/actions/commandAction';
|
|
3
3
|
import { IActionState } from '../../types/actionState';
|
|
4
|
-
import { ILogger } from '../../types/logger';
|
|
5
|
-
import { IScheduler } from '../../types/scheduler';
|
|
6
|
-
import { IStorageClient } from '../../types/storage';
|
|
7
4
|
import { TelegramApiService } from '../telegramApi';
|
|
8
5
|
import { IReplyCapture } from '../../types/capture';
|
|
9
6
|
import { TraceId } from '../../types/trace';
|
|
@@ -12,7 +9,6 @@ import { BaseActionProcessor } from './baseProcessor';
|
|
|
12
9
|
export declare class CommandActionProcessor extends BaseActionProcessor {
|
|
13
10
|
private readonly replyCaptures;
|
|
14
11
|
private commands;
|
|
15
|
-
constructor(botName: string, storage: IStorageClient, scheduler: IScheduler, logger: ILogger);
|
|
16
12
|
initialize(api: TelegramApiService, telegraf: Telegraf, commands: CommandAction<IActionState>[], verboseLoggingForIncomingMessage: boolean): void;
|
|
17
13
|
captureRegistrationCallback(capture: IReplyCapture, parentMessageId: number, chatInfo: ChatInfo, traceId: TraceId): void;
|
|
18
14
|
private processMessage;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"commandActionProcessor.d.ts","sourceRoot":"","sources":["../../../services/actionProcessors/commandActionProcessor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEpC,OAAO,EAAE,aAAa,EAAE,MAAM,sCAAsC,CAAC;AAIrE,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"commandActionProcessor.d.ts","sourceRoot":"","sources":["../../../services/actionProcessors/commandActionProcessor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEpC,OAAO,EAAE,aAAa,EAAE,MAAM,sCAAsC,CAAC;AAIrE,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAM/C,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAEtD,qBAAa,sBAAuB,SAAQ,mBAAmB;IAC3D,OAAO,CAAC,QAAQ,CAAC,aAAa,CAA0C;IAExE,OAAO,CAAC,QAAQ,CAKd;IAEF,UAAU,CACN,GAAG,EAAE,kBAAkB,EACvB,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,aAAa,CAAC,YAAY,CAAC,EAAE,EACvC,gCAAgC,EAAE,OAAO;IAyD7C,2BAA2B,CACvB,OAAO,EAAE,aAAa,EACtB,eAAe,EAAE,MAAM,EACvB,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,OAAO;YA+BN,cAAc;IAiC5B,OAAO,CAAC,6BAA6B;IA6BrC,OAAO,CAAC,wBAAwB;CA8BnC"}
|
|
@@ -9,16 +9,13 @@ const messageTypes_1 = require("../../types/messageTypes");
|
|
|
9
9
|
const objectFromEntries_1 = require("../../helpers/objectFromEntries");
|
|
10
10
|
const baseProcessor_1 = require("./baseProcessor");
|
|
11
11
|
class CommandActionProcessor extends baseProcessor_1.BaseActionProcessor {
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
[]
|
|
18
|
-
]));
|
|
19
|
-
}
|
|
12
|
+
replyCaptures = [];
|
|
13
|
+
commands = (0, objectFromEntries_1.typeSafeObjectFromEntries)(Object.values(messageTypes_1.MessageType).map((x) => [
|
|
14
|
+
x,
|
|
15
|
+
[]
|
|
16
|
+
]));
|
|
20
17
|
initialize(api, telegraf, commands, verboseLoggingForIncomingMessage) {
|
|
21
|
-
this.initializeDependencies(api
|
|
18
|
+
this.initializeDependencies(api);
|
|
22
19
|
for (const msgType of Object.values(messageTypes_1.MessageType)) {
|
|
23
20
|
if (msgType == messageTypes_1.MessageType.Text) {
|
|
24
21
|
this.commands[msgType] = commands.filter((cmd) => cmd.triggers.find((x) => typeof x != 'string') !=
|
|
@@ -33,7 +30,7 @@ class CommandActionProcessor extends baseProcessor_1.BaseActionProcessor {
|
|
|
33
30
|
cmd.triggers.includes(messageTypes_1.MessageType.Any));
|
|
34
31
|
}
|
|
35
32
|
if (commands.length > 0) {
|
|
36
|
-
|
|
33
|
+
telegraf.on('message', (ctx) => {
|
|
37
34
|
const msg = new incomingMessage_1.IncomingMessage(ctx.update.message, this.botName);
|
|
38
35
|
const logger = this.logger.createScope(this.botName, msg.traceId, msg.chatInfo.name);
|
|
39
36
|
if (verboseLoggingForIncomingMessage) {
|
|
@@ -42,7 +39,7 @@ class CommandActionProcessor extends baseProcessor_1.BaseActionProcessor {
|
|
|
42
39
|
else {
|
|
43
40
|
logger.logWithTraceId(`${msg.from?.first_name ?? 'Unknown'} (${msg.from?.id ?? 'Unknown'}): ${msg.text || `<non-text message: ${msg.type}>`}`);
|
|
44
41
|
}
|
|
45
|
-
|
|
42
|
+
void this.processMessage(msg);
|
|
46
43
|
});
|
|
47
44
|
}
|
|
48
45
|
}
|
|
@@ -79,7 +76,7 @@ class CommandActionProcessor extends baseProcessor_1.BaseActionProcessor {
|
|
|
79
76
|
initializeReplyCaptureContext(ctx, action, message) {
|
|
80
77
|
ctx.replyMessageId = message.replyToMessageId;
|
|
81
78
|
ctx.messageId = message.messageId;
|
|
82
|
-
ctx.messageText = message.text
|
|
79
|
+
ctx.messageText = message.text;
|
|
83
80
|
ctx.messageType = message.type;
|
|
84
81
|
ctx.fromUserId = message.from?.id;
|
|
85
82
|
ctx.fromUserName =
|
|
@@ -96,7 +93,7 @@ class CommandActionProcessor extends baseProcessor_1.BaseActionProcessor {
|
|
|
96
93
|
}
|
|
97
94
|
initializeMessageContext(ctx, action, message) {
|
|
98
95
|
ctx.messageId = message.messageId;
|
|
99
|
-
ctx.messageText = message.text
|
|
96
|
+
ctx.messageText = message.text;
|
|
100
97
|
ctx.messageType = message.type;
|
|
101
98
|
ctx.fromUserId = message.from?.id;
|
|
102
99
|
ctx.fromUserName =
|
|
@@ -1,14 +1,10 @@
|
|
|
1
1
|
import { Telegraf } from 'telegraf';
|
|
2
2
|
import { InlineQueryAction } from '../../entities/actions/inlineQueryAction';
|
|
3
|
-
import { ILogger } from '../../types/logger';
|
|
4
|
-
import { IScheduler } from '../../types/scheduler';
|
|
5
|
-
import { IStorageClient } from '../../types/storage';
|
|
6
3
|
import { Milliseconds } from '../../types/timeValues';
|
|
7
4
|
import { TelegramApiService } from '../telegramApi';
|
|
8
5
|
import { BaseActionProcessor } from './baseProcessor';
|
|
9
6
|
export declare class InlineQueryActionProcessor extends BaseActionProcessor {
|
|
10
7
|
private inlineQueries;
|
|
11
|
-
constructor(botName: string, storage: IStorageClient, scheduler: IScheduler, logger: ILogger);
|
|
12
8
|
initialize(api: TelegramApiService, telegraf: Telegraf, inlineQueries: InlineQueryAction[], period: Milliseconds): void;
|
|
13
9
|
private initializeInlineQueryContext;
|
|
14
10
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"inlineQueryActionProcessor.d.ts","sourceRoot":"","sources":["../../../services/actionProcessors/inlineQueryActionProcessor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEpC,OAAO,EAAE,iBAAiB,EAAE,MAAM,0CAA0C,CAAC;AAG7E,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"inlineQueryActionProcessor.d.ts","sourceRoot":"","sources":["../../../services/actionProcessors/inlineQueryActionProcessor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEpC,OAAO,EAAE,iBAAiB,EAAE,MAAM,0CAA0C,CAAC;AAG7E,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAEtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAEtD,qBAAa,0BAA2B,SAAQ,mBAAmB;IAC/D,OAAO,CAAC,aAAa,CAAuB;IAE5C,UAAU,CACN,GAAG,EAAE,kBAAkB,EACvB,QAAQ,EAAE,QAAQ,EAClB,aAAa,EAAE,iBAAiB,EAAE,EAClC,MAAM,EAAE,YAAY;IAuGxB,OAAO,CAAC,4BAA4B;CAqBvC"}
|
|
@@ -6,19 +6,17 @@ const inlineQueryContext_1 = require("../../entities/context/inlineQueryContext"
|
|
|
6
6
|
const traceFactory_1 = require("../../helpers/traceFactory");
|
|
7
7
|
const baseProcessor_1 = require("./baseProcessor");
|
|
8
8
|
class InlineQueryActionProcessor extends baseProcessor_1.BaseActionProcessor {
|
|
9
|
-
|
|
10
|
-
super(botName, storage, scheduler, logger);
|
|
11
|
-
}
|
|
9
|
+
inlineQueries;
|
|
12
10
|
initialize(api, telegraf, inlineQueries, period) {
|
|
13
|
-
this.initializeDependencies(api
|
|
11
|
+
this.initializeDependencies(api);
|
|
14
12
|
this.inlineQueries = inlineQueries;
|
|
15
13
|
let pendingInlineQueries = [];
|
|
16
14
|
const queriesInProcessing = new Map();
|
|
17
15
|
if (this.inlineQueries.length > 0) {
|
|
18
|
-
|
|
16
|
+
telegraf.on('inline_query', (ctx) => {
|
|
19
17
|
const query = new incomingQuery_1.IncomingInlineQuery(ctx.inlineQuery.id, ctx.inlineQuery.query, ctx.inlineQuery.from.id, (0, traceFactory_1.createTrace)('InlineQuery', this.botName, ctx.inlineQuery.id));
|
|
20
18
|
const logger = this.logger.createScope(this.botName, query.traceId, 'Query');
|
|
21
|
-
logger.logWithTraceId(`${ctx.inlineQuery.from.username} (${ctx.inlineQuery.from.id}): Query for ${ctx.inlineQuery.query}`);
|
|
19
|
+
logger.logWithTraceId(`${ctx.inlineQuery.from.username ?? 'Unknown'} (${ctx.inlineQuery.from.id}): Query for ${ctx.inlineQuery.query}`);
|
|
22
20
|
const queryBeingProcessed = queriesInProcessing.get(query.userId);
|
|
23
21
|
if (queryBeingProcessed) {
|
|
24
22
|
logger.logWithTraceId(`Aborting query ${queryBeingProcessed.queryId} (${queryBeingProcessed.query}): new query recieved from ${query.userId}`);
|
|
@@ -11,12 +11,14 @@ const timeConvertions_1 = require("../../helpers/timeConvertions");
|
|
|
11
11
|
const traceFactory_1 = require("../../helpers/traceFactory");
|
|
12
12
|
const baseProcessor_1 = require("./baseProcessor");
|
|
13
13
|
class ScheduledActionProcessor extends baseProcessor_1.BaseActionProcessor {
|
|
14
|
+
chats;
|
|
15
|
+
scheduled;
|
|
14
16
|
constructor(botName, chats, storage, scheduler, logger) {
|
|
15
17
|
super(botName, storage, scheduler, logger);
|
|
16
18
|
this.chats = chats;
|
|
17
19
|
}
|
|
18
20
|
initialize(api, scheduled, period) {
|
|
19
|
-
this.initializeDependencies(api
|
|
21
|
+
this.initializeDependencies(api);
|
|
20
22
|
this.scheduled = scheduled;
|
|
21
23
|
if (this.scheduled.length > 0) {
|
|
22
24
|
const now = (0, moment_1.default)();
|
|
@@ -31,9 +33,9 @@ class ScheduledActionProcessor extends baseProcessor_1.BaseActionProcessor {
|
|
|
31
33
|
nextExecutionTime = nextExecutionTime.add(1, 'hour');
|
|
32
34
|
}
|
|
33
35
|
const delay = nextExecutionTime.diff(now);
|
|
34
|
-
this.scheduler.createOnetimeTask('ScheduledProcessing_OneTime',
|
|
35
|
-
this.scheduler.createTask('ScheduledProcessing',
|
|
36
|
-
|
|
36
|
+
this.scheduler.createOnetimeTask('ScheduledProcessing_OneTime', () => {
|
|
37
|
+
this.scheduler.createTask('ScheduledProcessing', () => {
|
|
38
|
+
void this.runScheduled();
|
|
37
39
|
}, (0, timeConvertions_1.secondsToMilliseconds)(period), true, this.botName);
|
|
38
40
|
}, delay, this.botName);
|
|
39
41
|
}
|
|
@@ -8,15 +8,16 @@ export declare class JsonFileStorage implements IStorageClient {
|
|
|
8
8
|
private readonly storagePath;
|
|
9
9
|
private readonly botName;
|
|
10
10
|
constructor(botName: string, actions: IActionWithState<IActionState>[], path?: string);
|
|
11
|
+
private backfillEmptyActionStates;
|
|
11
12
|
private lock;
|
|
12
13
|
private tryGetFromCache;
|
|
13
14
|
private loadFromFile;
|
|
14
15
|
private updateCacheAndSaveToFile;
|
|
15
|
-
load<TActionState extends IActionState>(key: ActionKey): Promise<Record<number, TActionState>>;
|
|
16
|
+
load<TActionState extends IActionState>(key: ActionKey): Promise<Record<number, TActionState | undefined>>;
|
|
16
17
|
saveMetadata(actions: IActionWithState<IActionState>[]): Promise<void>;
|
|
17
|
-
getActionState<TActionState extends IActionState>(action: IActionWithState<TActionState>, chatId: number): Promise<TActionState>;
|
|
18
|
+
getActionState<TActionState extends IActionState>(action: IActionWithState<TActionState>, chatId: number): Promise<TActionState | (TActionState & undefined)>;
|
|
18
19
|
saveActionExecutionResult<TActionState extends IActionState>(action: IActionWithState<TActionState>, chatId: number, state: TActionState): Promise<void>;
|
|
19
20
|
close(): Promise<void>;
|
|
20
|
-
updateStateFor<TActionState extends IActionState>(action: IActionWithState<TActionState>, chatId: number, update: (state: TActionState) => Promise<void>): Promise<void>;
|
|
21
|
+
updateStateFor<TActionState extends IActionState>(action: IActionWithState<TActionState>, chatId: number, update: (state: TActionState) => Promise<void> | void): Promise<void>;
|
|
21
22
|
}
|
|
22
23
|
//# sourceMappingURL=jsonFileStorage.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jsonFileStorage.d.ts","sourceRoot":"","sources":["../../services/jsonFileStorage.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"jsonFileStorage.d.ts","sourceRoot":"","sources":["../../services/jsonFileStorage.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAO9D,qBAAa,eAAgB,YAAW,cAAc;IAClD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAgC;IAC1D,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAmC;IACzD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA4C;IAClE,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;gBAG7B,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,gBAAgB,CAAC,YAAY,CAAC,EAAE,EACzC,IAAI,CAAC,EAAE,MAAM;IAqBjB,OAAO,CAAC,yBAAyB;YAanB,IAAI;IAYlB,OAAO,CAAC,eAAe;YAIT,YAAY;YA6BZ,wBAAwB;IAehC,IAAI,CAAC,YAAY,SAAS,YAAY,EAAE,GAAG,EAAE,SAAS;IAStD,YAAY,CAAC,OAAO,EAAE,gBAAgB,CAAC,YAAY,CAAC,EAAE;IAQtD,cAAc,CAAC,YAAY,SAAS,YAAY,EAClD,MAAM,EAAE,gBAAgB,CAAC,YAAY,CAAC,EACtC,MAAM,EAAE,MAAM;IAWZ,yBAAyB,CAAC,YAAY,SAAS,YAAY,EAC7D,MAAM,EAAE,gBAAgB,CAAC,YAAY,CAAC,EACtC,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,YAAY;IAcjB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAMtB,cAAc,CAAC,YAAY,SAAS,YAAY,EAClD,MAAM,EAAE,gBAAgB,CAAC,YAAY,CAAC,EACtC,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;CAkB5D"}
|
|
@@ -4,13 +4,17 @@ exports.JsonFileStorage = void 0;
|
|
|
4
4
|
const fs_1 = require("fs");
|
|
5
5
|
const promises_1 = require("fs/promises");
|
|
6
6
|
const async_sema_1 = require("async-sema");
|
|
7
|
+
const mapUtils_1 = require("../helpers/mapUtils");
|
|
7
8
|
function buildPath(storagePath, botName, actionKey) {
|
|
8
9
|
return `${storagePath}/${botName}/${actionKey.replaceAll(':', '/')}.json`;
|
|
9
10
|
}
|
|
10
11
|
class JsonFileStorage {
|
|
12
|
+
filePaths = new Map();
|
|
13
|
+
locks = new Map();
|
|
14
|
+
cache;
|
|
15
|
+
storagePath;
|
|
16
|
+
botName;
|
|
11
17
|
constructor(botName, actions, path) {
|
|
12
|
-
this.filePaths = new Map();
|
|
13
|
-
this.locks = new Map();
|
|
14
18
|
this.cache = new Map();
|
|
15
19
|
this.botName = botName;
|
|
16
20
|
this.storagePath = path ?? 'storage';
|
|
@@ -24,10 +28,16 @@ class JsonFileStorage {
|
|
|
24
28
|
this.filePaths.set(action.key, buildPath(this.storagePath, this.botName, action.key));
|
|
25
29
|
}
|
|
26
30
|
}
|
|
31
|
+
backfillEmptyActionStates(action, data) {
|
|
32
|
+
for (const [stringKey, value] of Object.entries(data)) {
|
|
33
|
+
if (value)
|
|
34
|
+
continue;
|
|
35
|
+
data[parseInt(stringKey)] = action.stateConstructor();
|
|
36
|
+
}
|
|
37
|
+
return true;
|
|
38
|
+
}
|
|
27
39
|
async lock(key, action) {
|
|
28
|
-
|
|
29
|
-
this.locks.set(key, new async_sema_1.Sema(1));
|
|
30
|
-
const lock = this.locks.get(key);
|
|
40
|
+
const lock = (0, mapUtils_1.getOrSetIfNotExists)(this.locks, key, new async_sema_1.Sema(1));
|
|
31
41
|
await lock.acquire();
|
|
32
42
|
try {
|
|
33
43
|
return await action();
|
|
@@ -40,9 +50,7 @@ class JsonFileStorage {
|
|
|
40
50
|
return this.cache.get(key);
|
|
41
51
|
}
|
|
42
52
|
async loadFromFile(key) {
|
|
43
|
-
|
|
44
|
-
this.filePaths.set(key, buildPath(this.storagePath, this.botName, key));
|
|
45
|
-
const targetPath = this.filePaths.get(key);
|
|
53
|
+
const targetPath = (0, mapUtils_1.getOrSetIfNotExists)(this.filePaths, key, buildPath(this.storagePath, this.botName, key));
|
|
46
54
|
const fileContent = await (0, promises_1.readFile)(targetPath, {
|
|
47
55
|
encoding: 'utf-8',
|
|
48
56
|
flag: 'a+'
|
|
@@ -55,9 +63,7 @@ class JsonFileStorage {
|
|
|
55
63
|
}
|
|
56
64
|
async updateCacheAndSaveToFile(data, key) {
|
|
57
65
|
this.cache.set(key, data);
|
|
58
|
-
|
|
59
|
-
this.filePaths.set(key, buildPath(this.storagePath, this.botName, key));
|
|
60
|
-
const targetPath = this.filePaths.get(key);
|
|
66
|
+
const targetPath = (0, mapUtils_1.getOrSetIfNotExists)(this.filePaths, key, buildPath(this.storagePath, this.botName, key));
|
|
61
67
|
await (0, promises_1.writeFile)(targetPath, JSON.stringify(data), { flag: 'w+' });
|
|
62
68
|
}
|
|
63
69
|
async load(key) {
|
|
@@ -80,11 +86,12 @@ class JsonFileStorage {
|
|
|
80
86
|
return Object.assign(action.stateConstructor(), value[chatId]);
|
|
81
87
|
}
|
|
82
88
|
async saveActionExecutionResult(action, chatId, state) {
|
|
83
|
-
|
|
89
|
+
await this.lock(action.key, async () => {
|
|
84
90
|
const data = this.tryGetFromCache(action.key) ??
|
|
85
91
|
(await this.loadFromFile(action.key));
|
|
86
92
|
data[chatId] = state;
|
|
87
|
-
|
|
93
|
+
if (this.backfillEmptyActionStates(action, data))
|
|
94
|
+
await this.updateCacheAndSaveToFile(data, action.key);
|
|
88
95
|
});
|
|
89
96
|
}
|
|
90
97
|
async close() {
|
|
@@ -98,7 +105,8 @@ class JsonFileStorage {
|
|
|
98
105
|
(await this.loadFromFile(action.key));
|
|
99
106
|
const state = Object.assign(action.stateConstructor(), data[chatId]);
|
|
100
107
|
await update(state);
|
|
101
|
-
|
|
108
|
+
if (this.backfillEmptyActionStates(action, data))
|
|
109
|
+
await this.updateCacheAndSaveToFile(data, action.key);
|
|
102
110
|
});
|
|
103
111
|
}
|
|
104
112
|
}
|
|
@@ -5,6 +5,6 @@ export declare class JsonLogger implements ILogger {
|
|
|
5
5
|
createScope(botName: string, traceId: TraceId, chatName: string): IScopedLogger;
|
|
6
6
|
logObjectWithTraceId(botName: string, traceId: TraceId, chatName: string, data: any): void;
|
|
7
7
|
logWithTraceId(botName: string, traceId: TraceId, chatName: string, text: string): void;
|
|
8
|
-
errorWithTraceId
|
|
8
|
+
errorWithTraceId(botName: string, traceId: TraceId, chatName: string, errorObj: unknown, extraData?: unknown): void;
|
|
9
9
|
}
|
|
10
10
|
//# sourceMappingURL=jsonLogger.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jsonLogger.d.ts","sourceRoot":"","sources":["../../services/jsonLogger.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"jsonLogger.d.ts","sourceRoot":"","sources":["../../services/jsonLogger.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAEzC,qBAAa,UAAW,YAAW,OAAO;IACtC,OAAO,CAAC,cAAc;IAQtB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,GAiBtD,aAAa;IAGtB,oBAAoB,CAChB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,GAAG;IAQb,cAAc,CACV,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM;IAOhB,gBAAgB,CACZ,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,OAAO,EACjB,SAAS,CAAC,EAAE,OAAO;CAQ1B"}
|
|
@@ -11,9 +11,15 @@ class JsonLogger {
|
|
|
11
11
|
}
|
|
12
12
|
createScope(botName, traceId, chatName) {
|
|
13
13
|
return {
|
|
14
|
-
logObjectWithTraceId: (data) =>
|
|
15
|
-
|
|
16
|
-
|
|
14
|
+
logObjectWithTraceId: (data) => {
|
|
15
|
+
this.logObjectWithTraceId(botName, traceId, chatName, data);
|
|
16
|
+
},
|
|
17
|
+
logWithTraceId: (text) => {
|
|
18
|
+
this.logWithTraceId(botName, traceId, chatName, text);
|
|
19
|
+
},
|
|
20
|
+
errorWithTraceId: (errorObj, extraData) => {
|
|
21
|
+
this.errorWithTraceId(botName, traceId, chatName, errorObj, extraData);
|
|
22
|
+
}
|
|
17
23
|
};
|
|
18
24
|
}
|
|
19
25
|
logObjectWithTraceId(botName, traceId, chatName, data) {
|
|
@@ -7,7 +7,7 @@ export declare class NodeTimeoutScheduler implements IScheduler {
|
|
|
7
7
|
readonly activeTasks: TaskRecord[];
|
|
8
8
|
constructor(logger: ILogger);
|
|
9
9
|
stopAll(): void;
|
|
10
|
-
createTask(name: string, action: () =>
|
|
11
|
-
createOnetimeTask(name: string, action: () =>
|
|
10
|
+
createTask(name: string, action: () => unknown, interval: Milliseconds, executeRightAway: boolean, ownerName: string): void;
|
|
11
|
+
createOnetimeTask(name: string, action: () => unknown, delay: Milliseconds, ownerName: string): void;
|
|
12
12
|
}
|
|
13
13
|
//# sourceMappingURL=nodeTimeoutScheduler.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nodeTimeoutScheduler.d.ts","sourceRoot":"","sources":["../../services/nodeTimeoutScheduler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAEpD,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEnD,qBAAa,oBAAqB,YAAW,UAAU;IACnD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAW;IAClC,QAAQ,CAAC,WAAW,EAAE,UAAU,EAAE,CAAM;gBAE5B,MAAM,EAAE,OAAO;IAI3B,OAAO;IAMP,UAAU,CACN,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"nodeTimeoutScheduler.d.ts","sourceRoot":"","sources":["../../services/nodeTimeoutScheduler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAEpD,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEnD,qBAAa,oBAAqB,YAAW,UAAU;IACnD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAW;IAClC,QAAQ,CAAC,WAAW,EAAE,UAAU,EAAE,CAAM;gBAE5B,MAAM,EAAE,OAAO;IAI3B,OAAO;IAMP,UAAU,CACN,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,OAAO,EACrB,QAAQ,EAAE,YAAY,EACtB,gBAAgB,EAAE,OAAO,EACzB,SAAS,EAAE,MAAM;IAmBrB,iBAAiB,CACb,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,OAAO,EACrB,KAAK,EAAE,YAAY,EACnB,SAAS,EAAE,MAAM;CAoBxB"}
|
|
@@ -4,8 +4,9 @@ exports.NodeTimeoutScheduler = void 0;
|
|
|
4
4
|
const taskRecord_1 = require("../entities/taskRecord");
|
|
5
5
|
const traceFactory_1 = require("../helpers/traceFactory");
|
|
6
6
|
class NodeTimeoutScheduler {
|
|
7
|
+
logger;
|
|
8
|
+
activeTasks = [];
|
|
7
9
|
constructor(logger) {
|
|
8
|
-
this.activeTasks = [];
|
|
9
10
|
this.logger = logger;
|
|
10
11
|
}
|
|
11
12
|
stopAll() {
|
|
@@ -19,16 +20,16 @@ class NodeTimeoutScheduler {
|
|
|
19
20
|
if (executeRightAway) {
|
|
20
21
|
setImmediate(action);
|
|
21
22
|
}
|
|
22
|
-
this.logger.logWithTraceId(ownerName, (0, traceFactory_1.createTrace)(this, ownerName, name), 'System', `Created task
|
|
23
|
+
this.logger.logWithTraceId(ownerName, (0, traceFactory_1.createTrace)(this, ownerName, name), 'System', `Created task ${name}, that will run every ${interval}ms.`);
|
|
23
24
|
this.activeTasks.push(task);
|
|
24
25
|
}
|
|
25
26
|
createOnetimeTask(name, action, delay, ownerName) {
|
|
26
27
|
const actionWrapper = () => {
|
|
27
|
-
this.logger.logWithTraceId(ownerName, (0, traceFactory_1.createTrace)(this, ownerName, name), 'System', `Executing delayed oneshot
|
|
28
|
+
this.logger.logWithTraceId(ownerName, (0, traceFactory_1.createTrace)(this, ownerName, name), 'System', `Executing delayed oneshot ${name}`);
|
|
28
29
|
action();
|
|
29
30
|
};
|
|
30
|
-
|
|
31
|
-
this.logger.logWithTraceId(ownerName, (0, traceFactory_1.createTrace)(this, ownerName, name), 'System', `Created oneshot task
|
|
31
|
+
setTimeout(actionWrapper, delay);
|
|
32
|
+
this.logger.logWithTraceId(ownerName, (0, traceFactory_1.createTrace)(this, ownerName, name), 'System', `Created oneshot task ${name}, that will run in ${delay}ms.`);
|
|
32
33
|
}
|
|
33
34
|
}
|
|
34
35
|
exports.NodeTimeoutScheduler = NodeTimeoutScheduler;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"responseProcessingQueue.d.ts","sourceRoot":"","sources":["../../services/responseProcessingQueue.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,SAAS,GAAG;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CACjC,CAAC;
|
|
1
|
+
{"version":3,"file":"responseProcessingQueue.d.ts","sourceRoot":"","sources":["../../services/responseProcessingQueue.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,SAAS,GAAG;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CACjC,CAAC;AAQF,qBAAa,uBAAuB;IAChC,WAAW,sBAAwD;IACnE,KAAK,EAAE,SAAS,EAAE,CAAM;IACxB,UAAU,UAAS;IAEnB,OAAO,CAAC,IAAI,EAAE,SAAS;IAmBjB,eAAe;CAkBxB"}
|