chz-telegram-bot 0.5.2 → 0.5.3

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 (216) hide show
  1. package/dtos/chatHistoryMessage.ts +9 -1
  2. package/package.json +38 -38
  3. package/services/actionProcessors/commandActionProcessor.ts +2 -1
  4. package/dist/builtin/helpAction.d.ts +0 -2
  5. package/dist/builtin/helpAction.d.ts.map +0 -1
  6. package/dist/builtin/helpAction.js +0 -14
  7. package/dist/dtos/chatHistoryMessage.d.ts +0 -13
  8. package/dist/dtos/chatHistoryMessage.d.ts.map +0 -1
  9. package/dist/dtos/chatHistoryMessage.js +0 -16
  10. package/dist/dtos/chatInfo.d.ts +0 -17
  11. package/dist/dtos/chatInfo.d.ts.map +0 -1
  12. package/dist/dtos/chatInfo.js +0 -16
  13. package/dist/dtos/commandTriggerCheckResult.d.ts +0 -24
  14. package/dist/dtos/commandTriggerCheckResult.d.ts.map +0 -1
  15. package/dist/dtos/commandTriggerCheckResult.js +0 -34
  16. package/dist/dtos/cooldownInfo.d.ts +0 -13
  17. package/dist/dtos/cooldownInfo.d.ts.map +0 -1
  18. package/dist/dtos/cooldownInfo.js +0 -12
  19. package/dist/dtos/incomingMessage.d.ts +0 -19
  20. package/dist/dtos/incomingMessage.d.ts.map +0 -1
  21. package/dist/dtos/incomingMessage.js +0 -63
  22. package/dist/dtos/incomingQuery.d.ts +0 -10
  23. package/dist/dtos/incomingQuery.d.ts.map +0 -1
  24. package/dist/dtos/incomingQuery.js +0 -14
  25. package/dist/dtos/messageInfo.d.ts +0 -22
  26. package/dist/dtos/messageInfo.d.ts.map +0 -1
  27. package/dist/dtos/messageInfo.js +0 -20
  28. package/dist/dtos/propertyProviderSets.d.ts +0 -16
  29. package/dist/dtos/propertyProviderSets.d.ts.map +0 -1
  30. package/dist/dtos/propertyProviderSets.js +0 -1
  31. package/dist/dtos/replyInfo.d.ts +0 -6
  32. package/dist/dtos/replyInfo.d.ts.map +0 -1
  33. package/dist/dtos/replyInfo.js +0 -8
  34. package/dist/dtos/responses/delay.d.ts +0 -16
  35. package/dist/dtos/responses/delay.d.ts.map +0 -1
  36. package/dist/dtos/responses/delay.js +0 -15
  37. package/dist/dtos/responses/imageMessage.d.ts +0 -22
  38. package/dist/dtos/responses/imageMessage.d.ts.map +0 -1
  39. package/dist/dtos/responses/imageMessage.js +0 -21
  40. package/dist/dtos/responses/inlineQueryResponse.d.ts +0 -13
  41. package/dist/dtos/responses/inlineQueryResponse.d.ts.map +0 -1
  42. package/dist/dtos/responses/inlineQueryResponse.js +0 -15
  43. package/dist/dtos/responses/reaction.d.ts +0 -16
  44. package/dist/dtos/responses/reaction.d.ts.map +0 -1
  45. package/dist/dtos/responses/reaction.js +0 -17
  46. package/dist/dtos/responses/textMessage.d.ts +0 -23
  47. package/dist/dtos/responses/textMessage.d.ts.map +0 -1
  48. package/dist/dtos/responses/textMessage.js +0 -24
  49. package/dist/dtos/responses/unpin.d.ts +0 -15
  50. package/dist/dtos/responses/unpin.d.ts.map +0 -1
  51. package/dist/dtos/responses/unpin.js +0 -15
  52. package/dist/dtos/responses/videoMessage.d.ts +0 -22
  53. package/dist/dtos/responses/videoMessage.d.ts.map +0 -1
  54. package/dist/dtos/responses/videoMessage.js +0 -21
  55. package/dist/dtos/userInfo.d.ts +0 -12
  56. package/dist/dtos/userInfo.d.ts.map +0 -1
  57. package/dist/dtos/userInfo.js +0 -12
  58. package/dist/entities/actions/commandAction.d.ts +0 -31
  59. package/dist/entities/actions/commandAction.d.ts.map +0 -1
  60. package/dist/entities/actions/commandAction.js +0 -139
  61. package/dist/entities/actions/inlineQueryAction.d.ts +0 -14
  62. package/dist/entities/actions/inlineQueryAction.d.ts.map +0 -1
  63. package/dist/entities/actions/inlineQueryAction.js +0 -43
  64. package/dist/entities/actions/replyCaptureAction.d.ts +0 -15
  65. package/dist/entities/actions/replyCaptureAction.d.ts.map +0 -1
  66. package/dist/entities/actions/replyCaptureAction.js +0 -58
  67. package/dist/entities/actions/scheduledAction.d.ts +0 -24
  68. package/dist/entities/actions/scheduledAction.d.ts.map +0 -1
  69. package/dist/entities/actions/scheduledAction.js +0 -72
  70. package/dist/entities/botInstance.d.ts +0 -37
  71. package/dist/entities/botInstance.d.ts.map +0 -1
  72. package/dist/entities/botInstance.js +0 -37
  73. package/dist/entities/cachedStateFactory.d.ts +0 -7
  74. package/dist/entities/cachedStateFactory.d.ts.map +0 -1
  75. package/dist/entities/cachedStateFactory.js +0 -8
  76. package/dist/entities/context/baseContext.d.ts +0 -39
  77. package/dist/entities/context/baseContext.d.ts.map +0 -1
  78. package/dist/entities/context/baseContext.js +0 -55
  79. package/dist/entities/context/chatContext.d.ts +0 -50
  80. package/dist/entities/context/chatContext.d.ts.map +0 -1
  81. package/dist/entities/context/chatContext.js +0 -65
  82. package/dist/entities/context/inlineQueryContext.d.ts +0 -27
  83. package/dist/entities/context/inlineQueryContext.d.ts.map +0 -1
  84. package/dist/entities/context/inlineQueryContext.js +0 -29
  85. package/dist/entities/context/messageContext.d.ts +0 -92
  86. package/dist/entities/context/messageContext.d.ts.map +0 -1
  87. package/dist/entities/context/messageContext.js +0 -116
  88. package/dist/entities/context/replyContext.d.ts +0 -89
  89. package/dist/entities/context/replyContext.d.ts.map +0 -1
  90. package/dist/entities/context/replyContext.js +0 -124
  91. package/dist/entities/states/actionStateBase.d.ts +0 -6
  92. package/dist/entities/states/actionStateBase.d.ts.map +0 -1
  93. package/dist/entities/states/actionStateBase.js +0 -4
  94. package/dist/entities/taskRecord.d.ts +0 -8
  95. package/dist/entities/taskRecord.d.ts.map +0 -1
  96. package/dist/entities/taskRecord.js +0 -10
  97. package/dist/eslint.config.d.ts +0 -3
  98. package/dist/eslint.config.d.ts.map +0 -1
  99. package/dist/eslint.config.js +0 -51
  100. package/dist/helpers/builders/commandActionBuilder.d.ts +0 -100
  101. package/dist/helpers/builders/commandActionBuilder.d.ts.map +0 -1
  102. package/dist/helpers/builders/commandActionBuilder.js +0 -146
  103. package/dist/helpers/builders/inlineQueryActionBuilder.d.ts +0 -37
  104. package/dist/helpers/builders/inlineQueryActionBuilder.d.ts.map +0 -1
  105. package/dist/helpers/builders/inlineQueryActionBuilder.js +0 -50
  106. package/dist/helpers/builders/scheduledActionBuilder.d.ts +0 -68
  107. package/dist/helpers/builders/scheduledActionBuilder.d.ts.map +0 -1
  108. package/dist/helpers/builders/scheduledActionBuilder.js +0 -95
  109. package/dist/helpers/mapUtils.d.ts +0 -10
  110. package/dist/helpers/mapUtils.d.ts.map +0 -1
  111. package/dist/helpers/mapUtils.js +0 -13
  112. package/dist/helpers/noop.d.ts +0 -9
  113. package/dist/helpers/noop.d.ts.map +0 -1
  114. package/dist/helpers/noop.js +0 -17
  115. package/dist/helpers/objectFromEntries.d.ts +0 -2
  116. package/dist/helpers/objectFromEntries.d.ts.map +0 -1
  117. package/dist/helpers/objectFromEntries.js +0 -3
  118. package/dist/helpers/timeConvertions.d.ts +0 -5
  119. package/dist/helpers/timeConvertions.d.ts.map +0 -1
  120. package/dist/helpers/timeConvertions.js +0 -9
  121. package/dist/helpers/toArray.d.ts +0 -2
  122. package/dist/helpers/toArray.d.ts.map +0 -1
  123. package/dist/helpers/toArray.js +0 -3
  124. package/dist/helpers/traceFactory.d.ts +0 -3
  125. package/dist/helpers/traceFactory.d.ts.map +0 -1
  126. package/dist/helpers/traceFactory.js +0 -3
  127. package/dist/index.d.ts +0 -27
  128. package/dist/index.d.ts.map +0 -1
  129. package/dist/index.js +0 -20
  130. package/dist/main.d.ts +0 -52
  131. package/dist/main.d.ts.map +0 -1
  132. package/dist/main.js +0 -34
  133. package/dist/services/actionProcessingService.d.ts +0 -25
  134. package/dist/services/actionProcessingService.d.ts.map +0 -1
  135. package/dist/services/actionProcessingService.js +0 -50
  136. package/dist/services/actionProcessors/baseProcessor.d.ts +0 -18
  137. package/dist/services/actionProcessors/baseProcessor.d.ts.map +0 -1
  138. package/dist/services/actionProcessors/baseProcessor.js +0 -29
  139. package/dist/services/actionProcessors/commandActionProcessor.d.ts +0 -20
  140. package/dist/services/actionProcessors/commandActionProcessor.d.ts.map +0 -1
  141. package/dist/services/actionProcessors/commandActionProcessor.js +0 -116
  142. package/dist/services/actionProcessors/inlineQueryActionProcessor.d.ts +0 -11
  143. package/dist/services/actionProcessors/inlineQueryActionProcessor.d.ts.map +0 -1
  144. package/dist/services/actionProcessors/inlineQueryActionProcessor.js +0 -61
  145. package/dist/services/actionProcessors/scheduledActionProcessor.d.ts +0 -17
  146. package/dist/services/actionProcessors/scheduledActionProcessor.d.ts.map +0 -1
  147. package/dist/services/actionProcessors/scheduledActionProcessor.js +0 -56
  148. package/dist/services/jsonFileStorage.d.ts +0 -23
  149. package/dist/services/jsonFileStorage.d.ts.map +0 -1
  150. package/dist/services/jsonFileStorage.js +0 -109
  151. package/dist/services/jsonLogger.d.ts +0 -11
  152. package/dist/services/jsonLogger.d.ts.map +0 -1
  153. package/dist/services/jsonLogger.js +0 -66
  154. package/dist/services/nodeTimeoutScheduler.d.ts +0 -13
  155. package/dist/services/nodeTimeoutScheduler.d.ts.map +0 -1
  156. package/dist/services/nodeTimeoutScheduler.js +0 -31
  157. package/dist/services/responseProcessingQueue.d.ts +0 -12
  158. package/dist/services/responseProcessingQueue.d.ts.map +0 -1
  159. package/dist/services/responseProcessingQueue.js +0 -37
  160. package/dist/services/telegramApi.d.ts +0 -23
  161. package/dist/services/telegramApi.d.ts.map +0 -1
  162. package/dist/services/telegramApi.js +0 -133
  163. package/dist/types/action.d.ts +0 -14
  164. package/dist/types/action.d.ts.map +0 -1
  165. package/dist/types/action.js +0 -1
  166. package/dist/types/actionState.d.ts +0 -5
  167. package/dist/types/actionState.d.ts.map +0 -1
  168. package/dist/types/actionState.js +0 -1
  169. package/dist/types/cachedValueAccessor.d.ts +0 -2
  170. package/dist/types/cachedValueAccessor.d.ts.map +0 -1
  171. package/dist/types/cachedValueAccessor.js +0 -1
  172. package/dist/types/capture.d.ts +0 -24
  173. package/dist/types/capture.d.ts.map +0 -1
  174. package/dist/types/capture.js +0 -1
  175. package/dist/types/commandCondition.d.ts +0 -8
  176. package/dist/types/commandCondition.d.ts.map +0 -1
  177. package/dist/types/commandCondition.js +0 -1
  178. package/dist/types/commandTrigger.d.ts +0 -2
  179. package/dist/types/commandTrigger.d.ts.map +0 -1
  180. package/dist/types/commandTrigger.js +0 -1
  181. package/dist/types/externalAliases.d.ts +0 -11
  182. package/dist/types/externalAliases.d.ts.map +0 -1
  183. package/dist/types/externalAliases.js +0 -1
  184. package/dist/types/handlers.d.ts +0 -21
  185. package/dist/types/handlers.d.ts.map +0 -1
  186. package/dist/types/handlers.js +0 -1
  187. package/dist/types/inputFile.d.ts +0 -5
  188. package/dist/types/inputFile.d.ts.map +0 -1
  189. package/dist/types/inputFile.js +0 -1
  190. package/dist/types/logger.d.ts +0 -13
  191. package/dist/types/logger.d.ts.map +0 -1
  192. package/dist/types/logger.js +0 -1
  193. package/dist/types/messageSendingOptions.d.ts +0 -9
  194. package/dist/types/messageSendingOptions.d.ts.map +0 -1
  195. package/dist/types/messageSendingOptions.js +0 -1
  196. package/dist/types/messageTypes.d.ts +0 -20
  197. package/dist/types/messageTypes.d.ts.map +0 -1
  198. package/dist/types/messageTypes.js +0 -18
  199. package/dist/types/propertyProvider.d.ts +0 -8
  200. package/dist/types/propertyProvider.d.ts.map +0 -1
  201. package/dist/types/propertyProvider.js +0 -1
  202. package/dist/types/response.d.ts +0 -39
  203. package/dist/types/response.d.ts.map +0 -1
  204. package/dist/types/response.js +0 -9
  205. package/dist/types/scheduler.d.ts +0 -7
  206. package/dist/types/scheduler.d.ts.map +0 -1
  207. package/dist/types/scheduler.js +0 -1
  208. package/dist/types/storage.d.ts +0 -11
  209. package/dist/types/storage.d.ts.map +0 -1
  210. package/dist/types/storage.js +0 -1
  211. package/dist/types/timeValues.d.ts +0 -15
  212. package/dist/types/timeValues.d.ts.map +0 -1
  213. package/dist/types/timeValues.js +0 -1
  214. package/dist/types/trace.d.ts +0 -6
  215. package/dist/types/trace.d.ts.map +0 -1
  216. package/dist/types/trace.js +0 -1
package/dist/main.js DELETED
@@ -1,34 +0,0 @@
1
- import { readFile } from 'fs/promises';
2
- import { BotInstance } from './entities/botInstance';
3
- class BotOrchestrator {
4
- bots = [];
5
- /**
6
- * Starts bot
7
- */
8
- async startBot(options) {
9
- const token = await readFile(options.tokenFilePath, 'utf8');
10
- const bot = new BotInstance({
11
- name: options.name,
12
- actions: options.actions,
13
- chats: options.chats,
14
- services: {
15
- storageClient: options.services?.storageClient,
16
- logger: options.services?.logger,
17
- scheduler: options.services?.scheduler
18
- },
19
- storagePath: options.storagePath
20
- });
21
- await bot.start(token, options.actions, options.scheduledPeriod, options.verboseLoggingForIncomingMessage);
22
- this.bots.push(bot);
23
- return bot;
24
- }
25
- /**
26
- * Terminates all scheduled tasks, closes storage connections and stops all bots.
27
- */
28
- async stopBots() {
29
- for (const bot of this.bots) {
30
- await bot.stop();
31
- }
32
- }
33
- }
34
- export const botOrchestrator = new BotOrchestrator();
@@ -1,25 +0,0 @@
1
- import { Seconds } from '../types/timeValues';
2
- import { ILogger } from '../types/logger';
3
- import { IScheduler } from '../types/scheduler';
4
- import { IStorageClient } from '../types/storage';
5
- import { InlineQueryAction } from '../entities/actions/inlineQueryAction';
6
- import { IActionState } from '../types/actionState';
7
- import { CommandAction } from '../entities/actions/commandAction';
8
- import { ScheduledAction } from '../entities/actions/scheduledAction';
9
- export declare class ActionProcessingService {
10
- private readonly storage;
11
- private readonly logger;
12
- private readonly commandProcessor;
13
- private readonly scheduledProcessor;
14
- private readonly inlineQueryProcessor;
15
- private readonly botName;
16
- private telegramBot;
17
- constructor(botName: string, chats: Record<string, number>, storage: IStorageClient, scheduler: IScheduler, logger: ILogger);
18
- initialize(token: string, actions: {
19
- commands: CommandAction<IActionState>[];
20
- scheduled: ScheduledAction<IActionState>[];
21
- inlineQueries: InlineQueryAction[];
22
- }, scheduledPeriod?: Seconds, verboseLoggingForIncomingMessage?: boolean): Promise<void>;
23
- stop(): void;
24
- }
25
- //# sourceMappingURL=actionProcessingService.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"actionProcessingService.d.ts","sourceRoot":"","sources":["../../services/actionProcessingService.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAuB,MAAM,qBAAqB,CAAC;AACnE,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;AAQtE,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,WAAW,CAAe;gBAG9B,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;IA2D9C,IAAI;CAGP"}
@@ -1,50 +0,0 @@
1
- import { hoursToSeconds } from '../helpers/timeConvertions';
2
- import { TelegramApiService } from './telegramApi';
3
- import { buildHelpCommand } from '../builtin/helpAction';
4
- import { CommandActionProcessor } from './actionProcessors/commandActionProcessor';
5
- import { InlineQueryActionProcessor } from './actionProcessors/inlineQueryActionProcessor';
6
- import { ScheduledActionProcessor } from './actionProcessors/scheduledActionProcessor';
7
- import { Telegraf } from 'telegraf';
8
- export class ActionProcessingService {
9
- storage;
10
- logger;
11
- commandProcessor;
12
- scheduledProcessor;
13
- inlineQueryProcessor;
14
- botName;
15
- telegramBot;
16
- constructor(botName, chats, storage, scheduler, logger) {
17
- this.storage = storage;
18
- this.logger = logger;
19
- this.commandProcessor = new CommandActionProcessor(botName, storage, scheduler, logger);
20
- this.scheduledProcessor = new ScheduledActionProcessor(botName, chats, storage, scheduler, logger);
21
- this.inlineQueryProcessor = new InlineQueryActionProcessor(botName, storage, scheduler, logger);
22
- this.botName = botName;
23
- }
24
- async initialize(token, actions, scheduledPeriod, verboseLoggingForIncomingMessage) {
25
- this.telegramBot = new Telegraf(token);
26
- const api = new TelegramApiService(this.botName, this.telegramBot.telegram, this.storage, this.logger, (capture, id, chatInfo, traceId) => {
27
- this.commandProcessor.captureRegistrationCallback(capture, id, chatInfo, traceId);
28
- });
29
- const botInfo = await this.telegramBot.telegram.getMe();
30
- const commandActions = actions.commands.length > 0 && botInfo.username
31
- ? [
32
- buildHelpCommand(actions.commands
33
- .map((x) => x.readmeFactory(botInfo.username))
34
- .filter((x) => !!x), botInfo.username),
35
- ...actions.commands
36
- ]
37
- : [];
38
- this.commandProcessor.initialize(api, this.telegramBot, commandActions, verboseLoggingForIncomingMessage ?? false, botInfo);
39
- this.inlineQueryProcessor.initialize(api, this.telegramBot, actions.inlineQueries, 300);
40
- this.scheduledProcessor.initialize(api, actions.scheduled, scheduledPeriod ?? hoursToSeconds(1));
41
- void this.telegramBot.launch();
42
- void this.storage.saveMetadata([
43
- ...actions.scheduled,
44
- ...commandActions
45
- ]);
46
- }
47
- stop() {
48
- this.telegramBot.stop();
49
- }
50
- }
@@ -1,18 +0,0 @@
1
- import { ILogger } from '../../types/logger';
2
- import { IScheduler } from '../../types/scheduler';
3
- import { IStorageClient } from '../../types/storage';
4
- import { TelegramApiService } from '../telegramApi';
5
- import { IAction } from '../../types/action';
6
- import { BaseContextInternal } from '../../entities/context/baseContext';
7
- export declare abstract class BaseActionProcessor {
8
- protected readonly storage: IStorageClient;
9
- protected readonly scheduler: IScheduler;
10
- protected readonly logger: ILogger;
11
- protected readonly botName: string;
12
- protected api: TelegramApiService;
13
- constructor(botName: string, storage: IStorageClient, scheduler: IScheduler, logger: ILogger);
14
- private defaultErrorHandler;
15
- initializeDependencies(api: TelegramApiService): void;
16
- executeAction<TAction extends IAction, TActionContext extends BaseContextInternal<TAction>>(action: TAction, ctx: TActionContext, errorHandler?: (error: Error, ctx: TActionContext) => void): Promise<void>;
17
- }
18
- //# sourceMappingURL=baseProcessor.d.ts.map
@@ -1 +0,0 @@
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,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AAEzE,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,mBAAmB,CAAC,OAAO,CAAC,EAEnD,MAAM,EAAE,OAAO,EACf,GAAG,EAAE,cAAc,EACnB,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,cAAc,KAAK,IAAI;CAUjE"}
@@ -1,29 +0,0 @@
1
- export class BaseActionProcessor {
2
- storage;
3
- scheduler;
4
- logger;
5
- botName;
6
- api;
7
- constructor(botName, storage, scheduler, logger) {
8
- this.storage = storage;
9
- this.scheduler = scheduler;
10
- this.logger = logger;
11
- this.botName = botName;
12
- }
13
- defaultErrorHandler(error, ctx) {
14
- ctx.logger.errorWithTraceId(error, ctx);
15
- }
16
- initializeDependencies(api) {
17
- this.api = api;
18
- }
19
- async executeAction(action, ctx, errorHandler) {
20
- try {
21
- const responses = await action.exec(ctx);
22
- this.api.enqueueBatchedResponses(responses);
23
- ctx.isInitialized = false;
24
- }
25
- catch (error) {
26
- (errorHandler ?? this.defaultErrorHandler)(error, ctx);
27
- }
28
- }
29
- }
@@ -1,20 +0,0 @@
1
- import { CommandAction } from '../../entities/actions/commandAction';
2
- import { IActionState } from '../../types/actionState';
3
- import { TelegramApiService } from '../telegramApi';
4
- import { IReplyCapture } from '../../types/capture';
5
- import { TraceId } from '../../types/trace';
6
- import { ChatInfo } from '../../dtos/chatInfo';
7
- import { BaseActionProcessor } from './baseProcessor';
8
- import { BotInfo, TelegramBot } from '../../types/externalAliases';
9
- export declare class CommandActionProcessor extends BaseActionProcessor {
10
- private readonly replyCaptures;
11
- private readonly chatHistory;
12
- private botInfo;
13
- private commands;
14
- initialize(api: TelegramApiService, telegram: TelegramBot, commands: CommandAction<IActionState>[], verboseLoggingForIncomingMessage: boolean, botInfo: BotInfo): void;
15
- captureRegistrationCallback(capture: IReplyCapture, parentMessageId: number, chatInfo: ChatInfo, traceId: TraceId): void;
16
- private processMessage;
17
- private initializeReplyCaptureContext;
18
- private initializeMessageContext;
19
- }
20
- //# sourceMappingURL=commandActionProcessor.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"commandActionProcessor.d.ts","sourceRoot":"","sources":["../../../services/actionProcessors/commandActionProcessor.ts"],"names":[],"mappings":"AACA,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;AAKtD,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAInE,qBAAa,sBAAuB,SAAQ,mBAAmB;IAC3D,OAAO,CAAC,QAAQ,CAAC,aAAa,CAA0C;IACxE,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA2C;IACvE,OAAO,CAAC,OAAO,CAAW;IAE1B,OAAO,CAAC,QAAQ,CAKd;IAEF,UAAU,CACN,GAAG,EAAE,kBAAkB,EACvB,QAAQ,EAAE,WAAW,EACrB,QAAQ,EAAE,aAAa,CAAC,YAAY,CAAC,EAAE,EACvC,gCAAgC,EAAE,OAAO,EACzC,OAAO,EAAE,OAAO;IA0DpB,2BAA2B,CACvB,OAAO,EAAE,aAAa,EACtB,eAAe,EAAE,MAAM,EACvB,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,OAAO;YAgCN,cAAc;IAoD5B,OAAO,CAAC,6BAA6B;IAiCrC,OAAO,CAAC,wBAAwB;CAmCnC"}
@@ -1,116 +0,0 @@
1
- import { IncomingMessage } from '../../dtos/incomingMessage';
2
- import { ReplyCaptureAction } from '../../entities/actions/replyCaptureAction';
3
- import { MessageContextInternal } from '../../entities/context/messageContext';
4
- import { ReplyContextInternal } from '../../entities/context/replyContext';
5
- import { INTERNAL_MESSAGE_TYPE_PREFIX, MessageType } from '../../types/messageTypes';
6
- import { typeSafeObjectFromEntries } from '../../helpers/objectFromEntries';
7
- import { BaseActionProcessor } from './baseProcessor';
8
- import { getOrSetIfNotExists } from '../../helpers/mapUtils';
9
- import { MessageInfo } from '../../dtos/messageInfo';
10
- import { UserInfo } from '../../dtos/userInfo';
11
- import { ChatHistoryMessage } from '../../dtos/chatHistoryMessage';
12
- const MESSAGE_HISTORY_LENGTH_LIMIT = 100;
13
- export class CommandActionProcessor extends BaseActionProcessor {
14
- replyCaptures = [];
15
- chatHistory = new Map();
16
- botInfo;
17
- commands = typeSafeObjectFromEntries(Object.values(MessageType).map((x) => [
18
- x,
19
- []
20
- ]));
21
- initialize(api, telegram, commands, verboseLoggingForIncomingMessage, botInfo) {
22
- this.botInfo = botInfo;
23
- this.initializeDependencies(api);
24
- for (const msgType of Object.values(MessageType)) {
25
- if (msgType == MessageType.Text) {
26
- this.commands[msgType] = commands.filter((cmd) => cmd.triggers.some((x) => typeof x != 'string') ||
27
- cmd.triggers.some((x) => typeof x == 'string' &&
28
- !x.startsWith(INTERNAL_MESSAGE_TYPE_PREFIX)) ||
29
- cmd.triggers.includes(MessageType.Text) ||
30
- cmd.triggers.includes(MessageType.Any));
31
- continue;
32
- }
33
- this.commands[msgType] = commands.filter((cmd) => cmd.triggers.includes(msgType) ||
34
- cmd.triggers.includes(MessageType.Any));
35
- }
36
- if (commands.length > 0) {
37
- telegram.on('message', ({ message }) => {
38
- const internalMessage = new IncomingMessage(message, this.botName, getOrSetIfNotExists(this.chatHistory, message.chat.id, []));
39
- const logger = this.logger.createScope(this.botName, internalMessage.traceId, internalMessage.chatInfo.name);
40
- if (verboseLoggingForIncomingMessage) {
41
- logger.logObjectWithTraceId(message);
42
- }
43
- else {
44
- logger.logWithTraceId(`${internalMessage.from?.first_name ?? 'Unknown'} (${internalMessage.from?.id ?? 'Unknown'}): ${internalMessage.text || internalMessage.type}`);
45
- }
46
- void this.processMessage(internalMessage);
47
- });
48
- }
49
- }
50
- captureRegistrationCallback(capture, parentMessageId, chatInfo, traceId) {
51
- const replyAction = new ReplyCaptureAction(parentMessageId, capture.action, capture.handler, capture.trigger, capture.abortController);
52
- const logger = this.logger.createScope(this.botName, traceId, chatInfo.name);
53
- logger.logWithTraceId(`Starting capturing replies to message ${parentMessageId} with action ${replyAction.key}`);
54
- this.replyCaptures.push(replyAction);
55
- capture.abortController.signal.addEventListener('abort', () => {
56
- const index = this.replyCaptures.indexOf(replyAction);
57
- this.replyCaptures.splice(index, 1);
58
- logger.logWithTraceId(`Stopping capturing replies to message ${parentMessageId} with action ${replyAction.key}`);
59
- });
60
- }
61
- async processMessage(msg) {
62
- const chatHistoryArray = getOrSetIfNotExists(this.chatHistory, msg.chatInfo.id, []);
63
- while (chatHistoryArray.length > MESSAGE_HISTORY_LENGTH_LIMIT)
64
- chatHistoryArray.shift();
65
- chatHistoryArray.push(new ChatHistoryMessage(msg.messageId, msg.from, msg.text, msg.type, msg.traceId, msg.replyToMessageId));
66
- const ctx = new MessageContextInternal(this.storage, this.scheduler);
67
- const commandsToCheck = new Set(this.commands[msg.type]);
68
- if (msg.type != MessageType.Text && msg.text != '') {
69
- for (const command of this.commands[MessageType.Text]) {
70
- commandsToCheck.add(command);
71
- }
72
- }
73
- for (const commandAction of commandsToCheck) {
74
- this.initializeMessageContext(ctx, commandAction, msg);
75
- await this.executeAction(commandAction, ctx);
76
- }
77
- if (this.replyCaptures.length != 0) {
78
- const replyCtx = new ReplyContextInternal(this.storage, this.scheduler);
79
- for (const replyAction of this.replyCaptures) {
80
- this.initializeReplyCaptureContext(replyCtx, replyAction, msg);
81
- await this.executeAction(replyAction, replyCtx);
82
- }
83
- }
84
- this.api.flushResponses();
85
- }
86
- initializeReplyCaptureContext(ctx, action, message) {
87
- ctx.replyMessageId = message.replyToMessageId;
88
- ctx.messageInfo = new MessageInfo(message.messageId, message.text, message.type, message.updateObject);
89
- ctx.userInfo = new UserInfo(message.from?.id ?? -1, (message.from?.first_name ?? 'Unknown user') +
90
- (message.from?.last_name ? ` ${message.from.last_name}` : ''));
91
- ctx.botName = this.botName;
92
- ctx.action = action;
93
- ctx.chatInfo = message.chatInfo;
94
- ctx.traceId = message.traceId;
95
- ctx.botInfo = this.botInfo;
96
- ctx.isInitialized = true;
97
- ctx.matchResults = [];
98
- ctx.logger = this.logger.createScope(this.botName, message.traceId, message.chatInfo.name);
99
- }
100
- initializeMessageContext(ctx, action, message) {
101
- ctx.messageInfo = new MessageInfo(message.messageId, message.text, message.type, message.updateObject);
102
- ctx.userInfo = new UserInfo(message.from?.id ?? -1, (message.from?.first_name ?? 'Unknown user') +
103
- (message.from?.last_name ? ` ${message.from.last_name}` : ''));
104
- ctx.matchResults = [];
105
- ctx.startCooldown = true;
106
- ctx.responses = [];
107
- ctx.isInitialized = true;
108
- ctx.botName = this.botName;
109
- ctx.action = action;
110
- ctx.chatInfo = message.chatInfo;
111
- ctx.traceId = message.traceId;
112
- ctx.botInfo = this.botInfo;
113
- ctx.customCooldown = undefined;
114
- ctx.logger = this.logger.createScope(this.botName, message.traceId, message.chatInfo.name);
115
- }
116
- }
@@ -1,11 +0,0 @@
1
- import { InlineQueryAction } from '../../entities/actions/inlineQueryAction';
2
- import { TelegramBot } from '../../types/externalAliases';
3
- import { Milliseconds } from '../../types/timeValues';
4
- import { TelegramApiService } from '../telegramApi';
5
- import { BaseActionProcessor } from './baseProcessor';
6
- export declare class InlineQueryActionProcessor extends BaseActionProcessor {
7
- private inlineQueries;
8
- initialize(api: TelegramApiService, telegram: TelegramBot, inlineQueries: InlineQueryAction[], period: Milliseconds): void;
9
- private initializeInlineQueryContext;
10
- }
11
- //# sourceMappingURL=inlineQueryActionProcessor.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"inlineQueryActionProcessor.d.ts","sourceRoot":"","sources":["../../../services/actionProcessors/inlineQueryActionProcessor.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,0CAA0C,CAAC;AAG7E,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC1D,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,WAAW,EACrB,aAAa,EAAE,iBAAiB,EAAE,EAClC,MAAM,EAAE,YAAY;IAuGxB,OAAO,CAAC,4BAA4B;CAqBvC"}
@@ -1,61 +0,0 @@
1
- import { IncomingInlineQuery } from '../../dtos/incomingQuery';
2
- import { InlineQueryContextInternal } from '../../entities/context/inlineQueryContext';
3
- import { createTrace } from '../../helpers/traceFactory';
4
- import { BaseActionProcessor } from './baseProcessor';
5
- export class InlineQueryActionProcessor extends BaseActionProcessor {
6
- inlineQueries;
7
- initialize(api, telegram, inlineQueries, period) {
8
- this.initializeDependencies(api);
9
- this.inlineQueries = inlineQueries;
10
- let pendingInlineQueries = [];
11
- const queriesInProcessing = new Map();
12
- if (this.inlineQueries.length > 0) {
13
- telegram.on('inline_query', ({ inlineQuery }) => {
14
- const query = new IncomingInlineQuery(inlineQuery.id, inlineQuery.query, inlineQuery.from.id, createTrace('InlineQuery', this.botName, inlineQuery.id));
15
- const logger = this.logger.createScope(this.botName, query.traceId, 'Query');
16
- logger.logWithTraceId(`${inlineQuery.from.username ?? 'Unknown'} (${inlineQuery.from.id}): Query for ${inlineQuery.query}`);
17
- const queryBeingProcessed = queriesInProcessing.get(query.userId);
18
- if (queryBeingProcessed) {
19
- logger.logWithTraceId(`Aborting query ${queryBeingProcessed.queryId} (${queryBeingProcessed.query}): new query recieved from ${query.userId}`);
20
- queryBeingProcessed.abortController.abort();
21
- queriesInProcessing.delete(query.userId);
22
- }
23
- pendingInlineQueries = pendingInlineQueries.filter((q) => q.userId != query.userId);
24
- pendingInlineQueries.push(query);
25
- });
26
- this.scheduler.createTask('InlineQueryProcessing', async () => {
27
- const ctx = new InlineQueryContextInternal(this.storage, this.scheduler);
28
- const queriesToProcess = [...pendingInlineQueries];
29
- pendingInlineQueries = [];
30
- for (const inlineQuery of queriesToProcess) {
31
- queriesInProcessing.set(inlineQuery.userId, inlineQuery);
32
- for (const inlineQueryAction of this.inlineQueries) {
33
- this.initializeInlineQueryContext(ctx, inlineQuery.query, inlineQuery.queryId, inlineQueryAction, inlineQuery.abortController.signal, inlineQuery.traceId);
34
- await this.executeAction(inlineQueryAction, ctx, (error, ctx) => {
35
- if (error.name == 'AbortError') {
36
- ctx.logger.logWithTraceId(`Aborting query ${inlineQuery.queryId} (${inlineQuery.query}) successful.`);
37
- }
38
- else {
39
- ctx.logger.errorWithTraceId(error, ctx);
40
- }
41
- });
42
- }
43
- queriesInProcessing.delete(inlineQuery.userId);
44
- }
45
- this.api.flushResponses();
46
- }, period, false, this.botName);
47
- }
48
- }
49
- initializeInlineQueryContext(ctx, queryText, queryId, action, abortSignal, traceId) {
50
- ctx.queryText = queryText;
51
- ctx.queryId = queryId;
52
- ctx.botName = this.botName;
53
- ctx.action = action;
54
- ctx.traceId = traceId;
55
- ctx.abortSignal = abortSignal;
56
- ctx.isInitialized = true;
57
- ctx.queryResults = [];
58
- ctx.matchResults = [];
59
- ctx.logger = this.logger.createScope(this.botName, traceId, 'Unknown');
60
- }
61
- }
@@ -1,17 +0,0 @@
1
- import { ScheduledAction } from '../../entities/actions/scheduledAction';
2
- import { IActionState } from '../../types/actionState';
3
- import { ILogger } from '../../types/logger';
4
- import { IScheduler } from '../../types/scheduler';
5
- import { IStorageClient } from '../../types/storage';
6
- import { Seconds } from '../../types/timeValues';
7
- import { TelegramApiService } from '../telegramApi';
8
- import { BaseActionProcessor } from './baseProcessor';
9
- export declare class ScheduledActionProcessor extends BaseActionProcessor {
10
- private readonly chats;
11
- private scheduled;
12
- constructor(botName: string, chats: Record<string, number>, storage: IStorageClient, scheduler: IScheduler, logger: ILogger);
13
- initialize(api: TelegramApiService, scheduled: ScheduledAction<IActionState>[], period: Seconds): void;
14
- private runScheduled;
15
- private initializeChatContext;
16
- }
17
- //# sourceMappingURL=scheduledActionProcessor.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"scheduledActionProcessor.d.ts","sourceRoot":"","sources":["../../../services/actionProcessors/scheduledActionProcessor.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,wCAAwC,CAAC;AAIzE,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,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,OAAO,EAAgB,MAAM,wBAAwB,CAAC;AAE/D,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAEtD,qBAAa,wBAAyB,SAAQ,mBAAmB;IAC7D,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAyB;IAE/C,OAAO,CAAC,SAAS,CAAmC;gBAGhD,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC7B,OAAO,EAAE,cAAc,EACvB,SAAS,EAAE,UAAU,EACrB,MAAM,EAAE,OAAO;IAMnB,UAAU,CACN,GAAG,EAAE,kBAAkB,EACvB,SAAS,EAAE,eAAe,CAAC,YAAY,CAAC,EAAE,EAC1C,MAAM,EAAE,OAAO;YAgDL,YAAY;IA0B1B,OAAO,CAAC,qBAAqB;CAmBhC"}
@@ -1,56 +0,0 @@
1
- import moment from 'moment';
2
- import { ChatInfo } from '../../dtos/chatInfo';
3
- import { ChatContextInternal } from '../../entities/context/chatContext';
4
- import { secondsToMilliseconds } from '../../helpers/timeConvertions';
5
- import { createTrace } from '../../helpers/traceFactory';
6
- import { BaseActionProcessor } from './baseProcessor';
7
- export class ScheduledActionProcessor extends BaseActionProcessor {
8
- chats;
9
- scheduled;
10
- constructor(botName, chats, storage, scheduler, logger) {
11
- super(botName, storage, scheduler, logger);
12
- this.chats = chats;
13
- }
14
- initialize(api, scheduled, period) {
15
- this.initializeDependencies(api);
16
- this.scheduled = scheduled;
17
- if (this.scheduled.length > 0) {
18
- const now = moment();
19
- if (now.minute() == 0 && now.second() == 0) {
20
- this.scheduler.createTask('ScheduledProcessing', async () => {
21
- await this.runScheduled();
22
- }, secondsToMilliseconds(period), true, this.botName);
23
- return;
24
- }
25
- let nextExecutionTime = now.clone().startOf('hour');
26
- if (now.minute() > 0 || now.second() > 0) {
27
- nextExecutionTime = nextExecutionTime.add(1, 'hour');
28
- }
29
- const delay = nextExecutionTime.diff(now);
30
- this.scheduler.createOnetimeTask('ScheduledProcessing_OneTime', () => {
31
- this.scheduler.createTask('ScheduledProcessing', () => {
32
- void this.runScheduled();
33
- }, secondsToMilliseconds(period), true, this.botName);
34
- }, delay, this.botName);
35
- }
36
- }
37
- async runScheduled() {
38
- const ctx = new ChatContextInternal(this.storage, this.scheduler);
39
- for (const [chatName, chatId] of Object.entries(this.chats)) {
40
- for (const scheduledAction of this.scheduled) {
41
- this.initializeChatContext(ctx, scheduledAction, new ChatInfo(chatId, chatName, []), createTrace(scheduledAction, this.botName, `${scheduledAction.key}-${chatId}`));
42
- await this.executeAction(scheduledAction, ctx);
43
- }
44
- }
45
- this.api.flushResponses();
46
- }
47
- initializeChatContext(ctx, action, chatInfo, traceId) {
48
- ctx.responses = [];
49
- ctx.isInitialized = true;
50
- ctx.botName = this.botName;
51
- ctx.action = action;
52
- ctx.chatInfo = chatInfo;
53
- ctx.traceId = traceId;
54
- ctx.logger = this.logger.createScope(this.botName, traceId, chatInfo.name);
55
- }
56
- }
@@ -1,23 +0,0 @@
1
- import { IStorageClient } from '../types/storage';
2
- import { IActionState } from '../types/actionState';
3
- import { IActionWithState, ActionKey } from '../types/action';
4
- export declare class JsonFileStorage implements IStorageClient {
5
- private readonly filePaths;
6
- private readonly locks;
7
- private readonly cache;
8
- private readonly storagePath;
9
- private readonly botName;
10
- constructor(botName: string, actions: IActionWithState<IActionState>[], path?: string);
11
- private backfillEmptyActionStates;
12
- private lock;
13
- private tryGetFromCache;
14
- private loadFromFile;
15
- private updateCacheAndSaveToFile;
16
- load<TActionState extends IActionState>(key: ActionKey): Promise<Record<number, TActionState | undefined>>;
17
- saveMetadata(actions: IActionWithState<IActionState>[]): Promise<void>;
18
- getActionState<TActionState extends IActionState>(action: IActionWithState<TActionState>, chatId: number): Promise<TActionState | (TActionState & undefined)>;
19
- saveActionExecutionResult<TActionState extends IActionState>(action: IActionWithState<TActionState>, chatId: number, state: TActionState): Promise<void>;
20
- close(): Promise<void>;
21
- updateStateFor<TActionState extends IActionState>(action: IActionWithState<TActionState>, chatId: number, update: (state: TActionState) => Promise<void> | void): Promise<void>;
22
- }
23
- //# sourceMappingURL=jsonFileStorage.d.ts.map
@@ -1 +0,0 @@
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"}
@@ -1,109 +0,0 @@
1
- import { existsSync, mkdirSync } from 'fs';
2
- import { readFile, writeFile } from 'fs/promises';
3
- import { Sema as Semaphore } from 'async-sema';
4
- import { getOrSetIfNotExists } from '../helpers/mapUtils';
5
- function buildPath(storagePath, botName, actionKey) {
6
- return `${storagePath}/${botName}/${actionKey.replaceAll(':', '/')}.json`;
7
- }
8
- export class JsonFileStorage {
9
- filePaths = new Map();
10
- locks = new Map();
11
- cache;
12
- storagePath;
13
- botName;
14
- constructor(botName, actions, path) {
15
- this.cache = new Map();
16
- this.botName = botName;
17
- this.storagePath = path ?? 'storage';
18
- if (!existsSync(`${this.storagePath}/${this.botName}/`)) {
19
- mkdirSync(`${this.storagePath}/${this.botName}/`, {
20
- recursive: true
21
- });
22
- }
23
- for (const action of actions) {
24
- this.locks.set(action.key, new Semaphore(1));
25
- this.filePaths.set(action.key, buildPath(this.storagePath, this.botName, action.key));
26
- }
27
- }
28
- backfillEmptyActionStates(action, data) {
29
- for (const [stringKey, value] of Object.entries(data)) {
30
- if (value)
31
- continue;
32
- data[Number.parseInt(stringKey)] = action.stateConstructor();
33
- }
34
- return true;
35
- }
36
- async lock(key, action) {
37
- const lock = getOrSetIfNotExists(this.locks, key, new Semaphore(1));
38
- await lock.acquire();
39
- try {
40
- return await action();
41
- }
42
- finally {
43
- lock.release();
44
- }
45
- }
46
- tryGetFromCache(key) {
47
- return this.cache.get(key);
48
- }
49
- async loadFromFile(key) {
50
- const targetPath = getOrSetIfNotExists(this.filePaths, key, buildPath(this.storagePath, this.botName, key));
51
- const fileContent = await readFile(targetPath, {
52
- encoding: 'utf-8',
53
- flag: 'a+'
54
- });
55
- if (fileContent) {
56
- const data = JSON.parse(fileContent);
57
- this.cache.set(key, data);
58
- }
59
- return (this.cache.get(key) ?? {});
60
- }
61
- async updateCacheAndSaveToFile(data, key) {
62
- this.cache.set(key, data);
63
- const targetPath = getOrSetIfNotExists(this.filePaths, key, buildPath(this.storagePath, this.botName, key));
64
- await writeFile(targetPath, JSON.stringify(data), { flag: 'w+' });
65
- }
66
- async load(key) {
67
- return (this.tryGetFromCache(key) ??
68
- (await this.lock(key, async () => {
69
- return await this.loadFromFile(key);
70
- })));
71
- }
72
- async saveMetadata(actions) {
73
- const targetPath = `${this.storagePath}/${this.botName}/Metadata-${this.botName}.json`;
74
- await writeFile(targetPath, JSON.stringify(actions), {
75
- flag: 'w+'
76
- });
77
- }
78
- async getActionState(action, chatId) {
79
- const value = this.tryGetFromCache(action.key) ??
80
- (await this.lock(action.key, async () => {
81
- return await this.loadFromFile(action.key);
82
- }));
83
- return Object.assign(action.stateConstructor(), value[chatId]);
84
- }
85
- async saveActionExecutionResult(action, chatId, state) {
86
- await this.lock(action.key, async () => {
87
- const data = this.tryGetFromCache(action.key) ??
88
- (await this.loadFromFile(action.key));
89
- data[chatId] = state;
90
- if (this.backfillEmptyActionStates(action, data))
91
- await this.updateCacheAndSaveToFile(data, action.key);
92
- });
93
- }
94
- async close() {
95
- for (const lock of this.locks.values()) {
96
- await lock.acquire();
97
- }
98
- }
99
- async updateStateFor(action, chatId, update) {
100
- await this.lock(action.key, async () => {
101
- const data = this.tryGetFromCache(action.key) ??
102
- (await this.loadFromFile(action.key));
103
- const state = Object.assign(action.stateConstructor(), data[chatId]);
104
- await update(state);
105
- if (this.backfillEmptyActionStates(action, data))
106
- await this.updateCacheAndSaveToFile(data, action.key);
107
- });
108
- }
109
- }
@@ -1,11 +0,0 @@
1
- import { ILogger, IScopedLogger } from '../types/logger';
2
- import { TraceId } from '../types/trace';
3
- export declare class JsonLogger implements ILogger {
4
- private serializeError;
5
- private getCircularReplacer;
6
- createScope(botName: string, traceId: TraceId, chatName: string): IScopedLogger;
7
- logObjectWithTraceId(botName: string, traceId: TraceId, chatName: string, data: unknown): void;
8
- logWithTraceId(botName: string, traceId: TraceId, chatName: string, text: string): void;
9
- errorWithTraceId(botName: string, traceId: TraceId, chatName: string, errorObj: unknown, extraData?: unknown): void;
10
- }
11
- //# sourceMappingURL=jsonLogger.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"jsonLogger.d.ts","sourceRoot":"","sources":["../../services/jsonLogger.ts"],"names":[],"mappings":"AAAA,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;IAkBtB,OAAO,CAAC,mBAAmB;IAc3B,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,OAAO;IAoBjB,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;CAe1B"}