chz-telegram-bot 0.3.9 → 0.3.11
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.map +1 -1
- package/dist/entities/actions/commandAction.js +14 -1
- 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.js +10 -8
- 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 +11 -14
- 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 +5 -7
- package/dist/services/actionProcessors/scheduledActionProcessor.js +7 -5
- 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 +1 -0
- package/dist/services/responseProcessingQueue.d.ts.map +1 -1
- package/dist/services/responseProcessingQueue.js +11 -10
- 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 +5 -1
- 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/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 +6 -18
- package/services/actionProcessors/inlineQueryActionProcessor.ts +6 -16
- package/services/actionProcessors/scheduledActionProcessor.ts +5 -5
- package/services/jsonFileStorage.ts +39 -21
- package/services/jsonLogger.ts +12 -8
- package/services/nodeTimeoutScheduler.ts +6 -6
- package/services/responseProcessingQueue.ts +13 -7
- 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
|
@@ -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', async (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) {
|
|
@@ -65,13 +62,13 @@ class CommandActionProcessor extends baseProcessor_1.BaseActionProcessor {
|
|
|
65
62
|
}
|
|
66
63
|
for (const commandAction of commandsToCheck) {
|
|
67
64
|
this.initializeMessageContext(ctx, commandAction, msg);
|
|
68
|
-
this.executeAction(commandAction, ctx);
|
|
65
|
+
await this.executeAction(commandAction, ctx);
|
|
69
66
|
}
|
|
70
67
|
if (this.replyCaptures.length != 0) {
|
|
71
68
|
const replyCtx = new replyContext_1.ReplyContext(this.storage, this.scheduler);
|
|
72
69
|
for (const replyAction of this.replyCaptures) {
|
|
73
70
|
this.initializeReplyCaptureContext(replyCtx, replyAction, msg);
|
|
74
|
-
this.executeAction(replyAction, replyCtx);
|
|
71
|
+
await this.executeAction(replyAction, replyCtx);
|
|
75
72
|
}
|
|
76
73
|
}
|
|
77
74
|
this.api.flushResponses();
|
|
@@ -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}`);
|
|
@@ -36,7 +34,7 @@ class InlineQueryActionProcessor extends baseProcessor_1.BaseActionProcessor {
|
|
|
36
34
|
queriesInProcessing.set(inlineQuery.userId, inlineQuery);
|
|
37
35
|
for (const inlineQueryAction of this.inlineQueries) {
|
|
38
36
|
this.initializeInlineQueryContext(ctx, inlineQuery.query, inlineQuery.queryId, inlineQueryAction, inlineQuery.abortController.signal, inlineQuery.traceId);
|
|
39
|
-
this.executeAction(inlineQueryAction, ctx, (error, ctx) => {
|
|
37
|
+
await this.executeAction(inlineQueryAction, ctx, (error, ctx) => {
|
|
40
38
|
if (error.name == 'AbortError') {
|
|
41
39
|
ctx.logger.logWithTraceId(`Aborting query ${inlineQuery.queryId} (${inlineQuery.query}) successful.`);
|
|
42
40
|
}
|
|
@@ -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
|
}
|
|
@@ -43,7 +45,7 @@ class ScheduledActionProcessor extends baseProcessor_1.BaseActionProcessor {
|
|
|
43
45
|
for (const [chatName, chatId] of Object.entries(this.chats)) {
|
|
44
46
|
for (const scheduledAction of this.scheduled) {
|
|
45
47
|
this.initializeChatContext(ctx, scheduledAction, new chatInfo_1.ChatInfo(chatId, chatName), (0, traceFactory_1.createTrace)(scheduledAction, this.botName, `${scheduledAction.key}-${chatId}`));
|
|
46
|
-
this.executeAction(scheduledAction, ctx);
|
|
48
|
+
await this.executeAction(scheduledAction, ctx);
|
|
47
49
|
}
|
|
48
50
|
}
|
|
49
51
|
this.api.flushResponses();
|
|
@@ -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"}
|
|
@@ -1,13 +1,15 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.ResponseProcessingQueue = void 0;
|
|
4
|
-
const
|
|
4
|
+
const async_sema_1 = require("async-sema");
|
|
5
|
+
function notEmpty(arr) {
|
|
6
|
+
return arr.length > 0;
|
|
7
|
+
}
|
|
5
8
|
const TELEGRAM_RATELIMIT_DELAY = 35;
|
|
6
9
|
class ResponseProcessingQueue {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
}
|
|
10
|
+
rateLimiter = (0, async_sema_1.RateLimit)(1, { timeUnit: TELEGRAM_RATELIMIT_DELAY });
|
|
11
|
+
items = [];
|
|
12
|
+
isFlushing = false;
|
|
11
13
|
enqueue(item) {
|
|
12
14
|
if (this.items.length === 0 ||
|
|
13
15
|
item.priority >= this.items[this.items.length - 1].priority) {
|
|
@@ -25,14 +27,13 @@ class ResponseProcessingQueue {
|
|
|
25
27
|
if (this.isFlushing)
|
|
26
28
|
return;
|
|
27
29
|
this.isFlushing = true;
|
|
28
|
-
while (this.items
|
|
30
|
+
while (notEmpty(this.items)) {
|
|
29
31
|
if (Date.now() >= this.items[0].priority) {
|
|
30
|
-
|
|
32
|
+
await this.rateLimiter();
|
|
33
|
+
const [item] = this.items;
|
|
34
|
+
this.items.shift();
|
|
31
35
|
await item.callback();
|
|
32
36
|
}
|
|
33
|
-
else {
|
|
34
|
-
await (0, promises_1.setTimeout)(TELEGRAM_RATELIMIT_DELAY);
|
|
35
|
-
}
|
|
36
37
|
}
|
|
37
38
|
this.isFlushing = false;
|
|
38
39
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"telegramApi.d.ts","sourceRoot":"","sources":["../../services/telegramApi.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAkB,MAAM,mBAAmB,CAAC;AAChE,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AACrD,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAE1C,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAGjD,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAG5C,eAAO,MAAM,4BAA4B,uBAAuB,CAAC;AAEjE,qBAAa,kBAAkB;IAC3B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAiC;IACvD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAW;IACpC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAiB;IACzC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAU;IACjC,OAAO,CAAC,QAAQ,CAAC,2BAA2B,CAKlC;IAEV,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;gBAG7B,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,cAAc,EACvB,MAAM,EAAE,OAAO,EACf,2BAA2B,EAAE,CACzB,OAAO,EAAE,aAAa,EACtB,eAAe,EAAE,MAAM,EACvB,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,OAAO,KACf,IAAI;IASb,uBAAuB,CAAC,SAAS,EAAE,WAAW,EAAE;IAsDhD,cAAc;YAIA,WAAW;YAkBX,eAAe;
|
|
1
|
+
{"version":3,"file":"telegramApi.d.ts","sourceRoot":"","sources":["../../services/telegramApi.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAkB,MAAM,mBAAmB,CAAC;AAChE,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AACrD,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAE1C,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAGjD,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAG5C,eAAO,MAAM,4BAA4B,uBAAuB,CAAC;AAEjE,qBAAa,kBAAkB;IAC3B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAiC;IACvD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAW;IACpC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAiB;IACzC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAU;IACjC,OAAO,CAAC,QAAQ,CAAC,2BAA2B,CAKlC;IAEV,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;gBAG7B,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,cAAc,EACvB,MAAM,EAAE,OAAO,EACf,2BAA2B,EAAE,CACzB,OAAO,EAAE,aAAa,EACtB,eAAe,EAAE,MAAM,EACvB,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,OAAO,KACf,IAAI;IASb,uBAAuB,CAAC,SAAS,EAAE,WAAW,EAAE;IAsDhD,cAAc;YAIA,WAAW;YAkBX,eAAe;CAsGhC"}
|
|
@@ -4,8 +4,13 @@ exports.TelegramApiService = exports.TELEGRAM_ERROR_QUOTE_INVALID = void 0;
|
|
|
4
4
|
const responseProcessingQueue_1 = require("./responseProcessingQueue");
|
|
5
5
|
exports.TELEGRAM_ERROR_QUOTE_INVALID = 'QUOTE_TEXT_INVALID';
|
|
6
6
|
class TelegramApiService {
|
|
7
|
+
queue = new responseProcessingQueue_1.ResponseProcessingQueue();
|
|
8
|
+
telegram;
|
|
9
|
+
storage;
|
|
10
|
+
logger;
|
|
11
|
+
captureRegistrationCallback;
|
|
12
|
+
botName;
|
|
7
13
|
constructor(botName, telegram, storage, logger, captureRegistrationCallback) {
|
|
8
|
-
this.queue = new responseProcessingQueue_1.ResponseProcessingQueue();
|
|
9
14
|
this.telegram = telegram;
|
|
10
15
|
this.botName = botName;
|
|
11
16
|
this.storage = storage;
|
|
@@ -50,12 +55,12 @@ class TelegramApiService {
|
|
|
50
55
|
}
|
|
51
56
|
}
|
|
52
57
|
flushResponses() {
|
|
53
|
-
this.queue.flushReadyItems();
|
|
58
|
+
void this.queue.flushReadyItems();
|
|
54
59
|
}
|
|
55
60
|
async pinIfShould(response, sentMessage) {
|
|
56
61
|
if (response.shouldPin) {
|
|
57
62
|
await this.telegram.pinChatMessage(response.chatInfo.id, sentMessage.message_id, { disable_notification: true });
|
|
58
|
-
await this.storage.updateStateFor(response.action, response.chatInfo.id,
|
|
63
|
+
await this.storage.updateStateFor(response.action, response.chatInfo.id, (state) => {
|
|
59
64
|
state.pinnedMessages.push(sentMessage.message_id);
|
|
60
65
|
});
|
|
61
66
|
}
|
|
@@ -80,16 +85,20 @@ class TelegramApiService {
|
|
|
80
85
|
});
|
|
81
86
|
break;
|
|
82
87
|
case 'image':
|
|
83
|
-
sentMessage = await this.telegram.sendPhoto(response.chatInfo.id, response.content,
|
|
88
|
+
sentMessage = await this.telegram.sendPhoto(response.chatInfo.id, response.content,
|
|
89
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-argument
|
|
90
|
+
response.replyInfo?.id
|
|
84
91
|
? {
|
|
85
|
-
reply_to_message_id: response.replyInfo
|
|
92
|
+
reply_to_message_id: response.replyInfo.id // eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
86
93
|
}
|
|
87
94
|
: undefined);
|
|
88
95
|
break;
|
|
89
96
|
case 'video':
|
|
90
|
-
sentMessage = await this.telegram.sendVideo(response.chatInfo.id, response.content,
|
|
97
|
+
sentMessage = await this.telegram.sendVideo(response.chatInfo.id, response.content,
|
|
98
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-argument
|
|
99
|
+
response.replyInfo?.id
|
|
91
100
|
? {
|
|
92
|
-
reply_to_message_id: response.replyInfo
|
|
101
|
+
reply_to_message_id: response.replyInfo.id // eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
93
102
|
}
|
|
94
103
|
: undefined);
|
|
95
104
|
break;
|
|
@@ -103,7 +112,7 @@ class TelegramApiService {
|
|
|
103
112
|
return;
|
|
104
113
|
case 'unpin':
|
|
105
114
|
await this.telegram.unpinChatMessage(response.chatInfo.id, response.messageId);
|
|
106
|
-
await this.storage.updateStateFor(response.action, response.chatInfo.id,
|
|
115
|
+
await this.storage.updateStateFor(response.action, response.chatInfo.id, (state) => {
|
|
107
116
|
state.pinnedMessages = state.pinnedMessages.filter((x) => x != response.messageId);
|
|
108
117
|
});
|
|
109
118
|
break;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"commandTrigger.d.ts","sourceRoot":"","sources":["../../types/commandTrigger.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"commandTrigger.d.ts","sourceRoot":"","sources":["../../types/commandTrigger.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,MAAM,CAAC"}
|
package/dist/types/handlers.d.ts
CHANGED
|
@@ -10,7 +10,7 @@ export type CommandHandler<TActionState extends IActionState> = (
|
|
|
10
10
|
/** Context of action executed in chat, in response to a message. */
|
|
11
11
|
ctx: MessageContext<TActionState>,
|
|
12
12
|
/** State of an action being executed. */
|
|
13
|
-
state: TActionState) => Promise<void
|
|
13
|
+
state: TActionState) => Promise<void> | void;
|
|
14
14
|
export type ScheduledHandler<TActionState extends IActionState> = (
|
|
15
15
|
/** Context of action executed in chat. */
|
|
16
16
|
ctx: ChatContext<TActionState>,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handlers.d.ts","sourceRoot":"","sources":["../../types/handlers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AAC9D,OAAO,EAAE,kBAAkB,EAAE,MAAM,wCAAwC,CAAC;AAC5E,OAAO,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AACpE,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAE5D,MAAM,MAAM,kBAAkB,GAAG;AAC7B,0EAA0E;AAC1E,GAAG,EAAE,kBAAkB,KACtB,OAAO,CAAC,IAAI,CAAC,CAAC;AAEnB,MAAM,MAAM,cAAc,CAAC,YAAY,SAAS,YAAY,IAAI;AAC5D,oEAAoE;AACpE,GAAG,EAAE,cAAc,CAAC,YAAY,CAAC;AACjC,yCAAyC;AACzC,KAAK,EAAE,YAAY,KAClB,OAAO,CAAC,IAAI,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"handlers.d.ts","sourceRoot":"","sources":["../../types/handlers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AAC9D,OAAO,EAAE,kBAAkB,EAAE,MAAM,wCAAwC,CAAC;AAC5E,OAAO,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AACpE,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAE5D,MAAM,MAAM,kBAAkB,GAAG;AAC7B,0EAA0E;AAC1E,GAAG,EAAE,kBAAkB,KACtB,OAAO,CAAC,IAAI,CAAC,CAAC;AAEnB,MAAM,MAAM,cAAc,CAAC,YAAY,SAAS,YAAY,IAAI;AAC5D,oEAAoE;AACpE,GAAG,EAAE,cAAc,CAAC,YAAY,CAAC;AACjC,yCAAyC;AACzC,KAAK,EAAE,YAAY,KAClB,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;AAE1B,MAAM,MAAM,gBAAgB,CAAC,YAAY,SAAS,YAAY,IAAI;AAC9D,0CAA0C;AAC1C,GAAG,EAAE,WAAW,CAAC,YAAY,CAAC;AAC9B,yIAAyI;AACzI,SAAS,EAAE,mBAAmB;AAC9B,yCAAyC;AACzC,KAAK,EAAE,YAAY,KAClB,OAAO,CAAC,IAAI,CAAC,CAAC"}
|
package/dist/types/logger.d.ts
CHANGED
|
@@ -2,12 +2,12 @@ import { TraceId } from './trace';
|
|
|
2
2
|
export interface IScopedLogger {
|
|
3
3
|
logObjectWithTraceId(data: any): void;
|
|
4
4
|
logWithTraceId(text: string): void;
|
|
5
|
-
errorWithTraceId
|
|
5
|
+
errorWithTraceId(errorObj: unknown, extraData?: unknown): void;
|
|
6
6
|
}
|
|
7
7
|
export interface ILogger {
|
|
8
8
|
createScope(botName: string, traceId: TraceId, chatName: string): IScopedLogger;
|
|
9
9
|
logObjectWithTraceId(botName: string, traceId: TraceId, chatName: string, data: any): void;
|
|
10
10
|
logWithTraceId(botName: string, traceId: TraceId, chatName: string, text: string): void;
|
|
11
|
-
errorWithTraceId
|
|
11
|
+
errorWithTraceId(botName: string, traceId: TraceId, chatName: string, errorObj: unknown, extraData?: unknown): void;
|
|
12
12
|
}
|
|
13
13
|
//# sourceMappingURL=logger.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../types/logger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAElC,MAAM,WAAW,aAAa;IAC1B,oBAAoB,CAEhB,IAAI,EAAE,GAAG,GACV,IAAI,CAAC;IAER,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAEnC,gBAAgB,CAAC,
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../types/logger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAElC,MAAM,WAAW,aAAa;IAC1B,oBAAoB,CAEhB,IAAI,EAAE,GAAG,GACV,IAAI,CAAC;IAER,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAEnC,gBAAgB,CAAC,QAAQ,EAAE,OAAO,EAAE,SAAS,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;CAClE;AAED,MAAM,WAAW,OAAO;IACpB,WAAW,CACP,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,MAAM,GACjB,aAAa,CAAC;IAEjB,oBAAoB,CAChB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,MAAM,EAEhB,IAAI,EAAE,GAAG,GACV,IAAI,CAAC;IAER,cAAc,CACV,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,GACb,IAAI,CAAC;IAER,gBAAgB,CACZ,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,OAAO,EACjB,SAAS,CAAC,EAAE,OAAO,GACpB,IAAI,CAAC;CACX"}
|