chz-telegram-bot 0.0.54 → 0.1.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.
Files changed (94) hide show
  1. package/README.md +214 -0
  2. package/dist/dtos/responses/delay.d.ts +1 -0
  3. package/dist/dtos/responses/delay.d.ts.map +1 -1
  4. package/dist/dtos/responses/delay.js +1 -0
  5. package/dist/dtos/responses/imageMessage.d.ts +1 -0
  6. package/dist/dtos/responses/imageMessage.d.ts.map +1 -1
  7. package/dist/dtos/responses/imageMessage.js +1 -0
  8. package/dist/dtos/responses/reaction.d.ts +1 -0
  9. package/dist/dtos/responses/reaction.d.ts.map +1 -1
  10. package/dist/dtos/responses/reaction.js +1 -0
  11. package/dist/dtos/responses/textMessage.d.ts +1 -0
  12. package/dist/dtos/responses/textMessage.d.ts.map +1 -1
  13. package/dist/dtos/responses/textMessage.js +1 -0
  14. package/dist/dtos/responses/unpin.d.ts +1 -0
  15. package/dist/dtos/responses/unpin.d.ts.map +1 -1
  16. package/dist/dtos/responses/unpin.js +1 -0
  17. package/dist/dtos/responses/videoMessage.d.ts +1 -0
  18. package/dist/dtos/responses/videoMessage.d.ts.map +1 -1
  19. package/dist/dtos/responses/videoMessage.js +1 -0
  20. package/dist/entities/botInstance.js +2 -2
  21. package/dist/entities/context/chatContext.d.ts +2 -2
  22. package/dist/entities/context/chatContext.d.ts.map +1 -1
  23. package/dist/entities/context/chatContext.js +2 -2
  24. package/dist/services/responseProcessingQueue.d.ts +12 -0
  25. package/dist/services/responseProcessingQueue.d.ts.map +1 -0
  26. package/dist/services/responseProcessingQueue.js +45 -0
  27. package/dist/services/telegramApi.d.ts +2 -3
  28. package/dist/services/telegramApi.d.ts.map +1 -1
  29. package/dist/services/telegramApi.js +22 -25
  30. package/dist/types/response.d.ts +1 -0
  31. package/dist/types/response.d.ts.map +1 -1
  32. package/dtos/responses/delay.ts +1 -0
  33. package/dtos/responses/imageMessage.ts +1 -0
  34. package/dtos/responses/reaction.ts +1 -0
  35. package/dtos/responses/textMessage.ts +1 -0
  36. package/dtos/responses/unpin.ts +1 -0
  37. package/dtos/responses/videoMessage.ts +1 -0
  38. package/entities/botInstance.ts +2 -2
  39. package/entities/context/chatContext.ts +2 -2
  40. package/package.json +1 -1
  41. package/services/responseProcessingQueue.ts +57 -0
  42. package/services/telegramApi.ts +28 -35
  43. package/types/response.ts +1 -0
  44. package/dist/dtos/actionExecutionResult.d.ts +0 -7
  45. package/dist/dtos/actionExecutionResult.d.ts.map +0 -1
  46. package/dist/dtos/actionExecutionResult.js +0 -10
  47. package/dist/entities/actionExecutionResult.d.ts +0 -7
  48. package/dist/entities/actionExecutionResult.d.ts.map +0 -1
  49. package/dist/entities/actionExecutionResult.js +0 -10
  50. package/dist/entities/commandTriggerCheckResult.d.ts +0 -10
  51. package/dist/entities/commandTriggerCheckResult.d.ts.map +0 -1
  52. package/dist/entities/commandTriggerCheckResult.js +0 -23
  53. package/dist/entities/incomingMessage.d.ts +0 -14
  54. package/dist/entities/incomingMessage.d.ts.map +0 -1
  55. package/dist/entities/incomingMessage.js +0 -45
  56. package/dist/entities/responses/delay.d.ts +0 -13
  57. package/dist/entities/responses/delay.d.ts.map +0 -1
  58. package/dist/entities/responses/delay.js +0 -14
  59. package/dist/entities/responses/imageMessage.d.ts +0 -17
  60. package/dist/entities/responses/imageMessage.d.ts.map +0 -1
  61. package/dist/entities/responses/imageMessage.js +0 -17
  62. package/dist/entities/responses/reaction.d.ts +0 -14
  63. package/dist/entities/responses/reaction.d.ts.map +0 -1
  64. package/dist/entities/responses/reaction.js +0 -15
  65. package/dist/entities/responses/textMessage.d.ts +0 -16
  66. package/dist/entities/responses/textMessage.d.ts.map +0 -1
  67. package/dist/entities/responses/textMessage.js +0 -17
  68. package/dist/entities/responses/unpin.d.ts +0 -12
  69. package/dist/entities/responses/unpin.d.ts.map +0 -1
  70. package/dist/entities/responses/unpin.js +0 -14
  71. package/dist/entities/responses/videoMessage.d.ts +0 -17
  72. package/dist/entities/responses/videoMessage.d.ts.map +0 -1
  73. package/dist/entities/responses/videoMessage.js +0 -17
  74. package/dist/helpers/inverseRecord.d.ts +0 -2
  75. package/dist/helpers/inverseRecord.d.ts.map +0 -1
  76. package/dist/helpers/inverseRecord.js +0 -6
  77. package/dist/helpers/reverseMap.d.ts +0 -2
  78. package/dist/helpers/reverseMap.d.ts.map +0 -1
  79. package/dist/helpers/reverseMap.js +0 -6
  80. package/dist/helpers/reverseRecord.d.ts +0 -2
  81. package/dist/helpers/reverseRecord.d.ts.map +0 -1
  82. package/dist/helpers/reverseRecord.js +0 -6
  83. package/dist/services/logger.d.ts +0 -9
  84. package/dist/services/logger.d.ts.map +0 -1
  85. package/dist/services/logger.js +0 -28
  86. package/dist/services/taskScheduler.d.ts +0 -11
  87. package/dist/services/taskScheduler.d.ts.map +0 -1
  88. package/dist/services/taskScheduler.js +0 -33
  89. package/dist/types/daysOfTheWeek.d.ts +0 -10
  90. package/dist/types/daysOfTheWeek.d.ts.map +0 -1
  91. package/dist/types/daysOfTheWeek.js +0 -13
  92. package/dist/types/replyMessage.d.ts +0 -8
  93. package/dist/types/replyMessage.d.ts.map +0 -1
  94. package/dist/types/replyMessage.js +0 -2
package/README.md ADDED
@@ -0,0 +1,214 @@
1
+ # chz-bot-Framework
2
+
3
+ [![Ask DeepWiki](https://deepwiki.com/badge.svg)](https://deepwiki.com/AlexSolari/botFramework)
4
+
5
+ ## Overview
6
+
7
+ botFramework is a TypeScript library that provides a structured approach to building Telegram bots. It handles the complexities of bot lifecycle management, message processing, scheduled tasks, and state persistence.
8
+
9
+ ## Installation
10
+
11
+ ```
12
+ npm install chz-bot-framework
13
+ # or
14
+ bun install chz-bot-framework
15
+ ```
16
+
17
+ ## Quick Start
18
+
19
+ ### 1. Create a new bot project
20
+
21
+ ```
22
+ mkdir my-telegram-bot
23
+ cd my-telegram-bot
24
+ npm init -y
25
+ npm install chz-telegram-bot
26
+ ```
27
+
28
+ ### 2. Create a token file
29
+
30
+ Create a file named `token.txt` in your project and paste your Telegram Bot token obtained from BotFather.
31
+
32
+ ### 3. Create a basic bot
33
+
34
+ Create an `index.ts` file with the following content:
35
+
36
+ ```typescript
37
+ import {
38
+ startBot,
39
+ stopBots,
40
+ CommandActionBuilder,
41
+ Seconds
42
+ } from 'chz-telegram-bot';
43
+
44
+ // Define your command actions
45
+ const commands = [
46
+ new CommandActionBuilder('HelloWorld')
47
+ .on('/hello')
48
+ .do(async (ctx) => {
49
+ ctx.replyWithText('Hello, world!');
50
+ })
51
+ .build()
52
+ ];
53
+
54
+ // Define scheduled actions (if needed)
55
+ const scheduled = [];
56
+
57
+ async function main() {
58
+ // Start the bot
59
+ startBot({
60
+ name: 'MyFirstBot',
61
+ tokenFilePath: './token.txt',
62
+ commands: commands,
63
+ scheduled: scheduled,
64
+ chats: {
65
+ MyChat: -1001234567890 // Replace with your actual chat ID,
66
+ },
67
+ scheduledPeriod: (60 * 5) as Seconds
68
+ });
69
+
70
+ // Set up graceful shutdown
71
+ process.on('SIGINT', () => stopBots('SIGINT'));
72
+ process.on('SIGTERM', () => stopBots('SIGTERM'));
73
+ }
74
+
75
+ main().catch(console.error);
76
+ ```
77
+
78
+ ### 4. Run your bot
79
+
80
+ ```
81
+ bun index.ts
82
+ ```
83
+
84
+ ## Core Concepts
85
+
86
+ ### Command Actions
87
+
88
+ Command actions are triggered by user messages that match specific patterns:
89
+
90
+ ```typescript
91
+ import { CommandActionBuilder } from 'chz-telegram-bot';
92
+
93
+ const myCommand = new CommandActionBuilder('StartCommand')
94
+ .on('/start')
95
+ .do(async (ctx) => {
96
+ ctx.replyWithText('Welcome to my bot!');
97
+ })
98
+ .build();
99
+ ```
100
+
101
+ Message types are also can trigger commands:
102
+
103
+ ```typescript
104
+ import { CommandActionBuilder, MessageType } from 'chz-telegram-bot';
105
+
106
+ const myCommand = new CommandActionBuilder('WelcomeMessage')
107
+ .on(MessageType.NewChatMember)
108
+ .do(async (ctx) => {
109
+ ctx.replyWithText('Welcome to my group chat!');
110
+ })
111
+ .build();
112
+ ```
113
+
114
+ ### Scheduled Actions
115
+
116
+ Scheduled actions run periodically without user interaction:
117
+
118
+ ```typescript
119
+ import { ScheduledActionBuilder, Hours } from 'chz-telegram-bot';
120
+
121
+ const dailyNotification = new ScheduledActionBuilder('GM')
122
+ .runAt(9 as Hours) // Run at 9 AM
123
+ .do(async (ctx) => {
124
+ ctx.sendTextToChat('Good morning!');
125
+ })
126
+ .build();
127
+ ```
128
+
129
+ ### Replies and message sending
130
+
131
+ Depending on a type of action, you will have access to following interaction options:
132
+
133
+ | Method | Action type | Description |
134
+ | ----------------- | ----------- | ------------------------------------------------------------ |
135
+ | `sendTextToChat` | Both | Send text to chat as a standalone message |
136
+ | `sendImageToChat` | Both | Send image to chat as a standalone message |
137
+ | `sendVideoToChat` | Both | Send video/gif to chat as a standalone message |
138
+ | `unpinMessage` | Both | Unpins message by its ID |
139
+ | `wait` | Both | Delays next replies from this action by given amount of ms |
140
+ | `replyWithText` | Command | Replies with text to a message that triggered an action |
141
+ | `replyWithImage` | Command | Replies with image to a message that triggered an action |
142
+ | `replyWithVideo` | Command | Replies with video/gif to a message that triggered an action |
143
+ | `react` | Command | Sets an emoji reaction to a message that triggered an action |
144
+
145
+ Keep in mind that reply sending is deferred until action execution finished and will be done in order of calling in action handler.
146
+ Ex:
147
+
148
+ ```typescript
149
+ ctx.sendTextToChat('Message 1');
150
+ ctx.wait(5000 as Millisecond);
151
+ ctx.sendTextToChat('Message 2');
152
+ ```
153
+
154
+ This will result in `Message 1` text being send, followed by `Message 2` after 5 second delay.
155
+
156
+ ## Configuration Options
157
+
158
+ When starting a bot, you can provide the following configuration:
159
+
160
+ | Option | Type | Required | Description |
161
+ | ----------------- | ------------------------ | --------------------------- | ----------------------------------------------------------------------------------------- |
162
+ | `name` | `string` | Yes | Bot name used in logging |
163
+ | `tokenFilePath` | `string` | Yes | Path to file containing Telegram Bot token |
164
+ | `commands` | `CommandAction[] ` | Yes (can be empty) | Collection of command actions |
165
+ | `scheduled` | `ScheduledAction[]` | Yes (can be empty) | Collection of scheduled actions |
166
+ | `chats` | `Record<string, number>` | Yes | Object containing chat name-id pairs. Used for logging and execution of scheduled action. |
167
+ | `storagePath` | `string` | No | Custom storage path for default JsonFileStorage client |
168
+ | `scheduledPeriod` | `Seconds` | No (will default to 1 hour) | Period between scheduled action executions |
169
+ | `services` | | No | Custom services to be used instead of default ones |
170
+
171
+ Services object should have following structure:
172
+ | Option | Type | Required | Description |
173
+ |------------------|--------------------------|----------|---------------------------------------------------------------|
174
+ | `storageClient` | `IStorageClient` | No (will default to `JsonFileStorage`) | Persistance state provide |
175
+ | `logger` | `ILogger` | No (will default to `JsonLogger`) | Logger service |
176
+ | `scheduler` | `IScheduler` | No (will default to `NodeTimeoutScheduler`) | Scheduler used to scheduled action|
177
+
178
+ ## Advanced Usage
179
+
180
+ ### Custom State Management
181
+
182
+ The framework allows you to create custom state for your actions:
183
+
184
+ ```typescript
185
+ import { ActionStateBase } from 'chz-telegram-bot';
186
+
187
+ class MyCustomState extends ActionStateBase {
188
+ counter: number = 0;
189
+ }
190
+
191
+ const counterCommand = new CommandActionBuilderWithState<MyCustomState>(
192
+ 'Counter',
193
+ () => new MyCustomState()
194
+ )
195
+ .on('/count')
196
+ .do(async (ctx, state) => {
197
+ state.counter++;
198
+ ctx.replyWithText(`Count: ${state.counter}`);
199
+ })
200
+ .build();
201
+ ```
202
+
203
+ State is mutable and all changes to it will be saved after execution of action is finished.
204
+
205
+ ## Stopping the Bot
206
+
207
+ To properly terminate your bot and clean up resources:
208
+
209
+ ```typescript
210
+ import { stopBots } from 'chz-telegram-bot';
211
+
212
+ // Call when your application is shutting down
213
+ await stopBots('SHUTDOWN');
214
+ ```
@@ -6,6 +6,7 @@ import { TraceId } from '../../types/trace';
6
6
  import { ChatInfo } from '../chatInfo';
7
7
  export declare class DelayResponse implements IChatResponse {
8
8
  readonly kind: "delay";
9
+ readonly createdAt: number;
9
10
  readonly chatInfo: ChatInfo;
10
11
  readonly traceId: TraceId;
11
12
  readonly delay: Milliseconds;
@@ -1 +1 @@
1
- {"version":3,"file":"delay.d.ts","sourceRoot":"","sources":["../../../dtos/responses/delay.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,EAAoB,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACvE,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEvC,qBAAa,aAAc,YAAW,aAAa;IAC/C,QAAQ,CAAC,IAAI,UAA0B;IAEvC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,gBAAgB,CAAC,YAAY,CAAC,CAAC;gBAG5C,KAAK,EAAE,YAAY,EACnB,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,gBAAgB,CAAC,YAAY,CAAC;CAO7C"}
1
+ {"version":3,"file":"delay.d.ts","sourceRoot":"","sources":["../../../dtos/responses/delay.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,EAAoB,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACvE,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEvC,qBAAa,aAAc,YAAW,aAAa;IAC/C,QAAQ,CAAC,IAAI,UAA0B;IACvC,QAAQ,CAAC,SAAS,SAAc;IAEhC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,gBAAgB,CAAC,YAAY,CAAC,CAAC;gBAG5C,KAAK,EAAE,YAAY,EACnB,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,gBAAgB,CAAC,YAAY,CAAC;CAO7C"}
@@ -5,6 +5,7 @@ const response_1 = require("../../types/response");
5
5
  class DelayResponse {
6
6
  constructor(delay, chatInfo, traceId, action) {
7
7
  this.kind = response_1.BotResponseTypes.delay;
8
+ this.createdAt = Date.now();
8
9
  this.chatInfo = chatInfo;
9
10
  this.delay = delay;
10
11
  this.traceId = traceId;
@@ -7,6 +7,7 @@ import { ChatInfo } from '../chatInfo';
7
7
  import { TraceId } from '../../types/trace';
8
8
  export declare class ImageMessage implements IReplyMessage<InputFile> {
9
9
  readonly kind: "image";
10
+ readonly createdAt: number;
10
11
  readonly content: InputFile;
11
12
  readonly chatInfo: ChatInfo;
12
13
  readonly replyId: number | undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"imageMessage.d.ts","sourceRoot":"","sources":["../../../dtos/responses/imageMessage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAoB,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACvE,OAAO,EAAE,qBAAqB,EAAE,MAAM,mCAAmC,CAAC;AAC1E,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAE5C,qBAAa,YAAa,YAAW,aAAa,CAAC,SAAS,CAAC;IACzD,QAAQ,CAAC,IAAI,UAA0B;IAEvC,QAAQ,CAAC,OAAO,EAAE,SAAS,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IACrC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,iBAAiB,SAAS;IACnC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,MAAM,EAAE,gBAAgB,CAAC,YAAY,CAAC,CAAC;gBAG5C,KAAK,EAAE,SAAS,EAChB,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,MAAM,GAAG,SAAS,EAC3B,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,gBAAgB,CAAC,YAAY,CAAC,EACtC,OAAO,CAAC,EAAE,qBAAqB;CAStC"}
1
+ {"version":3,"file":"imageMessage.d.ts","sourceRoot":"","sources":["../../../dtos/responses/imageMessage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAoB,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACvE,OAAO,EAAE,qBAAqB,EAAE,MAAM,mCAAmC,CAAC;AAC1E,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAE5C,qBAAa,YAAa,YAAW,aAAa,CAAC,SAAS,CAAC;IACzD,QAAQ,CAAC,IAAI,UAA0B;IACvC,QAAQ,CAAC,SAAS,SAAc;IAEhC,QAAQ,CAAC,OAAO,EAAE,SAAS,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IACrC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,iBAAiB,SAAS;IACnC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,MAAM,EAAE,gBAAgB,CAAC,YAAY,CAAC,CAAC;gBAG5C,KAAK,EAAE,SAAS,EAChB,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,MAAM,GAAG,SAAS,EAC3B,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,gBAAgB,CAAC,YAAY,CAAC,EACtC,OAAO,CAAC,EAAE,qBAAqB;CAStC"}
@@ -5,6 +5,7 @@ const response_1 = require("../../types/response");
5
5
  class ImageMessage {
6
6
  constructor(image, chatInfo, replyId, traceId, action, options) {
7
7
  this.kind = response_1.BotResponseTypes.image;
8
+ this.createdAt = Date.now();
8
9
  this.disableWebPreview = false;
9
10
  this.content = image;
10
11
  this.chatInfo = chatInfo;
@@ -6,6 +6,7 @@ import { ChatInfo } from '../chatInfo';
6
6
  import { TraceId } from '../../types/trace';
7
7
  export declare class Reaction implements IChatResponse {
8
8
  readonly kind: "react";
9
+ readonly createdAt: number;
9
10
  readonly chatInfo: ChatInfo;
10
11
  readonly messageId: number;
11
12
  readonly traceId: TraceId;
@@ -1 +1 @@
1
- {"version":3,"file":"reaction.d.ts","sourceRoot":"","sources":["../../../dtos/responses/reaction.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAoB,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACvE,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAE5C,qBAAa,QAAS,YAAW,aAAa;IAC1C,QAAQ,CAAC,IAAI,UAA0B;IAEvC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC;IAC9B,QAAQ,CAAC,MAAM,EAAE,gBAAgB,CAAC,YAAY,CAAC,CAAC;gBAG5C,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,QAAQ,EAClB,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,aAAa,EACpB,MAAM,EAAE,gBAAgB,CAAC,YAAY,CAAC;CAQ7C"}
1
+ {"version":3,"file":"reaction.d.ts","sourceRoot":"","sources":["../../../dtos/responses/reaction.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAoB,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACvE,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAE5C,qBAAa,QAAS,YAAW,aAAa;IAC1C,QAAQ,CAAC,IAAI,UAA0B;IACvC,QAAQ,CAAC,SAAS,SAAc;IAEhC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC;IAC9B,QAAQ,CAAC,MAAM,EAAE,gBAAgB,CAAC,YAAY,CAAC,CAAC;gBAG5C,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,QAAQ,EAClB,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,aAAa,EACpB,MAAM,EAAE,gBAAgB,CAAC,YAAY,CAAC;CAQ7C"}
@@ -5,6 +5,7 @@ const response_1 = require("../../types/response");
5
5
  class Reaction {
6
6
  constructor(traceId, chatInfo, messageId, emoji, action) {
7
7
  this.kind = response_1.BotResponseTypes.react;
8
+ this.createdAt = Date.now();
8
9
  this.chatInfo = chatInfo;
9
10
  this.messageId = messageId;
10
11
  this.emoji = emoji;
@@ -6,6 +6,7 @@ import { ChatInfo } from '../chatInfo';
6
6
  import { TraceId } from '../../types/trace';
7
7
  export declare class TextMessage implements IReplyMessage<string> {
8
8
  readonly kind: "text";
9
+ readonly createdAt: number;
9
10
  readonly content: string;
10
11
  readonly chatInfo: ChatInfo;
11
12
  readonly replyId: number | undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"textMessage.d.ts","sourceRoot":"","sources":["../../../dtos/responses/textMessage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,MAAM,mCAAmC,CAAC;AAC9E,OAAO,EAAoB,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACvE,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAE5C,qBAAa,WAAY,YAAW,aAAa,CAAC,MAAM,CAAC;IACrD,QAAQ,CAAC,IAAI,SAAyB;IAEtC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IACrC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,iBAAiB,EAAE,OAAO,CAAC;IACpC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,MAAM,EAAE,gBAAgB,CAAC,YAAY,CAAC,CAAC;gBAG5C,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,MAAM,GAAG,SAAS,EAC3B,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,gBAAgB,CAAC,YAAY,CAAC,EACtC,OAAO,CAAC,EAAE,yBAAyB;CAU1C"}
1
+ {"version":3,"file":"textMessage.d.ts","sourceRoot":"","sources":["../../../dtos/responses/textMessage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,MAAM,mCAAmC,CAAC;AAC9E,OAAO,EAAoB,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACvE,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAE5C,qBAAa,WAAY,YAAW,aAAa,CAAC,MAAM,CAAC;IACrD,QAAQ,CAAC,IAAI,SAAyB;IACtC,QAAQ,CAAC,SAAS,SAAc;IAEhC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IACrC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,iBAAiB,EAAE,OAAO,CAAC;IACpC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,MAAM,EAAE,gBAAgB,CAAC,YAAY,CAAC,CAAC;gBAG5C,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,MAAM,GAAG,SAAS,EAC3B,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,gBAAgB,CAAC,YAAY,CAAC,EACtC,OAAO,CAAC,EAAE,yBAAyB;CAU1C"}
@@ -5,6 +5,7 @@ const response_1 = require("../../types/response");
5
5
  class TextMessage {
6
6
  constructor(text, chatInfo, replyId, traceId, action, options) {
7
7
  this.kind = response_1.BotResponseTypes.text;
8
+ this.createdAt = Date.now();
8
9
  this.content = text;
9
10
  this.chatInfo = chatInfo;
10
11
  this.replyId = replyId;
@@ -5,6 +5,7 @@ import { ChatInfo } from '../chatInfo';
5
5
  import { TraceId } from '../../types/trace';
6
6
  export declare class UnpinResponse implements IChatResponse {
7
7
  readonly kind: "unpin";
8
+ readonly createdAt: number;
8
9
  readonly messageId: number;
9
10
  readonly chatInfo: ChatInfo;
10
11
  readonly traceId: TraceId;
@@ -1 +1 @@
1
- {"version":3,"file":"unpin.d.ts","sourceRoot":"","sources":["../../../dtos/responses/unpin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACvE,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAE5C,qBAAa,aAAc,YAAW,aAAa;IAC/C,QAAQ,CAAC,IAAI,UAA0B;IAEvC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,gBAAgB,CAAC,YAAY,CAAC,CAAC;gBAG5C,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,gBAAgB,CAAC,YAAY,CAAC;CAO7C"}
1
+ {"version":3,"file":"unpin.d.ts","sourceRoot":"","sources":["../../../dtos/responses/unpin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACvE,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAE5C,qBAAa,aAAc,YAAW,aAAa;IAC/C,QAAQ,CAAC,IAAI,UAA0B;IACvC,QAAQ,CAAC,SAAS,SAAc;IAEhC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,gBAAgB,CAAC,YAAY,CAAC,CAAC;gBAG5C,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,gBAAgB,CAAC,YAAY,CAAC;CAO7C"}
@@ -5,6 +5,7 @@ const response_1 = require("../../types/response");
5
5
  class UnpinResponse {
6
6
  constructor(messageId, chatInfo, traceId, action) {
7
7
  this.kind = response_1.BotResponseTypes.unpin;
8
+ this.createdAt = Date.now();
8
9
  this.messageId = messageId;
9
10
  this.chatInfo = chatInfo;
10
11
  this.traceId = traceId;
@@ -7,6 +7,7 @@ import { ChatInfo } from '../chatInfo';
7
7
  import { TraceId } from '../../types/trace';
8
8
  export declare class VideoMessage implements IReplyMessage<InputFile> {
9
9
  readonly kind: "video";
10
+ readonly createdAt: number;
10
11
  readonly content: InputFile;
11
12
  readonly chatInfo: ChatInfo;
12
13
  readonly replyId: number | undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"videoMessage.d.ts","sourceRoot":"","sources":["../../../dtos/responses/videoMessage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAoB,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACvE,OAAO,EAAE,qBAAqB,EAAE,MAAM,mCAAmC,CAAC;AAC1E,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAE5C,qBAAa,YAAa,YAAW,aAAa,CAAC,SAAS,CAAC;IACzD,QAAQ,CAAC,IAAI,UAA0B;IAEvC,QAAQ,CAAC,OAAO,EAAE,SAAS,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IACrC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,iBAAiB,SAAS;IACnC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,MAAM,EAAE,gBAAgB,CAAC,YAAY,CAAC,CAAC;gBAG5C,KAAK,EAAE,SAAS,EAChB,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,MAAM,GAAG,SAAS,EAC3B,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,gBAAgB,CAAC,YAAY,CAAC,EACtC,OAAO,CAAC,EAAE,qBAAqB;CAStC"}
1
+ {"version":3,"file":"videoMessage.d.ts","sourceRoot":"","sources":["../../../dtos/responses/videoMessage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAoB,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACvE,OAAO,EAAE,qBAAqB,EAAE,MAAM,mCAAmC,CAAC;AAC1E,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAE5C,qBAAa,YAAa,YAAW,aAAa,CAAC,SAAS,CAAC;IACzD,QAAQ,CAAC,IAAI,UAA0B;IACvC,QAAQ,CAAC,SAAS,SAAc;IAEhC,QAAQ,CAAC,OAAO,EAAE,SAAS,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IACrC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,iBAAiB,SAAS;IACnC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,MAAM,EAAE,gBAAgB,CAAC,YAAY,CAAC,CAAC;gBAG5C,KAAK,EAAE,SAAS,EAChB,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,MAAM,GAAG,SAAS,EAC3B,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,gBAAgB,CAAC,YAAY,CAAC,EACtC,OAAO,CAAC,EAAE,qBAAqB;CAStC"}
@@ -5,6 +5,7 @@ const response_1 = require("../../types/response");
5
5
  class VideoMessage {
6
6
  constructor(video, chatInfo, replyId, traceId, action, options) {
7
7
  this.kind = response_1.BotResponseTypes.video;
8
+ this.createdAt = Date.now();
8
9
  this.disableWebPreview = false;
9
10
  this.content = video;
10
11
  this.chatInfo = chatInfo;
@@ -97,7 +97,7 @@ class BotInstance {
97
97
  }
98
98
  }
99
99
  }
100
- await this.api.flushResponses();
100
+ this.api.flushResponses();
101
101
  }
102
102
  async processMessage(msg) {
103
103
  const ctx = new messageContext_1.MessageContext(this.storage, this.logger, this.scheduler);
@@ -112,7 +112,7 @@ class BotInstance {
112
112
  this.logger.errorWithTraceId(ctx.botName, ctx.traceId, ctx.chatInfo.name, error, ctx);
113
113
  }
114
114
  }
115
- await this.api.flushResponses();
115
+ this.api.flushResponses();
116
116
  }
117
117
  }
118
118
  exports.BotInstance = BotInstance;
@@ -58,9 +58,9 @@ export declare class ChatContext<TActionState extends IActionState> {
58
58
  */
59
59
  unpinMessage(messageId: number): void;
60
60
  /**
61
- * Delays next response by specified amount of time.
61
+ * Delays next responses by specified amount of time.
62
62
  * @param delay Delay in milliseconds.
63
63
  */
64
- delayNextResponse(delay: Milliseconds): void;
64
+ wait(delay: Milliseconds): void;
65
65
  }
66
66
  //# sourceMappingURL=chatContext.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"chatContext.d.ts","sourceRoot":"","sources":["../../../entities/context/chatContext.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAKrD,OAAO,EACH,qBAAqB,EACrB,yBAAyB,EAC5B,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAEtD,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAE5C;;GAEG;AACH,qBAAa,WAAW,CAAC,YAAY,SAAS,YAAY;IACtD,SAAS,CAAC,MAAM,EAAG,gBAAgB,CAAC,YAAY,CAAC,CAAC;IAElD,iEAAiE;IACjE,QAAQ,CAAC,OAAO,EAAG,cAAc,CAAC;IAClC,wDAAwD;IACxD,QAAQ,CAAC,MAAM,EAAG,OAAO,CAAC;IAC1B,2DAA2D;IAC3D,QAAQ,CAAC,SAAS,EAAG,UAAU,CAAC;IAEhC,sCAAsC;IACtC,OAAO,EAAG,OAAO,CAAC;IAClB,+CAA+C;IAC/C,OAAO,EAAG,MAAM,CAAC;IACjB,wBAAwB;IACxB,QAAQ,EAAG,QAAQ,CAAC;IACpB,uDAAuD;IACvD,SAAS,EAAE,WAAW,EAAE,CAAM;IAE9B,aAAa,UAAS;gBAGlB,OAAO,EAAE,cAAc,EACvB,MAAM,EAAE,OAAO,EACf,SAAS,EAAE,UAAU;IAOzB,qBAAqB,CACjB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,gBAAgB,CAAC,YAAY,CAAC,EACtC,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,OAAO;IAapB;;;;;OAKG;IACH,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,yBAAyB;IAahE;;;;;OAKG;IACH,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,qBAAqB;IAc7D;;;;;OAKG;IACH,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,qBAAqB;IAc7D;;;;OAIG;IACH,YAAY,CAAC,SAAS,EAAE,MAAM;IAW9B;;;OAGG;IACH,iBAAiB,CAAC,KAAK,EAAE,YAAY;CAKxC"}
1
+ {"version":3,"file":"chatContext.d.ts","sourceRoot":"","sources":["../../../entities/context/chatContext.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAKrD,OAAO,EACH,qBAAqB,EACrB,yBAAyB,EAC5B,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAEtD,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAE5C;;GAEG;AACH,qBAAa,WAAW,CAAC,YAAY,SAAS,YAAY;IACtD,SAAS,CAAC,MAAM,EAAG,gBAAgB,CAAC,YAAY,CAAC,CAAC;IAElD,iEAAiE;IACjE,QAAQ,CAAC,OAAO,EAAG,cAAc,CAAC;IAClC,wDAAwD;IACxD,QAAQ,CAAC,MAAM,EAAG,OAAO,CAAC;IAC1B,2DAA2D;IAC3D,QAAQ,CAAC,SAAS,EAAG,UAAU,CAAC;IAEhC,sCAAsC;IACtC,OAAO,EAAG,OAAO,CAAC;IAClB,+CAA+C;IAC/C,OAAO,EAAG,MAAM,CAAC;IACjB,wBAAwB;IACxB,QAAQ,EAAG,QAAQ,CAAC;IACpB,uDAAuD;IACvD,SAAS,EAAE,WAAW,EAAE,CAAM;IAE9B,aAAa,UAAS;gBAGlB,OAAO,EAAE,cAAc,EACvB,MAAM,EAAE,OAAO,EACf,SAAS,EAAE,UAAU;IAOzB,qBAAqB,CACjB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,gBAAgB,CAAC,YAAY,CAAC,EACtC,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,OAAO;IAapB;;;;;OAKG;IACH,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,yBAAyB;IAahE;;;;;OAKG;IACH,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,qBAAqB;IAc7D;;;;;OAKG;IACH,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,qBAAqB;IAc7D;;;;OAIG;IACH,YAAY,CAAC,SAAS,EAAE,MAAM;IAW9B;;;OAGG;IACH,IAAI,CAAC,KAAK,EAAE,YAAY;CAK3B"}
@@ -66,10 +66,10 @@ class ChatContext {
66
66
  this.responses.push(new unpin_1.UnpinResponse(messageId, this.chatInfo, this.traceId, this.action));
67
67
  }
68
68
  /**
69
- * Delays next response by specified amount of time.
69
+ * Delays next responses by specified amount of time.
70
70
  * @param delay Delay in milliseconds.
71
71
  */
72
- delayNextResponse(delay) {
72
+ wait(delay) {
73
73
  this.responses.push(new delay_1.DelayResponse(delay, this.chatInfo, this.traceId, this.action));
74
74
  }
75
75
  }
@@ -0,0 +1,12 @@
1
+ export type QueueItem = {
2
+ priority: number;
3
+ callback: () => Promise<void>;
4
+ };
5
+ export declare class ResponseProcessingQueue {
6
+ items: QueueItem[];
7
+ isFlushing: boolean;
8
+ enqueue(item: QueueItem): void;
9
+ flushReadyItems(): Promise<void>;
10
+ private peek;
11
+ }
12
+ //# sourceMappingURL=responseProcessingQueue.d.ts.map
@@ -0,0 +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;AAIF,qBAAa,uBAAuB;IAChC,KAAK,EAAE,SAAS,EAAE,CAAM;IACxB,UAAU,UAAS;IAEnB,OAAO,CAAC,IAAI,EAAE,SAAS;IAmBjB,eAAe;IAoBrB,OAAO,CAAC,IAAI;CAGf"}
@@ -0,0 +1,45 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ResponseProcessingQueue = void 0;
4
+ const promises_1 = require("timers/promises");
5
+ const TELEGRAM_RATELIMIT_DELAY = 35;
6
+ class ResponseProcessingQueue {
7
+ constructor() {
8
+ this.items = [];
9
+ this.isFlushing = false;
10
+ }
11
+ enqueue(item) {
12
+ if (this.items.length === 0 ||
13
+ item.priority >= this.items[this.items.length - 1].priority) {
14
+ this.items.push(item);
15
+ return;
16
+ }
17
+ let insertIndex = this.items.length;
18
+ while (insertIndex > 0 &&
19
+ this.items[insertIndex - 1].priority > item.priority) {
20
+ insertIndex--;
21
+ }
22
+ this.items.splice(insertIndex, 0, item);
23
+ }
24
+ async flushReadyItems() {
25
+ if (this.isFlushing)
26
+ return;
27
+ this.isFlushing = true;
28
+ while (this.items.length) {
29
+ if (Date.now() >= this.peek().priority) {
30
+ const item = this.items.shift();
31
+ if (!item)
32
+ return;
33
+ await item.callback();
34
+ }
35
+ else {
36
+ await (0, promises_1.setTimeout)(TELEGRAM_RATELIMIT_DELAY);
37
+ }
38
+ }
39
+ this.isFlushing = false;
40
+ }
41
+ peek() {
42
+ return this.items[0];
43
+ }
44
+ }
45
+ exports.ResponseProcessingQueue = ResponseProcessingQueue;
@@ -3,15 +3,14 @@ import { BotResponse } from '../types/response';
3
3
  import { Telegram } from 'telegraf/typings/telegram';
4
4
  import { ILogger } from '../types/logger';
5
5
  export declare class TelegramApiService {
6
+ private readonly queue;
6
7
  private readonly telegram;
7
8
  private readonly storage;
8
9
  private readonly logger;
9
10
  private readonly botName;
10
- private readonly messageQueue;
11
- isFlushing: boolean;
12
11
  constructor(botName: string, telegram: Telegram, storage: IStorageClient, logger: ILogger);
13
12
  enqueueBatchedResponses(responses: BotResponse[]): void;
14
- flushResponses(): Promise<void>;
13
+ flushResponses(): void;
15
14
  private pinIfShould;
16
15
  private processResponse;
17
16
  }
@@ -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,EAAiB,MAAM,mBAAmB,CAAC;AAC/D,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAGrD,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAI1C,qBAAa,kBAAkB;IAC3B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAW;IACpC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAiB;IACzC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAU;IAEjC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAqB;IAClD,UAAU,UAAS;gBAGf,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,cAAc,EACvB,MAAM,EAAE,OAAO;IAQnB,uBAAuB,CAAC,SAAS,EAAE,WAAW,EAAE;IAM1C,cAAc;YA2BN,WAAW;YAqBX,eAAe;CA8EhC"}
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,EAAiB,MAAM,mBAAmB,CAAC;AAC/D,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AACrD,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAG1C,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;IAEjC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;gBAG7B,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,cAAc,EACvB,MAAM,EAAE,OAAO;IAQnB,uBAAuB,CAAC,SAAS,EAAE,WAAW,EAAE;IA4BhD,cAAc;YAIA,WAAW;YAqBX,eAAe;CA4EhC"}
@@ -1,39 +1,38 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.TelegramApiService = void 0;
4
- const promises_1 = require("timers/promises");
5
- const TELEGRAM_RATELIMIT_DELAY = 35;
4
+ const responseProcessingQueue_1 = require("./responseProcessingQueue");
6
5
  class TelegramApiService {
7
6
  constructor(botName, telegram, storage, logger) {
8
- this.messageQueue = [];
9
- this.isFlushing = false;
7
+ this.queue = new responseProcessingQueue_1.ResponseProcessingQueue();
10
8
  this.telegram = telegram;
11
9
  this.botName = botName;
12
10
  this.storage = storage;
13
11
  this.logger = logger;
14
12
  }
15
13
  enqueueBatchedResponses(responses) {
14
+ let offset = 0;
16
15
  for (const response of responses) {
17
- this.messageQueue.push(response);
18
- }
19
- }
20
- async flushResponses() {
21
- if (this.isFlushing)
22
- return;
23
- this.isFlushing = true;
24
- while (this.messageQueue.length) {
25
- const message = this.messageQueue.shift();
26
- if (!message)
27
- break;
28
- try {
29
- await this.processResponse(message);
30
- await (0, promises_1.setTimeout)(TELEGRAM_RATELIMIT_DELAY);
31
- }
32
- catch (error) {
33
- this.logger.errorWithTraceId(this.botName, message.traceId, message.chatInfo.name, error, message);
16
+ if (response.kind == 'delay') {
17
+ offset += response.delay;
18
+ continue;
34
19
  }
20
+ const queueItem = {
21
+ callback: async () => {
22
+ try {
23
+ await this.processResponse(response);
24
+ }
25
+ catch (error) {
26
+ this.logger.errorWithTraceId(this.botName, response.traceId, response.chatInfo.name, error, response);
27
+ }
28
+ },
29
+ priority: response.createdAt + offset
30
+ };
31
+ this.queue.enqueue(queueItem);
35
32
  }
36
- this.isFlushing = false;
33
+ }
34
+ flushResponses() {
35
+ this.queue.flushReadyItems();
37
36
  }
38
37
  async pinIfShould(response, sentMessage) {
39
38
  if (response.shouldPin) {
@@ -84,9 +83,7 @@ class TelegramApiService {
84
83
  });
85
84
  break;
86
85
  case 'delay':
87
- if (response.delay > TELEGRAM_RATELIMIT_DELAY) {
88
- await (0, promises_1.setTimeout)(response.delay - TELEGRAM_RATELIMIT_DELAY);
89
- }
86
+ break;
90
87
  }
91
88
  }
92
89
  }
@@ -21,6 +21,7 @@ export interface IChatResponse {
21
21
  readonly kind: keyof typeof BotResponseTypes;
22
22
  readonly chatInfo: ChatInfo;
23
23
  readonly traceId: TraceId;
24
+ readonly createdAt: number;
24
25
  readonly action: IActionWithState<IActionState>;
25
26
  }
26
27
  export interface IReplyMessage<TType> extends IChatResponse {
@@ -1 +1 @@
1
- {"version":3,"file":"response.d.ts","sourceRoot":"","sources":["../../types/response.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAC9D,OAAO,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAElC,eAAO,MAAM,gBAAgB;;;;;;;CAOnB,CAAC;AAEX,MAAM,MAAM,WAAW,GACjB,aAAa,GACb,QAAQ,GACR,WAAW,GACX,YAAY,GACZ,aAAa,GACb,YAAY,CAAC;AAEnB,MAAM,WAAW,aAAa;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,OAAO,gBAAgB,CAAC;IAC7C,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAE1B,QAAQ,CAAC,MAAM,EAAE,gBAAgB,CAAC,YAAY,CAAC,CAAC;CACnD;AAED,MAAM,WAAW,aAAa,CAAC,KAAK,CAAE,SAAQ,aAAa;IACvD,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IACrC,QAAQ,CAAC,iBAAiB,EAAE,OAAO,CAAC;IACpC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;CAC/B"}
1
+ {"version":3,"file":"response.d.ts","sourceRoot":"","sources":["../../types/response.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAC9D,OAAO,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAElC,eAAO,MAAM,gBAAgB;;;;;;;CAOnB,CAAC;AAEX,MAAM,MAAM,WAAW,GACjB,aAAa,GACb,QAAQ,GACR,WAAW,GACX,YAAY,GACZ,aAAa,GACb,YAAY,CAAC;AAEnB,MAAM,WAAW,aAAa;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,OAAO,gBAAgB,CAAC;IAC7C,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAE3B,QAAQ,CAAC,MAAM,EAAE,gBAAgB,CAAC,YAAY,CAAC,CAAC;CACnD;AAED,MAAM,WAAW,aAAa,CAAC,KAAK,CAAE,SAAQ,aAAa;IACvD,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IACrC,QAAQ,CAAC,iBAAiB,EAAE,OAAO,CAAC;IACpC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;CAC/B"}
@@ -7,6 +7,7 @@ import { ChatInfo } from '../chatInfo';
7
7
 
8
8
  export class DelayResponse implements IChatResponse {
9
9
  readonly kind = BotResponseTypes.delay;
10
+ readonly createdAt = Date.now();
10
11
 
11
12
  readonly chatInfo: ChatInfo;
12
13
  readonly traceId: TraceId;
@@ -8,6 +8,7 @@ import { TraceId } from '../../types/trace';
8
8
 
9
9
  export class ImageMessage implements IReplyMessage<InputFile> {
10
10
  readonly kind = BotResponseTypes.image;
11
+ readonly createdAt = Date.now();
11
12
 
12
13
  readonly content: InputFile;
13
14
  readonly chatInfo: ChatInfo;
@@ -7,6 +7,7 @@ import { TraceId } from '../../types/trace';
7
7
 
8
8
  export class Reaction implements IChatResponse {
9
9
  readonly kind = BotResponseTypes.react;
10
+ readonly createdAt = Date.now();
10
11
 
11
12
  readonly chatInfo: ChatInfo;
12
13
  readonly messageId: number;
@@ -7,6 +7,7 @@ import { TraceId } from '../../types/trace';
7
7
 
8
8
  export class TextMessage implements IReplyMessage<string> {
9
9
  readonly kind = BotResponseTypes.text;
10
+ readonly createdAt = Date.now();
10
11
 
11
12
  readonly content: string;
12
13
  readonly chatInfo: ChatInfo;