@mtcute/dispatcher 0.1.1 → 0.2.0

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 (71) hide show
  1. package/cjs/callback-data-builder.d.ts +1 -1
  2. package/cjs/callback-data-builder.js +3 -1
  3. package/cjs/callback-data-builder.js.map +1 -1
  4. package/cjs/callback-data-builder.test.d.ts +1 -0
  5. package/cjs/callback-data-builder.test.js +74 -0
  6. package/cjs/callback-data-builder.test.js.map +1 -0
  7. package/cjs/context/callback-query.d.ts +7 -3
  8. package/cjs/context/callback-query.js +12 -0
  9. package/cjs/context/callback-query.js.map +1 -1
  10. package/cjs/context/index.d.ts +1 -1
  11. package/cjs/context/index.js.map +1 -1
  12. package/cjs/context/message.d.ts +7 -1
  13. package/cjs/context/message.js +20 -0
  14. package/cjs/context/message.js.map +1 -1
  15. package/cjs/dispatcher.d.ts +5 -12
  16. package/cjs/dispatcher.js +112 -63
  17. package/cjs/dispatcher.js.map +1 -1
  18. package/cjs/filters/bots.d.ts +4 -1
  19. package/cjs/filters/bots.js +6 -2
  20. package/cjs/filters/bots.js.map +1 -1
  21. package/cjs/filters/bots.test.d.ts +1 -0
  22. package/cjs/filters/bots.test.js +120 -0
  23. package/cjs/filters/bots.test.js.map +1 -0
  24. package/cjs/filters/index.d.ts +2 -1
  25. package/cjs/filters/index.js.map +1 -1
  26. package/cjs/filters/logic.test.d.ts +1 -0
  27. package/cjs/filters/logic.test.js +169 -0
  28. package/cjs/filters/logic.test.js.map +1 -0
  29. package/cjs/filters/message.d.ts +22 -6
  30. package/cjs/filters/message.js +25 -3
  31. package/cjs/filters/message.js.map +1 -1
  32. package/cjs/state/key.d.ts +2 -2
  33. package/cjs/state/key.js.map +1 -1
  34. package/cjs/state/storage.d.ts +21 -0
  35. package/cjs/state/storage.js.map +1 -1
  36. package/esm/callback-data-builder.d.ts +1 -1
  37. package/esm/callback-data-builder.js +3 -1
  38. package/esm/callback-data-builder.js.map +1 -1
  39. package/esm/callback-data-builder.test.d.ts +1 -0
  40. package/esm/callback-data-builder.test.js +72 -0
  41. package/esm/callback-data-builder.test.js.map +1 -0
  42. package/esm/context/callback-query.d.ts +7 -3
  43. package/esm/context/callback-query.js +13 -1
  44. package/esm/context/callback-query.js.map +1 -1
  45. package/esm/context/index.d.ts +1 -1
  46. package/esm/context/index.js.map +1 -1
  47. package/esm/context/message.d.ts +7 -1
  48. package/esm/context/message.js +21 -1
  49. package/esm/context/message.js.map +1 -1
  50. package/esm/dispatcher.d.ts +5 -12
  51. package/esm/dispatcher.js +112 -63
  52. package/esm/dispatcher.js.map +1 -1
  53. package/esm/filters/bots.d.ts +4 -1
  54. package/esm/filters/bots.js +6 -2
  55. package/esm/filters/bots.js.map +1 -1
  56. package/esm/filters/bots.test.d.ts +1 -0
  57. package/esm/filters/bots.test.js +118 -0
  58. package/esm/filters/bots.test.js.map +1 -0
  59. package/esm/filters/index.d.ts +2 -1
  60. package/esm/filters/index.js.map +1 -1
  61. package/esm/filters/logic.test.d.ts +1 -0
  62. package/esm/filters/logic.test.js +167 -0
  63. package/esm/filters/logic.test.js.map +1 -0
  64. package/esm/filters/message.d.ts +22 -6
  65. package/esm/filters/message.js +22 -2
  66. package/esm/filters/message.js.map +1 -1
  67. package/esm/state/key.d.ts +2 -2
  68. package/esm/state/key.js.map +1 -1
  69. package/esm/state/storage.d.ts +21 -0
  70. package/esm/state/storage.js.map +1 -1
  71. package/package.json +3 -2
@@ -0,0 +1,72 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { CallbackQuery, MtArgumentError, PeersIndex } from '@mtcute/client';
3
+ import { utf8EncodeToBuffer } from '@mtcute/client/utils.js';
4
+ import { createStub } from '@mtcute/test';
5
+ import { CallbackDataBuilder } from './callback-data-builder.js';
6
+ describe('CallbackDataBuilder', () => {
7
+ it('should correctly build data', () => {
8
+ const cdb = new CallbackDataBuilder('prefix', 'foo', 'bar');
9
+ expect(cdb.build({ foo: 'foo', bar: 'bar' })).toEqual('prefix:foo:bar');
10
+ });
11
+ it('should correctly throw on invalid data when building', () => {
12
+ const cdb = new CallbackDataBuilder('prefix', 'foo', 'bar');
13
+ expect(() => cdb.build({ foo: 'foo:1', bar: 'bar' })).toThrow(MtArgumentError);
14
+ });
15
+ it('should correctly throw on too long data when building', () => {
16
+ const cdb = new CallbackDataBuilder('prefix', 'foo', 'bar');
17
+ expect(() => cdb.build({
18
+ foo: 'foooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo',
19
+ bar: 'bar',
20
+ })).toThrow(MtArgumentError);
21
+ });
22
+ it('should correctly parse data', () => {
23
+ const cdb = new CallbackDataBuilder('prefix', 'foo', 'bar');
24
+ expect(cdb.parse('prefix:foo:bar')).toEqual({ foo: 'foo', bar: 'bar' });
25
+ });
26
+ it('should throw on invalid prefix when parsing', () => {
27
+ const cdb = new CallbackDataBuilder('prefix', 'foo', 'bar');
28
+ expect(() => cdb.parse('123:foo:bar')).toThrow(MtArgumentError);
29
+ });
30
+ it('should throw on invalid parts count when parsing', () => {
31
+ const cdb = new CallbackDataBuilder('prefix', 'foo', 'bar');
32
+ expect(() => cdb.parse('prefix:foo:bar:baz')).toThrow(MtArgumentError);
33
+ });
34
+ describe('filter', () => {
35
+ const createCb = (data) => new CallbackQuery(createStub('updateBotCallbackQuery', {
36
+ data: utf8EncodeToBuffer(data),
37
+ }), new PeersIndex());
38
+ const getFilterMatch = (filter, data) => {
39
+ const cb = createCb(data);
40
+ const matched = filter(cb);
41
+ if (!matched)
42
+ return null;
43
+ // eslint-disable-next-line
44
+ return cb.match;
45
+ };
46
+ it('should create a filter without params', () => {
47
+ const cdb = new CallbackDataBuilder('prefix', 'foo', 'bar');
48
+ expect(getFilterMatch(cdb.filter(), 'prefix:foo:bar')).toEqual({
49
+ foo: 'foo',
50
+ bar: 'bar',
51
+ });
52
+ expect(getFilterMatch(cdb.filter(), 'prefix:foo:bar:baz')).toEqual(null);
53
+ });
54
+ it('should create a filter with params', () => {
55
+ const cdb = new CallbackDataBuilder('prefix', 'foo', 'bar');
56
+ expect(getFilterMatch(cdb.filter({ foo: 'foo' }), 'prefix:foo:bar')).toEqual({
57
+ foo: 'foo',
58
+ bar: 'bar',
59
+ });
60
+ expect(getFilterMatch(cdb.filter({ foo: 'foo' }), 'prefix:bar:bar')).toEqual(null);
61
+ });
62
+ it('should create a filter with regex params', () => {
63
+ const cdb = new CallbackDataBuilder('prefix', 'foo', 'bar');
64
+ expect(getFilterMatch(cdb.filter({ foo: /\d+/ }), 'prefix:123:bar')).toEqual({
65
+ foo: '123',
66
+ bar: 'bar',
67
+ });
68
+ expect(getFilterMatch(cdb.filter({ foo: /\d+/ }), 'prefix:bar:bar')).toEqual(null);
69
+ });
70
+ });
71
+ });
72
+ //# sourceMappingURL=callback-data-builder.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"callback-data-builder.test.js","sourceRoot":"","sources":["../../src/callback-data-builder.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { describe, expect, it } from 'vitest'\n\nimport { CallbackQuery, MtArgumentError, PeersIndex } from '@mtcute/client'\nimport { utf8EncodeToBuffer } from '@mtcute/client/utils.js'\nimport { createStub } from '@mtcute/test'\n\nimport { CallbackDataBuilder } from './callback-data-builder.js'\nimport { UpdateFilter } from './filters/index.js'\n\ndescribe('CallbackDataBuilder', () => {\n it('should correctly build data', () => {\n const cdb = new CallbackDataBuilder('prefix', 'foo', 'bar')\n\n expect(cdb.build({ foo: 'foo', bar: 'bar' })).toEqual('prefix:foo:bar')\n })\n\n it('should correctly throw on invalid data when building', () => {\n const cdb = new CallbackDataBuilder('prefix', 'foo', 'bar')\n\n expect(() => cdb.build({ foo: 'foo:1', bar: 'bar' })).toThrow(MtArgumentError)\n })\n\n it('should correctly throw on too long data when building', () => {\n const cdb = new CallbackDataBuilder('prefix', 'foo', 'bar')\n\n expect(() =>\n cdb.build({\n foo: 'foooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo',\n bar: 'bar',\n }),\n ).toThrow(MtArgumentError)\n })\n\n it('should correctly parse data', () => {\n const cdb = new CallbackDataBuilder('prefix', 'foo', 'bar')\n\n expect(cdb.parse('prefix:foo:bar')).toEqual({ foo: 'foo', bar: 'bar' })\n })\n\n it('should throw on invalid prefix when parsing', () => {\n const cdb = new CallbackDataBuilder('prefix', 'foo', 'bar')\n\n expect(() => cdb.parse('123:foo:bar')).toThrow(MtArgumentError)\n })\n\n it('should throw on invalid parts count when parsing', () => {\n const cdb = new CallbackDataBuilder('prefix', 'foo', 'bar')\n\n expect(() => cdb.parse('prefix:foo:bar:baz')).toThrow(MtArgumentError)\n })\n\n describe('filter', () => {\n const createCb = (data: string) =>\n new CallbackQuery(\n createStub('updateBotCallbackQuery', {\n data: utf8EncodeToBuffer(data),\n }),\n new PeersIndex(),\n )\n\n const getFilterMatch = (filter: UpdateFilter<CallbackQuery>, data: string) => {\n const cb = createCb(data)\n\n const matched = filter(cb)\n if (!matched) return null\n\n // eslint-disable-next-line\n return (cb as any).match\n }\n\n it('should create a filter without params', () => {\n const cdb = new CallbackDataBuilder('prefix', 'foo', 'bar')\n\n expect(getFilterMatch(cdb.filter(), 'prefix:foo:bar')).toEqual({\n foo: 'foo',\n bar: 'bar',\n })\n expect(getFilterMatch(cdb.filter(), 'prefix:foo:bar:baz')).toEqual(null)\n })\n\n it('should create a filter with params', () => {\n const cdb = new CallbackDataBuilder('prefix', 'foo', 'bar')\n\n expect(getFilterMatch(cdb.filter({ foo: 'foo' }), 'prefix:foo:bar')).toEqual({\n foo: 'foo',\n bar: 'bar',\n })\n expect(getFilterMatch(cdb.filter({ foo: 'foo' }), 'prefix:bar:bar')).toEqual(null)\n })\n\n it('should create a filter with regex params', () => {\n const cdb = new CallbackDataBuilder('prefix', 'foo', 'bar')\n\n expect(getFilterMatch(cdb.filter({ foo: /\\d+/ }), 'prefix:123:bar')).toEqual({\n foo: '123',\n bar: 'bar',\n })\n expect(getFilterMatch(cdb.filter({ foo: /\\d+/ }), 'prefix:bar:bar')).toEqual(null)\n })\n })\n})\n"]}
@@ -1,4 +1,4 @@
1
- import { CallbackQuery, TelegramClient } from '@mtcute/client';
1
+ import { CallbackQuery, Message, TelegramClient } from '@mtcute/client';
2
2
  import { UpdateContext } from './base.js';
3
3
  /**
4
4
  * Context of a callback query update.
@@ -19,9 +19,13 @@ export declare class CallbackQueryContext extends CallbackQuery implements Updat
19
19
  *
20
20
  * Can only be used if `isInline = false`
21
21
  */
22
- getMessage(): Promise<import("@mtcute/client").Message>;
22
+ getMessage(): Promise<Message>;
23
23
  /**
24
24
  * Edit the message that contained the callback button that was clicked.
25
25
  */
26
- editMessage(params: Omit<Parameters<TelegramClient['editInlineMessage']>[0], 'messageId'>): Promise<void | import("@mtcute/client").Message>;
26
+ editMessage(params: Omit<Parameters<TelegramClient['editInlineMessage']>[0], 'messageId'>): Promise<void | Message>;
27
+ /**
28
+ * Shortcut for getting the message and editing it.
29
+ */
30
+ editMessageWith(handler: (msg: Message) => Promise<Parameters<CallbackQueryContext['editMessage']>[0]>): Promise<void | Message>;
27
31
  }
@@ -1,4 +1,4 @@
1
- import { CallbackQuery, getMarkedPeerId, MtArgumentError, MtMessageNotFoundError } from '@mtcute/client';
1
+ import { CallbackQuery, getMarkedPeerId, MtArgumentError, MtMessageNotFoundError, } from '@mtcute/client';
2
2
  /**
3
3
  * Context of a callback query update.
4
4
  *
@@ -48,5 +48,17 @@ export class CallbackQueryContext extends CallbackQuery {
48
48
  ...params,
49
49
  });
50
50
  }
51
+ /**
52
+ * Shortcut for getting the message and editing it.
53
+ */
54
+ async editMessageWith(handler) {
55
+ const msg = await this.getMessage();
56
+ if (!msg)
57
+ return;
58
+ const res = await handler(msg);
59
+ if (!res)
60
+ return;
61
+ return this.editMessage(res);
62
+ }
51
63
  }
52
64
  //# sourceMappingURL=callback-query.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"callback-query.js","sourceRoot":"","sources":["../../../src/context/callback-query.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,eAAe,EAAE,sBAAsB,EAAkB,MAAM,gBAAgB,CAAA;AAIxH;;;;GAIG;AACH,MAAM,OAAO,oBAAqB,SAAQ,aAAa;IAGnD,YACa,MAAsB,EAC/B,KAAoB;QAEpB,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,MAAM,CAAC,CAAA;QAHrB,WAAM,GAAN,MAAM,CAAgB;QAH1B,UAAK,GAAG,gBAAgB,CAAA;IAOjC,CAAC;IAED,oCAAoC;IACpC,MAAM,CAAC,MAA4D;QAC/D,OAAO,IAAI,CAAC,MAAM,CAAC,mBAAmB,CAAC,IAAI,CAAC,EAAE,EAAE,MAAM,CAAC,CAAA;IAC3D,CAAC;IAED;;;;;;;OAOG;IACH,KAAK,CAAC,UAAU;QACZ,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,wBAAwB,EAAE;YACzC,MAAM,IAAI,eAAe,CAAC,8CAA8C,CAAC,CAAA;SAC5E;QAED,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;QAE1E,IAAI,CAAC,GAAG,EAAE;YACN,MAAM,IAAI,sBAAsB,CAAC,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,mBAAmB,CAAC,CAAA;SACxG;QAED,OAAO,GAAG,CAAA;IACd,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,WAAW,CAAC,MAA6E;QAC3F,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,8BAA8B,EAAE;YAC/C,OAAO,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC;gBACjC,SAAS,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK;gBACzB,GAAG,MAAM;aACZ,CAAC,CAAA;SACL;QAED,OAAO,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC;YAC3B,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI;YACrB,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK;YACvB,GAAG,MAAM;SACZ,CAAC,CAAA;IACN,CAAC;CACJ","sourcesContent":["import { CallbackQuery, getMarkedPeerId, MtArgumentError, MtMessageNotFoundError, TelegramClient } from '@mtcute/client'\n\nimport { UpdateContext } from './base.js'\n\n/**\n * Context of a callback query update.\n *\n * This is a subclass of {@link CallbackQuery}, so all its fields are also available.\n */\nexport class CallbackQueryContext extends CallbackQuery implements UpdateContext<CallbackQuery> {\n readonly _name = 'callback_query'\n\n constructor(\n readonly client: TelegramClient,\n query: CallbackQuery,\n ) {\n super(query.raw, query._peers)\n }\n\n /** Answer to this callback query */\n answer(params: Parameters<TelegramClient['answerCallbackQuery']>[1]) {\n return this.client.answerCallbackQuery(this.id, params)\n }\n\n /**\n * * Message that contained the callback button that was clicked.\n *\n * Note that the message may have been deleted, in which case\n * `MessageNotFoundError` is thrown.\n *\n * Can only be used if `isInline = false`\n */\n async getMessage() {\n if (this.raw._ !== 'updateBotCallbackQuery') {\n throw new MtArgumentError('Cannot get message for inline callback query')\n }\n\n const [msg] = await this.client.getMessages(this.raw.peer, this.raw.msgId)\n\n if (!msg) {\n throw new MtMessageNotFoundError(getMarkedPeerId(this.raw.peer), this.raw.msgId, 'Message not found')\n }\n\n return msg\n }\n\n /**\n * Edit the message that contained the callback button that was clicked.\n */\n async editMessage(params: Omit<Parameters<TelegramClient['editInlineMessage']>[0], 'messageId'>) {\n if (this.raw._ === 'updateInlineBotCallbackQuery') {\n return this.client.editInlineMessage({\n messageId: this.raw.msgId,\n ...params,\n })\n }\n\n return this.client.editMessage({\n chatId: this.raw.peer,\n message: this.raw.msgId,\n ...params,\n })\n }\n}\n"]}
1
+ {"version":3,"file":"callback-query.js","sourceRoot":"","sources":["../../../src/context/callback-query.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,aAAa,EACb,eAAe,EAEf,eAAe,EACf,sBAAsB,GAEzB,MAAM,gBAAgB,CAAA;AAIvB;;;;GAIG;AACH,MAAM,OAAO,oBAAqB,SAAQ,aAAa;IAGnD,YACa,MAAsB,EAC/B,KAAoB;QAEpB,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,MAAM,CAAC,CAAA;QAHrB,WAAM,GAAN,MAAM,CAAgB;QAH1B,UAAK,GAAG,gBAAgB,CAAA;IAOjC,CAAC;IAED,oCAAoC;IACpC,MAAM,CAAC,MAA4D;QAC/D,OAAO,IAAI,CAAC,MAAM,CAAC,mBAAmB,CAAC,IAAI,CAAC,EAAE,EAAE,MAAM,CAAC,CAAA;IAC3D,CAAC;IAED;;;;;;;OAOG;IACH,KAAK,CAAC,UAAU;QACZ,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,wBAAwB,EAAE;YACzC,MAAM,IAAI,eAAe,CAAC,8CAA8C,CAAC,CAAA;SAC5E;QAED,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;QAE1E,IAAI,CAAC,GAAG,EAAE;YACN,MAAM,IAAI,sBAAsB,CAAC,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,mBAAmB,CAAC,CAAA;SACxG;QAED,OAAO,GAAG,CAAA;IACd,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,WAAW,CAAC,MAA6E;QAC3F,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,8BAA8B,EAAE;YAC/C,OAAO,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC;gBACjC,SAAS,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK;gBACzB,GAAG,MAAM;aACZ,CAAC,CAAA;SACL;QAED,OAAO,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC;YAC3B,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI;YACrB,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK;YACvB,GAAG,MAAM;SACZ,CAAC,CAAA;IACN,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,eAAe,CAAC,OAAsF;QACxG,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE,CAAA;QACnC,IAAI,CAAC,GAAG;YAAE,OAAM;QAEhB,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,CAAA;QAC9B,IAAI,CAAC,GAAG;YAAE,OAAM;QAEhB,OAAO,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAA;IAChC,CAAC;CACJ","sourcesContent":["import {\n CallbackQuery,\n getMarkedPeerId,\n Message,\n MtArgumentError,\n MtMessageNotFoundError,\n TelegramClient,\n} from '@mtcute/client'\n\nimport { UpdateContext } from './base.js'\n\n/**\n * Context of a callback query update.\n *\n * This is a subclass of {@link CallbackQuery}, so all its fields are also available.\n */\nexport class CallbackQueryContext extends CallbackQuery implements UpdateContext<CallbackQuery> {\n readonly _name = 'callback_query'\n\n constructor(\n readonly client: TelegramClient,\n query: CallbackQuery,\n ) {\n super(query.raw, query._peers)\n }\n\n /** Answer to this callback query */\n answer(params: Parameters<TelegramClient['answerCallbackQuery']>[1]) {\n return this.client.answerCallbackQuery(this.id, params)\n }\n\n /**\n * * Message that contained the callback button that was clicked.\n *\n * Note that the message may have been deleted, in which case\n * `MessageNotFoundError` is thrown.\n *\n * Can only be used if `isInline = false`\n */\n async getMessage() {\n if (this.raw._ !== 'updateBotCallbackQuery') {\n throw new MtArgumentError('Cannot get message for inline callback query')\n }\n\n const [msg] = await this.client.getMessages(this.raw.peer, this.raw.msgId)\n\n if (!msg) {\n throw new MtMessageNotFoundError(getMarkedPeerId(this.raw.peer), this.raw.msgId, 'Message not found')\n }\n\n return msg\n }\n\n /**\n * Edit the message that contained the callback button that was clicked.\n */\n async editMessage(params: Omit<Parameters<TelegramClient['editInlineMessage']>[0], 'messageId'>) {\n if (this.raw._ === 'updateInlineBotCallbackQuery') {\n return this.client.editInlineMessage({\n messageId: this.raw.msgId,\n ...params,\n })\n }\n\n return this.client.editMessage({\n chatId: this.raw.peer,\n message: this.raw.msgId,\n ...params,\n })\n }\n\n /**\n * Shortcut for getting the message and editing it.\n */\n async editMessageWith(handler: (msg: Message) => Promise<Parameters<CallbackQueryContext['editMessage']>[0]>) {\n const msg = await this.getMessage()\n if (!msg) return\n\n const res = await handler(msg)\n if (!res) return\n\n return this.editMessage(res)\n }\n}\n"]}
@@ -4,5 +4,5 @@ export * from './chat-join-request.js';
4
4
  export * from './chosen-inline-result.js';
5
5
  export * from './inline-query.js';
6
6
  export * from './message.js';
7
- export { UpdateContextType } from './parse.js';
7
+ export type { UpdateContextType } from './parse.js';
8
8
  export * from './pre-checkout-query.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/context/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAA;AACzB,cAAc,qBAAqB,CAAA;AACnC,cAAc,wBAAwB,CAAA;AACtC,cAAc,2BAA2B,CAAA;AACzC,cAAc,mBAAmB,CAAA;AACjC,cAAc,cAAc,CAAA;AAE5B,cAAc,yBAAyB,CAAA","sourcesContent":["export * from './base.js'\nexport * from './callback-query.js'\nexport * from './chat-join-request.js'\nexport * from './chosen-inline-result.js'\nexport * from './inline-query.js'\nexport * from './message.js'\nexport { UpdateContextType } from './parse.js'\nexport * from './pre-checkout-query.js'\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/context/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAA;AACzB,cAAc,qBAAqB,CAAA;AACnC,cAAc,wBAAwB,CAAA;AACtC,cAAc,2BAA2B,CAAA;AACzC,cAAc,mBAAmB,CAAA;AACjC,cAAc,cAAc,CAAA;AAE5B,cAAc,yBAAyB,CAAA","sourcesContent":["export * from './base.js'\nexport * from './callback-query.js'\nexport * from './chat-join-request.js'\nexport * from './chosen-inline-result.js'\nexport * from './inline-query.js'\nexport * from './message.js'\nexport type { UpdateContextType } from './parse.js'\nexport * from './pre-checkout-query.js'\n"]}
@@ -1,4 +1,4 @@
1
- import { Message, OmitInputMessageId, ParametersSkip1, TelegramClient } from '@mtcute/client';
1
+ import { Message, OmitInputMessageId, ParametersSkip1, Peer, TelegramClient } from '@mtcute/client';
2
2
  import { DeleteMessagesParams } from '@mtcute/client/methods/messages/delete-messages.js';
3
3
  import { ForwardMessageOptions } from '@mtcute/client/methods/messages/forward-messages.js';
4
4
  import { SendCopyParams } from '@mtcute/client/methods/messages/send-copy.js';
@@ -25,6 +25,12 @@ export declare class MessageContext extends Message implements UpdateContext<Mes
25
25
  /** Whether this update is about a message group */
26
26
  readonly isMessageGroup: boolean;
27
27
  constructor(client: TelegramClient, message: Message | Message[]);
28
+ /**
29
+ * Get complete information about {@link sender}
30
+ *
31
+ * Learn more: [Incomplete peers](https://mtcute.dev/guide/topics/peers.html#incomplete-peers)
32
+ */
33
+ getCompleteSender(): Promise<Peer>;
28
34
  /** Get a message that this message is a reply to */
29
35
  getReplyTo(): Promise<Message | null>;
30
36
  /** If this is a channel post, get its automatic forward in the discussion group */
@@ -1,4 +1,4 @@
1
- import { Message } from '@mtcute/client';
1
+ import { Message, MtPeerNotFoundError } from '@mtcute/client';
2
2
  /**
3
3
  * Context of a message-related update.
4
4
  *
@@ -18,6 +18,26 @@ export class MessageContext extends Message {
18
18
  this.messages = Array.isArray(message) ? message.map((it) => new MessageContext(client, it)) : [this];
19
19
  this.isMessageGroup = Array.isArray(message);
20
20
  }
21
+ /**
22
+ * Get complete information about {@link sender}
23
+ *
24
+ * Learn more: [Incomplete peers](https://mtcute.dev/guide/topics/peers.html#incomplete-peers)
25
+ */
26
+ async getCompleteSender() {
27
+ if (!this.sender.isMin)
28
+ return this.sender;
29
+ let res;
30
+ if (this.sender.type === 'user') {
31
+ [res] = await this.client.getUsers(this.sender);
32
+ }
33
+ else {
34
+ res = await this.client.getChat(this.sender);
35
+ }
36
+ if (!res)
37
+ throw new MtPeerNotFoundError('Failed to fetch sender');
38
+ Object.defineProperty(this, 'sender', { value: res });
39
+ return res;
40
+ }
21
41
  /** Get a message that this message is a reply to */
22
42
  getReplyTo() {
23
43
  return this.client.getReplyTo(this);
@@ -1 +1 @@
1
- {"version":3,"file":"message.js","sourceRoot":"","sources":["../../../src/context/message.ts"],"names":[],"mappings":"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","sourcesContent":["import { Message, OmitInputMessageId, ParametersSkip1, TelegramClient } from '@mtcute/client'\nimport { DeleteMessagesParams } from '@mtcute/client/src/methods/messages/delete-messages.js'\nimport { ForwardMessageOptions } from '@mtcute/client/src/methods/messages/forward-messages.js'\nimport { SendCopyParams } from '@mtcute/client/src/methods/messages/send-copy.js'\nimport { SendCopyGroupParams } from '@mtcute/client/src/methods/messages/send-copy-group.js'\n\nimport { UpdateContext } from './base.js'\n\n/**\n * Context of a message-related update.\n *\n * This is a subclass of {@link Message}, so all fields\n * of the message are available.\n *\n * For message groups, own fields are related to the last message\n * in the group. To access all messages, use {@link MessageContext#messages}.\n */\nexport class MessageContext extends Message implements UpdateContext<Message> {\n // this is primarily for proper types in filters, so don't bother much with actual value\n readonly _name = 'new_message'\n\n /**\n * List of messages in the message group.\n *\n * For other updates, this is a list with a single element (`this`).\n */\n readonly messages: MessageContext[]\n\n /** Whether this update is about a message group */\n readonly isMessageGroup: boolean\n\n constructor(\n readonly client: TelegramClient,\n message: Message | Message[],\n ) {\n const msg = Array.isArray(message) ? message[message.length - 1] : message\n super(msg.raw, msg._peers, msg.isScheduled)\n\n this.messages = Array.isArray(message) ? message.map((it) => new MessageContext(client, it)) : [this]\n this.isMessageGroup = Array.isArray(message)\n }\n\n /** Get a message that this message is a reply to */\n getReplyTo() {\n return this.client.getReplyTo(this)\n }\n\n /** If this is a channel post, get its automatic forward in the discussion group */\n getDiscussionMessage() {\n return this.client.getDiscussionMessage({ chatId: this.chat.inputPeer, message: this.id })\n }\n\n /** Get all custom emojis contained in this message (message group), if any */\n getCustomEmojis() {\n return this.client.getCustomEmojisFromMessages(this.messages)\n }\n\n /** Send a text message to the same chat (and topic, if applicable) as a given message */\n answerText(...params: ParametersSkip1<TelegramClient['answerText']>) {\n return this.client.answerText(this, ...params)\n }\n\n /** Send a media to the same chat (and topic, if applicable) as a given message */\n answerMedia(...params: ParametersSkip1<TelegramClient['answerMedia']>) {\n return this.client.answerMedia(this, ...params)\n }\n\n /** Send a media group to the same chat (and topic, if applicable) as a given message */\n answerMediaGroup(...params: ParametersSkip1<TelegramClient['answerMediaGroup']>) {\n return this.client.answerMediaGroup(this, ...params)\n }\n\n /** Send a text message in reply to this message */\n replyText(...params: ParametersSkip1<TelegramClient['replyText']>) {\n return this.client.replyText(this, ...params)\n }\n\n /** Send a media in reply to this message */\n replyMedia(...params: ParametersSkip1<TelegramClient['replyMedia']>) {\n return this.client.replyMedia(this, ...params)\n }\n\n /** Send a media group in reply to this message */\n replyMediaGroup(...params: ParametersSkip1<TelegramClient['replyMediaGroup']>) {\n return this.client.replyMediaGroup(this, ...params)\n }\n\n /** Send a text message in reply to this message */\n quoteWithText(params: Parameters<TelegramClient['quoteWithText']>[1]) {\n return this.client.quoteWithText(this, params)\n }\n\n /** Send a media in reply to this message */\n quoteWithMedia(params: Parameters<TelegramClient['quoteWithMedia']>[1]) {\n return this.client.quoteWithMedia(this, params)\n }\n\n /** Send a media group in reply to this message */\n quoteWithMediaGroup(params: Parameters<TelegramClient['quoteWithMediaGroup']>[1]) {\n return this.client.quoteWithMediaGroup(this, params)\n }\n\n /** Send a text as a comment to this message */\n commentText(...params: ParametersSkip1<TelegramClient['commentText']>) {\n return this.client.commentText(this, ...params)\n }\n\n /** Send a media as a comment to this message */\n commentMedia(...params: ParametersSkip1<TelegramClient['commentMedia']>) {\n return this.client.commentMedia(this, ...params)\n }\n\n /** Send a media group as a comment to this message */\n commentMediaGroup(...params: ParametersSkip1<TelegramClient['commentMediaGroup']>) {\n return this.client.commentMediaGroup(this, ...params)\n }\n\n /** Delete this message (message group) */\n delete(params?: DeleteMessagesParams) {\n return this.client.deleteMessagesById(\n this.chat.inputPeer,\n this.messages.map((it) => it.id),\n params,\n )\n }\n\n /** Pin this message */\n pin(params?: OmitInputMessageId<Parameters<TelegramClient['pinMessage']>[0]>) {\n return this.client.pinMessage({\n chatId: this.chat.inputPeer,\n message: this.id,\n ...params,\n })\n }\n\n /** Unpin this message */\n unpin() {\n return this.client.unpinMessage({\n chatId: this.chat.inputPeer,\n message: this.id,\n })\n }\n\n /** Edit this message */\n edit(params: OmitInputMessageId<Parameters<TelegramClient['editMessage']>[0]>) {\n return this.client.editMessage({\n chatId: this.chat.inputPeer,\n message: this.id,\n ...params,\n })\n }\n\n /** Forward this message (message group) */\n forwardTo(params: ForwardMessageOptions) {\n return this.client.forwardMessagesById({\n fromChatId: this.chat.inputPeer,\n messages: this.messages.map((it) => it.id),\n ...params,\n })\n }\n\n /** Send a copy of this message (message group) */\n copy(params: SendCopyParams & SendCopyGroupParams) {\n if (this.isMessageGroup) {\n return this.client.sendCopyGroup({\n messages: this.messages,\n ...params,\n })\n }\n\n return this.client.sendCopy({\n message: this,\n ...params,\n })\n }\n\n /** React to this message */\n react(params: OmitInputMessageId<Parameters<TelegramClient['sendReaction']>[0]>) {\n return this.client.sendReaction({\n chatId: this.chat.inputPeer,\n message: this.id,\n ...params,\n })\n }\n}\n"]}
1
+ {"version":3,"file":"message.js","sourceRoot":"","sources":["../../../src/context/message.ts"],"names":[],"mappings":"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","sourcesContent":["import { Message, MtPeerNotFoundError, OmitInputMessageId, ParametersSkip1, Peer, TelegramClient } from '@mtcute/client'\nimport { DeleteMessagesParams } from '@mtcute/client/src/methods/messages/delete-messages.js'\nimport { ForwardMessageOptions } from '@mtcute/client/src/methods/messages/forward-messages.js'\nimport { SendCopyParams } from '@mtcute/client/src/methods/messages/send-copy.js'\nimport { SendCopyGroupParams } from '@mtcute/client/src/methods/messages/send-copy-group.js'\n\nimport { UpdateContext } from './base.js'\n\n/**\n * Context of a message-related update.\n *\n * This is a subclass of {@link Message}, so all fields\n * of the message are available.\n *\n * For message groups, own fields are related to the last message\n * in the group. To access all messages, use {@link MessageContext#messages}.\n */\nexport class MessageContext extends Message implements UpdateContext<Message> {\n // this is primarily for proper types in filters, so don't bother much with actual value\n readonly _name = 'new_message'\n\n /**\n * List of messages in the message group.\n *\n * For other updates, this is a list with a single element (`this`).\n */\n readonly messages: MessageContext[]\n\n /** Whether this update is about a message group */\n readonly isMessageGroup: boolean\n\n constructor(\n readonly client: TelegramClient,\n message: Message | Message[],\n ) {\n const msg = Array.isArray(message) ? message[message.length - 1] : message\n super(msg.raw, msg._peers, msg.isScheduled)\n\n this.messages = Array.isArray(message) ? message.map((it) => new MessageContext(client, it)) : [this]\n this.isMessageGroup = Array.isArray(message)\n }\n\n /**\n * Get complete information about {@link sender}\n *\n * Learn more: [Incomplete peers](https://mtcute.dev/guide/topics/peers.html#incomplete-peers)\n */\n async getCompleteSender(): Promise<Peer> {\n if (!this.sender.isMin) return this.sender\n\n let res\n\n if (this.sender.type === 'user') {\n [res] = await this.client.getUsers(this.sender)\n } else {\n res = await this.client.getChat(this.sender)\n }\n\n if (!res) throw new MtPeerNotFoundError('Failed to fetch sender')\n\n Object.defineProperty(this, 'sender', { value: res })\n\n return res\n }\n\n /** Get a message that this message is a reply to */\n getReplyTo() {\n return this.client.getReplyTo(this)\n }\n\n /** If this is a channel post, get its automatic forward in the discussion group */\n getDiscussionMessage() {\n return this.client.getDiscussionMessage({ chatId: this.chat.inputPeer, message: this.id })\n }\n\n /** Get all custom emojis contained in this message (message group), if any */\n getCustomEmojis() {\n return this.client.getCustomEmojisFromMessages(this.messages)\n }\n\n /** Send a text message to the same chat (and topic, if applicable) as a given message */\n answerText(...params: ParametersSkip1<TelegramClient['answerText']>) {\n return this.client.answerText(this, ...params)\n }\n\n /** Send a media to the same chat (and topic, if applicable) as a given message */\n answerMedia(...params: ParametersSkip1<TelegramClient['answerMedia']>) {\n return this.client.answerMedia(this, ...params)\n }\n\n /** Send a media group to the same chat (and topic, if applicable) as a given message */\n answerMediaGroup(...params: ParametersSkip1<TelegramClient['answerMediaGroup']>) {\n return this.client.answerMediaGroup(this, ...params)\n }\n\n /** Send a text message in reply to this message */\n replyText(...params: ParametersSkip1<TelegramClient['replyText']>) {\n return this.client.replyText(this, ...params)\n }\n\n /** Send a media in reply to this message */\n replyMedia(...params: ParametersSkip1<TelegramClient['replyMedia']>) {\n return this.client.replyMedia(this, ...params)\n }\n\n /** Send a media group in reply to this message */\n replyMediaGroup(...params: ParametersSkip1<TelegramClient['replyMediaGroup']>) {\n return this.client.replyMediaGroup(this, ...params)\n }\n\n /** Send a text message in reply to this message */\n quoteWithText(params: Parameters<TelegramClient['quoteWithText']>[1]) {\n return this.client.quoteWithText(this, params)\n }\n\n /** Send a media in reply to this message */\n quoteWithMedia(params: Parameters<TelegramClient['quoteWithMedia']>[1]) {\n return this.client.quoteWithMedia(this, params)\n }\n\n /** Send a media group in reply to this message */\n quoteWithMediaGroup(params: Parameters<TelegramClient['quoteWithMediaGroup']>[1]) {\n return this.client.quoteWithMediaGroup(this, params)\n }\n\n /** Send a text as a comment to this message */\n commentText(...params: ParametersSkip1<TelegramClient['commentText']>) {\n return this.client.commentText(this, ...params)\n }\n\n /** Send a media as a comment to this message */\n commentMedia(...params: ParametersSkip1<TelegramClient['commentMedia']>) {\n return this.client.commentMedia(this, ...params)\n }\n\n /** Send a media group as a comment to this message */\n commentMediaGroup(...params: ParametersSkip1<TelegramClient['commentMediaGroup']>) {\n return this.client.commentMediaGroup(this, ...params)\n }\n\n /** Delete this message (message group) */\n delete(params?: DeleteMessagesParams) {\n return this.client.deleteMessagesById(\n this.chat.inputPeer,\n this.messages.map((it) => it.id),\n params,\n )\n }\n\n /** Pin this message */\n pin(params?: OmitInputMessageId<Parameters<TelegramClient['pinMessage']>[0]>) {\n return this.client.pinMessage({\n chatId: this.chat.inputPeer,\n message: this.id,\n ...params,\n })\n }\n\n /** Unpin this message */\n unpin() {\n return this.client.unpinMessage({\n chatId: this.chat.inputPeer,\n message: this.id,\n })\n }\n\n /** Edit this message */\n edit(params: OmitInputMessageId<Parameters<TelegramClient['editMessage']>[0]>) {\n return this.client.editMessage({\n chatId: this.chat.inputPeer,\n message: this.id,\n ...params,\n })\n }\n\n /** Forward this message (message group) */\n forwardTo(params: ForwardMessageOptions) {\n return this.client.forwardMessagesById({\n fromChatId: this.chat.inputPeer,\n messages: this.messages.map((it) => it.id),\n ...params,\n })\n }\n\n /** Send a copy of this message (message group) */\n copy(params: SendCopyParams & SendCopyGroupParams) {\n if (this.isMessageGroup) {\n return this.client.sendCopyGroup({\n messages: this.messages,\n ...params,\n })\n }\n\n return this.client.sendCopy({\n message: this,\n ...params,\n })\n }\n\n /** React to this message */\n react(params: OmitInputMessageId<Parameters<TelegramClient['sendReaction']>[0]>) {\n return this.client.sendReaction({\n chatId: this.chat.inputPeer,\n message: this.id,\n ...params,\n })\n }\n}\n"]}
@@ -13,7 +13,7 @@ export interface DispatcherParams {
13
13
  */
14
14
  sceneName?: string;
15
15
  /**
16
- * Custom storage for the dispatcher.
16
+ * Custom storage for this dispatcher and its children.
17
17
  *
18
18
  * @default Client's storage
19
19
  */
@@ -57,25 +57,18 @@ export declare class Dispatcher<State extends object = never> {
57
57
  static scene<State extends object = Record<never, never>>(name: string, params?: Omit<DispatcherParams, 'sceneName'>): Dispatcher<State>;
58
58
  /** For scene dispatchers, name of the scene */
59
59
  get sceneName(): string | undefined;
60
+ private _onClientBeforeConnect;
61
+ private _onClientBeforeClose;
60
62
  /**
61
63
  * Bind the dispatcher to the client.
62
64
  * Called by the constructor automatically if
63
65
  * `client` was passed.
64
66
  *
65
- * Under the hood, this replaces client's `dispatchUpdate`
66
- * function, meaning you can't bind two different
67
- * dispatchers to the same client at the same time.
68
- * Instead, use {@link extend}, {@link addChild}
69
- * or {@link addScene} on the existing, already bound dispatcher.
70
- *
71
67
  * Dispatcher also uses bound client to throw errors
72
68
  */
73
69
  bindToClient(client: TelegramClient): void;
74
70
  /**
75
71
  * Unbind a dispatcher from the client.
76
- *
77
- * This will replace client's dispatchUpdate with a no-op.
78
- * If this dispatcher is not bound, nothing will happen.
79
72
  */
80
73
  unbind(): void;
81
74
  /**
@@ -137,9 +130,9 @@ export declare class Dispatcher<State extends object = never> {
137
130
  * handler group.
138
131
  *
139
132
  * @param handler Update handler to remove, its name or `'all'` to remove all
140
- * @param group Handler group index (-1 to affect all groups)
133
+ * @param group Handler group index (null to affect all groups)
141
134
  */
142
- removeUpdateHandler(handler: UpdateHandler | UpdateHandler['name'] | 'all', group?: number): void;
135
+ removeUpdateHandler(handler: UpdateHandler | UpdateHandler['name'] | 'all', group?: number | null): void;
143
136
  /**
144
137
  * Register an error handler.
145
138
  *