chz-telegram-bot 0.0.26 → 0.0.28

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 (60) hide show
  1. package/dist/entities/actions/commandAction.d.ts +2 -2
  2. package/dist/entities/actions/commandAction.d.ts.map +1 -1
  3. package/dist/entities/actions/scheduledAction.d.ts +2 -2
  4. package/dist/entities/actions/scheduledAction.d.ts.map +1 -1
  5. package/dist/entities/actions/scheduledAction.js +1 -1
  6. package/dist/entities/botInstance.d.ts.map +1 -1
  7. package/dist/entities/botInstance.js +3 -2
  8. package/dist/entities/context/chatContext.d.ts +3 -2
  9. package/dist/entities/context/chatContext.d.ts.map +1 -1
  10. package/dist/entities/context/chatContext.js +6 -6
  11. package/dist/entities/context/messageContext.d.ts +2 -1
  12. package/dist/entities/context/messageContext.d.ts.map +1 -1
  13. package/dist/entities/context/messageContext.js +6 -6
  14. package/dist/entities/responses/imageMessage.d.ts +3 -2
  15. package/dist/entities/responses/imageMessage.d.ts.map +1 -1
  16. package/dist/entities/responses/imageMessage.js +2 -2
  17. package/dist/entities/responses/reaction.d.ts +3 -2
  18. package/dist/entities/responses/reaction.d.ts.map +1 -1
  19. package/dist/entities/responses/reaction.js +2 -2
  20. package/dist/entities/responses/textMessage.d.ts +3 -2
  21. package/dist/entities/responses/textMessage.d.ts.map +1 -1
  22. package/dist/entities/responses/textMessage.js +2 -2
  23. package/dist/entities/responses/unpin.d.ts +3 -2
  24. package/dist/entities/responses/unpin.d.ts.map +1 -1
  25. package/dist/entities/responses/unpin.js +2 -2
  26. package/dist/entities/responses/videoMessage.d.ts +3 -2
  27. package/dist/entities/responses/videoMessage.d.ts.map +1 -1
  28. package/dist/entities/responses/videoMessage.js +2 -2
  29. package/dist/helpers/inverseRecord.d.ts +2 -0
  30. package/dist/helpers/inverseRecord.d.ts.map +1 -0
  31. package/dist/helpers/inverseRecord.js +6 -0
  32. package/dist/services/jsonFileStorage.d.ts +6 -7
  33. package/dist/services/jsonFileStorage.d.ts.map +1 -1
  34. package/dist/services/jsonFileStorage.js +29 -23
  35. package/dist/services/telegramApi.d.ts +1 -1
  36. package/dist/services/telegramApi.d.ts.map +1 -1
  37. package/dist/services/telegramApi.js +11 -13
  38. package/dist/types/actionWithState.d.ts +4 -1
  39. package/dist/types/actionWithState.d.ts.map +1 -1
  40. package/dist/types/response.d.ts +2 -1
  41. package/dist/types/response.d.ts.map +1 -1
  42. package/dist/types/storage.d.ts +4 -4
  43. package/dist/types/storage.d.ts.map +1 -1
  44. package/entities/actions/commandAction.ts +3 -3
  45. package/entities/actions/scheduledAction.ts +4 -4
  46. package/entities/botInstance.ts +4 -5
  47. package/entities/context/chatContext.ts +8 -12
  48. package/entities/context/messageContext.ts +11 -7
  49. package/entities/responses/imageMessage.ts +4 -3
  50. package/entities/responses/reaction.ts +4 -3
  51. package/entities/responses/textMessage.ts +4 -3
  52. package/entities/responses/unpin.ts +4 -3
  53. package/entities/responses/videoMessage.ts +4 -3
  54. package/helpers/{reverseRecord.ts → inverseRecord.ts} +1 -1
  55. package/package.json +1 -1
  56. package/services/jsonFileStorage.ts +41 -27
  57. package/services/telegramApi.ts +19 -20
  58. package/types/actionWithState.ts +3 -1
  59. package/types/response.ts +3 -1
  60. package/types/storage.ts +4 -4
@@ -2,7 +2,7 @@ import { CommandHandler } from '../../types/handlers';
2
2
  import { CommandCondition } from '../../types/commandCondition';
3
3
  import { Seconds } from '../../types/timeValues';
4
4
  import { IActionState } from '../../types/actionState';
5
- import { IActionWithState } from '../../types/actionWithState';
5
+ import { IActionWithState, ActionKey } from '../../types/actionWithState';
6
6
  import { MessageContext } from '../context/messageContext';
7
7
  export declare class CommandAction<TActionState extends IActionState> implements IActionWithState {
8
8
  triggers: (string | RegExp)[];
@@ -14,7 +14,7 @@ export declare class CommandAction<TActionState extends IActionState> implements
14
14
  allowedUsers: number[];
15
15
  condition: CommandCondition<TActionState>;
16
16
  stateConstructor: () => TActionState;
17
- key: string;
17
+ key: ActionKey;
18
18
  constructor(trigger: string | RegExp | string[] | RegExp[], handler: CommandHandler<TActionState>, name: string, active: boolean, cooldown: Seconds, chatsBlacklist: number[], allowedUsers: number[], condition: CommandCondition<TActionState>, stateConstructor: () => TActionState);
19
19
  exec(ctx: MessageContext<TActionState>): Promise<void>;
20
20
  private checkTrigger;
@@ -1 +1 @@
1
- {"version":3,"file":"commandAction.d.ts","sourceRoot":"","sources":["../../../entities/actions/commandAction.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAGjD,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAE/D,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAI3D,qBAAa,aAAa,CAAC,YAAY,SAAS,YAAY,CACxD,YAAW,gBAAgB;IAE3B,QAAQ,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAAC;IAC9B,OAAO,EAAE,cAAc,CAAC,YAAY,CAAC,CAAC;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,iBAAiB,EAAE,OAAO,CAAC;IAC3B,MAAM,EAAE,OAAO,CAAC;IAChB,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,SAAS,EAAE,gBAAgB,CAAC,YAAY,CAAC,CAAC;IAC1C,gBAAgB,EAAE,MAAM,YAAY,CAAC;IACrC,GAAG,EAAE,MAAM,CAAC;gBAGR,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,EAAE,GAAG,MAAM,EAAE,EAC9C,OAAO,EAAE,cAAc,CAAC,YAAY,CAAC,EACrC,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,OAAO,EACf,QAAQ,EAAE,OAAO,EACjB,cAAc,EAAE,MAAM,EAAE,EACxB,YAAY,EAAE,MAAM,EAAE,EACtB,SAAS,EAAE,gBAAgB,CAAC,YAAY,CAAC,EACzC,gBAAgB,EAAE,MAAM,YAAY;IAelC,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,YAAY,CAAC;IAgD5C,OAAO,CAAC,YAAY;CAkDvB"}
1
+ {"version":3,"file":"commandAction.d.ts","sourceRoot":"","sources":["../../../entities/actions/commandAction.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAGjD,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AAE1E,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAI3D,qBAAa,aAAa,CAAC,YAAY,SAAS,YAAY,CACxD,YAAW,gBAAgB;IAE3B,QAAQ,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAAC;IAC9B,OAAO,EAAE,cAAc,CAAC,YAAY,CAAC,CAAC;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,iBAAiB,EAAE,OAAO,CAAC;IAC3B,MAAM,EAAE,OAAO,CAAC;IAChB,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,SAAS,EAAE,gBAAgB,CAAC,YAAY,CAAC,CAAC;IAC1C,gBAAgB,EAAE,MAAM,YAAY,CAAC;IACrC,GAAG,EAAE,SAAS,CAAC;gBAGX,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,EAAE,GAAG,MAAM,EAAE,EAC9C,OAAO,EAAE,cAAc,CAAC,YAAY,CAAC,EACrC,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,OAAO,EACf,QAAQ,EAAE,OAAO,EACjB,cAAc,EAAE,MAAM,EAAE,EACxB,YAAY,EAAE,MAAM,EAAE,EACtB,SAAS,EAAE,gBAAgB,CAAC,YAAY,CAAC,EACzC,gBAAgB,EAAE,MAAM,YAAY;IAelC,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,YAAY,CAAC;IAgD5C,OAAO,CAAC,YAAY;CAkDvB"}
@@ -2,7 +2,7 @@ import { Sema as Semaphore } from 'async-sema';
2
2
  import { ScheduledHandler } from '../../types/handlers';
3
3
  import { HoursOfDay } from '../../types/timeValues';
4
4
  import { IActionState } from '../../types/actionState';
5
- import { IActionWithState } from '../../types/actionWithState';
5
+ import { IActionWithState, ActionKey } from '../../types/actionWithState';
6
6
  import { CachedStateFactory } from '../cachedStateFactory';
7
7
  import { ChatContext } from '../context/chatContext';
8
8
  export declare class ScheduledAction<TActionState extends IActionState> implements IActionWithState {
@@ -11,7 +11,7 @@ export declare class ScheduledAction<TActionState extends IActionState> implemen
11
11
  timeinHours: HoursOfDay;
12
12
  active: boolean;
13
13
  chatsWhitelist: number[];
14
- key: string;
14
+ key: ActionKey;
15
15
  cachedState: Map<string, unknown>;
16
16
  stateConstructor: () => TActionState;
17
17
  cachedStateFactories: Map<string, CachedStateFactory>;
@@ -1 +1 @@
1
- {"version":3,"file":"scheduledAction.d.ts","sourceRoot":"","sources":["../../../entities/actions/scheduledAction.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,IAAI,SAAS,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAExD,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAKrD,qBAAa,eAAe,CAAC,YAAY,SAAS,YAAY,CAC1D,YAAW,gBAAgB;IAE3B,MAAM,CAAC,SAAS,YAAoB;IAEpC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,UAAU,CAAC;IACxB,MAAM,EAAE,OAAO,CAAC;IAChB,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,GAAG,EAAE,MAAM,CAAC;IAEZ,WAAW,uBAA8B;IACzC,gBAAgB,EAAE,MAAM,YAAY,CAAC;IACrC,oBAAoB,EAAE,GAAG,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;IACtD,OAAO,EAAE,gBAAgB,CAAC,YAAY,CAAC,CAAC;gBAGpC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,gBAAgB,CAAC,YAAY,CAAC,EACvC,WAAW,EAAE,UAAU,EACvB,MAAM,EAAE,OAAO,EACf,SAAS,EAAE,MAAM,EAAE,EACnB,oBAAoB,EAAE,GAAG,CAAC,MAAM,EAAE,kBAAkB,CAAC,EACrD,gBAAgB,EAAE,MAAM,YAAY;IAYlC,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,YAAY,CAAC;YAmC3B,cAAc;IAqC5B,OAAO,CAAC,aAAa;CASxB"}
1
+ {"version":3,"file":"scheduledAction.d.ts","sourceRoot":"","sources":["../../../entities/actions/scheduledAction.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,IAAI,SAAS,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAExD,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AAC1E,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAKrD,qBAAa,eAAe,CAAC,YAAY,SAAS,YAAY,CAC1D,YAAW,gBAAgB;IAE3B,MAAM,CAAC,SAAS,YAAoB;IAEpC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,UAAU,CAAC;IACxB,MAAM,EAAE,OAAO,CAAC;IAChB,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,GAAG,EAAE,SAAS,CAAC;IAEf,WAAW,uBAA8B;IACzC,gBAAgB,EAAE,MAAM,YAAY,CAAC;IACrC,oBAAoB,EAAE,GAAG,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;IACtD,OAAO,EAAE,gBAAgB,CAAC,YAAY,CAAC,CAAC;gBAGpC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,gBAAgB,CAAC,YAAY,CAAC,EACvC,WAAW,EAAE,UAAU,EACvB,MAAM,EAAE,OAAO,EACf,SAAS,EAAE,MAAM,EAAE,EACnB,oBAAoB,EAAE,GAAG,CAAC,MAAM,EAAE,kBAAkB,CAAC,EACrD,gBAAgB,EAAE,MAAM,YAAY;IAYlC,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,YAAY,CAAC;YAmC3B,cAAc;IAqC5B,OAAO,CAAC,aAAa;CASxB"}
@@ -56,7 +56,7 @@ class ScheduledAction {
56
56
  }
57
57
  shouldTrigger(state) {
58
58
  const today = (0, moment_1.default)().startOf('day').valueOf();
59
- const isAllowedToTrigger = (0, moment_1.default)().hour().valueOf() >= this.timeinHours;
59
+ const isAllowedToTrigger = (0, moment_1.default)().add(1, 'minute').hour().valueOf() >= this.timeinHours;
60
60
  const hasTriggeredToday = state.lastExecutedDate >= today;
61
61
  return isAllowedToTrigger && !hasTriggeredToday;
62
62
  }
@@ -1 +1 @@
1
- {"version":3,"file":"botInstance.d.ts","sourceRoot":"","sources":["../../entities/botInstance.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAGlD,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAM5D,qBAAa,WAAW;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,GAAG,CAAqB;IAChC,OAAO,CAAC,QAAQ,CAAW;IAC3B,OAAO,CAAC,QAAQ,CAAgC;IAChD,OAAO,CAAC,SAAS,CAAkC;IACnD,OAAO,CAAC,KAAK,CAAyB;IACtC,OAAO,EAAE,cAAc,CAAC;gBAEZ,OAAO,EAAE;QACjB,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;QACd,QAAQ,EAAE,aAAa,CAAC,YAAY,CAAC,EAAE,CAAC;QACxC,SAAS,EAAE,eAAe,CAAC,YAAY,CAAC,EAAE,CAAC;QAC3C,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAC9B,aAAa,CAAC,EAAE,cAAc,CAAC;QAC/B,WAAW,CAAC,EAAE,MAAM,CAAC;KACxB;IAkCD,OAAO,CAAC,6BAA6B;IA6CrC,OAAO,CAAC,2BAA2B;IAsB7B,IAAI,CAAC,IAAI,EAAE,MAAM;YAYT,YAAY;YAyBZ,cAAc;CAmB/B"}
1
+ {"version":3,"file":"botInstance.d.ts","sourceRoot":"","sources":["../../entities/botInstance.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAGlD,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAM5D,qBAAa,WAAW;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,GAAG,CAAqB;IAChC,OAAO,CAAC,QAAQ,CAAW;IAC3B,OAAO,CAAC,QAAQ,CAAgC;IAChD,OAAO,CAAC,SAAS,CAAkC;IACnD,OAAO,CAAC,KAAK,CAAyB;IACtC,OAAO,EAAE,cAAc,CAAC;gBAEZ,OAAO,EAAE;QACjB,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;QACd,QAAQ,EAAE,aAAa,CAAC,YAAY,CAAC,EAAE,CAAC;QACxC,SAAS,EAAE,eAAe,CAAC,YAAY,CAAC,EAAE,CAAC;QAC3C,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAC9B,aAAa,CAAC,EAAE,cAAc,CAAC;QAC/B,WAAW,CAAC,EAAE,MAAM,CAAC;KACxB;IAiCD,OAAO,CAAC,6BAA6B;IA6CrC,OAAO,CAAC,2BAA2B;IAsB7B,IAAI,CAAC,IAAI,EAAE,MAAM;YAYT,YAAY;YAyBZ,cAAc;CAmB/B"}
@@ -18,15 +18,16 @@ class BotInstance {
18
18
  this.commands = options.commands;
19
19
  this.scheduled = options.scheduled;
20
20
  this.chats = options.chats;
21
+ const actions = [...this.commands, ...this.scheduled];
21
22
  logger_1.Logger.logWithTraceId(this.name, `System:Bot-${this.name}-Start`, 'System', 'Starting bot...');
22
23
  this.telegraf = new telegraf_1.Telegraf(options.token);
23
24
  this.storage =
24
25
  options.storageClient ??
25
- new jsonFileStorage_1.JsonFileStorage(options.name, options.storagePath);
26
+ new jsonFileStorage_1.JsonFileStorage(options.name, actions, options.storagePath);
26
27
  this.api = new telegramApi_1.TelegramApiService(this.name, this.telegraf.telegram, this.storage, this.chats);
27
28
  this.initializeMessageProcessing();
28
29
  this.initializeScheduledProcessing();
29
- this.storage.saveMetadata([...this.commands, ...this.scheduled], this.name);
30
+ this.storage.saveMetadata(actions, this.name);
30
31
  this.telegraf.launch();
31
32
  }
32
33
  initializeScheduledProcessing() {
@@ -1,11 +1,12 @@
1
1
  import { IBotApiInteractions } from '../../services/telegramApi';
2
2
  import { IStorageClient } from '../../types/storage';
3
3
  import { MessageSendingOptions, TextMessageSendingOptions } from '../../types/messageSendingOptions';
4
+ import { IActionWithState } from '../../types/actionWithState';
4
5
  /**
5
6
  * Context of action executed in chat.
6
7
  */
7
8
  export declare class ChatContext<TActionState> {
8
- protected actionKey: string;
9
+ protected action: IActionWithState;
9
10
  protected interactions: IBotApiInteractions;
10
11
  updateActions: Array<(state: TActionState) => void>;
11
12
  /** Trace id of a action execution. */
@@ -18,7 +19,7 @@ export declare class ChatContext<TActionState> {
18
19
  chatName: string;
19
20
  /** Storage client instance for this bot. */
20
21
  storage: IStorageClient;
21
- constructor(botName: string, actionKey: string, interactions: IBotApiInteractions, chatId: number, chatName: string, traceId: number | string, storage: IStorageClient);
22
+ constructor(botName: string, action: IActionWithState, interactions: IBotApiInteractions, chatId: number, chatName: string, traceId: number | string, storage: IStorageClient);
22
23
  /**
23
24
  * Manually update the state of an action.
24
25
  * @param stateUpdateAction Function that will modify state.
@@ -1 +1 @@
1
- {"version":3,"file":"chatContext.d.ts","sourceRoot":"","sources":["../../../entities/context/chatContext.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAKrD,OAAO,EACH,qBAAqB,EACrB,yBAAyB,EAC5B,MAAM,mCAAmC,CAAC;AAE3C;;GAEG;AACH,qBAAa,WAAW,CAAC,YAAY;IACjC,SAAS,CAAC,SAAS,EAAE,MAAM,CAAC;IAC5B,SAAS,CAAC,YAAY,EAAE,mBAAmB,CAAC;IAC5C,aAAa,EAAE,KAAK,CAAC,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,CAAC,CAAM;IACzD,sCAAsC;IACtC,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC;IACzB,+CAA+C;IAC/C,OAAO,EAAE,MAAM,CAAC;IAChB,+CAA+C;IAC/C,MAAM,EAAE,MAAM,CAAC;IACf,iDAAiD;IACjD,QAAQ,EAAE,MAAM,CAAC;IACjB,4CAA4C;IAC5C,OAAO,EAAE,cAAc,CAAC;gBAGpB,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,mBAAmB,EACjC,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,GAAG,MAAM,EACxB,OAAO,EAAE,cAAc;IAW3B;;;OAGG;IACH,WAAW,CAAC,iBAAiB,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI;IAI5D;;;;OAIG;IACH,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,yBAAyB;IAahE;;;;OAIG;IACH,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,qBAAqB;IAc7D;;;;OAIG;IACH,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,qBAAqB;IAc7D;;;OAGG;IACH,YAAY,CAAC,SAAS,EAAE,MAAM;CAUjC"}
1
+ {"version":3,"file":"chatContext.d.ts","sourceRoot":"","sources":["../../../entities/context/chatContext.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,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;AAE/D;;GAEG;AACH,qBAAa,WAAW,CAAC,YAAY;IACjC,SAAS,CAAC,MAAM,EAAE,gBAAgB,CAAC;IACnC,SAAS,CAAC,YAAY,EAAE,mBAAmB,CAAC;IAC5C,aAAa,EAAE,KAAK,CAAC,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,CAAC,CAAM;IACzD,sCAAsC;IACtC,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC;IACzB,+CAA+C;IAC/C,OAAO,EAAE,MAAM,CAAC;IAChB,+CAA+C;IAC/C,MAAM,EAAE,MAAM,CAAC;IACf,iDAAiD;IACjD,QAAQ,EAAE,MAAM,CAAC;IACjB,4CAA4C;IAC5C,OAAO,EAAE,cAAc,CAAC;gBAGpB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,gBAAgB,EACxB,YAAY,EAAE,mBAAmB,EACjC,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,GAAG,MAAM,EACxB,OAAO,EAAE,cAAc;IAW3B;;;OAGG;IACH,WAAW,CAAC,iBAAiB,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI;IAI5D;;;;OAIG;IACH,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,yBAAyB;IAahE;;;;OAIG;IACH,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,qBAAqB;IAc7D;;;;OAIG;IACH,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,qBAAqB;IAc7D;;;OAGG;IACH,YAAY,CAAC,SAAS,EAAE,MAAM;CAKjC"}
@@ -10,10 +10,10 @@ const unpin_1 = require("../responses/unpin");
10
10
  * Context of action executed in chat.
11
11
  */
12
12
  class ChatContext {
13
- constructor(botName, actionKey, interactions, chatId, chatName, traceId, storage) {
13
+ constructor(botName, action, interactions, chatId, chatName, traceId, storage) {
14
14
  this.updateActions = [];
15
15
  this.botName = botName;
16
- this.actionKey = actionKey;
16
+ this.action = action;
17
17
  this.interactions = interactions;
18
18
  this.chatId = chatId;
19
19
  this.chatName = chatName;
@@ -33,7 +33,7 @@ class ChatContext {
33
33
  * @param options Message sending option.
34
34
  */
35
35
  sendTextToChat(text, options) {
36
- this.interactions.respond(new textMessage_1.TextMessage(text, this.chatId, undefined, this.traceId, this.actionKey, options));
36
+ this.interactions.respond(new textMessage_1.TextMessage(text, this.chatId, undefined, this.traceId, this.action, options));
37
37
  }
38
38
  /**
39
39
  * Sends image message to chat.
@@ -42,7 +42,7 @@ class ChatContext {
42
42
  */
43
43
  sendImageToChat(name, options) {
44
44
  const filePath = `./content/${name}.png`;
45
- this.interactions.respond(new imageMessage_1.ImageMessage({ source: (0, path_1.resolve)(filePath) }, this.chatId, undefined, this.traceId, this.actionKey, options));
45
+ this.interactions.respond(new imageMessage_1.ImageMessage({ source: (0, path_1.resolve)(filePath) }, this.chatId, undefined, this.traceId, this.action, options));
46
46
  }
47
47
  /**
48
48
  * Sends video/gif message to chat.
@@ -51,14 +51,14 @@ class ChatContext {
51
51
  */
52
52
  sendVideoToChat(name, options) {
53
53
  const filePath = `./content/${name}.mp4`;
54
- this.interactions.respond(new videoMessage_1.VideoMessage({ source: (0, path_1.resolve)(filePath) }, this.chatId, undefined, this.traceId, this.actionKey, options));
54
+ this.interactions.respond(new videoMessage_1.VideoMessage({ source: (0, path_1.resolve)(filePath) }, this.chatId, undefined, this.traceId, this.action, options));
55
55
  }
56
56
  /**
57
57
  * Unpins message.
58
58
  * @param messageId Message id.
59
59
  */
60
60
  unpinMessage(messageId) {
61
- this.interactions.unpin(new unpin_1.UnpinResponse(messageId, this.chatId, this.traceId, this.actionKey));
61
+ this.interactions.unpin(new unpin_1.UnpinResponse(messageId, this.chatId, this.traceId, this.action));
62
62
  }
63
63
  }
64
64
  exports.ChatContext = ChatContext;
@@ -5,6 +5,7 @@ import { IActionState } from '../../types/actionState';
5
5
  import { ChatContext } from './chatContext';
6
6
  import { IncomingMessage } from '../incomingMessage';
7
7
  import { MessageSendingOptions, TextMessageSendingOptions } from '../../types/messageSendingOptions';
8
+ import { IActionWithState } from '../../types/actionWithState';
8
9
  /**
9
10
  * Context of action executed in chat, in response to a message
10
11
  */
@@ -21,7 +22,7 @@ export declare class MessageContext<TActionState extends IActionState> extends C
21
22
  startCooldown: boolean;
22
23
  /** Name of a user that sent a message that triggered this action. */
23
24
  fromUserName: string;
24
- constructor(botName: string, scheduledKey: string, interactions: IBotApiInteractions, message: IncomingMessage, storage: IStorageClient);
25
+ constructor(botName: string, action: IActionWithState, interactions: IBotApiInteractions, message: IncomingMessage, storage: IStorageClient);
25
26
  /**
26
27
  * Loads state of another action. Changes to the loaded state will no affect actual state of other action.
27
28
  * @param commandName Name of an action to load state of.
@@ -1 +1 @@
1
- {"version":3,"file":"messageContext.d.ts","sourceRoot":"","sources":["../../../entities/context/messageContext.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAMvD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EACH,qBAAqB,EACrB,yBAAyB,EAC5B,MAAM,mCAAmC,CAAC;AAE3C;;GAEG;AACH,qBAAa,cAAc,CACvB,YAAY,SAAS,YAAY,CACnC,SAAQ,WAAW,CAAC,YAAY,CAAC;IAC/B,kDAAkD;IAClD,SAAS,EAAE,MAAM,CAAC;IAClB,oDAAoD;IACpD,WAAW,EAAE,MAAM,CAAC;IACpB,4HAA4H;IAC5H,YAAY,EAAE,gBAAgB,EAAE,CAAM;IACtC,mEAAmE;IACnE,UAAU,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,kGAAkG;IAClG,aAAa,EAAE,OAAO,CAAQ;IAC9B,qEAAqE;IACrE,YAAY,EAAE,MAAM,CAAC;gBAGjB,OAAO,EAAE,MAAM,EACf,YAAY,EAAE,MAAM,EACpB,YAAY,EAAE,mBAAmB,EACjC,OAAO,EAAE,eAAe,EACxB,OAAO,EAAE,cAAc;IAoB3B;;;;OAIG;IACG,WAAW,CAAC,mBAAmB,SAAS,YAAY,EACtD,WAAW,EAAE,MAAM,GACpB,OAAO,CAAC,mBAAmB,CAAC;IAY/B;;;;OAIG;IACH,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,yBAAyB;IAa/D;;;;OAIG;IACH,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,qBAAqB;IAc5D;;;;OAIG;IACH,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,qBAAqB;IAc5D;;;OAGG;IACH,KAAK,CAAC,KAAK,EAAE,aAAa;CAW7B"}
1
+ {"version":3,"file":"messageContext.d.ts","sourceRoot":"","sources":["../../../entities/context/messageContext.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAMvD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EACH,qBAAqB,EACrB,yBAAyB,EAC5B,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EAAE,gBAAgB,EAAa,MAAM,6BAA6B,CAAC;AAE1E;;GAEG;AACH,qBAAa,cAAc,CACvB,YAAY,SAAS,YAAY,CACnC,SAAQ,WAAW,CAAC,YAAY,CAAC;IAC/B,kDAAkD;IAClD,SAAS,EAAE,MAAM,CAAC;IAClB,oDAAoD;IACpD,WAAW,EAAE,MAAM,CAAC;IACpB,4HAA4H;IAC5H,YAAY,EAAE,gBAAgB,EAAE,CAAM;IACtC,mEAAmE;IACnE,UAAU,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,kGAAkG;IAClG,aAAa,EAAE,OAAO,CAAQ;IAC9B,qEAAqE;IACrE,YAAY,EAAE,MAAM,CAAC;gBAGjB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,gBAAgB,EACxB,YAAY,EAAE,mBAAmB,EACjC,OAAO,EAAE,eAAe,EACxB,OAAO,EAAE,cAAc;IAoB3B;;;;OAIG;IACG,WAAW,CAAC,mBAAmB,SAAS,YAAY,EACtD,WAAW,EAAE,MAAM,GACpB,OAAO,CAAC,mBAAmB,CAAC;IAe/B;;;;OAIG;IACH,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,yBAAyB;IAa/D;;;;OAIG;IACH,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,qBAAqB;IAc5D;;;;OAIG;IACH,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,qBAAqB;IAc5D;;;OAGG;IACH,KAAK,CAAC,KAAK,EAAE,aAAa;CAW7B"}
@@ -12,8 +12,8 @@ const chatContext_1 = require("./chatContext");
12
12
  * Context of action executed in chat, in response to a message
13
13
  */
14
14
  class MessageContext extends chatContext_1.ChatContext {
15
- constructor(botName, scheduledKey, interactions, message, storage) {
16
- super(botName, scheduledKey, interactions, message.chat.id, message.chatName, message.traceId, storage);
15
+ constructor(botName, action, interactions, message, storage) {
16
+ super(botName, action, interactions, message.chat.id, message.chatName, message.traceId, storage);
17
17
  /** Collection of Regexp match results on a message that triggered this action. Will be empty if trigger is not a Regexp. */
18
18
  this.matchResults = [];
19
19
  /** Indicates if cooldown should be started after action is executed. Set to `true` by default. */
@@ -45,7 +45,7 @@ class MessageContext extends chatContext_1.ChatContext {
45
45
  * @param options Message sending option.
46
46
  */
47
47
  replyWithText(text, options) {
48
- this.interactions.respond(new textMessage_1.TextMessage(text, this.chatId, this.messageId, this.traceId, this.actionKey, options));
48
+ this.interactions.respond(new textMessage_1.TextMessage(text, this.chatId, this.messageId, this.traceId, this.action, options));
49
49
  }
50
50
  /**
51
51
  * Reply with image message to message that triggered this action.
@@ -54,7 +54,7 @@ class MessageContext extends chatContext_1.ChatContext {
54
54
  */
55
55
  replyWithImage(name, options) {
56
56
  const filePath = `./content/${name}.png`;
57
- this.interactions.respond(new imageMessage_1.ImageMessage({ source: (0, path_1.resolve)(filePath) }, this.chatId, this.messageId, this.traceId, this.actionKey, options));
57
+ this.interactions.respond(new imageMessage_1.ImageMessage({ source: (0, path_1.resolve)(filePath) }, this.chatId, this.messageId, this.traceId, this.action, options));
58
58
  }
59
59
  /**
60
60
  * Reply with video/gif message to message that triggered this action.
@@ -63,14 +63,14 @@ class MessageContext extends chatContext_1.ChatContext {
63
63
  */
64
64
  replyWithVideo(name, options) {
65
65
  const filePath = `./content/${name}.mp4`;
66
- this.interactions.respond(new videoMessage_1.VideoMessage({ source: (0, path_1.resolve)(filePath) }, this.chatId, this.messageId, this.traceId, this.actionKey, options));
66
+ this.interactions.respond(new videoMessage_1.VideoMessage({ source: (0, path_1.resolve)(filePath) }, this.chatId, this.messageId, this.traceId, this.action, options));
67
67
  }
68
68
  /**
69
69
  * React to the message that triggered this action.
70
70
  * @param emoji Telegram emoji to react with.
71
71
  */
72
72
  react(emoji) {
73
- this.interactions.react(new reaction_1.Reaction(this.traceId, this.chatId, this.messageId, emoji, this.actionKey));
73
+ this.interactions.react(new reaction_1.Reaction(this.traceId, this.chatId, this.messageId, emoji, this.action));
74
74
  }
75
75
  }
76
76
  exports.MessageContext = MessageContext;
@@ -1,6 +1,7 @@
1
1
  import { InputFile } from 'telegraf/types';
2
2
  import { IReplyMessage } from '../../types/response';
3
3
  import { MessageSendingOptions } from '../../types/messageSendingOptions';
4
+ import { IActionWithState } from '../../types/actionWithState';
4
5
  export declare class ImageMessage implements IReplyMessage<InputFile> {
5
6
  kind: "image";
6
7
  content: InputFile;
@@ -9,7 +10,7 @@ export declare class ImageMessage implements IReplyMessage<InputFile> {
9
10
  traceId: string | number;
10
11
  disableWebPreview: boolean;
11
12
  shouldPin: boolean;
12
- sourceActionKey: string;
13
- constructor(image: InputFile, chatId: number, replyId: number | undefined, traceId: number | string, sourceActionKey: string, options?: MessageSendingOptions);
13
+ action: IActionWithState;
14
+ constructor(image: InputFile, chatId: number, replyId: number | undefined, traceId: number | string, action: IActionWithState, options?: MessageSendingOptions);
14
15
  }
15
16
  //# sourceMappingURL=imageMessage.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"imageMessage.d.ts","sourceRoot":"","sources":["../../../entities/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;AAE1E,qBAAa,YAAa,YAAW,aAAa,CAAC,SAAS,CAAC;IACzD,IAAI,UAA0B;IAE9B,OAAO,EAAE,SAAS,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC;IACzB,iBAAiB,UAAS;IAC1B,SAAS,EAAE,OAAO,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;gBAGpB,KAAK,EAAE,SAAS,EAChB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,GAAG,SAAS,EAC3B,OAAO,EAAE,MAAM,GAAG,MAAM,EACxB,eAAe,EAAE,MAAM,EACvB,OAAO,CAAC,EAAE,qBAAqB;CAStC"}
1
+ {"version":3,"file":"imageMessage.d.ts","sourceRoot":"","sources":["../../../entities/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;AAE/D,qBAAa,YAAa,YAAW,aAAa,CAAC,SAAS,CAAC;IACzD,IAAI,UAA0B;IAE9B,OAAO,EAAE,SAAS,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC;IACzB,iBAAiB,UAAS;IAC1B,SAAS,EAAE,OAAO,CAAC;IACnB,MAAM,EAAE,gBAAgB,CAAC;gBAGrB,KAAK,EAAE,SAAS,EAChB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,GAAG,SAAS,EAC3B,OAAO,EAAE,MAAM,GAAG,MAAM,EACxB,MAAM,EAAE,gBAAgB,EACxB,OAAO,CAAC,EAAE,qBAAqB;CAStC"}
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.ImageMessage = void 0;
4
4
  const response_1 = require("../../types/response");
5
5
  class ImageMessage {
6
- constructor(image, chatId, replyId, traceId, sourceActionKey, options) {
6
+ constructor(image, chatId, replyId, traceId, action, options) {
7
7
  this.kind = response_1.BotResponseTypes.image;
8
8
  this.disableWebPreview = false;
9
9
  this.content = image;
@@ -11,7 +11,7 @@ class ImageMessage {
11
11
  this.replyId = replyId;
12
12
  this.traceId = traceId;
13
13
  this.shouldPin = options?.pin ?? false;
14
- this.sourceActionKey = sourceActionKey;
14
+ this.action = action;
15
15
  }
16
16
  }
17
17
  exports.ImageMessage = ImageMessage;
@@ -1,12 +1,13 @@
1
1
  import { TelegramEmoji } from 'telegraf/types';
2
2
  import { IChatResponse } from '../../types/response';
3
+ import { IActionWithState } from '../../types/actionWithState';
3
4
  export declare class Reaction implements IChatResponse {
4
5
  kind: "react";
5
6
  chatId: number;
6
7
  messageId: number;
7
8
  traceId: number | string;
8
9
  emoji: TelegramEmoji;
9
- sourceActionKey: string;
10
- constructor(traceId: number | string, chatId: number, messageId: number, emoji: TelegramEmoji, sourceActionKey: string);
10
+ action: IActionWithState;
11
+ constructor(traceId: number | string, chatId: number, messageId: number, emoji: TelegramEmoji, action: IActionWithState);
11
12
  }
12
13
  //# sourceMappingURL=reaction.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"reaction.d.ts","sourceRoot":"","sources":["../../../entities/responses/reaction.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAoB,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAEvE,qBAAa,QAAS,YAAW,aAAa;IAC1C,IAAI,UAA0B;IAE9B,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC;IACzB,KAAK,EAAE,aAAa,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;gBAGpB,OAAO,EAAE,MAAM,GAAG,MAAM,EACxB,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,aAAa,EACpB,eAAe,EAAE,MAAM;CAQ9B"}
1
+ {"version":3,"file":"reaction.d.ts","sourceRoot":"","sources":["../../../entities/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;AAE/D,qBAAa,QAAS,YAAW,aAAa;IAC1C,IAAI,UAA0B;IAE9B,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC;IACzB,KAAK,EAAE,aAAa,CAAC;IACrB,MAAM,EAAE,gBAAgB,CAAC;gBAGrB,OAAO,EAAE,MAAM,GAAG,MAAM,EACxB,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,aAAa,EACpB,MAAM,EAAE,gBAAgB;CAQ/B"}
@@ -3,13 +3,13 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.Reaction = void 0;
4
4
  const response_1 = require("../../types/response");
5
5
  class Reaction {
6
- constructor(traceId, chatId, messageId, emoji, sourceActionKey) {
6
+ constructor(traceId, chatId, messageId, emoji, action) {
7
7
  this.kind = response_1.BotResponseTypes.react;
8
8
  this.chatId = chatId;
9
9
  this.messageId = messageId;
10
10
  this.emoji = emoji;
11
11
  this.traceId = traceId;
12
- this.sourceActionKey = sourceActionKey;
12
+ this.action = action;
13
13
  }
14
14
  }
15
15
  exports.Reaction = Reaction;
@@ -1,5 +1,6 @@
1
1
  import { TextMessageSendingOptions } from '../../types/messageSendingOptions';
2
2
  import { IReplyMessage } from '../../types/response';
3
+ import { IActionWithState } from '../../types/actionWithState';
3
4
  export declare class TextMessage implements IReplyMessage<string> {
4
5
  kind: "text";
5
6
  content: string;
@@ -8,7 +9,7 @@ export declare class TextMessage implements IReplyMessage<string> {
8
9
  traceId: string | number;
9
10
  disableWebPreview: boolean;
10
11
  shouldPin: boolean;
11
- sourceActionKey: string;
12
- constructor(text: string, chatId: number, replyId: number | undefined, traceId: string | number, sourceActionKey: string, options?: TextMessageSendingOptions);
12
+ action: IActionWithState;
13
+ constructor(text: string, chatId: number, replyId: number | undefined, traceId: string | number, action: IActionWithState, options?: TextMessageSendingOptions);
13
14
  }
14
15
  //# sourceMappingURL=textMessage.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"textMessage.d.ts","sourceRoot":"","sources":["../../../entities/responses/textMessage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,MAAM,mCAAmC,CAAC;AAC9E,OAAO,EAAoB,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAEvE,qBAAa,WAAY,YAAW,aAAa,CAAC,MAAM,CAAC;IACrD,IAAI,SAAyB;IAE7B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC;IACzB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,SAAS,EAAE,OAAO,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;gBAGpB,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,GAAG,SAAS,EAC3B,OAAO,EAAE,MAAM,GAAG,MAAM,EACxB,eAAe,EAAE,MAAM,EACvB,OAAO,CAAC,EAAE,yBAAyB;CAU1C"}
1
+ {"version":3,"file":"textMessage.d.ts","sourceRoot":"","sources":["../../../entities/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;AAE/D,qBAAa,WAAY,YAAW,aAAa,CAAC,MAAM,CAAC;IACrD,IAAI,SAAyB;IAE7B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC;IACzB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,SAAS,EAAE,OAAO,CAAC;IACnB,MAAM,EAAE,gBAAgB,CAAC;gBAGrB,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,GAAG,SAAS,EAC3B,OAAO,EAAE,MAAM,GAAG,MAAM,EACxB,MAAM,EAAE,gBAAgB,EACxB,OAAO,CAAC,EAAE,yBAAyB;CAU1C"}
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.TextMessage = void 0;
4
4
  const response_1 = require("../../types/response");
5
5
  class TextMessage {
6
- constructor(text, chatId, replyId, traceId, sourceActionKey, options) {
6
+ constructor(text, chatId, replyId, traceId, action, options) {
7
7
  this.kind = response_1.BotResponseTypes.text;
8
8
  this.content = text;
9
9
  this.chatId = chatId;
@@ -11,7 +11,7 @@ class TextMessage {
11
11
  this.traceId = traceId;
12
12
  this.disableWebPreview = options?.disableWebPreview ?? false;
13
13
  this.shouldPin = options?.pin ?? false;
14
- this.sourceActionKey = sourceActionKey;
14
+ this.action = action;
15
15
  }
16
16
  }
17
17
  exports.TextMessage = TextMessage;
@@ -1,10 +1,11 @@
1
1
  import { IChatResponse } from '../../types/response';
2
+ import { IActionWithState } from '../../types/actionWithState';
2
3
  export declare class UnpinResponse implements IChatResponse {
3
4
  kind: "unpin";
4
5
  messageId: number;
5
6
  chatId: number;
6
7
  traceId: number | string;
7
- sourceActionKey: string;
8
- constructor(messageId: number, chatId: number, traceId: number | string, sourceActionKey: string);
8
+ action: IActionWithState;
9
+ constructor(messageId: number, chatId: number, traceId: number | string, action: IActionWithState);
9
10
  }
10
11
  //# sourceMappingURL=unpin.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"unpin.d.ts","sourceRoot":"","sources":["../../../entities/responses/unpin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAEvE,qBAAa,aAAc,YAAW,aAAa;IAC/C,IAAI,UAA0B;IAE9B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC;IACzB,eAAe,EAAE,MAAM,CAAC;gBAGpB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,GAAG,MAAM,EACxB,eAAe,EAAE,MAAM;CAO9B"}
1
+ {"version":3,"file":"unpin.d.ts","sourceRoot":"","sources":["../../../entities/responses/unpin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACvE,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAE/D,qBAAa,aAAc,YAAW,aAAa;IAC/C,IAAI,UAA0B;IAE9B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC;IACzB,MAAM,EAAE,gBAAgB,CAAC;gBAGrB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,GAAG,MAAM,EACxB,MAAM,EAAE,gBAAgB;CAO/B"}
@@ -3,12 +3,12 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.UnpinResponse = void 0;
4
4
  const response_1 = require("../../types/response");
5
5
  class UnpinResponse {
6
- constructor(messageId, chatId, traceId, sourceActionKey) {
6
+ constructor(messageId, chatId, traceId, action) {
7
7
  this.kind = response_1.BotResponseTypes.unpin;
8
8
  this.messageId = messageId;
9
9
  this.chatId = chatId;
10
10
  this.traceId = traceId;
11
- this.sourceActionKey = sourceActionKey;
11
+ this.action = action;
12
12
  }
13
13
  }
14
14
  exports.UnpinResponse = UnpinResponse;
@@ -1,6 +1,7 @@
1
1
  import { InputFile } from 'telegraf/types';
2
2
  import { IReplyMessage } from '../../types/response';
3
3
  import { MessageSendingOptions } from '../../types/messageSendingOptions';
4
+ import { IActionWithState } from '../../types/actionWithState';
4
5
  export declare class VideoMessage implements IReplyMessage<InputFile> {
5
6
  kind: "video";
6
7
  content: InputFile;
@@ -9,7 +10,7 @@ export declare class VideoMessage implements IReplyMessage<InputFile> {
9
10
  traceId: string | number;
10
11
  disableWebPreview: boolean;
11
12
  shouldPin: boolean;
12
- sourceActionKey: string;
13
- constructor(video: InputFile, chatId: number, replyId: number | undefined, traceId: number | string, sourceActionKey: string, options?: MessageSendingOptions);
13
+ action: IActionWithState;
14
+ constructor(video: InputFile, chatId: number, replyId: number | undefined, traceId: number | string, action: IActionWithState, options?: MessageSendingOptions);
14
15
  }
15
16
  //# sourceMappingURL=videoMessage.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"videoMessage.d.ts","sourceRoot":"","sources":["../../../entities/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;AAE1E,qBAAa,YAAa,YAAW,aAAa,CAAC,SAAS,CAAC;IACzD,IAAI,UAA0B;IAE9B,OAAO,EAAE,SAAS,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC;IACzB,iBAAiB,UAAS;IAC1B,SAAS,EAAE,OAAO,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;gBAGpB,KAAK,EAAE,SAAS,EAChB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,GAAG,SAAS,EAC3B,OAAO,EAAE,MAAM,GAAG,MAAM,EACxB,eAAe,EAAE,MAAM,EACvB,OAAO,CAAC,EAAE,qBAAqB;CAStC"}
1
+ {"version":3,"file":"videoMessage.d.ts","sourceRoot":"","sources":["../../../entities/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;AAE/D,qBAAa,YAAa,YAAW,aAAa,CAAC,SAAS,CAAC;IACzD,IAAI,UAA0B;IAE9B,OAAO,EAAE,SAAS,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC;IACzB,iBAAiB,UAAS;IAC1B,SAAS,EAAE,OAAO,CAAC;IACnB,MAAM,EAAE,gBAAgB,CAAC;gBAGrB,KAAK,EAAE,SAAS,EAChB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,GAAG,SAAS,EAC3B,OAAO,EAAE,MAAM,GAAG,MAAM,EACxB,MAAM,EAAE,gBAAgB,EACxB,OAAO,CAAC,EAAE,qBAAqB;CAStC"}
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.VideoMessage = void 0;
4
4
  const response_1 = require("../../types/response");
5
5
  class VideoMessage {
6
- constructor(video, chatId, replyId, traceId, sourceActionKey, options) {
6
+ constructor(video, chatId, replyId, traceId, action, options) {
7
7
  this.kind = response_1.BotResponseTypes.video;
8
8
  this.disableWebPreview = false;
9
9
  this.content = video;
@@ -11,7 +11,7 @@ class VideoMessage {
11
11
  this.replyId = replyId;
12
12
  this.traceId = traceId;
13
13
  this.shouldPin = options?.pin ?? false;
14
- this.sourceActionKey = sourceActionKey;
14
+ this.action = action;
15
15
  }
16
16
  }
17
17
  exports.VideoMessage = VideoMessage;
@@ -0,0 +1,2 @@
1
+ export declare function inverseRecord<T extends PropertyKey, U extends PropertyKey>(input: Record<T, U>): Record<U, T>;
2
+ //# sourceMappingURL=inverseRecord.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inverseRecord.d.ts","sourceRoot":"","sources":["../../helpers/inverseRecord.ts"],"names":[],"mappings":"AAAA,wBAAgB,aAAa,CAAC,CAAC,SAAS,WAAW,EAAE,CAAC,SAAS,WAAW,EACtE,KAAK,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAId,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CACpB"}
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.inverseRecord = inverseRecord;
4
+ function inverseRecord(input) {
5
+ return Object.fromEntries(Object.entries(input).map(([key, value]) => [value, key]));
6
+ }
@@ -1,23 +1,22 @@
1
- import { Sema as Semaphore } from 'async-sema';
2
1
  import { IStorageClient } from '../types/storage';
3
2
  import { ActionExecutionResult } from '../entities/actionExecutionResult';
4
3
  import { IActionState } from '../types/actionState';
5
- import { IActionWithState } from '../types/actionWithState';
4
+ import { IActionWithState, ActionKey } from '../types/actionWithState';
6
5
  export declare class JsonFileStorage implements IStorageClient {
7
- semaphore: Semaphore;
6
+ private locks;
8
7
  private cache;
9
8
  private storagePath;
10
9
  private botName;
11
- constructor(botName: string, path?: string);
10
+ constructor(botName: string, actions: IActionWithState[], path?: string);
12
11
  private lock;
13
12
  private loadInternal;
14
13
  private save;
15
14
  private buidPathFromKey;
16
- load<TActionState extends IActionState>(key: string): Promise<Record<number, TActionState>>;
15
+ load<TActionState extends IActionState>(key: ActionKey): Promise<Record<number, TActionState>>;
17
16
  saveMetadata(actions: IActionWithState[], botName: string): Promise<void>;
18
- getActionState<TActionState extends IActionState>(entity: IActionWithState, chatId: number): Promise<TActionState>;
17
+ getActionState<TActionState extends IActionState>(action: IActionWithState, chatId: number): Promise<TActionState>;
19
18
  saveActionExecutionResult(action: IActionWithState, chatId: number, transactionResult: ActionExecutionResult): Promise<void>;
20
19
  close(): Promise<void>;
21
- updateStateFor<TActionState extends IActionState>(sourceActionKey: string, chatId: number, update: (state: TActionState) => Promise<void>): Promise<void>;
20
+ updateStateFor<TActionState extends IActionState>(action: IActionWithState, chatId: number, update: (state: TActionState) => Promise<void>): Promise<void>;
22
21
  }
23
22
  //# sourceMappingURL=jsonFileStorage.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"jsonFileStorage.d.ts","sourceRoot":"","sources":["../../services/jsonFileStorage.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,IAAI,IAAI,SAAS,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElD,OAAO,EAAE,qBAAqB,EAAE,MAAM,mCAAmC,CAAC;AAC1E,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAE5D,qBAAa,eAAgB,YAAW,cAAc;IAClD,SAAS,YAAoB;IAC7B,OAAO,CAAC,KAAK,CAA4C;IACzD,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,OAAO,CAAS;gBAEZ,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM;YAY5B,IAAI;YAUJ,YAAY;YAmBZ,IAAI;IAalB,OAAO,CAAC,eAAe;IAOjB,IAAI,CAAC,YAAY,SAAS,YAAY,EAAE,GAAG,EAAE,MAAM;IAMnD,YAAY,CAAC,OAAO,EAAE,gBAAgB,EAAE,EAAE,OAAO,EAAE,MAAM;IAUzD,cAAc,CAAC,YAAY,SAAS,YAAY,EAClD,MAAM,EAAE,gBAAgB,EACxB,MAAM,EAAE,MAAM;IAYZ,yBAAyB,CAC3B,MAAM,EAAE,gBAAgB,EACxB,MAAM,EAAE,MAAM,EACd,iBAAiB,EAAE,qBAAqB;IAYtC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAItB,cAAc,CAAC,YAAY,SAAS,YAAY,EAClD,eAAe,EAAE,MAAM,EACvB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,OAAO,CAAC,IAAI,CAAC;CAcrD"}
1
+ {"version":3,"file":"jsonFileStorage.d.ts","sourceRoot":"","sources":["../../services/jsonFileStorage.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElD,OAAO,EAAE,qBAAqB,EAAE,MAAM,mCAAmC,CAAC;AAC1E,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAEvE,qBAAa,eAAgB,YAAW,cAAc;IAClD,OAAO,CAAC,KAAK,CAAmC;IAChD,OAAO,CAAC,KAAK,CAA4C;IACzD,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,OAAO,CAAS;gBAEZ,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,gBAAgB,EAAE,EAAE,IAAI,CAAC,EAAE,MAAM;YAgBzD,IAAI;YAgBJ,YAAY;YAqBZ,IAAI;IAalB,OAAO,CAAC,eAAe;IAOjB,IAAI,CAAC,YAAY,SAAS,YAAY,EAAE,GAAG,EAAE,SAAS;IAMtD,YAAY,CAAC,OAAO,EAAE,gBAAgB,EAAE,EAAE,OAAO,EAAE,MAAM;IAUzD,cAAc,CAAC,YAAY,SAAS,YAAY,EAClD,MAAM,EAAE,gBAAgB,EACxB,MAAM,EAAE,MAAM;IAYZ,yBAAyB,CAC3B,MAAM,EAAE,gBAAgB,EACxB,MAAM,EAAE,MAAM,EACd,iBAAiB,EAAE,qBAAqB;IAYtC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAMtB,cAAc,CAAC,YAAY,SAAS,YAAY,EAClD,MAAM,EAAE,gBAAgB,EACxB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,OAAO,CAAC,IAAI,CAAC;CAcrD"}
@@ -5,10 +5,9 @@ const fs_1 = require("fs");
5
5
  const path_1 = require("path");
6
6
  const promises_1 = require("fs/promises");
7
7
  const async_sema_1 = require("async-sema");
8
- const actionStateBase_1 = require("../entities/states/actionStateBase");
9
8
  class JsonFileStorage {
10
- constructor(botName, path) {
11
- this.semaphore = new async_sema_1.Sema(1);
9
+ constructor(botName, actions, path) {
10
+ this.locks = new Map();
12
11
  this.cache = new Map();
13
12
  this.botName = botName;
14
13
  this.storagePath = path ?? 'storage';
@@ -17,14 +16,21 @@ class JsonFileStorage {
17
16
  recursive: true
18
17
  });
19
18
  }
19
+ for (const action of actions) {
20
+ this.locks.set(action.key, new async_sema_1.Sema(1));
21
+ }
20
22
  }
21
- async lock(action) {
22
- await this.semaphore.acquire();
23
+ async lock(key, action) {
24
+ const lock = this.locks.get(key);
25
+ if (!lock) {
26
+ throw new Error(`Lock for action ${key} not found`);
27
+ }
28
+ await lock.acquire();
23
29
  try {
24
30
  return await action();
25
31
  }
26
32
  finally {
27
- this.semaphore.release();
33
+ lock.release();
28
34
  }
29
35
  }
30
36
  async loadInternal(key) {
@@ -54,26 +60,24 @@ class JsonFileStorage {
54
60
  return `${this.storagePath}/${this.botName}/${key.replaceAll(':', '/')}.json`;
55
61
  }
56
62
  async load(key) {
57
- return await this.lock(async () => {
63
+ return await this.lock(key, async () => {
58
64
  return this.loadInternal(key);
59
65
  });
60
66
  }
61
67
  async saveMetadata(actions, botName) {
62
- return await this.lock(async () => {
63
- const targetPath = this.buidPathFromKey(`Metadata-${botName}`);
64
- await (0, promises_1.writeFile)(targetPath, JSON.stringify(actions), {
65
- flag: 'w+'
66
- });
68
+ const targetPath = this.buidPathFromKey(`Metadata-${botName}`);
69
+ await (0, promises_1.writeFile)(targetPath, JSON.stringify(actions), {
70
+ flag: 'w+'
67
71
  });
68
72
  }
69
- async getActionState(entity, chatId) {
70
- return await this.lock(async () => {
71
- const data = await this.loadInternal(entity.key);
72
- return Object.assign(entity.stateConstructor(), data[chatId]);
73
+ async getActionState(action, chatId) {
74
+ return await this.lock(action.key, async () => {
75
+ const data = await this.loadInternal(action.key);
76
+ return Object.assign(action.stateConstructor(), data[chatId]);
73
77
  });
74
78
  }
75
79
  async saveActionExecutionResult(action, chatId, transactionResult) {
76
- await this.lock(async () => {
80
+ await this.lock(action.key, async () => {
77
81
  const data = await this.loadInternal(action.key);
78
82
  if (transactionResult.shouldUpdate) {
79
83
  data[chatId] = transactionResult.data;
@@ -82,14 +86,16 @@ class JsonFileStorage {
82
86
  });
83
87
  }
84
88
  async close() {
85
- await this.semaphore.acquire();
89
+ for (const lock of this.locks.values()) {
90
+ await lock.acquire();
91
+ }
86
92
  }
87
- async updateStateFor(sourceActionKey, chatId, update) {
88
- await this.lock(async () => {
89
- const data = await this.loadInternal(sourceActionKey);
90
- const state = Object.assign(new actionStateBase_1.ActionStateBase(), data[chatId]);
93
+ async updateStateFor(action, chatId, update) {
94
+ await this.lock(action.key, async () => {
95
+ const data = await this.loadInternal(action.key);
96
+ const state = Object.assign(action.stateConstructor(), data[chatId]);
91
97
  await update(state);
92
- await this.save(data, sourceActionKey);
98
+ await this.save(data, action.key);
93
99
  });
94
100
  }
95
101
  }